A minimal EVM contract language · Lean 4
Barely a language. Fully proved.
Start from the destination: a contract that does X, and a machine-checked proof that it does X — with the least possible restriction on what X may be. If that is all you care about, and every route to it is open, including routes nobody ships yet — how do you build it?
Blanc is a full-stack answer. Four syntax constructors — branch, last, next, call. They spell the name, and they are the whole language; everything else is the EVM itself. That near-absence is the design: a canvas as blank as verification allows, a machine-checked compiler connecting every deployed byte back to source, and on top of it theorems most toolchains cannot even state — proved in Lean 4 over Jaune’s executable EVM semantics, about the exact bytes.
Fig. 1 — two of the repository’s gates, verbatim (latest run 2026-08-13): the axiom audit that pins every audited theorem to its exact axiom set, and the differential gate executing Blanc’s WETH10 beside the deployed original’s runtime, byte for byte, in a pinned oracle.4
Abstract. Blanc is a contract language for the Ethereum Virtual Machine that adds as little to the EVM as its authors could manage: four constructors over the raw instruction set, a compiler into deployable bytecode, and a machine-checked proof that the compiler is correct. Programs, semantics, compiler, and proofs are one Lean 4 artifact — roughly 149,000 lines — built on Jaune’s executable EVM semantics at a pinned commit. Three contracts are in: a WETH at less than a third of the deployed WETH9’s code size, its solvency proved over every reachable state of a configured chain; an ERC-3156 flash-mint token whose supply conservation survives arbitrary reentrant borrower code; and a full 27-selector WETH10, taken from zero contract code to a verified drop-in — every verification goal in its charter met — in under twenty-four hours of wall clock, by one developer with one laptop and an agent in the loop. Its flagship theorem is of a kind rarely purchasable at any price: from a proved deployment onward, every holder’s booked balance stays exactly conserved at every reachable future, and every wei of it is redemption-enabled through canonical withdraw and withdrawTo at both message and Prague type-2 transaction altitude. For a funded code-free external holder with the canonical transaction fields, only recovery of its own signature remains to admit the transaction; no theorem manufactures that signature. Under one stated hash hypothesis, every nonzero permanent outflow in the full deployment window traces exactly to the holder’s own call, its in-window approve, or its in-window permit. Behavioral claims are defended in layers — a frozen compatibility boundary, a 147-row differential corpus beside the deployed reference, universal theorems over the exact compiled bytes, a published assurance boundary — and closed with a standing, falsifiable wager for whatever the layers missed. Blanc does not verify contracts already deployed, and does not pretend the switch is cheap: it is a new, deliberately bare language, and the mature toolchains stay behind. The bet is that what it buys exists at no other counter. MIT-licensed.
§ 1 The questions we expect
What a port claims — and how we earn it.
The evidence above is a portfolio of ports: a WETH, a flash-mint token, a full 27-selector WETH10 — contracts you already know, rebuilt in a language you have never heard of. Which invites a fair suspicion: is this claiming to be WETH10 — to the byte? And if not, what kind of win is being advertised?
To the byte: no — permanently no.5 What a port claims is a counterfactual: were X being written and deployed today, the Blanc implementation would be a better way to build it — where better is three specific things: behavior that follows a stated, proved specification; an artifact that stays within reach of interactive verification; low-level freedom spent on measured wins. The ports are demonstrations, staged on contracts whose behavior you already know so that the demonstration can be checked against something you trust. And if what you need verified is bytecode already on chain, Blanc is not that instrument — every theorem here is about Blanc’s own artifact, a boundary § 6’s ledger prices with the rest of the bill.
Now grant all of that, and you may still, reasonably, be wondering: what counts as the right behavior — and how do we know the ports have it? This section exists to answer exactly that. A familiar name is not evidence, and a correct compiler is no defense if the program it faithfully compiles is the wrong program. So the answer is built in layers — each catching a different way the claim could fail, none asked to do another’s job. WETH10, the fullest instance to date, answers like this:
“Right” is written down before it is argued. A compatibility contract freezes the reference’s ordinary-call public boundary, endpoint by endpoint — all 27 selectors and receive: outputs, state and ETH effects, logs, guard order, rollback, what a callback may observe mid-flight — and every row names the evidence that owns it. A behavior nowhere stated can be neither checked nor falsified, so the statement comes first, and it is committed.
The cheapest way to be wrong is to prove the wrong program — tests catch that first. A generated corpus executes Blanc’s exact runtime beside the deployed original’s, byte for byte, in a pinned oracle: 147 rows across every entry, two identity worlds, hostile reentrancy, static contexts, eight live channel falsifiers. 147/147 agree. This layer is deliberately modest — chosen executions, not semantic equivalence, never called a proof — and it is what keeps the theorems honest about which X they are theorems about.
Where the corpus samples, the theorems quantify. Public compiled-effect families cover all 28 runtime entries — reads, state transitions, the three typed callbacks, permit, flash loans, exact rollback and error genres. Above them sit the load-bearing claims: holder-flow conservation in ℕ, dormant-holder protection, a deployment root derived through the real block pipeline, and constructed withdraw/withdrawTo success at message and transaction altitude — the future-redeemability flagship of § 4. Every statement ranges over the states, arguments, callbacks, and valid chain histories its quantifiers name, and every one is about the exact compiled bytes.
The edge is published with the same care as the center. The README’s assurance boundary keeps three registers — formally proved, executably tested, not established — and the third is load-bearing: no deployed-runtime verification, no semantic-equivalence claim, no malformed-calldata closure, no key custody or inclusion, no gas, storage, or codehash parity. Deviations from the reference are governed, not forbidden: each is a registry row with a stance and evidence — WETH10’s registry currently holds zero accepted rows in its stated scope — and an observable difference with no row is a defect by the project’s own rules. Silence is the one prohibited move.
No specification list is ever finished, so the defense ends in a standing wager, deliberately falsifiable: produce a specification that is true of the deployed original and that its authors and users would endorse as a feature, and either it holds of the Blanc port, provably, or a pre-dated registry row already priced the divergence. If neither, the wager is lost — in public. The burden is the project’s; “that was never claimed” is not an available answer, and neither is “we could probably prove it.”
A property believed but not yet proved is recorded as a counted verification debt, never asserted — asserting unproved properties is what every unverified contract already offers. When a property resists proof, the rule is: claim less, never assert more. The standing terms — the wager’s two conditions, the interface/accident boundary, the timestamp rule that stops a stance being invented after a challenge — are PORTING.md’s. This page summarises it; that document governs.
Precedent, from the first port: Blanc’s WETH is several times smaller than the deployed WETH9 and cheaper on the call paths measured, and where its simpler storage scheme admits a key-collision WETH9’s layout cannot express, it refuses the operation rather than silently writing through a third party’s balance slot. Each is a deviation from the letter of the reference; each is recorded; and each is a feature no informed deployer would trade back.
§ 2 The language
A blank canvas over the EVM.
Hold the title block’s destination fixed — machine-checked claims about exact deployed bytes, for as wide an X as verification allows — and the language designs itself backwards. Contract languages usually add: types, objects, modifiers, a memory manager, an optimizer pipeline. Every addition is expressive power, and every addition is also distance between what you wrote and what the chain runs. Blanc subtracts instead. The EVM’s own instructions are the vocabulary; four constructors arrange them; the compiler’s one real job is placing jumps. What is left out is the point — the developer keeps the whole surface of the machine, and the verifier keeps a language small enough to prove things about.
Four constructors, no fifth
A Func is a branch on the stack top, a straight-line next, a terminal last, or a call into the program’s function table. There are no expressions, no variables, no loops-as-syntax — recursion through call and the machine’s own stack are all there is, which is exactly what a proof has to walk.
The one liberty withheld
Raw bytecode lets a program compute a jump target from anything. Blanc doesn’t: control flow is the tree you wrote, and the compiler owns every offset. That single restriction is what makes a reusable proof stack possible — inversion tactics that take an execution apart along the program’s own shape, and forward tactics that build one, gas account included, without per-contract jump reasoning.
Everything else is yours
Storage schemes, stack discipline, dispatch order, calldata handling, gas layout: all open. Blanc’s WETH keeps balances at raw address words and refuses a hash collision rather than writing through it — a scheme Solidity’s mapping layout cannot express. Spent well, the freedom shows up as measured wins: 988 bytes of WETH runtime against the deployed WETH9’s 3,124.
The whole grammar, a real endpoint, and the theorem that connects them
-- B·La·N·C. This is the whole abstract syntax of the -- language: four constructors over Jaune's instruction -- types, and a program is functions in a table. inductive Func : Type | branch : Func → Func → Func | last : Linst → Func | next : Ninst → Func → Func | call : Nat → Func structure Prog : Type where (main : Func) (aux : List Func)
def withdraw : Func := loadCallerBalanceAmount 0 +++ balanceTooSmall +++ (.call burnBalanceErrorSlot) <?> (debitLoadedBalance +++ caller ::: arg 0 +++ pushB256 0 ::: emitTransfer +++ swap 0 ::: pop ::: sendValueToCaller +++ iszero ::: (.call ethTransferErrorSlot) <?> Func.stop)
Instructions are the EVM’s own; ::: is next, <?> is branch, and every name above it is ordinary Lean definition — the “standard library” is whatever you prove you need.
-- Backward simulation: from any successful EVM execution -- of the compiled bytes, recover a source-level run. theorem correct (sevm : Sevm) (pre : Devm) (p : Prog) (post : Devm) (exc : Exec 0 sevm pre (.ok post)) (eq : some sevm.code.toList = p.compile) : Prog.Run sevm pre p post -- And, gas-exact, in both directions — the bridge that -- lets a proof construct a real execution, not just -- take one apart. theorem Prog.runCompiled_iff_exec … Prog.RunCompiled sevm pre p post ↔ exec ⟨0, sevm, pre⟩ = .ok post
The direction of correct matters: a property proved of the source is thereby a fact about what the EVM executes. The biconditional adds the forward direction, which is what liveness and exact-gas theorems are built on.
Blanc states nothing about the EVM on its own authority. Its semantics is Jaune — the executable Lean specification that passes the full current-mainnet fixture corpus, 5,100/5,100 files — imported at a pinned immutable commit. Every theorem on this page bottoms out in the same definitions that interpreter compiles to, so “which semantics was this proved against” always has a one-line answer, and the semantics itself is the one the ecosystem’s own test corpus exercises.
The division of labour is exact: Jaune owns what the machine does; Blanc owns programs, the compiler, and everything proved about particular contracts.
Batteries are not included, and that is a fact about the project’s age as well as its taste: what exists today is what three contracts needed — a dispatcher pattern, ABI helpers, a shared nonpayable guard, a proof ladder. Each was written once, proved, and reused by the next contract. § 7 is about how fast that library grows now.
§ 3 The portfolio
Three contracts in.
Each contract raised the bar for the next: WETH established the method, FMINT added adversarial callbacks and made the shared-module discipline load-bearing, and WETH10 — a full 27-selector production surface with flash mints, ERC-677-style callbacks, and EIP-2612 permit — is the demonstration that the method scales.
| contract | reference | runtime | proof surface | execution evidence |
|---|---|---|---|---|
| WETH wrapped ether |
WETH9, the mainnet contract at 0xC02a…6Cc2 | 988 B vs 3,124 B deployed |
solvency — the contract always holds enough ETH to honour every balance — proved at frame, block, chain, and raw-wire altitude, across scheduled fork activations; exact view gas | 11 oracle-filled fixtures incl. a reentrancy attempt; selector coverage gate, budget 0 |
| FMINT flash-mint token |
ERC-3156, referenced against OpenZeppelin’s ERC20FlashMint | 1,257 B | supply conservation (totalSupply = Σ balances) under arbitrary reentrant borrower code; the flashLoan spec with 7 no-success corollaries; settlement trichotomy with no premise about the borrower; constructed exact reverts | 11 fixtures / 188 assertions; a solc-compiled borrower as decoder diversity |
| WETH10 flash-minting WETH |
the deployed WETH10 at 0xf4BB…8A9F — 27 selectors + receive, flash loans, permit | 6,313 B vs 9,975 B deployed |
full functional families for all 28 entries; a proved singleton type-2 deployment through the real block pipeline; holder-flow conservation; the future-redeemability flagship of § 4 | 147 differential rows vs the deployed runtime, zero mismatches; replayed deployment & redemption blocks |
Table 1 — the current portfolio. Sizes are committed literals checked by gates (check-runtime-bytes.py compares every fixture’s installed code byte-for-byte against the Lean literal); the deployed WETH9 and WETH10 figures come from the pinned reference locks in the deviation registries. Smaller is not the pitch — proved is — but the sizes fall out of a language with no mandatory dispatcher or ABI scaffolding, and they are measured, not asserted.
Contracts are siblings in the import hierarchy — no contract’s module imports another’s, mechanically enforced by a layering gate. When one contract needs something another defined, that is evidence the thing was never contract-specific, and it moves upstream with a rename. The shared layer this discipline has accreted — the verification ladder, forward and inversion tactic families, the callback-crossing machinery — is the real asset: it is why the third contract cost a day, not a season.
§ 4 The flagship
What a holder is promised: future redeemability.
Wrapped ether has one job: a booked balance must be a claim on real ETH that its holder can actually collect. Most verification stops at an invariant — “the books balance now.” The flagship, landed 2026-08-12, goes where the user’s risk actually lives: any reachable future, after arbitrary other actors — flash loans, reentrancy, hostile callbacks — have done their worst.
From a proved deployment of the exact compiled WETH10 runtime, any leg of valid Prague blocks to a checkpoint, and any further leg to an arbitrary future snapshot, there is an accounted history of the window carrying the dual-selector redemption guarantee below for an arbitrary holder u.
theorem deployment_reachable_future_dualSelector_redeemable {chainId : UInt64} {dp : DeployParams} {ca u : Adr} {base deployed checkpoint future : BlockChain} (hroot : Weth10.DeploymentRoot chainId base deployed dp ca) (hcheckpoint : BlockChain.ReachUsing (ChainConfig.pragueOnly chainId) deployed checkpoint) (hfuture : BlockChain.ReachUsing (ChainConfig.pragueOnly chainId) checkpoint future) : ∃ history, FutureDualSelectorRedemptionGuarantee chainId dp ca u checkpoint future history
Read the quantifiers — u is every holder, not a specially chosen one. This dual-selector theorem is pointwise. Its sibling deployment_reachable_future_redeemable_allHolders packages one history carrying the inherited FutureRedemptionGuarantee for all holders at once; it does not claim a dual-selector all-holders package. ReachUsing is Jaune’s configured-chain reachability: whole valid blocks, every transaction anyone sent, arbitrary contracts doing arbitrary things — under the model’s one global side condition, that total ETH plus pending withdrawals stays below 2256 wei. The history is obtained from the reachability derivation, not reconstructed from the endpoints — a logical guarantee about the window, not a trace extractor. And the deployment root is no opaque axiom: given one successful canonical creation-block transition through Jaune’s actual Prague block pipeline, DeploymentRoot — receipt success, exact installed runtime, empty storage — is derived, not assumed.
The guarantee, field by field
An exact conservation equation. B₀ + ordinaryIn = Bₜ + redeemed + externalTransferredOut — checkpoint balance plus what came in equals future balance plus what the holder took out. Flash-mint credits and repayments are proved to pair exactly and cancel; committed credits are proved not to wrap. The books do not merely balance — they balance in ℕ, with no hidden modular slack.
You cannot be diluted below your residual. B₀ ≤ Bₜ + redeemed + externalTransferredOut: whatever the window did, a holder’s checkpoint balance is covered by what they still have plus what the runtime recorded them taking out.
Every residual wei is withdrawable through either selector. For every amount within the residual, every admissible canonical withdraw or withdrawTo message at the future snapshot succeeds — constructed execution, not absence of counterexample, under a named conservative Prague gas bound. Both live inside the dual-selector package.
And at whole-transaction altitude. The same enabledness for complete admissible signed type-2 withdraw and withdrawTo transactions whose entry state is the future snapshot — intrinsic gas, validity, and settlement included, not abstracted. Admissible senders are exactly the senders Ethereum’s modeled rules admit: code-free or valid EIP-7702-delegated accounts. Direct withdraw also makes the sender the recipient, so its receiver premise remains code-free. For a funded code-free external holder with canonical nonce, fees, gas, and payload, the non-signature envelope discharges every other admission premise: recovery of its own signature is the sole unproved input.
Every permanent-outflow wei in the deployment window has one of three governing roots. Under one stated hypothesis — distinct touched allowance pairs hash to distinct keys — redemptions plus external transfers out equal the hardened outflow; flash pairs and self-transfers cancel exactly. Every nonzero contributing record is the holder’s own direct call, or roots at an in-window approve by the holder or an in-window permit recovering to it. Empty deployment storage and rooted-ledger replay eliminate the inherited-checkpoint case for nonzero outflow. That fourth root remains part of the more general theorem for histories beginning at an arbitrary checkpoint. Only attribution takes the collision hypothesis; redeemability never does.
Jaune’s executable semantics. The same definitions that pass 5,100/5,100 current-mainnet fixture files — so the machine under these quantifiers is the one the ecosystem’s own corpus exercises.
Across a deployment-rooted history, a holder with no effectful authorizing act — no debit as actual caller, approve write as caller, or permit recovering to it — cannot have lost a wei. Empty deployment storage supplies allowance quiescence over every raw alias.
bookedBalanceNat deployed.state ca u
≤ bookedBalanceNat future.state ca u
“Did nothing, lost nothing” — stated over an authentic collision-free history, and “nothing” is effectful: a same-caller view read or another inert visit does not void the premise. The raw-alias allowance condition is still real; the deployment root, not an extra user assumption, discharges it here.
For any supplied duplicate-free holder list and admissible recipient map, every permutation of one full-booked-balance claim per listed holder pays out, one canonical message at a time, with stable boundaries and the exact aggregate effect on balances and ETH.
This is a bank-run theorem over the list it is given; no holder enumeration is derived from state. Its sibling deployment_reachable_redeemClaims_anyOrder handles arbitrary bounded and repeated claimants. In both, the admission record is re-established after every step — nothing about later success is assumed. Messages are deliberately not mined, and callers are not authenticated at this altitude: inclusion, fees, and signatures live at the transaction layer.
The theorem is about the exact compiled Blanc runtime, on a Prague-only configured chain, from its proved deployment root — not about the Solidity artifact deployed at 0xf4BB…8A9F, which nothing here verifies. Attribution names the account whose recorded act the runtime accepted; it is not evidence of consent or intent — a phished approve and a relayed permit both attribute to the signing account. Collision-freedom is a stated hypothesis consumed only by attribution, scoped to the pairs the trace actually touched. Redemption theorems consume the holder’s message or signed transaction as an input. For the funded code-free external-owner envelope, the holder’s recovered signature is the sole unproved input; no theorem forges it. Valid EIP-7702-delegated senders are admitted, but a holder with non-delegation contract code that cannot call WETH10 — including WETH10 itself, which can legally be sent its own token — keeps a conserved balance with no transaction-altitude exit of its own. Recipients remain nonzero, non-precompile, and code-free where stated. The supplied everyone-list is not a state enumeration. Inclusion, propagation, key custody, and fee markets are out of frame. The full boundary lives in PORTING.md and the WETH10 registries — declared non-claims, in the honest register.
§ 5 Breadth
Theorems most stacks cannot state.
The flagship is one theorem. The claim behind it is a capability: because contracts, compiler, and chain semantics are one mathematical object, statements that fall outside other tools’ vocabularies are ordinary here. Six kinds, each with a landed instance you can open.
No premise about the borrower
fmint_flashLoan_settles: a funded, non-static flashLoan frame ends in success, a deliberate revert, or the non-consensus fault channel — never a consensus exceptional halt — with the borrower’s code universally quantified. Possible because Jaune’s interpreter is total: the callee’s execution comes from totality, not from an assumption about the callee.
Reverts, constructed exactly
Not “no success exists” but this call reverts, with this error, and no data: unknown-selector and guard executions built instruction by instruction to .error (.revert, _) with empty returndata. Every Blanc rev site is PUSH0 PUSH0 REVERT — a discipline a fixture falsifier table shows is observably distinct from the three failure shapes it replaced.
The gas cost is a theorem
fmint.totalSupply() costs 2,218 gas — exactly, as a proved equation, not a profiler’s estimate. WETH’s balanceOf: 2,260 cold, with the 19-gas nonpayable guard visible in the statement. WETH10’s required views carry exact cold/warm gas uniformly over deployment parameters. Closed forms and maxima ship as lemmas beside the code.
Creation, through the real pipeline
WETH10’s deployment root is derived, not axiomatized: from one successful strict singleton type-2 creation block through Jaune’s configured Prague transition, the proof reconstructs receipt success, exact installed runtime, empty storage, and the crossed request-system calls — establishing the DeploymentRoot the flagship stands on, with the creation message’s 1,264,071-gas cost as a closed form.
Invariants that survive hard forks
WETH solvency and FMINT conservation are preserved over every state reachable along a valid configured chain — induction over whole blocks, withdrawals and system operations included, across scheduled fork activations from Prague through BPO2. A protocol upgrade is a step in the induction, not a threat to the claim.
Calls that provably succeed
Safety’s neglected dual: constructed successful executions. weth_balanceOf_succeeds and its family build the run witness instruction by instruction; the flagship’s enabledness fields do it for redemption at message and transaction altitude. “The contract cannot lose your money” is only half a promise — “and it will actually give it back” is the other half.
Each panel names its theorem; the statements — with their premises, which are part of the claim — are the authority. Where a family is partial correctness, the repository says so in the module docstring; where nothing says a call succeeds, no page of prose may imply one does.
§ 6 Candour
The price, unvarnished.
Everything above is bought, not free, and the bill is itemisable. Blanc is a steep ask and not for everyone — the pitch is not that the price is small, but that what it buys is not sold elsewhere.
-
Solidity, Vyper, and their ecosystems no familiar syntax, no IDE plugins, no framework integration, no OpenZeppelin to import, no auditor fluent in your source languagegone
-
Batteries not included: the standard library is what three contracts have needed so far — what your contract needs beyond it, you write, and then you provenot included
-
Distance from the machine Blanc code is EVM instructions with four combinators; you think about the stack, storage words, and gas — the language will not think about them for youby design
-
Proof effort that rounds to zero the theorems above took ~149,000 lines of Lean for three contracts; interactive proof is real engineering, even with the shared ladder doing the heavy liftingreal cost
-
Verification of contracts already deployed out of scope by design: the theorems are about Blanc’s artifact — verifying the original at its address is a different project, worth doing, and not this oneexcluded
Who should not use Blanc: teams iterating on product-market fit, systems built around upgradeable proxies and vendored library ecosystems, and anyone whose assurance story must be legible to today’s audit market. Who plausibly should: contracts whose invariants are worth more than their development cost — bridges, wrappers, vaults, anything whose one job is to never lose the books. For that class, the next section is the part of the bill that changed.
§ 7 The bill, revised
What agents change — with receipts.
The traditional objection to interactive verification is not doubt about the theorems; it is the invoice — expert-months per contract. That number was measured this month, on this repository, and it is no longer what people remember it being.
- target
- drop-in WETH10: 27 selectors + receive, flash loans, ERC-677-style callbacks, EIP-2612 permit
- start
- 2026-08-08, 02:53 — not one opcode of contract code written
- close
- 2026-08-09, 00:00 — implementation, functional theorem families for every endpoint, deployment proof, differential suite: 21 h 07 m wall clock2
- crew
- one developer, one laptop, an agent in the loop
- estimate
- the planning forecast said 10–15 days; it was wrong by an order of magnitude, in the buyer’s favour
One goal from that charter did not land, and the ledger says so: a settlement theorem carried over from the previous contract turned out to be false of WETH10’s design. It was struck by explicit amendment, with no replacement installed and nothing nearby relabeled to fill the row. Striking a false goal is the system working — a project that never records a lost bet is not reporting, it is advertising.
Agent-written proofs are exactly as trustworthy as human-written ones, because the trust never lived in the author: every proof, whoever wrote it, is checked by Lean’s kernel, and every audited theorem’s axiom closure is pinned in CI. The gates are built to be hostile to wishful reporting — falsifiers that must fail, shrink-only budgets, coverage that refuses credit for a selector merely embedded in bytes. What agents changed is the cost of producing proofs, not the standard for believing them.
The human stayed where judgment lives: adjudicating conformance questions, striking the false goal, deciding what a port owes its users. The agent did the part that scales.
Fig. 2 — the fast half of the gate battery, verbatim (2026-08-12). The full ordered set — layering, trust surface, reference lock, differential, redemption, deployment, axiom audit, statement pins, elaboration budget, fixtures, coverage — is catalogued with scales and pass criteria in scripts/GATES.md.
An honest velocity claim needs an honest denominator: 21 hours bought WETH10’s charter — implementation, endpoint theorems, deployment, differential evidence. The flagship of § 4 was a successor program, landed over the following three days by the same method. The unit economics — days per verified contract, tokens in dollars — are the differentiator this project intends to keep publishing, run by run.
§ 8 Position
The penultimate form.
“…the assembly + Lean paradigm is the final form of software development.”
— Yoichi Hirai, The Final Form of Software Development (2026) — AI agents writing machine-level code, proved correct in Lean; cited in Vitalik Buterin’s A shallow dive into formal verification
Blanc agrees with the direction — and adds one amendment from practice.
High-level languages exist to protect humans from machine-level detail, at the price of compilers, runtimes, and semantic distance between source and chain. If proofs — not familiarity — carry the assurance, and agents — not humans — carry the tedium, most of that protection is overhead. Hirai’s conclusion follows: write the machine’s own code, prove it in Lean, let agents do both. Everything on this page is downstream of taking that seriously.
Modern agents are extraordinary; they are not all-powerful, and neither are the humans auditing what they produce. A tiny amount of structure over raw bytecode — Blanc’s is four constructors, at the cost of computed jumps — is disproportionately cheap leverage: control flow becomes a tree proofs can walk, the compiler becomes a theorem proved once and inherited by every contract, and a reusable proof ladder becomes possible at all. Keep the canvas blank; rule four faint lines on it.
If machine code written and proved by machines is the final form of software development, Blanc is a considered bid for the penultimate one — and for contracts holding other people’s money, the penultimate form may be the right place to stop.
§ 9 Who this is for
Three ways in.
Teams with an invariant worth a proof
You maintain a wrapper, a vault, a bridge component — something whose entire job is a property you can say in one sentence. Blanc’s worked examples are exactly that shape. Bring the sentence; the ladder from “compiled bytes” to “every reachable chain state” is already built, and § 7 is what it costs now.
then: Blanc/Weth10FutureRedeemable.lean — the flagship, end to end
Proof engineers & PL researchers
A live laboratory for proof-cost economics: which abstractions let the fourth contract cost less than the third, where callback-crossing machinery generalises, what a dispatcher-combinator layer owes its clients. ~149,000 lines of worked answers, with the open questions in the goal ledgers.
then: Blanc/Ladder.lean · Blanc/Forward.lean — the reusable spine
Auditors & professional skeptics
This project keeps a register you can attack: deviation rows with stances, counted verification debts, falsifier tables, and a standing wager that invites you to produce a specification the port should satisfy. If you find silence where a row should be, that is a defect by the project’s own rules — file it.
then: scripts/GATES.md — every gate, scale, and pass criterion
§ 10 Reproduce it
One clone, a build, and the audit.
The only prerequisite is elan, the Lean toolchain manager. Blanc pins Jaune by immutable commit in its lakefile, so a fresh clone builds reproducibly with no sibling checkout — and “which semantics was this proved against” has a one-line answer.
Check the proofs
no fixtures required — this side is proof, not testingcheck.sh audits all 426 theorems against their pinned axiom sets — failing on an extra or missing axiom, on sorryAx, and on any native_decide-style escape. check-claims.sh then Lean-checks the exact statements of the WETH10 flagship set and protected Lido Registry boundaries, so a weakened conclusion fails as loudly as a broken proof. Both projects open with lake exe cache get; skipping it means compiling mathlib from source — hours instead of minutes.
Read it in order
the shortest honest path through the claims- the behavior
- WETH10_COMPATIBILITY.md — “right”, written down: the frozen boundary, row by row
- the rules
- PORTING.md — what a port claims, the wager, the deviation discipline
- the map
- README.md — every module, every theorem family, the assurance boundary
- the gates
- scripts/GATES.md — each gate’s command, scale, runtime, and pass criterion
- the flagship
- Blanc/Weth10FutureRedeemable.lean — read the statement, then its docstring’s scope notes
- the semantics
- Jaune — the machine under all of it, with its own evidence page
- “Fully proved” means, precisely: the compiler carries a machine-checked correctness theorem connecting compiled bytes to source semantics, and every contract property claimed on this page is a Lean theorem whose exact axiom closure is pinned in CI. It does not mean every true property of every contract has been proved — § 1’s claim-discipline governs, and declared non-claims are listed in each contract’s registry.
- Timeline per the committed goal ledger (realistic-lender-v1): opened 2026-08-08 02:53 KST, closed 2026-08-09 00:00 KST — 76,049 s elapsed; 13 of its 14 requirement rows satisfied, with the carried-over settlement flagship struck by explicit amendment as false of the target and left unreplaced. The deployed-reference lock (no contract code) landed the evening before. The flagship theorem of § 4 and its corollaries landed 2026-08-10 through 2026-08-12 as successor goals.
- Blanc was previously presented as Jaune’s case study; it is now a sibling project with its own charter. Jaune remains the semantics every Blanc theorem is stated over, pinned by immutable commit — see the Jaune page for its conformance evidence.
- Every figure on this page is drawn from a committed report, registry, gate summary, or theorem in the repository; the snapshot is current as of 2026-08-13. Gate lines shown are verbatim output — Fig. 1 from a 2026-08-13 run, Fig. 2 from 2026-08-12 — except that one long line is wrapped and ellipses mark elision; the differential line continues “… 7 state-mutating reentrancy rows, 26 STATICCALL-context rows, 69 oracle calls traced, 8 channel falsifiers live.”
- Spelled out, because the boundary rewards precision: when a Blanc contract reimplements WETH9 or WETH10, the deployed original is the reference, never the subject — nothing on this page proves anything about the contract at the reference address. And byte-identity is a non-goal permanently, not merely so far: a compiler that chases another compiler’s bytes inherits its dispatcher, its stack discipline, and its bugs, and can justify nothing beyond “same as before.” The standing statement of what a port claims and never claims is PORTING.md.