Skip to main content
Utexo supports four settlement paths on EVM:
  • Cross-chain swap
  • Cross-chain swap with DEX
  • Single-chain atomic swap
  • Fast refund
Users sign Permit2 approvals. The resolver submits every on-chain transaction and pays gas.

Onboarding

A protocol administrator registers each resolver in the ResolversWhitelist contract with:
  • Executor contract address
  • depositAddresses allow list
  • withdrawAddresses allow list
The same resolver must own the authorized deposit and withdraw roles. The on-chain checkSameResolver check enforces this.

Executor contract

Each resolver deploys an Executor implementing the IExecutor interface:
The protocol verifies that its own ERC-20 balance increased by exactly the amount returned by IExecutor.

Method responsibilities

  • fulfill transfers between minAmount and maxAmount to the caller and returns the actual transferred amount.
  • swap receives input tokens already transferred to the Executor and returns a bounded output to EscrowRouter.
  • dexSwap uses only deposited user tokens with non-empty routing data.
dexSwap must trade the deposited user tokens through the DEX. Do not fund the output from your own treasury liquidity.

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, calls dexSwap, 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 the EscrowImplementation domain:
The resolver signer must match order.resolverDeposit.

Tron

Tron is architecturally aligned with EVM but uses TIP-712 with these differences:
  • No version field in the domain.
  • Domain type string: EIP712Domain(string name,uint256 chainId,address verifyingContract).
  • chainId is masked with chainId & 0xffffffff.
These rules apply to the deposit witness, fulfillment, and refund signing.