Collect Fees
Integrators can pass in a collectFees object to the SDK or API to collect a fee on each transaction.
Example route request with `collectFees`
const params = {
fromChain: 5, // Goerli testnet
fromToken: "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6", // WETH on Goerli
fromAmount: "50000000000000000", // 0.05 WETH
toChain: 43113, // Avalanche Fuji Testnet
toToken: "0x57f1c63497aee0be305b8852b354cec793da43bb", // aUSDC on Avalanche Fuji Testnet
fromAddress: "0xAD3A87a43489C44f0a8A33113B2745338ae71A9D", // ethers.signer.address; transaction sender address
toAddress: "0xAD3A87a43489C44f0a8A33113B2745338ae71A9D", // the recipient of the trade
slippage: 1.00, // 1.00 = 1% max slippage across the entire route
enableForecall: true, // instant execution service, defaults to true
quoteOnly: false // optional, defaults to false,
collectFees: {
integratorAddress: "0x",
fee: 50
}
};
Property | Description |
---|---|
integratorAddress | The EVM address of the integrator that will receive the fee |
fee | The amount in "basis points" for the fee. 50 = 0.50%. there is currently soft limit of 1% fee allowed for each tx. |
New objects in route response
feeCosts": [
{
"name": "Integrator Fee",
"description": "Integrator Fee",
"percentage": "0.9%",
"token": {
"chainId": 43113,
"address": "0x57f1c63497aee0be305b8852b354cec793da43bb",
"name": "Axelar USDC",
"symbol": "aUSDC",
"decimals": 6,
"logoURI": "https://raw.githubusercontent.com/axelarnetwork/axelar-docs/main/public/images/assets/usdc.svg",
"coingeckoId": "axlusdc",
"commonKey": "uausdc"
},
"amount": "14190",
"amountUSD": "0.0142"
},
]
Fee collection token
Fees are collected in the bridge token, most of the time this will be axlUSDC as this is the primary bridging token, if the source or destination token is an Axelar wrapped token the fee could be taken in that token, to unwrap Axelar token see here
The API route response will tell whether it is the source or destination chain that has the fee taken
You can see the "collectFees" object returned by the api in the "params" section of the response. This specific route will take fees on destination.
"params": {
"collectFees": {
"integratorAddress": "0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174",
"fee": 90,
"feeLocation": "DESTINATION"
},
....
}
Fee logic
Fees are are currently only supported on EVM chains, although fees will eventually be supported on Cosmos chains. The fee is generally taken on the chain where swaps happen. The following table outlines where the fee is taken based on the route.
swaps = some swap to or from a token to the bridge token (eg axlUSDC)
send only = no swaps
Cosmos = not supported
Source | Destination | Fee taken |
---|---|---|
EVM (with swaps) | EVM (with swaps) | Source |
EVM (no swaps) | EVM (with swaps) | Destination |
EVM (no swaps) | EVM (no swaps) | Destination |
EVM (with swaps) | EVM (no swaps) | Source |
EVM (with swaps) | Cosmos | Source |
EVM (no swaps) | Cosmos | None |
How to check fee balances
You can check the Squid fee collector smart contracts for the balance of each token for the integrator address.
The feeCollector contract addresses are documented in the next section.
You can read balances by putting in the "token address" and "integratorAddress" into the getBalance function
https://testnet.snowtrace.io/address/0xf80De6D6CF6846Ae7c3243F4b6486EF662C59d29#readProxyContract
Fee Collector contract address
Network | Address |
---|---|
Testnet | 0xf80De6D6CF6846Ae7c3243F4b6486EF662C59d29 |
Mainnet | 0x19cd4F3820E7BBed45762a30BFA37dFC6c9C145b |
| |
Last modified 1mo ago