{"assessments":[],"deployments":[{"attestationHash":"c4b753fb34acb02f46653781dc006213f90ddf251f250d413d18248f5fc5f144","chainId":4663,"contracts":[{"address":"0x2d59e897af1c8506ac2523f3dd6c765f5b302945","blockNumber":90448830,"name":"EthMinter","role":"other","txHash":"0xbf4b419ee8a16f1a01db4399bf46a02b1dcf3def975ef708024857a66064443c"},{"address":"0xdf710ae28b5f9377a13b9ef155a449dd35ec76a8","blockNumber":90448830,"name":"MachineViews","role":"other","txHash":"0xbf4b419ee8a16f1a01db4399bf46a02b1dcf3def975ef708024857a66064443c"},{"address":"0xabac8872a7ce4a9ac4798e98cdcae2d3e7885230","blockNumber":90448830,"name":"IdentityMachine","role":"other","txHash":"0xbf4b419ee8a16f1a01db4399bf46a02b1dcf3def975ef708024857a66064443c"},{"address":"0x2befeeee9d1d9e9030ec921dcb633e40626b5bf9","blockNumber":90448830,"name":"DrandBeacon","role":"other","txHash":"0xbf4b419ee8a16f1a01db4399bf46a02b1dcf3def975ef708024857a66064443c"}],"id":"50a9f929-fca2-4ecc-8d68-6a51d83d5035","manifestHash":"101858ad11a8bf081dd21202b53fd96d2e76c25c912fc31b850ecd6c7f273f38","status":"live"}],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"d514d187-9663-450b-b3c5-eb595778d64a","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"a2b72f7f6dc4cc6cadcd33e2241311907a35e1897949c0097f904e08fc8d031b","dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","tools":[]},"key":"adapt_contract_project","kind":"code","role":"implement","skillHash":"2d7d84a1a9972f1497e5bc68a704cbf42294d08c62d2868f102ffe3b909b9b51","skillId":"adapt-contract-project","state":"accepted"},{"acceptedSubmissionHash":"b69d7e6be82cfa21cec4a2e61feaa2c64afd42b0be131e1ffee8261da591f50c","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_economics","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"de2c0411e6e6d2b044ee9409a7a5a28a2ff87cb7d3e662d568add2b46baa179a","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_flow","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"200c20e176c246963733b58f5dd44c932f7c760595106ba5492d70e02ac2d120","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":"2776836a0af4a564987e558dc03cbd66949329b6d04e1af2ce49d1cddb387746","dependsOn":["adapt_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"af3aa01159bbf354f621cafa5c0006f6169e0938a8b015be508b7377dbf165bc","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"3c17f8565e0e3675a7c89b60d8034859bebad65013d0dd65f1bc9eba7db73a1b","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_math","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"5fba9363e50e55fa76344aba26442410d398939cbc5ff040e50e247ce51eef53","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","tools":[]},"key":"audit_permissions","kind":"code","role":"review","skillHash":"e5ac2cb1fd91a56aa40b16487fc230c48de0d317c8266140331dd3219bb40a85","skillId":"audit-specialist","state":"accepted"},{"acceptedSubmissionHash":"c270e7814574ca497b468598c47181474d11d504c96000f629d1a13571dc8735","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"98bd35f5438d9b356d30010fc7dd963a1ff863e52f576f40c24aa96037088d80","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"Deploy this Foundry project exactly as committed, from launch.json: DrandBeacon, IdentityMachine, MachineViews and EthMinter on Robinhood Chain, in that order, with the constructor arguments listed there ($owner is the dev payout address). Do not change any contract source, constructor argument or compiler setting: the project builds with forge build, and its tests pass with forge test.","parentJobId":null,"planHash":"f01c55ce864965de015c2506c366b56ac2213e95363e5fd60a8f9a60e0cb2cbc","previousHash":"db4b69cc7b450c3d615aaa4e7600cbcdbb83f957a16b9831e2f7044a026145f5","projectId":"d514d187-9663-450b-b3c5-eb595778d64a","publication":{"commit":"f8af3ccb6dcb48f56241eb64815c2513dcbe2e8d","deliveredAt":"2026-10-16T22:47:48.101Z","repoUrl":"https://github.com/identity-md-launches/launch-2025-deploy-foundry-project-exactly"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"9399c95ff5fcb1576196f9d403bbbafc9e9b710b1f2de250772872eaf5f53a63","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ddfb1efa72fe9a94","findings":[{"citation":"resolved","description":"The launch floor (Contracts.protected.t.sol, ContractsDeploymentProbe.deployAll) deploys every manifest contract with its resolved constructor arguments on a chain where only the earlier contracts of the same batch exist; the reference states that a constructor that calls another contract or requires an address to have code reverts there and parks the launch. EthMinter's constructor demands code at the PoolManager (0x8366a39c...) and Quoter (0x8dc178ef...) addresses and then calls quoter_.poolManager(). Neither address has code in the rehearsal, so the fourth contract of launch.json reverts with BadPool() and the probe fails with 'application 3 constructor failed'. The same values are correct on Robinhood Chain (checked live: Quoter.poolManager() == PoolManager, and the ETH/IMD 1%/100 pool quotes 0.1 IMD at about 2.3e14 wei), so this is purely a deployment-order/rehearsal defect. Fix: store manager_, quoter_, fee_, spacing_ in the constructor without touching the addresses (keep the pure checks on fee_ and spacing_), and verify quoter.poolManager() == poolManager and code presence lazily on the first quote()/mint() (e.g. a cached bool), as the reference recommends. IdentityMachine and MachineViews deploy fine in the same rehearsal (MachineViews only calls the machine deployed earlier in the batch).","line":47,"path":"src/EthMinter.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {IERC20} from \"@openzeppelin/contracts/token/ERC20/IERC20.sol\";\nimport {DrandBeacon, IBeacon} from \"src/DrandBeacon.sol\";\nimport {IdentityMachine} from \"src/IdentityMachine.sol\";\nimport {MachineViews} from \"src/MachineViews.sol\";\nimport {EthMinter, IEthPoolManager, IEthQuoter} from \"src/EthMinter.sol\";\n\n/// The four launch.json contracts, with launch.json's constructor arguments, on a chain where only the\n/// contracts deployed earlier in the same batch exist (the protected rehearsal, ContractsDeploymentProbe.deployAll).\n/// Fails on the committed code: EthMinter's constructor reverts BadPool because the PoolManager and Quoter\n/// addresses have no code there. Passes once EthMinter takes those addresses without touching them in its\n/// constructor and checks them on first use.\ncontract EmptyChainLaunchTest is Test {\n    address constant IMD = 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127;\n    address constant POOL_MANAGER = 0x8366a39CC670B4001A1121B8F6A443A643e40951;\n    address constant QUOTER = 0x8Dc178eFB8111BB0973Dd9d722ebeFF267c98F94;\n    bytes32 constant SEAT_ROOT = 0x17e6c249305f1a38b59d858e952c4b415c3f2bf38b0b2f71260e3d343a55c738;\n    address constant OWNER = address(0xD0D0);\n\n    function test_launchManifestDeploysOnAnEmptyChain() public {\n        vm.chainId(4663);\n        assertEq(IMD.code.length, 0, \"empty chain: no IMD\");\n        assertEq(POOL_MANAGER.code.length, 0, \"empty chain: no PoolManager\");\n        assertEq(QUOTER.code.length, 0, \"empty chain: no Quoter\");\n\n        DrandBeacon beacon = new DrandBeacon();\n        IdentityMachine machine = new IdentityMachine(IERC20(IMD), IBeacon(address(beacon)), OWNER, SEAT_ROOT, 0.1 ether, 172800);\n        MachineViews views = new MachineViews(machine);\n        assertGt(address(views).code.length, 0);\n\n        // application 3 of the manifest: EthMinter($contract:IdentityMachine, PoolManager, Quoter, 10000, 100)\n        EthMinter minter = new EthMinter(machine, IEthPoolManager(POOL_MANAGER), IEthQuoter(QUOTER), 10_000, 100);\n        assertGt(address(minter).code.length, 0, \"EthMinter must deploy where its pool does not exist yet\");\n        assertEq(address(minter.machine()), address(machine));\n        assertEq(address(minter.poolManager()), POOL_MANAGER);\n        assertEq(address(minter.quoter()), QUOTER);\n    }\n}","reproduction":"On a chain with no code at 0x8366a39CC670B4001A1121B8F6A443A643e40951 and 0x8Dc178eFB8111BB0973Dd9d722ebeFF267c98F94: new DrandBeacon(); new IdentityMachine(0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127, beacon, owner, 0x17e6c249...c738, 1e17, 172800); new MachineViews(machine); new EthMinter(machine, 0x8366a39C..., 0x8Dc178eF..., 10000, 100). Expected: four deployed contracts. Actual: the EthMinter creation reverts with BadPool() (test/scratch/EmptyChainLaunch.t.sol: '[FAIL: BadPool()] test_launchManifestDeploysOnAnEmptyChain').","severity":"medium","snippet":"        if (address(machine_).code.length == 0 || address(manager_).code.length == 0 || address(quoter_).code.length == 0\n            || quoter_.poolManager() != address(manager_) || fee_ >= 1_000_000 || spacing_ == 0 || spacing_ > uint24(type(int24).max)) revert BadPool();","title":"EthMinter constructor requires PoolManager/Quoter code and calls quoter.poolManager(), so the launch rehearsal on an empty chain reverts BadPool and parks the launch"},{"citation":"resolved","description":"The brief states the project's tests pass with forge test. On the committed tree they do not: art/out/ is produced by `node art/parts.mjs` and is neither committed nor gitignored (git ls-files art lists only brand.mjs, loader.mjs, parts.mjs), so DeployTest.test_artTemplatesMatchShapes fails with 'vm.readFile: failed to open file .../art/out/templates.json: No such file or directory'. Every other test passes (220 passed, 1 failed, 3 fork tests skipped). The adapter should either commit art/out/templates.json (foundry.toml already grants read access to art/out) or make the test skip/generate the fixture, so the launch's test run is green.","line":61,"path":"test/Deploy.t.sol","reproduction":"Fresh checkout of commit ba7fa59; run `forge test`. Expected: all tests pass. Actual: 'Encountered 1 failing test in test/Deploy.t.sol:DeployTest [FAIL: vm.readFile: failed to open file \".../art/out/templates.json\": No such file or directory (os error 2)] test_artTemplatesMatchShapes()'.","severity":"medium","snippet":"        string memory j = vm.readFile(\"art/out/templates.json\");","title":"forge test does not pass as committed: test_artTemplatesMatchShapes reads art/out/templates.json, a generated file that is not in the tree"},{"citation":"resolved","description":"seatPlus1 is stored as seat + 1 in uint16 arithmetic, so a valid proof for seat 65535 reverts with panic 0x11 and that seat can never be claimed. The committed snapshot (app/public/seats.json, root 0x17e6c249...c738) holds 2000 leaves with seats 0..1999, so no real holder is affected by this deployment; it only matters if the contract is reused with a larger snapshot. A fix is to widen the field or compute uint16(seat) + 1 in uint256 with a bound check.","line":361,"path":"src/IdentityMachine.sol","reproduction":"IdentityMachine with seatRoot = keccak256(bytes.concat(keccak256(abi.encode(uint16(65535), holder)))) (a one-leaf tree). holder calls claimAgentCore(65535, []). Expected: an Agent Core is issued. Actual: revert, panic 0x11 (test/scratch/SeatOverflow.t.sol).","severity":"info","snippet":"        parts[id].seatPlus1 = seat + 1;","title":"claimAgentCore cannot claim seat 65535: `seat + 1` overflows uint16 (unreachable with the launch seatRoot, whose seats are 0..1999)"},{"citation":"resolved","description":"Not a defect in these contracts, which have no owner, pause, freeze or seize path, but a trust assumption the launch review should record: IMD at 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127 is Ownable (owner 0x047F606fD5b2BaA5f5C6c4aB8958E45CB6B054B7) with setBlocked(address,bool), as the project's own ForkTest.test_imdOwnerBlocklistCanFreezeAHolder records. Blocking the machine stops every mint, claim, payDev and claimReferral; blocking 0x...dEaD stops every mint (the 2% burn transfer reverts); blocking a player stops their claims. Funds already inside the machine stay accounted to their owners and become claimable again once unblocked.","line":309,"path":"src/IdentityMachine.sol","reproduction":"Fork of Robinhood Chain: owner of IMD calls setBlocked(machine, true); any user then calls machine.mint(1, maxTotal) or machine.claim(ids). Expected: normal mint/claim. Actual: the IMD transfer reverts, so every mint and claim reverts until the owner unblocks (ForkTest.test_imdOwnerBlocklistCanFreezeAHolder in test/Fork.t.sol shows the token behaviour).","severity":"info","snippet":"        imd.safeTransferFrom(msg.sender, address(this), total);","title":"External dependency: the live IMD token's owner keeps a blocklist and can freeze the machine, the dead address, the developer or any player"}],"hash":"200c20e176c246963733b58f5dd44c932f7c760595106ba5492d70e02ac2d120","nodeId":"5c32ec48-1007-4f55-8982-89a442102c65","outcome":"completed","summary":"The review is complete. Findings are in `.imd-findings.json` at the repository root, and the tree is otherwise unchanged.\n\n**Verdict:** the game contracts are sound. No loss-of-funds, wrong-payee, accounting, reentrancy, access-control or rounding defect reproduced, and none of the launch-forbidden patterns is present. Two medium findings block the launch as committed, both outside the game logic.\n\n**Contracts read in full:** DrandBeacon, IdentityMachine, Parts, Shapes, art/Catalog, MachineViews, EthMinter, plus launch.json, script/Deploy.s.sol, the test harness, mocks, dev pool and the security suite. The bls-solidity library was read at the points DrandBeacon uses it. The floor's OwnerChecks.sol is not in the tree and could not be read. Nothing else was out of reach.\n\n**Findings:**\n\n- **Medium, src/EthMinter.sol:47.** The constructor requires code at the PoolManager and Quoter addresses and calls the quoter. The launch rehearsal deploys on an empty chain, so the fourth manifest contract reverts BadPool and parks the launch. A proof test is attached. The values themselves are right: on live Robinhood Chain the quoter reports that PoolManager, the ETH/IMD pool quotes, and the repository's own fork test passed against the live pool during this review.\n- **Medium, test/Deploy.t.sol:61.** The suite does not pass as committed. One test reads a generated file under art/out that is neither committed nor ignored, so it fails on a fresh checkout. All other tests passed, with the three fork tests skipped.\n- **Info, src/IdentityMachine.sol:361.** Seat 65535 can never claim an Agent Core because the seat-plus-one field overflows. The committed snapshot holds seats 0 to 1999, so no holder is affected by this launch.\n- **Info, src/IdentityMachine.sol:309.** The live IMD token has an owner with a blocklist that can freeze the machine, the burn address or any player. That is a dependency to record, not a defect in these contracts.\n\n**Also checked:** manifest schema, names, argument counts and order, and `$owner` as the dev payout; runtime sizes under the EIP-170 limit; no DELEGATECALL, CALLCODE or SELFDESTRUCT in any runtime; no owner, pause, freeze, proxy or post-deployment setup; drand signature canonicality and round arithmetic; the plug-pay, shared-income, prize, reserve and referral accounting; v4 swap delta decoding, settlement and refund paths.\n\n**Next for the adapter:** move the PoolManager and Quoter checks in EthMinter out of the constructor to first use, and either commit art/out/templates.json or make that test generate or skip its fixture.","treeHash":null,"usage":{"cachedInputTokens":1841628,"inputTokens":548,"model":"claude-fable-5-1","outputTokens":35588,"runtime":"claude","turns":37,"wallClockMs":1149498}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1731fbfe0c4574fb","findings":[{"citation":"resolved","description":"Merged from audit_flow. _mint commits every mint in a block to drand round roundAt(block.timestamp) + DRAND_MARGIN (DRAND_MARGIN = 3, line 113), which drand publishes 9 to 11 seconds after the block's own timestamp. _reveal (lines 346-351) derives the part deterministically from keccak256(randomness, id) and nothing at mint time checks that beacon.randomness(dr) is still 0. The outcome is therefore secret only while block.timestamp is within 9 s of drand's wall clock. Robinhood Chain is an Arbitrum Orbit chain whose sequencer sets block.timestamp; the protocol tolerates it lagging real time by far more than 9 s, so in any block stamped >= 10 s behind real time the committed round is already published and a minter (or anyone watching the sequencer feed) computes rollTier/Catalog.partFor for ids nextId..nextId+n-1 off-chain and submits mint only when it yields a legendary (weight 20, 1% odds), then reveals in the same block. No accounting is corrupted and no funds are lost; the rarity distribution that prices and the 26% weight share rely on stops being random for that minter. This is an unstated trust assumption on the sequencer clock; a larger margin or a `if (beacon.randomness(dr) != 0) revert` guard at mint time removes it.","line":294,"path":"src/IdentityMachine.sol","reproduction":"Reproduced with test/scratch/Review.t.sol test_revealInSameBlockWhenMarginRoundAlreadyPublic on this tree (passes, i.e. the behaviour exists). State: fresh IdentityMachine(imd, beacon, dev, root, 0.1e18, 0), beacon already holds randomness r for round dr = roundAt(block.timestamp) + 3 (this models a block whose timestamp is >= 10 s behind drand's clock, so dr's signature is public). Before minting, compute x = keccak256(abi.encode(r, nextId)), tier = rollTier(x), design = Catalog.partFor(tier, Shapes.rollDrop(tier, x >> 16), x >> 32). Call mint(1, max) as alice, then reveal([id]) in the same block. Expected (intended design, comment at line 113 and 257): the part is unknown until 9-12 s after the mint and reveal reverts NotReady in the mint's block. Actual: pending(id).drandRound == dr, reveal succeeds in the same block, parts(id).design == the precomputed design and Parts.ownerOf(id) == alice. With an honest clock (randomness(dr) == 0 at mint time) the same reveal reverts NotReady.","severity":"low","snippet":"        uint48 dr = uint48(beacon.roundAt(block.timestamp) + DRAND_MARGIN);","title":"9-second drand margin makes mint randomness depend on the sequencer clock being within 9 s of drand's: a block stamped 10 s or more behind real time lets a minter know the part before paying"},{"citation":"resolved","description":"Merged from audit_flow. perWeight accrues floor(amount * 1e18 / totalWeight), so up to totalWeight - 1 scaled units (at most totalWeight / 1e18 IMD, i.e. dust) of every distribution stays in the contract and is reachable by no path (claim, pot carry, reserve), while totalPaid is increased by the full amount. The public totals (totalPaid, MachineViews.status.totalPaid) overstate what parts can collect by that dust and the machine's IMD balance slowly exceeds the sum of all claimable balances, pots, reserve, devBalance, referral credits and unplaced plug-pay. Economically negligible; accounting accuracy only.","line":649,"path":"src/IdentityMachine.sol","reproduction":"Reproduced with test/scratch/Review.t.sol test_distributeDustCountedInTotalPaid on this tree. State: three CAP parts (weight 1 each) placed above the core at (-1,-2), (0,-2), (1,-2) in round 1, so rounds(1).totalWeight == 3. Call sponsor(1) (1 wei). Expected: either 1 wei becomes claimable across the three parts or totalPaid is unchanged. Actual: perWeight += 333333333333333333, earned(id) for each part adds floor(333333333333333333 / 1e18) = 0 (sum of earned over the three parts unchanged), totalPaid increases by 1 and the machine's IMD balance increases by 1 with nobody able to claim it.","severity":"info","snippet":"        R.perWeight += (amount * MAG) / R.totalWeight;\n        totalPaid += amount;","title":"_distribute counts the per-weight rounding remainder in totalPaid although no path can ever claim it"},{"citation":"resolved","description":"Merged from audit_permissions; a documented dependency, not a defect in this code (ADAPTATION.md item 4). The machine has no owner, but every value path (mint in at this line, the 2% burn transfer to DEAD at line 333, claim, claimReferral, payDev, sponsor, fundPot, fundReserve and EthMinter's take/approve/mintForWithReferral) moves the brief's existing IMD token 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, whose single-key owner keeps a blocklist (setBlocked). Blocking the machine stops all purchases and withdrawals; blocking DEAD stops purchases (the burn transfer reverts); blocking a player or the dev strands that party's balance. Every revert is atomic so accounting is preserved, but recovery depends on the token owner. Recorded so the privileged external actor is in the review record; the token address is fixed by the brief and cannot be changed here.","line":314,"path":"src/IdentityMachine.sol","reproduction":"Fork only (the token is external): FOUNDRY_PROFILE=fork forge test --match-test test_imdOwnerBlocklistCanFreezeAHolder --fork-url https://rpc.mainnet.chain.robinhood.com (test/Fork.t.sol lines 129-145) shows a blocked holder can neither send nor receive IMD. Applied to the machine: as the IMD owner call setBlocked(address(machine), true); then mint(1, max) by a funded, approved player reverts inside imd.safeTransferFrom at line 314 and claim(ids) for a part with earned(id) > 0 reverts at imd.safeTransfer (line 546). Expected by players of an ownerless game: no party can pause it. Actual: the token owner can.","severity":"info","snippet":"        imd.safeTransferFrom(msg.sender, address(this), total);","title":"Trust assumption: the external IMD token's owner-controlled blocklist can halt every mint, claim and payout of the ownerless machine"}],"hash":"2776836a0af4a564987e558dc03cbd66949329b6d04e1af2ce49d1cddb387746","nodeId":"041aeccf-45f8-427e-a5a1-0202231bb595","outcome":"completed","summary":"Review complete. The findings file is written and validated: all three snippets match the tree at their lines, and the coverage record answers all 29 entry points plus the manifest and the IMD conservation invariant.\n\n**Outcome of the specialist findings**\n\n- **Kept, low:** the 9-second drand margin (audit_flow). I reproduced it on this tree with a scratch test: when the beacon already holds the randomness for `roundAt(block.timestamp) + 3`, a mint and its reveal succeed in the same block and the revealed design equals the one computed before paying. Nothing at mint time checks that the committed round is still unpublished, so a sequencer clock 10 s or more behind real time lets a minter pick outcomes. No funds move wrongly, so low.\n- **Kept, info:** `_distribute` rounding dust counted in `totalPaid` (audit_flow). Reproduced: three weight-1 caps placed, `sponsor(1)` raises `totalPaid` and the machine balance by 1 wei while the parts' claimable sum is unchanged.\n- **Kept, info, as a trust assumption:** the external IMD token's owner blocklist can halt mints, claims and payouts (audit_permissions). Not a defect in this code; the token is fixed by the brief. Recorded with the existing fork test as its reproduction.\n- **Dropped:** both specialists' \"launch.json notes still claim constructor-time pool validation\" findings. The notes in this tree already say the pool contracts and quoter relationship are checked on first use, so the mismatch does not reproduce.\n\n**My own pass found nothing further.** I checked the leads the tools raised and the areas most likely to hide a loss of funds: the BLS signature path (the library requires exactly 64 bytes and the pairing precompile rejects coordinates above the field prime, so the beacon's randomness is not malleable), the Uniswap v4 delta decoding and settle/take flow in EthMinter, the mint split and plug-pay conservation, placement geometry and the growth-exit check, round settlement, and the manifest's argument order, owner placement and constructor dependencies. The project builds, and the unit suites pass with 226 tests. Invariant and fork suites were not rerun within the time budget. The scratch test directory was removed, so the working tree is clean.","treeHash":null,"usage":{"cachedInputTokens":910410,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":32315,"runtime":"claude","turns":26,"wallClockMs":769371}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3b9f88f55251764d","findings":[],"hash":"3c17f8565e0e3675a7c89b60d8034859bebad65013d0dd65f1bc9eba7db73a1b","nodeId":"cd5ae8fb-ae84-4919-97a7-d00d34ba1963","outcome":"completed","summary":"The review is complete. The findings file is valid JSON with an empty findings list and 33 coverage rows, the scratch directory is removed, and the working tree is clean.\n\n**Outcome:** no substantiated defect in the Math Precision, Boundary or Numerical Gap area. Every formula I traced holds at its edges, and four scratch probes confirmed the seams empirically before I deleted them.\n\n**What I checked in depth**\n\n- **Mint split arithmetic.** The six floored slices sum to at most 77% of the batch total, so the shared remainder never underflows. Plug-pay fits `uint112` even at `uint32` mint counts, and the drand round fits `uint48`.\n- **Reward accumulator.** Claims keep the remainder in `debt`, so repeated micro-claims pay the same as one claim. With 1-wei sponsors over weights 1, 2 and 5 and a three-mint batch, the machine held exactly its obligations plus 1 wei of dust.\n- **Plug split and prize table.** Per-link dust goes to the pot, the ten-place table sums to exactly 10,000 bps, the eleventh place reads zero, and the 70% floor's dust carries to the next pot.\n- **Quote parity.** The machine's quote and the ETH checkout's total match the IMD actually pulled, including at the exact clock expiry where a new round opens at the base price.\n- **ETH checkout boundaries.** Zero, short and excess `msg.value` paths, the `int128` cap, the v4 delta lane decoding, the exact-output partial-fill check and the refund all behave as intended. The live quoter on Robinhood Chain answered normally for the manifest's fee and spacing, and `quoter.poolManager()` matches the PoolManager address.\n- **External token.** IMD is a plain 18-decimal, non-proxy ERC-20, so the 0.10 IMD base price is correct. Its owner-held blocklist is already recorded as a trust assumption in the tree.\n- **Geometry limits.** Footprint coordinates use checked `int32` math, the bound checks allow the edge cell and require room for the next one, and the open-socket counter cannot underflow.\n\n**Noted but not reported as defects**\n\n- The 9-second sequencer-lag limit on drand reveal timing is a documented, accepted assumption with its own tests.\n- DevEthPool locks ETH with no withdraw, but it is chain-id-gated to local Anvil and absent from the manifest.\n- Each shared distribution strands fewer than `totalWeight` wei. That is dust with no compounding.\n\n**What I could not reach:** nothing in my area was left unreached. The live end-to-end drand fork test was not run, and the dev harness contracts were covered only to the extent of confirming they cannot deploy on the target chain.","treeHash":null,"usage":{"cachedInputTokens":1962941,"inputTokens":514,"model":"claude-fable-5-1","outputTokens":47951,"runtime":"claude","turns":43,"wallClockMs":918503}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c97fd6a73e3737dc","findings":[{"citation":"resolved","description":"The manifest's notes say EthMinter's constructor 'checks that the machine and pool contracts exist and that the quoter belongs to the PoolManager'. After the accepted adaptation (ADAPTATION.md item 1) the constructor at src/EthMinter.sol:71-82 only checks the machine's code, fee and spacing; the PoolManager code, Quoter code and quoter.poolManager() match are checked by _checkPool() at first quote()/mint(). The deployment will therefore not fail on a wrong PoolManager or Quoter argument; a mistyped pool address would only surface as BadPool() on the first checkout. On the live chain the arguments are correct (cast on Robinhood Chain 4663: 0x8366a3..40951 and 0x8dc178..98f94 both have code, quoter.poolManager() returns the PoolManager, and the ETH/IMD pool with fee 10000 / spacing 100 is initialized with liquidity), so this is a documentation gap in the manifest, not a defect in the constructor arguments. Reviewers and the deployer reading the notes should not rely on the deployment itself as proof of the pool wiring.","line":36,"path":"launch.json","reproduction":"Deploy IdentityMachine as in the manifest, then `new EthMinter(machine, IEthPoolManager(0x1234), IEthQuoter(0x5678), 10000, 100)` where neither address has code. Expected per the notes: constructor reverts BadPool(). Actual: the constructor succeeds; `quote(1)` afterwards reverts BadPool(). test/scratch/ManifestNote.t.sol (passing) demonstrates it. Fix: reword the notes to 'validates the PoolManager and Quoter at first use', the only field a manifest step may change.","severity":"info","snippet":"  \"notes\": \"Identity Machine on Robinhood Chain (4663). Contracts only: no token, pool or distributor. Deploy in this order with zero ETH; nothing is called after deployment and no contract has an owner, admin or upgrade path. DrandBeacon() verifies drand evmnet (BN254, 3-second rounds) signatures on chain. IdentityMachine(imd, beacon, dev, seatRoot, basePrice, delay) is the game: imd = IMD on Robinhood Chain; beacon = the DrandBeacon above; dev = $owner, the address that receives the 2% developer share of every mint and has no other power; seatRoot = the Merkle root of the Agent Core seat snapshot (Ethereum block 26132002); basePrice = 0.10 IMD; delay = 172800 seconds, so minting opens 48 hours after deployment. Its constructor creates the Parts inventory ledger bound to itself (read it with inventory()). MachineViews(machine) is read-only. EthMinter(machine, poolManager, quoter, fee, tickSpacing) buys IMD with ETH through the Uniswap v4 ETH/IMD pool (PoolManager 0x8366a39cc670b4001a1","title":"launch.json notes claim constructor-time PoolManager/Quoter validation that EthMinter no longer performs"},{"citation":"resolved","description":"The machine has no owner, but every value path (mint in, burn to DEAD, claim, claimReferral, payDev, sponsor, fundPot, fundReserve, EthMinter take/approve) moves the external IMD token 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127 whose owner (0x047F606fD5b2BaA5f5C6c4aB8958E45CB6B054B7, a single key, confirmed live with cast owner()) keeps a blocklist (`blocked(address)` returns false for the burn address today). Blocking the machine stops all purchases and withdrawals; blocking DEAD stops purchases (the 2% burn transfer reverts); blocking a player or the dev strands that party's balance. Accounting is preserved by revert, but recovery depends on the token owner. Not an application defect, and already recorded by the author (ADAPTATION.md item 4, test/Fork.t.sol test_imdOwnerBlocklistCanFreezeAHolder); recorded here so the privileged external actor appears in the review record.","line":314,"path":"src/IdentityMachine.sol","reproduction":"Fork Robinhood Chain (FOUNDRY_PROFILE=fork forge test --match-contract ForkTest --fork-url https://rpc.mainnet.chain.robinhood.com). As the IMD owner call setBlocked(address(machine), true). Then any mint(n, maxTotal) by a funded, approved player reverts inside imd.safeTransferFrom at this line, and claim(ids) for a part with earned(id) > 0 reverts at imd.safeTransfer. Expected by players: the ownerless game cannot be paused; actual: the token owner can halt it.","severity":"info","snippet":"        imd.safeTransferFrom(msg.sender, address(this), total);","title":"Trust assumption: the IMD token owner's blocklist can freeze every mint, claim and payout of the machine"}],"hash":"5fba9363e50e55fa76344aba26442410d398939cbc5ff040e50e247ce51eef53","nodeId":"1598cb59-397a-400c-b7fd-abb49a76e17d","outcome":"completed","summary":"The review is complete. The findings file is written and valid, and no tracked file was changed.\n\n**Outcome.** Within the Access Control, Asymmetry and Trust Gap lenses I found no permission bypass, no inconsistent guard, and no asymmetric value path in the four launched contracts. The build and all 231 non-fork tests pass. The findings file holds two info-level items and 32 coverage rows, one for each of the 29 listed entry points plus three invariants.\n\n**What I checked**\n- Every state-changing entry point of IdentityMachine, Parts, DrandBeacon and EthMinter: the caller each assumes, the guard that enforces it, and the storage it writes. No function takes an owner from `msg.sender` or `tx.origin`, Parts is bound to the machine in the constructor, and EthMinter holds only immutables.\n- Paired surfaces: the four mint variants share one fee split; mint versus Agent Core claim; reveal inside and outside `build`; claim, referral claim and dev payout all zero balances before transfer; round end by `endRound` and by the next mint run the same code.\n- Trust gaps: the plug-pay recipient is chosen by the payer and self-referral is allowed, but both are documented design. The callback in EthMinter is reachable only from the immutable PoolManager while a nonReentrant mint is in flight.\n- The manifest: argument counts and order match the three constructors, `$owner` fills the dev payout slot, and on live Robinhood Chain the IMD token, PoolManager and Quoter have code, the quoter reports that PoolManager, and the ETH/IMD pool with fee 10000 and spacing 100 is initialized with liquidity.\n\n**Findings reported**\n1. **Info, launch.json notes.** The notes say EthMinter's constructor validates the PoolManager and Quoter. The accepted adaptation moved those checks to first use, so a wrong pool address would deploy fine and only fail at the first checkout. A scratch test under test/scratch confirms it. The live arguments are correct, so only the note needs rewording.\n2. **Info, trust assumption.** The IMD token's owner, a single key, keeps a blocklist and can freeze every mint, claim and payout by blocking the machine or the burn address. The author already records this in ADAPTATION.md and the fork test. It is listed so the external privileged actor is in the review record.\n\n**Not covered.** Randomness timing is outside my area and I did not substantiate it: the mint's drand round sits only nine seconds after the block timestamp, so a chain whose timestamps lag wall clock by that much would let a minter see the signature first. I could not reproduce that locally, so it stays a lead for the randomness specialist, not a finding.","treeHash":null,"usage":{"cachedInputTokens":1321882,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":34512,"runtime":"claude","turns":31,"wallClockMs":849131}},{"artifacts":[],"attempt":1,"bundleHash":"b26b73d3ccf300775e0bb0e1d5fe803f71ea88a5f76be696aba8590085fc04d2","device":"a43d0c18792c5628","findings":[],"hash":"98bd35f5438d9b356d30010fc7dd963a1ff863e52f576f40c24aa96037088d80","nodeId":"286cdce0-6099-48f5-8289-1ca2c89c823b","outcome":"completed","summary":"Added [offline launch tests](/home/imdworker/.identitymd/work/d514d187-9663-450b-b3c5-eb595778d64a/286cdce0-6099-48f5-8289-1ca2c89c823b/test/launch/README.md) covering manifest deployment, failure rollback, real drand proofs, and three custody invariants.\n\n`forge build` passed. Full tests with the supplied seed: **237 passed, 0 failed, 3 fork-only tests skipped**.\n\nChanges are confined to `test/`.","treeHash":"7a5b9b9f8cb2ab7fc1c8f77c9ccfd63ce4338cd2","usage":{"cachedInputTokens":10727808,"inputTokens":209136,"model":"gpt-6-astra","outputTokens":55097,"runtime":"codex","turns":29,"wallClockMs":3005262}},{"artifacts":[],"attempt":1,"bundleHash":"8aad64bcb3445eb9afc096633fc08b700195c94f886b0d488973d00fea3ee686","device":"fea1c984a93ab45d","findings":[],"hash":"a2b72f7f6dc4cc6cadcd33e2241311907a35e1897949c0097f904e08fc8d031b","nodeId":"94a13485-7dde-42f9-ba88-3c79b00146c9","outcome":"completed","summary":"Implemented the launch fixes: deferred pool validation, restored the art fixture, and fixed seat overflow. Manifest arguments and compiler settings remain unchanged.\n\nValidation: `forge build` passed; seeded `forge test` passed with **231 passed, 0 failed, 3 skipped**. Two targeted Robinhood fork tests also passed.\n\nChanges and the external IMD blocklist risk are documented in [ADAPTATION.md](/home/imd/.identitymd-nft1/work/d514d187-9663-450b-b3c5-eb595778d64a/94a13485-7dde-42f9-ba88-3c79b00146c9/ADAPTATION.md).","treeHash":"8ba61138e10bcbe1101271584b5e540df3e12187","usage":{"cachedInputTokens":5046784,"inputTokens":124791,"model":"gpt-6-astra","outputTokens":28284,"runtime":"codex","turns":17,"wallClockMs":1212307}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e0f64c10e30e33e2","findings":[],"hash":"b69d7e6be82cfa21cec4a2e61feaa2c64afd42b0be131e1ffee8261da591f50c","nodeId":"e8be437a-d98f-4290-82dc-c5be3585554d","outcome":"completed","summary":"I found no economic defects I could reproduce. `.imd-findings.json` has an empty `findings` list and a coverage record of 31 rows: all 29 entry points, each marked `holds` with a one-line reason, plus two invariant rows. I changed no files besides that one, which git ignores.\n\n**What I covered** (the Economic Security, Invariant and Flow Gap guides, after the Senior Auditor's Mindset):\n\n- **Where each mint's money goes.** The shares add up exactly to the price paid: 50% plug-pay, 26% (or 23% with a referral) shared income, 15% pot plus a matching amount from the reserve, 5% reserve, 2% burn, 2% developer. The shared slice takes the rounding remainder, so nothing is created or lost.\n- **Paying out.** `claim` rounds each payout down and records what was paid before it moves the rest, so it never pays out more than it took in. Repeating an id pays nothing extra. The prize places add up to exactly 10,000 basis points. Pots of finished rounds can no longer be paid out, and the next round's pot can't receive money early.\n- **Prices.** `quote` and `price` use the same mint count as `_mint`, including after the clock runs out, when the next mint ends the round and the price restarts.\n- **Randomness.** Each mint is revealed by a drand round at least 9 seconds after it. The signature that produces the randomness is fixed, so nobody can retry for a better roll.\n- **EthMinter.** The swap buys exactly the IMD needed, spends at most `msg.value`, refunds the rest and leaves nothing approved afterwards. The callback can only be entered once and only by the PoolManager.\n- **Live checks on Robinhood Chain.** The quoter belongs to the listed PoolManager. The ETH/IMD pool (fee 10000, spacing 100, no hooks) is set up with liquidity, at about 0.00228 ETH per IMD. The IMD token is a cross-chain token with a blocklist and no transfer fee, so the exact-amount bookkeeping is right.\n\n**What I left out:**\n\n- Some things I rejected as intended design or already known:\n  - self-referral as a 3% rebate, which the code comments allow;\n  - plugging new parts into your own parts to recover plug-pay;\n  - holding cheap early-round parts to compete for the last-ten prize;\n  - mints that are never revealed, which an existing test accepts;\n  - the IMD owner's blocklist, already recorded as an outside dependency in `ADAPTATION.md`.\n- **Static-analysis leads.** The flagged weak randomness, divide-before-multiply, strict-equality and reentrancy lines all came to nothing once traced.\n- **Not checked in depth.** The wiring and geometry rules in `Shapes` and `Catalog`, beyond how the tier and shape rolls are chosen, and `MachineViews` beyond how its earnings views compare with `claim`. Both are outside the economics area.\n- **DevEthPool and DevIMD** are local test stand-ins that are not deployed; their rows say so.\n\nNo finding needed a proof, so I wrote and ran no test files. A clean result here doesn't prove the code has no defects.","treeHash":null,"usage":{"cachedInputTokens":1026535,"inputTokens":26,"model":"claude-opus-5-5","outputTokens":25630,"runtime":"claude","turns":16,"wallClockMs":322966}},{"artifacts":[],"attempt":1,"bundleHash":"ffcc062572b27ae5f334dd83b4e42a9bcc2592d8b986744a34d1a1f5099a9e61","device":"809ae05b6282abad","findings":[],"hash":"c270e7814574ca497b468598c47181474d11d504c96000f629d1a13571dc8735","nodeId":"acf1cd04-ce3b-4339-9fcc-1f8e57b92bdd","outcome":"completed","summary":"The deliverable is complete and verified. No further work remains, so nothing new to request.\n\nI wrote launch.json as the single changed file, deploying the four accepted contracts in dependency order on Robinhood Chain:\n\n- **DrandBeacon** with no arguments.\n- **IdentityMachine** with the IMD token address, the beacon reference, $owner as the dev payout, the seat Merkle root, 0.10 IMD base price, and 172800 seconds delay.\n- **MachineViews** with the machine reference.\n- **EthMinter** with the machine reference, the PoolManager and Quoter addresses, fee 10000, tick spacing 100.\n\nEvery value was cross-checked against the accepted sources: the constants in `script/Deploy.s.sol`, the seat root in `app/public/seats.json` (Ethereum block 26132002), and the constructor parameter lists and declaration order in `src/`. The committed Deploy test that asserts the manifest equals the deploy script's constants passes unchanged, so the manifest describes exactly the accepted implementation.\n\nThe one repair was in the notes text: it claimed EthMinter's constructor checks the pool contracts and the quoter-to-PoolManager relationship, which describes the old timing before the accepted fix. The constructor now checks only that the machine has code plus fee and tick spacing, while the pool checks run on first use. I corrected that sentence, clarified that the launch deploys no new token, pool or distributor, and named the IMD token argument. No constructor argument or contract entry was altered.\n\nVerification results:\n\n- `forge build` passes.\n- `forge test` with the pinned seed passes: 231 passed, 0 failed, 3 skipped, including the one-transaction CREATE2 rehearsal on an empty chain in `test/LaunchDeployment.t.sol`.\n- A local schema check confirms only kind/contracts/notes, unique names within 32 characters, one entry per constructor parameter, backward-only `$contract:` references, static ABI words elsewhere, and notes under the 4000-character limit.\n- Git shows exactly one modified file, launch.json; my scratch checks live under `test/scratch` and are excluded from the tree.","treeHash":"2ac2ae800f5257c7f47c5e5ff0d55d84a19177f7","usage":{"cachedInputTokens":798336,"inputTokens":98901,"model":"claude-fable-5-1","outputTokens":35380,"runtime":"claude","turns":36,"wallClockMs":527130}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dc34db8e17664ebd","findings":[{"citation":"resolved","description":"Execution trace / first principles. _mint commits a mint to drand round roundAt(block.timestamp) + DRAND_MARGIN (DRAND_MARGIN = 3, src/IdentityMachine.sol:113), i.e. the round drand publishes 9 to 12 seconds after the block's own timestamp. The reveal (keccak256(randomness, id), src/IdentityMachine.sol:349-351) is deterministic once that round's signature is public. The only thing keeping the outcome unknown at mint time is the assumption that block.timestamp is within 9 seconds of drand's wall clock. Robinhood Chain is an Arbitrum Orbit chain: its sequencer sets block.timestamp and the protocol permits it to lag real time (Nitro's default allows up to 24 h behind L1 time, and ordinary operation already tolerates many seconds of drift). Whenever a block is stamped 10 or more seconds behind real time, the drand round chosen for every mint in that block is already published, so a minter (or a bot reading the mempool/sequencer feed) computes rollTier and the catalog part off-chain for ids nextId..nextId+n-1 and only submits the mint when it yields a legendary (1% odds, weight 20, highest plug-pay share), or front-runs id positions with that knowledge. No contract state is corrupted, but the rarity distribution that prices and the 26% weight-share rely on stops being random for the attacker. This is a trust assumption on the sequencer clock that the code does not state; a larger margin (e.g. 10 rounds = 30 s) or a check that beacon.randomness(dr) == 0 at mint time would remove the dependence.","line":294,"path":"src/IdentityMachine.sol","reproduction":"State: real time T, drand has published every round up to roundAt(T). Sequencer stamps the next block with block.timestamp = T - 12 (within the permitted drift). Call mint(1, maxTotal): dr = roundAt(T-12) + 3, whose publication time is at most T - 12 + 9 + 2 = T - 1, so its signature is already public. Expected: the part assigned to id nextId is unknown to the minter until after the mint is final. Actual: before sending the transaction the minter computes r = keccak256(sig_dr), x = keccak256(abi.encode(r, nextId)), tier = rollTier(x), design = Catalog.partFor(tier, Shapes.rollDrop(tier, x >> 16), x >> 32) and sends the mint only when design is legendary; reveal([nextId]) then succeeds in the very same block (randomness already provable) and issues the pre-selected part. With an honest clock (block.timestamp >= T - 9) the same call reverts NotReady on reveal, as intended. The on-chain mechanics were confirmed with a scratch Foundry test on this tree: with the beacon already holding randomness for roundAt(block.timestamp) + DRAND_MARGIN, mint(1) followed by reveal in the same block succeeds and the revealed tier equals the tier computed from (randomness, nextId) before the mint.","severity":"low","snippet":"        uint48 dr = uint48(beacon.roundAt(block.timestamp) + DRAND_MARGIN);","title":"9-second drand margin is inside the sequencer's permitted backward timestamp drift, so a lagging block clock lets a minter know the reveal before paying"},{"citation":"resolved","description":"Manifest review. The notes say EthMinter's constructor checks that the pool contracts exist and that the quoter belongs to the PoolManager. After the accepted adaptation (ADAPTATION.md item 1) the constructor only checks the machine's code, the fee and the tick spacing (src/EthMinter.sol:71-82); the PoolManager/Quoter code-presence and quoter.poolManager() checks run in _checkPool() (src/EthMinter.sol:85-90) on every quote and mint instead. Schema, keys, argument counts (0/6/1/5 matching the constructors in declaration order), $owner placement (dev_), backward $contract references and notes length (1,238 chars) are all valid; this is a documentation mismatch only, with no deployment impact, but a reader of the manifest would wrongly conclude that a wrong PoolManager or Quoter address would be caught at deployment rather than at the first checkout.","line":36,"path":"launch.json","reproduction":"Deploy EthMinter(machine, 0x8366a39cc670b4001a1121b8f6a443a643e40951, 0x8dc178efb8111bb0973dd9d722ebeff267c98f94, 10000, 100) on a chain where neither pool address has code (the launch rehearsal). Expected per the notes: constructor reverts BadPool. Actual: deployment succeeds (test/LaunchDeployment.t.sol relies on this) and the first mint/quote reverts BadPool instead.","severity":"info","snippet":"  \"notes\": \"Identity Machine on Robinhood Chain (4663). Contracts only: no token, pool or distributor. Deploy in this order with zero ETH; nothing is called after deployment and no contract has an owner, admin or upgrade path. DrandBeacon() verifies drand evmnet (BN254, 3-second rounds) signatures on chain. IdentityMachine(imd, beacon, dev, seatRoot, basePrice, delay) is the game: imd = IMD on Robinhood Chain; beacon = the DrandBeacon above; dev = $owner, the address that receives the 2% developer share of every mint and has no other power; seatRoot = the Merkle root of the Agent Core seat snapshot (Ethereum block 26132002); basePrice = 0.10 IMD; delay = 172800 seconds, so minting opens 48 hours after deployment. Its constructor creates the Parts inventory ledger bound to itself (read it with inventory()). MachineViews(machine) is read-only. EthMinter(machine, poolManager, quoter, fee, tickSpacing) buys IMD with ETH through the Uniswap v4 ETH/IMD pool (PoolManager 0x8366a39cc670b4001a1","title":"launch.json notes still describe constructor-time PoolManager/Quoter validation that EthMinter now defers to first use"},{"citation":"resolved","description":"First principles / accounting. perWeight accrues floor(amount * 1e18 / totalWeight); the remainder (up to totalWeight - 1 wei-scaled units per call) stays in the contract and no path (claim, pot carry, reserve) ever reaches it, while totalPaid is increased by the full amount. The locked value is bounded by totalWeight / 1e18 IMD per distribution, so it is economically negligible, but the public totals (totalPaid, and MachineViews.status.totalPaid) overstate what parts can actually collect by that dust, and the IMD balance of the machine slowly exceeds the sum of all claimable balances, pots, reserve, devBalance and referral credits.","line":649,"path":"src/IdentityMachine.sol","reproduction":"Place three common parts (weight 1 each, totalWeight = 3) in the running round, then call sponsor(1) (1 wei). Expected: either 1 wei becomes claimable in total or totalPaid is unchanged. Actual: perWeight += 333333333333333333; each part's earned() adds floor(1 * 333333333333333333 / 1e18) = 0; the 1 wei is unclaimable forever, yet totalPaid reports +1. Confirmed with a scratch Foundry test on this tree (three caps placed via Base._caps, sponsor(1): totalPaid +1, sum of earned() over the three parts 0, machine IMD balance +1).","severity":"info","snippet":"        R.perWeight += (amount * MAG) / R.totalWeight;\n        totalPaid += amount;","title":"_distribute counts the per-weight rounding remainder in totalPaid although it is never claimable"}],"hash":"de2c0411e6e6d2b044ee9409a7a5a28a2ff87cb7d3e662d568add2b46baa179a","nodeId":"bd2d3036-4ac5-4e92-816a-f99f136c0c61","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. The working tree is otherwise unchanged (the scratch test was removed, and `out/` and `cache/` are ignored).\n\n**Outcome: no critical, high or medium defect in the control flow.** The project builds, all four launch contracts are under the EIP-170 size limit, and the committed suite passes with the fork tests excluded:\n\n| Suite scope | Result |\n|---|---|\n| `forge test` excluding `test/Fork.t.sol` | 231 passed, 0 failed, 1 skipped |\n\n**Findings written (3):**\n\n1. **Low, `src/IdentityMachine.sol:294`.** The mint commits to drand round `roundAt(block.timestamp) + 3`, a 9-second margin. On an Arbitrum Orbit chain the sequencer may stamp blocks behind real time, and any lag of 10 seconds or more makes the chosen round already public, so a minter can compute the part off-chain and mint only on a favourable roll. A scratch test confirmed the mechanics: with the randomness already set, mint and reveal succeed in the same block and the tier matches the pre-computed one. This is an unstated trust assumption on the sequencer clock rather than state corruption.\n2. **Info, `launch.json:36`.** The notes still say EthMinter's constructor checks the PoolManager and Quoter. Since the accepted adaptation those checks run on first use. Schema, argument counts, order, `$owner` placement and notes length are all valid.\n3. **Info, `src/IdentityMachine.sol:649`.** The per-weight rounding remainder in `_distribute` is never claimable but is added to `totalPaid`. Confirmed with a scratch test: three parts placed, `sponsor(1)` raises `totalPaid` by one wei that no part can claim.\n\n**Coverage:** all 30 listed entry points have a row, plus two invariant rows and one for the read-only views. The eight DevEthPool and DevIMD entries are local-only mocks that are not in the manifest. I traced the full mint, reveal, build, place, claim, round-end and ETH checkout paths, the Uniswap v4 struct layouts and native-settle semantics, the Parts ledger, the BLS beacon's canonical-encoding uniqueness, and the Shapes and Catalog geometry tables. Not done: an on-chain check of the IMD, PoolManager and Quoter addresses on Robinhood Chain, and the fork test suite.","treeHash":null,"usage":{"cachedInputTokens":1781862,"inputTokens":452,"model":"claude-fable-5-1","outputTokens":41365,"runtime":"claude","turns":34,"wallClockMs":1531157}}],"verification":[{"checks":[{"durationMs":207314,"exitCode":0,"name":"build","output":"Compiling 89 files with Solc 0.8.26\nSolc 0.8.26 finished in 207.20s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> script/Deploy.s.sol:40:38:\n   |\n40 |     function deploy(Config memory c, address deployer) internal returns (System memory s) {\n   |                                      ^^^^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":68065,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/EthMinter.t.sol:EthMinterForkTest\n[SKIP] test_liveExactOutputPool() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 332.98µs (65.99µs CPU time)\n\nRan 2 tests for test/Fork.t.sol:ForkTest\n[SKIP] test_imdOwnerBlocklistCanFreezeAHolder() (gas: 0)\n[SKIP] test_onRobinhood() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 2 skipped; finished in 633.06µs (51.90µs CPU time)\n\nRan 4 tests for test/AuditFixes.t.sol:AuditFixesTest\n[PASS] test_checkFollowsTheClock() (gas: 253078)\n[PASS] test_constructorRefusesZeroDevAndZeroPrice() (gas: 8668)\n[PASS] test_sponsorAfterRolloverReverts() (gas: 552725)\n[PASS] test_sponsorWithNothingPlacedReverts() (gas: 206444)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.64ms (700.79µs CPU time)\n\nRan 7 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_DP01_deployChecks() (gas: 83984)\n[PASS] test_artTemplatesMatchShapes() (gas: 134140)\n[PASS] test_catalogCoversEverySlot() (gas: 127680)\n[PASS] test_countdownStartsAtDeployment() (gas: 25676)\n[PASS] test_deployWiresTheLedgerToTheMachine() (gas: 5718411)\n[PASS] test_launchManifestMatchesTheDeployScript() (gas: 12575796)\n[PASS] test_realSnapshotProof() (gas: 5885916)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 3.03ms (2.34ms CPU time)\n\nRan 2 tests for test/security/TokenCompatibility.t.sol:SecurityTokenCompatibilityTest\n[PASS] test_falseReturnTransferRollsBackTokenMutationAndPendingMint() (gas: 1455958)\n[PASS] test_noReturnTransfersSupportMintClaimAndFunding() (gas: 2241166)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 8.84ms (7.06ms CPU time)\n\nRan 4 tests for test/Inventory.t.sol:InventoryTest\n[PASS] test_itemsRemainOwnedAcrossRoundsAndAreConsumedOnce() (gas: 525393)\n[PASS] test_largeMintAndLazyResolutionKeepTheRemainingItems() (gas: 6528619)\n[PASS] test_largeMintCannotBypassSlippageLimit() (gas: 4885708)\n[PASS] test_twoHundredItemMintGasAndExactQuote() (gas: 9906847)\nLogs:\n  mint(200) gas: 9744683\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 15.70ms (8.40ms CPU time)\n\nRan 25 tests for test/security/Checkout.t.sol:SecurityCheckoutTest\n[PASS] test_constructorRejectsMissingMachineAndInvalidFeeSpacing() (gas: 8583)\n[PASS] test_dependenciesCanAppearAfterDeploymentAndMintWithoutPriorQuote() (gas: 751688)\n[PASS] test_duplicateCallbackRollsBackAndCanRetry() (gas: 841550)\n[PASS] test_excessOutputRejectedBeforeSettlement() (gas: 705143)\n[PASS] test_expiryIsInclusiveAndNextSecondFails() (gas: 473689)\n[PASS] test_forcedEthAndImdDonationsRemainAtBaseline() (gas: 507888)\n[PASS] test_machineFailureRollsBackSwapExpiredRoundAndPrizes() (gas: 79922707)\n[PASS] test_malformedCallbackDataRollsBackAndCanRetry() (gas: 728040)\n[PASS] test_minimumSignedEthLaneCannotOverflowOrSpendBaseline() (gas: 705656)\n[PASS] test_missingCallbackRollsBackAndCanRetry() (gas: 727758)\n[PASS] test_missingPoolManagerIsRejectedOnUse() (gas: 190804)\n[PASS] test_missingQuoterIsRejectedOnUse() (gas: 197059)\n[PASS] test_negativeImdDeltaRejectedBeforeSettlement() (gas: 705711)\n[PASS] test_poolManagerReadFailureRollsBackAndCanRetry() (gas: 631582)\n[PASS] test_positiveEthDeltaRejectedBeforeSettlement() (gas: 705167)\n[PASS] test_settlementFailureRollsBackAndCanRetry() (gas: 735109)\n[PASS] test_shortOutputRejectedBeforeSettlement() (gas: 705165)\n[PASS] test_staleEthQuoteCannotSpendMoreThanCurrentBudget() (gas: 241882)\n[PASS] test_staleImdQuoteCannotChargeHigherPrice() (gas: 356419)\n[PASS] test_successfulQuoteDoesNotBypassLaterPoolValidation() (gas: 234705)\n[PASS] test_swapFailureRollsBackAndCanRetry() (gas: 702574)\n[PASS] test_takeFailureRollsBackAndCanRetry() (gas: 757822)\n[PASS] test_uint128SignedOutputLimitIsCheckedInQuoteAndMint() (gas: 78357)\n[PASS] test_wrongQuoterManagerIsRejectedOnUse() (gas: 819973)\n[PASS] test_zeroEthDeltaRejectedBeforeSettlement() (gas: 705717)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 22.29ms (24.84ms CPU time)\n\nRan 2 tests for test/DrandBeacon.t.sol:DrandBeaconTest\n[PASS] test_roundClock() (gas: 14153)\n[PASS] test_verifiesLiveEvmnetRound() (gas: 553482)\nLogs:\n  drand verify gas: 287360\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 28.71ms (6.20ms CPU time)\n\nRan 1 test for test/LaunchDeployment.t.sol:LaunchDeploymentTest\n[PASS] test_manifestDeploysInOneFactoryCallOnEmptyChain() (gas: 31583894)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 29.63ms (29.50ms CPU time)\n\nRan 18 tests for test/Rounds.t.sol:RoundsTest\n[PASS] test_buildChecksTheMachineId() (gas: 4079690)\n[PASS] test_buildNeverSkipsAnInvalidTrailingSpot() (gas: 482568)\n[PASS] test_buildSkipsMintsSomeoneElseRevealed() (gas: 944349)\n[PASS] test_clockEndsTheRound() (gas: 2784968)\n[PASS] test_countdown() (gas: 7565785)\n[PASS] test_eachMachineIsItsOwnEconomy() (gas: 3221077)\n[PASS] test_finishedMachinesStayInTheArchive() (gas: 4273187)\n[PASS] test_fundPotGoesToTheRunningMachineOrTheReserve() (gas: 223030)\n[PASS] test_lastTenPlacesPaidOnlyAfterClockExpiry() (gas: 5337303)\n[PASS] test_mintingDoesNotMoveTheClock() (gas: 1211322)\n[PASS] test_nextMintEndsAnExpiredRound() (gas: 1525907)\n[PASS] test_noLegendaryGrantEntryPoint() (gas: 30697)\n[PASS] test_partsCarryOverToTheNextMachine() (gas: 4875275)\n[PASS] test_placementAddsThirtySecondsCappedAtTwentyFourHours() (gas: 1020524)\n[PASS] test_prizeIsClaimedByThePlacer() (gas: 5350134)\n[PASS] test_revealAndPlaceInOneBuild() (gas: 882334)\n[PASS] test_roundStartsWithTwentyFourHours() (gas: 38316)\n[PASS] test_roundWithNoPlacementsCarriesThePot() (gas: 1379384)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 16.67ms (15.52ms CPU time)\n\nRan 12 tests for test/security/Views.t.sol:SecurityViewsTest\n[PASS] testFuzz_paginationMatchesAvailableIds(uint256,uint256) (runs: 512, μ: 327759, ~: 326213)\n[PASS] test_archiveOversizedPageClampsWithoutOverflow() (gas: 178465)\n[PASS] test_boardOversizedPageClampsWithoutOverflow() (gas: 358648)\n[PASS] test_boardPackingPreservesSignedCoordinatesAndPlacer() (gas: 343515)\n[PASS] test_claimableDeduplicatesAndMatchesActualPayment() (gas: 926154)\n[PASS] test_claimableFiltersForeignUnplacedUnknownAndZeroIds() (gas: 918663)\n[PASS] test_emptyAndZeroPages() (gas: 72994)\n[PASS] test_inventoryOversizedPageClampsWithoutOverflow() (gas: 172837)\n[PASS] test_inventoryParallelArraysTrimAfterForeignOwnershipAndPlacement() (gas: 714990)\n[PASS] test_pendingOversizedPageClampsWithoutOverflow() (gas: 277266)\n[PASS] test_statusCountsEachPartOnce() (gas: 501493)\n[PASS] test_statusOfZeroAddressHasNoWalletBalances() (gas: 55128)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 54.09ms (54.43ms CPU time)\n\nRan 3 tests for test/InstallLimit.t.sol:InstallLimitTest\n[PASS] test_fiftyFundedPartsInstallAndRemainSolventAndClaimable() (gas: 14174071)\nLogs:\n  50 funded straight parts execution gas: 7807628\n\n[PASS] test_fiftyOneRejectsBeforeBeaconRevealOrPlacement() (gas: 4409744)\n[PASS] test_mintLimitRemainsTwoHundred() (gas: 9759724)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 79.18ms (19.64ms CPU time)\n\nRan 10 tests for test/security/EconomicsAndItems.t.sol:SecurityEconomicsAndItemsTest\n[PASS] test_batchCrossingPriceBoundaryMatchesSequentialCostsAndPlugFloors() (gas: 79006938)\n[PASS] test_consumedItemsLeaveInventory() (gas: 309574)\n[PASS] test_failedPartMintDoesNotInflateSupply() (gas: 209341)\n[PASS] test_fullRoundWithoutPlacementsPaysNoPrize() (gas: 78648326)\n[PASS] test_idSpaceAndPaidPositionsIncludeCoreAndOverdueMints() (gas: 82922288)\n[PASS] test_inventoryAdvertisesNoNftInterfaces() (gas: 5597)\n[PASS] test_issuingPartsDoesNotInvokeReceiverCallbacks() (gas: 281821)\n[PASS] test_itemsIssueAndConsumeRequireMachine() (gas: 194364)\n[PASS] test_prizeMintThresholdsZeroOne1499_1500_1501() (gas: 238592387)\n[PASS] test_sparsePrizePlacesAreNotRenormalizedAndEleventhGetsNothing() (gas: 90690205)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 122.33ms (95.42ms CPU time)\n\nRan 5 tests for test/security/Geometry.t.sol:SecurityGeometryTest\n[PASS] testFuzz_signedCellKeyHasExactIndependentByteLanes(uint192,int32,int32) (runs: 512, μ: 7319, ~: 7319)\n[PASS] test_allTemplateRotationsUseIndependentCoordinateAndDirectionModel() (gas: 787984)\n[PASS] test_directionStepsAndOppositesMatchScreenCoordinates() (gas: 88100)\n[PASS] test_everyCellOfMulticellFootprintMustBeWithinBounds() (gas: 75877)\n[PASS] test_realGrowthAcrossSignedCoordinatesDoesNotAliasRounds() (gas: 42628515)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 154.96ms (36.79ms CPU time)\n\nRan 28 tests for test/Machine.t.sol:MachineTest\n[PASS] testFuzz_mintSplitsExactly(uint8) (runs: 512, μ: 933087, ~: 857801)\n[PASS] testFuzz_quadraticPriceIsExactAndAccelerates(uint32) (runs: 512, μ: 36072, ~: 36072)\n[PASS] test_agentCoreClaim() (gas: 595357)\n[PASS] test_claimPaysThePlacerOnce() (gas: 1658530)\n[PASS] test_coreHasTwelveSockets() (gas: 96387)\n[PASS] test_dropOddsAreWellFormed() (gas: 31031)\n[PASS] test_dropsUseOneMix() (gas: 9123995)\n[PASS] test_itemsCannotBeTransferredAndOnlyTheirRecipientCanPlace() (gas: 485948)\n[PASS] test_mintForGivesThePartsToTheRecipient() (gas: 280651)\n[PASS] test_mintIdIsThePartId() (gas: 697141)\n[PASS] test_mintRoundIsThreeDrandRoundsAhead() (gas: 271125)\n[PASS] test_mintTooExpensiveAndBatchLimits() (gas: 210171)\n[PASS] test_noEarningsBeforePlacing() (gas: 1673212)\n[PASS] test_onlyTheOwnerPlaces() (gas: 428637)\n[PASS] test_payDev() (gas: 1236361)\n[PASS] test_placingConsumesTheItemAndRecordsThePlacer() (gas: 357100)\n[PASS] test_plugPayIntoPartsSplitsEqually() (gas: 838578)\n[PASS] test_plugPayIntoTheCorePaysThePot() (gas: 446554)\n[PASS] test_quadraticPriceCurve() (gas: 706611)\n[PASS] test_quoteSumsPrices() (gas: 103728)\n[PASS] test_reserveMatchesPotMoneyWhileItLasts() (gas: 11791865)\n[PASS] test_revealIssuesTheItemAndSkipsRevealedMints() (gas: 2734640)\n[PASS] test_revealWaitsForDrand() (gas: 281816)\n[PASS] test_sharedEarningsByWeight() (gas: 2307522)\n[PASS] test_sponsorBeforeAnyPartReverts() (gas: 64052)\n[PASS] test_sponsorPaysTheRunningMachine() (gas: 428862)\n[PASS] test_viewsStatusBoardInventoryPending() (gas: 959922)\n[PASS] test_wiringRules() (gas: 773611)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 186.30ms (223.67ms CPU time)\n\nRan 18 tests for test/security/Lifecycle.t.sol:SecurityLifecycleTest\n[PASS] testFuzz_approvalsCannotTransferOrPlaceItems(bool) (runs: 512, μ: 684677, ~: 684674)\n[PASS] test_agentCoreProofBindsCallerAndCannotReplay() (gas: 274118)\n[PASS] test_claimAcrossOldAndCurrentRoundsWithDuplicates() (gas: 1052844)\n[PASS] test_claimForeignLastIdRollsBackPriorCreditsAndDebt() (gas: 1439807)\n[PASS] test_claimTransferFailureRestoresDebtAndCreditForRetry() (gas: 1529755)\n[PASS] test_deadlineFundingRoutesToReserveAndMatchesOnlyOnce() (gas: 734209)\n[PASS] test_directDonationCreatesSurplusWithoutNewLiability() (gas: 1102423)\n[PASS] test_emptyClaimAndRepeatedRevealCannotCreateValue() (gas: 1270676)\n[PASS] test_failedBuildRollsBackRealProofRevealsAndGeometry() (gas: 9141464)\n[PASS] test_frequentClaimsPreserveFractionalDebtForEveryWeight() (gas: 36762359)\n[PASS] test_giftOwnershipPlacementAndPermanentClaimRights() (gas: 1239084)\n[PASS] test_invalidTrailingSpotAndUnreadyRevealAbortTheWholeBuild() (gas: 2134550)\n[PASS] test_latePlacementCannotClaimEarlierSharedIncome() (gas: 829655)\n[PASS] test_mintPriceFailureRollsBackTentativeRoundEndAndExtras() (gas: 79864572)\n[PASS] test_mintTransferFailureRollsBackTentativeRoundEnd() (gas: 1866863)\n[PASS] test_payDevFailurePreservesBalanceAndAnyonePaysOnlyDeveloper() (gas: 497443)\n[PASS] test_revealLateFailureRollsBackEarlierItemIssue() (gas: 1827309)\n[PASS] test_staleBuildAndExactDeadlineNeverPlaceIntoNextRound() (gas: 555330)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 237.36ms (278.11ms CPU time)\n\nRan 3 tests for test/AgentCoreSeats.t.sol:AgentCoreSeatsTest\n[PASS] testFuzz_everyUint16SeatCanBeClaimed(uint16) (runs: 512, μ: 1095251, ~: 1095271)\n[PASS] test_maximumSeatCanBeClaimedAndRead() (gas: 1095327)\n[PASS] test_zeroSeatDoesNotUseTheNoSeatSentinel() (gas: 1095225)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 303.23ms (304.34ms CPU time)\n\nRan 5 tests for test/Gas.t.sol:GasTest\n[PASS] test_gas_build20() (gas: 13246143)\nLogs:\n  placed: 20\n  20 single builds incl. search (upper bound): 10942225\n\n[PASS] test_gas_build50Reactors() (gas: 244588605)\nLogs:\n  build(50 Reactors): 20464753\n\n[PASS] test_gas_claim100() (gas: 98013966)\nLogs:\n  claim(100): 3099588\n\n[PASS] test_gas_clockEndWithEverything() (gas: 82382561)\nLogs:\n  clock end with all prizes: 496657\n\n[PASS] test_gas_mint20() (gas: 2203476)\nLogs:\n  mint(20): 1043258\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 445.39ms (488.57ms CPU time)\n\nRan 8 tests for test/security/Beacon.t.sol:SecurityBeaconTest\n[PASS] test_appendingBytesCannotChooseDifferentRandomness() (gas: 328501)\n[PASS] test_cachedRoundIsImmutableEvenWithDifferentOrMalformedProof() (gas: 351330)\n[PASS] test_clockAtGenesisAndExactPeriodEdges() (gas: 29397)\n[PASS] test_infinityPointIsNotAValidSignature() (gas: 250239)\n[PASS] test_invalidUncachedPointDoesNotPoisonSubsequentValidProof() (gas: 299073)\n[PASS] test_nonCanonicalAndNegatedEncodingsDoNotVerify() (gas: 4546952)\n[PASS] test_roundZeroTimestampIsRejected() (gas: 8679)\n[PASS] test_signatureMustHaveCanonicalLengthOnUncachedRound() (gas: 148614)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 519.51ms (20.98ms CPU time)\n\nRan 6 tests for test/Rework.t.sol:ReworkTest\n[PASS] testFuzz_mintAllocationConservesEveryWeiWithReserveMatching(uint96,uint8,bool,bool) (runs: 512, μ: 1016019, ~: 955397)\n[PASS] testFuzz_pendingPurchaseCannotBeCancelledAfterAnyDelay(uint32) (runs: 512, μ: 340966, ~: 340966)\n[PASS] test_newReserveCutOnlyMatchesLaterMintPotMoney() (gas: 490447)\n[PASS] test_productionRejectsRemovedGameFeatureSelectors() (gas: 5913397)\n[PASS] test_realProofRevealsMonthOldPurchaseAfterRoundEndWithoutRedraw() (gas: 7652636)\n[PASS] test_roundSettlementMakesNoDependencyCallsAndEarningsRemainClaimable() (gas: 1036360)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 962.26ms (206.44ms CPU time)\n\nRan 17 tests for test/BoundaryWitness.t.sol:BoundaryWitnessTest\n[PASS] test_batchCanRepairAnUnsafeIntermediatePrefix() (gas: 1432581)\n[PASS] test_blankOutwardFaceOnTheEdgeIsNotAnExit() (gas: 515650)\n[PASS] test_cannotRepairDraftWithAnotherPlayersPart() (gas: 1175049)\n[PASS] test_capOnlyFreezeRevertsEvenThoughOneSocketRemains() (gas: 38866235)\n[PASS] test_clockStillEndsRoundAndIncomeRemainsClaimable() (gas: 2909501)\n[PASS] test_concurrentBuildMakesAnOldExitStaleWithoutLosingInventory() (gas: 1051113)\n[PASS] test_coordinateLimitsRequireAnInBoundsNextCellInEveryDirection() (gas: 4891450)\n[PASS] test_everyTemplateAndRotationHasAValidInstallationAndContinuation() (gas: 138549532)\n[PASS] test_forgedDirectionEmptyCellBlankFaceAndStaleEdgeReject() (gas: 1661926)\n[PASS] test_fourMidcapsRevertAtomicallyAlthoughEightSocketsRemain() (gas: 11225222)\n[PASS] test_fullSealRevertsAndDoesNotPayPrizes() (gas: 29787641)\n[PASS] test_fuzzBatchAndOutwardContinuation(uint8) (runs: 512, μ: 3318327, ~: 2148299)\n[PASS] test_fuzzCannotForgeSocketOnInitialCore(int32,int32,uint8) (runs: 512, μ: 72865, ~: 72639)\n[PASS] test_invalidExitDoesNotCommitPlugPayOrClockOrConsumption() (gas: 1192603)\n[PASS] test_noUnprotectedBuildEntryPoint() (gas: 4095938)\n[PASS] test_proofRevealAndAccountingRollBackForInvalidFinalWitness() (gas: 1575416)\n[PASS] test_repeatingAnItemCannotConsumeItOrPayTwice() (gas: 465733)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 1.00s (1.23s CPU time)\n\nRan 10 tests for test/EthMinter.t.sol:EthMinterTest\n[PASS] testFuzz_atomicMintRefundAndOwnership(uint8,uint96) (runs: 512, μ: 6089714, ~: 2786437)\n[PASS] testFuzz_ethReferralUsesImdPriceAndRefundsUnusedEth(uint8,uint96) (runs: 512, μ: 2362548, ~: 1229160)\n[PASS] test_batchAndCallbackChecks() (gas: 117809)\n[PASS] test_ethSelfReferralAllowedAndHelperDoesNotRetainReward() (gas: 724528)\n[PASS] test_giftChargesOnlyPayer() (gas: 539888)\n[PASS] test_insufficientEthRevertsEntireMint() (gas: 233874)\n[PASS] test_newRoundQuoteAndPayment() (gas: 1201416)\n[PASS] test_partialFillReverts() (gas: 154314)\n[PASS] test_priceLimitAndExpiry() (gas: 134888)\n[PASS] test_refundRejectRevertsAndReentryIsBlocked() (gas: 1520855)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 1.56s (1.72s CPU time)\n\nRan 15 tests for test/EdgeCases.t.sol:EdgeCasesTest\n[PASS] testFuzz_batchBuildEqualsTheSameSpotsOneByOne(uint256) (runs: 512, μ: 14538792, ~: 14056147)\n[PASS] testFuzz_checkAgreesWithBuild(uint16,uint8,int32,int32) (runs: 2048, μ: 1674793, ~: 1656465)\n[PASS] testFuzz_deadlineIsMonotonicAndCapped(uint256) (runs: 512, μ: 5317320, ~: 5500677)\n[PASS] testFuzz_mintedPartsMatchTheirRollAndAreNeverAgentCores(uint256) (runs: 512, μ: 9367, ~: 9023)\n[PASS] testFuzz_rollDropResolves(uint8,uint256) (runs: 512, μ: 3081, ~: 2928)\n[PASS] test_endRoundOnlyOnceAndNeverEarly() (gas: 249543)\n[PASS] test_everyDesignWeighsByItsTier() (gas: 240915)\n[PASS] test_mintAtTheExactDeadlineOpensTheNextRoundAtTheBasePrice() (gas: 653805)\n[PASS] test_oneBuildExtendsTheClockPerPartUpToTheCap() (gas: 5248290)\n[PASS] test_placeSharesCoverTheWholePrizeAndStopAtTen() (gas: 80999)\n[PASS] test_placingAnUnrevealedMintRevertsAndLeavesItPending() (gas: 451785)\n[PASS] test_prizePlacesFollowSpotOrderWithinOneBuild() (gas: 2926930)\n[PASS] test_revealIgnoresUnknownZeroAndAlreadyRevealedIds() (gas: 830425)\n[PASS] test_rollTierBoundaries() (gas: 53254)\n[PASS] test_sponsorWorksOneSecondBeforeTheDeadlineAndNotAtIt() (gas: 491968)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 1.61s (3.56s CPU time)\n\nRan 4 tests for test/RaritySockets.t.sol:RaritySocketsTest\n[PASS] testFuzz_eightIncomingPaymentsConserveFundsAndRemainClaimable(uint96,uint8) (runs: 512, μ: 6770668, ~: 6766039)\n[PASS] test_eightLinksCannotCommitThroughAnInvalidWitness() (gas: 5220436)\n[PASS] test_eightSelfConnectionsOnlyRecycleTheFundedAllocation() (gas: 5408980)\n[PASS] test_socketCountsAndOnlyExternalPorts() (gas: 126322)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.61s (1.62s CPU time)\n\nRan 7 tests for test/audit/Beacon.t.sol:BeaconTest\n[PASS] testFuzz_mintRoundIsInTheFuture(uint32) (runs: 512, μ: 16335, ~: 16335)\n[PASS] testFuzz_roundAtIsFirstRoundAtOrAfter(uint32) (runs: 512, μ: 12818, ~: 12818)\n[PASS] test_IM05_marginCoversALaggingSequencer() (gas: 4975550)\n[PASS] test_IM05_nineSecondLagIsTheLimit() (gas: 4932580)\n[PASS] test_invalidProofBurnsForwardedGas() (gas: 4953303)\nLogs:\n  gas used by a failing proof (5M forwarded): 4950432\n\n[PASS] test_liveRoundsVerifyAndDoNotCrossOver() (gas: 3183285)\nLogs:\n  prove gas: 278144\n\n[PASS] test_publicKeyIsDrandsEvmnetKey() (gas: 31184)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 2.22s (44.28ms CPU time)\n\nRan 2 tests for test/launch/CheckoutInvariant.t.sol:ManifestCheckoutInvariantTest\n[PASS]\nManifestCheckoutInvariantTest invariants:\n[PASS] invariant_checkoutCannotRetainPaymentsOrSpendDonations\n[PASS] invariant_machineCanCoverEveryLiability\n[PASS] invariant_onlyPaidMintsCreatePendingItems\n ManifestCheckoutInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------------------+----------------+-------+---------+----------╮\n| Contract                | Selector       | Calls | Reverts | Discards |\n+=======================================================================+\n| ManifestCheckoutHandler | advance        | 2026  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| ManifestCheckoutHandler | buy            | 2079  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| ManifestCheckoutHandler | changeRate     | 2075  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| ManifestCheckoutHandler | donate         | 2011  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| ManifestCheckoutHandler | fund           | 2005  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| ManifestCheckoutHandler | rejectedBuy    | 2061  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| ManifestCheckoutHandler | rejectedPayout | 2083  | 0       | 0        |\n|-------------------------+----------------+-------+---------+----------|\n| ManifestCheckoutHandler | withdraw       | 2044  | 0       | 0        |\n╰-------------------------+----------------+-------+---------+----------╯\n\n[PASS] test_campaignExercisesEveryFaultAcrossRoundRollover() (gas: 4765308)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 6.81s (6.81s CPU time)\n\nRan 4 tests for test/security/RingRecipes.t.sol:SecurityRingRecipesTest\n[PASS] test_crossesInPlaceOfRingTeesLeaveTwelveOutsideSockets() (gas: 3408670)\n[PASS] test_fourCapsAndRoutingSealAlsoRejects() (gas: 64934383)\n[PASS] test_fourteenCornerSealRejectsAtomically() (gas: 35791801)\n[PASS] test_teesInPlaceOfRingCornersLeaveSixteenOutsideSockets() (gas: 3409112)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 7.31s (64.75ms CPU time)\n\nRan 9 tests for test/Referrals.t.sol:ReferralsTest\n[PASS] testFuzz_referralOnlyReroutesSharedAndAllFeesAreHeld(uint8) (runs: 512, μ: 5452108, ~: 3251962)\n[PASS] testFuzz_selfReferralAndSecondWalletHaveIdenticalCombinedReturn(uint8) (runs: 512, μ: 4625602, ~: 2664395)\n[PASS] test_creditSurvivesRoundsAndNoReferralDoesNotRememberOldAddress() (gas: 676575)\n[PASS] test_failedPaymentAndPriceLimitDoNotCreditReferral() (gas: 260765)\n[PASS] test_giftMayReferPayerOrRecipient() (gas: 475904)\n[PASS] test_giftReferralAndClaimsBelongToCorrectWallets() (gas: 533959)\n[PASS] test_invalidReferralsKeepFullSharedAllocation() (gas: 878651)\n[PASS] test_overduePendingMintKeepsPlugAndReferralRemainsFunded() (gas: 427776)\n[PASS] test_withoutBuildersUnassignedSharedGoesToPot() (gas: 314434)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 7.53s (9.14s CPU time)\n\nRan 2 tests for test/Big.t.sol:BigMachineTest\n[PASS] testFuzz_openCounterIsExact(uint256) (runs: 512, μ: 68830755, ~: 67812222)\n[PASS] test_bigMachine() (gas: 1035194404)\nLogs:\n  parts placed: 688\n  open sockets: 148\n  width: 57\n  height: 41\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.59s (9.80s CPU time)\n\nRan 4 tests for test/launch/LaunchBehavior.t.sol:ManifestLaunchBehaviorTest\n[PASS] testFuzz_interveningPurchaseInvalidatesOnlyTheOldQuote(uint256,uint256) (runs: 1000, μ: 10811585, ~: 10916386)\n[PASS] test_countdownRejectsAllCreationAndRollsBackSettledCheckout() (gas: 1175158)\n[PASS] test_realProofRevealAndPlacementAreAtomicWithManifestDependencies() (gas: 4993434)\n[PASS] test_rejectedRefundRollsBackRolloverPrizeAndReferralThenExactPaymentWorks() (gas: 2260401)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 7.60s (7.60s CPU time)\n\nRan 2 tests for test/Invariant.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_burnIsTwoPercent\n[PASS] invariant_conservation\n[PASS] invariant_openSocketsAndWiring\n[PASS] invariant_roundsAndSupply\n[PASS] invariant_solventAndExact\n InvariantTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭----------+---------------+-------+---------+----------╮\n| Contract | Selector      | Calls | Reverts | Discards |\n+=======================================================+\n| Handler  | claim         | 1244  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | claimCore     | 1298  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | claimReferral | 1237  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | endRound      | 1262  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | fund          | 1300  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | giftMint      | 1293  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | mint          | 1248  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | payDev        | 1261  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | place         | 1243  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | referredMint  | 1239  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | reveal        | 1236  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | transfer      | 1309  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | warp          | 1214  | 0       | 0        |\n╰----------+---------------+-------+---------+----------╯\n\nLogs:\n  rounds: 2\n  parts placed: 35\n  claimed (milli-IMD): 32050\n  gift mints executed: 14\n  transfers rejected: 4\n  cores claimed: 2\n\n[PASS] test_handlerExercisesGiftTransferCoreAndRetainsOverduePendingLiability() (gas: 1647486)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 67.92s (67.92s CPU time)\n\nRan 31 test suites in 67.92s (115.97s CPU time): 237 tests passed, 0 failed, 3 skipped (240 total tests)\n","passed":true},{"durationMs":96,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DevEthPool.settle()\",\"DevEthPool.swap((address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"DevEthPool.take(address,address,uint256)\",\"DevEthPool.unlock(bytes)\",\"DevIMD.approve(address,uint256)\",\"DevIMD.mint(address,uint256)\",\"DevIMD.transfer(address,uint256)\",\"DevIMD.transferFrom(address,address,uint256)\",\"DrandBeacon.prove(uint64,bytes)\",\"EthMinter.mint(uint256,uint256,uint256)\",\"EthMinter.mintWithReferral(uint256,uint256,uint256,address)\",\"EthMinter.quote(uint256)\",\"EthMinter.unlockCallback(bytes)\",\"IdentityMachine.build(uint256,(uint64,bytes)[],uint256[],(uint256,uint8,int32,int32)[],(int32,int32,uint8))\",\"IdentityMachine.claim(uint256[])\",\"IdentityMachine.claimAgentCore(uint16,bytes32[])\",\"IdentityMachine.claimReferral()\",\"IdentityMachine.endRound()\",\"IdentityMachine.fundPot(uint256)\",\"IdentityMachine.fundReserve(uint256)\",\"IdentityMachine.mint(uint256,uint256)\",\"IdentityMachine.mintFor(address,uint256,uint256)\",\"IdentityMachine.mintForWithReferral(address,uint256,uint256,address)\",\"IdentityMachine.mintWithReferral(uint256,uint256,address)\",\"IdentityMachine.payDev()\",\"IdentityMachine.reveal(uint256[])\",\"IdentityMachine.sponsor(uint256)\",\"Parts.burn(uint256)\",\"Parts.mint(address,uint256)\"],\"files\":{\".gitignore\":18,\"ADAPTATION.md\":116,\"LICENSE\":16,\"app/.gitignore\":1,\"app/archive.html\":24,\"app/docs.html\":20,\"app/index.html\":126,\"app/package-lock.json\":1435,\"app/package.json\":25,\"app/parts.html\":24,\"app/public/brand/favicon.svg\":1,\"app/public/brand/mark.svg\":1,\"app/public/llms.txt\":163,\"app/public/parts-loader-static.svg\":7,\"app/public/parts-loader.svg\":71,\"app/public/seats.json\":1,\"app/scripts/abi.mjs\":10,\"app/scripts/swarm-deploy.mjs\":47,\"app/scripts/swarm-manifest.mjs\":90,\"app/src/abi/DevIMD.json\":333,\"app/src/abi/DrandBeacon.json\":249,\"app/src/abi/EthMinter.json\":360,\"app/src/abi/IdentityMachine.json\":1756,\"app/src/abi/MachineViews.json\":481,\"app/src/abi/Parts.json\":166,\"app/src/archive.ts\":157,\"app/src/build.ts\":38,\"app/src/catalog.ts\":61,\"app/src/chain.ts\":137,\"app/src/crt.ts\":185,\"app/src/docs.ts\":184,\"app/src/econ.ts\":52,\"app/src/eth.ts\":49,\"app/src/explore.ts\":200,\"app/src/geometry.ts\":405,\"app/src/jackpot.ts\":112,\"app/src/main.ts\":1595,\"app/src/parts.gen.ts\":20,\"app/src/rarity.ts\":7,\"app/src/referrals.ts\":99,\"app/src/render.ts\":740,\"app/src/reveal.ts\":35,\"app/src/shell.ts\":160,\"app/src/signals.ts\":230,\"app/src/store.ts\":683,\"app/src/style.css\":995,\"app/src/topten.ts\":54,\"app/src/ui.ts\":85,\"app/src/usd.ts\":74,\"app/src/vite-env.d.ts\":1,\"app/src/wallet.ts\":146,\"app/tsconfig.json\":16,\"app/vite.config.ts\":15,\"art/brand.mjs\":19,\"art/loader.mjs\":60,\"art/out/templates.json\":1,\"art/parts.mjs\":1138,\"foundry.toml\":32,\"launch.json\":37,\"remappings.txt\":3,\"script/Deploy.s.sol\":106,\"script/DevDeploy.s.sol\":37,\"scripts/dev.sh\":20,\"scripts/fork.sh\":94,\"scripts/fund.sh\":14,\"src/DrandBeacon.sol\":68,\"src/EthMinter.sol\":162,\"src/IdentityMachine.sol\":684,\"src/MachineViews.sol\":233,\"src/Parts.sol\":46,\"src/Shapes.sol\":144,\"src/art/Catalog.sol\":61,\"src/dev/DevEthPool.sol\":63,\"src/dev/DevIMD.sol\":13,\"test/AgentCoreSeats.t.sol\":63,\"test/AuditFixes.t.sol\":58,\"test/Base.sol\":482,\"test/Big.t.sol\":40,\"test/BoundaryWitness.t.sol\":334,\"test/Deploy.t.sol\":143,\"test/DrandBeacon.t.sol\":31,\"test/EdgeCases.t.sol\":345,\"test/EthMinter.t.sol\":254,\"test/Fork.t.sol\":146,\"test/Gas.t.sol\":83,\"test/InstallLimit.t.sol\":64,\"test/Invariant.t.sol\":425,\"test/Inventory.t.sol\":67,\"test/LaunchDeployment.t.sol\":133,\"test/Machine.t.sol\":391,\"test/Mocks.sol\":45,\"test/RaritySockets.t.sol\":118,\"test/Referrals.t.sol\":169,\"test/Rework.t.sol\":147,\"test/Rounds.t.sol\":276,\"test/audit/Beacon.t.sol\":128,\"test/audit/vectors/drand-info.json\":9,\"test/fixtures-seat.json\":1,\"test/launch/CheckoutInvariant.t.sol\":399,\"test/launch/LaunchBehavior.t.sol\":257,\"test/launch/ManifestFixture.sol\":136,\"test/launch/README.md\":62,\"test/launch/SettlementModel.sol\":123,\"test/security/Beacon.t.sol\":92,\"test/security/Checkout.t.sol\":404,\"test/security/EconomicsAndItems.t.sol\":154,\"test/security/Geometry.t.sol\":132,\"test/security/Lifecycle.t.sol\":409,\"test/security/RingRecipes.t.sol\":97,\"test/security/TokenCompatibility.t.sol\":70,\"test/security/Views.t.sol\":150},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"98bd35f5438d9b356d30010fc7dd963a1ff863e52f576f40c24aa96037088d80","verifiedTreeHash":"7a5b9b9f8cb2ab7fc1c8f77c9ccfd63ce4338cd2","verifierVersion":"0.1.0+d952fceb"},{"checks":[{"durationMs":182050,"exitCode":0,"name":"build","output":"Compiling 85 files with Solc 0.8.26\nSolc 0.8.26 finished in 181.94s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> script/Deploy.s.sol:40:38:\n   |\n40 |     function deploy(Config memory c, address deployer) internal returns (System memory s) {\n   |                                      ^^^^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":67480,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/EthMinter.t.sol:EthMinterForkTest\n[SKIP] test_liveExactOutputPool() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 364.82µs (80.89µs CPU time)\n\nRan 2 tests for test/Fork.t.sol:ForkTest\n[SKIP] test_imdOwnerBlocklistCanFreezeAHolder() (gas: 0)\n[SKIP] test_onRobinhood() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 2 skipped; finished in 446.06µs (45.29µs CPU time)\n\nRan 2 tests for test/security/TokenCompatibility.t.sol:SecurityTokenCompatibilityTest\n[PASS] test_falseReturnTransferRollsBackTokenMutationAndPendingMint() (gas: 1455958)\n[PASS] test_noReturnTransfersSupportMintClaimAndFunding() (gas: 2241166)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.48ms (2.00ms CPU time)\n\nRan 4 tests for test/AuditFixes.t.sol:AuditFixesTest\n[PASS] test_checkFollowsTheClock() (gas: 253078)\n[PASS] test_constructorRefusesZeroDevAndZeroPrice() (gas: 8668)\n[PASS] test_sponsorAfterRolloverReverts() (gas: 552725)\n[PASS] test_sponsorWithNothingPlacedReverts() (gas: 206444)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 5.54ms (4.33ms CPU time)\n\nRan 4 tests for test/Inventory.t.sol:InventoryTest\n[PASS] test_itemsRemainOwnedAcrossRoundsAndAreConsumedOnce() (gas: 525393)\n[PASS] test_largeMintAndLazyResolutionKeepTheRemainingItems() (gas: 6528619)\n[PASS] test_largeMintCannotBypassSlippageLimit() (gas: 4885708)\n[PASS] test_twoHundredItemMintGasAndExactQuote() (gas: 9906847)\nLogs:\n  mint(200) gas: 9744683\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 7.18ms (5.83ms CPU time)\n\nRan 7 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_DP01_deployChecks() (gas: 83984)\n[PASS] test_artTemplatesMatchShapes() (gas: 134140)\n[PASS] test_catalogCoversEverySlot() (gas: 127680)\n[PASS] test_countdownStartsAtDeployment() (gas: 25676)\n[PASS] test_deployWiresTheLedgerToTheMachine() (gas: 5718411)\n[PASS] test_launchManifestMatchesTheDeployScript() (gas: 12575796)\n[PASS] test_realSnapshotProof() (gas: 5885916)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 7.52ms (6.31ms CPU time)\n\nRan 3 tests for test/InstallLimit.t.sol:InstallLimitTest\n[PASS] test_fiftyFundedPartsInstallAndRemainSolventAndClaimable() (gas: 14174071)\nLogs:\n  50 funded straight parts execution gas: 7807628\n\n[PASS] test_fiftyOneRejectsBeforeBeaconRevealOrPlacement() (gas: 4409744)\n[PASS] test_mintLimitRemainsTwoHundred() (gas: 9759724)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 9.77ms (8.25ms CPU time)\n\nRan 25 tests for test/security/Checkout.t.sol:SecurityCheckoutTest\n[PASS] test_constructorRejectsMissingMachineAndInvalidFeeSpacing() (gas: 8583)\n[PASS] test_dependenciesCanAppearAfterDeploymentAndMintWithoutPriorQuote() (gas: 751688)\n[PASS] test_duplicateCallbackRollsBackAndCanRetry() (gas: 841550)\n[PASS] test_excessOutputRejectedBeforeSettlement() (gas: 705143)\n[PASS] test_expiryIsInclusiveAndNextSecondFails() (gas: 473689)\n[PASS] test_forcedEthAndImdDonationsRemainAtBaseline() (gas: 507888)\n[PASS] test_machineFailureRollsBackSwapExpiredRoundAndPrizes() (gas: 79922707)\n[PASS] test_malformedCallbackDataRollsBackAndCanRetry() (gas: 728040)\n[PASS] test_minimumSignedEthLaneCannotOverflowOrSpendBaseline() (gas: 705656)\n[PASS] test_missingCallbackRollsBackAndCanRetry() (gas: 727758)\n[PASS] test_missingPoolManagerIsRejectedOnUse() (gas: 190804)\n[PASS] test_missingQuoterIsRejectedOnUse() (gas: 197059)\n[PASS] test_negativeImdDeltaRejectedBeforeSettlement() (gas: 705711)\n[PASS] test_poolManagerReadFailureRollsBackAndCanRetry() (gas: 631582)\n[PASS] test_positiveEthDeltaRejectedBeforeSettlement() (gas: 705167)\n[PASS] test_settlementFailureRollsBackAndCanRetry() (gas: 735109)\n[PASS] test_shortOutputRejectedBeforeSettlement() (gas: 705165)\n[PASS] test_staleEthQuoteCannotSpendMoreThanCurrentBudget() (gas: 241882)\n[PASS] test_staleImdQuoteCannotChargeHigherPrice() (gas: 356419)\n[PASS] test_successfulQuoteDoesNotBypassLaterPoolValidation() (gas: 234705)\n[PASS] test_swapFailureRollsBackAndCanRetry() (gas: 702574)\n[PASS] test_takeFailureRollsBackAndCanRetry() (gas: 757822)\n[PASS] test_uint128SignedOutputLimitIsCheckedInQuoteAndMint() (gas: 78357)\n[PASS] test_wrongQuoterManagerIsRejectedOnUse() (gas: 819973)\n[PASS] test_zeroEthDeltaRejectedBeforeSettlement() (gas: 705717)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 26.46ms (23.56ms CPU time)\n\nRan 1 test for test/LaunchDeployment.t.sol:LaunchDeploymentTest\n[PASS] test_manifestDeploysInOneFactoryCallOnEmptyChain() (gas: 31583894)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 43.15ms (42.99ms CPU time)\n\nRan 4 tests for test/security/RingRecipes.t.sol:SecurityRingRecipesTest\n[PASS] test_crossesInPlaceOfRingTeesLeaveTwelveOutsideSockets() (gas: 3408670)\n[PASS] test_fourCapsAndRoutingSealAlsoRejects() (gas: 64934383)\n[PASS] test_fourteenCornerSealRejectsAtomically() (gas: 35791801)\n[PASS] test_teesInPlaceOfRingCornersLeaveSixteenOutsideSockets() (gas: 3409112)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 48.36ms (69.12ms CPU time)\n\nRan 2 tests for test/DrandBeacon.t.sol:DrandBeaconTest\n[PASS] test_roundClock() (gas: 14153)\n[PASS] test_verifiesLiveEvmnetRound() (gas: 553482)\nLogs:\n  drand verify gas: 287360\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 49.66ms (5.30ms CPU time)\n\nRan 12 tests for test/security/Views.t.sol:SecurityViewsTest\n[PASS] testFuzz_paginationMatchesAvailableIds(uint256,uint256) (runs: 512, μ: 327759, ~: 326213)\n[PASS] test_archiveOversizedPageClampsWithoutOverflow() (gas: 178465)\n[PASS] test_boardOversizedPageClampsWithoutOverflow() (gas: 358648)\n[PASS] test_boardPackingPreservesSignedCoordinatesAndPlacer() (gas: 343515)\n[PASS] test_claimableDeduplicatesAndMatchesActualPayment() (gas: 926154)\n[PASS] test_claimableFiltersForeignUnplacedUnknownAndZeroIds() (gas: 918663)\n[PASS] test_emptyAndZeroPages() (gas: 72994)\n[PASS] test_inventoryOversizedPageClampsWithoutOverflow() (gas: 172837)\n[PASS] test_inventoryParallelArraysTrimAfterForeignOwnershipAndPlacement() (gas: 714990)\n[PASS] test_pendingOversizedPageClampsWithoutOverflow() (gas: 277266)\n[PASS] test_statusCountsEachPartOnce() (gas: 501493)\n[PASS] test_statusOfZeroAddressHasNoWalletBalances() (gas: 55128)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 60.01ms (63.45ms CPU time)\n\nRan 8 tests for test/security/Beacon.t.sol:SecurityBeaconTest\n[PASS] test_appendingBytesCannotChooseDifferentRandomness() (gas: 328501)\n[PASS] test_cachedRoundIsImmutableEvenWithDifferentOrMalformedProof() (gas: 351330)\n[PASS] test_clockAtGenesisAndExactPeriodEdges() (gas: 29397)\n[PASS] test_infinityPointIsNotAValidSignature() (gas: 250239)\n[PASS] test_invalidUncachedPointDoesNotPoisonSubsequentValidProof() (gas: 299073)\n[PASS] test_nonCanonicalAndNegatedEncodingsDoNotVerify() (gas: 4546952)\n[PASS] test_roundZeroTimestampIsRejected() (gas: 8679)\n[PASS] test_signatureMustHaveCanonicalLengthOnUncachedRound() (gas: 148614)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 126.07ms (17.22ms CPU time)\n\nRan 18 tests for test/Rounds.t.sol:RoundsTest\n[PASS] test_buildChecksTheMachineId() (gas: 4079690)\n[PASS] test_buildNeverSkipsAnInvalidTrailingSpot() (gas: 482568)\n[PASS] test_buildSkipsMintsSomeoneElseRevealed() (gas: 944349)\n[PASS] test_clockEndsTheRound() (gas: 2784968)\n[PASS] test_countdown() (gas: 7565785)\n[PASS] test_eachMachineIsItsOwnEconomy() (gas: 3221077)\n[PASS] test_finishedMachinesStayInTheArchive() (gas: 4273187)\n[PASS] test_fundPotGoesToTheRunningMachineOrTheReserve() (gas: 223030)\n[PASS] test_lastTenPlacesPaidOnlyAfterClockExpiry() (gas: 5337303)\n[PASS] test_mintingDoesNotMoveTheClock() (gas: 1211322)\n[PASS] test_nextMintEndsAnExpiredRound() (gas: 1525907)\n[PASS] test_noLegendaryGrantEntryPoint() (gas: 30697)\n[PASS] test_partsCarryOverToTheNextMachine() (gas: 4875275)\n[PASS] test_placementAddsThirtySecondsCappedAtTwentyFourHours() (gas: 1020524)\n[PASS] test_prizeIsClaimedByThePlacer() (gas: 5350134)\n[PASS] test_revealAndPlaceInOneBuild() (gas: 882334)\n[PASS] test_roundStartsWithTwentyFourHours() (gas: 38316)\n[PASS] test_roundWithNoPlacementsCarriesThePot() (gas: 1379384)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 126.47ms (22.12ms CPU time)\n\nRan 5 tests for test/Gas.t.sol:GasTest\n[PASS] test_gas_build20() (gas: 13246143)\nLogs:\n  placed: 20\n  20 single builds incl. search (upper bound): 10942225\n\n[PASS] test_gas_build50Reactors() (gas: 244588605)\nLogs:\n  build(50 Reactors): 20464753\n\n[PASS] test_gas_claim100() (gas: 98013966)\nLogs:\n  claim(100): 3099588\n\n[PASS] test_gas_clockEndWithEverything() (gas: 82382561)\nLogs:\n  clock end with all prizes: 496657\n\n[PASS] test_gas_mint20() (gas: 2203476)\nLogs:\n  mint(20): 1043258\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 271.87ms (440.63ms CPU time)\n\nRan 28 tests for test/Machine.t.sol:MachineTest\n[PASS] testFuzz_mintSplitsExactly(uint8) (runs: 512, μ: 933087, ~: 857801)\n[PASS] testFuzz_quadraticPriceIsExactAndAccelerates(uint32) (runs: 512, μ: 36072, ~: 36072)\n[PASS] test_agentCoreClaim() (gas: 595357)\n[PASS] test_claimPaysThePlacerOnce() (gas: 1658530)\n[PASS] test_coreHasTwelveSockets() (gas: 96387)\n[PASS] test_dropOddsAreWellFormed() (gas: 31031)\n[PASS] test_dropsUseOneMix() (gas: 9123995)\n[PASS] test_itemsCannotBeTransferredAndOnlyTheirRecipientCanPlace() (gas: 485948)\n[PASS] test_mintForGivesThePartsToTheRecipient() (gas: 280651)\n[PASS] test_mintIdIsThePartId() (gas: 697141)\n[PASS] test_mintRoundIsThreeDrandRoundsAhead() (gas: 271125)\n[PASS] test_mintTooExpensiveAndBatchLimits() (gas: 210171)\n[PASS] test_noEarningsBeforePlacing() (gas: 1673212)\n[PASS] test_onlyTheOwnerPlaces() (gas: 428637)\n[PASS] test_payDev() (gas: 1236361)\n[PASS] test_placingConsumesTheItemAndRecordsThePlacer() (gas: 357100)\n[PASS] test_plugPayIntoPartsSplitsEqually() (gas: 838578)\n[PASS] test_plugPayIntoTheCorePaysThePot() (gas: 446554)\n[PASS] test_quadraticPriceCurve() (gas: 706611)\n[PASS] test_quoteSumsPrices() (gas: 103728)\n[PASS] test_reserveMatchesPotMoneyWhileItLasts() (gas: 11791865)\n[PASS] test_revealIssuesTheItemAndSkipsRevealedMints() (gas: 2734640)\n[PASS] test_revealWaitsForDrand() (gas: 281816)\n[PASS] test_sharedEarningsByWeight() (gas: 2307522)\n[PASS] test_sponsorBeforeAnyPartReverts() (gas: 64052)\n[PASS] test_sponsorPaysTheRunningMachine() (gas: 428862)\n[PASS] test_viewsStatusBoardInventoryPending() (gas: 959922)\n[PASS] test_wiringRules() (gas: 773611)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 766.79ms (852.42ms CPU time)\n\nRan 9 tests for test/Referrals.t.sol:ReferralsTest\n[PASS] testFuzz_referralOnlyReroutesSharedAndAllFeesAreHeld(uint8) (runs: 512, μ: 5452108, ~: 3251962)\n[PASS] testFuzz_selfReferralAndSecondWalletHaveIdenticalCombinedReturn(uint8) (runs: 512, μ: 4625602, ~: 2664395)\n[PASS] test_creditSurvivesRoundsAndNoReferralDoesNotRememberOldAddress() (gas: 676575)\n[PASS] test_failedPaymentAndPriceLimitDoNotCreditReferral() (gas: 260765)\n[PASS] test_giftMayReferPayerOrRecipient() (gas: 475904)\n[PASS] test_giftReferralAndClaimsBelongToCorrectWallets() (gas: 533959)\n[PASS] test_invalidReferralsKeepFullSharedAllocation() (gas: 878651)\n[PASS] test_overduePendingMintKeepsPlugAndReferralRemainsFunded() (gas: 427776)\n[PASS] test_withoutBuildersUnassignedSharedGoesToPot() (gas: 314434)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 822.68ms (1.07s CPU time)\n\nRan 5 tests for test/security/Geometry.t.sol:SecurityGeometryTest\n[PASS] testFuzz_signedCellKeyHasExactIndependentByteLanes(uint192,int32,int32) (runs: 512, μ: 7319, ~: 7319)\n[PASS] test_allTemplateRotationsUseIndependentCoordinateAndDirectionModel() (gas: 787984)\n[PASS] test_directionStepsAndOppositesMatchScreenCoordinates() (gas: 88100)\n[PASS] test_everyCellOfMulticellFootprintMustBeWithinBounds() (gas: 75877)\n[PASS] test_realGrowthAcrossSignedCoordinatesDoesNotAliasRounds() (gas: 42628515)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.47s (62.04ms CPU time)\n\nRan 7 tests for test/audit/Beacon.t.sol:BeaconTest\n[PASS] testFuzz_mintRoundIsInTheFuture(uint32) (runs: 512, μ: 16335, ~: 16335)\n[PASS] testFuzz_roundAtIsFirstRoundAtOrAfter(uint32) (runs: 512, μ: 12818, ~: 12818)\n[PASS] test_IM05_marginCoversALaggingSequencer() (gas: 4975550)\n[PASS] test_IM05_nineSecondLagIsTheLimit() (gas: 4932580)\n[PASS] test_invalidProofBurnsForwardedGas() (gas: 4953303)\nLogs:\n  gas used by a failing proof (5M forwarded): 4950432\n\n[PASS] test_liveRoundsVerifyAndDoNotCrossOver() (gas: 3183285)\nLogs:\n  prove gas: 278144\n\n[PASS] test_publicKeyIsDrandsEvmnetKey() (gas: 31184)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 1.47s (58.27ms CPU time)\n\nRan 18 tests for test/security/Lifecycle.t.sol:SecurityLifecycleTest\n[PASS] testFuzz_approvalsCannotTransferOrPlaceItems(bool) (runs: 512, μ: 684677, ~: 684674)\n[PASS] test_agentCoreProofBindsCallerAndCannotReplay() (gas: 274118)\n[PASS] test_claimAcrossOldAndCurrentRoundsWithDuplicates() (gas: 1052844)\n[PASS] test_claimForeignLastIdRollsBackPriorCreditsAndDebt() (gas: 1439807)\n[PASS] test_claimTransferFailureRestoresDebtAndCreditForRetry() (gas: 1529755)\n[PASS] test_deadlineFundingRoutesToReserveAndMatchesOnlyOnce() (gas: 734209)\n[PASS] test_directDonationCreatesSurplusWithoutNewLiability() (gas: 1102423)\n[PASS] test_emptyClaimAndRepeatedRevealCannotCreateValue() (gas: 1270676)\n[PASS] test_failedBuildRollsBackRealProofRevealsAndGeometry() (gas: 9141464)\n[PASS] test_frequentClaimsPreserveFractionalDebtForEveryWeight() (gas: 36762359)\n[PASS] test_giftOwnershipPlacementAndPermanentClaimRights() (gas: 1239084)\n[PASS] test_invalidTrailingSpotAndUnreadyRevealAbortTheWholeBuild() (gas: 2134550)\n[PASS] test_latePlacementCannotClaimEarlierSharedIncome() (gas: 829655)\n[PASS] test_mintPriceFailureRollsBackTentativeRoundEndAndExtras() (gas: 79864572)\n[PASS] test_mintTransferFailureRollsBackTentativeRoundEnd() (gas: 1866863)\n[PASS] test_payDevFailurePreservesBalanceAndAnyonePaysOnlyDeveloper() (gas: 497443)\n[PASS] test_revealLateFailureRollsBackEarlierItemIssue() (gas: 1827309)\n[PASS] test_staleBuildAndExactDeadlineNeverPlaceIntoNextRound() (gas: 555330)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 1.94s (280.41ms CPU time)\n\nRan 17 tests for test/BoundaryWitness.t.sol:BoundaryWitnessTest\n[PASS] test_batchCanRepairAnUnsafeIntermediatePrefix() (gas: 1432581)\n[PASS] test_blankOutwardFaceOnTheEdgeIsNotAnExit() (gas: 515650)\n[PASS] test_cannotRepairDraftWithAnotherPlayersPart() (gas: 1175049)\n[PASS] test_capOnlyFreezeRevertsEvenThoughOneSocketRemains() (gas: 38866235)\n[PASS] test_clockStillEndsRoundAndIncomeRemainsClaimable() (gas: 2909501)\n[PASS] test_concurrentBuildMakesAnOldExitStaleWithoutLosingInventory() (gas: 1051113)\n[PASS] test_coordinateLimitsRequireAnInBoundsNextCellInEveryDirection() (gas: 4891450)\n[PASS] test_everyTemplateAndRotationHasAValidInstallationAndContinuation() (gas: 138549532)\n[PASS] test_forgedDirectionEmptyCellBlankFaceAndStaleEdgeReject() (gas: 1661926)\n[PASS] test_fourMidcapsRevertAtomicallyAlthoughEightSocketsRemain() (gas: 11225222)\n[PASS] test_fullSealRevertsAndDoesNotPayPrizes() (gas: 29787641)\n[PASS] test_fuzzBatchAndOutwardContinuation(uint8) (runs: 512, μ: 3318327, ~: 2148299)\n[PASS] test_fuzzCannotForgeSocketOnInitialCore(int32,int32,uint8) (runs: 512, μ: 72865, ~: 72639)\n[PASS] test_invalidExitDoesNotCommitPlugPayOrClockOrConsumption() (gas: 1192603)\n[PASS] test_noUnprotectedBuildEntryPoint() (gas: 4095938)\n[PASS] test_proofRevealAndAccountingRollBackForInvalidFinalWitness() (gas: 1575416)\n[PASS] test_repeatingAnItemCannotConsumeItOrPayTwice() (gas: 465733)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 7.40s (714.05ms CPU time)\n\nRan 10 tests for test/security/EconomicsAndItems.t.sol:SecurityEconomicsAndItemsTest\n[PASS] test_batchCrossingPriceBoundaryMatchesSequentialCostsAndPlugFloors() (gas: 79006938)\n[PASS] test_consumedItemsLeaveInventory() (gas: 309574)\n[PASS] test_failedPartMintDoesNotInflateSupply() (gas: 209341)\n[PASS] test_fullRoundWithoutPlacementsPaysNoPrize() (gas: 78648326)\n[PASS] test_idSpaceAndPaidPositionsIncludeCoreAndOverdueMints() (gas: 82922288)\n[PASS] test_inventoryAdvertisesNoNftInterfaces() (gas: 5597)\n[PASS] test_issuingPartsDoesNotInvokeReceiverCallbacks() (gas: 281821)\n[PASS] test_itemsIssueAndConsumeRequireMachine() (gas: 194364)\n[PASS] test_prizeMintThresholdsZeroOne1499_1500_1501() (gas: 238592387)\n[PASS] test_sparsePrizePlacesAreNotRenormalizedAndEleventhGetsNothing() (gas: 90690205)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 7.41s (113.20ms CPU time)\n\nRan 2 tests for test/Big.t.sol:BigMachineTest\n[PASS] testFuzz_openCounterIsExact(uint256) (runs: 512, μ: 68638867, ~: 67719462)\n[PASS] test_bigMachine() (gas: 1035194404)\nLogs:\n  parts placed: 688\n  open sockets: 148\n  width: 57\n  height: 41\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 7.68s (9.61s CPU time)\n\nRan 6 tests for test/Rework.t.sol:ReworkTest\n[PASS] testFuzz_mintAllocationConservesEveryWeiWithReserveMatching(uint96,uint8,bool,bool) (runs: 512, μ: 1016019, ~: 955397)\n[PASS] testFuzz_pendingPurchaseCannotBeCancelledAfterAnyDelay(uint32) (runs: 512, μ: 340966, ~: 340966)\n[PASS] test_newReserveCutOnlyMatchesLaterMintPotMoney() (gas: 490447)\n[PASS] test_productionRejectsRemovedGameFeatureSelectors() (gas: 5913397)\n[PASS] test_realProofRevealsMonthOldPurchaseAfterRoundEndWithoutRedraw() (gas: 7652636)\n[PASS] test_roundSettlementMakesNoDependencyCallsAndEarningsRemainClaimable() (gas: 1036360)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 7.68s (7.88s CPU time)\n\nRan 4 tests for test/RaritySockets.t.sol:RaritySocketsTest\n[PASS] testFuzz_eightIncomingPaymentsConserveFundsAndRemainClaimable(uint96,uint8) (runs: 512, μ: 6770668, ~: 6766039)\n[PASS] test_eightLinksCannotCommitThroughAnInvalidWitness() (gas: 5220436)\n[PASS] test_eightSelfConnectionsOnlyRecycleTheFundedAllocation() (gas: 5408980)\n[PASS] test_socketCountsAndOnlyExternalPorts() (gas: 126322)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 7.68s (7.68s CPU time)\n\nRan 15 tests for test/EdgeCases.t.sol:EdgeCasesTest\n[PASS] testFuzz_batchBuildEqualsTheSameSpotsOneByOne(uint256) (runs: 512, μ: 14444370, ~: 13949918)\n[PASS] testFuzz_checkAgreesWithBuild(uint16,uint8,int32,int32) (runs: 2048, μ: 1674793, ~: 1656465)\n[PASS] testFuzz_deadlineIsMonotonicAndCapped(uint256) (runs: 512, μ: 5302871, ~: 5500677)\n[PASS] testFuzz_mintedPartsMatchTheirRollAndAreNeverAgentCores(uint256) (runs: 512, μ: 9367, ~: 9023)\n[PASS] testFuzz_rollDropResolves(uint8,uint256) (runs: 512, μ: 3100, ~: 2928)\n[PASS] test_endRoundOnlyOnceAndNeverEarly() (gas: 249543)\n[PASS] test_everyDesignWeighsByItsTier() (gas: 240915)\n[PASS] test_mintAtTheExactDeadlineOpensTheNextRoundAtTheBasePrice() (gas: 653805)\n[PASS] test_oneBuildExtendsTheClockPerPartUpToTheCap() (gas: 5248290)\n[PASS] test_placeSharesCoverTheWholePrizeAndStopAtTen() (gas: 80999)\n[PASS] test_placingAnUnrevealedMintRevertsAndLeavesItPending() (gas: 451785)\n[PASS] test_prizePlacesFollowSpotOrderWithinOneBuild() (gas: 2926930)\n[PASS] test_revealIgnoresUnknownZeroAndAlreadyRevealedIds() (gas: 830425)\n[PASS] test_rollTierBoundaries() (gas: 53254)\n[PASS] test_sponsorWorksOneSecondBeforeTheDeadlineAndNotAtIt() (gas: 491968)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 7.68s (10.47s CPU time)\n\nRan 3 tests for test/AgentCoreSeats.t.sol:AgentCoreSeatsTest\n[PASS] testFuzz_everyUint16SeatCanBeClaimed(uint16) (runs: 512, μ: 1095251, ~: 1095271)\n[PASS] test_maximumSeatCanBeClaimedAndRead() (gas: 1095327)\n[PASS] test_zeroSeatDoesNotUseTheNoSeatSentinel() (gas: 1095225)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 7.68s (7.69s CPU time)\n\nRan 10 tests for test/EthMinter.t.sol:EthMinterTest\n[PASS] testFuzz_atomicMintRefundAndOwnership(uint8,uint96) (runs: 512, μ: 6089714, ~: 2786437)\n[PASS] testFuzz_ethReferralUsesImdPriceAndRefundsUnusedEth(uint8,uint96) (runs: 512, μ: 2362548, ~: 1229160)\n[PASS] test_batchAndCallbackChecks() (gas: 117809)\n[PASS] test_ethSelfReferralAllowedAndHelperDoesNotRetainReward() (gas: 724528)\n[PASS] test_giftChargesOnlyPayer() (gas: 539888)\n[PASS] test_insufficientEthRevertsEntireMint() (gas: 233874)\n[PASS] test_newRoundQuoteAndPayment() (gas: 1201416)\n[PASS] test_partialFillReverts() (gas: 154314)\n[PASS] test_priceLimitAndExpiry() (gas: 134888)\n[PASS] test_refundRejectRevertsAndReentryIsBlocked() (gas: 1520855)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 7.68s (9.14s CPU time)\n\nRan 2 tests for test/Invariant.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_burnIsTwoPercent\n[PASS] invariant_conservation\n[PASS] invariant_openSocketsAndWiring\n[PASS] invariant_roundsAndSupply\n[PASS] invariant_solventAndExact\n InvariantTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭----------+---------------+-------+---------+----------╮\n| Contract | Selector      | Calls | Reverts | Discards |\n+=======================================================+\n| Handler  | claim         | 1244  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | claimCore     | 1298  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | claimReferral | 1237  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | endRound      | 1262  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | fund          | 1300  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | giftMint      | 1293  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | mint          | 1248  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | payDev        | 1261  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | place         | 1243  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | referredMint  | 1239  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | reveal        | 1236  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | transfer      | 1309  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | warp          | 1214  | 0       | 0        |\n╰----------+---------------+-------+---------+----------╯\n\nLogs:\n  rounds: 2\n  parts placed: 32\n  claimed (milli-IMD): 37163\n  gift mints executed: 14\n  transfers rejected: 4\n  cores claimed: 2\n\n[PASS] test_handlerExercisesGiftTransferCoreAndRetainsOverduePendingLiability() (gas: 1647486)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 67.37s (67.37s CPU time)\n\nRan 29 test suites in 67.37s (135.54s CPU time): 231 tests passed, 0 failed, 3 skipped (234 total tests)\n","passed":true},{"durationMs":85,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DevEthPool.settle()\",\"DevEthPool.swap((address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"DevEthPool.take(address,address,uint256)\",\"DevEthPool.unlock(bytes)\",\"DevIMD.approve(address,uint256)\",\"DevIMD.mint(address,uint256)\",\"DevIMD.transfer(address,uint256)\",\"DevIMD.transferFrom(address,address,uint256)\",\"DrandBeacon.prove(uint64,bytes)\",\"EthMinter.mint(uint256,uint256,uint256)\",\"EthMinter.mintWithReferral(uint256,uint256,uint256,address)\",\"EthMinter.quote(uint256)\",\"EthMinter.unlockCallback(bytes)\",\"IdentityMachine.build(uint256,(uint64,bytes)[],uint256[],(uint256,uint8,int32,int32)[],(int32,int32,uint8))\",\"IdentityMachine.claim(uint256[])\",\"IdentityMachine.claimAgentCore(uint16,bytes32[])\",\"IdentityMachine.claimReferral()\",\"IdentityMachine.endRound()\",\"IdentityMachine.fundPot(uint256)\",\"IdentityMachine.fundReserve(uint256)\",\"IdentityMachine.mint(uint256,uint256)\",\"IdentityMachine.mintFor(address,uint256,uint256)\",\"IdentityMachine.mintForWithReferral(address,uint256,uint256,address)\",\"IdentityMachine.mintWithReferral(uint256,uint256,address)\",\"IdentityMachine.payDev()\",\"IdentityMachine.reveal(uint256[])\",\"IdentityMachine.sponsor(uint256)\",\"Parts.burn(uint256)\",\"Parts.mint(address,uint256)\"],\"files\":{\".gitignore\":18,\"ADAPTATION.md\":116,\"LICENSE\":16,\"app/.gitignore\":1,\"app/archive.html\":24,\"app/docs.html\":20,\"app/index.html\":126,\"app/package-lock.json\":1435,\"app/package.json\":25,\"app/parts.html\":24,\"app/public/brand/favicon.svg\":1,\"app/public/brand/mark.svg\":1,\"app/public/llms.txt\":163,\"app/public/parts-loader-static.svg\":7,\"app/public/parts-loader.svg\":71,\"app/public/seats.json\":1,\"app/scripts/abi.mjs\":10,\"app/scripts/swarm-deploy.mjs\":47,\"app/scripts/swarm-manifest.mjs\":90,\"app/src/abi/DevIMD.json\":333,\"app/src/abi/DrandBeacon.json\":249,\"app/src/abi/EthMinter.json\":360,\"app/src/abi/IdentityMachine.json\":1756,\"app/src/abi/MachineViews.json\":481,\"app/src/abi/Parts.json\":166,\"app/src/archive.ts\":157,\"app/src/build.ts\":38,\"app/src/catalog.ts\":61,\"app/src/chain.ts\":137,\"app/src/crt.ts\":185,\"app/src/docs.ts\":184,\"app/src/econ.ts\":52,\"app/src/eth.ts\":49,\"app/src/explore.ts\":200,\"app/src/geometry.ts\":405,\"app/src/jackpot.ts\":112,\"app/src/main.ts\":1595,\"app/src/parts.gen.ts\":20,\"app/src/rarity.ts\":7,\"app/src/referrals.ts\":99,\"app/src/render.ts\":740,\"app/src/reveal.ts\":35,\"app/src/shell.ts\":160,\"app/src/signals.ts\":230,\"app/src/store.ts\":683,\"app/src/style.css\":995,\"app/src/topten.ts\":54,\"app/src/ui.ts\":85,\"app/src/usd.ts\":74,\"app/src/vite-env.d.ts\":1,\"app/src/wallet.ts\":146,\"app/tsconfig.json\":16,\"app/vite.config.ts\":15,\"art/brand.mjs\":19,\"art/loader.mjs\":60,\"art/out/templates.json\":1,\"art/parts.mjs\":1138,\"foundry.toml\":32,\"launch.json\":37,\"remappings.txt\":3,\"script/Deploy.s.sol\":106,\"script/DevDeploy.s.sol\":37,\"scripts/dev.sh\":20,\"scripts/fork.sh\":94,\"scripts/fund.sh\":14,\"src/DrandBeacon.sol\":68,\"src/EthMinter.sol\":162,\"src/IdentityMachine.sol\":684,\"src/MachineViews.sol\":233,\"src/Parts.sol\":46,\"src/Shapes.sol\":144,\"src/art/Catalog.sol\":61,\"src/dev/DevEthPool.sol\":63,\"src/dev/DevIMD.sol\":13,\"test/AgentCoreSeats.t.sol\":63,\"test/AuditFixes.t.sol\":58,\"test/Base.sol\":482,\"test/Big.t.sol\":40,\"test/BoundaryWitness.t.sol\":334,\"test/Deploy.t.sol\":143,\"test/DrandBeacon.t.sol\":31,\"test/EdgeCases.t.sol\":345,\"test/EthMinter.t.sol\":254,\"test/Fork.t.sol\":146,\"test/Gas.t.sol\":83,\"test/InstallLimit.t.sol\":64,\"test/Invariant.t.sol\":425,\"test/Inventory.t.sol\":67,\"test/LaunchDeployment.t.sol\":133,\"test/Machine.t.sol\":391,\"test/Mocks.sol\":45,\"test/RaritySockets.t.sol\":118,\"test/Referrals.t.sol\":169,\"test/Rework.t.sol\":147,\"test/Rounds.t.sol\":276,\"test/audit/Beacon.t.sol\":128,\"test/audit/vectors/drand-info.json\":9,\"test/fixtures-seat.json\":1,\"test/security/Beacon.t.sol\":92,\"test/security/Checkout.t.sol\":404,\"test/security/EconomicsAndItems.t.sol\":154,\"test/security/Geometry.t.sol\":132,\"test/security/Lifecycle.t.sol\":409,\"test/security/RingRecipes.t.sol\":97,\"test/security/TokenCompatibility.t.sol\":70,\"test/security/Views.t.sol\":150},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":8343,"exitCode":0,"name":"slither","output":"[high/medium] weak-prng at src/IdentityMachine.sol:372: IdentityMachine.rollTier(uint256) (src/IdentityMachine.sol#372-375) uses a weak PRNG: \"roll = x % 10_000 (src/IdentityMachine.sol#373)\"\n[medium/medium] divide-before-multiply at src/IdentityMachine.sol:613: IdentityMachine._endRound() (src/IdentityMachine.sol#613-636) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/IdentityMachine.sol:420: IdentityMachine._place(uint256,IdentityMachine.Spot) (src/IdentityMachine.sol#420-461) performs a multiplication on the result of a division:\n[medium/medium] divide-before-multiply at src/IdentityMachine.sol:536: IdentityMachine.claim(uint256[]) (src/IdentityMachine.sol#536-549) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/IdentityMachine.sol:570: IdentityMachine.sponsor(uint256) (src/IdentityMachine.sol#570-576) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/IdentityMachine.sol:344: IdentityMachine._reveal(uint256) (src/IdentityMachine.sol#344-355) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/IdentityMachine.sol:643: IdentityMachine._distribute(IdentityMachine.Round,uint256) (src/IdentityMachine.sol#643-651) uses a dangerous strict equality:\n[medium/high] locked-ether at src/dev/DevEthPool.sol:49: Contract locking ether found:\n[medium/medium] reentrancy-no-eth at src/IdentityMachine.sol:389: Reentrancy in IdentityMachine.build(uint256,IdentityMachine.Proof[],uint256[],IdentityMachine.Spot[],IdentityMachine.GrowthExit) (src/IdentityMachine.sol#389-407):\n[medium/medium] reentrancy-no-eth at src/dev/DevEthPool.sol:28: Reentrancy in DevEthPool.unlock(bytes) (src/dev/DevEthPool.sol#28-34):\n[medium/medium] reentrancy-no-eth at src/IdentityMachine.sol:420: Reentrancy in IdentityMachine._place(uint256,IdentityMachine.Spot) (src/IdentityMachine.sol#420-461):\n[medium/medium] uninitialized-local at src/IdentityMachine.sol:324: IdentityMachine._mint(address,uint256,uint256,address).reward (src/IdentityMachine.sol#324) is a local variable never initialized\n[medium/medium] uninitialized-local at src/IdentityMachine.sol:620: IdentityMachine._endRound().paid (src/IdentityMachine.sol#620) is a local variable never initialized\n[medium/medium] uninitialized-local at src/IdentityMachine.sol:297: IdentityMachine._mint(address,uint256,uint256,address).plugs (src/IdentityMachine.sol#297) is a local variable never initialized\n[medium/medium] unused-return at src/EthMinter.sol:147: EthMinter.unlockCallback(bytes) (src/EthMinter.sol#147-161) ignores return value by poolManager.settle{value: spent}() (src/EthMinter.sol#158)\n[medium/medium] unused-return at src/EthMinter.sol:124: EthMinter._mint(uint256,uint256,uint256,address) (src/EthMinter.sol#124-145) ignores return value by (firstMintId,None) = machine.mintForWithReferral(msg.sender,n,total,address(0)) (src/EthMinter.sol#137-138)\n[medium/medium] unused-return at src/EthMinter.sol:124: EthMinter._mint(uint256,uint256,uint256,address) (src/EthMinter.sol#124-145) ignores return value by (firstMintId,None) = machine.mintForWithReferral(msg.sender,n,total,referrer) (src/EthMinter.sol#137-138)\n[medium/medium] unused-return at src/MachineViews.sol:100: MachineViews.roundInfo(uint256) (src/MachineViews.sol#100-116) ignores return value by (begin,deadline,ended,mints,placed,open,minX,minY,maxX,maxY,None,pot,None,prize) = machine.rounds(round) (src/MachineViews.sol#101-114)\n[medium/medium] unused-return at src/MachineViews.sol:67: MachineViews.status(address,uint256[]) (src/MachineViews.sol#67-98) ignores return value by Arrays.sort(sorted) (src/MachineViews.sol#93)\n[medium/medium] unused-return at src/MachineViews.sol:67: MachineViews.status(address,uint256[]) (src/MachineViews.sol#67-98) ignores return value by (None,None,None,None,None,None,None,None,None,None,tw,None,None,None) = m.rounds(s.round) (src/MachineViews.sol#83)\n[medium/medium] unused-return at src/EthMinter.sol:97: EthMinter.quote(uint256) (src/EthMinter.sol#97-103) ignores return value by (ethTotal,None) = quoter.quoteExactOutputSingle(EthQuoteParams(poolKey(),true,uint128(imdTotal),)) (src/EthMinter.sol#102)\n[medium/medium] unused-return at src/MachineViews.sol:132: MachineViews.board(uint256,uint256,uint256) (src/MachineViews.sol#132-145) ignores return value by (None,None,None,None,placed,None,None,None,None,None,None,None,None,None) = machine.rounds(round) (src/MachineViews.sol#133)\n[medium/medium] unused-return at src/MachineViews.sol:132: MachineViews.board(uint256,uint256,uint256) (src/MachineViews.sol#132-145) ignores return value by (design,rot,place,None,x,y,None,None) = machine.parts(id) (src/MachineViews.sol#139)\n[medium/medium] unused-return at src/MachineViews.sol:149: MachineViews.inventory(address,uint256,uint256) (src/MachineViews.sol#149-176) ignores return value by (design,None,None,None,None,None,seatPlus1,plug) = machine.parts(id) (src/MachineViews.sol#166)\n[medium/medium] unused-return at src/MachineViews.sol:203: MachineViews.claimable(address,uint256[]) (src/MachineViews.sol#203-223) ignores return value by Arrays.sort(sorted) (src/MachineViews.sol#210)\n[medium/medium] unused-return at src/IdentityMachine.sol:389: IdentityMachine.build(uint256,IdentityMachine.Proof[],uint256[],IdentityMachine.Spot[],IdentityMachine.GrowthExit) (src/IdentityMachine.sol#389-407) ignores return value by beacon.prove(proofs[i].drandRound,proofs[i].sig) (src/IdentityMachine.sol#400)\n[low/medium] events-maths at src/dev/DevEthPool.sol:35: DevEthPool.swap(EthPoolKey,EthSwapParams,bytes) (src/dev/DevEthPool.sol#35-48) should emit an event for: \n[low/medium] missing-zero-check at src/Parts.sol:21: Parts.constructor(address).machine_ (src/Parts.sol#21) lacks a zero-check on :\n[low/medium] calls-loop at src/MachineViews.sol:132: MachineViews.board(uint256,uint256,uint256) (src/MachineViews.sol#132-145) has external calls inside a loop: id = machine.order(round,k) (src/MachineViews.sol#138)\n[low/medium] calls-loop at src/IdentityMachine.sol:344: IdentityMachine._reveal(uint256) (src/IdentityMachine.sol#344-355) has external calls inside a loop: inventory.mint(pm.owner,id) (src/IdentityMachine.sol#353)\n[low/medium] calls-loop at src/MachineViews.sol:67: MachineViews.status(address,uint256[]) (src/MachineViews.sol#67-98) has external calls inside a loop: s.earned += m.earned(sorted[i]) (src/MachineViews.sol#96)\n[low/medium] calls-loop at src/IdentityMachine.sol:420: IdentityMachine._place(uint256,IdentityMachine.Spot) (src/IdentityMachine.sol#420-461) has external calls inside a loop: inventory.burn(id) (src/IdentityMachine.sol#430)\n[low/medium] calls-loop at src/MachineViews.sol:132: MachineViews.board(uint256,uint256,uint256) (src/MachineViews.sol#132-145) has external calls inside a loop: out[j] = uint256(uint160(machine.placerOf(id))) | (uint256(design) << 160) | (uint256(rot) << 176) | (uint256(place) << 184) (src/MachineViews.sol#141-142)\n[low/medium] calls-loop at src/MachineViews.sol:149: MachineViews.inventory(address,uint256,uint256) (src/MachineViews.sol#149-176) has external calls inside a loop: (design,None,None,None,None,None,seatPlus1,plug) = machine.parts(id) (src/MachineViews.sol#166)\n[low/medium] calls-loop at src/MachineViews.sol:203: MachineViews.claimable(address,uint256[]) (src/MachineViews.sol#203-223) has external calls inside a loop: e = machine.earned(sorted[i]) (src/MachineViews.sol#215)\n[low/medium] calls-loop at src/IdentityMachine.sol:420: IdentityMachine._place(uint256,IdentityMachine.Spot) (src/IdentityMachine.sol#420-461) has external calls inside a loop: inventory.ownerOf(id) != msg.sender (src/IdentityMachine.sol#422)\n[low/medium] calls-loop at src/IdentityMachine.sol:344: IdentityMachine._reveal(uint256) (src/IdentityMachine.sol#344-355) has external calls inside a loop: inventory.mint(pm.owner,id) (src/IdentityMachine.sol#353)\n[low/medium] calls-loop at src/MachineViews.sol:203: MachineViews.claimable(address,uint256[]) (src/MachineViews.sol#203-223) has external calls inside a loop: machine.placerOf(sorted[i]) != who (src/MachineViews.sol#214)\n[low/medium] calls-loop at src/MachineViews.sol:180: MachineViews.pendingOf(address,uint256,uint256) (src/MachineViews.sol#180-199) has external calls inside a loop: (owner,dr) = machine.pending(id) (src/MachineViews.sol#190)\n[low/medium] calls-loop at src/MachineViews.sol:132: MachineViews.board(uint256,uint256,uint256) (src/MachineViews.sol#132-145) has external calls inside a loop: (design,rot,place,None,x,y,None,None) = machine.parts(id) (src/MachineViews.sol#139)\n[low/medium] calls-loop at src/MachineViews.sol:100: MachineViews.roundInfo(uint256) (src/MachineViews.sol#100-116) has external calls inside a loop: (begin,deadline,ended,mints,placed,open,minX,minY,maxX,maxY,None,pot,None,prize) = machine.rounds(round) (src/MachineViews.sol#101-114)\n[low/medium] calls-loop at src/IdentityMachine.sol:344: IdentityMachine._reveal(uint256) (src/IdentityMachine.sol#344-355) has external calls inside a loop: r = beacon.randomness(pm.drandRound) (src/IdentityMachine.sol#346)\n[low/medium] calls-loop at src/MachineViews.sol:149: MachineViews.inventory(address,uint256,uint256) (src/MachineViews.sol#149-176) has external calls inside a loop: o = ledger.ownerOf(id) (src/MachineViews.sol#161-165)\n[low/medium] calls-loop at src/IdentityMachine.sol:344: IdentityMachine._reveal(uint256) (src/IdentityMachine.sol#344-355) has external calls inside a loop: r = beacon.randomness(pm.drandRound) (src/IdentityMachine.sol#346)\n[low/medium] calls-loop at src/IdentityMachine.sol:389: IdentityMachine.build(uint256,IdentityMachine.Proof[],uint256[],IdentityMachine.Spot[],IdentityMachine.GrowthExit) (src/IdentityMachine.sol#389-407) has external calls inside a loop: beacon.prove(proofs[i].drandRound,proofs[i].sig) (src/IdentityMachine.sol#400)\n[low/medium] reentrancy-benign at src/IdentityMachine.sol:389: Reentrancy in IdentityMachine.build(uint256,IdentityMachine.Proof[],uint256[],IdentityMachine.Spot[],IdentityMachine.GrowthExit) (src/IdentityMachine.sol#389-407):\n[low/medium] reentrancy-benign at src/IdentityMachine.sol:420: Reentrancy in IdentityMachine._place(uint256,IdentityMachine.Spot) (src/IdentityMachine.sol#420-461):\n[low/medium] reentrancy-events at src/IdentityMachine.sol:389: Reentrancy in IdentityMachine.build(uint256,IdentityMachine.Proof[],uint256[],IdentityMachine.Spot[],IdentityMachine.GrowthExit) (src/IdentityMachine.sol#389-407):\n[low/medium] reentrancy-events at src/IdentityMachine.sol:358: Reentrancy in IdentityMachine.claimAgentCore(uint16,bytes32[]) (src/IdentityMachine.sol#358-369):\n[low/medium] reentrancy-events at src/IdentityMachine.sol:389: Reentrancy in IdentityMachine.build(uint256,IdentityMachine.Proof[],uint256[],IdentityMachine.Spot[],IdentityMachine.GrowthExit) (src/IdentityMachine.sol#389-407):\n[low/medium] reentrancy-events at src/IdentityMachine.sol:344: Reentrancy in IdentityMachine._reveal(uint256) (src/IdentityMachine.sol#344-355):\n[low/medium] reentrancy-events at src/IdentityMachine.sol:420: Reentrancy in IdentityMachine._place(uint256,IdentityMachine.Spot) (src/IdentityMachine.sol#420-461):\n[low/medium] timestamp at src/IdentityMachine.sol:358: IdentityMachine.claimAgentCore(uint16,bytes32[]) (src/IdentityMachine.sol#358-369) uses timestamp for comparisons\n[low/medium] timestamp at src/MachineViews.sol:119: MachineViews.archive(uint256,uint256) (src/MachineViews.sol#119-127) uses timestamp for comparisons\n[low/medium] timestamp at src/IdentityMachine.sol:227: IdentityMachine.timeLeft() (src/IdentityMachine.sol#227-230) uses timestamp for comparisons\n[low/medium] timestamp at src/IdentityMachine.sol:285: IdentityMachine._mint(address,uint256,uint256,address) (src/IdentityMachine.sol#285-334) uses timestamp for comparisons\n[low/medium] timestamp at src/IdentityMachine.sol:389: IdentityMachine.build(uint256,IdentityMachine.Proof[],uint256[],IdentityMachine.Spot[],IdentityMachine.GrowthExit) (src/IdentityMachine.sol#389-407) uses timestamp for comparisons\n[low/medium] timestamp at src/IdentityMachine.sol:344: IdentityMachine._reveal(uint256) (src/IdentityMachine.sol#344-355) uses timestamp for comparisons\n[low/medium] timestamp at src/IdentityMachine.sol:559: IdentityMachine.claimReferral() (src/IdentityMachine.sol#559-566) uses timestamp for comparisons\n[low/medium] timestamp at src/IdentityMachine.sol:570: IdentityMachine.sponsor(uint256) (src/IdentityMachine.sol#570-576) uses timestamp for comparisons\n[low/medium] timestamp at src/IdentityMachine.sol:338: IdentityMachine.reveal(uint256[]) (src/IdentityMachine.sol#338-342) uses timestamp for comparisons\n[low/medium] timestamp at src/IdentityMachine.sol:420: IdentityMachine._place(uint256,IdentityMachine.Spot) (src/IdentityMachine.sol#420-461) uses timestamp for comparisons\n[low/medium] timestamp at src/IdentityMachine.sol:582: IdentityMachine.leaders(uint256) (src/IdentityMachine.sol#582-588) uses timestamp for comparisons\n[low/medium] timestamp at src/IdentityMachine.sol:372: IdentityMachine.rollTier(uint256) (src/IdentityMachine.sol#372-375) uses timestamp for comparisons\n[low/medium] timestamp at src/EthMinter.sol:124: EthMinter._mint(uint256,uint256,uint256,address) (src/EthMinter.sol#124-145) uses timestamp for comparisons\n[low/medium] timestamp at src/IdentityMachine.sol:643: IdentityMachine._distribute(IdentityMachine.Round,uint256) (src/IdentityMachine.sol#643-651) uses timestamp for comparisons\n[low/medium] timestamp at src/IdentityMachine.sol:599: IdentityMachine._live() (src/IdentityMachine.sol#599-601) uses timestamp for comparisons","passed":true},{"durationMs":816,"exitCode":0,"name":"aderyn","output":"[high] contract-locks-ether at src/dev/DevEthPool.sol:10: Contract locks Ether without a withdraw function\n[high] reentrancy-state-change at src/EthMinter.sol:77: Reentrancy: State change after external call (3 places)\n[high] unsafe-casting at src/IdentityMachine.sol:426: Unsafe Casting of integers (2 places)\n[low] costly-loop at src/IdentityMachine.sol:298: Costly operations inside loop (7 places)\n[low] internal-function-used-once at src/Shapes.sol:106: Internal Function Used Only Once\n[low] large-numeric-literal at src/EthMinter.sol:73: Large Numeric Literal (6 places)\n[low] literal-instead-of-constant at src/IdentityMachine.sol:351: Literal Instead of Constant (70 places)\n[low] local-variable-shadowing at src/IdentityMachine.sol:64: Local Variable Shadows State Variable\n[low] missing-inheritance at src/Parts.sol:7: Missing Inheritance (2 places)\n[low] push-zero-opcode at src/DrandBeacon.sol:2: PUSH0 Opcode (9 places)\n[low] require-revert-in-loop at src/IdentityMachine.sol:298: Loop Contains `require`/`revert` (7 places)\n[low] state-change-without-event at src/EthMinter.sol:147: State Change Without Event (6 places)\n[low] unchecked-return at src/IdentityMachine.sol:400: Unchecked Return (3 places)\n[low] uninitialized-local-variable at src/IdentityMachine.sol:219: Uninitialized Local Variable (14 places)\n[low] unspecific-solidity-pragma at src/DrandBeacon.sol:2: Unspecific Solidity Pragma (7 places)\n[low] unused-public-function at src/IdentityMachine.sol:233: Public Function Not Used Internally (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a2b72f7f6dc4cc6cadcd33e2241311907a35e1897949c0097f904e08fc8d031b","verifiedTreeHash":"8ba61138e10bcbe1101271584b5e540df3e12187","verifierVersion":"0.1.0+d952fceb"},{"checks":[{"durationMs":222523,"exitCode":0,"name":"build","output":"Compiling 85 files with Solc 0.8.26\nSolc 0.8.26 finished in 222.38s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n  --> script/Deploy.s.sol:40:38:\n   |\n40 |     function deploy(Config memory c, address deployer) internal returns (System memory s) {\n   |                                      ^^^^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":79448,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/EthMinter.t.sol:EthMinterForkTest\n[SKIP] test_liveExactOutputPool() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 305.19µs (67.86µs CPU time)\n\nRan 2 tests for test/Fork.t.sol:ForkTest\n[SKIP] test_imdOwnerBlocklistCanFreezeAHolder() (gas: 0)\n[SKIP] test_onRobinhood() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 2 skipped; finished in 535.23µs (60.57µs CPU time)\n\nRan 4 tests for test/AuditFixes.t.sol:AuditFixesTest\n[PASS] test_checkFollowsTheClock() (gas: 253078)\n[PASS] test_constructorRefusesZeroDevAndZeroPrice() (gas: 8668)\n[PASS] test_sponsorAfterRolloverReverts() (gas: 552725)\n[PASS] test_sponsorWithNothingPlacedReverts() (gas: 206444)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.66ms (1.49ms CPU time)\n\nRan 2 tests for test/security/TokenCompatibility.t.sol:SecurityTokenCompatibilityTest\n[PASS] test_falseReturnTransferRollsBackTokenMutationAndPendingMint() (gas: 1455958)\n[PASS] test_noReturnTransfersSupportMintClaimAndFunding() (gas: 2241166)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 3.90ms (1.72ms CPU time)\n\nRan 4 tests for test/Inventory.t.sol:InventoryTest\n[PASS] test_itemsRemainOwnedAcrossRoundsAndAreConsumedOnce() (gas: 525393)\n[PASS] test_largeMintAndLazyResolutionKeepTheRemainingItems() (gas: 6528619)\n[PASS] test_largeMintCannotBypassSlippageLimit() (gas: 4885708)\n[PASS] test_twoHundredItemMintGasAndExactQuote() (gas: 9906847)\nLogs:\n  mint(200) gas: 9744683\n\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.70ms (3.45ms CPU time)\n\nRan 3 tests for test/InstallLimit.t.sol:InstallLimitTest\n[PASS] test_fiftyFundedPartsInstallAndRemainSolventAndClaimable() (gas: 14174071)\nLogs:\n  50 funded straight parts execution gas: 7807628\n\n[PASS] test_fiftyOneRejectsBeforeBeaconRevealOrPlacement() (gas: 4409744)\n[PASS] test_mintLimitRemainsTwoHundred() (gas: 9759724)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 9.06ms (9.10ms CPU time)\n\nRan 2 tests for test/DrandBeacon.t.sol:DrandBeaconTest\n[PASS] test_roundClock() (gas: 14153)\n[PASS] test_verifiesLiveEvmnetRound() (gas: 553482)\nLogs:\n  drand verify gas: 287360\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 9.34ms (8.32ms CPU time)\n\nRan 8 tests for test/security/Beacon.t.sol:SecurityBeaconTest\n[PASS] test_appendingBytesCannotChooseDifferentRandomness() (gas: 328501)\n[PASS] test_cachedRoundIsImmutableEvenWithDifferentOrMalformedProof() (gas: 351330)\n[PASS] test_clockAtGenesisAndExactPeriodEdges() (gas: 29397)\n[PASS] test_infinityPointIsNotAValidSignature() (gas: 250239)\n[PASS] test_invalidUncachedPointDoesNotPoisonSubsequentValidProof() (gas: 299073)\n[PASS] test_nonCanonicalAndNegatedEncodingsDoNotVerify() (gas: 4546952)\n[PASS] test_roundZeroTimestampIsRejected() (gas: 8679)\n[PASS] test_signatureMustHaveCanonicalLengthOnUncachedRound() (gas: 148614)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 10.00ms (18.26ms CPU time)\n\nRan 25 tests for test/security/Checkout.t.sol:SecurityCheckoutTest\n[PASS] test_constructorRejectsMissingMachineAndInvalidFeeSpacing() (gas: 8583)\n[PASS] test_dependenciesCanAppearAfterDeploymentAndMintWithoutPriorQuote() (gas: 751688)\n[PASS] test_duplicateCallbackRollsBackAndCanRetry() (gas: 841550)\n[PASS] test_excessOutputRejectedBeforeSettlement() (gas: 705143)\n[PASS] test_expiryIsInclusiveAndNextSecondFails() (gas: 473689)\n[PASS] test_forcedEthAndImdDonationsRemainAtBaseline() (gas: 507888)\n[PASS] test_machineFailureRollsBackSwapExpiredRoundAndPrizes() (gas: 79922707)\n[PASS] test_malformedCallbackDataRollsBackAndCanRetry() (gas: 728040)\n[PASS] test_minimumSignedEthLaneCannotOverflowOrSpendBaseline() (gas: 705656)\n[PASS] test_missingCallbackRollsBackAndCanRetry() (gas: 727758)\n[PASS] test_missingPoolManagerIsRejectedOnUse() (gas: 190804)\n[PASS] test_missingQuoterIsRejectedOnUse() (gas: 197059)\n[PASS] test_negativeImdDeltaRejectedBeforeSettlement() (gas: 705711)\n[PASS] test_poolManagerReadFailureRollsBackAndCanRetry() (gas: 631582)\n[PASS] test_positiveEthDeltaRejectedBeforeSettlement() (gas: 705167)\n[PASS] test_settlementFailureRollsBackAndCanRetry() (gas: 735109)\n[PASS] test_shortOutputRejectedBeforeSettlement() (gas: 705165)\n[PASS] test_staleEthQuoteCannotSpendMoreThanCurrentBudget() (gas: 241882)\n[PASS] test_staleImdQuoteCannotChargeHigherPrice() (gas: 356419)\n[PASS] test_successfulQuoteDoesNotBypassLaterPoolValidation() (gas: 234705)\n[PASS] test_swapFailureRollsBackAndCanRetry() (gas: 702574)\n[PASS] test_takeFailureRollsBackAndCanRetry() (gas: 757822)\n[PASS] test_uint128SignedOutputLimitIsCheckedInQuoteAndMint() (gas: 78357)\n[PASS] test_wrongQuoterManagerIsRejectedOnUse() (gas: 819973)\n[PASS] test_zeroEthDeltaRejectedBeforeSettlement() (gas: 705717)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 16.19ms (17.63ms CPU time)\n\nRan 1 test for test/LaunchDeployment.t.sol:LaunchDeploymentTest\n[PASS] test_manifestDeploysInOneFactoryCallOnEmptyChain() (gas: 31586873)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 40.55ms (40.35ms CPU time)\n\nRan 7 tests for test/audit/Beacon.t.sol:BeaconTest\n[PASS] testFuzz_mintRoundIsInTheFuture(uint32) (runs: 512, μ: 16335, ~: 16335)\n[PASS] testFuzz_roundAtIsFirstRoundAtOrAfter(uint32) (runs: 512, μ: 12818, ~: 12818)\n[PASS] test_IM05_marginCoversALaggingSequencer() (gas: 4975550)\n[PASS] test_IM05_nineSecondLagIsTheLimit() (gas: 4932580)\n[PASS] test_invalidProofBurnsForwardedGas() (gas: 4953303)\nLogs:\n  gas used by a failing proof (5M forwarded): 4950432\n\n[PASS] test_liveRoundsVerifyAndDoNotCrossOver() (gas: 3183285)\nLogs:\n  prove gas: 278144\n\n[PASS] test_publicKeyIsDrandsEvmnetKey() (gas: 31184)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 41.71ms (41.13ms CPU time)\n\nRan 12 tests for test/security/Views.t.sol:SecurityViewsTest\n[PASS] testFuzz_paginationMatchesAvailableIds(uint256,uint256) (runs: 512, μ: 327759, ~: 326213)\n[PASS] test_archiveOversizedPageClampsWithoutOverflow() (gas: 178465)\n[PASS] test_boardOversizedPageClampsWithoutOverflow() (gas: 358648)\n[PASS] test_boardPackingPreservesSignedCoordinatesAndPlacer() (gas: 343515)\n[PASS] test_claimableDeduplicatesAndMatchesActualPayment() (gas: 926154)\n[PASS] test_claimableFiltersForeignUnplacedUnknownAndZeroIds() (gas: 918663)\n[PASS] test_emptyAndZeroPages() (gas: 72994)\n[PASS] test_inventoryOversizedPageClampsWithoutOverflow() (gas: 172837)\n[PASS] test_inventoryParallelArraysTrimAfterForeignOwnershipAndPlacement() (gas: 714990)\n[PASS] test_pendingOversizedPageClampsWithoutOverflow() (gas: 277266)\n[PASS] test_statusCountsEachPartOnce() (gas: 501493)\n[PASS] test_statusOfZeroAddressHasNoWalletBalances() (gas: 55128)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 47.33ms (47.95ms CPU time)\n\nRan 4 tests for test/security/RingRecipes.t.sol:SecurityRingRecipesTest\n[PASS] test_crossesInPlaceOfRingTeesLeaveTwelveOutsideSockets() (gas: 3408670)\n[PASS] test_fourCapsAndRoutingSealAlsoRejects() (gas: 64934383)\n[PASS] test_fourteenCornerSealRejectsAtomically() (gas: 35791801)\n[PASS] test_teesInPlaceOfRingCornersLeaveSixteenOutsideSockets() (gas: 3409112)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 52.25ms (69.56ms CPU time)\n\nRan 7 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_DP01_deployChecks() (gas: 83984)\n[PASS] test_artTemplatesMatchShapes() (gas: 134140)\n[PASS] test_catalogCoversEverySlot() (gas: 127680)\n[PASS] test_countdownStartsAtDeployment() (gas: 25676)\n[PASS] test_deployWiresTheLedgerToTheMachine() (gas: 5718411)\n[PASS] test_launchManifestMatchesTheDeployScript() (gas: 12576012)\n[PASS] test_realSnapshotProof() (gas: 5885916)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 58.83ms (4.79ms CPU time)\n\nRan 6 tests for test/Rework.t.sol:ReworkTest\n[PASS] testFuzz_mintAllocationConservesEveryWeiWithReserveMatching(uint96,uint8,bool,bool) (runs: 512, μ: 1016019, ~: 955397)\n[PASS] testFuzz_pendingPurchaseCannotBeCancelledAfterAnyDelay(uint32) (runs: 512, μ: 340966, ~: 340966)\n[PASS] test_newReserveCutOnlyMatchesLaterMintPotMoney() (gas: 490447)\n[PASS] test_productionRejectsRemovedGameFeatureSelectors() (gas: 5913397)\n[PASS] test_realProofRevealsMonthOldPurchaseAfterRoundEndWithoutRedraw() (gas: 7652636)\n[PASS] test_roundSettlementMakesNoDependencyCallsAndEarningsRemainClaimable() (gas: 1036360)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 202.65ms (205.45ms CPU time)\n\nRan 28 tests for test/Machine.t.sol:MachineTest\n[PASS] testFuzz_mintSplitsExactly(uint8) (runs: 512, μ: 933087, ~: 857801)\n[PASS] testFuzz_quadraticPriceIsExactAndAccelerates(uint32) (runs: 512, μ: 36072, ~: 36072)\n[PASS] test_agentCoreClaim() (gas: 595357)\n[PASS] test_claimPaysThePlacerOnce() (gas: 1658530)\n[PASS] test_coreHasTwelveSockets() (gas: 96387)\n[PASS] test_dropOddsAreWellFormed() (gas: 31031)\n[PASS] test_dropsUseOneMix() (gas: 9123995)\n[PASS] test_itemsCannotBeTransferredAndOnlyTheirRecipientCanPlace() (gas: 485948)\n[PASS] test_mintForGivesThePartsToTheRecipient() (gas: 280651)\n[PASS] test_mintIdIsThePartId() (gas: 697141)\n[PASS] test_mintRoundIsThreeDrandRoundsAhead() (gas: 271125)\n[PASS] test_mintTooExpensiveAndBatchLimits() (gas: 210171)\n[PASS] test_noEarningsBeforePlacing() (gas: 1673212)\n[PASS] test_onlyTheOwnerPlaces() (gas: 428637)\n[PASS] test_payDev() (gas: 1236361)\n[PASS] test_placingConsumesTheItemAndRecordsThePlacer() (gas: 357100)\n[PASS] test_plugPayIntoPartsSplitsEqually() (gas: 838578)\n[PASS] test_plugPayIntoTheCorePaysThePot() (gas: 446554)\n[PASS] test_quadraticPriceCurve() (gas: 706611)\n[PASS] test_quoteSumsPrices() (gas: 103728)\n[PASS] test_reserveMatchesPotMoneyWhileItLasts() (gas: 11791865)\n[PASS] test_revealIssuesTheItemAndSkipsRevealedMints() (gas: 2734640)\n[PASS] test_revealWaitsForDrand() (gas: 281816)\n[PASS] test_sharedEarningsByWeight() (gas: 2307522)\n[PASS] test_sponsorBeforeAnyPartReverts() (gas: 64052)\n[PASS] test_sponsorPaysTheRunningMachine() (gas: 428862)\n[PASS] test_viewsStatusBoardInventoryPending() (gas: 959922)\n[PASS] test_wiringRules() (gas: 773611)\nSuite result: ok. 28 passed; 0 failed; 0 skipped; finished in 215.39ms (255.81ms CPU time)\n\nRan 18 tests for test/security/Lifecycle.t.sol:SecurityLifecycleTest\n[PASS] testFuzz_approvalsCannotTransferOrPlaceItems(bool) (runs: 512, μ: 684677, ~: 684674)\n[PASS] test_agentCoreProofBindsCallerAndCannotReplay() (gas: 274118)\n[PASS] test_claimAcrossOldAndCurrentRoundsWithDuplicates() (gas: 1052844)\n[PASS] test_claimForeignLastIdRollsBackPriorCreditsAndDebt() (gas: 1439807)\n[PASS] test_claimTransferFailureRestoresDebtAndCreditForRetry() (gas: 1529755)\n[PASS] test_deadlineFundingRoutesToReserveAndMatchesOnlyOnce() (gas: 734209)\n[PASS] test_directDonationCreatesSurplusWithoutNewLiability() (gas: 1102423)\n[PASS] test_emptyClaimAndRepeatedRevealCannotCreateValue() (gas: 1270676)\n[PASS] test_failedBuildRollsBackRealProofRevealsAndGeometry() (gas: 9141464)\n[PASS] test_frequentClaimsPreserveFractionalDebtForEveryWeight() (gas: 36762359)\n[PASS] test_giftOwnershipPlacementAndPermanentClaimRights() (gas: 1239084)\n[PASS] test_invalidTrailingSpotAndUnreadyRevealAbortTheWholeBuild() (gas: 2134550)\n[PASS] test_latePlacementCannotClaimEarlierSharedIncome() (gas: 829655)\n[PASS] test_mintPriceFailureRollsBackTentativeRoundEndAndExtras() (gas: 79864572)\n[PASS] test_mintTransferFailureRollsBackTentativeRoundEnd() (gas: 1866863)\n[PASS] test_payDevFailurePreservesBalanceAndAnyonePaysOnlyDeveloper() (gas: 497443)\n[PASS] test_revealLateFailureRollsBackEarlierItemIssue() (gas: 1827309)\n[PASS] test_staleBuildAndExactDeadlineNeverPlaceIntoNextRound() (gas: 555330)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 306.36ms (304.24ms CPU time)\n\nRan 3 tests for test/AgentCoreSeats.t.sol:AgentCoreSeatsTest\n[PASS] testFuzz_everyUint16SeatCanBeClaimed(uint16) (runs: 512, μ: 1095251, ~: 1095271)\n[PASS] test_maximumSeatCanBeClaimedAndRead() (gas: 1095327)\n[PASS] test_zeroSeatDoesNotUseTheNoSeatSentinel() (gas: 1095225)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 777.53ms (780.53ms CPU time)\n\nRan 17 tests for test/BoundaryWitness.t.sol:BoundaryWitnessTest\n[PASS] test_batchCanRepairAnUnsafeIntermediatePrefix() (gas: 1432581)\n[PASS] test_blankOutwardFaceOnTheEdgeIsNotAnExit() (gas: 515650)\n[PASS] test_cannotRepairDraftWithAnotherPlayersPart() (gas: 1175049)\n[PASS] test_capOnlyFreezeRevertsEvenThoughOneSocketRemains() (gas: 38866235)\n[PASS] test_clockStillEndsRoundAndIncomeRemainsClaimable() (gas: 2909501)\n[PASS] test_concurrentBuildMakesAnOldExitStaleWithoutLosingInventory() (gas: 1051113)\n[PASS] test_coordinateLimitsRequireAnInBoundsNextCellInEveryDirection() (gas: 4891450)\n[PASS] test_everyTemplateAndRotationHasAValidInstallationAndContinuation() (gas: 138549532)\n[PASS] test_forgedDirectionEmptyCellBlankFaceAndStaleEdgeReject() (gas: 1661926)\n[PASS] test_fourMidcapsRevertAtomicallyAlthoughEightSocketsRemain() (gas: 11225222)\n[PASS] test_fullSealRevertsAndDoesNotPayPrizes() (gas: 29787641)\n[PASS] test_fuzzBatchAndOutwardContinuation(uint8) (runs: 512, μ: 3318327, ~: 2148299)\n[PASS] test_fuzzCannotForgeSocketOnInitialCore(int32,int32,uint8) (runs: 512, μ: 72865, ~: 72639)\n[PASS] test_invalidExitDoesNotCommitPlugPayOrClockOrConsumption() (gas: 1192603)\n[PASS] test_noUnprotectedBuildEntryPoint() (gas: 4095938)\n[PASS] test_proofRevealAndAccountingRollBackForInvalidFinalWitness() (gas: 1575416)\n[PASS] test_repeatingAnItemCannotConsumeItOrPayTwice() (gas: 465733)\nSuite result: ok. 17 passed; 0 failed; 0 skipped; finished in 777.58ms (897.84ms CPU time)\n\nRan 5 tests for test/security/Geometry.t.sol:SecurityGeometryTest\n[PASS] testFuzz_signedCellKeyHasExactIndependentByteLanes(uint192,int32,int32) (runs: 512, μ: 7319, ~: 7319)\n[PASS] test_allTemplateRotationsUseIndependentCoordinateAndDirectionModel() (gas: 787984)\n[PASS] test_directionStepsAndOppositesMatchScreenCoordinates() (gas: 88100)\n[PASS] test_everyCellOfMulticellFootprintMustBeWithinBounds() (gas: 75877)\n[PASS] test_realGrowthAcrossSignedCoordinatesDoesNotAliasRounds() (gas: 42628515)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.47s (40.47ms CPU time)\n\nRan 4 tests for test/RaritySockets.t.sol:RaritySocketsTest\n[PASS] testFuzz_eightIncomingPaymentsConserveFundsAndRemainClaimable(uint96,uint8) (runs: 512, μ: 6770668, ~: 6766039)\n[PASS] test_eightLinksCannotCommitThroughAnInvalidWitness() (gas: 5220436)\n[PASS] test_eightSelfConnectionsOnlyRecycleTheFundedAllocation() (gas: 5408980)\n[PASS] test_socketCountsAndOnlyExternalPorts() (gas: 126322)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 1.47s (1.47s CPU time)\n\nRan 10 tests for test/security/EconomicsAndItems.t.sol:SecurityEconomicsAndItemsTest\n[PASS] test_batchCrossingPriceBoundaryMatchesSequentialCostsAndPlugFloors() (gas: 79006938)\n[PASS] test_consumedItemsLeaveInventory() (gas: 309574)\n[PASS] test_failedPartMintDoesNotInflateSupply() (gas: 209341)\n[PASS] test_fullRoundWithoutPlacementsPaysNoPrize() (gas: 78648326)\n[PASS] test_idSpaceAndPaidPositionsIncludeCoreAndOverdueMints() (gas: 82922288)\n[PASS] test_inventoryAdvertisesNoNftInterfaces() (gas: 5597)\n[PASS] test_issuingPartsDoesNotInvokeReceiverCallbacks() (gas: 281821)\n[PASS] test_itemsIssueAndConsumeRequireMachine() (gas: 194364)\n[PASS] test_prizeMintThresholdsZeroOne1499_1500_1501() (gas: 238592387)\n[PASS] test_sparsePrizePlacesAreNotRenormalizedAndEleventhGetsNothing() (gas: 90690205)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 8.63s (119.34ms CPU time)\n\nRan 10 tests for test/EthMinter.t.sol:EthMinterTest\n[PASS] testFuzz_atomicMintRefundAndOwnership(uint8,uint96) (runs: 512, μ: 6089714, ~: 2786437)\n[PASS] testFuzz_ethReferralUsesImdPriceAndRefundsUnusedEth(uint8,uint96) (runs: 512, μ: 2362548, ~: 1229160)\n[PASS] test_batchAndCallbackChecks() (gas: 117809)\n[PASS] test_ethSelfReferralAllowedAndHelperDoesNotRetainReward() (gas: 724528)\n[PASS] test_giftChargesOnlyPayer() (gas: 539888)\n[PASS] test_insufficientEthRevertsEntireMint() (gas: 233874)\n[PASS] test_newRoundQuoteAndPayment() (gas: 1201416)\n[PASS] test_partialFillReverts() (gas: 154314)\n[PASS] test_priceLimitAndExpiry() (gas: 134888)\n[PASS] test_refundRejectRevertsAndReentryIsBlocked() (gas: 1520855)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 8.63s (16.72s CPU time)\n\nRan 15 tests for test/EdgeCases.t.sol:EdgeCasesTest\n[PASS] testFuzz_batchBuildEqualsTheSameSpotsOneByOne(uint256) (runs: 512, μ: 14444370, ~: 13949918)\n[PASS] testFuzz_checkAgreesWithBuild(uint16,uint8,int32,int32) (runs: 2048, μ: 1674793, ~: 1656465)\n[PASS] testFuzz_deadlineIsMonotonicAndCapped(uint256) (runs: 512, μ: 5302871, ~: 5500677)\n[PASS] testFuzz_mintedPartsMatchTheirRollAndAreNeverAgentCores(uint256) (runs: 512, μ: 9367, ~: 9023)\n[PASS] testFuzz_rollDropResolves(uint8,uint256) (runs: 512, μ: 3100, ~: 2928)\n[PASS] test_endRoundOnlyOnceAndNeverEarly() (gas: 249543)\n[PASS] test_everyDesignWeighsByItsTier() (gas: 240915)\n[PASS] test_mintAtTheExactDeadlineOpensTheNextRoundAtTheBasePrice() (gas: 653805)\n[PASS] test_oneBuildExtendsTheClockPerPartUpToTheCap() (gas: 5248290)\n[PASS] test_placeSharesCoverTheWholePrizeAndStopAtTen() (gas: 80999)\n[PASS] test_placingAnUnrevealedMintRevertsAndLeavesItPending() (gas: 451785)\n[PASS] test_prizePlacesFollowSpotOrderWithinOneBuild() (gas: 2926930)\n[PASS] test_revealIgnoresUnknownZeroAndAlreadyRevealedIds() (gas: 830425)\n[PASS] test_rollTierBoundaries() (gas: 53254)\n[PASS] test_sponsorWorksOneSecondBeforeTheDeadlineAndNotAtIt() (gas: 491968)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 8.63s (18.15s CPU time)\n\nRan 18 tests for test/Rounds.t.sol:RoundsTest\n[PASS] test_buildChecksTheMachineId() (gas: 4079690)\n[PASS] test_buildNeverSkipsAnInvalidTrailingSpot() (gas: 482568)\n[PASS] test_buildSkipsMintsSomeoneElseRevealed() (gas: 944349)\n[PASS] test_clockEndsTheRound() (gas: 2784968)\n[PASS] test_countdown() (gas: 7565785)\n[PASS] test_eachMachineIsItsOwnEconomy() (gas: 3221077)\n[PASS] test_finishedMachinesStayInTheArchive() (gas: 4273187)\n[PASS] test_fundPotGoesToTheRunningMachineOrTheReserve() (gas: 223030)\n[PASS] test_lastTenPlacesPaidOnlyAfterClockExpiry() (gas: 5337303)\n[PASS] test_mintingDoesNotMoveTheClock() (gas: 1211322)\n[PASS] test_nextMintEndsAnExpiredRound() (gas: 1525907)\n[PASS] test_noLegendaryGrantEntryPoint() (gas: 30697)\n[PASS] test_partsCarryOverToTheNextMachine() (gas: 4875275)\n[PASS] test_placementAddsThirtySecondsCappedAtTwentyFourHours() (gas: 1020524)\n[PASS] test_prizeIsClaimedByThePlacer() (gas: 5350134)\n[PASS] test_revealAndPlaceInOneBuild() (gas: 882334)\n[PASS] test_roundStartsWithTwentyFourHours() (gas: 38316)\n[PASS] test_roundWithNoPlacementsCarriesThePot() (gas: 1379384)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 8.63s (18.66ms CPU time)\n\nRan 9 tests for test/Referrals.t.sol:ReferralsTest\n[PASS] testFuzz_referralOnlyReroutesSharedAndAllFeesAreHeld(uint8) (runs: 512, μ: 5452108, ~: 3251962)\n[PASS] testFuzz_selfReferralAndSecondWalletHaveIdenticalCombinedReturn(uint8) (runs: 512, μ: 4625602, ~: 2664395)\n[PASS] test_creditSurvivesRoundsAndNoReferralDoesNotRememberOldAddress() (gas: 676575)\n[PASS] test_failedPaymentAndPriceLimitDoNotCreditReferral() (gas: 260765)\n[PASS] test_giftMayReferPayerOrRecipient() (gas: 475904)\n[PASS] test_giftReferralAndClaimsBelongToCorrectWallets() (gas: 533959)\n[PASS] test_invalidReferralsKeepFullSharedAllocation() (gas: 878651)\n[PASS] test_overduePendingMintKeepsPlugAndReferralRemainsFunded() (gas: 427776)\n[PASS] test_withoutBuildersUnassignedSharedGoesToPot() (gas: 314434)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 8.63s (16.73s CPU time)\n\nRan 5 tests for test/Gas.t.sol:GasTest\n[PASS] test_gas_build20() (gas: 13246143)\nLogs:\n  placed: 20\n  20 single builds incl. search (upper bound): 10942225\n\n[PASS] test_gas_build50Reactors() (gas: 244588605)\nLogs:\n  build(50 Reactors): 20464753\n\n[PASS] test_gas_claim100() (gas: 98013966)\nLogs:\n  claim(100): 3099588\n\n[PASS] test_gas_clockEndWithEverything() (gas: 82382561)\nLogs:\n  clock end with all prizes: 496657\n\n[PASS] test_gas_mint20() (gas: 2203476)\nLogs:\n  mint(20): 1043258\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 8.70s (568.68ms CPU time)\n\nRan 2 tests for test/Big.t.sol:BigMachineTest\n[PASS] testFuzz_openCounterIsExact(uint256) (runs: 512, μ: 68638867, ~: 67719462)\n[PASS] test_bigMachine() (gas: 1035194404)\nLogs:\n  parts placed: 688\n  open sockets: 148\n  width: 57\n  height: 41\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 8.70s (10.68s CPU time)\n\nRan 2 tests for test/Invariant.t.sol:InvariantTest\n[PASS]\nInvariantTest invariants:\n[PASS] invariant_burnIsTwoPercent\n[PASS] invariant_conservation\n[PASS] invariant_openSocketsAndWiring\n[PASS] invariant_roundsAndSupply\n[PASS] invariant_solventAndExact\n InvariantTest invariants (runs: 128, calls: 16384, reverts: 0)\n\n╭----------+---------------+-------+---------+----------╮\n| Contract | Selector      | Calls | Reverts | Discards |\n+=======================================================+\n| Handler  | claim         | 1244  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | claimCore     | 1298  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | claimReferral | 1237  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | endRound      | 1262  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | fund          | 1300  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | giftMint      | 1293  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | mint          | 1248  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | payDev        | 1261  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | place         | 1243  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | referredMint  | 1239  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | reveal        | 1236  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | transfer      | 1309  | 0       | 0        |\n|----------+---------------+-------+---------+----------|\n| Handler  | warp          | 1214  | 0       | 0        |\n╰----------+---------------+-------+---------+----------╯\n\nLogs:\n  rounds: 3\n  parts placed: 34\n  claimed (milli-IMD): 43641\n  gift mints executed: 14\n  transfers rejected: 4\n  cores claimed: 2\n\n[PASS] test_handlerExercisesGiftTransferCoreAndRetainsOverduePendingLiability() (gas: 1647486)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 79.31s (79.31s CPU time)\n\nRan 29 test suites in 79.32s (145.37s CPU time): 231 tests passed, 0 failed, 3 skipped (234 total tests)\n","passed":true},{"durationMs":91,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"DevEthPool.settle()\",\"DevEthPool.swap((address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"DevEthPool.take(address,address,uint256)\",\"DevEthPool.unlock(bytes)\",\"DevIMD.approve(address,uint256)\",\"DevIMD.mint(address,uint256)\",\"DevIMD.transfer(address,uint256)\",\"DevIMD.transferFrom(address,address,uint256)\",\"DrandBeacon.prove(uint64,bytes)\",\"EthMinter.mint(uint256,uint256,uint256)\",\"EthMinter.mintWithReferral(uint256,uint256,uint256,address)\",\"EthMinter.quote(uint256)\",\"EthMinter.unlockCallback(bytes)\",\"IdentityMachine.build(uint256,(uint64,bytes)[],uint256[],(uint256,uint8,int32,int32)[],(int32,int32,uint8))\",\"IdentityMachine.claim(uint256[])\",\"IdentityMachine.claimAgentCore(uint16,bytes32[])\",\"IdentityMachine.claimReferral()\",\"IdentityMachine.endRound()\",\"IdentityMachine.fundPot(uint256)\",\"IdentityMachine.fundReserve(uint256)\",\"IdentityMachine.mint(uint256,uint256)\",\"IdentityMachine.mintFor(address,uint256,uint256)\",\"IdentityMachine.mintForWithReferral(address,uint256,uint256,address)\",\"IdentityMachine.mintWithReferral(uint256,uint256,address)\",\"IdentityMachine.payDev()\",\"IdentityMachine.reveal(uint256[])\",\"IdentityMachine.sponsor(uint256)\",\"Parts.burn(uint256)\",\"Parts.mint(address,uint256)\"],\"files\":{\".gitignore\":18,\"ADAPTATION.md\":116,\"LICENSE\":16,\"app/.gitignore\":1,\"app/archive.html\":24,\"app/docs.html\":20,\"app/index.html\":126,\"app/package-lock.json\":1435,\"app/package.json\":25,\"app/parts.html\":24,\"app/public/brand/favicon.svg\":1,\"app/public/brand/mark.svg\":1,\"app/public/llms.txt\":163,\"app/public/parts-loader-static.svg\":7,\"app/public/parts-loader.svg\":71,\"app/public/seats.json\":1,\"app/scripts/abi.mjs\":10,\"app/scripts/swarm-deploy.mjs\":47,\"app/scripts/swarm-manifest.mjs\":90,\"app/src/abi/DevIMD.json\":333,\"app/src/abi/DrandBeacon.json\":249,\"app/src/abi/EthMinter.json\":360,\"app/src/abi/IdentityMachine.json\":1756,\"app/src/abi/MachineViews.json\":481,\"app/src/abi/Parts.json\":166,\"app/src/archive.ts\":157,\"app/src/build.ts\":38,\"app/src/catalog.ts\":61,\"app/src/chain.ts\":137,\"app/src/crt.ts\":185,\"app/src/docs.ts\":184,\"app/src/econ.ts\":52,\"app/src/eth.ts\":49,\"app/src/explore.ts\":200,\"app/src/geometry.ts\":405,\"app/src/jackpot.ts\":112,\"app/src/main.ts\":1595,\"app/src/parts.gen.ts\":20,\"app/src/rarity.ts\":7,\"app/src/referrals.ts\":99,\"app/src/render.ts\":740,\"app/src/reveal.ts\":35,\"app/src/shell.ts\":160,\"app/src/signals.ts\":230,\"app/src/store.ts\":683,\"app/src/style.css\":995,\"app/src/topten.ts\":54,\"app/src/ui.ts\":85,\"app/src/usd.ts\":74,\"app/src/vite-env.d.ts\":1,\"app/src/wallet.ts\":146,\"app/tsconfig.json\":16,\"app/vite.config.ts\":15,\"art/brand.mjs\":19,\"art/loader.mjs\":60,\"art/out/templates.json\":1,\"art/parts.mjs\":1138,\"foundry.toml\":32,\"launch.json\":37,\"remappings.txt\":3,\"script/Deploy.s.sol\":106,\"script/DevDeploy.s.sol\":37,\"scripts/dev.sh\":20,\"scripts/fork.sh\":94,\"scripts/fund.sh\":14,\"src/DrandBeacon.sol\":68,\"src/EthMinter.sol\":162,\"src/IdentityMachine.sol\":684,\"src/MachineViews.sol\":233,\"src/Parts.sol\":46,\"src/Shapes.sol\":144,\"src/art/Catalog.sol\":61,\"src/dev/DevEthPool.sol\":63,\"src/dev/DevIMD.sol\":13,\"test/AgentCoreSeats.t.sol\":63,\"test/AuditFixes.t.sol\":58,\"test/Base.sol\":482,\"test/Big.t.sol\":40,\"test/BoundaryWitness.t.sol\":334,\"test/Deploy.t.sol\":143,\"test/DrandBeacon.t.sol\":31,\"test/EdgeCases.t.sol\":345,\"test/EthMinter.t.sol\":254,\"test/Fork.t.sol\":146,\"test/Gas.t.sol\":83,\"test/InstallLimit.t.sol\":64,\"test/Invariant.t.sol\":425,\"test/Inventory.t.sol\":67,\"test/LaunchDeployment.t.sol\":133,\"test/Machine.t.sol\":391,\"test/Mocks.sol\":45,\"test/RaritySockets.t.sol\":118,\"test/Referrals.t.sol\":169,\"test/Rework.t.sol\":147,\"test/Rounds.t.sol\":276,\"test/audit/Beacon.t.sol\":128,\"test/audit/vectors/drand-info.json\":9,\"test/fixtures-seat.json\":1,\"test/security/Beacon.t.sol\":92,\"test/security/Checkout.t.sol\":404,\"test/security/EconomicsAndItems.t.sol\":154,\"test/security/Geometry.t.sol\":132,\"test/security/Lifecycle.t.sol\":409,\"test/security/RingRecipes.t.sol\":97,\"test/security/TokenCompatibility.t.sol\":70,\"test/security/Views.t.sol\":150},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c270e7814574ca497b468598c47181474d11d504c96000f629d1a13571dc8735","verifiedTreeHash":"2ac2ae800f5257c7f47c5e5ff0d55d84a19177f7","verifierVersion":"0.1.0+d952fceb"}]}