THORChain Dev Docs
Search…
⌃K

Quickstart Guide

Make a cross-chain swap on THORChain in less than 5 minutes.

Introduction

THORChain allows native L1 Swaps. On-chain Memos are used instruct THORChain how to swap, with the option to add price limits and affiliate fees. THORChain nodes observe the inbound transactions and when the majority have observed the transactions, the transaction is processed by threshold-signature transactions from THORChain vaults.
Let's demonstrate decentralized, non-custodial cross-chain swaps. In this example, we will build a transaction that instructs THORChain to swap native Bitcoin to native Ethereum in one transaction.
The following examples use a free, hosted API provided by Nine Realms. If you want to run your own full node, please see Connecting to THORChain.

1. Determine the correct asset name.

THORChain uses a specific asset notation. Available assets are at: Pools Endpoint.
BTC => BTC.BTC ETH => ETH.ETH
Only available pools can be used. (where 'status' == Available)

2. Query for a swap quote.

All amounts are 1e8. Multiply native asset amounts by 100000000 when dealing with amounts in THORChain. 1 BTC = 100,000,000.
Request: Swap 1 BTC to ETH and send the ETH to 0x3021c479f7f8c9f1d5c7d8523ba5e22c0bcb5430.
Response:
{
"expected_amount_out": "1344935518",
"fees": {
"affiliate": "0",
"asset": "ETH.ETH",
"outbound": "480000"
},
"inbound_address": "bc1qlccxv985m20qvd8g5yp6g9lc0wlc70v6zlalz8",
"inbound_confirmation_blocks": 1,
"inbound_confirmation_seconds": 600,
"memo": "=:ETH.ETH:0x3021c479f7f8c9f1d5c7d8523ba5e22c0bcb5430",
"outbound_delay_blocks": 136,
"outbound_delay_seconds": 2040,
"slippage_bps": 41
}
If you send 1 BTC to bc1qlccxv985m20qvd8g5yp6g9lc0wlc70v6zlalz8 with the memo =:ETH.ETH:0x3021c479f7f8c9f1d5c7d8523ba5e22c0bcb5430, you can expect to receive 13.4493552 ETH.
For security reasons, your inbound transaction will be delayed by 600 seconds (1 BTC Block) and 2040 seconds (or 136 native THORChain blocks) for the outbound transaction, 2640 seconds all up. You will pay an outbound gas fee of 0.0048 ETH and will incur 41 basis points (0.41%) of slippage.
Full quote swap endpoint specification can be found here: https://thornode.ninerealms.com/thorchain/doc/.
See an example implementation here.

3. Sign and send transaction on the from_asset chain.

Construct, sign and broadcast a transaction on the BTC network with the following parameters:
Amount => 1.0
Recipient => bc1qlccxv985m20qvd8g5yp6g9lc0wlc70v6zlalz8
Memo => =:ETH.ETH:0x3021c479f7f8c9f1d5c7d8523ba5e22c0bcb5430
Never cache inbound addresses! Quotes should only be considered valid for 10 minutes. Sending funds to an old inbound address will result in loss of funds.

4. Receive tokens.

Once a majority of nodes have observed your inbound BTC transaction, they will sign the Ethereum funds out of the network and send them to the address specified in your transaction. You have just completed a non-custodial, cross-chain swap by simply sending a native L1 transaction.

Additional Considerations

There is a rate limit of 1 request per second per IP address on /quote endpoints. It is advised to put a timeout on frontend components input fields, so that a request for quote only fires at most once per second. If not implemented correctly, you will receive 503 errors.
For best results, request a new quote right before the user submits a transaction. This will tell you whether the expected_amount_out has changed or if the inbound_address has changed. Ensuring that the expected_amount_out is still valid will lead to better user experience and less frequent failed transactions.

Price Limits

Specify tolerance_bps to give users control over the maximum slip they are willing to experience before cancelling the trade. If not specified, users will pay an unbounded amount of slip.
{
"expected_amount_out": "1344919036",
"fees": {
"affiliate": "0",
"asset": "ETH.ETH",
"outbound": "480000"
},
"inbound_address": "bc1qlccxv985m20qvd8g5yp6g9lc0wlc70v6zlalz8",
"inbound_confirmation_blocks": 1,
"inbound_confirmation_seconds": 600,
"memo": "=:ETH.ETH:0x3021c479f7f8c9f1d5c7d8523ba5e22c0bcb5430:1342846539",
"outbound_delay_blocks": 136,
"outbound_delay_seconds": 2040,
"slippage_bps": 41
}
Notice how a minimum amount (1342846539 / ~13.42 ETH) has been appended to the end of the memo. This tells THORChain to revert the transaction if the transacted amount is more than 100 basis points less than what the expected_amount_out returns.

Affiliate Fees

Specify affiliate_address and affiliate_bps to skim a percentage of the expected_amount_out.
{
"expected_amount_out": "1344829474",
"fees": {
"affiliate": "1346656",
"asset": "ETH.ETH",
"outbound": "480000"
},
"inbound_address": "bc1qlccxv985m20qvd8g5yp6g9lc0wlc70v6zlalz8",
"inbound_confirmation_blocks": 1,
"inbound_confirmation_seconds": 600,
"memo": "=:ETH.ETH:0x3021c479f7f8c9f1d5c7d8523ba5e22c0bcb5430::thorname:10",
"outbound_delay_blocks": 136,
"outbound_delay_seconds": 2040,
"slippage_bps": 41
}
Notice how thorname:10 has been appended to the end of the memo. This instructs THORChain to skim 10 basis points from the swap. The user should still expect to receive the expected_amount_out, meaning the affiliate fee has already been subtracted from this number.
For more information on affiliate fees: Fees.

Error Handling

The quote swap endpoint simulates all of the logic of an actual swap transaction. It ships with comprehensive error handling.
This error means the swap cannot be completed given your price tolerance.
This error ensures the destination address is for the chain specified by to_asset.
This error is due to the fact the affiliate address is too long given the source chain's memo length requirements. Try registering a THORName to shorten the memo.
This error means the requested asset does not exist.
Bound checks are made on both affiliate_bps and tolerance_bps.

Support

Developers experiencing issues with these APIs can go to the Developer Discord for assistance. Interface developers should subscribe to the #interface-alerts channel for information pertinent to the endpoints and functionality discussed here.