# Build Swap Transaction

{% openapi src="/files/TtIQ5kToU9bWazZWUKQj" 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](/bridge-aggregator-integration/xy-finance-api-multiple-bridges-aggregator/monetization-take-fees.md)
* If you would like to know latest supported bridge provider and swap provider, please refer to [Supported Blockchains/Bridges/DEXs](/bridge-aggregator-integration/xy-finance-api-multiple-bridges-aggregator/supported-blockchains-bridges-dexs.md)
* 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.xy.finance/bridge-aggregator-integration/xy-finance-api-multiple-bridges-aggregator/build-swap-transaction.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
