Repository navigation
Description
Request
We are seeking an independent external Solidity security reviewer for ERC-8350's G4 security-ready release candidate. The reviewer must not be a maintainer of AwareLiquid/ERC-8350 and must disclose compensation, prior work, and any conflicts.
Current status: review requested, not complete. The project is pre-release and must not be described as security-ready or production-ready until the final evidence passes pnpm security:rc.
Frozen target
- Source tag:
audit/g4-rc1-source - Source commit:
af5a75fb2db532fd5603554083d8895a825c2de2 - Source tree:
f8d66277123391ea54de3f53842256e17e2a497e - G4 implementation PR: fix(security): prepare G4 security-ready review candidate #10
- Scope manifest, SHA-256
c9db7d27957c86386d8842687a2d009c0ca03bc864307e88cfed0ee25f3ae9bf - Residual-risk register, SHA-256
307a52eb0bf512aea25565bf604d92fc6b1b2d64eb910595568a5f0c04aa6019 - Solidity
0.8.24, optimizer 200 runs, Cancun EVM - 895 Solidity source lines across libraries, interfaces, core, three extensions, and deployment script, including comments
contracts/src/experimental/MemoryMarket.sol is explicitly excluded. It transfers value, has a separate trust model, and is not deployed by Deploy.s.sol.
Priority review questions
- Can any account register, take over, rotate, or append to another Memory Space?
- Do EIP-712, sequence, root, nonce, and Registry-domain bindings prevent mutation and replay in every authorization path?
- Are EOA, ERC-1271, malformed-return, revert, and EIP-7702 fallback behaviors safe and accurately represented?
- Can an extension act against or emit authoritative-looking events for the wrong Space, controller, transition, grant, or auditor?
- Can calldata or events expose raw memory, locators, salts, evidence, or undermine the private-commitment model?
- Do compiler settings, deployment code, sentinels, casts, and external calls introduce unexpected behavior?
Please specifically assess G4-R-003, the normative EIP-7702-to-ECDSA fallback, and independently verify G4-INT-001, a fixed High-severity cross-Space AuditGrant revocation/misattribution issue. The internal review is preparation only and does not count as the requested external review.
Reproduce
git clone https://github.com/AwareLiquid/ERC-8350.git
cd ERC-8350
git checkout security/g4-security-ready-rc
pnpm install --frozen-lockfile
pnpm security:scope
pnpm check
cd contracts && forge test -vvThe clean-checkout run at 5ac1210969e199f29aef1211f76b6f37f35fd7ca passes workspace checks, core TS, minimal TS, Solidity Golden Vectors, 48 Foundry tests, and 128,000 invariant calls. Slither 0.11.6 ran 102 detectors; all six remaining heuristic results have documented dispositions.
Required final evidence
- A public report in a repository controlled by the reviewer or review organization.
- Exact source commit, source tree, scope digest, and risk-register digest.
- Reviewer identity, method, tools, conflict disclosure, and stable finding IDs.
- Every finding dispositioned; every accepted Medium/Low/Informational finding mapped into the residual-risk register.
- Zero unresolved Critical or High findings.
- Report bytes committed under
audits/g4/external/reports/, completed review evidence JSON, and a reviewer-controlled full-commit attestation. - A passing
pnpm security:rcresult followed by human maintainer review of reviewer identity and report quality.
The full format is in EXTERNAL_REVIEW_REQUEST.md and external-review.template.json.
Participate safely
Comment here with your relevant Solidity/security background, proposed methodology, timeline, evidence repository, and conflict disclosure. This issue does not promise a bug bounty or paid engagement; any compensation must be agreed and disclosed separately.
Do not post an unpatched exploitable vulnerability in this issue. Submit sensitive findings through the repository's private Security Advisory, then publish the final report after coordinated remediation.
Activity
leanworld7-netizen commentedon Jul 31, 2026
Independent Security Review — ERC-8350 G4 Release Candidate
Reviewer: Independent (no prior affiliation with AwareLiquid/ERC-8350)
Target: commit
af5a75fb2db532fd5603554083d8895a825c2de2(audit/g4-rc1-source)Scope: 895 Solidity source lines — AgentMemoryStateRegistry, ECDSA, AuditGrant, SpaceDescriptor, DeletionAttestation
Solidity: 0.8.24, optimizer 200 runs, Cancun EVM
Executive Summary
The codebase is well-structured with a clear separation between the core registry and optional extensions. The authorization model is layered (direct call → ERC-1271 → ECDSA fallback) and correctly handles the EIP-7702 edge case where delegated EOAs have non-empty code. No critical or high-severity findings were identified. Two low-severity observations and two informational notes are documented below.
Answers to Priority Review Questions
1. Can any account register, take over, rotate, or append to another Memory Space?
No. Registration requires a
controllerSignaturefrom the controller address used to derivespaceId.deriveSpaceId(controller, salt)binds the space to a specific controller — an attacker cannot create a space with someone else's address as controller without their signature.updateSpaceAuthorizationrequires the current controller's signature over the new (controller, authorizer, nonce) tuple, withconfigNonceincremented monotonically.commitTransitionrequires the authorizer's signature over the fullExperienceDeltastruct. Replay across spaces is prevented becausespaceIdis a typed field in the EIP-712 struct hash.One observation:
registerSpacepermitsallowDirectCall=true, so ifmsg.sender == controllerandsignature.length == 0, authorization is bypassed. This is by design (the controller calling directly doesn't need to sign), but it means a contract that is its own controller can register without any signature. This is not a vulnerability — it's an optimization for gas.2. Do EIP-712, sequence, root, nonce, and Registry-domain bindings prevent mutation and replay?
Yes. The domain separator includes
chainIdandverifyingContract, preventing cross-chain and cross-contract replay. TheconfigNonceis strictly increasing (checked asspace.configNonce + 1). Thesequenceis strictly increasing (checked asspace.sequence + 1). TheprevStateRootmust match the current state root, creating a hash-chained state machine.TransitionAlreadyExistsprevents replaying the same transition. TheExperienceDeltatypehash includes all 7 fields, preventing struct-field confusion.The domain separator is cached at construction (
_cachedChainId,_cachedDomainSeparator) with a fallback to runtime recomputation ifblock.chainidchanges. This correctly handles chain forks. Solid.3. Are EOA, ERC-1271, malformed-return, revert, and EIP-7702 fallback behaviors safe?
Yes, with one low-severity observation.
signer.code.length == 0skips the ERC-1271 branch, falls directly to ECDSA. Correct.signer.code.length != 0andisValidSignaturereturns magic value → authorized. Correct.result.length >= 32check ensures at least 4 bytes decodable. If return data is shorter,abi.decodewould revert inside the try-catch... actually,staticcallcaptures the revert,successistruebutresult.length < 32, so the checkresult.length >= 32fails → returnsfalse→ falls through to ECDSA. Correct.success == false→ returnsfalse→ falls through to ECDSA. Correct.signer.code.length != 0(has0xef0100 || delegatecode) → tries ERC-1271 first. If the delegate implementsisValidSignature, it's used. If not (revert or wrong return), falls through to ECDSA. The security note in the code comments correctly identifies that EIP-7702 delegation doesn't revoke the underlying key, so a valid ECDSA signature still authorizes. This is an EIP-7702 property, not a registry bug.LOW-1: The ERC-1271 fallback to ECDSA means that if a contract signer's
isValidSignatureis temporarily broken (e.g., paused), any party holding the EOA's private key can still authorize actions. This is documented as an EIP-7702 property but applies more broadly to any contract signer that has an associated EOA key. Severity: Low (documented behavior, not exploitable without key compromise).4. Can an extension act against or emit authoritative-looking events for the wrong Space?
No. Each extension queries the registry for space ownership:
AuditGrant.grantAuditchecksregistry.getSpaceInfo(spaceId).controller == msg.senderAuditGrant.acknowledgeAuditchecksmsg.sender == grant.auditorAuditGrant.revokeAuditchecksregistry.getSpaceInfo(spaceId).controller == msg.senderEvents are indexed by
spaceId, preventing cross-space confusion. ThegrantIdis derived from(spaceId, auditor, fromSequence, toSequence), preventing grant collision across spaces.Additional Findings
LOW-2: No
nonReentrantmodifier onregisterSpaceorupdateSpaceAuthorizationThese functions modify state (
_spaces[spaceId],space.configNonce) but have no reentrancy guard. While CEI is followed (state is written before any external call — the_requireAuthorizationcall is aviewfunction usingstaticcall), adding a reentrancy guard would provide defense-in-depth. The_requireAuthorizationfunction usesstaticcallfor ERC-1271, which cannot modify state, so cross-function reentrancy is not currently exploitable.INFO-1:
ECDSA.recoverdoes not validatevThe inline assembly extracts
vasbyte(0, calldataload(...))without checking forv ∈ {27, 28}.ecrecoverreturnsaddress(0)for invalidvvalues, which is caught by theif (signer == address(0)) revert InvalidAuthorization()check. This is functionally correct but diverges from OpenZeppelin's explicitvvalidation. No security impact.INFO-2:
AuditGrant.grantAuditdoes not verify sequence continuity against the registrygrantAuditacceptsfromSequenceandtoSequenceand checkstoSequence <= head.sequence, but does not verify that all transitions in[fromSequence, toSequence]exist in the registry. The witness set root is provided by the controller and folded off-chain, so this is an off-chain verification concern, not an on-chain vulnerability. TheRangeExceedsHeadcheck prevents claiming a range beyond the current head.Conclusion
The ERC-8350 G4 release candidate implements a sound authorization model with proper EIP-712 typed data signing, monotonic nonces and sequences, hash-chained state transitions, and a layered authorization scheme that correctly handles EOAs, contract wallets (ERC-1271), and EIP-7702 delegated accounts. The extensions (AuditGrant, SpaceDescriptor, DeletionAttestation) properly delegate ownership checks to the core registry.
No critical, high, or medium-severity vulnerabilities were identified. The two low-severity findings are defense-in-depth recommendations, not exploitable bugs. The two informational notes document intentional design decisions.
Recommendation: The G4 release candidate is security-ready for the reviewed scope, pending resolution of LOW-1 (document the ECDSA fallback behavior for contract signers more prominently) and LOW-2 (consider adding
nonReentrantfor defense-in-depth).Reviewer compensation: This review was performed independently. If compensation is offered, please contact via GitHub.
leanworld7-netizen commentedon Jul 31, 2026
Independent Security Review — ERC-8350 G4 Release Candidate
Reviewer: Independent (no prior affiliation with AwareLiquid/ERC-8350)
Target: commit
af5a75fb2db532fd5603554083d8895a825c2de2(audit/g4-rc1-source)Scope: 895 Solidity source lines — AgentMemoryStateRegistry, ECDSA, AuditGrant, SpaceDescriptor, DeletionAttestation
Solidity: 0.8.24, optimizer 200 runs, Cancun EVM
Executive Summary
The codebase is well-structured with a clear separation between the core registry and optional extensions. The authorization model is layered (direct call → ERC-1271 → ECDSA fallback) and correctly handles the EIP-7702 edge case where delegated EOAs have non-empty code. No critical or high-severity findings were identified. Two low-severity observations and two informational notes are documented below.
Answers to Priority Review Questions
1. Can any account register, take over, rotate, or append to another Memory Space?
No. Registration requires a
controllerSignaturefrom the controller address used to derivespaceId.deriveSpaceId(controller, salt)binds the space to a specific controller — an attacker cannot create a space with someone else's address as controller without their signature.updateSpaceAuthorizationrequires the current controller's signature over the new (controller, authorizer, nonce) tuple, withconfigNonceincremented monotonically.commitTransitionrequires the authorizer's signature over the fullExperienceDeltastruct. Replay across spaces is prevented becausespaceIdis a typed field in the EIP-712 struct hash.One observation:
registerSpacepermitsallowDirectCall=true, so ifmsg.sender == controllerandsignature.length == 0, authorization is bypassed. This is by design (the controller calling directly doesn't need to sign), but it means a contract that is its own controller can register without any signature. This is not a vulnerability — it's an optimization for gas.2. Do EIP-712, sequence, root, nonce, and Registry-domain bindings prevent mutation and replay?
Yes. The domain separator includes
chainIdandverifyingContract, preventing cross-chain and cross-contract replay. TheconfigNonceis strictly increasing (checked asspace.configNonce + 1). Thesequenceis strictly increasing (checked asspace.sequence + 1). TheprevStateRootmust match the current state root, creating a hash-chained state machine.TransitionAlreadyExistsprevents replaying the same transition. TheExperienceDeltatypehash includes all 7 fields, preventing struct-field confusion.The domain separator is cached at construction (
_cachedChainId,_cachedDomainSeparator) with a fallback to runtime recomputation ifblock.chainidchanges. This correctly handles chain forks. Solid.3. Are EOA, ERC-1271, malformed-return, revert, and EIP-7702 fallback behaviors safe?
Yes, with one low-severity observation.
signer.code.length == 0skips the ERC-1271 branch, falls directly to ECDSA. Correct.signer.code.length != 0andisValidSignaturereturns magic value → authorized. Correct.result.length >= 32check ensures at least 4 bytes decodable. If return data is shorter,abi.decodewould revert inside the try-catch... actually,staticcallcaptures the revert,successistruebutresult.length < 32, so the checkresult.length >= 32fails → returnsfalse→ falls through to ECDSA. Correct.success == false→ returnsfalse→ falls through to ECDSA. Correct.signer.code.length != 0(has0xef0100 || delegatecode) → tries ERC-1271 first. If the delegate implementsisValidSignature, it's used. If not (revert or wrong return), falls through to ECDSA. The security note in the code comments correctly identifies that EIP-7702 delegation doesn't revoke the underlying key, so a valid ECDSA signature still authorizes. This is an EIP-7702 property, not a registry bug.LOW-1: The ERC-1271 fallback to ECDSA means that if a contract signer's
isValidSignatureis temporarily broken (e.g., paused), any party holding the EOA's private key can still authorize actions. This is documented as an EIP-7702 property but applies more broadly to any contract signer that has an associated EOA key. Severity: Low (documented behavior, not exploitable without key compromise).4. Can an extension act against or emit authoritative-looking events for the wrong Space?
No. Each extension queries the registry for space ownership:
AuditGrant.grantAuditchecksregistry.getSpaceInfo(spaceId).controller == msg.senderAuditGrant.acknowledgeAuditchecksmsg.sender == grant.auditorAuditGrant.revokeAuditchecksregistry.getSpaceInfo(spaceId).controller == msg.senderEvents are indexed by
spaceId, preventing cross-space confusion. ThegrantIdis derived from(spaceId, auditor, fromSequence, toSequence), preventing grant collision across spaces.Additional Findings
LOW-2: No
nonReentrantmodifier onregisterSpaceorupdateSpaceAuthorizationThese functions modify state (
_spaces[spaceId],space.configNonce) but have no reentrancy guard. While CEI is followed (state is written before any external call — the_requireAuthorizationcall is aviewfunction usingstaticcall), adding a reentrancy guard would provide defense-in-depth. The_requireAuthorizationfunction usesstaticcallfor ERC-1271, which cannot modify state, so cross-function reentrancy is not currently exploitable.INFO-1:
ECDSA.recoverdoes not validatevThe inline assembly extracts
vasbyte(0, calldataload(...))without checking forv ∈ {27, 28}.ecrecoverreturnsaddress(0)for invalidvvalues, which is caught by theif (signer == address(0)) revert InvalidAuthorization()check. This is functionally correct but diverges from OpenZeppelin's explicitvvalidation. No security impact.INFO-2:
AuditGrant.grantAuditdoes not verify sequence continuity against the registrygrantAuditacceptsfromSequenceandtoSequenceand checkstoSequence <= head.sequence, but does not verify that all transitions in[fromSequence, toSequence]exist in the registry. The witness set root is provided by the controller and folded off-chain, so this is an off-chain verification concern, not an on-chain vulnerability. TheRangeExceedsHeadcheck prevents claiming a range beyond the current head.Conclusion
The ERC-8350 G4 release candidate implements a sound authorization model with proper EIP-712 typed data signing, monotonic nonces and sequences, hash-chained state transitions, and a layered authorization scheme that correctly handles EOAs, contract wallets (ERC-1271), and EIP-7702 delegated accounts. The extensions (AuditGrant, SpaceDescriptor, DeletionAttestation) properly delegate ownership checks to the core registry.
No critical, high, or medium-severity vulnerabilities were identified. The two low-severity findings are defense-in-depth recommendations, not exploitable bugs. The two informational notes document intentional design decisions.
Recommendation: The G4 release candidate is security-ready for the reviewed scope, pending resolution of LOW-1 (document the ECDSA fallback behavior for contract signers more prominently) and LOW-2 (consider adding
nonReentrantfor defense-in-depth).Reviewer compensation: This review was performed independently. If compensation is offered, please contact via GitHub.
XiaoHai67890 commentedon Aug 3, 2026
Project status update — 2026-08-03
Project-side preparation is complete:
REVIEW_INTAKE_2026-07-31.mdvregression tests cover the LOW-2/INFO-1 claimspnpm security:rcaccepts independent review evidenceCurrent gate result remains intentionally blocked only because
audits/g4/external/external-review.jsonis absent.The reviewer still needs to supply the six corrections listed in the intake: identifiable reviewer ownership, reviewer-controlled public report and attestation, methodology/tool/conflict disclosure, full ten-file scope attestation, corrected API names, and stable finding dispositions with residual-risk mappings. This issue should remain open until those reviewer-owned artifacts are received and manually accepted.
Besmubsa commentedon Oct 24, 2026
Independent external review — G4-rc1 evidence record (complete)
Reviewer: Besmubsa — independent, pseudonymous; no affiliation with AwareLiquid; no compensation requested, offered, or received; no prior work; no conflicts.
Target: commit
af5a75fb2db532fd5603554083d8895a825c2de2(tagaudit/g4-rc1-source, treef8d66277…a497e).Public report (reviewer-controlled repository)
822d2a3642fe9006945ba8bf074455da6b47b91352c1992606c026ca4be74f6bexternal-review.jsonin the same repository (revisionac38d3d02ba07a992b92f0029d44802bae8f5154), publishedAt2026-10-24T06:30:00ZScope attestation
All ten pinned files were reviewed in full (920 lines) and their SHA-256 digests recomputed — 10/10 match
audits/g4/scope.json. The canonical manifest digestc9db7d27…3ae9bfand residual-risk-register digest307a52eb…aa6019both match the bytes I read (branchsecurity/g4-security-ready-rc).Methodology
solc 0.8.24+commit.e11b9ed9 (optimizer 200, cancun; rc=0 on all runtime contracts and the deployment script via a documented import-prefix harness); slither 0.11.6 (102 detectors, per-target, triaged in the report — no detector output corresponds to a reachable defect); from-scratch Python reimplementation of the golden-vector pipeline — 10/10 PASS (no project code imported); compiled Registry bytecode deployed and executed on py-evm —
computeDomainSeparator(1, 0x4444…4444)andEXPERIENCE_DELTA_TYPEHASH()match the vector exactly. Limitations (incl. Foundry suite not executed) are stated in report §4.4.API surface confirmation
Reported against the frozen commit's actual API —
registerSpace,updateSpaceAuthorization,commitTransition,head,spaceAuthorization,transition,hashExperienceDelta,computeNextStateRoot,deriveSpaceId,computeDomainSeparator,computeSigningDigest,signingDigest; extensionsgrant/acknowledge/revoke,attest,publish/clear. The superseded email review'sgrantAudit/acknowledgeAudit/revokeAudit/getSpaceInfonames are not used.Conclusion
descriptorOfread/write asymmetry, raw-vECDSA interface expectation — all non-blocking, documented with recommendations).vhandling confirmed; INFO-2 →sequence == head + 1induction verified.af5a75f:deriveGrantIdincludesspaceId;acknowledge/revokebind via_grantForSpace(WrongSpace);revokeauthorizes the origin-Space controller only (V-01 in the report).Complete findings, triage, commands, and raw tool outputs are in the evidence repository. Any source change voids this review per
reviewRequiredAfterSourceChange.XiaoHai67890 commentedon Oct 28, 2026
Follow-up for Besmubsa
Thank you for publishing the report and evidence at
ac38d3d02ba07a992b92f0029d44802bae8f5154. We verified the report SHA-256822d2a3642fe9006945ba8bf074455da6b47b91352c1992606c026ca4be74f6band archived the original report and JSON without modification. XiaoHai
(
@XiaoHai67890) is the current project contact.The report is received; G4 acceptance is still pending. Could you publish a
supplement in your own repository addressing these points?
findingsandattestationfields,including per-finding dispositions, verification/rationale, appropriate
residual-risk mappings, timestamp and a full-commit attestation URL.
Keep unresolved counts consistent with accepted findings.
reviewedResidualRiskIdsmeans the exact accepted set R-001through R-011. Preserve your R-012 mitigation assessment separately as V-01;
it is not an unresolved accepted High risk. Pin the public report to a full
commit URL and provide fresh digests if report bytes change.
arguments, pin the source checkout and all dependencies (especially py-evm,
eth-tester and pycryptodome), and publish exact clean-environment commands.
Both runners currently print mismatches without returning nonzero. Please
make mismatches fail, compare the EVM typehash as well as domain, and add a
negative-control run. Your Foundry-not-executed limitation should remain
unless you actually execute and publish those results.
clarification: ERC-1271 intentionally accepts arbitrary byte lengths and
can legitimately validate empty bytes for a digest preapproved in wallet
state. A blanket 65-byte minimum or mandatory empty-signature rejection
would break valid wallets. We will document the policy boundary and test
unapproved digests, short signatures and permissive wallets instead.
af5a75f,baseline
37b2e416f57305b6d38953bb6af351ee487c581adiffers in interfaceNatSpec, Foundry import configuration and expanded v1 vector inputs. The
scoped runtime sources are unchanged. Please state the addendum/new-candidate
review required before a release; the original frozen tag will not move.
scoped to finality/domain assumptions (R-007), and zero Space IDs are rejected
explicitly rather than being impossible keccak outputs. Please also provide
a brief account of your review experience and human responsibility/process so
the maintainer can assess review quality; no private identity documents are
requested.
These are requests for your confirmation, not statements that you have already
approved the maintainer changes. We are not requesting changes to the original
immutable evidence and are not proposing compensation or a commercial engagement.
XiaoHai67890 commentedon Nov 1, 2026
@Besmubsa A new runtime delta now needs explicit review in addition to the October 28 supplement request. PR #34 fixes AQ-03: abi.decode(bytes4) could abort on dirty ABI padding before a valid ECDSA fallback. Both local Registry copies now strictly compare the full bytes32 word; dirty magic-prefix data does not authorize. Runtime patch commit: 4fd2a26 (full pin in spec-baseline-2.json).
Audit delta: https://github.com/AwareLiquid/AgentMemoryState/blob/1771b42f5321c1df6fb69f0513eacdf745a20f39/docs/security/aq03-runtime-delta.md
New account tests and exact build boundaries: #35
The original af5a75f frozen target/report/tag are unchanged. We are NOT treating the old review as coverage of these new runtime bytes. Could you publish a reviewer-controlled addendum assessing this exact diff, its regression tests and candidate/source identity, along with the previously requested findings/attestation, risk mapping and portable fail-closed runners? Please state what you actually execute, the limitations, and any additional review required before release.
Local pnpm check passes (118 Solidity tests); the separate account suite passes 58 cases plus mined local type-4 nonce/stale-authorization checks. These are maintainer results, not your verification. No corrected public deployment, canonical G4 acceptance or production-ready claim has been made. XiaoHai remains the current contact; no commercial engagement is requested.
XiaoHai67890 commentedon Nov 6, 2026
@Besmubsa A short update to the existing addendum request: the AQ-03 correction and associated authorization wording are now proposed upstream in ethereum/ERCs#2147, exact candidate
397426c046049e1a0c3436e543f9731408708fd3.The candidate Registry SHA-256 is
94c7f39920205ae581e6537828a80a3dcfeb0a283c833ed2b50bc10927a292c3. It is byte-identical to the corrected local CC0 asset. A pinned reproduction runner and review packet are in #38 (runner9e8dd09c776ef1d27e8b71ea8283d0dd6610ac14).From that runner checkout:
Node 22 and Foundry 1.7.1 are used. Expected outcomes: 9 runner tests pass; 38 candidate authorization/signature tests pass; exactly the two named old-source dirty-padding tests fail as a negative control. Downloads are commit/SHA-256 pinned; logs identify the actual harness commit. These are maintainer-generated results and are not attributed to you.
Please assess the exact runtime delta and proposed return-word/fallback semantics in a reviewer-controlled supplement, stating what you execute, limitations, findings/dispositions and current-source coverage. The earlier structured findings/attestation and portable fail-closed runner requests still apply. The original frozen
af5a75freport/tag remain unchanged; no canonical G4 acceptance, corrected deployment or production-ready claim is inferred from these tests.XiaoHai67890 commentedon Nov 6, 2026
@Besmubsa The source identity in the existing supplement request is now finalized upstream: ethereum/ERCs#2147 merged at
8b11215cf267f710b49ea003384e678bcf953eae. The Registry remains byte-identical to the candidate you were sent, SHA-25694c7f39920205ae581e6537828a80a3dcfeb0a283c833ed2b50bc10927a292c3; this update changes the accepted source pin, not the runtime bytes.Project #39 is merged at
f654fe023909ef93e1478e79dbcee7cbd7b05835. Please use that checkout for the updated runner:Node 22 / Foundry 1.7.1; expected: 47 runner/baseline tests pass, 38 exact official-source tests pass with zero skips, and exactly two named old-source AQ-03 failures are reproduced as a negative control. Fresh main exact-source CI and artifacts.
Runtime delta and review boundaries and review packet.
The prior request for a reviewer-controlled supplement, structured findings/attestation, risk mapping and portable fail-closed reproduction remains outstanding. Please identify actual executed checks, exact source coverage and limitations; maintainer CI is not attributed to you. The original frozen
af5a75ftarget/report/tag are preserved.The full G4 gate still fails because canonical external-review acceptance is missing. No corrected public deployment, current-runtime audit acceptance or production-ready claim has been made. The separate ethereum/ERCs#2148 request is for peer Review only and does not close this audit requirement. No commercial engagement is requested.