# Cross Chain Swap Fee

Use `quoteLayerZeroFee()` to get the fee required to call `swap()`. The fee ensures the cross chain message is paid for.

```java
// Router.sol method to get the value for swap()
function quoteLayerZeroFee(
    uint16 _dstChainId,
    uint8 _functionType,
    bytes calldata _toAddress,
    bytes calldata _transferAndCallPayload,
    Router.lzTxObj memory _lzTxParams
) external view override returns (uint256, uint256)
```

For the `uint8 _functionType` argument use `1` for `swap()`s.  Here is an [explanation](https://stargateprotocol.gitbook.io/stargate/developers/function-types) of the [other function types](https://stargateprotocol.gitbook.io/stargate/developers/function-types).

Estimate the fee for the message cost of the `swap()` using offchain code like this:<br>

```javascript
let quoteData = await router.quoteLayerZeroFee(
    dstChainId,                 // destination chainId
    functionType,               // function type: see Bridge.sol for all types
    toAddress,                  // destination of tokens
    "0x",                       // payload, using abi.encode()
    ({
        dstGasForCall: 0,       // extra gas, if calling smart contract,
        dstNativeAmount: 0,     // amount of dust dropped in destination wallet 
        dstNativeAddr: taskArgs.dstNativeAddr // destination wallet for dust
    })
)
```

`quoteLayerZeroFee()` estimates the message fee and returns an amount of wei in source gas token. Use this as the `{ value: xxxx }` passed to the actual `swap()` method when you perform the swap.

Note:  quoteLayerZeroFee() returns a 2-value tuple:

```javascript
// the message fee is the first value in the tuple.
let feeWei = quoteData[0]
```

Use `feeWei` to call swap():

```javascript
// ethersjs example: call swap() with the feeWei value from quoteLayerZeroFee
// execute a Stargate swap on the Router.sol contract
await router.swap(
    dstChainId,
    srcPoolId,
    dstPoolId,
    payable(refundAddress),
    qty,
    qtyMin,
    { dstGasForCall: 0, dstNativeAmount: 0, dstNativeAddr: "0x" },   // lzTxObj
    toAddress, 
    "0x", // no payload
    { value: feeWei }  // <------ feeWei from quoteData[0] from quoteLayerZeroFee()   
)
```
