How it works
When tokens arrive at a programmable address, the attached logic executes automatically:- Tokens land at the programmable address
- The contract deploys on first deposit only (no gas until funds actually arrive)
- The pre-programmed action executes
Step-by-step flow
- Address generation: Request a programmable address for your destination wallet
- Deterministic computation: The factory computes a unique EVM address from the destination using CREATE2
- Token transfer: Send USDC to the programmable address on Base
- Contract deployment: The system detects the deposit and deploys the contract if needed
- Action execution: The pre-programmed logic executes. For cross-chain deposits, this creates an intent via
createIntent() - Fulfillment: Solvers compete to fulfill the intent, delivering tokens to the destination wallet
Supported chains and tokens
| Use case | Source | Token | Destination |
|---|---|---|---|
| Solana deposits | Base | USDC | Solana |
| Gateway deposits | All supported USDC chains | USDC | Gateway (through Arc) |
Deposit addresses: the first use case
A deposit address is a programmable address configured to receive tokens and route them to a destination automatically. The sender makes a vanilla ERC-20 transfer. No bridge UI, no approval step, no contract interaction required. Deposit addresses are live today:Solana Deposits
USDC arrives on Base and settles to a Solana wallet automatically.
Gateway Deposits
USDC arrives from any supported chain and deposits into Gateway through Arc.
Architecture
Components
Address Factory
The factory contract manages programmable address generation:- Computes deterministic addresses via
getDepositAddress() - Deploys programmable address contracts via
deploy() - Stores immutable configuration for destination chain, tokens, and Portal
Programmable Address Contract
Individual programmable address contracts handle token reception and action execution:- Receives tokens from users
- Executes the programmed action (e.g., creates intents via
createIntent())
Built on Routes
Programmable addresses use Routes as the execution layer. When the programmed action involves cross-chain movement, the programmable address creates a Routes intent. Solvers compete to fulfill it. Provers verify execution. This means programmable addresses inherit Routes’ properties:- Fast execution through solver competition
- Cryptographic proof of delivery
- Automatic refunds if an intent expires unfulfilled
What you can build
Deposit addresses
Give any wallet a persistent address that auto-routes deposits to a destination: a Solana wallet, a Gateway balance, a protocol vault. The user makes a single transfer. Everything else is handled.Programmable payment flows
Accept payments from any chain and route them automatically to a treasury, into a yield protocol, or split between multiple destinations. The logic executes on every deposit without manual intervention.Automated bridging for exchanges
Users withdraw to a destination address. The exchange sends to the programmable address on any EVM chain. Funds bridge and arrive at the destination. No bridge integration, no user-facing complexity, no support tickets about stuck transactions.One-step cross-chain deposits
Users deposit into your protocol from any chain. The programmable address bridges and deposits in a single flow. Users don’t think about which chain your contracts are on. They just deposit.Configuration
Each factory is configured with immutable parameters:| Parameter | Type | Description |
|---|---|---|
destinationChain | uint64 | Target chain ID (Solana) |
sourceToken | address | Token address on source chain |
targetToken | bytes32 | Token address on destination |
portalAddress | address | Routes Portal contract address |
proverAddress | address | Cross-chain prover address |
destinationPortal | bytes32 | Portal on destination chain |
intentDeadlineDuration | uint64 | Time window for intent fulfillment |
