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
Programmable addresses currently support:| Details | |
|---|---|
| Source chain | Base (chain ID 8453) |
| Deposit token | USDC |
| Destination | Solana |
Cross-chain deposit: the first programmable action
The most common use of programmable addresses is cross-chain deposit: USDC arrives on Base and settles to a Solana wallet automatically. Users share one address, funds arrive on their home chain regardless of where the sender is. The architecture supports arbitrarily encoded actions and more complex settlement rules. Deposit is the first programmable action, not the last.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()) - Supports refunds via
refund()for expired intents
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
Cross-chain receiving
Give any wallet the ability to receive from any chain. Users share one address, funds arrive on their home chain regardless of where the sender is.Programmable payment flows
Accept payments from any chain and route them automatically—to a treasury, into a yield protocol, split between multiple destinations. The logic executes on every deposit without manual intervention.Automated bridging for exchanges
Users withdraw to a Solana address. The exchange sends to the programmable address on any EVM chain. Funds bridge and arrive on Solana. 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 |
