What you can read
The router’s
Bridge() function returns the bridge contract’s address. The limits are in whole USDT, not base units. Convert them with parseUnits(value.toString(), 6) before comparing with an amount.
Steps
1
Set up the project
Use the
bot-defi project from Wrap BOT. This script only reads, so it needs no key.2
Write the script
bridge-limits.ts
botBridgeAbi and USDT_RESOURCE_ID come from @uzolabs/sdk/contracts. The two bridge functions aren’t in that ABI, so the script declares them with parseAbi.3
Run it
Verify it worked
On testnet on 2026-10-02:Output
botChain instead of botChainTestnet and use botChain in both places. The same day, mainnet returned the same fee and minimums, a maximum of 30150 USDT, and destinations 56, 1 and 728126428. Mainnet and testnet limits differ, so always read the network you’re sending on.
Work out the fee
The fee is the percentage or the minimum fee, whichever is larger, and comes out of the amount you send:bridge-fee.ts
Check before every transfer
- Stop if
getBridgePause()istrue. - Check the amount is between the minimum and maximum.
- Check the destination is in the supported list.
- Show the user the fee and the amount that will arrive.
Troubleshooting
The limits look 10^6 times too small
The limits look 10^6 times too small
They’re whole USDT, not base units.
10 means 10 USDT.chainAndTokenFee returns 0 or reverts
chainAndTokenFee returns 0 or reverts
Call it on the bridge address from
Bridge(), not on the router, and pass the USDT resource ID from Contract addresses.Next steps
Bridge USDT out
Use these checks before a deposit.
Track a transfer
Follow a transfer to arrival.