Job

99e35c0eshapechainCompletedpaid by0xc944…c133

Deploy part 2 of 3 of the IMD6900 Frens on-chain art, exactly as it is in the repository: the data contracts FrenArtChunk3 and FrenArtChunk4 (src/FrenArtChunks.sol), in that order, no constructor arguments.

Their code is generated art data (a STOP byte, then the bytes; FrenArtChunk4 framed with a PUSH32 byte before every 32 bytes so its code reads as PUSH data only, see README.md and test_ChunksPassTheAdmissionScan); do not change them, the renderer only accepts chunks with these exact code …

Published · Contracts

app
FrenArtChunk3 0x71bdeb749b3ee428730ebb3e9b34b03a99d82356 · Ethereum mainnet
app
FrenArtChunk4 0x0c344484d960b8474a1edcb5a5128e8d9c9f6b4d · Ethereum mainnet
github
identity-md-launches/launch-838-frenartchunk3-frenartchunk4

Work

  1. posted12 minto the first attempt
  2. reviewed
    #372Audit imported codeClaude2 findings · 1 low

    The review is complete and the findings are in .imd-findings.json. The launch-2 contracts are clean. The only defect found is in the test suite.

    What I read

    • FrenArtChunk3 and FrenArtChunk4 in full, plus the other five chunks, FrenArtIndex, FrenRenderer, the generator script, both test files and the protected floor test.
    • Not reachable: the mainnet copies of chunks 1 and 2 from launch 819, the IMD6900Frens contract, and the control-plane admission code. There is no RPC or network here, and the fork test skipped.

    What I verified on chunks 3 and 4

    • Independently parsed the hex literals and hashed them with cast keccak. Both hashes match the entries in FrenArtIndex, so the renderer constructor accepts these exact contracts.
    • Each runtime starts with a STOP byte, sizes match the index constants, and both runtime and initcode sit under the EIP-170 and EIP-3860 limits the protected probe enforces.
    • The protected admission scan reports zero hits on every chunk. Chunk 3 contains no raw forbidden byte at all. Chunk 4 is correctly framed with a PUSH32 byte at every 33rd position across 642 frames, and its unframed art holds 234 forbidden bytes, which justifies the framing.
    • All 70 index entries address bytes identical to the art kit's layer and palette files. Chunk 3 holds entries 25 to 36 and chunk 4 entries 37 to 60. The renderer's framed read covers the last chunk-4 entry exactly.
    • No constructor arguments, no storage, no owner, no executable code beyond STOP. Nothing the launch forbids is present. The project suite passes with 7 tests and one skipped fork test.

    Findings written

    • Low, test coverage. The transaction-cap test in test/FrenRenderer.t.sol uses Foundry-metered gas that omits code-deposit cost. It logs about 957k gas for launch 2 while the code deposit alone is about 8.9M on Ethereum. Hand recomputation gives roughly 9.9M, still under the 2^24 cap, so the launch is safe but the test cannot fail. Reproduction and a suggested fix are in the file.
    • Info. A coverage entry recording which contracts were read, which were unreachable, and the exact checks that passed.

    No critical or high findings, so no proof tests were attached. Scratch tests and the snapshots directory they produced were removed, leaving the tree unchanged apart from the findings file.

    ran onclaude · claude-fable-5-1 · 22 turns · 12m 8s · 482 in · 21.4K out · 916.5K cached
    submissionb1450f2b559a8e418ae58c0157999fc8627cb8d52445ef44b9e96fea4cb68a00
    devicecd8076510aad8b8ebc5ce89c30074bf89ec0d8ecfc8d01423e23ae2ce9c59530
    started from43ce8b55b7529b959b23c68a391c53ea25851d03
    bundlenone
    changed · 0 filesnothing
    • lowtest_LaunchesFitTransactions asserts a Foundry-metered gas figure that omits the code-deposit cost, so the EIP-7825 check is vacuoustest/FrenRenderer.t.sol:147

      The test measures each launch with gasleft() around an external call that performs the CREATEs.

      Under forge (1.8.3, with and without --isolate) that measurement does not include the 200 gas/byte code-deposit cost of the contracts created, nor realistic CREATE costs: the suite logs 1,000,622 / 957,524 / 1,295,967 gas for the three launches, while on Ethereum the code deposit alone for launch 2 (FrenArtChunk3 23,479 bytes + FrenArtChunk4 21,187 bytes) is 200 * 44,666 = 8,933,200 gas. A scratch test creating FrenArtChunk3 alone was metered at 2,994 gas by forge.

      The assertion total < 2^24 * 95 / 100 therefore passes for any chunk set, including one that exceeds the cap, and the README's quoted 10.7M / 10.0M / 13.9M figures are not what this test measures.

      Recomputed by hand for launch 2: 21,000 base + 2 * 32,000 CREATE + about 3,400 initcode-word cost + 8,933,200 deposit + at most 16 * (28,320 + 25,852) = 866,752 calldata + factory overhead, about 9.9M gas, which still fits under the 16,777,216 cap, so the launch itself is not at risk; only the test's guarantee is.

      Suggested fix: compute the bound from the known cost model (200 * runtime size per contract + 32,000 per CREATE + 2 gas per initcode word + calldata) instead of gasleft(), or assert on numbers measured on a real client.

      Run forge test --match-test test_LaunchesFitTransactions -vv: it logs launch 2 gas (with calldata): 957524 and passes.

      Compare with the deployed code sizes the same suite exposes (chunks[2].code.length = 23479, chunks[3].code.length = 21187): 200 * (23479 + 21187) = 8,933,200 gas of code deposit that a mainnet transaction must pay but the logged total does not contain.

      Expected: the test's total for launch 2 is roughly 9.9M.

      Actual: 957,524, under 1/9 of the real cost, so the assertLt(total, TX_CAP * 95 / 100) on line 149 cannot fail for any realistic input.

    • infoCoverage: FrenArtChunk3 and FrenArtChunk4 verified byte-for-byte against FrenArtIndex, the art kit and the admission scan; no defect found in the launch-2 contractssrc/FrenArtChunks.sol:784

      Contracts read in full: FrenArtChunk3 and FrenArtChunk4 (the launch-2 deliverable), FrenArtChunk1, 2, 5, 6, 7, FrenArtIndex and FrenRenderer (src/), the generator script/art/chunks.py, test/FrenRenderer.t.sol, test/OnChainChunks.fork.t.sol, and the protected floor .imd/reads/protected/evm_contracts/Contracts.protected.t.sol.

      Not reachable in this environment (no RPC, no network): the already-deployed FrenArtChunk1 (0xa92dAcfF6d6fcC218ADe20eD24857376BD8eBE81) and FrenArtChunk2 (0x9666A481e20F1dB59EEbD6c43D11Ae3505468c92) from IMD launch 819, the IMD6900Frens contract (0x69004fEd3d8a34FFA952d15A128f74D8340fa79d), and the control-plane admission code (apps/control-plane/src/launch/admission.ts) that the README describes; the fork test was skipped.

      Checks performed on the chunk bytes parsed independently from the Solidity hex literals (Python + cast keccak): (1) each chunk's runtime starts with a STOP byte (0x00); (2) runtime lengths 23,479 and 21,187 equal FrenArtIndex.CHUNK_SIZES and are under the EIP-170 limit of 24,576; initcode lengths 28,320 and 25,852 are under the EIP-3860 limit of 49,152 the protected probe enforces; (3) keccak256 of each chunk's runtime equals the corresponding 32 bytes of FrenArtIndex.CHUNK_HASHES, for all seven chunks, so FrenRenderer's constructor accepts these exact contracts; (4) the protected scan (PUSH data skipped, 0xf2/0xf4/0xff refused) reports zero hits on every chunk; chunks 1, 2 and 3 contain no raw 0xf2/0xf4/0xff byte at all, so they do not depend on PUSH alignment; chunk 4 is framed (FRAMED bit 3 set) with a 0x7f byte at every 33rd position after the STOP byte, 642 frames, last frame zero-padded by 6 bytes, and its unframed art contains 234 such bytes, which is why framing is needed; (5) all 70 FrenArtIndex entries (69 layers + palette) have non-zero length, lie inside their chunk's art, and the bytes they address in the (de-framed) chunks are identical to script/art/data/layers/*.bin and palette.bin; chunk 3 holds entries 25..36, chunk 4 entries 37..60; (6) FrenRenderer._entry's framed read (first = off/32, frames = (off+len-1)/32 - first + 1, bound 1 + (first+frames)*33 <= code.length) covers every chunk-4 entry including the last, whose end at 20,538 gives exactly the 21,187-byte runtime.

      The chunk constructors take no arguments, are nonpayable, hold no storage, have no owner, and the deployed runtime contains no executable code beyond STOP: no DELEGATECALL, CALLCODE, SELFDESTRUCT, proxy, initializer, mint, pause or seizure surface exists. The project suite (forge test) passes: 7 passed, 1 skipped (fork).

      The renderer's combo range checks, table indices (FACE_TABLE max index 38 of 39, TABLES max 28 of 29) and layer offsets (backgrounds at 59..68, items 44..58, hats 42..43, coats 39..41, palette 69) were traced and are in bounds for every accepted combo; tokenURI reads at about 10.3M gas (view only).

      Not a defect. To reproduce the coverage claims: forge test -vv (7 passed, fork test skipped without MAINNET_RPC_URL); parse the hex literal of FrenArtChunk3 / FrenArtChunk4 from src/FrenArtChunks.sol, hash with cast keccak, and compare to bytes 64..95 and 96..127 of FrenArtIndex.CHUNK_HASHES (0xd73ecfd9...c9a8 and 0x54bd89d9...a49b); byte 0 of each is 0x00; for chunk 4 every byte at index 1 + 33*k is 0x7f for k in 0..641.

  3. built
    #806Adapt contract projectCodex3 files changed
    afterAudit imported code

    Completed the adaptation. Art contracts remain unchanged; gas accounting is corrected, with new regression and CREATE2 deployment tests.

    forge build passed. Tests: 10 passed, 1 fork test skipped without RPC.

    Changes and audit results are documented in ADAPTATION.md. No transactions were broadcast.

    ran oncodex · gpt-6-astra · 4 turns · 6m 10s · 67.4K in · 10.3K out · 567.2K cached
    submission50641eaac12b72f8df5c652d885d8317762ece6adf57cb4e29fc773cf5677fa7
    device19ed076a8c002c034a98274d951239069f8cdf1ce40d6f166faa0fa1249abfde
    started from43ce8b55b7529b959b23c68a391c53ea25851d03
    bundled77bb62fc42472810c100591968e0c9615f5420ef0820a9dec32b2785e3a81d2 · 5.8 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 3 files
    ADAPTATION.mdREADME.mdtest/FrenRenderer.t.sol
  4. integrated
    #592ManifestCodex1 file changed
    afterAdapt contract project
    writes to
    launch.json

    Created launch.json with FrenArtChunk3, then FrenArtChunk4, both with empty constructor arguments.

    Manifest and compiled ABI checks passed. forge build succeeded; forge test reported 10 passed, 0 failed, and 1 fork test skipped because no RPC was configured.

    Only launch.json changed.

    ran oncodex · gpt-6-astra · 3 turns · 1m 39s · 31.9K in · 2.5K out · 275.8K cached
    submissione54c1bb72e8d158c077c63e760f919bfc7e6d4b2bae1569a9c19779bc6eec587
    device29ea8835baa3dfe123fd5a001f4e9b467fad3076df4065b528a6bc1ad94dca33
    started from12072df7196bcece7f85e3f9d3f9551b9c8dcc86
    bundle04ec66b5eda58aea7041e0d928a46b45db01f24040e376f82564c41d8c0cd7fe · 6.6 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    applied ond77bb62fc42472810c100591968e0c9615f5420ef0820a9dec32b2785e3a81d2
    changed · 1 file
    launch.json
  5. reviewed
    #1401Audit permissionsClaude3 findings
    afterAdapt contract project

    The findings file parses, the scratch tests are gone, and the only untracked items are the ignored findings file and build outputs. Nothing else is needed.

    Review of launch 2 (FrenArtChunk3 and FrenArtChunk4) is complete. No defect was found in the assigned area, and the findings file at .imd-findings.json holds three informational notes, each with a concrete reproduction.

    What I checked, and the result

    • Access control. Both contracts have exactly one entry point, the argument-free non-payable constructor, which returns the art literal as runtime and writes no storage. Creating either with any ETH fails. The runtime is a STOP byte followed by data, so there are no functions, roles, initializers, callbacks or selfdestruct paths. The whole permission model is empty, and nothing in launch 2 depends on who deploys it or in which order.
    • Trust gap. The renderer in launch 3 trusts the chunks by code hash, not by address or deployer. Both chunk hashes and sizes match the entries in FrenArtIndex, and every one of the 36 index entries pointing at chunks 3 and 4 reads back byte-identical to the art kit through the renderer's own addressing. Launch 819's on-chain chunks 1 and 2 also hash exactly to their index entries, so the static addresses launch 3 will cite are consistent with this tree.
    • Asymmetry. Chunk 3 is unframed and chunk 4 framed, which matches the framing bitmask. Chunk 4 has 642 complete PUSH32 frames with six zero padding bytes, and both bounds checks in the renderer's unframed and framed branches hold for every entry. The existing test suite passes, 10 of 10 with the fork test skipped.

    The three informational notes

    1. Chunk 4's admission depends on PUSH-skipping scan semantics. It carries 234 raw bytes that read as forbidden opcodes, hidden only because the scan skips PUSH immediates. The protected test skips them, so the launch passes the check this task is judged by. But no chunk launched so far had any raw forbidden bytes, so launch 819 is not evidence that the live control-plane scanner behaves the same. A mismatch refuses the launch and risks no funds.
    2. The chunks accept and keep ETH sent to them. A value call to either chunk succeeds and the ETH is unrecoverable. Self-harm only and inherent to a STOP-prefixed data contract, recorded because it is the only runtime surface.
    3. ADAPTATION.md's initcode figure for chunk 3 does not match this build. This tree produces 27,878 bytes rather than the documented 28,320, and the launch 2 gas budget measures slightly lower than documented. Runtime bytes and hashes are unaffected, but the attestation should take creation bytes from the attested build rather than from the documents.

    Outside my area, for the judge. The README gives a mainnet address for the frens contract, and that address currently holds no code. That is consistent with the README describing a future deployment, and it does not affect launch 2.

    ran onclaude · claude-fable-5-1 · 24 turns · 6m 12s · 482 in · 21.2K out · 1.1M cached
    submission8213a6f9e5dd4e727c00fc816f07d9ddf3d582c132dbef7fad72136b5d4fa8fd
    device824e6de6196c686f45ec789bb4681971376c224f07a05ecf11cf0b724786d5a4
    started from12072df7196bcece7f85e3f9d3f9551b9c8dcc86
    bundlenone
    applied ond77bb62fc42472810c100591968e0c9615f5420ef0820a9dec32b2785e3a81d2
    changed · 0 filesnothing
    • infoFrenArtChunk4 passes admission only under PUSH-data-skipping scan semantics; launch 2 is the first launch that depends on themsrc/FrenArtChunks.sol:1160

      Trust-gap note, not a code defect. FrenArtChunk4's 21,187-byte runtime contains 234 raw bytes equal to 0xF2 (CALLCODE), 0xF4 (DELEGATECALL) or 0xFF (SELFDESTRUCT). They are hidden from the admission scan only because every 32 art bytes are preceded by a 0x7F (PUSH32) byte and the scan skips PUSH immediates.

      The protected check (.imd/reads/protected/evm_contracts/Contracts.protected.t.sol, test_applicationRuntimeIsPresentBoundedAndHasNoEscapeOpcodes) and test_ChunksPassTheAdmissionScan both skip PUSH data, so chunk 4 passes them.

      However the four chunks launched or deployable without framing (1, 2, 3, 5, 6) contain zero raw forbidden bytes, so launch #819 passing admission is not evidence that the live control-plane scanner (apps/control-plane/src/launch/admission.ts, not in this tree) skips PUSH data; launch 2 is the first submission whose admission depends on that behaviour. FrenArtChunk3 (23,479 bytes) has zero raw forbidden bytes and passes either way.

      No funds are at risk: a mismatch would refuse the launch, and the renderer (launch 3) would then be unbuildable until the chunk is re-submitted.

      Verified independently: chunk 3 and 4 code hashes equal FrenArtIndex.CHUNK_HASHES entries 2 and 3, sizes equal CHUNK_SIZES, both start with STOP, chunk 4 has 642 complete PUSH32 frames with 6 zero padding bytes, and all 36 index entries pointing at chunks 3 and 4 read back byte-identical to script/art/data through the renderer's unframed and framed addressing.

      Deploy FrenArtChunk4 (no arguments, zero value).

      Count bytes of its runtime equal to 0xF2/0xF4/0xFF without skipping PUSH immediates: 234.

      Count them with the protected test's loop (op in 0x60..0x7F skips op-0x5F bytes): 0.

      Expected under the documented admission semantics (README.md line 12): accepted.

      Actual if the live scanner counted raw bytes: launch 2 refused with 'forbidden application opcode'.

      Evidence needed from the service: that the live scanner matches the protected test's PUSH-skipping loop.

    • infoChunk data contracts accept ETH sent to them and have no way to return itsrc/FrenArtChunks.sol:1498

      Access-control inventory note, by design. Each chunk's runtime begins with STOP, so every call, with any calldata and any msg.value, succeeds and returns nothing. There is no receive/fallback revert and no withdrawal path, so ETH sent to a chunk address is unrecoverable.

      Self-harm only: no third party can be made to lose anything, and the chunks hold no roles, storage or privileges. Documented here because it is the only runtime surface the launch 2 contracts expose; no change is required unless the author wants a stray transfer to revert, which would require a different (non-STOP-prefixed) runtime and new code hashes in FrenArtIndex.

      c3 = new FrenArtChunk3().

      (bool ok,) = address(c3).call{value: 1 ether}(''); ok == true and address(c3).balance == 1 ether afterwards; the same for FrenArtChunk4.

      Expected for an inert data contract: either behaviour is acceptable; actual: value is kept permanently.

    • infoADAPTATION.md states a FrenArtChunk3 initcode length that this build does not produceADAPTATION.md:41

      Documentation inaccuracy with a provenance implication. With the toolchain in this tree (Forge 1.8.3, auto-detected solc, via_ir, 200 runs) type(FrenArtChunk3).creationCode.length is 27,878 bytes, not 28,320; FrenArtChunk4's 25,852 matches. The runtime bytes and code hashes are compiler-independent (the constructor returns the literal verbatim) and both figures are far below the 49,152-byte EIP-3860 limit, so deployment is unaffected.

      But the release attestation binds creation-bytecode hashes, and the gas budget in test_LaunchesFitTransactions prices initcode calldata by length, so the launch 2 figures in README.md/ADAPTATION.md (10,084,652 gas) are from a different build than the one in this tree (10,077,470 gas measured now). Whoever attests launch 2 should take the creation bytes from the attested build, not from these documents.

      forge test --match-test test_Launch2ThroughCreate2 with a log of type(FrenArtChunk3).creationCode.length prints 27878 (FrenArtChunk4: 25852). Expected per ADAPTATION.md line 41: 28320. forge test --match-test test_LaunchesFitTransactions -vv prints 'launch 2 gas budget (with code deposit): 10077470' against the documented 10,084,652.

  6. reviewed
    #293Audit flowClaude2 findings
    afterAdapt contract project

    The review is complete. The findings file holds two informational notes and no defects; the working tree is clean apart from it.

    Result: no defect in the launch 2 deliverable. FrenArtChunk3 and FrenArtChunk4 deploy exactly as the repository states, and nothing in their control flow can fail against the protected floor.

    What I verified, independently of the repository's own tests:

    • Bytes and hashes. Deployed through a CREATE2 probe identical to the protected harness, chunk 3 is 23,479 bytes and chunk 4 is 21,187 bytes, with keccak256 and codehash equal to entries 2 and 3 of CHUNK_HASHES. Both start with STOP, and chunk 4 has 642 complete PUSH32 frames plus six zero padding bytes.
    • Art content. All 36 index entries that point into chunks 3 and 4 match the art kit binaries byte for byte after unframing, and chunk 3's art is consumed to its last byte.
    • Constructor control flow. No arguments, nonpayable (a 1 wei CREATE2 reverts), initcode 27,878 and 25,852 bytes under the 49,152 limit, runtime under 24,576, first byte not 0xEF. Calling either contract with any data or value returns nothing. The compiled ABI confirms an argument-free constructor.
    • Admission scan. Both pass the protected opcode scan. Chunk 3 contains zero refused bytes at all; chunk 4 contains 234, all inside PUSH32 data.
    • Gas. The launch 2 model is about 10.08M gas against the 16.78M transaction cap, consistent with my own estimate of the code deposit, creation and calldata charges.
    • Prior launch. Both launch 819 addresses on mainnet carry exactly the hashes in the index, and the repository's fork test passes against a public RPC with chunks 3 to 7 deployed locally.

    The two informational notes, both verification items for the service rather than code changes:

    1. Chunk 4 is the first contract whose admission relies on PUSH skipping. Every chunk launched so far has no refused byte anywhere, so launch 819 proves nothing about how the production scan handles PUSH data. If that scan differs from the protected test's loop, launch 2 is refused with no loss. Confirming the scan before submission removes the risk.
    2. The compiler's runtime artifact never matches the deployed code. The constructor returns the art, so the artifact runtime is a 16-byte stub and runtime-based explorer verification cannot succeed. Sourcify shows no match for the launch 819 chunk today. Creation-bytecode matching and pinning the solc version used for the attested build are the remedy, since initcode length varies by compiler while the deployed hash does not.

    Coverage rows:

    Entry pointStatusReason
    FrenArtChunk3 constructorholdsTraced value check, memory return, size limits, exact runtime and hash
    FrenArtChunk4 constructorholdsSame, plus frame structure and padding
    Chunk 3 and 4 runtime (any call)holdsSTOP at byte 0, returns empty, no state; sent ETH is unrecoverable but only by the sender's own action
    FrenRenderer constructorholdsCode hash loop accepts these two chunks and rejects others or reordering
    FrenRenderer _entry framed pathholdsOffset and frame arithmetic checked for chunk 4; outputs match reference and launch renderer
    FrenRenderer view functionsholdsOutside my area; read-only, no state, covered by reference equality tests

    Not reached: the control-plane admission and deployer code, which are not in this repository, and Slither or Mythril, which are not installed. The scratch tests were deleted after use.

    ran onclaude · claude-fable-5-1 · 32 turns · 7m 24s · 418 in · 29.6K out · 964.7K cached
    submission4fd80628130ad43f1d1b63269a313ca73ce380bc5efee65ace9761ad151017f3
    device8d26cb1a4eaeb75a0132869a676e8ec703334d8c4ae82e3ac062a1569ffe71f9
    started from12072df7196bcece7f85e3f9d3f9551b9c8dcc86
    bundlenone
    applied ond77bb62fc42472810c100591968e0c9615f5420ef0820a9dec32b2785e3a81d2
    changed · 0 filesnothing
    • infoFrenArtChunk4 is the first launched contract whose admission depends on the production scan skipping PUSH data; launch 819 never exercised that pathsrc/FrenArtChunks.sol:1162

      Not a code defect: the chunk is correct and passes the protected scan (.imd/reads/protected/evm_contracts/Contracts.protected.t.sol:44-48, which skips op - 0x5f bytes after every PUSH). It is a verification note for the admission step. FrenArtChunk4's runtime contains 234 bytes equal to 0xF2/0xF4/0xFF (CALLCODE/DELEGATECALL/SELFDESTRUCT), every one of them inside a PUSH32 frame.

      Every chunk deployed so far (FrenArtChunk1 and FrenArtChunk2 at 0xa92dAcfF6d6fcC218ADe20eD24857376BD8eBE81 / 0x9666A481e20F1dB59EEbD6c43D11Ae3505468c92, confirmed on mainnet to carry exactly CHUNK_HASHES[0..1]) and FrenArtChunk3 contain zero such bytes anywhere, so they pass any scan whether or not it skips PUSH data.

      Launch 819 therefore gives no evidence that the control-plane scan (apps/control-plane/src/launch/admission.ts, not in this repository) implements the same PUSH-skipping as the protected test. If that scan is a plain byte scan, or skips PUSH data differently, launch 2 is rejected at admission (no funds at risk; the launch simply does not happen).

      Evidence needed before submitting launch 2: confirm the production admission scan is byte-for-byte the protected test's loop (start at offset 0, STOP at byte 0 is not a PUSH, j += op - 0x5f; continue). Chunk 7 in launch 3 (23 such bytes, all framed) depends on the same property.

      forge test: deploy new FrenArtChunk4() and read .code (21,187 bytes).

      Count bytes in {0xf2,0xf4,0xff} without PUSH skipping: 234.

      Run the protected loop from Contracts.protected.t.sol:44-48: 0 hits.

      Repeat for FrenArtChunk1/2/3/5/6: 0 and 0 (no dependence on PUSH skipping).

      Expected for launch 2 to be admitted: the production scan reports 0 for chunk 4.

      Actual if the production scan does not skip PUSH data: 234 hits, launch 2 refused.

      The unframed art of chunk 4 (strip the STOP byte, then drop every 33rd byte starting at offset 1) scanned as a plain code blob also yields 234 hits, which is why the generator framed it.

    • infoCompiled runtime artifact (16 bytes) never matches the deployed code of FrenArtChunk3/4; explorer and runtime-hash verification need creation-bytecode matchingsrc/FrenArtChunks.sol:1155

      By design the constructor returns the art literal as the contract's code, so solc's deployedBytecode for FrenArtChunk3 and FrenArtChunk4 is the 16-byte revert stub 0x5f80fdfea164736f6c6343000825000a (with solc 0.8.37, the version auto-detected here), while the deployed code is 23,479 and 21,187 bytes with hashes d73ecfd9…c9a8 and 54bd89d9…1a49b.

      The deployed code and its hash are compiler-independent (verified: the same hashes with the auto-detected 0.8.37 as FrenArtIndex records), but the creation bytecode is not: FrenArtChunk3's initcode is 27,878 bytes with solc 0.8.37 and 28,320 bytes with the compiler used in ADAPTATION.md, so the CREATE2 address prediction and the attestation's creation-bytecode hash are only reproducible with the exact solc the verifier used (foundry.toml has auto_detect_solc = true with pragma ^0.8.26).

      Consequences to plan for, none of which block deployment: (1) any service step that compares the artifact's runtime hash to on-chain code will report a mismatch for these two contracts; (2) standard explorer verification compares runtime bytecode and will not verify them; Sourcify reports match: null for the launch-819 chunk at 0xa92dAcfF6d6fcC218ADe20eD24857376BD8eBE81 today.

      Evidence/handling needed: verify by creation-bytecode match (Sourcify creationMatch with the factory's creation transaction, or Etherscan's creation-input verification) and pin the solc version used for the attested build. The protected floor itself is unaffected since it deploys the initcode and reads the real code.

      forge build then compare out/FrenArtChunks.sol/FrenArtChunk3.json deployedBytecode.object (0x5f80fdfea164736f6c6343000825000a, 16 bytes) with the code of a deployed FrenArtChunk3 (23,479 bytes, keccak256 d73ecfd95e853d3bf20224d02e30889477ac2627bc1970c5e6b0ca5ef202c9a8).

      Expected by a runtime-bytecode verifier: equal.

      Actual: different in length and content. type(FrenArtChunk3).creationCode.length is 27,878 under solc 0.8.37 versus 28,320 reported in ADAPTATION.md under another solc, while keccak256(deployed.code) is identical under both.

  7. reviewed
    #1929Audit economicsClaude2 findings
    afterAdapt contract project

    The review is complete. Findings are in .imd-findings.json, and nothing else in the tree was changed.

    Outcome: no economic, invariant, or flow-gap defect in FrenArtChunk3 or FrenArtChunk4. The two data contracts hold no value flows, no state, and no dependencies, and their bytes are exactly what the index and the art kit require. Two informational notes are recorded.

    What I verified

    • Every hex literal in src/FrenArtChunks.sol was parsed independently and hashed with cast keccak. All seven runtime hashes and sizes match the index. Each runtime starts with the STOP byte.
    • All 70 index entries were decoded and compared byte for byte against the art kit layer and palette binaries. They match, and they tile every chunk's art with no gaps. Chunk 3 holds faces 25 to 36. Chunk 4 holds faces 37 and 38, the coats, hats, items, and the first two backgrounds.
    • Chunk 4's framing is complete: 642 PUSH32 frames with six zero pad bytes. The renderer's framed bounds check equals the code length exactly at the last chunk 4 entry, so the boundary holds.
    • The admission scan was re-run over both the runtime and the creation code of chunks 3 and 4, with zero hits. Chunk 3 has no raw forbidden bytes at all. Chunk 4 has 234, all hidden inside frames, so its admission depends on the scanner skipping PUSH data as the protected test does.
    • On mainnet, the launch 819 addresses hold code whose hashes match the index for chunks 1 and 2. The fork test also passed against a public RPC.
    • A CREATE2 rehearsal metered the launch 2 pair at roughly 10M gas including code deposit, well under the transaction cap. Both constructors are nonpayable with no arguments.

    Informational notes recorded

    • The chunks accept and permanently strand any ETH sent to them, since a plain call hits STOP and succeeds. This is self-harm only and matches the launch renderer's own pointers, so it is a trust property to document, not a defect.
    • The README names a mainnet frens contract address that currently has no code, nonce, or balance. This does not touch the chunks but the judge should not assume the frens exist when weighing the launch 3 hand-off.

    Not reached: the production factory, control-plane scanner, and launch policy are outside the repository, so the protected test served as the reference for both. Chunks 1, 2, 5, 6, and 7 were hash and index verified only.

    ran onclaude · claude-fable-5-1 · 24 turns · 7m 51s · 354 in · 25.5K out · 929.2K cached
    submissione86f67a719054b656968d4d76b3412a731f7460a3514310eec59e60f21ea0206
    device8c9c4986ca881107d7876eb769dd6d86d2c20f3ed36edf1d61d01e4679622637
    started from12072df7196bcece7f85e3f9d3f9551b9c8dcc86
    bundlenone
    applied ond77bb62fc42472810c100591968e0c9615f5420ef0820a9dec32b2785e3a81d2
    changed · 0 filesnothing
    • infoFrenArtChunk3 and FrenArtChunk4 accept and permanently strand any ETH sent to themsrc/FrenArtChunks.sol:784

      Each chunk's runtime code is a STOP byte followed by art, so a plain CALL with value succeeds (STOP, no revert) and the ETH is credited to the chunk. The contracts have no functions, no owner and no SELFDESTRUCT (forbidden by admission), so value sent there can never be moved again.

      The only loser is the sender (self-harm), the launch sends zero ETH, and the behaviour is identical to the SSTORE2-style pointers of the launch renderer (test/ref/FrenRendererRef.sol), so this is a documented trust property rather than a defect: README's 'Calling it does nothing' is accurate, but 'and keeps any ETH sent' would be more precise. No change to the generated art contracts is recommended; the renderer only accepts these exact code hashes.

      Area: Economic Security (value flows / sentinel-like addresses), Invariant (no withdrawal path for any balance).

      Deploy FrenArtChunk3 (any way, e.g. address a = address(new FrenArtChunk3());).

      Then (bool ok,) = a.call{value: 1 ether}("");.

      Expected for a pure data contract: either revert or a documented sink.

      Actual (measured in a Foundry scratch test on this tree): ok == true, a.balance == 1 ether, and there is no code path on the chunk that can send it anywhere.

      Same for FrenArtChunk4.

    • infoREADME names an IMD6900Frens mainnet address that currently has no codeREADME.md:25

      The README states that the frens contract exists on Ethereum at 0x69004fEd3d8a34FFA952d15A128f74D8340fa79d and that its owner will point it at this renderer after launch 3. On Ethereum mainnet at block ~26,135,373 (public RPC https://ethereum-rpc.publicnode.com) that address has no code, nonce 0 and zero balance.

      This does not affect FrenArtChunk3/FrenArtChunk4 (they carry no reference to it) and may simply mean the frens have not launched yet or the address is a planned CREATE2 address, but the statement as written is not verifiable today and the judge should not take the frens' existence as given when assessing launch 3's hand-off. Outside the assigned area; reported because the flow-gap guide asks for stated-purpose claims that the chain does not currently support.

      cast code 0x69004fEd3d8a34FFA952d15A128f74D8340fa79d --rpc-url https://ethereum-rpc.publicnode.com -> 0x (expected: non-empty runtime). cast nonce -> 0, cast balance -> 0. By contrast the launch 819 chunk addresses in test/OnChainChunks.fork.t.sol do have code whose keccak256 matches FrenArtIndex.CHUNK_HASHES[0..1] (0xf86a2dec... and 0x8579d215...).

  8. reviewed
    #1294Audit mathClaudeno findings
    afterAdapt contract project

    Result: no defects found in the Math Precision, Boundary or Numerical Gap area for launch 2. The findings file at .imd-findings.json holds {"findings":[]}. The scratch harness I used lives under test/scratch/ and touches nothing else.

    What I verified, with concrete numbers

    • Bytes and hashes. Keccak of the hex literals in the source for FrenArtChunk3 and FrenArtChunk4 equals the index's third and fourth entries. On-chain code size after deployment is 23,479 and 21,187 bytes, matching the declared sizes and the EIP-170 cap of 24,576. Initcode is 28,320 and 25,852 bytes, under 49,152.
    • Index arithmetic for the 36 entries in these two chunks. Every offset and length is a 16-bit value, every entry ends inside its chunk, and chunk 3's last entry and chunk 4's last entry end exactly at their code length. Decoding each entry, through the renderer's own read path and independently in Python, reproduces the art kit binaries byte for byte.
    • Framed read arithmetic for chunk 4. The frame count formula gives 642 frames and 6 zero padding bytes, which is what the code contains. The flat buffer is always at least offset-within-frame plus length, so the final copy cannot over-read. The bound check is tight: truncating chunk 4's code by one byte makes the last entry revert with the Missing error, and the untouched code reads it cleanly.
    • Admission scan. Both chunks pass the protected scan with zero hits. Chunk 3 contains no 0xF2, 0xF4 or 0xFF byte at all, so it does not depend on PUSH skipping. Chunk 4's 234 refused bytes all sit inside PUSH32 data.
    • Launch 2 gas boundary. The budget of 10,084,652 gas, including the 8,933,200 code deposit, sits under 95 percent of the 2^24 transaction cap. Memory expansion and calldata floor costs do not change this.
    • Renderer trait math that touches these chunks. Face, coat, hat, item and background indices stay inside the 70-entry index and the 29-byte colour table for every combo the guards admit.

    Coverage rows

    Entry pointStatusReason
    FrenArtChunk3 constructorholdsArgument-free, returns the literal; deployed bytes and hash verified
    FrenArtChunk4 constructorholdsSame; framing complete, 642 frames, padding correct
    FrenArtChunk3 / 4 runtime call (any calldata)holdsLeading STOP, returns nothing, tested with empty and ERC-20-shaped calldata
    FrenRenderer constructor hash checkholdsRejects reordered or wrong chunks; codehash compare is exact
    Renderer _entry unframed and framed pathsholdsEvery entry in chunks 3 and 4 round-trips; boundary tight at both chunk ends
    Test gas budget for launch 2holdsDeposit, creation, initcode-word and calldata terms correct; cap is 2^24
    Deployed launch #819 chunks on mainnetunreachedNo RPC available; fork test skipped

    One trust note, not a defect. The chunk runtime is a bare STOP, so ETH sent to a chunk address is accepted and unrecoverable. This is inherent to any data contract and has no code path to fix.

    ran onclaude · claude-fable-5-1 · 23 turns · 11m 36s · 354 in · 17.8K out · 906.3K cached
    submissionbcb5f09055980070a24ad778001fedfbdd460de85449866439b1091294d54174
    device723b11f958c65250254927fb63b68c61a0eb28311bd17fb1121a3cd9194b674d
    started from12072df7196bcece7f85e3f9d3f9551b9c8dcc86
    bundlenone
    applied ond77bb62fc42472810c100591968e0c9615f5420ef0820a9dec32b2785e3a81d2
    changed · 0 filesnothing
  9. tested
    #901Write foundry testsCodex2 files changed
    afterAdapt contract project
    writes to
    testtest/**

    Added tests under test/ covering exact art bytes, framing, deployment failures, corrupted-chunk rejection, and ETH/code invariants.

    Validation passed:

    • forge build --offline
    • forge test --offline: 27 passed, 0 failed; existing RPC-dependent test skipped.
    • Invariants: 16,384 randomized calls.

    No defects found. Only test/ changed.

    ran oncodex · gpt-6-astra · 6 turns · 7m 39s · 63.7K in · 12.6K out · 753.9K cached
    submissionb78839171a74ec80eef03f8fcfd1f792428a508f79f87e7f3920782c31caff4d
    device0e53ef0bd01824cb86a7032c8db58a38c34645f8113159a321a6900d3042f35a
    started from12072df7196bcece7f85e3f9d3f9551b9c8dcc86
    bundle1f56d6a8cc039aa82ce1dc35bde92372709004bf09163d99b30aeadc2c778bb8 · 12 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    applied ond77bb62fc42472810c100591968e0c9615f5420ef0820a9dec32b2785e3a81d2
    changed · 2 files
    test/FrenArtLaunch2.invariant.t.soltest/FrenArtLaunch2.t.sol
  10. reviewed
    #1735Audit judgeClaude4 findings
    afterAdapt contract project, Write foundry tests, Manifest, Audit math, Audit permissions, Audit economics, Audit flow

    The review is complete. The findings file holds four informational findings and no defects that would open a revision.

    What I verified against the code

    • Both chunks' parsed literals hash to the index entries. Chunk 3 is 23,479 bytes with hash d73ecfd9…c9a8 and chunk 4 is 21,187 bytes with hash 54bd89d9…1a49b, both starting with STOP. Chunk 4 has 642 complete PUSH32 frames.
    • The full suite passes, including the CREATE2 rehearsal, the admission scan, the nonpayable constructor checks and the renderer's unframed reads of every launch-2 layer.
    • The launch manifest lists FrenArtChunk3 then FrenArtChunk4 with no arguments, as the brief requires.

    Specialist findings, settled

    • Kept and merged into one: chunk 4 carries 234 raw CALLCODE/DELEGATECALL/SELFDESTRUCT bytes that only PUSH-skipping scans hide. All earlier admitted chunks have zero such bytes, so launch 819 proves nothing about the production scanner. This is a verification gap for the admission service, not a code defect.
    • Kept and merged into one: both chunks accept and permanently keep any ETH sent after deployment. Self-harm only, by design of a STOP-prefixed runtime.
    • Kept: the compiled runtime artifact is a 16-byte stub that never matches the deployed code, so explorer or runtime-hash verification needs creation-bytecode matching.
    • Kept: the frens address in the README has no code and nonce 0 on mainnet at block 26,135,430.
    • Dropped: the claim that ADAPTATION.md states a wrong initcode length. In this tree the auto-detected solc is 0.8.26, the initcode is 28,320 bytes and the launch-2 budget is 10,084,652 gas, both matching the documents. The specialist measured under a different solc, which I noted inside the artifact finding instead.

    My own pass found nothing further. The two contracts have no storage, roles, callbacks or executable code beyond STOP, the runtime and initcode sizes are within EIP-170 and EIP-3860, and the renderer's framed addressing recovers every chunk-4 layer byte-identically.

    The scratch test I used for the ETH check was removed, so only the findings file differs from the tree.

    ran onclaude · claude-fable-5-1 · 11 turns · 4m 35s · 322 in · 11.5K out · 665.6K cached
    submissiona2e278745bde897f04a486b514b007b5ff1ba63a071857fde08d67b93007450c
    device8eebc53449bafe7b397089b5f80fd78e8c3946053d839f59fbbed07bfdc1f975
    started from27f6c85b5bfa95adac9ba87c277f3cb7bc2013eb
    bundlenone
    applied ond77bb62fc42472810c100591968e0c9615f5420ef0820a9dec32b2785e3a81d2, 1f56d6a8cc039aa82ce1dc35bde92372709004bf09163d99b30aeadc2c778bb8, 04ec66b5eda58aea7041e0d928a46b45db01f24040e376f82564c41d8c0cd7fe
    changed · 0 filesnothing
    • infoFrenArtChunk4 is the first launched contract whose admission depends on the scanner skipping PUSH immediates (merged: audit_permissions + audit_flow)src/FrenArtChunks.sol:1162

      Not a code defect; a verification gap for the admission step. FrenArtChunk4's 21,187-byte runtime holds 234 raw bytes equal to 0xF2 (CALLCODE), 0xF4 (DELEGATECALL) or 0xFF (SELFDESTRUCT).

      Every one sits inside a PUSH32 frame (STOP at byte 0, then 642 frames of 0x7F + 32 bytes, 6 zero padding bytes at the end), so the protected scan (.imd/reads/protected/evm_contracts/Contracts.protected.t.sol lines 44-48, which does j += op - 0x5f after any PUSH) and test_ChunksPassTheAdmissionScan both report 0 hits.

      All chunks admitted so far (launch #819: FrenArtChunk1 at 0xa92dAcfF6d6fcC218ADe20eD24857376BD8eBE81 and FrenArtChunk2 at 0x9666A481e20F1dB59EEbD6c43D11Ae3505468c92, whose on-chain code hashes equal CHUNK_HASHES[0] and [1]) and FrenArtChunk3 contain zero such bytes anywhere, so launch #819 is not evidence that the production scanner in apps/control-plane/src/launch/admission.ts (not in this tree) skips PUSH data the same way.

      If it counts raw bytes, launch 2 is refused at admission; no funds are at risk and the chunk cannot be changed (the renderer only accepts hash 54bd89d9…1a49b). Chunk 7 in launch 3 (23 framed forbidden bytes) depends on the same property. Evidence needed before submission: confirmation that the production scan equals the protected test's loop.

      Parse FrenArtChunk4's hex literal (src/FrenArtChunks.sol lines 1165-1496) or deploy new FrenArtChunk4() and read .code: length 21187, keccak256 0x54bd89d96a8e4b1a1530687bb8442321920166014b5b7a89a414bae379f1a49b = FrenArtIndex.CHUNK_HASHES[3].

      Count bytes in {0xf2,0xf4,0xff} with a plain byte scan: 234.

      Run the protected loop (skip op-0x5f bytes after any 0x60..0x7f): 0.

      Same two counts for FrenArtChunk1/2/3/5/6: 0 and 0; FrenArtChunk7: 23 and 0.

      Expected for admission under README.md line 12-15 semantics: 0 hits, accepted.

      Actual under a raw byte scan: 234 hits, launch 2 refused.

    • infoChunk data contracts accept ETH sent to them and have no way to return it (merged: audit_permissions + audit_economics)src/FrenArtChunks.sol:1498

      By design and self-harm only. Each chunk's runtime is a STOP byte followed by art, so any CALL with any calldata and any msg.value succeeds and returns nothing. There is no receive/fallback revert, no owner, no SELFDESTRUCT (forbidden by admission), so ETH sent to FrenArtChunk3 or FrenArtChunk4 after deployment is unrecoverable.

      The constructors themselves are nonpayable (test_ConstructorsRejectOneWeiAndMaximumValue) and the launch sends zero ETH, so deployment is unaffected. No third party can be made to lose anything. Documented as the only runtime surface these contracts expose; changing it would require a non-STOP-prefixed runtime and new code hashes in FrenArtIndex, which the task forbids.

      README.md line 6 ('calling it does nothing') could add 'and keeps any ETH sent'.

      Foundry test on this tree: address c3 = address(new FrenArtChunk3()); (bool ok,) = c3.call{value: 1 ether}(""); gives ok == true and c3.balance == 1 ether; address(new FrenArtChunk4()).call{value: 1 ether}(hex"f2f4ff") likewise succeeds and the balance stays. Expected for an inert data contract: either revert or documented sink; actual: value is kept permanently with no code path that can move it.

    • infoCompiled runtime artifact (16 bytes) never matches the deployed code of FrenArtChunk3/4; runtime-bytecode verification must use creation-bytecode matchingsrc/FrenArtChunks.sol:1155

      By design the constructor returns the art literal as the contract's code, so the solc artifact's deployedBytecode for FrenArtChunk3 and FrenArtChunk4 is a 16-byte revert stub (0x5f80fdfea164736f6c634300081a000a with the solc 0.8.26 auto-detected in this tree), while the deployed code is 23,479 and 21,187 bytes with hashes d73ecfd9…c9a8 and 54bd89d9…1a49b.

      Any service or explorer step that compares the artifact's runtime bytecode to on-chain code will report a mismatch for these two contracts; the protected floor is unaffected since it deploys the initcode and reads the real code.

      The creation bytecode, which the release attestation binds, depends on the compiler that foundry.toml auto-detects: here solc 0.8.26 gives 28,320 and 25,852 bytes, matching ADAPTATION.md line 41 and the 10,084,652-gas launch 2 budget in README.md; a worker with a different solc installed produces different initcode bytes and a different CREATE2 address.

      The audit_permissions finding that ADAPTATION.md states a wrong initcode length did not reproduce in this tree (it was measured under another solc) and is dropped.

      Handling needed: pin or record the solc used for the attested build and verify by creation-bytecode match.

      forge build (solc 0.8.26 auto-detected here), then compare out/FrenArtChunks.sol/FrenArtChunk3.json deployedBytecode.object (0x5f80fdfea164736f6c634300081a000a, 16 bytes) with the code of a deployed FrenArtChunk3 (23,479 bytes, keccak256 0xd73ecfd95e853d3bf20224d02e30889477ac2627bc1970c5e6b0ca5ef202c9a8, verified with cast keccak over the parsed literal). Expected by a runtime-bytecode verifier: equal; actual: different in length and content. bytecode.object lengths: 28,320 (chunk 3) and 25,852 (chunk 4).

    • infoREADME names an IMD6900Frens mainnet address that currently has no codeREADME.md:25

      The README states the frens contract exists at this address and that its owner will point it at this renderer after launch 3. On Ethereum mainnet at block 26,135,430 the address has no code and nonce 0. This does not affect FrenArtChunk3/FrenArtChunk4 (they reference nothing) and may mean the frens have not launched yet or the address is a planned CREATE2 address, but the statement is not verifiable today and the hand-off described for launch 3 should not be taken as given.

      By contrast the launch #819 chunk addresses in test/OnChainChunks.fork.t.sol do have code whose keccak256 equals CHUNK_HASHES[0] and [1].

      cast code 0x69004fEd3d8a34FFA952d15A128f74D8340fa79d --rpc-url https://ethereum-rpc.publicnode.com returns 0x (expected: non-empty runtime); cast nonce returns 0; block number 26,135,430 at the time of the check. cast code 0xa92dAcfF6d6fcC218ADe20eD24857376BD8eBE81 | cast keccak returns 0xf86a2dec…2d4b = CHUNK_HASHES[0].

  11. publishedidentity-md-launches/launch-838-frenartchunk3-frenartchunk4pull request
  12. deployed
    2 contractson Ethereum mainnet, 7 gates passedtransaction
    rebuilt
    FrenArtChunk1, FrenArtChunk2, FrenArtChunk3, FrenArtChunk4, FrenArtChunk5, FrenArtChunk6, FrenArtChunk7, FrenArtIndex, FrenRenderer · verifier 0.1.0 · solc unpinned
    gates
    • provenance
    • findings
    • independent review
    • bytecode
    • manifest
    • protected invariants
    • economics
    proof
    commit, attestation, manifest, tree, per-contract hashes
    repository
    identity-md-launches/launch-838-frenartchunk3-frenartchunk4
    commit
    f08a27d485817a30518db496d69efeb50b8bfe82
    attestation
    969eabf8fa5817e37048f4ed6a3456b2fac0b6c842f2739a021137059dadb86a
    manifest
    c62401bf992b91160a169b3c02d425001093faeac682020ab2a6ae8e1e5c084e
    tree
    e34ecf22b560cf11905333a85376b609cc9fc524
    compiler
    solc unpinned, optimizer 200 runs, via-ir, reproducible
    contract
    FrenArtChunk1
    src/FrenArtChunks.sol · 27486 bytes
    creation 729821e73b35064ed0cb4da09e740fbffd7ca6a734bc779f59ce1333f1c1a580
    abi 1e90eefefaeba067a5e749fdd3af24bf8c517866647734a05547698d1a76bc8f
    metadata 2dea793995f0cc783645a1b9e1830054593f324e8d6459cde79a6a2bb125e05a
    contract
    FrenArtChunk2
    src/FrenArtChunks.sol · 28867 bytes
    creation 10998c2c4a6d870f01198d0d9d1a438e4e6afaad8834ab9733f7eda10146c906
    abi 1e90eefefaeba067a5e749fdd3af24bf8c517866647734a05547698d1a76bc8f
    metadata 34082d76056fd4258645ea6a05ca1af7d0a914443b4983aea392e79cbfe06c03
    contract
    FrenArtChunk3
    src/FrenArtChunks.sol · 27878 bytes
    creation 41588467026c9f07e11445fb4aa20b78f8baca9424eae2c8359d788087759891
    abi 1e90eefefaeba067a5e749fdd3af24bf8c517866647734a05547698d1a76bc8f
    metadata 074a506d28b295de9cc4fa808a04267f6d88065ebd777577c3cf037413345b90
    onchain at 0x71bd…2356, block 26,135,458 · creation code matches
    contract
    FrenArtChunk4
    src/FrenArtChunks.sol · 25852 bytes
    creation 698bced6fb14139a4da5259b3c8e44c0419d8f96a1ad804d5b64f97c1e48f9d9
    abi 1e90eefefaeba067a5e749fdd3af24bf8c517866647734a05547698d1a76bc8f
    metadata 0112cfb5a03e4eed69fe0f4539b60a29b4aa2252e26c8b890c84dbaafd17f128
    onchain at 0x0c34…6b4d, block 26,135,458 · creation code matches
    contract
    FrenArtChunk5
    src/FrenArtChunks.sol · 23405 bytes
    creation 37af23441ef04907c3c995c774c3f3668fa182b75245c6f52809c21c9fb28e01
    abi 1e90eefefaeba067a5e749fdd3af24bf8c517866647734a05547698d1a76bc8f
    metadata 2adc4ac5cf0c15f5a3e3911a554f1ece7a1e7b107010ca539fc3ea7a41e552b1
    contract
    FrenArtChunk6
    src/FrenArtChunks.sol · 25777 bytes
    creation 21f5440e8927ac179debe639d50111437c220ecebfca0eb695248f59778de5d0
    abi 1e90eefefaeba067a5e749fdd3af24bf8c517866647734a05547698d1a76bc8f
    metadata 4f3be644799c02eb98c4a51388d066b4424c30020aa7313e420c4ee339ac4a9e
    contract
    FrenArtChunk7
    src/FrenArtChunks.sol · 10636 bytes
    creation 51e1187fb315d78ad80c188555ed3ee79ff329af1b24d55827e5236e47e8362f
    abi 1e90eefefaeba067a5e749fdd3af24bf8c517866647734a05547698d1a76bc8f
    metadata 733a4d1e17a9183b48bc70f8ed6a10b5bae363d726d5eef9d066a9f8fd31c7dc
    contract
    FrenArtIndex
    src/FrenArtIndex.sol · 44 bytes
    creation 692e2b99d5a31673a4a7721a4513e3d0fd58bb386623911f12df06b6e3acbc12
    abi 518674ab2b227e5f11e9084f615d57663cde47bce1ba168b4c19c7ee22a73d70
    metadata 111e31ab376f99070b585057a0daba65d4059b5e59896ed65c635dddba0f16c2
    contract
    FrenRenderer
    src/FrenRenderer.sol · 13643 bytes
    creation fe94bdd19d8602f123c2aa554ab294652f290f0b3137e21ad14b3228244053fa
    abi 50d31b8a6f31f3824b13925ee1110c9a3a09eca427a3b108b7d5d490711ed27c
    metadata f904b2a2c8ff9b6564f5c879204c019828de6ea8f44998c263c510fde98ef9f5
  13. onchain
    1 receipt, 9 scoreson Ethereum mainnet
    receipt
    work accepted · transaction · record
    scores
    9 scores for built, reviewed, integrated, tested on checks, submission · all 9 passed · block 26,135,512 · transaction#806#1929#293#372#1735#1294#1401#592#901