The deposit is one call on the source chain, carrying the quote hash. Which entry point you use — and which contract it goes to — is determined by the quote’s parameters, not by preference. Plain deposits go to the inventory vault, which is the router_address on the quote; deposits that swap go to the router returned by GetSwapInstructions.

Choosing the call

A quote requested with gasless: true takes none of these paths: the user signs a permit2 authorization instead of sending a transaction, and the operator relays the deposit. See SubmitGaslessOrder.

Native deposits

No approval, no allowance check. The amount rides as transaction value.

Token deposits

The router pulls the tokens, so it needs an allowance first. Check before prompting: a user who already approved should not be asked twice.
1

Check allowance

2

Approve if short

Approve at least amount_in. Wait for the approval to confirm before the deposit; sending both in one block fails on most RPCs.
3

Deposit

Permit

Tokens supporting EIP-2612 can skip the approval transaction entirely by signing instead. The catalog marks them with permit: true. The permit variants live on the router contract (router from GetChains), which forwards the funds into the vault, so the permit’s spender and the transaction target are the router.
The permit is attempted and its failure swallowed, so a permit that was already consumed does not break the deposit — but the transfer still needs the allowance to exist by then, from either the permit or a prior approval. depositTokenWithPermit2 is the equivalent for wallets with a standing permit2 allowance: a SignatureTransfer signature replaces the approval, and any ERC-20 works, not just EIP-2612 tokens.

Deposits that swap first

When the source token is not the asset that bridges, the router swaps through an allowlisted aggregator inside the deposit transaction. The calldata comes from GetSwapInstructions, keyed by quote hash.
Fetch the instructions immediately before sending. Routing calldata reflects pool state at the time it was built, and a stale route is the most common cause of a reverted deposit. depositWithSwapAndPermit takes the same arguments plus permit parameters.
If the swap returns less than min_bridge_out the transaction reverts with InsufficientOutput. The user pays gas and nothing else; their funds never leave their wallet.

With the SDK

ChainAdapter resolves all of this — entry point, allowance, swap instructions, chain switching — into an ordered list of steps.
Render step.kind in your UI so the user knows which prompt they are signing.

After it lands

The deposit emits Deposit and the indexer picks it up. There is nothing else to submit: no attestation, no claim, no destination transaction from the user. Move to Track an order.
Deposit exactly amount_in. A different amount does not get a proportional payout — it is a mismatched deposit and is refunded.