1inch Aqua is deployed at one deterministic address on 13 EVM chains. The registry (Aqua), the router (AquaSwapVMRouter v1.0.2) and the KycNFT credential share the same address on every one of these chains.
The 13 Aqua chains
| Chain | Chain ID |
|---|---|
| Ethereum | 1 |
| Optimism | 10 |
| BNB Chain | 56 |
| Gnosis | 100 |
| Unichain | 130 |
| Polygon | 137 |
| Sonic | 146 |
| zkSync Era | 324 |
| Robinhood Chain | 4663 |
| Base | 8453 |
| Arbitrum | 42161 |
| Avalanche | 43114 |
| Linea | 59144 |
supportedChains = [1, 10, 56, 100, 130, 137, 146, 324, 4663, 8453, 42161, 43114, 59144]. Note Unichain is 130 (the SDK README's 1301 is a known error).
Robinhood Chain (4663) joined the chain set on 2026-07-16
Robinhood Chain was previously excluded from the Aqua chain set: its registry was a different, CREATE3-deployed address (0x7c2D…ec86), it had no KycNFT, and it was flagged unsupportedForAqua. That exclusion ended with the 2026-07-16 universal redeployment:
- Aqua was redeployed on all chains — Robinhood included — to one universal registry address (
0xe8026b…139b), together with the dependentAquaSwapVMRouterv1.0.2 (0x016b41…B070). Both were superseded in the 2026-07 vanity redeployment — the current addresses are0x1111113ccf…a90a(registry) and0x111111338c…c0de(router); see Contract addresses. - The
KycNFTcredential (0x26FF…a468) is configured for chain 4663; resolver flows on Robinhood have been validated. - The Aqua API accepts and indexes chain 4663 in production.
Robinhood's earlier chain-specific contracts (0x7c2D…ec86 registry, 0xA536…331A router) are superseded — use them only to decode historical activity. See Verified contract addresses for the full historical list.
Cross-chain: no native settlement
The unified address is a deployment convenience, not a shared ledger. Aqua and the AquaSwapVMRouter have no native cross-chain settlement. Each of the 13 chains is a fully independent deployment with its own registry state, its own router, and its own KycNFT credential set. A strategy shipped on one chain can only be filled on that same chain.
The shared address from the Supported chains table means the same bytecode lives at the same address on every chain. It does not mean the deployments share liquidity, balances, or a KYC allowlist. There is no bridge, no message-passing, and no cross-chain accounting anywhere in the v1.0.2 router or the Aqua registry.
Why each chain is isolated
Two independent facts in the deployed code keep every chain self-contained:
- Registry balances are per-deployment. Maker inventory lives in the Aqua registry on a single chain, keyed by
_balances[maker][app][strategyHash][token]. Shipping a strategy funds that mapping on that chain only;pullanddockread and write the same local mapping. Nothing reads or credits balances on another chain. - The order/strategy hash is chain-bound.
SwapVMis anEIP712contract, so a maker-signed order is hashed through_hashTypedDataV4, whose domain separator folds inchainIdand the router address (verifyingContract). The same order re-submitted on a different chain produces a different digest and is not a valid signature there. Aqua-native strategies (useAquaInsteadOfSignature) are identified bystrategyHash = keccak256(strategy)in the local registry, which only exists where the strategy was shipped.
A fill always executes against the router deployed on the chain the transaction is sent to. Each AquaSwapVMRouter is constructed with one Aqua registry address and one WETH address for that chain:
Solidity
1234567891011
// swap-vm/src/routers/AquaSwapVMRouter.sol (v1.0.2)
constructor(
address aqua, // the Aqua registry on THIS chain
address weth,
address owner,
string memory name,
string memory version
) SwapVM(aqua, weth, owner, name, version) AquaOpcodes(aqua) { }
// quote / swap are 5-arg and resolve inventory from the local registry only:
// swap(Order order, address tokenIn, address tokenOut, uint256 amount, bytes takerTraitsAndData)
What this means for makers
A maker who wants to be fillable on multiple chains operates each chain as a separate venue:
- Ship the strategy on every target chain.
ship(app, strategy, tokens, amounts)is a per-chain call against that chain's Aqua registry; the returnedstrategyHashis only meaningful there. - Fund inventory per chain. The
amountspushed on Ethereum are not available to fills on Base or Arbitrum. Inventory does not rebalance itself across chains. - Manage lifecycle per chain.
dockandpullact on one chain's balances at a time; parking or withdrawing on one chain leaves the others untouched.
What this means for takers
The KycNFT credential is a per-chain deployment as well. Holding the credential on one chain does not make a taker recognized on another — the credential must be held on each chain where that taker intends to fill. Because balances and the KYC set are local, a route that succeeds on one chain gives no guarantee about any other chain.
Moving value across chains is out of scope for Aqua. Neither the router nor the registry bridges tokens or relays state between chains. To move funds from one chain to another, use a separate bridge as an independent step, then ship or fill against the Aqua deployment on the destination chain. Hosted routing and cross-chain aggregation are handled by 1inch Business products, not by the on-chain Aqua contracts documented here.