Requesting a Quote
All that you need to send a transaction from any off your wallets is our /quote
endpoint.
const getQuote = async (sellAsset, buyAsset, sellAmount, senderAddress, recipientAddress) => {
const result = await axios.get('https://api.thorswap.net/aggregator/tokens/quote', {
params: {
sellAsset,
buyAsset,
sellAmount,
senderAddress,
recipientAddress,
}
});
return result.data;
}
const sellAsset = 'BTC.BTC';
const buyAsset = 'ETH.ETH';
const sellAmount = 0.1;
const senderAddress = BTC_WALLET_ADDRESS;
const recipientAddress = ETH_WALLET_ADDRESS;
const quote = await getQuote(sellAsset, buyAsset, sellAmount, senderAddress, recipientAddress);
If a quote for this trade can be found, the response will be like the following:
```json
{
"quoteId": "d21491be-62f3-4f6e-822c-a1e7ef265e46",
"routes": [
{
"path": "ETH.USDT-EC7 -> BTC.BTC",
"providers": [
"THORCHAIN"
],
"subProviders": [
"THORCHAIN"
],
"swaps": {
"THORCHAIN": [
[
{
"from": "ETH.USDT-EC7",
"fromTokenAddress": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"to": "BTC.BTC",
"parts": [
{
"provider": "THORCHAIN",
"percentage": 100
}
]
}
]
]
},
"expectedOutput": "1.40311129",
"expectedOutputMaxSlippage": "1.36224397087378640777",
"expectedOutputUSD": "49380.2350249788",
"expectedOutputMaxSlippageUSD": "47941.97575240661",
"streamingSwap": {
"estimatedTime": 1638,
"fees": {
"THOR": [
{
"type": "inbound",
"asset": "ETH.ETH",
"networkFee": 0.00134232,
"networkFeeUSD": 2.5430118168,
"affiliateFee": 0,
"affiliateFeeUSD": 0,
"totalFee": 0.00134232,
"totalFeeUSD": 2.5430118168,
"isOutOfPocket": true
},
{
"type": "outbound",
"asset": "BTC.BTC",
"networkFee": 0.00105,
"networkFeeUSD": 36.7049522596346,
"affiliateFee": 75,
"affiliateFeeUSD": 75,
"isOutOfPocket": false,
"slipFee": 0.00071519,
"slipFeeUSD": 25.169956609439435,
"totalFee": 75.00176519,
"totalFeeUSD": 136.87490886907403
}
]
},
"expectedOutput": "1.42568843",
"expectedOutputMaxSlippage": "1.38416352427184466019",
"expectedOutputUSD": "50174.8009922955152560567",
"expectedOutputMaxSlippageUSD": "48713.3990216461313164129790747158511",
"transaction": {
"from": "0xB6F1F501BA37551964C9b23B4c38faED71DDEAfA",
"to": "0xD37BbE5744D730a1d98d8DC97c42F0Ca46aD7146",
"value": "0x00",
"data": "0x44bc937b0000000000000000000000006be503f700cdb68506eba69b087a71656bc944f6000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000000000ba43b740000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000006549848f000000000000000000000000000000000000000000000000000000000000003a3d3a623a6263317132346766376c663838647a6c65763063726137396c787368736b34303778716a3376306e70723a302f332f31373a743a3135000000000000",
"gas": 44744,
"gasPrice": 30000000000
}
},
"transaction": {
"from": "0xB6F1F501BA37551964C9b23B4c38faED71DDEAfA",
"to": "0xD37BbE5744D730a1d98d8DC97c42F0Ca46aD7146",
"value": "0x00",
"data": "0x44bc937b0000000000000000000000006be503f700cdb68506eba69b087a71656bc944f6000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000000000ba43b740000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000006549848f000000000000000000000000000000000000000000000000000000000000003d3d3a623a6263317132346766376c663838647a6c65763063726137396c787368736b34303778716a3376306e70723a3133363232343339373a743a3135000000",
"gas": 44744,
"gasPrice": 30000000000
},
"optimal": true,
"complete": true,
"fees": {
"THOR": [
{
"type": "inbound",
"asset": "ETH.ETH",
"networkFee": 0.00134232,
"networkFeeUSD": 2.5430118168,
"affiliateFee": 0,
"affiliateFeeUSD": 0,
"totalFee": 0.00134232,
"totalFeeUSD": 2.5430118168,
"isOutOfPocket": true
},
{
"type": "outbound",
"asset": "BTC.BTC",
"networkFee": 0.00105,
"networkFeeUSD": 36.7049522596346,
"affiliateFee": 75,
"affiliateFeeUSD": 75,
"isOutOfPocket": false,
"slipFee": 0.00071519,
"slipFeeUSD": 25.169956609439435,
"totalFee": 75.00176519,
"totalFeeUSD": 136.87490886907403
}
]
},
"meta": {
"hasStreamingSwap": true,
"sellChain": "ETH",
"sellChainGasRate": "70",
"buyChain": "BTC",
"buyChainGasRate": "105",
"priceProtectionRequired": true,
"priceProtectionDetected": true,
"quoteMode": "TC-TC",
"thornodeMeta": {
"expectedAmountOut": {
"assetAmount": "1.40311129",
"baseAmount": "140311129",
"decimal": 8,
"asset": {
"chain": "BTC",
"symbol": "BTC",
"ticker": "BTC",
"type": "Native",
"network": "Bitcoin",
"name": "BTC",
"decimal": 8,
"isSynth": false
},
"amount": {
"assetAmount": "1.40311129",
"baseAmount": "140311129",
"decimal": 8
}
},
"expectedAmountOutStreaming": {
"assetAmount": "1.42568843",
"baseAmount": "142568843",
"decimal": 8,
"asset": {
"chain": "BTC",
"symbol": "BTC",
"ticker": "BTC",
"type": "Native",
"network": "Bitcoin",
"name": "BTC",
"decimal": 8,
"isSynth": false
},
"amount": {
"assetAmount": "1.42568843",
"baseAmount": "142568843",
"decimal": 8
}
},
"expiry": 1699314178,
"fees": {
"affiliate": {
"assetAmount": "0.00214547",
"baseAmount": "214547",
"decimal": 8
},
"asset": {
"chain": "BTC",
"symbol": "BTC",
"ticker": "BTC",
"type": "Native",
"network": "Bitcoin",
"name": "BTC",
"decimal": 8,
"isSynth": false
},
"outbound": {
"assetAmount": "0.00105",
"baseAmount": "105000",
"decimal": 8
},
"liquidity": {
"assetAmount": "0.00071519",
"baseAmount": "71519",
"decimal": 8
},
"slippageBps": 5,
"total": {
"assetAmount": "0.00391066",
"baseAmount": "391066",
"decimal": 8
},
"totalBps": 27
},
"inboundAddress": "0x6be503f700cdb68506eba69b087a71656bc944f6",
"inboundConfirmationBlocks": 0,
"inboundConfirmationSeconds": 0,
"maxStreamingQuantity": 17,
"memo": "=:BTC.BTC:bc1q24gf7lf88dzlev0cra79lxshsk407xqj3v0npr:0/3/17:t:15",
"notes": "Base Asset: Send the inbound_address the asset with the memo encoded in hex in the data field. Tokens: First approve router to spend tokens from user: asset.approve(router, amount). Then call router.depositWithExpiry(inbound_address, asset, amount, memo, expiry). Asset is the token contract address. Amount should be in native asset decimals (eg 1e18 for most tokens). Do not send to or from contract addresses.",
"outboundDelayBlocks": 225,
"outboundDelaySeconds": 1350,
"recommendedMinAmountIn": "14682084000",
"router": "0xD37BbE5744D730a1d98d8DC97c42F0Ca46aD7146",
"slippageBps": 84,
"streamingSlippageBps": 5,
"streamingSwapBlocks": 48,
"streamingSwapSeconds": 1350,
"totalSwapSeconds": 1350,
"warning": "Do not cache this response. Do not send funds after the expiry."
},
"warnings": []
},
"inboundAddress": "0x6be503f700cdb68506eba69b087a71656bc944f6",
"targetAddress": "0xD37BbE5744D730a1d98d8DC97c42F0Ca46aD7146",
"estimatedTime": 1350,
"calldata": {
"depositWithExpiry": "0",
"vault": "0x6be503f700cdb68506eba69b087a71656bc944f6",
"asset": "ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7",
"amount": "50000000000",
"memo": "=:b:bc1q24gf7lf88dzlev0cra79lxshsk407xqj3v0npr:136224397:t:15",
"memoStreamingSwap": "=:b:bc1q24gf7lf88dzlev0cra79lxshsk407xqj3v0npr:0/3/17:t:15",
"expiration": "1699316879"
},
"contract": "0xD37BbE5744D730a1d98d8DC97c42F0Ca46aD7146",
"contractMethod": "depositWithExpiry",
"approvalTarget": "0xD37BbE5744D730a1d98d8DC97c42F0Ca46aD7146",
"approvalToken": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"evmTransactionDetails": {
"contractAddress": "0xD37BbE5744D730a1d98d8DC97c42F0Ca46aD7146",
"contractMethod": "depositWithExpiry",
"contractParams": [
"0",
"0x6be503f700cdb68506eba69b087a71656bc944f6",
"ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7",
"50000000000",
"=:b:bc1q24gf7lf88dzlev0cra79lxshsk407xqj3v0npr:136224397:t:15",
"1699316879"
],
"contractParamsStreaming": [
"0",
"0x6be503f700cdb68506eba69b087a71656bc944f6",
"ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7",
"50000000000",
"=:b:bc1q24gf7lf88dzlev0cra79lxshsk407xqj3v0npr:0/3/17:t:15",
"1699316879"
],
"contractParamsNames": [
"depositWithExpiry",
"vault",
"asset",
"amount",
"memo",
"expiration"
],
"approvalToken": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"approvalSpender": "0xD37BbE5744D730a1d98d8DC97c42F0Ca46aD7146"
},
"index": 0
}
],
"sellAssetAmount": "50000"
}
```
Possible Query Parameters
The /quote
endpoints offer several parameters that can be used in order to customize the result.
Starting from an EVM Chain
There are 3 options to build an EVM transaction from the response:
a. transaction
b. evmTransactionDetails
c. calldata
(deprecated)
a. transaction
```json
"transaction": {
"from": "0xB6F1F501BA37551964C9b23B4c38faED71DDEAfA",
"to": "0xD37BbE5744D730a1d98d8DC97c42F0Ca46aD7146",
"value": "0x00",
"data": "0x44bc937b0000000000000000000000006be503f700cdb68506eba69b087a71656bc944f6000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec70000000000000000000000000000000000000000000000000000000ba43b740000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000006549848f000000000000000000000000000000000000000000000000000000000000003d3d3a623a6263317132346766376c663838647a6c65763063726137396c787368736b34303778716a3376306e70723a3133363232343339373a743a3135000000",
"gas": 44744,
"gasPrice": 30000000000
}
```
b. evmTransactionDetails
```json
"evmTransactionDetails": {
"contractAddress": "0xD37BbE5744D730a1d98d8DC97c42F0Ca46aD7146",
"contractMethod": "depositWithExpiry",
"contractParams": [
"0",
"0x6be503f700cdb68506eba69b087a71656bc944f6",
"ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7",
"50000000000",
"=:b:bc1q24gf7lf88dzlev0cra79lxshsk407xqj3v0npr:136224397:t:15",
"1699316879"
],
"contractParamsStreaming": [
"0",
"0x6be503f700cdb68506eba69b087a71656bc944f6",
"ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7",
"50000000000",
"=:b:bc1q24gf7lf88dzlev0cra79lxshsk407xqj3v0npr:0/3/17:t:15",
"1699316879"
],
"contractParamsNames": [
"depositWithExpiry",
"vault",
"asset",
"amount",
"memo",
"expiration"
],
"approvalToken": "0xdac17f958d2ee523a2206206994597c13d831ec7",
"approvalSpender": "0xD37BbE5744D730a1d98d8DC97c42F0Ca46aD7146"
}
```
The contractParams
property will contain an ordered array of smart contract input parameters. If streaming (meta.hasStreamingSwap
) is available, then you should use contractParamsStreaming
`contractParamsNames` should not be used in production and could be removed.
Last updated