Smart Contracts
Deployed Addresses (Ethereum Mainnet)
| Contract | Address |
|---|---|
| MainPool (ERC1967 Proxy) | 0x7dc44f4d7d13853a14b26169c8479bec3939649d |
| OFFToken | 0x1d0a521b57850a94abcd78ad4180764285225842 |
| Governance | 0xccbeb3e0ebd807e7df7d5963bbe09caadb702bd9 |
| Timelock | 0x887d683078bf8f4fa6d3ea165f4b3e4866fe39d9 |
| Staking | 0x1df7648356f675abd79f9440f14e56c378b61f44 |
| RelayerRegistry | 0x8d5ba08b1db746803da28dcda69e0065eb52d45a |
| DepositFactory | 0x2d664e02b8ae9745254f32fbb74e3cb97e262920 |
| TokenVesting | 0x914955471f2e8067548460e4ea8fd94b57a10ab0 |
| PriceOracle (V1, deprecated) | 0x083ce29dddb4fdd85521e0f8ca44052cd22ba192 |
| PriceOracleV2 | 0xB71B97C918c7B5200C7E8De14b09A211eF055af5 |
| Echoer | 0x17586b4ff8fb2a91ec2b141a557a974aa485e745 |
| WithdrawVerifier | 0x8081b364795a0e539dce0d3e354405f5f04781ad |
| PoseidonT2 | 0xddaf4ff4d571905f248d6a34d39ec8f45dbe4cbf |
| PoseidonT3 | 0x0dc883fe7d6ce6d9c7b4abd1dc005b7d79f7be78 |
| PoseidonT3Lib | 0x082160e070c6729b488fc88beb099e094f43cd37 |
| PoseidonT4Lib | 0xd9ff112c9c15cb999dbfd6ced4b9721754e3462f |
| MainPool (implementation) | 0x8ab75cdbbbae2aabca95090e45daa089cd6ed3b0 |
Deploy block: 24453969
MainPool
The central contract that manages:
- Merkle tree (depth 20, ~1M deposits)
- Deposit handling (ETH and ERC-20)
- Withdrawal verification (ZK proof validation)
- Nullifier tracking (double-spend prevention)
- Partial withdrawals (change re-commitment)
- OFAC sanctions screening (Chainalysis Oracle integration)
- Minimum withdrawal amount (0.1 ETH)
Deployed behind an ERC1967 Proxy for upgradeability via governance.
Key Functions
// Deposit ETH
function depositETH(bytes32 commitment) external payable returns (uint32 leafIndex);
// Withdraw with relayer
function withdrawWithRelayer(
bytes calldata proof,
bytes32 merkleRoot,
bytes32 nullifier,
address recipient,
address token,
uint256 amount,
address relayer,
uint256 fee,
bytes32 newCommitment,
uint256 changeAmount
) external;DepositFactory
Creates unique one-time deposit addresses using CREATE2:
function createDepositAddress(bytes32 commitment, address token, uint256 amount)
external returns (address);RelayerRegistry
Manages relayer registration and fee model:
- Open registration — any relayer can register by staking 20,000 OFF tokens
- ENS verification — relayers must own an ENS name (verified on-chain)
- Protocol fee — 0.3% of each withdrawal in OFF (deducted from relayer stake, sent to stakers)
- Relay volume tracking
- Active/inactive status
Staking
Revenue share contract for OFF token holders:
- Lock OFF for 1 week to 4 years
- Earn proportional share of protocol fees (0.3% of withdrawals)
- Lock multiplier: 1.0× to 2.5× (linear scaling)
TokenVesting
Manages vesting schedules for Treasury and Team allocations:
- Treasury: 65M OFF, 5-year vesting, 3-month cliff
- Team: 25M OFF, 3-year vesting, 1-year cliff
PriceOracleV2
Provides ETH→OFF price conversion for calculating the 0.3% protocol fee in OFF tokens. PriceOracleV2 reads the spot price directly from the Uniswap V4 PoolManager contract via extsload — no oracle hooks are needed.
Key features:
useUniswaptoggle — when enabled, reads the live Uniswap V4 spot price; when disabled, falls back tomanualRatemanualRatefallback — governance-adjustable manual rate used when Uniswap pricing is disabled- No hooks required — reads pool state directly from PoolManager storage via
extsload
A Timelock transaction has been queued to switch the RelayerRegistry to use PriceOracleV2 (ETA ~Feb 16, 2026). The previous PriceOracle V1 (0x083ce29dddb4fdd85521e0f8ca44052cd22ba192) is deprecated.