> ## Documentation Index
> Fetch the complete documentation index at: https://docs.eco.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Programmable Addresses

> Deterministic addresses that execute pre-programmed actions on funding, no bridge UI, no signature, no contract call. Just an ERC-20 transfer.

A **Programmable Address** is a deterministic CREATE2 contract address that executes custom logic on inbound or outbound stablecoin transfers. When funds arrive, its actions run automatically, the sender just makes a normal ERC-20 transfer, and the address handles whatever it's programmed to do: settlement into a preferred token or chain, payment splits, or deposits into a yield vault. Developers program the rules once to streamline their product experience.

The model is compatible with both Solana and EVM chains supported by Eco.

<Tip>
  REST endpoint reference: [Gateway Fast Deposits API](/api-reference/programmable-addresses/gateway-overview)
</Tip>

## What ships today

| Capability                                                      | Source chains            | Destination               | Use case                                          |
| --------------------------------------------------------------- | ------------------------ | ------------------------- | ------------------------------------------------- |
| [**Circle Gateway Deposits**](/addresses/gateway-fast-deposits) | Base, Optimism, Arbitrum | Circle Gateway on Polygon | Fast, gasless USDC deposits into Gateway (20–40s) |

## How it works

```mermaid theme={null}
graph LR
    User[User]

    subgraph Source [Source chain]
        Factory[Address Factory]
        PA[Programmable Address]
        Portal[Portal]
    end

    subgraph Dest [Destination]
        Wallet[Recipient wallet / balance]
    end

    Solver[Solver]

    User -->|"1. request address"| Factory
    Factory -->|"deterministic address"| User
    User -->|"2. send USDC"| PA
    PA -->|"3. deploys and creates intent"| Portal
    Solver -->|"4. fulfill"| Wallet
```

1. **Address generation.** Your app calls the API for a deposit address derived from `(depositor, destination, chainId)` via CREATE2. The address is deterministic, same inputs always return the same address.
2. **Token transfer.** The user sends USDC to the address. First deposit triggers contract deployment automatically (no gas until funds actually arrive).
3. **Action execution.** The contract publishes a [Routes intent](/routes/overview) for the deposited amount.
4. **Fulfillment.** Solvers compete to deliver the destination outcome.

## Properties

**Permissionless.** Any wallet or app can generate an address via the API. No whitelisting, no KYC at the protocol level.

**Non-custodial.** The deposit contract's only operation is `createIntent()`. It cannot be drained, redirected, or upgraded. If the intent expires unfulfilled, an independent permissionless refund service returns the USDC to the depositor.

**Immutable.** The address is CREATE2-derived from the inputs. Calling the endpoint again with identical inputs always returns the same address, and the address can be shared before the contract is deployed onchain.

## Funding methods

Funds can arrive at a Programmable Address by any of:

| Method                               | User pays gas? | When to use                                                  |
| ------------------------------------ | -------------- | ------------------------------------------------------------ |
| Direct ERC-20 transfer               | Yes            | Sender already has source-chain gas                          |
| ERC-3009 `transferWithAuthorization` | No             | **Recommended** for gasless UX (USDC-native)                 |
| EIP-2612 Permit                      | No             | Fallback for tokens that support `permit()` but not ERC-3009 |

See [Funding methods](/addresses/funding-methods) for signing code and field-by-field details.

## Architecture

| Contract                                                     | Role                                                                         |
| ------------------------------------------------------------ | ---------------------------------------------------------------------------- |
| [Factory](/addresses/architecture/factory-contract)          | Computes deterministic addresses, deploys deposit contracts on first deposit |
| [Deposit contract](/addresses/architecture/deposit-contract) | Per-destination contract, receives tokens, calls `createIntent()`            |

The factory is configured per source-token / destination-chain pair, with immutable parameters for Portal address, prover address, and intent-deadline duration.
