Skip to content

Smart Contracts

Deployed Addresses (Ethereum Mainnet)

ContractAddress
MainPool (ERC1967 Proxy)0x7dc44f4d7d13853a14b26169c8479bec3939649d
OFFToken0x1d0a521b57850a94abcd78ad4180764285225842
Governance0xccbeb3e0ebd807e7df7d5963bbe09caadb702bd9
Timelock0x887d683078bf8f4fa6d3ea165f4b3e4866fe39d9
Staking0x1df7648356f675abd79f9440f14e56c378b61f44
RelayerRegistry0x8d5ba08b1db746803da28dcda69e0065eb52d45a
DepositFactory0x2d664e02b8ae9745254f32fbb74e3cb97e262920
TokenVesting0x914955471f2e8067548460e4ea8fd94b57a10ab0
PriceOracle (V1, deprecated)0x083ce29dddb4fdd85521e0f8ca44052cd22ba192
PriceOracleV20xB71B97C918c7B5200C7E8De14b09A211eF055af5
Echoer0x17586b4ff8fb2a91ec2b141a557a974aa485e745
WithdrawVerifier0x8081b364795a0e539dce0d3e354405f5f04781ad
PoseidonT20xddaf4ff4d571905f248d6a34d39ec8f45dbe4cbf
PoseidonT30x0dc883fe7d6ce6d9c7b4abd1dc005b7d79f7be78
PoseidonT3Lib0x082160e070c6729b488fc88beb099e094f43cd37
PoseidonT4Lib0xd9ff112c9c15cb999dbfd6ced4b9721754e3462f
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

solidity
// 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:

solidity
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:

  • useUniswap toggle — when enabled, reads the live Uniswap V4 spot price; when disabled, falls back to manualRate
  • manualRate fallback — 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.

Open source privacy technology