zerotracedocs

Deployments

Network details, contract addresses, the Pons contracts ZERO trades on, and the public bundler of zerotrace on Robinhood Chain.

Network

FieldValue
NetworkRobinhood Chain
Chain ID4663
RPC URLhttps://rpc.mainnet.chain.robinhood.com
Explorerrobinhoodchain.blockscout.com
Native currencyETH, 18 decimals
Appzerotrace.so

On Robinhood Chain, block.number follows the Ethereum L1 block, about 12 seconds. The vault's price average counts these blocks (see Gas).

zerotrace runs only on Robinhood Chain mainnet, because Pons V2, the launchpad ZERO is created on, exists only there.

Contract addresses

ContractAddressWhat it is
ZERO0x316fa3AB9A8FD8d7567a823DedecF28d9FEE2894The token: a plain ERC-20 created by Pons V2, no owner, no transfer restrictions
Pons bonding curve0xE276F7E250bC2cD45f1e344d9adc9c9687c2c897Where ZERO trades against ETH until it graduates. Pons' contract, one per token
PrivateVault0xf3935bec6247170B28e1755c85957A72f243D84DHolds shielded ZERO: key registry, note tree, nullifiers, vault shares, price average, and the ERC-4337 account of private actions
PrivateRouter0x9EB58318791e61decBCf8A4d169a0FaD8b6fb987Buys ZERO into a note, sells a note for ETH, quotes
FeeHarvester0x8416DA7325cc619A5E560D8Ef6f413e94950CAd5ZERO's Pons creator fee recipient; receives the creator fees in ETH and turns them into gas and holder yield
HonkVerifier0x3DAd6EB076169F409A7901dff7BD26be3E883B09UltraHonk verifier of the transact circuit
Poseidon2 hasher0xb63c2AA1370B32CcfABaf5d24F854D817b405833Poseidon2 over BN254, used by the note tree

ZERO's and the curve's addresses are chosen by Pons when it creates ZERO. Pons' record of the token names the harvester as its creator fee recipient: factory.getLaunchedToken(zero).creatorFeeRecipient.

Pons V2

ContractAddress
PonsV2LaunchFactory0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e
PonsV2MemeHook (the factory's memeHook())0xE5e702641Ea86F4ae6cC3cDaeD2B886f976Be044
Pons fee escrow0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9e

The router and the harvester read the hook from factory.memeHook() at deployment, and it is the address above.

Shared infrastructure

Deterministic addresses

Every zerotrace contract is deployed through CreateX's CREATE3, with a salt that only the deployer can use and that includes the chain ID. An address therefore depends only on the deployer, the chain and a salt label (zerotrace-v1), not on the contract's bytecode. The mainnet deployer is 0x1B0210b9695BbEB8bD70964A46bf512021127A73, so the zerotrace addresses above are fixed before deployment. ZERO's and the curve's addresses are not: they are set by Pons.

Where ZERO trades

ZERO trades in two places over its life, both run by Pons:

  1. The bonding curve, from launch until it has collected 4.2 ETH.
  2. The graduated Uniswap v4 pool, after that. Graduation takes two permissionless calls on the factory, graduate (sweeps the curve) and createGraduatedPool (seeds the pool). The router and the harvester make them themselves on the next trade if nobody else has.

The graduated pool's PoolKey:

FieldValue
currency00x0000000000000000000000000000000000000000 (native ETH)
currency1ZERO, 0x316fa3AB9A8FD8d7567a823DedecF28d9FEE2894
feethe launch's poolFee (0)
tickSpacingthe launch's tickSpacing (200)
hooksPonsV2MemeHook, 0xE5e702641Ea86F4ae6cC3cDaeD2B886f976Be044

Only the Pons factory can initialize a pool with its hook, so nobody can open this pool first. A pool with any other key (another fee, tick spacing or hook) has another pool id and is ignored by the router, the harvester and the price average. Fees are the same before and after graduation. See The pool.

Aggregators already route Pons tokens on Robinhood Chain, on the curve and on graduated pools. See Integrations.

Bundler

Private actions (send, sell, unshield) reach the chain as ERC-4337 UserOperations whose sender is the vault. The app uses Pimlico, which lists Robinhood Chain (4663) with EntryPoint v0.8:

FieldValue
Endpointhttps://api.pimlico.io/v2/4663/rpc?apikey=… with the app's key; without a key, the public https://public.pimlico.io/v2/4663/rpc
Rate limit5,000 requests per minute with a key; 20 per minute per IP on the public endpoint
EntryPointv0.8, 0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108

The API key ships in the page, so it is restricted on Pimlico's side: to the vault as the only contract, to the app's origin, with no sponsorship policy and a low spending cap. The vault rejects any operation with paymasterAndData, so the key cannot be used to sponsor gas. The app talks to Pimlico directly, not through a proxy of ours that would see users' IP addresses next to their operations.

Limits that matter:

  • Rate limit. One private action makes a few requests: a gas price, an estimate, the send, then receipt polls from every 2 seconds backing off to 5. On the public endpoint, several actions in a row from one IP can hit 20 per minute.
  • Validation gas. The app does not use the bundler's validation estimate, which is far above what a private transaction uses. It sets verificationGasLimit to its own 5,500,000 and takes only preVerificationGas from the bundler.
  • Gas price. The app reads it with pimlico_getUserOperationGasPrice, a Pimlico method, and pays 1.25 times the standard price.

Any ERC-4337 bundler that supports EntryPoint v0.8 can be used instead.

On this page