zkAPI mainnet lets vault send expired deposits to treasury

Ethereum Foundation’s zkAPI on mainnet lets a vault transfer expired prepaid AI deposits to the protocol treasury. Notes have a 30-day lifetime; an expiry claim sends the full recorded deposit.

The Ethereum Foundation deployed zkAPI on mainnet in late September and announced it Oct. 1. Etherscan shows the linked vault was created on Sept. 30. Open Anonymity developed the implementation. The billing design was coauthored by Davide Crapis and Vitalik Buterin and published in February.

Prepaid deposits fund cryptographic notes that a user’s wallet holds. Notes authorize metered API requests off-chain while settlement and withdrawal rights are enforced on-chain by the vault. The mainnet manifest records balances in native ETH units and accounts in whole gwei, though earlier announcements described USDC credits.

Users can recover funds by mutual close or by an escape withdrawal. Mutual close requires a server signing key: the billing server signs a successor state and the wallet submits that signature in a withdrawal proof to the vault, which then pays the proved remaining balance to a bound destination. An escape withdrawal can be initiated by the wallet without server clearance. The vault removes the note from the active set and creates a pending payout rather than immediately transferring funds.

The escape route triggers a 24-hour challenge window (86,400 seconds). A provider can contest an escape by submitting proof of an original request that carries the same nullifier, a cryptographic identifier that prevents reuse. If a valid challenge arrives before the deadline, the vault cancels the pending payout and restores the note to the active set. A successful challenge reinstates the state but does not by itself resolve the provider’s billed amount.

The vault exposes a pause flag controlled by the vault owner. Deposits, mutual closes and the initiation of new escape withdrawals check the pause flag; when paused, a user cannot start an escape. Pending escape finalizations are not blocked by the pause flag. Challenges and expiry claims are permitted while the vault is paused.

Notes have a 30-day lifetime as specified in the manifest. The vault code rounds the deposit time plus that lifetime up to the next one-day boundary, so actual expiry can fall later than exactly 30 days. Once an active note becomes eligible for expiry, the vault permits an expiry claim that sends the note’s full recorded deposit to the treasury. Notes already in pending withdrawal status do not qualify for an active-note expiry claim. If an escape finalization completes without a successful challenge, the vault pays the proved remaining balance to the user and sends any deposit-minus-balance remainder to the treasury, provided on-chain transfers succeed.

Dollar-denominated usage is converted using a pinned Chainlink ETH/USD price round bound into the authorization. The quote is frozen for settlement and recovery and is used to translate dollar usage into a capped charge in whole gwei. Freezing the quote does not fix the dollar value of the remaining ETH balance beyond the locked authorization.

The cryptographic proofs use a Groth16 circuit. The setup artifacts referenced in the manifest were produced by a single party rather than through a multiparty ceremony; destruction of any setup secrets is a separate trust consideration. The manifest identifies Open Anonymity’s organization key issuance and ties inference to OpenRouter. The integration is described as experimental and not production-audited.

Recovery of prepaid funds depends on users retaining the necessary spending state, initiating exits before notes expire, and having challengers and the vault available when required.

Articles by this author