- Cross-chain swap
- Cross-chain swap with DEX
- Single-chain atomic swap
- Fast refund
Onboarding
A protocol administrator registers each resolver in theResolversWhitelist contract with:
- Executor contract address
depositAddressesallow listwithdrawAddressesallow list
checkSameResolver check enforces this.
Executor contract
Each resolver deploys an Executor implementing theIExecutor interface:
IExecutor.
Method responsibilities
fulfilltransfers betweenminAmountandmaxAmountto the caller and returns the actual transferred amount.swapreceives input tokens already transferred to the Executor and returns a bounded output toEscrowRouter.dexSwapuses only deposited user tokens with non-empty routingdata.
Fulfillment contract
The protocol deploys a Fulfillment contract once per resolver per destination chain. The resolver supplies:- Executor address
- Authorized caller/operator addresses
Cross-chain swap
1
Deposit
EscrowRouter.deposit deploys a deterministic CREATE2 proxy and transfers the user’s input tokens into it using Permit2.2
Fulfill
On the destination chain, the resolver’s Executor
fulfill pays the user the destination amount within [minAmount, maxAmount].3
Withdraw
After Utexo verifies fulfillment and reveals the secret, the resolver withdraws from the source-chain escrow.
The source does not fully document the withdraw signature and parameters. See Validation Gaps.
Cross-chain swap with DEX
Source-chain deposit transfers the user’s input token to the Executor, callsdexSwap, validates the output against the declared bounds, and locks the resulting tokenOut in the proxy. The follow-on Order then uses tokenOut and minAmountOut on the destination.
Single-chain atomic swap
EscrowRouter.swap atomically transfers the user’s input to the Executor and sends a bounded output amount directly to the user. When the destination token is native ETH, the Executor supplies WETH and the protocol unwraps it before paying the user.
Fast refund
Backend and resolver co-sign the following EIP-712 message in theEscrowImplementation domain:
order.resolverDeposit.
Tron
Tron is architecturally aligned with EVM but uses TIP-712 with these differences:- No
versionfield in the domain. - Domain type string:
EIP712Domain(string name,uint256 chainId,address verifyingContract). chainIdis masked withchainId & 0xffffffff.