08 / Measured
Every figure here was read off a run.
Nothing on this page is an estimate. The gas is measured inside a real TaxProcessor.dispatch(), and the sizes are the compiler's.
Status
Nothing is deployed. No factory, vault or ledger address exists on any chain, no transaction has been broadcast, and the repository carries no git remote. ./submission/check asserts all three.
04 / The gas number
108,115, against a ceiling of 1,000,000.
Measured inside a real TaxProcessor.dispatch() on a BSC mainnet fork, as a difference between two runs of that same dispatch: once into the vault, once into the same address carrying a control body that is a single STOP. What is zero is the work done inside that control frame — not its cost. The control leg still bills 93,291 gas for everything outside the frame, the real leg bills 201,406, and the difference is the 108,115 above.
Rule 005 / the differential, against the ceiling
Each lane runs from zero to Flap’s 1,000,000-gas limit for receive(). Every figure is gas billed inside a real TaxProcessor.dispatch() on a BSC mainnet fork — a measurement, not an estimate.
-
Dispatch into the control body — the same address carrying a single STOP
93,291
-
Dispatch into the vault — the real receive()
201,406
-
The difference, and it is the whole claim — what the vault’s own frame costs
108,115
Everything the two legs share — the cold account access, the value stipend, the dispatcher’s own work — is identical and cancels. The control is run twice and the two readings must agree to the gas, or the test reports noise instead of a number; and the same dispatch handed three quarters of the measured gas is required to fail, which is the only evidence that the number is the requirement rather than something a subtraction produced.
The vault’s receive() does immutable period arithmetic, one bucket write, a project snapshot, two counters and one event — no loop, no external call, no transfer, no delegatecall. It reads the cadence from its own copied immutables, so it never calls the ledger to find out what period it is in.
05 / Bytecode
Runtime size, and the room left.
| Contract | Runtime bytes | Headroom to EIP-170 |
|---|---|---|
| DustVault | 24,334 | 242 |
| DustVaultFactory | 6,234 | 18,342 |
| DustLedger | 3,993 | 20,583 |
| DustVaultDeployer | 2,197 | 22,379 |
| DustLedgerDeployer | 2,141 | 22,435 |
| DustBeacon | 798 | 23,778 |
The factory holds two creation-code deployers rather than embedding both contracts, because a factory carrying both would not fit. Each deployer creates a proxy and initializes it in the same transaction, so no uninitialized proxy ever exists for somebody else to claim.
Build settings are part of the result and all pinned: Solidity 0.8.26, EVM version Cancun, optimizer 200, via-IR. Leaving the EVM version unpinned lets a newer toolchain retarget the bytecode to a fork BNB Chain does not run.
06 / Rule by rule
Ten rules, one row each.
| Rule | Status | Note |
|---|---|---|
| 001 | Pass, one open item | base and factory inherited unmodified; the UI schema declares VaultMethodSchema[](11) — four read methods and the vault’s seven state-changing entry points, a count a test derives from the source rather than from a hand-written list; the only privileged function in the system is setProject, guardian-only; settlement never loops over participants |
| 001 · commission | Needs Flap’s decision | the rule recommends 3% at a 2% tax; this vault credits 30% to a launcher-configured, per-period-snapshotted project address |
| 002 | Pass | only the VaultPortal may create a vault; payload length and address padding checked before decoding; native BNB only; commission measured on chain |
| 003 | Pass, with disclosures | tax arriving in a period funds the next, so no privileged sandwich; the disclosures are Sybil pricing and the unobservable sweep |
| 004 | Pass | every require in our own code is a literal string in both languages; no custom errors declared |
| 005 | Pass | 108,115 gas measured inside a real dispatch on a fork |
| 006 | Pass | 83 tests — 56 local, 27 on a mainnet fork — of which 3 are stateful invariants at 256 runs each |
| 007 | N/A | nothing calls the AI provider |
| 008 | N/A | no trigger request or callback; settlement is a permissionless call that pays its caller |
| 009 | N/A by the rule’s own exception | both contracts are beacon proxies, so the rule exempts them; the beacon moves ownership to the Guardian inside its constructor, leaving no window where the deployer holds it |
| 010 | N/A | native-BNB vault base; the tax token being V3 does not imply a V3 vault base |