Constants
Every protocol constant and default, with its exact value, including the Pons terms NOIR trades under.
Values are read from the verified contracts. Where a value is set at deployment, the table gives the value the mainnet deployment uses; read the live value from the contract when it matters.
PrivateVault
| Constant | Value | Meaning |
|---|---|---|
VIRTUAL_SHARES | 1e6 | Virtual shares in the share price, against the first-depositor inflation attack |
GAS_MARGIN_BPS | 2_000 (20%) | A UserOperation's fee must be worth its maximum gas cost plus this margin |
MAX_PRICE_STEP_BPS | 1_000 (10%) | A block's price (the last one poked in it) enters the average clamped to ±10% of it |
| EMA weight | 1/8 | ema = (ema * 7 + close) / 8: at most 1/8 × 10% = 1.25% per block |
BPS_DENOMINATOR (private) | 10_000 | Basis points |
SIG_VALIDATION_FAILED (private) | 1 | Returned by validateUserOp for an invalid proof |
| EIP-712 version | "1" | EIP712(name, "1"); the domain name is the constructor's name_ (TOKEN_NAME, noircash) |
REGISTER_TYPEHASH (private) | keccak256("Register(address owner,uint256 opk,bytes32 viewKey,uint256 nonce,uint256 deadline)") | registerFor signatures |
| Share price | convertToAssets(s) = s * (B + 1) / (S + VIRTUAL_SHARES) | Rounds down; convertToShares is the inverse |
| ERC-4337 nonce | uint192(nullifiers[0]) << 64 | One nonce key per first nullifier |
The price average counts block.number, which on Robinhood Chain is the L1 block (about 12 seconds).
FeeHarvester
| Constant | Value | Meaning |
|---|---|---|
MAX_SLIPPAGE_BPS | 300 (3%) | A buy or gas-reserve sale must land within this distance of the price average, after Pons fees |
CALLER_TIP_BPS | 50 (0.5%) | Share of the harvested ETH paid to whoever calls harvest |
MAX_HALVINGS (private) | 8 | Sizes tried for a buy or sale too large for the tolerance, halving each time (down to 1/128) |
BPS (private) | 10_000 | Basis points |
targetDeposit (immutable) | 0.1 ether | EntryPoint deposit the harvester keeps for the vault |
PoseidonMerkleTree
The same values hold in the circuit and in the app.
| Constant | Value | Meaning |
|---|---|---|
TREE_DEPTH | 24 | 2^24 = 16,777,216 leaves per tree |
ROOT_HISTORY_SIZE | 64 | Recent roots accepted by isKnownRoot; final roots of full trees stay valid forever |
| Empty leaf | 0 | |
| Insertion | pairs of leaves | 1 + 23 = 24 tree hashes per insertion; a single note is paired with an empty leaf |
NoteHash and the circuit
| Constant | Value | Meaning |
|---|---|---|
FIELD | 0x30644e72e131a029b85045b68181585d2833e84879b9709143e1f593f0000001 (21888242871839275222246405745257275088548364400416034343698204186575808495617) | BN254 scalar field modulus |
DOMAIN_NOTE | 1 | cm = H(DOMAIN_NOTE, stub, shares) |
DOMAIN_NULLIFIER | 2 | nf = H(DOMAIN_NULLIFIER, nk, cm, index) |
SHARES_BITS | 120 | Maximum bit size of any share amount in the circuit |
SPEND_TYPEHASH | keccak256("Spend(bytes32 transaction)") | EIP-712 type the wallet signs for every spend |
| Hash | Poseidon2 over BN254 | stub = H(opk, rho, r), opk = H(nk, wallet key limbs), tree nodes H(left, right) |
Circuit and proof sizes
| Item | Value |
|---|---|
| Inputs and outputs | 2 input notes, 2 output notes |
| Public inputs | 9: root, 2 nullifiers, 2 commitments, exit shares, extDataHash, domain separator high and low 128 bits |
NUMBER_OF_PUBLIC_INPUTS in the generated verifier | 17 |
| Circuit size | N = 131072 (2^17, LOG_N = 17) |
| Gates | 83,781, of which about 73,000 check the wallet signature (measured) |
| Proof size | 9,152 bytes (PROOF_BYTES) |
| Proof system | UltraHonk, EVM target (keccak transcript, ZK) |
| On-chain verification | about 2.35M gas (measured) |
| Proving time | about 1.3 s in Node, 3 to 5 s in desktop Chrome (measured) |
| Toolchain | nargo 1.0.0-beta.22, bb 5.0.0-nightly.20260522 |
Pons terms
Set by Pons V2 when it created NOIR, and frozen since. Read them from the curve (feeBps, creatorTaxBps,
protocolFeeShareBps) and from factory.getLaunchedToken(noir).
| Term | Value | Meaning |
|---|---|---|
| Supply | 1,000,000,000 NOIR (18 decimals) | Minted into the bonding curve at launch |
Standard fee (feeBps) | 100 (1%) | On every trade, on the curve and on the graduated pool |
Pons share (protocolFeeShareBps) | 3000 (30% of the standard fee) | Kept by Pons |
Creator tax (creatorTaxBps) | 0 | On every trade, all to the creator fee recipient (the harvester). Pons caps it with maxCreatorTaxBps() |
| Buyback | disabled (buybackEnabled = false) | All of the creator share goes to the harvester |
| Trader pays | 1% | Standard fee plus creator tax |
| Reaches the harvester | 0.7% | 70% of the standard fee |
| Fee currency | ETH | Credited to the Pons fee escrow; the harvester calls claim() |
| Graduation threshold | 4.2 ETH collected by the curve | Then graduate and createGraduatedPool, both permissionless |
| Graduated pool | fee 0, tick spacing 200, hook factory.memeHook() | Native ETH as currency0, NOIR as currency1 |
| Opening snipe tax | 99%, decaying to 0 over 5 seconds | On buys only; addresses named at launch are exempt, as Pons' rules allow |
| Launch phases | 0 not graduated, 1 swept, 2 pool created | PonsLaunchedToken.phase |
Deployment values
| Item | Value | Meaning |
|---|---|---|
| Token name / symbol | noircash / NOIR | NOIR's expected name and symbol, checked before deploying; the name is also the vault's EIP-712 domain name |
| Creator tax | 0 | NOIR's expected Pons creator tax, checked before deploying |
| Seed purchase | 0.001 ether | Spent on NOIR for the locked seed note |
| Seed note stub | keccak256("noircash/locked-seed") mod FIELD | Nobody knows a preimage, so the note cannot be spent |
| Initial gas deposit | 0.1 ether | Initial EntryPoint deposit for the vault |
| Target deposit | 0.1 ether | Harvester target |
| Salt namespace | noircash-v1 | Salt namespace of the CREATE3 addresses |
| CreateX | 0xba5Ed099633D3B313e4D5F7bdc1305d3c28ba5Ed | CREATE3 factory for every noircash contract; salts are guarded by the deployer and the chain ID |
| Pons factory | 0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e | Pons V2 launch factory |
| Pons fee escrow | 0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9e | Where Pons credits the creator fees |
| PoolManager | 0x8366a39CC670B4001A1121B8F6A443A643e40951 | Uniswap v4 PoolManager |
| EntryPoint | 0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108 | ERC-4337 EntryPoint v0.8 |
App defaults
What the noircash app uses when it builds a private transaction.
| Item | Value | Meaning |
|---|---|---|
| Verification gas limit | 5,500,000 | Validation gas limit of every private action |
| Call gas, sale | 650,000 | Execution gas of a sale (the swap and the ETH transfer) |
| Call gas, send or unshield | 60,000 | Execution gas of a send or unshield |
| Proof size | 9152 bytes | The placeholder proof used for estimates has the same size |
| Gas margin | 2,000 bps (20%) | Must match the vault's |
| EntryPoint | 0x4337084D9E255Ff0702461CF8895CE9E3b5Ff108 | Canonical EntryPoint v0.8 |
| CRS points | 2 ** 17 (131072) | CRS points the prover loads, served by the app |
| Note ciphertext length | 286 bytes | 32 (ephemeral key) + 1 (view tag) + 24 (nonce) + 96 + 117 (memo) + 16 (tag) |
| Share amount limit | 2 ** 120 | The same bound as SHARES_BITS in the circuit |
| Slippage | 100 bps (1%) | Minimum output = quote × (10,000 − slippage) / 10,000 |
| Provisional gas | preVerificationGas 1,000,000; maxFeePerGas 0.1 gwei; maxPriorityFeePerGas 1,000,000 wei | Used before the bundler's estimate, when the bundler reports no price |
| Fee in shares | convertToShares(minGasFeeTokens) + 2 | Shares paid as the network fee |
| Bundler gas price | standard × 5/4 | From pimlico_getUserOperationGasPrice |
Bundler preVerificationGas | estimate × 11/10 | |
| Bundler receipt polling | from every 2 s, backing off to 5 s | Gives up after 2 minutes |
| Direct submission gas | 20,000,000 | Gas of the handleOps call when the wallet submits it itself |
Key-derivation Issued At | 2026-01-01T00:00:00.000Z | Fixed, so the message and the keys are deterministic |
Key-derivation Nonce | first 16 hex characters of the vault address |
Services
| Item | Value |
|---|---|
| App domain | noircash.app |
| Bundler | https://public.pimlico.io/v2/4663/rpc |
Indexer page size of /events | 2000 events |