# Build Swap Transaction

{% openapi src="<https://3694085950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mcs9EhDrgbKHodtcAT6%2Fuploads%2F992nLSFootyLzNGT3OSd%2Fopenapi.json?alt=media&token=dbdd978e-3fd3-4af0-a7aa-36ce013023ad>" path="/buildTx" method="get" %}
[openapi.json](https://3694085950-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-Mcs9EhDrgbKHodtcAT6%2Fuploads%2F992nLSFootyLzNGT3OSd%2Fopenapi.json?alt=media\&token=dbdd978e-3fd3-4af0-a7aa-36ce013023ad)
{% endopenapi %}

When building transaction, there are 6 additional parameters along with **quote** input.

<table><thead><tr><th width="271">Field name</th><th>Requirement</th></tr></thead><tbody><tr><td><code>receiver</code></td><td>Required</td></tr><tr><td><code>srcSwapProvider</code></td><td>Required when <strong>srcSwapDescription</strong> is presented in quote result</td></tr><tr><td><code>dstSwapProvider</code></td><td>Required when <strong>dstSwapDescription</strong> is presented in quote result</td></tr><tr><td><code>bridgeProvider</code></td><td>Required when <strong>bridgeDescription</strong> is presented in quote result</td></tr><tr><td><code>srcBridgeTokenAddress</code></td><td>Required when <strong>bridgeDescription</strong> is presented in quote result</td></tr><tr><td><code>dstBridgeTokenAddress</code></td><td>Required when <strong>bridgeDescription</strong> is presented in quote result</td></tr></tbody></table>

To build transaction, please fill the corresponding fields (`srcSwapDescription`, `bridgeDescription` and `dstSwapDescription`) from **quote** response's route to **buildTx** input . If parameters are not filled properly, it may not return the desired routing result. You can review the transaction calldata route by checking `route` field in **buildTx** response.

For example, following response is **quote** result of **Arbitrum USDT** to **KCC native token**.

<pre class="language-json"><code class="lang-json">// quote response
<strong>{
</strong>    "success": true,
    "routes": [
        {
            "srcChainId": 42161,
            "srcQuoteTokenAddress": "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9",
            "srcQuoteTokenAmount": "10000000",
            "dstChainId": 321,
            "dstQuoteTokenAddress": "0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE",
            "srcSwapDescription": null,
            "bridgeDescription": {
                "provider": "yBridge",
                // ...
            },
            "dstSwapDescription": {
                "provider": "XY DexAggregator",
                // ...
            },
            // ...
        }
    ],
}
</code></pre>

* `srcSwapDescription` is **null** because these is no source chain swap needed in this route, so we don't have to fill `srcSwapProvider` when calling buildTx.
* We have a non-empty `bridgeDescription` because it's a cross-chain quote. We need to fill corresponding `bridgeProvider`, `srcBridgeTokenAddress` and `dstBridgeTokenAddress` when calling buildTx. For single chain quote, we can skip these parameters.
* `dstSwapDescription` is needed in this route. So we need to fill `dstSwapProvider` when calling buildTx.

Therefore, we can create the following **buildTx** request from above information:

```sh
// buildTx request
curl -G \
  -d 'srcChainId=42161' \
  -d 'srcQuoteTokenAddress=0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9' \
  -d 'srcQuoteTokenAmount=10000000' \
  -d 'dstChainId=321' \
  -d 'dstQuoteTokenAddress=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE' \
  -d 'slippage=1' \
  -d 'receiver=YOUR_DESTINATION_CHAIN_RECEIVER_ADDRESS' \
  -d 'bridgeProvider=yBridge' \
  -d 'srcBridgeTokenAddress=0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9' \
  -d 'dstBridgeTokenAddress=0x0039f574eE5cC39bdD162E9A88e3EB1f111bAF48' \
  -d 'dstSwapProvider=XY%20DexAggregator' \
  https://aggregator-api.xy.finance/v1/buildTx
```

### Parameter/Response Details

* Use `0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE` as the address for the native token in your parameter.
* If you would like to know more about **commissionRate** fields and fee collection function, please refer to [monetization-take-fees](https://docs.xy.finance/bridge-aggregator-integration/xy-finance-api-multiple-bridges-aggregator/monetization-take-fees "mention")
* If you would like to know latest supported bridge provider and swap provider, please refer to [supported-blockchains-bridges-dexs](https://docs.xy.finance/bridge-aggregator-integration/xy-finance-api-multiple-bridges-aggregator/supported-blockchains-bridges-dexs "mention")
* The `estimatedGas` field in the API response is an estimated value. For now, please use a method similar to RPC, such as [eth\_estimateGas](https://www.quicknode.com/docs/ethereum/eth_estimateGas), to re-estimate the actual gas limit. You can refer to the following sample code to do that:

```python
from web3 import Web3
import requests
​
if __name__ == "__main__":
    # 1st: get tx data from xy aggregator api
    endpoint = 'https://aggregator-api.xy.finance/v1/buildTx?srcChainId=137&srcQuoteTokenAddress=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE&srcQuoteTokenAmount=9000000000000000000&dstChainId=56&dstQuoteTokenAddress=0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d&slippage=1&receiver=0x9cEEEbdF49cF5DEa891C9D74f8ea03af2aCf284F&bridgeProvider=yBridge&srcBridgeTokenAddress=0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174&dstBridgeTokenAddress=0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d&srcSwapProvider=OneInch%20V4%20DexAggregator&affiliate=0x512E00f66217714BAee5F0736428b026e8c30AF5'
    resp = requests.get(endpoint)
    resp_json = resp.json()
​
    # 2nd: get estimateGas by calling web3 rpc
    rpc_endpoint = 'https://polygon.llamarpc.com'
    w3 = Web3(Web3.HTTPProvider(rpc_endpoint))
    estimate_gas = w3.eth.estimate_gas(resp_json["tx"])
​
    # 3rd: Combine the estimateGas with the tx data
    tx = resp_json["tx"]
    tx["gas"] = estimate_gas
​
    # 4th: sign the tx & send it
    priv_key = "0x"
    tx_signed = w3.eth.account.sign_transaction(tx, priv_key)
    tx_hash = w3.eth.send_raw_transaction(tx_signed.rawTransaction)
```

### Example Request

<pre class="language-shell"><code class="lang-shell"><strong>$ curl https://aggregator-api.xy.finance/v1/buildTx?srcChainId=10&#x26;srcQuoteTokenAddress=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE&#x26;srcQuoteTokenAmount=1000000000000000000&#x26;dstChainId=56&#x26;dstQuoteTokenAddress=0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE&#x26;slippage=1&#x26;receiver=0xb6EFA1C3679f1943f8aC4Fc9463Cc492435c6C92&#x26;bridgeProvider=yBridge&#x26;srcBridgeTokenAddress=0x94b008aA00579c1307B0EF2c499aD98a8ce58e58&#x26;dstBridgeTokenAddress=0x55d398326f99059fF775485246999027B3197955&#x26;affiliate=0x90d67a9eaC7324A1a2942D6Dea9f6174Ad6048c9&#x26;commissionRate=100000&#x26;srcSwapProvider=OKX+DEX&#x26;dstSwapProvider=OKX+DEX
</strong></code></pre>

This request is asking to bridge **1** **ETH** from **Optimism** for **ETH** on the **BNB Chain**

{% hint style="warning" %}
**`IMPORTANT:`**` ``Note that the amount parameter should be padded with zeroes. For example, pass`` `**`100000000`**` ``instead of`` `**`100`**` ``if the decimals of the token is 6.`
{% endhint %}

{% hint style="info" %}
Here you can find our full [API reference](https://aggregator-api.xy.finance/v1/docs)
{% endhint %}
