Skip to content

RFP-023: Native Gas Token Bridge for LEZ - #169

Draft
fryorcraken wants to merge 67 commits into
rfp-021-wrapped-erc20from
rfp-023-gas-token-bridge
Draft

RFP-023: Native Gas Token Bridge for LEZ#169
fryorcraken wants to merge 67 commits into
rfp-021-wrapped-erc20from
rfp-023-gas-token-bridge

Conversation

@fryorcraken

Copy link
Copy Markdown
Collaborator

Extracted from #158 so the gas token bridge can be reviewed on its own.

Base branch is rfp-021-wrapped-erc20, not master. RFP-023 depends on
RFP-021 (the attestation primitive it consumes) and RFP-022 (the vault, mint,
registry, caps and privacy construction it inverts), and links to both plus
appendix/bridges-and-wrapped-tokens.md. Stacking on #158 keeps every
cross-reference resolvable. Retarget to master once #158 lands, or say the
word and I will.

What it delivers

Every other LEZ application RFP assumes the user already holds gas: RFP-004,
008, and 012 through 017 all fund gas by atomic deshield from the user's own
shielded balance, precisely so no external funding source links the ephemeral
account to an identity. That pattern presupposes funds already on LEZ and says
nothing about how they got there. Nothing in the repo addressed the user who
holds nothing yet.

This inverts RFP-022: the LEZ program is the vault holding native gas token, the
Ethereum contract is the minter. Supply is demand-driven, so there is no float
to seed and no incentive mechanism to design; the ERC-20 has no privileged
minter and no pre-issued supply, which is exactly the Meter Passport failure
mode documented in the bridge appendix.

The one genuinely new problem is releasing gas to someone who has none. An
off-chain paymaster is the third deployment component: it sponsors a request iff
that request carries a valid attestation of a burn of its own deployment's
ERC-20, not already sponsored, so eligibility is a property of the proof and
never of the requester. Reachable over Logos Delivery and over Tor, either alone
sufficient, because Delivery's RLN spam protection may itself require LEZ gas
and a Delivery-only deployment would reintroduce the circularity. It must not
observe requester IP addresses by construction, since this is the one point
where the user has no choice but to talk to somebody.

Contents

No appendix content moved: appendix/bridges-and-wrapped-tokens.md was written
to support RFP-022 and is cited by all three RFPs, so it stays in #158. RFP-023
cites it for the Meter Passport native-gas-token mint, the one documented
cross-chain hack specifically about wrapping a gas token.

Review notes

  • fryorcraken/lez-proof-vault is cited as prior art only. That repo implements
    no paymaster and warns its own gasless pattern is not a valid example; what it
    contributes is the reserve-before-verify griefing problem, which this RFP
    requires a defence against.
  • FURPS items state conditions, not test instructions. Supportability already
    requires coverage, so the adversarial cases appear as conditions the
    requirement demands rather than as per-item test directions.

🤖 Generated with Claude Code

jzaki and others added 30 commits August 17, 2026 15:18
Project style avoids em-dashes and punctuation hyphens in prose; replace
the ones in body text with commas, colons, or parentheses depending on
the clause (title-line and Resources-list separators are an unrelated
repo-wide convention and are left as-is). Also drop the bare "Crucially,"
opener in the Overview, which asserts importance without adding
information. Reformatted with mdformat per repo convention.
The Overview stated verification "rests on RISC0 zero-knowledge proofs
of consensus and state, verified in-program on LEZ and via a native
precompile on Ethereum." This RFP should specify the required outcome
(trustless cryptographic verification) and not dictate the specific
proof system or verification mechanism teams must use to achieve it.
Both references to RFP-003 described atomic swaps as a "trustless path"
or "bridging" mechanism parallel to wrapping, which is inaccurate: atomic
swaps trade assets directly and never mint a wrapped representation on
LEZ. Rephrase both mentions (Why This Matters, Out of Scope) to describe
atomic swaps as the liquidity route for BTC/XMR/ZEC, distinct in kind
from the wrapped-token primitive this RFP defines for ETH/ERC-20.
Addresses review comment https://github.com/logos-co/rfp/pull/158/changes#r3733249831.
The previous text quoted RFP-003's unexplained claim that wrapping "is a
much simpler construction" without saying why. State the real reasons
directly: atomic swaps require an online counterparty, so wrapping is
non-interactive; wrapping needs no added infrastructure (counterparty
matching); and wrapping produces a genuine LEZ-native token, not just a
trade, which is what lets it be composed with AMMs, lending markets, and
other DeFi programs.
The opening claimed LEZ DeFi "cannot function" without external
collateral and called this RFP a "missing primitive", an overstated
framing led by a list of dependent RFPs rather than by why the bridge is
needed. Replace with the actual motivation: LEZ's separated public/private
state architecture and programmability make private DeFi possible, and
bringing in assets from non-private chains like Ethereum has to preserve
Logos' sovereignty principle, no custodian, signer, or federation trusted
along the way. The dependent-RFP list and the wrapping-vs-swaps
comparison remain as supporting detail underneath that framing.
The paragraph was structured around what other RFPs "assume" and "don't
specify", an indirect, gatekeeping way to make the point. State it
directly instead: wrapped tokens are what let users bring Ethereum
assets into LEZ's private DeFi, and list the RFPs that DeFi comprises
(DEX, lending, stablecoin, and the price feeds that collateralise them),
this RFP is the wrapping primitive that feeds all of them.
Make explicit that wrapped tokens bring not just the asset but its
already-established market value into LEZ DeFi, usable directly or
posted as collateral, since that value transfer is the actual point of
wrapping rather than just moving a token between chains.
Replace "A transparent bridge would deanonymise the whole chain" with a
section that states the actual expectation: the applicant must consider
and document a strategy for reducing linkability between Ethereum and
LEZ events, and where a specific form of linkability can't be avoided,
document why and what residual correlation remains. The prior framing
asserted unlinkability as a hard requirement "of the same standing as
solvency", which overstates what a bridge touching a public chain can
actually guarantee. Soften the matching Overview paragraph to the same
effect so the two sections don't contradict each other.
P1 and P2 previously claimed the adversary "cannot determine" the true
pairing at all, contradicted a few paragraphs later by "What cannot be
hidden", which correctly states that amount and timing are visible on
Ethereum and do correlate. The Privacy Preservation hard requirements
inherited the same overstatement ("no correlation... better than
chance"). Narrow the hard requirement to what the bridge can actually
guarantee: no information other than amount, token, and timing may link
an Ethereum event to its LEZ counterpart. Update the P1/P2 definitions
and their test requirements to match, and cross-reference the amount
mitigation already specified (fixed denominations, Soft Requirement 1).
The passage claimed LEZ "has no path" to bring stablecoin liquidity
onto the chain without a wrapped ERC-20 primitive, and that this blocks
downstream protocols. This overstates it: a healthy DeFi ecosystem
draws on native LEZ assets, wrapped assets, and synthetics together, and
wrapping is one strategy among those we want to see implemented, not
the exclusive route. Keep the concrete stablecoin market data as the
reason wrapping is a worthwhile target, without implying it's the only
way collateral reaches the lending protocol and reflexive stablecoin.
The stated "$2.8B stolen since 2022" is not a real Chainalysis figure.
The correct, sourced number is over $2B stolen from cross-chain bridges
in 2022 alone (64% of that year's DeFi losses), per Chainalysis's 2022
report. Research into the largest bridge hacks (Ronin, Harmony Horizon,
Multichain, Wormhole, Nomad, BNB Bridge, Poly Network) shows key-custody
compromise explains roughly half of historical losses by value, and bugs
in verification logic explain a comparable share, a risk a cryptographic
design does not remove on its own. Broaden the rationale accordingly:
state the RFP's cryptographic design targets key-custody compromise
specifically, call out verification-logic correctness as an equally
important risk, and note that an upgradeable verifier contract
reintroduces the same key-custody problem via its upgrade key, hence a
preference for an immutable program with an explicit migration path.
The two sections stated the same three problems (destination-hiding,
amount-correlation, fee-payer-correlation) twice: once as bare problem
statements, then again a section later paired with their mitigations.
Merge them so each problem and its mitigation appear together, removing
the duplicated problem statements.

Also add a Bridge Security hard requirement: the verifier (LEZ bridge
program and Ethereum vault verification logic) must be deployed as an
immutable program with an explicit migration path, not an upgradeable
contract. An upgrade key that can silently replace verification logic
is a key-custody attack surface of the same kind the RFP's cryptographic
design otherwise eliminates. Link the (forthcoming) bridge hack
taxonomy appendix from the three places that previously cited the
Chainalysis figure inline, including one that still had the incorrect
$2.8B number from before that figure was corrected.
The freeze authority can halt new activity but cannot recover funds
already at risk or resolve deposits and burns left in-flight if a bug
is found in deployed verification logic. Add a Bridge Security hard
requirement: proposals must specify a failsafe strategy for this
scenario, constrained so it cannot become a backdoor. Recovery must
still go through the depositor or burner proving their own entitlement
(the same mechanism as an ordinary claim or redemption), not an admin
authority identifying and redirecting funds on a user's behalf, must
only release funds to the address or account the proof specifies, and
must not reach funds beyond what a specific, proven vulnerability put
at risk. If no such mechanism is achievable, the proposal must instead
document why a failsafe should not be implemented and what happens to
affected positions in its absence.
"Stablecoins are the concrete prize" contained an unrelated paragraph
about bridge-hack history and this RFP's security posture against it.
Give that content its own subsection so each heading matches what it
actually discusses.
"Bridges are the most attacked category of infrastructure in DeFi" read
as an assertion rather than a heading. Rename to "Bridge risks: hacking"
to match the plainer, descriptive heading style used elsewhere.
…tion

Both sections opened by restating the same premise (amount and timing
are public on Ethereum by construction) before diverging into distinct
content: the formal P1/P2 definitions, and the concrete facts plus
mitigations. Merge into one section that states the public facts first,
then builds the precise P1/P2 requirement on top of them, removing the
duplicated framing and the two-section back-reference.
…very

"Recover their full bridge position" conflated two different things.
Redemption is not stateful in that sense: once minted, a wrapped token
is an ordinary LEZ token, and whoever holds it, whether from their own
deposit or bought later on an AMM, can burn it to claim the underlying
Ethereum asset. The only genuinely stateful recovery need is narrower:
a user's own unclaimed deposits and unreleased burns, recoverable from
credentials they already hold. Restate Design Rationale's "Loss of
access" and Functionality #10 to reflect this distinction instead of
implying redemption depends on the original depositor's credentials.
Compress the four-paragraph lead-in and P1/P2 definitions into a
tighter statement of the same content: the two public facts folded
into one sentence, the hard requirement stated once, and P1/P2 trimmed
to their essential claim. No requirement dropped, just restated more
directly.
Sources RFP-021's claims about bridge-hack history and stablecoin
market size: a summary table and per-hack detail for 11 major bridge
exploits with root-cause classification, a dedicated section on
whether any bridge hack has involved a stolen upgrade key, a root-cause
dollar breakdown, an analysis of the two distinct Chainalysis reports
commonly conflated into a single "$2B / 64%" citation, and a stablecoin
market-size section verifying the "over 80%" USDT+USDC share and
"above $300B" total market cap figures.
The appendix's research (now committed at
appendix/bridge-hack-taxonomy.md) surfaced three overstatements in the
RFP body: the "$2B / 64%" figure paired two different Chainalysis
reports measuring different populations over different time windows;
"roughly half... comparable share" implied an even key-custody vs.
verification-bug split that doesn't hold cleanly in dollar terms and by
some reasonable accounting favours verification bugs; and the
upgrade-key paragraph implied bridge hacks from stolen upgrade keys are
a documented pattern, when in fact no such case was found, the real
documented bridge risk from mutable verifiers is a legitimate upgrade
shipping a bug (Nomad, Ronin 2024). Correct the Why This Matters
paragraph and Bridge Security requirement #8 to state what the
appendix actually supports, without weakening the underlying design
conclusion (prefer an immutable program with a migration path), which
still holds either way.
The appendix now covers both the bridge-hack survey and the stablecoin
market-size sourcing, so the filename and title should reflect the
broader scope rather than only the (larger) bridge-hack section. Update
the appendix's title and opening paragraph, and all three links to it
from RFP-021's body.
…nale

The paragraph described a specific implementation (commitment-and-
nullifier shielded pool, minting into private LEZ state, permissionless
proof anchoring) despite being framed as "orientation, not prescription".
This RFP specifies outcomes and required properties, not implementations;
proposals choose their own construction. The underlying requirements this
paragraph gestured at are already stated as hard requirements elsewhere
(Functionality #4 for private-state minting, the P1/P2 properties above
for destination-hiding), so nothing is lost by removing the suggested
implementation.
"Loss of access" only described the deposit-to-mint window; state the
symmetric burn-to-release window explicitly too, matching Functionality
#10's existing scope (unclaimed deposits and unreleased burns). State
recovery more concretely: a user must recover from their existing wallet
seed alone, with no other information. Express a design preference for
constructions where the needed claim/entitlement data can be regenerated
from on-chain events or state via the user's own keys, over designs that
generate an ad hoc secret at deposit or burn time with no on-chain
trace, since the latter is unrecoverable the moment that secret is lost
however it was backed up.
"Trusted for liveness only: able to decline service" implicitly accepted
a design where some off-chain party's cooperation is needed at all,
which conflicts with the non-interactive protocol this RFP requires (see
Why This Matters: a deposit "does not need a counterparty to be online").
Restate the requirement: the protocol should not depend on any specific
off-chain participant, and where one is unavoidable (relaying, proving),
that role must be permissionless so a single participant declining never
blocks the user, generalising the permissionless-relayer pattern already
used for the fee-payer mitigation above.
fryorcraken and others added 23 commits August 17, 2026 15:19
Stating that the vault must measure its own balance increase rather
than trust the claimed deposit amount is basic smart-contract hygiene,
not something this RFP needs to spell out as a requirement; it only
made the sentence longer without adding information. The specific,
non-obvious case that does need stating, fee-on-transfer and rebasing
tokens breaking this assumption, remains in "Token registry and decimal
normalisation".
RISC0 is a genuine, unavoidable dependency on the LEZ side, since LEZ
itself runs on RISC0, so LEZ-side proving requirements correctly keep
mentioning it. But several places also mandated RISC0-specific
constructions (a Groth16 precompile, "this RFP specifies RISC0... not a
candidate for alternative proof systems") for the Ethereum-side
verification, which is a design choice this RFP has no reason to
dictate. Generalize Functionality #3 and #8, Usability #4, the Out of
Scope RISC0 bullets, and Platform Dependencies' "RISC0 zkVM" section to
state the LEZ-side dependency as fact while leaving the Ethereum-side
proof system to the proposal.

RFP-021: support public and private LEZ accounts for both mint and burn

Functionality #4 and #7 previously mandated private-state-only minting
and burning. Change this to a choice: both flows must support a private
or a public LEZ account as the destination/source, at the user's
choice, rather than forcing private accounts exclusively. Add a new
Usability requirement that the mini-app and CLI default to inviting the
user toward the private path (pre-selected, public path needs an
explicit action), consistent with the existing Privacy Preservation
"default configuration must be private" requirement. Update the
Platform Dependencies "Private LEZ account state" section to match.

RFP-021: require deposits and burns to secretly commit to their destination

Add a new Bridge Security hard requirement: a deposit and a burn must
each secretly commit to the destination on the other chain, so a claim
can only be completed by whoever holds the originating seed, and no
information beyond that seed, however it leaks, from the transaction
itself, public state, or any party in the flow, can let someone else
construct a valid claim. This closes a gap the earlier destination-
hiding requirements (Functionality #2, #6) didn't fully cover: hiding a
destination from observers is not the same as cryptographically binding
the claim to it.
Three cleanups to Functionality:

- Removed "the design must not restrict minting/burning to private
  accounts only" from #4 and #6 (old #4/#7). These clauses only made
  sense as a diff against the previous private-only wording; stated on
  their own they're confusing, since nothing established a private-only
  restriction to argue against.
- Removed the old #5 (repeat-claim rejection) entirely, per direction.
- Removed "where a burn involves a private account, the burn must not
  thereby reveal its Ethereum destination" from burn support (old #7):
  redundant with the destination-hiding requirement on the burn path
  itself (now #5), and wrongly implied that requirement only applies
  when burning from a private account, when it applies to every burn.

Renumbered Functionality #5 through #18 down to #4 through #17
accordingly, and fixed all eight downstream cross-references across
Bridge Security, Soft Requirements, and Platform Dependencies.
Add Soft Requirement 8: an ERC-20 on Ethereum representing a Logos
zone's native gas token, where minting it is actually a release of gas
token already escrowed on the LEZ side, the inverse of this RFP's
primary deposit/mint flow. The goal is letting a user with no existing
holdings on the zone acquire gas via the bridge, so they are never
blocked from their first transaction. Since this direction has no
external market minting new supply on Ethereum (unlike a wrapped
external asset), require proposals to either treat it symmetrically to
the primary flow and document how the Ethereum-side escrow is funded
and replenished, or document why it isn't achievable and what
alternative bootstrapping mechanism would be needed instead.
Functionality:
- Simplify #7 (Ethereum release): drop the redundant "if the original
  deposit was ETH" clause and "each burn may be redeemed at most once"
  restatement.
- Delete the old #9 (funded-account / relayer-learns-nothing item);
  its substance is now folded into Bridge Security.
- #11 (registry): replace the sync/divergence language with a plain
  documentation requirement covering registration changes and delisting.
- #14 (fee): "can be charged" instead of "is charged", drop the
  redundant "no fee mandated on Ethereum" sentence, note the admin can
  set either fee to zero.
- #15/#16 (chain ID, multi-config): rewrite around a precise
  program-refers-to-contract-refers-to-zone model instead of vague
  "vault contract... Ethereum mainnet" language that didn't fit the
  LEZ side and ignored testnets. #16 now allows "same or different
  pairs" of blockchain programs.

Usability:
- #1 rewritten around a Logos core module used by multiple Logos ui
  modules, rather than an SDK.
- #2 (mini-app) trimmed to drop build/deployment detail that belongs
  in Supportability.
- CLI item removed from Usability (moved conceptually to Supportability
  doc-packet requirements).
- New #5: the three privacy correlation mitigations (amount, timing,
  fee payer) must be enabled by default, with a leak indicator and
  recommended parameters, replacing the narrower anonymity-set-warning
  item.

Supportability:
- Testnet wording corrected (LEZ testnet, not devnet/testnet).
- Doc packet items reference "the core module" instead of "the SDK".
- New deployer doc-packet item, matching the pattern of the SDK and
  CLI doc-packet items, covering how an entity stands up its own
  configured deployment.
- Figma-designs item removed.
- Audit item simplified to "the audit report must be published",
  dropping the Chainalysis justification aside.
- New item requiring the Logos Ethereum core module (with verified
  proxy features), RPC/target switching in the UI, the Lambda Prize
  wallet SDK, RFP-001/002 outputs for admin and freeze authorities,
  compatibility with the existing LEZ token program and ATA derivation,
  catalog publication, and standard Logos GitHub Actions.

Bridge Security:
- Removed the standalone "off-chain component must independently
  derive chain state" item.
- Merged the claim-theft-resistance requirement into the malicious-
  relayer item, since they covered overlapping ground.

Platform Dependencies:
- Trimmed the LP-0013, "Private LEZ account state", and "RISC0 zkVM"
  subsections to their core dependency statements.
- Moved "Event emission (LP-0012)" from Soft to Hard dependencies,
  removing the now-empty "Soft dependencies" heading.

Out of Scope: removed the BTC/XMR/ZEC, mobile/in-browser proving, and
price-feed bullets (now covered elsewhere or no longer needed as
exclusions).

Renumbered Functionality, Bridge Security, and their downstream
cross-references throughout to stay sequential and accurate.
Avoids collision with the numbered items (1., 2., ...) in the FURPS
Privacy Preservation requirements list, where "1. P1 must hold under
test" read as if P1 meant that item's own number.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
PP1/PP2 read as "Privacy Preservation 1/2", colliding with the section
name itself, on top of already colliding with that section's own item
numbering. Instead of any invented label, the inbound/outbound
unlinkability properties are now defined directly as Privacy
Preservation items #1 and #2, and every other reference cites them
the same way the doc already cites other FURPS items elsewhere
(Functionality #2, #5, Supportability #9, etc).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Credit Cryptarchia and Blend alongside LEZ architecture
- Note wrapped Bitcoin and synthetics as other strategies under consideration
- Require the UI to encourage a submission delay
- Drop the "not the only deployment model" hedge; the RFP does mandate admin curation
- Remove fee-on-transfer/rebasing rejection as an implementation choice
- Drop the RFP-017 comparison and "in the manner of RFP-004" cross-reads
- Add Design Rationale: One program pair = one chain pair
- Add admin UI to Usability #2
- Move proof-system maturity and CI-green to Reliability
- Split Supportability #11 into separate criteria; move dependencies to
  Platform Dependencies (Logos Ethereum core module, wallet SDK, ATA/token program)
- Correct LP-0013 title and mark it closed; drop the redundant private-account
  dependency section
- Soften Soft Requirement #1 phrasing; drop the batching privacy claim and the
  shared-anonymity-set question; freeze -> admin authority on the release delay
- Rewrite gas-token bootstrapping for clarity

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
A proposal may commit to researching the gas-token leg and reporting findings
rather than implementing it.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Extract the Ethereum consensus and state verification that RFP-021's mint
path needs into its own RFP, so the primitive is built and audited once and
shared with the other LEZ programs that need to read Ethereum state.

The attestation establishes finality (sync-committee signatures over a
light-client finality update), inclusion (Merkle-Patricia proof under the
finalised header), and a predicate over the verified state, then emits a
verified statement with no application action attached. Uniqueness stays with
the consumer, keyed on a statement identifier the primitive supplies.

RFP-021 now depends on RFP-022 for the inbound leg; the outbound leg
(verifying a LEZ burn natively on Ethereum) stays in RFP-021.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
RFP-021 carried gas-token bootstrapping as a soft requirement asking only for
research. Deliver it properly as its own RFP: the LEZ program is the vault
holding native gas token, the Ethereum contract is the minter, and the two
directions mirror RFP-021 with the chains swapped.

This closes a gap in the corpus. RFP-004, 008, 012 through 017 all fund gas by
atomic deshield from the user's own shielded balance, precisely so no external
funding source links the ephemeral account to an identity. That pattern
presupposes the user already has funds on LEZ and says nothing about how they
got there. RFP-023 is the trustless entry path for a user holding nothing.

Supply is demand-driven: the ERC-20 is minted against proof of a lock in the
LEZ vault and burned to release from it, so there is no float to seed and no
incentive mechanism to design. The invariant that makes this sound is that the
ERC-20 has no privileged minter and no pre-issued supply, which is exactly the
Meter Passport failure mode already documented in the appendix.

Privacy mirrors RFP-021 in full: each leg of each bridge has one public
endpoint and it is the Ethereum one in every case.

The one genuinely new problem is releasing native gas to a recipient who has
none. Hard requirement that this must work for a zero-balance account with no
required off-chain counterparty; mechanism left to the proposal.

RFP-021 Soft Requirement #8 becomes a pointer to RFP-023. RFP-022 gains it as
a third consumer of the attestation primitive.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The release path previously said "must work for a zero-balance recipient" and
left the mechanism open. Specify it: an off-chain paymaster is the third
component of a deployment, alongside the LEZ vault and the EVM mint/burn
contract with its dedicated ERC-20.

Eligibility is a property of the proof, never of the requester. The paymaster
sponsors a request iff it carries a valid attestation of a burn of its own
deployment's ERC-20, above a configured minimum, not already sponsored. The
nullifier that exists for double-spend protection doubles as the anti-abuse
budget, so abusing the paymaster costs what acquiring and burning real ERC-20
costs. No account, allowlist, or registration.

Reachable over Logos Delivery and over Tor, either alone sufficient. Tor is
required rather than a nicety: Delivery's RLN spam protection may itself need
LEZ gas, which the user by definition lacks, so a Delivery-only deployment
could reintroduce the circularity this component exists to break.

The paymaster must not observe requester IP addresses, by construction rather
than by logging policy. This is the point where the user has no choice but to
talk to somebody, so it is where the unlinkability of the whole design is most
easily lost.

Also require a defence against griefing. lez-proof-vault documents that fee
reservation precedes execution and failed transactions are still charged, so a
paymaster committing to pay before verifying can be drained by well-formed
garbage. Mechanism is the proposal's choice; the cost bound must be measured.

Narrows the network-anonymity out-of-scope bullet, which contradicted the new
Tor and IP requirements.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Supportability already requires every hard requirement in Functionality,
Usability, Reliability, Performance and Privacy Preservation to have at least
one corresponding test. Restating that inside individual FURPS items as
"Provide a test asserting..." was redundant.

Where a clause named specific adversarial cases (tampered headers, mint-twice
from one deposit, minting via an admin path, flooding the paymaster with
ineligible requests), those cases are kept but phrased as conditions the
requirement demands rather than as test instructions, so nothing is lost from
the spec and the coverage obligation flows from Supportability as intended.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The requirement said the verifier "must be deployed as an immutable program ...
in preference to an upgradeable contract governed by a mutable key". That is
EVM proxy language mixed with Solana upgrade-authority language, and neither
describes LEZ.

LEZ has no upgradeability at all. A ProgramId is the RISC0 image ID computed
from the bytecode, the deployed-program registry is append-only, redeploying
identical bytecode is rejected, and a deployment transaction carries no
authority or deployer identity. Changing one byte yields a different program,
not a new version of the same one. So "deploy as immutable rather than
upgradeable" was not a choice a proposal could make on the LEZ side, and the
stolen-upgrade-key attack cannot arise there.

What can arise is indirection. ChainedCall takes a ProgramId as an ordinary
runtime field, and a program may hold one in its own account state, so an
immutable bridge could still point at swappable verification logic. Whoever
controls that pointer can repoint it at a verifier that accepts anything, which
is the same fund-stealing capability relocated from the code to the pointer.

The requirement now addresses the pointer on LEZ and the upgrade path on
Ethereum, since only the Ethereum half has a genuine upgradeability question.
RFP-022 additionally notes that its consumers inherit the same discipline,
because they reference the module by image ID.

Verified against logos-execution-zone: lee/state_machine/src/program/mod.rs
(image ID derivation), validated_state_diff/mod.rs (append-only registry,
ChainedCall dispatch), program_deployment_transaction/message.rs (bytecode
only, unsigned).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The requirement is one sentence and had grown into twenty lines of platform
background, plus two rationale paragraphs explaining LEZ program identity and
ChainedCall indirection. None of it changed what an applicant builds.

Requirements now read "The verification logic cannot be swapped", followed only
by the two chain-specific bans that are the actual testable content.

The rationale states plainly that mutable verification logic is unwanted and
attributes the two risks correctly: whoever can change it can point the bridge
at a verifier that accepts anything, which has no documented cross-chain bridge
example, and an upgrade made in good faith can ship a catastrophic bug, which
caused Nomad (~$190M) and nearly caused a second Ronin incident in 2024 ($12M,
returned). Both figures and the no-stolen-upgrade-key finding are as sourced in
the appendix.

Also removes "which fixed verification logic forecloses by construction", which
was ambiguous about what forecloses what.

Net -45 lines.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The wrapped ERC-20 and Ether bridge becomes RFP-022 and the Ethereum state
attestation primitive becomes RFP-021, so the shared primitive carries the
lower number and its consumers follow it.

Renames both files and swaps every ID, title, link and cross-reference across
the three RFPs, the README table, the proposal dropdown and the bridges
appendix. README and dropdown rows reordered to stay numeric.

Also fixes references broken by the section restructure in the bridge RFP:

- Privacy Preservation #8 -> #7 (an item was removed)
- Supportability #8 (audit) -> Security #1, following the move to the new
  Security section
- Supportability #9 (privacy properties document) was deleted, so the
  out-of-scope note now points at Privacy Preservation #6, which carries the
  surviving disclosure obligation
- Soft Requirement #3 -> #2 (viewing keys, after deletions)
- Soft Requirement #4's "as per F TODO" resolved to Security #8, the rule that
  verification logic cannot be swapped

RFP-023's references into the bridge RFP updated for the same restructure:
Bridge Security #8 -> Security #9, Bridge Security #7 -> Security #8, and the
privacy-properties reference made self-contained since its target no longer
exists.

Minor: stray double space, a stray indent in a doc-packet item, and reflow of
the newly added unwrapped lines.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
FURPS items state the condition to be met; Supportability already
requires a test for every hard requirement, so embedded "provide a
test that..." instructions are redundant.

Also drops a stranded "Provide" fragment left in RFP-023 item 3 by an
earlier cleanup pass, and makes each outbound-unlinkability item
readable on its own rather than deferring to the inbound item.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The RFP required trustless Ethereum verification but never said where
the tracked sync-committee state lives, leaving applicants to guess
between a shared on-chain light client and a bring-your-own-chain design
that almost certainly cannot fit a single transaction.

Specifies the expected shape: an operator advances shared consensus
state, anyone may submit a proof-checked update, and consumers supply
only inclusion proofs. Trust is a one-off deployment-time checkpoint,
recoverable by fresh deployment rather than by a privileged party
mutating an existing one. This removes the admin surface entirely, so
the RFP-001 dependency goes with it.

Adds an appendix surveying Telepathy, SP1 Helios and r0vm-helios, plus
the Across fork that deliberately gates submission behind a role: the
clearest evidence that permissionlessness is a design choice rather than
something zk proofs confer automatically. Points applicants at
r0vm-helios as a RISC Zero reuse candidate to assess, not to assume.

Also corrects the consumption model, which described the primitive as a
library and forbade depending on any account written by a third party.
That contradicted the operator architecture. On testnet and mainnet this
is a deployed program with an interface; what must stay in the
consumer's transaction is inclusion and predicate evaluation.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Cost section now splits by execution path: BLS12-381 is needed only for
headers, which are public and executed by the sequencer, while the open
question is whether hash-based inclusion verification is viable in a private
transaction proven on user hardware. Drops the secp256k1 ECDSA benchmark, which
measured a different primitive on a different question.

Replaces Ethereum-style "deployment" wording with the account model: the
program is deployed once, and the checkpoint, chain binding, finality
parameters, and tracked consensus state are per-instance configuration held in
accounts.

Adds reference consumer programs covering an ERC-20 transfer and a native ether
transfer to a specific contract.

Appendix records that an attestation spans two proof systems, the SSZ binding
of the execution payload over SHA256 and the Merkle-Patricia path over
keccak256, and that a log is proven through its receipt.

Renumbers Supportability after dropping the per-item test and README items, and
fixes the cross-references that pointed at the old numbering.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Extracted so the gas token bridge can be reviewed separately from RFP-021 and
RFP-022. The cross-links from RFP-021 and RFP-022 stay, and resolve once the
RFP-023 branch merges back into this one.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Moves with the RFP to its own branch.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Inverts RFP-022: the LEZ program is the vault holding native gas token and the
Ethereum contract is the minter, so a user who holds nothing on LEZ can acquire
gas without an atomic deshield from a balance they do not have. Supply is
demand-driven, with no privileged minter and no pre-issued ERC-20 supply.

An off-chain paymaster sponsors release requests, gated on a valid attestation
of a burn of its own deployment's ERC-20 rather than on any property of the
requester, and reachable over Logos Delivery and over Tor so the request path
does not itself require LEZ gas.

Split out of the RFP-021 and RFP-022 branch so it can be reviewed on its own.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@fryorcraken
fryorcraken force-pushed the rfp-023-gas-token-bridge branch from 9538c35 to b5b1003 Compare August 19, 2026 04:36
@fryorcraken
fryorcraken force-pushed the rfp-021-wrapped-erc20 branch from 348c9b0 to 86c1d1d Compare August 27, 2026 03:56
fryorcraken added a commit that referenced this pull request Sep 8, 2026
RFP-021 is claimed by three older open pull requests, #158 and #169 for
Ethereum state attestation and #57 for a cross-chain privacy DEX, so this
one moves to the first free number past every current allocation.

The table also gains placeholder rows for the five remaining deliverables
in the suite, so a reader sees the shape of the whole set rather than one
RFP that refers to five documents that do not appear anywhere. The two FFI
layers are developer tooling; the JSON-RPC proxy, the two SDKs and the
further transport modules are applications and integrations.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants