{"assessments":[],"deployments":[{"attestationHash":"dbfe12e575cd2dbf781de9f4206096b52c831bd07c93138e78921606b9571f24","chainId":1,"contracts":[{"address":"0x62527f742de81a59e2bcd4d2633f796426553200","blockNumber":26224242,"name":"ArtifactsFactory","role":"other","txHash":"0x351598706192e11dc7fbe2c40441c8e849d46fdc95e2fdf5ff8069dad23e6478"},{"address":"0xaa1142e3dc35d28cbf3a170bd931a76fc5b8aeab","blockNumber":26224242,"name":"SubmissionReviews","role":"other","txHash":"0x351598706192e11dc7fbe2c40441c8e849d46fdc95e2fdf5ff8069dad23e6478"},{"address":"0x78d21b32dbd1bf216015b1dc4273072d3511bea7","blockNumber":26224242,"name":"ArtStorage","role":"other","txHash":"0x351598706192e11dc7fbe2c40441c8e849d46fdc95e2fdf5ff8069dad23e6478"},{"address":"0x73b1e5825280df29ea7124e927f3ebd9710b5a99","blockNumber":26224242,"name":"ArtHouse","role":"other","txHash":"0x351598706192e11dc7fbe2c40441c8e849d46fdc95e2fdf5ff8069dad23e6478"},{"address":"0xe57e3f2ce296252b461911b34787371d6d806ab2","blockNumber":26224242,"name":"ArtifactsSource","role":"other","txHash":"0x351598706192e11dc7fbe2c40441c8e849d46fdc95e2fdf5ff8069dad23e6478"},{"address":"0xa6958cbc41325e97ecb3bb9d837fbd0938cb2b4f","blockNumber":26224242,"name":"BrokerPass","role":"other","txHash":"0x351598706192e11dc7fbe2c40441c8e849d46fdc95e2fdf5ff8069dad23e6478"},{"address":"0x2372c3081a910dd3dd7a3a3d6ec2427e2b30bd2f","blockNumber":26224242,"name":"KeyProof","role":"other","txHash":"0x351598706192e11dc7fbe2c40441c8e849d46fdc95e2fdf5ff8069dad23e6478"}],"id":"2ccf6c19-8fa3-46ad-908b-25a6c131b9e5","manifestHash":"610ef7cb2307e6711c8ddd704f171bbca1e06648359a37942df026e0e1dd7b2d","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":"0ea6a36b-9981-408f-afaf-1f6e3afcbfdb","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"339f891276f4734b751d600897391d325771dc0a0a8c3855e257ed59e178b278","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":"c0b1531be9bc0cb55751d834021e5e11ff030f311633eb5219f5b03e90870258","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":"e2f97d67ce1532e8abb282e44ddff1a66b490b3c4c46e52d5e564b1c5daec548","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":"d67254d676bce6873408c1061c73c055a3abf020a0a5b0c845ea7d91d50b8023","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":"89c1d62eb480df2fc8a06d050572b26a737a0aeade97edba09d6d90847046a82","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":"d0721f823a54aafdd1854abd83c3182f17a251c10a43d9029ce6dd36b724060d","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":"3748d6a8cb0dc6871dcd2a3595d1a4e124e61df27246360182fa99acca9021d4","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":"cb1c3505f5222206891e78f59210f7941af4e4933264063eaf58a928f1720998","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"044316bf802500677c352c7af6b9bed8b7446ccfdc4fb5a3dffdd9dd2eb6210a","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 Proof House's contracts from this Foundry repository, as they are. This commit is the swarm's own reviewed code from launch 2179 (job ea8e8e20, delivered commit 5afa6c7), adopted unchanged: the contracts are exactly the ones that launch reviewed, and only launch.json differs (the mainnet IMD address). That launch passed every gate and was parked only by Sepolia's gas cap (143M gas under EIP-8037); on mainnet the 8 contracts need about 19M. 259 Foundry tests pass (unit, fuzz and invariant, plus fork tests against the real ETH/IMD pool and the real Chainlink VRF coordinator), and the launch has been rehearsed end to end on a mainnet fork. Change nothing unless an audit finding requires it, and say exactly what changed and why: we compare every deployed contract's runtime code with our own build of this commit before using it.\n\nDeploy launch.json (at the repository root): 8 contracts in this order, with the constructor arguments it lists ($owner and $contract:Name): ArtStorage, ArtHouse, KeyProof, ArtifactsPiece, ArtifactsFactory, ArtifactsSource, BrokerPass, SubmissionReviews. Nothing is called after deployment: the owner configures everything afterwards.\n\nToken facts. No fungible token is created and there is no pool. IMD (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7) is the existing ERC-20 buyers may pay with for plain SVG collections. The only tokens are ERC-721 NFTs: each ARTIFACTS piece is its own one-token contract (\"ARTIFACTS #NNN\"; THE SOURCE \"ARTIFACTS · THE SOURCE\"), minted only when bought; supply 256, fixed forever. BrokerPass is an ERC-721 of at most 100 free passes.\n\nOwner: the owner field. Two-step ownership, no renounceOwnership, no upgradeability.","parentJobId":null,"planHash":"d8e9d9d93306ae3b584912c9e2b9e27aff0f093b1574fec32be496fff7952b87","previousHash":"8198a76462b90def5176765eceeab099d18ea40d819e67af37fdb2a6bf0b469e","projectId":"0ea6a36b-9981-408f-afaf-1f6e3afcbfdb","publication":{"commit":"a1735ce2ac75e592c62c64022674733e82ae33d6","deliveredAt":"2026-10-19T03:57:54.891Z","repoUrl":"https://github.com/identity-md-launches/launch-2199-deploy-proof-house-s-contracts"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[],"site":null,"snapshotHash":"8c87f1e7c7cd1dc915d1578a774378036b504a195e80d38e72f065b31ed7c768","state":"completed","submissions":[{"artifacts":[],"attempt":2,"bundleHash":"fb3e9660c9ca3baeee53e57670fc4276bd91c3afefdcf42e1a1d8ceb9b4eb4ca","device":"2dc755dfe7bd177c","findings":[{"description":"ArtifactsFactory.setPieceImplementation (src/ArtifactsFactory.sol:174) and ArtifactsSource.setPieceImplementation (src/ArtifactsSource.sol:90) check only implementation.code.length != 0 and can never be changed afterwards. The step is new in this revision: the curator now deploys ArtifactsPiece by hand after the launch (launch.piece.json) and connects it, while also handling the launched KeyProof address in the same step. If any contract other than a locked ArtifactsPiece is connected (KeyProof, ArtHouse, a typo'd contract address), setSaleOpen still succeeds (it only checks pieceImplementation != 0), buyers pay, VRF assigns editions and the ETH is paid out through the ledger, but every claim reverts because the copied code has no initialize(), and the setting cannot be corrected. For THE SOURCE, setAuction opens and settle() reverts forever. Suggested fix, keeping the agreed design: in both setters, require ArtifactsPiece(impl).controller() == impl (only a locked implementation reports itself) and address(ArtifactsPiece(impl).keyProof()).code.length != 0, using a try/catch or a staticcall that reverts with NoPieceImplementation on failure.","line":174,"path":"src/ArtifactsFactory.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ArtStorage} from \"src/ArtStorage.sol\";\nimport {ArtHouse} from \"src/ArtHouse.sol\";\nimport {KeyProof} from \"src/KeyProof.sol\";\nimport {ArtifactsPiece} from \"src/ArtifactsPiece.sol\";\nimport {ArtifactsFactory} from \"src/ArtifactsFactory.sol\";\nimport {ArtifactsSource} from \"src/ArtifactsSource.sol\";\n\n/// @notice setPieceImplementation is set-once and checks only that the address has code. A contract that is not a\n/// locked ArtifactsPiece (here the launched KeyProof, the address the curator handles in the same step) is accepted,\n/// after which the sale opens, buyers pay, and every claim / settlement reverts forever because the copy has no\n/// `initialize`. The setter must refuse anything that is not a locked ArtifactsPiece (e.g. require\n/// ArtifactsPiece(impl).controller() == impl and a keyProof with code); this test passes once it does.\ncontract WrongPieceImplementationProof is Test {\n    address curator = makeAddr(\"curator\");\n    KeyProof keyProof;\n    ArtHouse house;\n\n    function setUp() public {\n        ArtStorage store = new ArtStorage(curator);\n        house = new ArtHouse(curator, address(store), makeAddr(\"imd\"));\n        keyProof = new KeyProof();\n    }\n\n    function test_factoryRefusesANonPieceImplementation() public {\n        ArtifactsFactory f = new ArtifactsFactory(curator, address(house));\n        vm.prank(curator);\n        vm.expectRevert();\n        f.setPieceImplementation(address(keyProof));\n        // a real locked piece is still accepted\n        ArtifactsPiece impl = new ArtifactsPiece(address(keyProof));\n        vm.prank(curator);\n        f.setPieceImplementation(address(impl));\n        assertEq(f.pieceImplementation(), address(impl));\n    }\n\n    function test_sourceRefusesANonPieceImplementation() public {\n        ArtifactsSource s = new ArtifactsSource(curator, address(house));\n        vm.prank(curator);\n        vm.expectRevert();\n        s.setPieceImplementation(address(house));\n        ArtifactsPiece impl = new ArtifactsPiece(address(keyProof));\n        vm.prank(curator);\n        s.setPieceImplementation(address(impl));\n        assertEq(s.pieceImplementation(), address(impl));\n    }\n}","reproduction":"Fresh ArtifactsFactory registered with the house, VRF configured, 255 pieces published and locked, price 1 ether. curator calls setPieceImplementation(address(keyProof)): expected revert, actual success. setSaleOpen(true) succeeds; alice buys for 1 ether; VRF fulfils; curator posts the wrapped key; alice.claim(edition) reverts (KeyProof has no initialize); curator.setPieceImplementation(address(pieceImpl)) reverts PieceImplementationAlreadySet. The factory's balance is 0 after the sale, so the ETH has gone out and alice holds no piece. The proof below fails on the current code ('next call did not revert as expected') and passes once the setters reject a contract that is not a locked ArtifactsPiece.","severity":"low","title":"setPieceImplementation is set-once but accepts any contract with code; a wrong address permanently bricks every claim and THE SOURCE's settlement"},{"description":"The brief says launch.json deploys 8 contracts including ArtifactsPiece, and that the contracts are exactly the ones launch 2179 reviewed (commit 5afa6c7). In this tree launch.json lists 7 contracts. ArtifactsPiece moved to launch.piece.json, and the ArtifactsFactory and ArtifactsSource constructors dropped their pieceImplementation argument in favour of an owner-only, set-once setPieceImplementation. VRF_CALLBACK_GAS_MIN also rose from 150k to 250k, and SubmissionReviews.reviewsOf was changed. A later accepted revision made these changes because EIP-7825 caps one transaction at 2^24 gas and the 8 contracts need about 20.9M. As a result, runtime code built from 5afa6c7 will not match what this tree deploys for ArtifactsFactory, ArtifactsSource and SubmissionReviews. The requester should compare the deployed code against a build of this commit, not 5afa6c7. After the launch, the curator also has to deploy ArtifactsPiece and connect it to both contracts, as the notes in launch.json describe.","line":1,"path":"launch.json","reproduction":"git show c8790e7 -- src launch.json: the ArtifactsFactory/ArtifactsSource constructors take (owner, house) and launch.json has 7 entries. The brief lists 8 entries and says the code is unchanged from 5afa6c7.","severity":"info","title":"The tree no longer matches the brief's 'adopted unchanged, 8 contracts' description"}],"hash":"044316bf802500677c352c7af6b9bed8b7446ccfdc4fb5a3dffdd9dd2eb6210a","nodeId":"a777ff90-c211-4452-91f9-899f63ed08f1","outcome":"completed","summary":"I added one test file. The full `forge build` and `forge test` pass with the verifier's seed: 306 passed, 0 failed, 2 skipped (the two fork suites, which need an RPC this machine doesn't have). I made one real finding and reported it rather than writing a test that blesses it. Nothing outside `test/` changed.\n\n**What I found first.** The code here is not the 8-contract set the brief describes. A later accepted revision (`c8790e7`) took `ArtifactsPiece` out of `launch.json`, which now has 7 contracts, and moved it to `launch.piece.json`. That was needed because EIP-7825 caps one transaction at 2^24 gas (about 16.8M), and the 8 contracts need about 20.9M. As a result, the piece implementation is now connected after the launch by an owner-only, set-once `setPieceImplementation` on `ArtifactsFactory` and `ArtifactsSource`. My earlier accepted tests already passed against this code, so the new file targets this new by-hand step.\n\n**New tests: `test/PostLaunchWiring.t.sol`** (6 tests, all passing)\n- **Who can set it:** any caller other than the owner is refused on both contracts (fuzzed).\n- **Ownership handover:** a nominated owner can't set the implementation until it accepts, and after it accepts the old owner can't. A stranger can't accept, and the value can't be changed once set.\n- **The implementation is locked:** nobody can initialise the deployed implementation itself (fuzzed over callers).\n- **Copies made outside the factory:** a wallet can't initialise one, either as itself or claiming to be the factory. A contract can initialise its own copy, but the factory never treats it as a piece.\n- **What a claim produces:** a claimed edition is a byte-for-byte copy of the connected implementation (same code hash, same KeyProof, controller is the factory).\n- **Closing and reopening the sale** keeps the implementation and doesn't let anyone swap it.\n\n**Reported in `.imd-findings.json`**\n- **Low, with a proof that fails on the current code:** `setPieceImplementation` (`src/ArtifactsFactory.sol:174`, `src/ArtifactsSource.sol:90`) only checks that the address has code, and it can never be changed afterwards. I checked what happens if the curator connects the wrong contract, for example the KeyProof address they handle in the same step:\n  1. The setting is accepted and the sale opens.\n  2. A buyer pays 1 ETH, the draw assigns them an edition, and the ETH leaves the factory.\n  3. Their claim fails, because the copied code has no `initialize`.\n  4. The setting can't be corrected, so no claim can ever succeed.\n\n  THE SOURCE fails the same way: its auction opens but can never settle. Suggested fix: both setters require `ArtifactsPiece(impl).controller() == impl` and that its KeyProof has code. The proof passes once that check is in.\n- **Info:** because of the revision above, `ArtifactsFactory`, `ArtifactsSource` and `SubmissionReviews` built from commit `5afa6c7` will not match what this code deploys. Compare deployed runtime code against a build of this commit. After the launch, the curator also has to deploy `ArtifactsPiece` and connect it to both contracts.\n\nTwo things are still owed: the fork suites need a live RPC to run, and the change needed to fix the low finding is in `src/`, which is outside what I'm allowed to change.","treeHash":"087d3d49ce78eb066f26b6ebde9dff1544bcc34c","usage":{"cachedInputTokens":935400,"inputTokens":34,"model":"claude-opus-5-5","outputTokens":17066,"runtime":"claude","turns":17,"wallClockMs":497840}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2a4ad9be53991100","findings":[{"citation":"resolved","description":"ProjectFactory.launchContracts creates every application of the manifest in one transaction (the protected harness ContractsDeploymentProbe.deployAll says so and models it that way). Since Fusaka (December 2025) Ethereum mainnet enforces EIP-7825: no transaction may set a gas limit above 2^24 = 16,777,216, and nodes refuse a transaction above it. The 8 contracts of launch.json deposit about 84 KB of runtime code at 200 gas a byte: ArtifactsPiece 24,132 B (the largest contributor; this line), ArtHouse 15,979 B plus the 4,735 B ArtCollection template its constructor creates (src/ArtHouse.sol:171 `collectionImplementation = address(new ArtCollection());`), ArtifactsFactory 15,732 B, ArtifactsSource 8,323 B, BrokerPass 6,753 B, KeyProof 3,151 B, ArtStorage 2,128 B and SubmissionReviews. Measured on this commit (cancun, the pinned EVM): 19,419,813 gas of execution for the 8 CREATE2s alone, 20,853,017 with the transaction's intrinsic cost (90,308 bytes of calldata). The brief's own figure (\"on mainnet the 8 contracts need about 19M\") agrees. A transaction needing that much gas cannot be included on mainnet whatever the gas ceiling or price, so the launch parks again exactly as it did on Sepolia; each contract is under EIP-170/EIP-3860, so the size checks do not catch it. The same size makes ArtifactsFactory.claimMany unusable beyond about 3 editions on mainnet (each claim copies the 24,132-byte ArtifactsPiece runtime, ~5M gas), though single claims work. Fix: bring the launch's total under 2^24 with margin, about 4.1M gas (~19 KB of deployed code) less; e.g. create the ArtCollection template lazily on the owner's first createCollection instead of in ArtHouse's constructor, and move code out of the deployed set (ArtifactsPiece's metadata/Seal rendering and the escrow are the bulk). Splitting across transactions is not available in this deployment model.","line":18,"path":"src/ArtifactsPiece.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test, console2} from \"forge-std/Test.sol\";\nimport {ArtStorage} from \"src/ArtStorage.sol\";\nimport {ArtHouse} from \"src/ArtHouse.sol\";\nimport {KeyProof} from \"src/KeyProof.sol\";\nimport {ArtifactsPiece} from \"src/ArtifactsPiece.sol\";\nimport {ArtifactsFactory} from \"src/ArtifactsFactory.sol\";\nimport {ArtifactsSource} from \"src/ArtifactsSource.sol\";\nimport {BrokerPass} from \"src/BrokerPass.sol\";\nimport {SubmissionReviews} from \"src/SubmissionReviews.sol\";\n\n/// @dev Same loop as the protected harness (ContractsDeploymentProbe.deployAll): every application in one call,\n/// as ProjectFactory.launchContracts deploys them in one transaction.\ncontract OneTxLauncher {\n    function deployAll(bytes[] memory codes, bytes32[] memory salts) external returns (address[] memory deployed) {\n        deployed = new address[](codes.length);\n        for (uint256 i; i < codes.length; ++i) {\n            bytes memory code = codes[i];\n            bytes32 salt = salts[i];\n            address created;\n            assembly (\"memory-safe\") {\n                created := create2(0, add(code, 32), mload(code), salt)\n            }\n            require(created != address(0) && created.code.length > 0, \"constructor failed\");\n            deployed[i] = created;\n        }\n    }\n}\n\ncontract LaunchTxGasCapTest is Test {\n    /// @dev EIP-7825 (Fusaka, on Ethereum mainnet since December 2025): no transaction may set a gas limit above 2^24.\n    uint256 internal constant TX_GAS_CAP = 16_777_216;\n    address internal constant OWNER = address(0xd3e32C1eBEa3a675EffCaAcAf89196948Abd1386);\n    address internal constant IMD = 0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7;\n    address internal constant SEATS = 0x0000eC93127BAA929E58E97dd0095A2BFb38ec1D;\n\n    function _predict(address deployer, bytes32 salt, bytes memory code) internal pure returns (address) {\n        return address(uint160(uint256(keccak256(abi.encodePacked(bytes1(0xff), deployer, salt, keccak256(code))))));\n    }\n\n    function test_launchManifestFitsInOneMainnetTransaction() public {\n        OneTxLauncher launcher = new OneTxLauncher();\n        bytes[] memory codes = new bytes[](8);\n        bytes32[] memory salts = new bytes32[](8);\n        address[] memory a = new address[](8);\n        for (uint256 i; i < 8; ++i) {\n            salts[i] = keccak256(abi.encode(\"launch\", i));\n        }\n        codes[0] = bytes.concat(type(ArtStorage).creationCode, abi.encode(OWNER));\n        a[0] = _predict(address(launcher), salts[0], codes[0]);\n        codes[1] = bytes.concat(type(ArtHouse).creationCode, abi.encode(OWNER, a[0], IMD));\n        a[1] = _predict(address(launcher), salts[1], codes[1]);\n        codes[2] = type(KeyProof).creationCode;\n        a[2] = _predict(address(launcher), salts[2], codes[2]);\n        codes[3] = bytes.concat(type(ArtifactsPiece).creationCode, abi.encode(a[2]));\n        a[3] = _predict(address(launcher), salts[3], codes[3]);\n        codes[4] = bytes.concat(type(ArtifactsFactory).creationCode, abi.encode(OWNER, a[1], a[3]));\n        a[4] = _predict(address(launcher), salts[4], codes[4]);\n        codes[5] = bytes.concat(type(ArtifactsSource).creationCode, abi.encode(OWNER, a[1], a[3]));\n        a[5] = _predict(address(launcher), salts[5], codes[5]);\n        codes[6] = bytes.concat(type(BrokerPass).creationCode, abi.encode(SEATS, a[4], a[5]));\n        a[6] = _predict(address(launcher), salts[6], codes[6]);\n        codes[7] = bytes.concat(type(SubmissionReviews).creationCode, abi.encode(a[1], SEATS, a[4], a[5]));\n\n        // intrinsic cost of the one launch transaction: 21,000 + calldata (EIP-2028: 4 per zero byte, 16 per other)\n        bytes memory data = abi.encodeCall(OneTxLauncher.deployAll, (codes, salts));\n        uint256 intrinsic = 21_000;\n        for (uint256 i; i < data.length; ++i) {\n            intrinsic += data[i] == 0 ? 4 : 16;\n        }\n\n        uint256 before = gasleft();\n        address[] memory deployed = launcher.deployAll(codes, salts);\n        uint256 execution = before - gasleft();\n        assertEq(deployed[7], _predict(address(launcher), salts[7], codes[7]));\n\n        console2.log(\"calldata bytes\", data.length);\n        console2.log(\"intrinsic gas\", intrinsic);\n        console2.log(\"execution gas\", execution);\n        console2.log(\"total gas\", intrinsic + execution);\n        assertLe(execution, TX_GAS_CAP, \"deploying the 8 contracts alone needs more gas than one transaction may use\");\n        assertLe(intrinsic + execution, TX_GAS_CAP, \"the launch transaction exceeds the EIP-7825 cap of 2^24 gas\");\n    }\n}","reproduction":"Build this commit (forge build, foundry.toml as is). Deploy the 8 creation codes of launch.json, with their constructor arguments, in one call through a CREATE2 loop identical to ContractsDeploymentProbe.deployAll (test/scratch/LaunchTxGasCap.t.sol). Expected: the launch transaction needs at most 16,777,216 gas (the EIP-7825 cap on mainnet). Actual: execution 19,419,813 gas, total with intrinsic calldata cost 20,853,017 gas; `FOUNDRY_TEST=test/scratch forge test --match-path test/scratch/LaunchTxGasCap.t.sol -vv` fails with 'deploying the 8 contracts alone needs more gas than one transaction may use: 19419813 > 16777216'.","severity":"high","snippet":"contract ArtifactsPiece is ERC721Lite, ReentrancyGuard {","title":"The launch cannot be included on Ethereum mainnet: deploying the 8 contracts in the factory's one transaction needs ~19.4M gas of execution, above the EIP-7825 per-transaction cap of 16,777,216"},{"citation":"resolved","description":"ArtifactsFactory.buy/buyMany (_tokenGate, src/ArtifactsFactory.sol:346-348) and ArtifactsSource.bid (src/ArtifactsSource.sol:189) let a wallet into the holders window when holdsToken reads balanceOf(msg.sender) >= gateMinBalance at that moment. Nothing ties the balance to a time before the window or to after the call, so a contract that receives gateMinBalance of IMD (a Uniswap v4 take/settle inside unlock on the ETH/IMD pool, any flash lender, or a buy-then-sell round trip) calls buy and returns the IMD in the same transaction. The seat leg (buyWithSeat, ownerOf at the call) and the member leg are not the subject here. No funds are lost or misrouted; the guarantee the window exists for (holders buy first) is not enforced for the token leg, at the cost of gas. Rated low: per-wallet and per-phase caps still apply, and the IMD a real holder holds can already be moved between wallets, so the token leg was never a strong limit. Fix that keeps the design: gate the token leg on a balance fixed before saleOpenedAt (a snapshot/checkpoint token, or holders registering during a pre-window), or document the token leg as a soft gate and rely on seats and members for priority.","line":78,"path":"src/base/HolderGate.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ArtStorage} from \"src/ArtStorage.sol\";\nimport {ArtHouse} from \"src/ArtHouse.sol\";\nimport {KeyProof} from \"src/KeyProof.sol\";\nimport {ArtifactsPiece} from \"src/ArtifactsPiece.sol\";\nimport {ArtifactsFactory} from \"src/ArtifactsFactory.sol\";\nimport {HolderGate} from \"src/base/HolderGate.sol\";\nimport {IVRFCoordinatorV2Plus, Traits} from \"src/interfaces/Interfaces.sol\";\n\ncontract Token {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function mint(address to, uint256 amount) external {\n        balanceOf[to] += amount;\n    }\n\n    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n        allowance[from][msg.sender] -= amount;\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\ncontract Vrf {\n    uint256 public nextId = 1;\n\n    function requestRandomWords(IVRFCoordinatorV2Plus.RandomWordsRequest calldata) external returns (uint256) {\n        return nextId++;\n    }\n}\n\n/// @dev A lender that hands out tokens for the duration of one call and takes them back (a flash loan).\ncontract Lender {\n    Token public token;\n\n    constructor(Token t) {\n        token = t;\n    }\n\n    function flash(address borrower, uint256 amount, bytes calldata data) external {\n        uint256 before = token.balanceOf(address(this));\n        token.transfer(borrower, amount);\n        (bool ok,) = borrower.call(data);\n        require(ok, \"borrower failed\");\n        require(token.balanceOf(address(this)) == before, \"not repaid\");\n    }\n}\n\ncontract Borrower {\n    ArtifactsFactory public factory;\n    Token public token;\n    Lender public lender;\n\n    constructor(ArtifactsFactory f, Token t, Lender l) {\n        factory = f;\n        token = t;\n        lender = l;\n    }\n\n    receive() external payable {}\n\n    function attack() external {\n        lender.flash(address(this), 100e18, abi.encodeCall(this.onFlash, ()));\n    }\n\n    function onFlash() external {\n        factory.buy{value: factory.price()}(address(0));\n        token.transfer(address(lender), 100e18);\n    }\n}\n\ncontract GateSnapshotTest is Test {\n    address curator = makeAddr(\"curator\");\n    address artist = makeAddr(\"artist\");\n    Token token;\n    ArtifactsFactory factory;\n\n    function setUp() public {\n        token = new Token();\n        Vrf vrf = new Vrf();\n        ArtStorage store = new ArtStorage(curator);\n        ArtHouse house = new ArtHouse(curator, address(store), address(token));\n        KeyProof kp = new KeyProof();\n        ArtifactsPiece impl = new ArtifactsPiece(address(kp));\n        factory = new ArtifactsFactory(curator, address(house), address(impl));\n        vm.startPrank(curator);\n        house.approveArtist(artist, \"A\");\n        house.setSaleModule(address(factory), true);\n        house.registerModuleCollection(address(factory), artist);\n        factory.configureVRF(address(vrf), bytes32(uint256(1)), 1, false);\n        for (uint256 i = 1; i <= 255; ++i) {\n            factory.setPiece(i, Traits(\"t\", \"p\", 1, \"d\"), hex\"01\", bytes32(uint256(i)));\n        }\n        factory.lock();\n        factory.setPrice(1 ether);\n        // holders first: 100 IMD for one hour\n        factory.setGate(address(0), address(token), 100e18, 1 hours);\n        factory.setSaleOpen(true);\n        vm.stopPrank();\n    }\n\n    function test_gateIsOnlyASnapshot() public {\n        Lender lender = new Lender(token);\n        token.mint(address(lender), 100e18);\n        Borrower b = new Borrower(factory, token, lender);\n        vm.deal(address(b), 10 ether);\n\n        // not a holder: refused in the window\n        vm.prank(address(b));\n        vm.expectRevert(HolderGate.NotEligible.selector);\n        factory.buy{value: 1 ether}(address(0));\n\n        // the same wallet, holding the tokens for one call only, must still be refused in the window:\n        // on the code as it is, the flash-held balance passes holdsToken and the purchase goes through\n        vm.expectRevert();\n        b.attack();\n        assertEq(factory.mintedBy(address(b)), 0, \"a non-holder bought inside the holders window\");\n        assertEq(token.balanceOf(address(b)), 0);\n    }\n}","reproduction":"State: factory locked, price 1 ether, VRF configured, setGate(address(0), IMD, 100e18, 1 hours), setSaleOpen(true); inside the first hour. Contract B holds 0 IMD. (1) B calls factory.buy{value: 1 ether}(address(0)): reverts HolderGate.NotEligible, as intended. (2) A lender sends B 100e18 IMD, B calls factory.buy{value: 1 ether}(address(0)) in the lender's callback and returns the IMD. Expected: refused like (1). Actual: succeeds; factory.mintedBy(B) == 1, factory.sold() == 1, B's IMD balance is 0 afterwards. The audit_flow proof (attached) expects the flash purchase to revert and fails on this code with 'next call did not revert as expected' (run with FOUNDRY_TEST=test/scratch forge test --match-path test/scratch/Proof_85e80aa741a7.t.sol).","severity":"low","snippet":"    function holdsToken(address account) public view returns (bool) {","title":"Holders-first window checks the gate token's balance at the instant of the call: IMD borrowed (or bought and sold back) inside the same transaction opens the window to anyone (merged: audit_economics "},{"citation":"resolved","description":"setVRFCallbackGas accepts any value in [VRF_CALLBACK_GAS_MIN, VRF_CALLBACK_GAS_MAX]. One _assign on the pinned EVM writes several fresh slots (_pool, requestEdition, editionBuyer, editionAssignedAt, the _editionsOf length and element, assigned, lastAnsweredBlock) and emits an event; the project's own fork test measured ~176k per draw (test/fork/VrfFork.t.sol:31, which sets 300k) and audit_math measured 216,317 for a buyer's first draw. At the documented minimum every rawFulfillRandomWords call the coordinator makes reverts out of gas; VRF v2.5 deletes the commitment and still charges the subscription, nothing is assigned, and every paid edition must be re-requested after the curator raises the limit (raising stays possible after the sale opens, so it is recoverable). Owner-set, recoverable, but the bound exists to refuse a value that cannot work and does not. Fix: raise the minimum above the dearest draw (e.g. 250,000) or measure it.","line":20,"path":"src/ArtifactsFactory.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test, console2} from \"forge-std/Test.sol\";\nimport {ArtStorage} from \"src/ArtStorage.sol\";\nimport {ArtHouse} from \"src/ArtHouse.sol\";\nimport {KeyProof} from \"src/KeyProof.sol\";\nimport {ArtifactsPiece} from \"src/ArtifactsPiece.sol\";\nimport {ArtifactsFactory} from \"src/ArtifactsFactory.sol\";\nimport {IVRFCoordinatorV2Plus, Traits} from \"src/interfaces/Interfaces.sol\";\n\ncontract CoordStub {\n    uint256 public next = 1;\n    uint32 public lastGas;\n\n    function requestRandomWords(IVRFCoordinatorV2Plus.RandomWordsRequest calldata req) external returns (uint256 id) {\n        lastGas = req.callbackGasLimit;\n        id = next++;\n    }\n\n    /// @dev Delivers a word the way VRF v2.5 does: a call with exactly the request's callbackGasLimit.\n    function deliver(address consumer, uint256 requestId, uint256 word) external returns (bool ok) {\n        uint256[] memory words = new uint256[](1);\n        words[0] = word;\n        (ok,) = consumer.call{gas: lastGas}(\n            abi.encodeWithSelector(ArtifactsFactory.rawFulfillRandomWords.selector, requestId, words)\n        );\n    }\n}\n\ncontract CallbackGasMinTest is Test {\n    address curator = makeAddr(\"curator\");\n    address artist = makeAddr(\"artist\");\n    address alice = makeAddr(\"alice\");\n\n    function test_minimumCallbackGasCanAssignADraw() public {\n        ArtStorage store = new ArtStorage(curator);\n        ArtHouse house = new ArtHouse(curator, address(store), makeAddr(\"imd\"));\n        ArtifactsPiece impl = new ArtifactsPiece(address(new KeyProof()));\n        ArtifactsFactory factory = new ArtifactsFactory(curator, address(house), address(impl));\n        CoordStub coord = new CoordStub();\n        vm.startPrank(curator);\n        house.approveArtist(artist, \"artist\");\n        house.setSaleModule(address(factory), true);\n        house.registerModuleCollection(address(factory), artist);\n        Traits memory t = Traits({title: \"T\", palette: \"P\", colourCount: 3, direction: \"D\"});\n        for (uint256 i = 1; i <= 255; ++i) {\n            factory.setPiece(i, t, hex\"01\", keccak256(abi.encode(i)));\n        }\n        factory.lock();\n        factory.setPrice(1 ether);\n        factory.configureVRF(address(coord), bytes32(uint256(1)), 1, false);\n        factory.setVRFCallbackGas(factory.VRF_CALLBACK_GAS_MIN()); // accepted: the documented minimum\n        factory.setSaleOpen(true);\n        vm.stopPrank();\n\n        vm.deal(alice, 1 ether);\n        vm.prank(alice);\n        uint256 id = factory.buy{value: 1 ether}(address(0));\n        vm.roll(block.number + 3);\n        bool ok = coord.deliver(address(factory), id, 12345);\n        console2.log(\"callback gas limit\", coord.lastGas());\n        assertTrue(ok, \"a draw at the allowed minimum callback gas runs out of gas\");\n        assertEq(factory.assigned(), 1);\n    }\n}","reproduction":"Curator: setPiece 1..255, lock(), setPrice(1 ether), configureVRF(coordinator, keyHash, 1, false), setVRFCallbackGas(150_000) (accepted), setSaleOpen(true); ledger registered (setSaleModule, registerModuleCollection). alice: buy{value: 1 ether}(address(0)) -> request 1. The coordinator calls rawFulfillRandomWords(1, [12345]) with exactly the request's callbackGasLimit (150,000). Expected: the edition is assigned. Actual: OutOfGas inside rawFulfillRandomWords, assigned() stays 0. test/scratch/CallbackGasMin.t.sol (attached) fails with 'a draw at the allowed minimum callback gas runs out of gas'.","severity":"low","snippet":"    uint32 public constant VRF_CALLBACK_GAS_MIN = 150_000;","title":"VRF_CALLBACK_GAS_MIN (150,000) is below what one draw's callback costs: a callback gas limit the contract accepts makes every Chainlink answer run out of gas"},{"citation":"resolved","description":"ArtifactsSource.setAuction refuses to open unless house.canRecordSale(address(this)) (src/ArtifactsSource.sol:153). setSaleOpen only requires locked, a price and a coordinator, yet every purchase goes through house.recordSale (src/ArtifactsFactory.sol:360), which reverts NotSaleModule/NotModuleCollection until the owner has called ArtHouse.setSaleModule(factory, true) and registerModuleCollection(factory, artist). The first open writes saleOpenedAt once and forever (line 209): the holders window and phases count from it, and configureVRF (VRFLocked), setGate, setMemberGate and setMintPhases (SaleIsOpen) are locked; closing and reopening does not reset it. Opened in the wrong order, no one can buy while the window and phase 1 elapse, and they cannot be re-run. No funds at risk; the owner's ordering mistake is irreversible for the guarantees. Fix: inside `if (open)`, before writing saleOpenedAt, `if (!house.canRecordSale(address(this))) revert ...;` as setAuction does.","line":203,"path":"src/ArtifactsFactory.sol","reproduction":"Fresh deployment. Curator: setPiece 1..255, lock(), setPrice(1 ether), configureVRF(coord, keyHash, 1, false), setGate(seats, IMD, 100e18, 1 hours), setMintPhases(1 hours, 1, 0, 0), then setSaleOpen(true) without house.setSaleModule/registerModuleCollection for the factory. Expected (as source.setAuction does in the same ledger state, reverting NotRegistered): refused. Actual: succeeds, saleOpenedAt = now; any buy/buyWithSeat reverts in ArtHouse.recordSale with NotSaleModule; after the curator registers an hour later, gateEndsAt() has passed and currentPhase() returns (5, 0), and setGate/setMintPhases revert SaleIsOpen.","severity":"low","snippet":"    function setSaleOpen(bool open) external onlyOwner {","title":"ArtifactsFactory.setSaleOpen(true) starts the holders window, the mint phases and the VRF/gate/phase locks without checking the ledger can record its sales, unlike ArtifactsSource.setAuction (merged: "},{"citation":"resolved","description":"reviewsOf adds start + count in checked arithmetic before clamping to the list length, so a caller asking for everything from `start` with count = type(uint256).max (a common pagination idiom) gets Panic(0x11) for any start > 0. A view: no funds or state at risk; readers using this idiom fail. Fix: if start >= ids.length return empty, else n = min(count, ids.length - start).","line":205,"path":"src/SubmissionReviews.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {SubmissionReviews} from \"src/SubmissionReviews.sol\";\n\ncontract Seats {\n    function ownerOf(uint256) external view returns (address) {\n        return tx.origin;\n    }\n}\n\ncontract House {\n    function submissionCount() external pure returns (uint256) {\n        return 1;\n    }\n\n    function submissions(uint256) external pure returns (address, bytes32, string memory, uint8) {\n        return (address(1), bytes32(uint256(1)), \"\", 0);\n    }\n}\n\ncontract ReviewsOfOverflowTest is Test {\n    function test_reviewsOf_tailWithMaxCount() public {\n        Seats seats = new Seats();\n        SubmissionReviews r = new SubmissionReviews(address(new House()), address(seats), address(1), address(2));\n        vm.startPrank(tx.origin, tx.origin);\n        r.reviewAsSeat(0, 1, SubmissionReviews.Verdict.Back, \"\");\n        r.reviewAsSeat(0, 2, SubmissionReviews.Verdict.Pass, \"\");\n        vm.stopPrank();\n        // \"the rest from index 1\": start + count overflows and the view panics (0x11) instead of returning [2]\n        (uint256[] memory voices,) = r.reviewsOf(0, 1, type(uint256).max);\n        assertEq(voices.length, 1);\n        assertEq(voices[0], 2);\n    }\n}","reproduction":"Submission 0 pending, reviewed by seats 1 and 2. reviewsOf(0, 1, type(uint256).max): expected voices == [2]; actual: revert panic 0x11. The write_foundry_tests proof (attached) fails on this code with 'panic: arithmetic underflow or overflow (0x11)'.","severity":"low","snippet":"        uint256 end = start + count;","title":"SubmissionReviews.reviewsOf panics when start + count overflows instead of returning the tail"},{"citation":"resolved","description":"allowanceOf considers only saleEnded, the phase cap, mintedBy and the unsold count. _buy also requires saleOpen, and buy/buyMany require the holders-window test (_tokenGate). Front ends sizing a purchase from it submit failing transactions. Interface guarantee only.","line":595,"path":"src/ArtifactsFactory.sol","reproduction":"Gate on IMD with a 24h window, sale open, phases unset. Wallet W with no IMD/seat inside the window: allowanceOf(W) == 5 but buy{value: price}(0) reverts NotEligible. Curator setSaleOpen(false) (before endSale): allowanceOf(W) still 5, buy reverts SaleClosed.","severity":"info","snippet":"    function allowanceOf(address buyer) external view returns (uint256) {","title":"allowanceOf() reports editions a buyer may buy 'now' while buy refuses them (holders window, sale closed)"},{"citation":"resolved","description":"rawFulfillRandomWords accepts an answer while block.number <= fallbackBlock[requestId] and _assign records the edition, but nothing clears fallbackBlock[requestId] or fallbackInFlight. finishFallbackDraw then deletes both and reverts AlreadyFulfilled in _assign, so the deletes roll back; rerequestRandomness reverts AlreadyFulfilled too. Harmless to other draws (_fallbackLive is false once requestEdition is set), but the public views fallbackBlock()/fallbackInFlight() report a pending draw that is done. Fix: delete both in rawFulfillRandomWords when target != 0.","line":424,"path":"src/ArtifactsFactory.sol","reproduction":"Buy one edition (request R at block P); Chainlink silent; at block B >= P + 21,600 anyone calls startFallbackDraw(R): fallbackBlock[R] = B + 5, fallbackInFlight = R. At B + 2 the coordinator delivers rawFulfillRandomWords(R, [w]): accepted, requestEdition[R] = e. At B + 6 finishFallbackDraw(R) reverts AlreadyFulfilled; fallbackBlock(R) == B + 5 and fallbackInFlight() == R remain.","severity":"info","snippet":"        if (target != 0 && block.number > target) revert FallbackPending();","title":"A Chainlink answer that lands inside a started fallback draw's window leaves fallbackBlock[requestId] and fallbackInFlight set forever"}],"hash":"06aa58fc8fd7cc5c95fcd8234f83ef6b5dbe05ff3c3c62c38f15c4b7b5f9b776","nodeId":"22a94dfc-a230-45ae-8b67-d6a71962fd2e","outcome":"completed","summary":"This launch can't deploy on Ethereum mainnet as it stands, so it should not go ahead until that is fixed. I wrote 7 findings (1 high, 4 low, 2 info) and a coverage row for all 112 entry points to `.imd-findings.json`. I changed no contract, test, manifest or config file, and deleted my scratch tests from `test/scratch/` once the results were recorded.\n\n**1. High: the deployment transaction is too big for mainnet.** The factory deploys all 8 contracts in one transaction (the protected harness `ContractsDeploymentProbe.deployAll` says so). I deployed the 8 creation codes from `launch.json` that way and measured **19,419,813 gas of execution, or 20,853,017 including calldata**. Mainnet refuses any transaction over 16,777,216 gas (EIP-7825, live since Fusaka in December 2025). The cap is a protocol rule, not something the deployer's gas ceiling controls. The brief's own \"about 19M\" agrees, so the launch would park again, just as it did on Sepolia.\n- Every contract is under the per-contract size limits, so the size checks don't catch this.\n- The largest pieces are `ArtifactsPiece` (24,132 bytes), `ArtHouse` plus the `ArtCollection` template its constructor creates, and `ArtifactsFactory`.\n- About 4.1M gas (roughly 19 KB of deployed code) has to go. One option is creating the `ArtCollection` template the first time the owner calls `createCollection`, instead of in `ArtHouse`'s constructor.\n- The same size means each claim costs about 5M gas (my estimate from the code size, not measured), so `claimMany` with more than about 3 editions can't fit in one mainnet transaction. Single claims work.\n- This finding carries a failing proof test.\n\n**Specialist findings, reproduced and merged:**\n- **2. Low (economics medium + flow low, same cause):** the holders-first window checks the IMD balance only at the moment of the call. IMD borrowed and returned within one transaction gets a non-holder in. The flow specialist's proof fails on this code as it claims. I lowered the severity because no funds are at risk and per-wallet caps still apply.\n- **3. Low (math):** the lowest allowed VRF callback gas, 150,000, is below what one draw costs. My test confirms the callback runs out of gas at that limit. Proof attached.\n- **4. Low (permissions + flow, same cause):** `ArtifactsFactory.setSaleOpen(true)` doesn't check that the ledger is ready to record its sales, unlike `ArtifactsSource.setAuction`. If the owner opens too early, nobody can buy while the holders window and mint phases run out. That can't be undone.\n- **5. Low (tester):** `reviewsOf` reverts with an overflow when `start + count` overflows. Their proof fails as claimed.\n- **6 and 7. Info:** `allowanceOf` reports purchases that `buy` then refuses. Also, a Chainlink answer that arrives during a fallback draw leaves the fallback state set forever; it does no harm beyond misleading views.\n\n**Dropped:** the `setSplit` report. Changing the split while THE SOURCE's auction is unsettled is a deliberate owner power, so I listed it as a trust assumption in the coverage record instead.\n\n**Coverage:** 99 entry points hold, 9 are linked to findings, and the 4 `ImdBuybackBurner` entry points are marked unreached. That contract isn't in `launch.json`, so it isn't deployed by this launch, and I didn't review it in depth. I also didn't dig deeply into the cryptography in `KeyProof`, beyond checking that its proof checks hold together.\n\nThe full repository build was killed for lack of memory, so I built `src/` alone and ran my tests by themselves (`FOUNDRY_TEST=test/scratch`). I did not re-run the project's existing 259 tests.","treeHash":null,"usage":{"cachedInputTokens":3159771,"inputTokens":56,"model":"claude-opus-5-5","outputTokens":40785,"runtime":"claude","turns":32,"wallClockMs":769606}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e36579e0223ff908","findings":[],"hash":"2b33a1f0609d37a37eb3729adecc2e3a74e2754ccbae74ae05ed6750de352374","nodeId":"a777ff90-c211-4452-91f9-899f63ed08f1","outcome":"failed","summary":"wall-clock budget exhausted","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":"claude-opus-5-5","outputTokens":0,"runtime":"claude","turns":0,"wallClockMs":5100118}},{"artifacts":[],"attempt":1,"bundleHash":"b8441b6881401ab8abba251bd943c8b26c6fe699c8f163cd6d0eff4ebbe1434e","device":"76f57db4177175be","findings":[],"hash":"339f891276f4734b751d600897391d325771dc0a0a8c3855e257ed59e178b278","nodeId":"a8ebf971-ba9e-4367-bb81-cebab66496ce","outcome":"completed","summary":"The work is complete and verified. Summary:\n\n**Outcome.** The gas-cap finding reproduced exactly as reported, and it is fixed. The launch transaction now needs 15,201,436 gas in total, 1,575,780 under the EIP-7825 cap. The full suite passes with the verifier's fuzz seed.\n\n| Launch set | execution gas | total with calldata |\n|---|---|---|\n| 8 contracts, starting tree | 19,419,813 | 20,853,017 |\n| 7 contracts, this tree | 14,150,696 | 15,201,436 |\n\n**What changed and why**\n\n- **ArtifactsPiece leaves the launch.** Its 24 KB runtime is only a template that claims copy, and the deposit cost of ~86 KB of code at 200 gas a byte is the bulk of the overrun. The curator deploys it right after the launch from the new `launch.piece.json`, which mirrors the existing burner pattern. The piece's code is byte-for-byte unchanged.\n- **Factory and source take it through a one-shot owner setter.** Both are now constructed with the owner and ArtHouse only. The `setPieceImplementation` call is owner-only, refuses a second call or a code-less address, and the sale and the auction cannot open until it is set. The manifest in `launch.json` is seven contracts in the same order.\n- **Advisory fixes applied:** sale opening now requires the ledger to have registered the factory, the reviews pager clamps before adding, and the VRF callback minimum is 250,000. Each has a test in `test/PieceImplementation.t.sol`.\n- **Left alone, with reasons recorded:** the token-leg soft gate, the allowance view, and the cosmetic fallback-draw views.\n- **The imported escrow audit finding** was already fixed in the accepted tree. Its proof passes before and after.\n\n**One thing to flag.** The reviewer's gas-cap proof hard-codes the old eight-contract manifest, so it still deploys ArtifactsPiece and still fails on any fix that changes the manifest. No fix that reaches the cap can avoid changing the manifest. I answered that finding \"disputed\" on that ground only, with the substance accepted and fixed, and added `test/LaunchGasCap.t.sol` as the same loop over the real manifest. The reviewer will need to accept that reasoning for the revision to clear.\n\n**Trust consequence, stated in ADAPTATION.md and README.** The piece implementation is no longer attested by the launch. The requester compares its runtime with their own build of this commit before connecting it, as they already do for every launched contract, and the connection cannot be changed once made.\n\nWhy not the reviewer's other suggestions: a lazily created ArtCollection template moves its creation code into ArtHouse's runtime at the same deposit price, so it saves nothing of substance. Moving only the piece's rendering out was measured at about 2.1M gas, short of the 4.1M needed.","treeHash":"3800c6315b97154a3894462c3ce7fee9a970edea","usage":{"cachedInputTokens":4171173,"inputTokens":1128,"model":"claude-fable-5-1","outputTokens":53819,"runtime":"claude","turns":39,"wallClockMs":1722576}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"28e346843ec15530","findings":[{"citation":"resolved","description":"Asymmetry between the two sale openers. ArtifactsSource.setAuction (src/ArtifactsSource.sol:153) refuses to open until `house.canRecordSale(address(this))` is true, because every bid will later be pushed through ArtHouse.recordSale. ArtifactsFactory.setSaleOpen performs the same kind of opening (every buy calls house.recordSale at src/ArtifactsFactory.sol:360) but has no such guard. Opening is the one-way moment that writes saleOpenedAt: from then on configureVRF (VRFLocked), setGate and setMemberGate (SaleIsOpen), setMintPhases (SaleIsOpen) and the downward direction of setVRFCallbackGas are locked forever, and the holders window and mint phases start counting. If the curator opens before ArtHouse.setSaleModule(factory, true) and ArtHouse.registerModuleCollection(factory, artist) (the launch notes list those as post-deploy steps with no enforced order), every buy/buyMany/buyWithSeat reverts in the ledger with NotSaleModule or NotModuleCollection while the holders-first window and the per-wallet phases burn down on a sale nobody can enter. The state is not reversible: closing and re-opening does not reset saleOpenedAt, the gate cannot be re-set, and the window the holders were promised is lost for that sale. No funds are at risk; the broken guarantee is the holders-first/phase schedule, and the fix is the one-line guard its sibling already has. Trigger is the owner's ordinary configuration, so this is reported as low (no unprivileged amplifier), as an asymmetry the author can close cheaply: `if (!house.canRecordSale(address(this))) revert NotRegistered();` inside `if (open)` before saleOpenedAt is written, mirroring ArtifactsSource.setAuction.","line":204,"path":"src/ArtifactsFactory.sol","reproduction":"Fresh deployment per launch.json (owner = curator). Curator: factory.setPiece for 1..255, factory.lock(), factory.setPrice(1 ether), factory.configureVRF(coordinator, keyHash, subId, false), factory.setGate(0, IMD, 1, 1 days). Do NOT call house.setSaleModule / house.registerModuleCollection for the factory yet. Curator: factory.setSaleOpen(true). Expected (as setAuction does for THE SOURCE): revert NotRegistered, saleOpenedAt stays 0. Actual: succeeds, saleOpenedAt = block.timestamp. Then alice: factory.buy{value: 1 ether}(address(0)) after the window reverts with ArtHouse.NotSaleModule (inside the window it reverts NotEligible first unless alice holds IMD; with IMD it also reaches NotSaleModule). Curator: factory.setGate(0,0,0,0) reverts SaleIsOpen; factory.configureVRF(...) reverts VRFLocked. For the same ledger state, source.setAuction(1 ether, now+1 day) reverts NotRegistered. Scratch test test/scratch/OpenBeforeRegister.t.sol (test_factoryOpensUnregistered_sourceRefuses) reproduces exactly this and passes on the current code.","severity":"low","snippet":"        if (open) {\n            if (saleEnded) revert SaleOver();\n            if (!locked) revert NotLocked();\n            if (price == 0) revert WrongPrice();\n            if (address(vrfCoordinator) == address(0)) revert VRFNotConfigured();\n            if (saleOpenedAt == 0) saleOpenedAt = uint64(block.timestamp);\n        }","title":"ArtifactsFactory.setSaleOpen(true) opens and irrevocably starts the editions sale with no check that the ledger will take its sales, unlike ArtifactsSource.setAuction"},{"citation":"resolved","description":"Documented as an owner power, not a bypass: the curator may change any collection's split at any time, and ArtHouse._credit reads the split at the moment recordSale runs. For THE SOURCE the bid is taken (ArtifactsSource.bid) possibly days before ArtifactsSource.settle pushes it through recordSale, so the split the bidder and artist saw at bidding (15/0/85 per the launch notes) is not the split the ETH is divided by. The same holds for the house share of every plain-collection mint and factory purchase, but those are atomic with the split read. The owner is trusted and no unprivileged actor can amplify this (settle is permissionless but reads whatever split is current), so this is recorded as a trust assumption for the judge rather than a defect. A design that wanted the auction's split frozen would snapshot it at setAuction or at the first bid; that is a scope decision for the author, not a required change.","line":273,"path":"src/ArtHouse.sol","reproduction":"Curator sets THE SOURCE's split to (1500, 0, 8500, 0). Alice bids 100 ether; auction ends. Before anyone calls source.settle(), curator calls house.setSplit(source, 0, 10000, 0, 0) (valid: sums to 10000). Anyone calls source.settle(). Expected under the split shown while bidding: artist paid 85 ether at settle (ArtistPaid), 15 ether burned or to the broker. Actual: balances[house][ETH] += 100 ether, artist receives 0. All actors here are the trusted owner; listed for the trust-assumption record only.","severity":"info","snippet":"        if (!collections[collection].exists) revert UnknownCollection();\n        if (uint256(brokerBps) + houseBps + artistBps + burnBps != BPS) revert BadSplit();\n        Collection storage c = collections[collection];\n        c.brokerBps = brokerBps;\n        c.houseBps = houseBps;\n        c.artistBps = artistBps;\n        c.burnBps = burnBps;","title":"Trust assumption: ArtHouse.setSplit rewrites the split that in-flight value settles under (THE SOURCE's bids are split at settle, not at bid)"}],"hash":"3748d6a8cb0dc6871dcd2a3595d1a4e124e61df27246360182fa99acca9021d4","nodeId":"98d9cae5-76f3-486d-9c82-9220e1f7cc9e","outcome":"completed","summary":"Findings file written and verified: all 112 listed entry points have a coverage row, and both snippets match the tree line for line.\n\n**Outcome.** The permission model of this commit holds. I traced every state-changing entry point of the eight launched contracts (plus the four burner entries, which are not in this launch) against the Access Control, Asymmetry and Trust Gap guides and found no permission bypass, no unguarded writer of a guarded variable, no initializer exposure, and no privilege escalation path. Two items are recorded in `.imd-findings.json`:\n\n- **Low, asymmetry (finding 1).** `ArtifactsFactory.setSaleOpen(true)` opens the editions sale without checking that the ledger will accept its sales, while its sibling `ArtifactsSource.setAuction` refuses to open until `house.canRecordSale` is true. Opening is the one-way moment that writes `saleOpenedAt`, which freezes the VRF config, gate, member gate and mint phases and starts the holders window. Opened before `setSaleModule` and `registerModuleCollection`, every buy reverts in the ledger while the promised holders-first window burns, and the gate can never be re-set for that sale. No funds at risk, owner-triggered, so reported as low. The scratch test `test/scratch/OpenBeforeRegister.t.sol` reproduces it and shows the Source refusing the same state. Suggested fix is the one-line guard the Source already has, before `saleOpenedAt` is written.\n- **Info, trust assumption (finding 2).** `ArtHouse.setSplit` applies to value settled after the change. THE SOURCE's bid is split at `settle`, not at `bid`, so the owner can change the 15/0/85 split between the auction's end and settlement. Documented owner power with no unprivileged amplifier, recorded for the judge rather than as a defect.\n\n**Checked and holding, worth noting for the judge.** Broker self-naming by a pass holder is a stated perk in the README, not a bypass. Copies made by `Clones.copyCode` are initialised atomically by their creator and both implementations lock themselves in their constructors. Every ETH exit is pull-style or bound to the caller, the artist's own payout, the owner or the set-once burner. `settle` on THE SOURCE cannot be blocked by the winner, a named broker or the artist's payout. The escrow's transfer block makes the seller provably the owner at `release`. `launch.json` matches the constructors in order, uses `$owner` on every owned contract, and passes the IMD and seats addresses as static words.\n\n**Not reached in depth.** `ImdBuybackBurner` is outside this launch and my area, so its rows are marked as not deployed here rather than traced. The slither and aderyn leads in my area (arbitrary-send, reentrancy in `release` and `_pullIMD`) were traced and do not hold; the weak-PRNG and timestamp leads belong to the randomness and economics areas.\n\nNothing in the repository was changed. The scratch test lives only under `test/scratch/`.","treeHash":null,"usage":{"cachedInputTokens":1731648,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":47509,"runtime":"claude","turns":31,"wallClockMs":693256}},{"artifacts":[],"attempt":1,"bundleHash":"6cf18ea1e75e495dad3938d5ff07a4aa5ed0be6c93356746c24a6f0f4bc7ce9f","device":"6b0a28df3d585600","findings":[{"description":"reviewsOf computes `uint256 end = start + count;` in checked arithmetic before clamping to the list length. A caller asking for 'everything from index start' with count = type(uint256).max (a common pagination idiom) gets a panic 0x11 for any start > 0 instead of the remaining reviews. It is a view, so no funds or state are at risk, but front ends and agents reading reviews this way fail. Fix: clamp first, e.g. `uint256 end = count > ids.length - min(start, ids.length) ? ids.length : start + count;` or compute `if (start >= ids.length) n = 0; else n = min(count, ids.length - start)`.","line":205,"path":"src/SubmissionReviews.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {SubmissionReviews} from \"src/SubmissionReviews.sol\";\n\ncontract Seats {\n    function ownerOf(uint256) external view returns (address) {\n        return tx.origin;\n    }\n}\n\ncontract House {\n    function submissionCount() external pure returns (uint256) {\n        return 1;\n    }\n\n    function submissions(uint256) external pure returns (address, bytes32, string memory, uint8) {\n        return (address(1), bytes32(uint256(1)), \"\", 0);\n    }\n}\n\ncontract ReviewsOfOverflowTest is Test {\n    function test_reviewsOf_tailWithMaxCount() public {\n        Seats seats = new Seats();\n        SubmissionReviews r = new SubmissionReviews(address(new House()), address(seats), address(1), address(2));\n        vm.startPrank(tx.origin, tx.origin);\n        r.reviewAsSeat(0, 1, SubmissionReviews.Verdict.Back, \"\");\n        r.reviewAsSeat(0, 2, SubmissionReviews.Verdict.Pass, \"\");\n        vm.stopPrank();\n        // \"the rest from index 1\": start + count overflows and the view panics (0x11) instead of returning [2]\n        (uint256[] memory voices,) = r.reviewsOf(0, 1, type(uint256).max);\n        assertEq(voices.length, 1);\n        assertEq(voices[0], 2);\n    }\n}","reproduction":"Submission 0 pending with two seat reviews (voices 1 and 2). reviewsOf(0, 1, type(uint256).max): expected voices == [2]; actual: revert panic 0x11 (arithmetic overflow).","severity":"low","title":"SubmissionReviews.reviewsOf panics when start + count overflows instead of returning the tail"}],"hash":"3f77377327b1a82b45978b976949f49e9d19f7f0817465eb2ecd1b0552a5043a","nodeId":"a777ff90-c211-4452-91f9-899f63ed08f1","outcome":"completed","summary":"I added 22 tests in `test/EdgeProbes.t.sol` and found one low-severity defect, reported in `.imd-findings.json`. No contract was changed.\n\n**What I ran:** the new file, built with the repo's own settings and the verifier's seed in a copy of the project holding only the contracts, the shared fixture and mocks, and this file. It passed: 21 unit/fuzz tests and 1 invariant suite. I did **not** finish a full `forge test` of the whole repository. The full build ran over 11 minutes using 6.7 GB without finishing, so I stopped it to keep time for the rest. The existing suites are untouched, so they should be unaffected, but the verifier's full run is the first time everything builds together.\n\n**The finding (low):** `SubmissionReviews.reviewsOf` at `src/SubmissionReviews.sol:205` computes `start + count` before limiting it to the list length. A request like `reviewsOf(0, 1, type(uint256).max)` (\"everything from index 1\") crashes with an overflow error instead of returning the remaining reviews. It's read-only, so no funds or state are at risk, but a front end or agent paging this way will fail. The finding includes a self-contained proof test that fails on the current code and will pass once it's fixed, plus a suggested fix.\n\n**What the new tests cover, mostly failure paths and exact boundaries:**\n- **THE SOURCE auction:** the 5% minimum raise rounds up, so even a 1-wei bid must be beaten by 2 wei. A fuzz test (512 runs) confirms one wei below the minimum is refused and the minimum is accepted. It also pins:\n  - the 10-minute anti-sniping extension at exactly 10 minutes left (no extension) and one second inside it (extends);\n  - a bid at the end time refused, while settling in that same second works;\n  - settle and `setAuction` errors, and gates locked after the first bid;\n  - the 7-day void at minus one second (refused) and exactly 7 days (works), then refund, withdraw and reopen.\n- **New invariant over random sequences:** bids (including too-low ones), refunds, time jumps, voids, curator reopens and settlement. After every call, the auction's ETH equals the refunds owed plus the live high bid, and settlement happens at most once and never reopens. I confirmed the random sequences actually reach voids, reopens and settlements, so the checks aren't passing vacuously.\n- **BrokerPass:** start time exactly one year ahead is accepted, one second more is refused; zero, a second call and a non-owner are refused. Claims are refused one second before opening and work at the opening second. Piece ids 0, 1 (not yet claimed), 256 (before the auction settles) and 257 are refused. The right to set the start follows the factory's two-step ownership handover.\n- **SubmissionReviews:** limits at 280/281 bytes for notes and 4,000/4,001 bytes for theses and applications. Also covered: seat ids in the piece-voice range, unminted seats, an empty verdict, reviews and theses refused once a submission is decided, and paging edge cases that don't overflow.\n- **ArtHouse:** a piece of exactly 100,000 bytes fits and one more byte is refused, plus clear and re-upload. Curation errors, and a revoked artist losing curation rights immediately. Mint errors, the default split checked as 75% artist / 5% house / 20% buyback, and a second mint of the same piece refused. Withdraw, house withdrawal, buyback release and sale-module entry-point errors.\n\nA pass holder naming themselves as broker on their own purchase is not reported as a defect: README.md:180 describes it as an intended perk of the pass. The fork tests against the live ETH/IMD pool and Chainlink coordinator still need a run with an RPC; they skip without one.","treeHash":"4c195944b761911e6da38b8c78a1ca745b089fa5","usage":{"cachedInputTokens":2036530,"inputTokens":46,"model":"claude-opus-5-5","outputTokens":29489,"runtime":"claude","turns":27,"wallClockMs":1106663}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"89eed35842d609d7","findings":[],"hash":"46f1771464c79556ae934ac322670db5fd48acf1d9e4ac0ec8296ec0f8def843","nodeId":"94b538ed-9fb6-4444-8283-698331944ad9","outcome":"failed","summary":"git checkout -B imd-submission failed: stopped by SIGTERM at its 1 ms limit","treeHash":null,"usage":{"cachedInputTokens":1044636,"inputTokens":678,"model":"claude-fable-5-1","outputTokens":18470,"runtime":"claude","turns":24,"wallClockMs":2134706}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bf4c5b8707945096","findings":[{"citation":"resolved","description":"Merged: write_foundry_tests ded67729b040. This was introduced by the fix for 180a7e1d59e1. Before it, the implementation was $contract:ArtifactsPiece, bound by the manifest inside the launch. Now the curator deploys it by hand (launch.piece.json, taking the launched $contract:KeyProof) and connects it once through ArtifactsFactory.setPieceImplementation (src/ArtifactsFactory.sol:174) and ArtifactsSource.setPieceImplementation (src/ArtifactsSource.sol:90). Both setters refuse only a second call and a code-less address. setSaleOpen(true) and setAuction check only pieceImplementation != address(0). If the curator passes any other launched contract (KeyProof, which they handle in the same step; ArtHouse; the burner), the setter accepts it and the edition sale opens. Each buy forwards the ETH to the ledger at purchase (house.recordSale pays the artist and credits the house), and VRF assigns the edition. Then every _claim copies the wrong runtime (Clones.copyCode) and reverts at IArtifactsPiece(piece).initialize. There is no refund path, and the setting can never be corrected (PieceImplementationAlreadySet). Every paid edition is stranded; the curator can only stop further losses with endSale. THE SOURCE's settle reverts the same way, but there the bid comes back through voidUnsettled after SETTLE_GRACE. Severity is low because only the trusted owner can trigger it, by a configuration mistake (the same class as last round's VRF_CALLBACK_GAS_MIN and setSaleOpen-ordering findings, both fixed). But the guard exists to refuse an address that cannot work, and it does not. The fix keeps the design: in both setters, staticcall implementation.controller() and require exactly one 32-byte word equal to `implementation` (only a locked ArtifactsPiece reports itself; runtime copies report their controller), and require address(ArtifactsPiece(implementation).keyProof()).code.length != 0. Revert NoPieceImplementation otherwise.","line":174,"path":"src/ArtifactsFactory.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ArtStorage} from \"src/ArtStorage.sol\";\nimport {ArtHouse} from \"src/ArtHouse.sol\";\nimport {KeyProof} from \"src/KeyProof.sol\";\nimport {ArtifactsPiece} from \"src/ArtifactsPiece.sol\";\nimport {ArtifactsFactory} from \"src/ArtifactsFactory.sol\";\nimport {ArtifactsSource} from \"src/ArtifactsSource.sol\";\n\n/// @notice setPieceImplementation is set-once and checks only that the address has code. A contract that is not a\n/// locked ArtifactsPiece (here the launched KeyProof, the address the curator handles in the same step) is accepted,\n/// after which the sale opens, buyers pay, and every claim / settlement reverts forever because the copy has no\n/// `initialize`. The setter must refuse anything that is not a locked ArtifactsPiece (e.g. require\n/// ArtifactsPiece(impl).controller() == impl and a keyProof with code); this test passes once it does.\ncontract WrongPieceImplementationProof is Test {\n    address curator = makeAddr(\"curator\");\n    KeyProof keyProof;\n    ArtHouse house;\n\n    function setUp() public {\n        ArtStorage store = new ArtStorage(curator);\n        house = new ArtHouse(curator, address(store), makeAddr(\"imd\"));\n        keyProof = new KeyProof();\n    }\n\n    function test_factoryRefusesANonPieceImplementation() public {\n        ArtifactsFactory f = new ArtifactsFactory(curator, address(house));\n        vm.prank(curator);\n        vm.expectRevert();\n        f.setPieceImplementation(address(keyProof));\n        // a real locked piece is still accepted\n        ArtifactsPiece impl = new ArtifactsPiece(address(keyProof));\n        vm.prank(curator);\n        f.setPieceImplementation(address(impl));\n        assertEq(f.pieceImplementation(), address(impl));\n    }\n\n    function test_sourceRefusesANonPieceImplementation() public {\n        ArtifactsSource s = new ArtifactsSource(curator, address(house));\n        vm.prank(curator);\n        vm.expectRevert();\n        s.setPieceImplementation(address(house));\n        ArtifactsPiece impl = new ArtifactsPiece(address(keyProof));\n        vm.prank(curator);\n        s.setPieceImplementation(address(impl));\n        assertEq(s.pieceImplementation(), address(impl));\n    }\n}","reproduction":"Reproduced twice. (1) The attached proof (write_foundry_tests' Proof_ded67729b040.t.sol, copied to test/scratch/ and run with `forge test --match-path test/scratch/Proof_ded67729b040.t.sol`). Fresh ArtStorage/ArtHouse/KeyProof; curator calls ArtifactsFactory.setPieceImplementation(address(keyProof)) and ArtifactsSource.setPieceImplementation(address(house)). Expected: revert. Actual: both accepted; both tests fail with 'next call did not revert as expected'. (2) Full flow on the project Fixture (test/scratch/WrongImplFlow.t.sol, PASS = defect present). Fresh factory registered with the house (setSaleModule, registerModuleCollection); curator calls setPieceImplementation(address(keyProof)), which is accepted. Then configureVRF, setPiece 1..255, lock, setPrice(1 ether), setSaleOpen(true), which succeeds. alice calls buy{value: 1 ether}(address(0)); vrf.fulfill(id, 7) assigns an edition; the factory's balance is 0 (the ledger holds +0.25 ether for the house; the other 0.75 ether was paid out by recordSale). alice calls registerViewingKey; curator calls postWrappedKey(edition, 0x01); alice calls claim(edition): reverts. curator calls setPieceImplementation(address(pieceImpl)): reverts PieceImplementationAlreadySet. Expected: the setter refuses anything that is not a locked ArtifactsPiece, so the paid edition stays claimable.","severity":"low","snippet":"    function setPieceImplementation(address implementation) external onlyOwner {\n        if (pieceImplementation != address(0)) revert PieceImplementationAlreadySet();\n        if (implementation.code.length == 0) revert NoPieceImplementation();","title":"setPieceImplementation (new in this revision) is set-once but only checks that the address has code: connecting any contract other than a locked ArtifactsPiece lets the edition sale open and take paym"}],"hash":"89c1d62eb480df2fc8a06d050572b26a737a0aeade97edba09d6d90847046a82","nodeId":"22a94dfc-a230-45ae-8b67-d6a71962fd2e","outcome":"completed","summary":"I settled all six of last round's findings. Five are closed: three are fixed and three disputes are accepted, and I kept one new low finding that the fix introduced. `.imd-findings.json` has that one finding and a coverage row for every entry point: 114 from the ABIs (the ArtifactsFactory/ArtifactsSource `setPieceImplementation` rows included) plus 2 manifest checks. No repository files changed; my scratch tests are deleted.\n\n**Last round's findings**\n- **Gas cap (high): fixed.** I ran the original proof copied into `test/scratch/`. It still fails, but only because it hard-codes the old 8-contract list and two constructor signatures that no longer exist. The author is right on that point. The current `launch.json` deploys 7 contracts, using the same loop the protected harness uses:\n\n  | | gas |\n  |---|---|\n  | execution | 14,150,696 |\n  | total with calldata | 15,201,436 |\n  | per-transaction cap (EIP-7825) | 16,777,216 |\n\n  The manifest itself checks out: only the allowed keys, constructor argument counts 1/3/0/2/2/3/4 match each constructor, notes are 2,284 characters, and every owner is `$owner`.\n- **VRF callback gas minimum: fixed.** It is now 250,000. With each call run as its own transaction (`--isolate`, so no storage is pre-warmed), the dearest draw (the first ever) completes on exactly 250,000 gas, and 249,999 is refused.\n- **`setSaleOpen` before the ledger is registered: fixed.** It now checks `canRecordSale` and that the piece implementation is set, before `saleOpenedAt` is written.\n- **`reviewsOf` overflow: fixed.** A huge count now returns the tail of the list.\n- **Gate checks balance only at the moment of the call: dispute accepted.** The behaviour is unchanged, but it is documented in ADAPTATION.md as a soft gate on a freely transferable token. Fixing it would change the agreed design.\n- **`allowanceOf` and stale fallback views (info): disputes accepted.** Both are documented and neither affects funds or draws.\n\n**New finding (low, merged with write_foundry_tests ded67729b040)**\n- **What:** the new `setPieceImplementation` on ArtifactsFactory and ArtifactsSource (`src/ArtifactsFactory.sol:174`, `src/ArtifactsSource.sol:90`) can be set only once and checks only that the address has code.\n- **Reproduction:** connect KeyProof by mistake and the edition sale still opens. A buyer pays 1 ETH, the ETH goes to the ledger, and VRF assigns the edition. Then `claim` reverts and the setting can't be corrected. THE SOURCE fails the same way at `settle`, but there the bid comes back through `voidUnsettled`.\n- **Proofs:** the specialist's proof fails on this code as it should. I also ran the full buy-to-claim flow on the project's test fixture.\n- **Severity:** low, because only the owner can cause it, by mistake. It's the same kind as last round's VRF-minimum and sale-ordering findings, which the author fixed.\n- **Suggested fix:** check that the implementation reports itself as `controller()` and that its `keyProof` has code.\n\n**Test runs**\n- All 306 non-fork tests pass.\n- I did not run the fork tests or re-trace ImdBuybackBurner; it isn't in this launch, so its 4 rows are marked `unreached`.\n- Rows for code that hasn't changed since last round's review are marked `holds`, based on that review and the passing tests.\n\nThe requester asked for 8 contracts with the code unchanged. ArtifactsFactory, ArtifactsSource and SubmissionReviews now differ from 5afa6c7, so their runtime code should be compared against a build of this commit. ArtifactsPiece is now deployed separately by the curator, from `launch.piece.json`. The launch notes, README and ADAPTATION.md all say this.","treeHash":null,"usage":{"cachedInputTokens":2814732,"inputTokens":52,"model":"claude-opus-5-5","outputTokens":35469,"runtime":"claude","turns":27,"wallClockMs":635032}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"629987aaf6c7aa88","findings":[],"hash":"8bb3049859f2b924239acfc4d7871cc3b06495ad154bb7a0a575c2c537fed35e","nodeId":"94b538ed-9fb6-4444-8283-698331944ad9","outcome":"failed","summary":"the local build failed, so this was not submitted:\nforge build exited with 1:\nCompiling 76 files with Solc 0.8.26\nError: solc exited with signal: 9 (SIGKILL)\n<empty output>","treeHash":null,"usage":{"cachedInputTokens":831116,"inputTokens":580,"model":"claude-fable-5-1","outputTokens":15998,"runtime":"claude","turns":20,"wallClockMs":1894221}},{"artifacts":[],"attempt":1,"bundleHash":"c39c6f2871ae3f4f252c0b731888daa4380c67e5c32d7dd574060f3bbfe432ba","device":"2e343a06f770172d","findings":[],"hash":"99bf83519d570252e52da0b0e11932f5cdf0d9437902862fe760fb8358a47226","nodeId":"a8ebf971-ba9e-4367-bb81-cebab66496ce","outcome":"completed","summary":"Fixed the reproduced escrow finding: `postEscrowKey` now rejects posts at or after the 24-hour deadline with `TooLate()`. Only ArtifactsPiece’s production code changed.\n\n- `forge build`: passed.\n- Tests with the required seed: **271 passed, 0 failed, 2 fork suites skipped** without `FORK_URL`.\n- Manifest, constructors, configuration and dependencies unchanged.\n\n[ADAPTATION.md](/home/seat/.identitymd/work/0ea6a36b-9981-408f-afaf-1f6e3afcbfdb/a8ebf971-ba9e-4367-bb81-cebab66496ce/ADAPTATION.md) records every change and the limitation that rejected transaction calldata remains public.\n\nPrepared for deployment handoff; no transactions broadcast.","treeHash":"2f2a1c1e6cbd4fafcb1395eb9359a9901e7a1fda","usage":{"cachedInputTokens":3028992,"inputTokens":119278,"model":"gpt-6-astra","outputTokens":18495,"runtime":"codex","turns":11,"wallClockMs":794342}},{"artifacts":[],"attempt":1,"bundleHash":"792e6dc14173072762856176f929d6c694071cd2c112c4dc5fb0a06470136296","device":"1272a65455eb54ca","findings":[],"hash":"9c79ce8e98df34371699aa78e1d2af2e20f1c3818d5b5e5e9d538f78febb7844","nodeId":"94b538ed-9fb6-4444-8283-698331944ad9","outcome":"completed","summary":"Changed only `launch.json` notes to clarify the eight-contract deployment and later owner configuration. Constructor arguments, mainnet IMD address, and all contract source remain unchanged.\n\nValidation passed:\n\n- Manifest structure and compiled ABI checks.\n- `forge build` — passed with warnings.\n- `forge test` with the required seed — **271 passed, 0 failed**. Two fork suites skipped because `FORK_URL` was unset.","treeHash":"e372ade977842495920fb6d02f0cbaf27ca82361","usage":{"cachedInputTokens":1674496,"inputTokens":68758,"model":"gpt-6-astra","outputTokens":13154,"runtime":"codex","turns":14,"wallClockMs":910265}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"98b4506bef931d13","findings":[],"hash":"b7b76bb1265a1fb14f47390bdf8f3597f67c1c5c7e9138def8f7e64d171942e2","nodeId":"477bb577-bb6a-4e86-9e1e-6b51908137c3","outcome":"failed","summary":"Failed to authenticate: OAuth session expired and could not be refreshed","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"claude","turns":1,"wallClockMs":1360}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"896d1238054266ca","findings":[{"citation":"resolved","description":"The holders window promises that for gateSeconds after the sale opens only identity.md seat holders, members, or wallets holding at least gateMinBalance of the gate token (IMD) may buy (README 'holders first', launch notes). The token leg of the gate is HolderGate.holdsToken, a balanceOf read at the moment of the buy call. IMD is a freely tradeable ERC-20 with a live ETH/IMD Uniswap v4 pool (launch.burner.json), and Uniswap v4 flash accounting lets any contract take IMD inside unlock() and settle it back in the same transaction at no fee. A wallet that holds no IMD therefore borrows gateMinBalance for one call, calls buy/buyMany (passing _tokenGate), returns the IMD, and leaves holding an edition and no IMD. The seat and member legs are not affected (seats are identity NFTs; points are soulbound); only the token leg is. Cost to the bypasser: gas only. Who loses: holders the window was meant to give priority to (and the curator's stated allocation policy), since the 255 editions and the phase caps are first-come. No funds are lost. Guides: Economic Security ('extract value atomically', 'legitimate features turned against the protocol') and Flow Gap seam 2 (a correct periphery read whose downstream effect defeats the stated 'holders only' guarantee).","line":347,"path":"src/ArtifactsFactory.sol","reproduction":"State: factory locked, price set, setGate(seats=0, token=IMD, minBalance=10e18, seconds=24h), setSaleOpen(true); block.timestamp < gateEndsAt(). Attacker wallet W holds 0 IMD. (1) W calls factory.buy{value: price}(0) directly: reverts NotEligible (expected). (2) In one transaction W's contract receives 10e18 IMD from a flash source (v4 PoolManager take, or any lender), calls factory.buy{value: price}(0), then returns the 10e18 IMD. Actual: the buy succeeds, mintedBy[W] == 1, sold == 1, and W's IMD balance is 0 before and after. Expected per the stated guarantee: a wallet that does not hold IMD cannot buy inside the window. The scratch test test/scratch/GateFlashBypass.t.sol (test_nonHolderBuysInsideTheHoldersWindowWithBorrowedIMD) reproduces it with a one-call lender mock standing in for the pool's flash accounting; run with `FOUNDRY_TEST=test/scratch forge test --match-path test/scratch/GateFlashBypass.t.sol`, it passes on this code (i.e. the bypass succeeds): the direct buy reverts NotEligible, the borrowed-IMD buy in the same window sets mintedBy == 1 and sold == 1 with the buyer's IMD balance 0 afterwards. Possible mitigation preserving the design: for the token leg, require the balance to have been held before the window (e.g. a snapshot or a held-since check), or document that the token leg is a soft gate and rely on the seat/member legs for priority.","severity":"medium","snippet":"        if (_inGate(saleOpenedAt) && !holdsToken(msg.sender) && !isMember(msg.sender)) revert NotEligible();","title":"Holders-first window on the edition sale is bypassed by IMD borrowed for one call (balance-at-call gate)"},{"citation":"resolved","description":"allowanceOf is documented as 'how many more editions buyer may buy now'. It only considers saleEnded, the phase cap, mintedBy and the unsold count. _buy additionally requires saleOpen, and buy/buyMany additionally require the holders-window test (_tokenGate). So during the window a non-holder reads allowanceOf == cap (e.g. 2 or 5) while every buy reverts NotEligible, and while the curator has the sale closed (setSaleOpen(false), before endSale) allowanceOf still reports a positive number while _buy reverts SaleClosed. Front ends that size a purchase from this view will submit failing transactions. No funds at risk (Invariant guide: 'diverge view from write'; interface guarantee only).","line":595,"path":"src/ArtifactsFactory.sol","reproduction":"State as in finding 1 (gate on IMD, 24h window, sale open, mint phases unset). For a wallet W with no IMD and no seat, inside the window: factory.allowanceOf(W) returns 5 (MAX_PER_WALLET) but vm.prank(W); factory.buy{value: price}(0) reverts HolderGate.NotEligible. Then curator calls factory.setSaleOpen(false): allowanceOf(W) still returns 5 but buy reverts SaleClosed (both steps executed and confirmed in test/scratch/GateFlashBypass.t.sol, test_allowanceOfPromisesWhatBuyRefuses). Expected: allowanceOf returns 0 whenever the buyer cannot buy now, or the doc states which checks it omits.","severity":"info","snippet":"    function allowanceOf(address buyer) external view returns (uint256) {","title":"allowanceOf() promises purchases that _buy refuses (view/write divergence during the holders window and while the sale is closed)"}],"hash":"c0b1531be9bc0cb55751d834021e5e11ff030f311633eb5219f5b03e90870258","nodeId":"72c82f0a-e2f4-4fdc-be7d-ba5145f107b5","outcome":"completed","summary":"The review is complete. The findings file and the scratch test are in place, and no tracked file was changed (the only new paths are the ignored `.imd-findings.json`, `test/scratch/`, and build output).\n\n**Outcome**\n\nThe economics of the Proof House contracts hold up well. Across the Economic Security, Invariant and Flow Gap guides I found one medium defect and one informational view divergence. No loss-of-funds path was found, so no finding carries a proof file.\n\n**Findings written to `.imd-findings.json`**\n\n1. **Medium.** The holders-first window on the edition sale can be bypassed by anyone who borrows IMD for a single call. The token leg of the gate is a `balanceOf` read at call time, and IMD is a tradeable ERC-20 with a live Uniswap v4 pool whose flash accounting lends it at no fee. A wallet holding no IMD before or after the transaction buys inside the window. The seat and member legs are unaffected. The scratch test confirms both the direct refusal and the borrowed-balance success.\n\n2. **Info.** The `allowanceOf` view reports purchasable editions while the write path refuses them, both for non-holders inside the window and while the curator has the sale closed. Confirmed by a second scratch test.\n\n**Coverage**\n\nAll 116 listed entry points have a row. Three are marked `finding` (the two buy functions and the gate setter), the rest `holds` after tracing checks, state changes and failure paths. I also recorded four conservation invariants I traced: ledger balances, piece escrow balance, factory live requests versus sold and assigned, and the auction balance. Self-brokering by pass holders and the burn of unearned broker shares were checked and match the README's stated design, so they are not reported.\n\n**Verification notes**\n\nThe full via-ir build of the suite exceeded the background time limit, so I compiled only `src` plus my scratch directory by setting the test directory through an environment variable. Both scratch tests pass on this code, which is the expected outcome for these reproductions. The protected floor tests and the launch manifest were read and are consistent with the constructors' parameter order.","treeHash":null,"usage":{"cachedInputTokens":3887379,"inputTokens":646,"model":"claude-fable-5-1","outputTokens":58247,"runtime":"claude","turns":50,"wallClockMs":1195374}},{"artifacts":[],"attempt":3,"bundleHash":"145435a0146f47c6e50641bbd454d27de7269da6b2504f6599e0d60baa13a3df","device":"759c614fdc84ff66","findings":[],"hash":"cb1c3505f5222206891e78f59210f7941af4e4933264063eaf58a928f1720998","nodeId":"94b538ed-9fb6-4444-8283-698331944ad9","outcome":"completed","summary":"I kept `launch.json` at **7 contracts, not the 8 the brief lists**, because 8 can't be deployed on mainnet. I only rewrote its `notes`; no source, test or config file changed. I could not run `forge build` or `forge test` here: the full build was still compiling after more than 20 minutes, so I stopped it to leave time for submission.\n\n**Why ArtifactsPiece is left out.** The work already accepted into this tree answers audit finding `180a7e1d59e1`. All 8 contracts in one launch transaction need about 20.9M gas. Since Fusaka (EIP-7825), Ethereum mainnet refuses any transaction over 2^24 (16,777,216) gas. The brief's own figure of about 19M is also over that cap. So that tree already took ArtifactsPiece out of the launch, and the other 7 measured about 15.2M. Putting it back would give a launch that can't be included at any gas price. It also wouldn't fit the contracts: ArtifactsFactory and ArtifactsSource now take two constructor arguments and no longer take the piece.\n\n**The manifest, in dependency order:**\n\n| Contract | Constructor arguments |\n|---|---|\n| ArtStorage | `$owner` |\n| ArtHouse | `$owner`, `$contract:ArtStorage`, IMD `0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7` |\n| KeyProof | none |\n| ArtifactsFactory | `$owner`, `$contract:ArtHouse` |\n| ArtifactsSource | `$owner`, `$contract:ArtHouse` |\n| BrokerPass | seats `0x0000ec93127baa929e58e97dd0095a2bfb38ec1d`, `$contract:ArtifactsFactory`, `$contract:ArtifactsSource` |\n| SubmissionReviews | `$contract:ArtHouse`, seats, `$contract:ArtifactsFactory`, `$contract:ArtifactsSource` |\n\nEach argument list matches its constructor in the source. Every owner argument is `$owner`; KeyProof, BrokerPass and SubmissionReviews have no owner. The file has only `kind`, `contracts` and `notes`, the notes are 2,284 characters, and it parses as valid JSON.\n\n**What changed in `notes`:** they now name the finding, the 8-versus-7 numbers and the cap. They explain that the factory and source each get the piece once through the owner-only `setPieceImplementation`, and that no sale can open before that. They say the curator deploys ArtifactsPiece afterwards from `launch.piece.json`, using the launched KeyProof, and should compare its runtime with a build of this commit first. They also list the steps the owner takes after launch.\n\n**Checks:**\n- **Build:** `forge build` was stopped while still compiling, so no result. This project builds with via-IR, which is slow.\n- **Tests:** `forge test` was not run.\n- **Gas measurements:** the 20.9M and 15.2M figures come from the earlier accepted work's notes and `test/LaunchGasCap.t.sol`; I did not re-measure them in this run.\n\n**Your decision:** this departs from the brief's 8-contract list. ArtifactsPiece is no longer covered by the launch's attestation, so it needs your runtime comparison before it is connected.","treeHash":"37e6462f7b0c1d1e6ed05ac439f0948e86643dc1","usage":{"cachedInputTokens":497836,"inputTokens":24,"model":"claude-opus-5-5","outputTokens":6867,"runtime":"claude","turns":12,"wallClockMs":1172700}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"60ffae3cc413a0c6","findings":[{"citation":"resolved","description":"setVRFCallbackGas accepts any value in [VRF_CALLBACK_GAS_MIN, VRF_CALLBACK_GAS_MAX] and the lower bound is described as what a draw costs before Glamsterdam. On the current EVM (cancun, which foundry.toml pins) one _assign writes six fresh storage slots (_pool[idx], requestEdition, editionBuyer, editionAssignedAt, the _editionsOf length and element) plus assigned and lastAnsweredBlock, reads seven cold slots and emits an event: the project's own fork test (test/fork/VrfFork.t.sol line 31) measured about 176k per draw, and the scratch run below measured 216,317 gas for a buyer's first draw and 174,812 for a later one, against a minimum of 150,000. Every value from 150,000 up to about 175,000 fails for every draw, and values up to about 216,000 fail for each buyer's first draw. A limit in the accepted range therefore guarantees that every rawFulfillRandomWords call the coordinator makes runs out of gas: the coordinator deletes the commitment (the LINK/ETH for the request is still charged to the subscription), nothing is assigned, and every edition must be re-requested (rerequestRandomness) after the curator raises the limit. Only the curator can set it, it can only be lowered before the sale opens, and it is recoverable by raising it, so impact is a stuck-until-fixed sale plus wasted subscription funds; but the bound exists precisely to stop a value that cannot work, and it does not.","line":20,"path":"src/ArtifactsFactory.sol","reproduction":"1. Curator: setPiece for 1..255, lock(), configureVRF(...), setVRFCallbackGas(150_000) (accepted: equals VRF_CALLBACK_GAS_MIN), setPrice(1 ether), setSaleOpen(true). 2. alice: buy{value: 1 ether}(address(0)) -> requestId R. 3. Coordinator delivers rawFulfillRandomWords(R, [word]) with exactly 150_000 gas (what callbackGasLimit tells it to give). Expected: the edition is assigned. Actual: the callback runs out of gas and reverts, assigned() stays 0, requestEdition(R) stays 0; the coordinator has consumed the request, so the only way forward is rerequestRandomness(R) after setVRFCallbackGas is raised. See test/scratch/CallbackGas.t.sol (measures the first and second draw's gas against the minimum).","severity":"low","snippet":"    uint32 public constant VRF_CALLBACK_GAS_MIN = 150_000;","title":"VRF_CALLBACK_GAS_MIN (150k) is below what one draw's callback needs, so an allowed setting makes every Chainlink answer fail"}],"hash":"d0721f823a54aafdd1854abd83c3182f17a251c10a43d9029ce6dd36b724060d","nodeId":"477bb577-bb6a-4e86-9e1e-6b51908137c3","outcome":"completed","summary":"The review is complete. The findings file is valid JSON with 1 finding and 115 coverage rows (all 112 listed entry points plus 3 invariants). No tracked file was changed; the scratch test lives under test/scratch/ and the working tree is clean.\n\n**Result: the math holds.** I traced every division, split, cast and time boundary in the eight launch contracts against the Pashov Math Precision, Boundary and Numerical Gap guides and found one low-severity defect.\n\n**Finding (low):** `VRF_CALLBACK_GAS_MIN` in src/ArtifactsFactory.sol is below what one draw's callback actually costs. The bound exists to reject a limit that cannot work, but it admits one. Measured with the scratch test on the pinned cancun EVM:\n\n| Case | Gas |\n|---|---|\n| Allowed minimum | 150,000 |\n| A buyer's first draw | 216,317 |\n| A later draw | 174,812 |\n\nWith the limit set to 150k (owner-only, before the sale opens), every Chainlink answer runs out of gas, nothing is assigned, the subscription still pays for each request, and every edition needs a re-request after the owner raises the limit. Recoverable, so low.\n\n**Verified as holding, with concrete values:**\n- ArtHouse splits conserve value exactly: the house share absorbs the rounding, the artist takes it when houseBps is 0, and the four-way sum is checked in uint256 so uint16 wrap cannot pass.\n- The auction's 5% raise rounds up, so a 1 wei high bid needs 2 wei; the extension subtraction cannot underflow because bids require now < endTime.\n- The Fisher-Yates draw never divides by zero: a pending request guarantees at least one unassigned edition, and swap-with-last draws each edition once.\n- Escrow exits (cancel, refund, fake-key proof, release) each pay out exactly what was paid in; the cancel and TooLate boundaries at paidAt + 24h are exact complements.\n- KeyProof's Chaum-Pedersen checks via ecrecover are sound: all x-coordinates are bounded below n, challenge zero is refused, and the point-addition rejects equal x.\n- 122 of the project's own split, auction, escrow and edge tests pass on this build.\n\n**Not reached in depth:** the randomness-ordering interplay where a Chainlink answer for a different request lands after a fallback draw's target block, which shifts the fallback result. It is outside the math area and requires Chainlink to be dead for three days and then revive, so I left it as an unreported lead rather than a finding.","treeHash":null,"usage":{"cachedInputTokens":2911064,"inputTokens":548,"model":"claude-fable-5-1","outputTokens":51655,"runtime":"claude","turns":51,"wallClockMs":1129139}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3a720671678111bc","findings":[{"citation":"resolved","description":"postEscrowKey (src/ArtifactsPiece.sol:234-246) checks the caller, that a buyer exists, that no key is posted, the knowsWrap proof and the deposit, but has no deadline. cancel() (src/ArtifactsPiece.sol:278-290) lets the buyer take the payment back as soon as block.timestamp >= paidAt + SELLER_WINDOW (24 h) while no key is posted. So from hour 24 on, both actions are open at once. The wrapped key travels as public calldata of the seller's postEscrowKey transaction; the NatSpec on cancel() and the README state exactly this hazard ('a key in a pending transaction is readable, and a buyer could take it and cancel ahead of it') as the reason for the 24-hour window, but the window only protects posts made inside it. A seller who posts at hour 24 or later (a slow seller, a different time zone, a tool that retried) is exposed: the buyer reads the pending calldata, sends cancel() with a higher priority fee, cancel() lands first (e.buyer = 0), the seller's post reverts NoEscrowBuyer and the deposit is returned by the revert, the buyer withdraws the full price, and the buyer now holds the piece's one and only content key K (unwrappable with the viewing key they chose in buy()) without owning the piece or having paid. For an ARTIFACTS edition K is the asset: the encrypted art is rendered only by whoever has it, and a leaked K can never be rotated (the ciphertext and commitment are locked). The seller keeps the token and the listing but has lost the exclusivity every later buyer pays for. Nothing in the contract or in the escrow events tells the seller that posting after the window is unsafe. Fix (minimal, preserves the agreed design): refuse a post once the buyer may cancel, e.g. in postEscrowKey after the KeyAlreadyPosted check add `if (block.timestamp >= e.paidAt + SELLER_WINDOW) revert TooEarly();` (or a new TooLate error), so the key and the cancellable payment are never open together; a seller who missed the window calls refundBuyer() and the buyer buys again. The attached proof was run with exactly that one-line change: it passes, and the fixed runtime still deploys as a runtime copy (the piece is 24,385 bytes, 191 under EIP-170, so any fix must stay small; this one did). Alternative with a larger scope change: make cancel() two-step (announce, then execute one block later) so a key posted before the announcement always lands. Test coverage: no unit test posts a key after SELLER_WINDOW. The escrow invariant handler (test/invariants/PieceEscrowInvariant.t.sol:109-135, postKey) treats a post as legitimate whenever the caller is the seller, a buyer exists and no key is posted, with no time condition, so it encodes the current behaviour as expected and only checks ETH conservation, which does hold; the race is invisible to it. After the fix, that handler's `ok` predicate needs `&& block.timestamp < paidAt + piece.SELLER_WINDOW()` to match.","line":234,"path":"src/ArtifactsPiece.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test, Vm} from \"forge-std/Test.sol\";\nimport {ArtifactsPiece} from \"src/ArtifactsPiece.sol\";\nimport {KeyProof} from \"src/KeyProof.sol\";\nimport {Clones} from \"src/libs/Clones.sol\";\nimport {Traits} from \"src/interfaces/Interfaces.sol\";\n\n/// @notice ArtifactsPiece.postEscrowKey has no deadline. Once SELLER_WINDOW (24 h) has passed since the buyer paid,\n/// the buyer may cancel() at any moment, yet the seller may still post the key. A key in a pending postEscrowKey\n/// transaction is public calldata: a buyer who watches the mempool reads it, front-runs with cancel(), takes the\n/// refund and keeps the content key K without ever paying. The contract permits the unsafe state (a postable key and\n/// a cancellable payment at the same time). Expected: once the buyer can cancel, the seller can no longer post, so\n/// posting the key and cancelling the payment are never both open at once.\n///\n/// Fails on the current code (the late post succeeds); passes once postEscrowKey refuses a post at or after\n/// paidAt + SELLER_WINDOW (the seller then refunds and relists, or the buyer buys again).\ncontract Proof_LateKeyPost is Test {\n    uint256 internal constant N = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141;\n    // x of the secp256k1 generator: a valid version-2 viewing key (buyer's B)\n    bytes32 internal constant VIEWING_KEY = 0x79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798;\n\n    KeyProof internal keyProof;\n    ArtifactsPiece internal piece;\n    address internal seller = makeAddr(\"seller\");\n    address internal buyer = makeAddr(\"buyer\");\n\n    function setUp() public {\n        keyProof = new KeyProof();\n        ArtifactsPiece impl = new ArtifactsPiece(address(keyProof));\n        // this test contract plays the controller (ArtifactsFactory) and deploys the piece exactly as claim() does\n        piece = ArtifactsPiece(Clones.copyCode(address(impl)));\n        piece.initialize(\n            address(this),\n            address(0xBEEF),\n            7,\n            seller,\n            Traits({title: \"T\", palette: \"P\", colourCount: 3, direction: \"D\"}),\n            address(0),\n            keccak256(\"some content key\"),\n            \"\",\n            false,\n            bytes32(0)\n        );\n        vm.deal(seller, 10 ether);\n        vm.deal(buyer, 10 ether);\n    }\n\n    /// @dev A seller's wrapped key and its Schnorr proof (KeyProof.knowsWrap) for the current sale, as the seller's\n    /// tool makes them: E = e*G with even y, R = k*G given as its address, z = k + c*e mod n.\n    function _sellerKey() internal returns (bytes memory wrapped, address r, uint256 z) {\n        uint256 e = uint256(keccak256(\"seller ephemeral e\")) % N;\n        Vm.Wallet memory E = vm.createWallet(e);\n        if (E.publicKeyY & 1 == 1) {\n            e = N - e;\n            E = vm.createWallet(e);\n        }\n        wrapped = abi.encodePacked(bytes1(0x02), bytes32(E.publicKeyX), keccak256(\"masked key\"));\n        uint256 k = uint256(keccak256(\"schnorr nonce k\")) % N;\n        r = vm.addr(k);\n        // the challenge binds the piece (KeyProof's msg.sender when the piece checks the proof) and the buyer's key\n        uint256 c = uint256(\n            keccak256(\n                abi.encodePacked(\n                    \"Proof House key wrap v2 proof\",\n                    block.chainid,\n                    address(piece),\n                    buyer,\n                    VIEWING_KEY,\n                    keccak256(wrapped),\n                    r\n                )\n            )\n        ) % N;\n        z = addmod(k, mulmod(c, e, N), N);\n    }\n\n    function test_keyCannotBePostedOnceTheBuyerMayCancel() public {\n        vm.prank(seller);\n        piece.list(1 ether);\n        vm.prank(buyer);\n        piece.buy{value: 1 ether}(VIEWING_KEY, address(0));\n\n        // The seller's window is over: from here the buyer may cancel() at any moment.\n        vm.warp(block.timestamp + piece.SELLER_WINDOW() + 1);\n\n        (bytes memory wrapped, address r, uint256 z) = _sellerKey();\n        // sanity: the buyer could indeed cancel right now (checked on a snapshot, then rolled back)\n        uint256 snap = vm.snapshotState();\n        vm.prank(buyer);\n        piece.cancel();\n        vm.revertToState(snap);\n\n        // Expected: a key can no longer be posted while the payment can be cancelled from under it.\n        // Actual on the current code: the post succeeds, and a mempool-watching buyer front-runs it with cancel(),\n        // keeping the key K it reads from the pending calldata without paying.\n        uint256 deposit = piece.depositFor(1 ether);\n        vm.prank(seller);\n        vm.expectRevert();\n        piece.postEscrowKey{value: deposit}(wrapped, r, z);\n    }\n}","reproduction":"State: a claimed ArtifactsPiece (edition or THE SOURCE) owned by S. 1) S: list(1 ether). 2) B: buy{value: 1 ether}(viewingKey = a valid version-2 key, broker = 0) at time t0. 3) Nobody acts for 24 hours. 4) At t0 + 24h + 1, S broadcasts postEscrowKey{value: 0.1 ether}(wrapped, r, z) with a wrapped key that opens the piece (as the seller's tool makes it). 5) B sees the pending transaction, decrypts K from `wrapped` with the viewing key from step 2, and broadcasts cancel() with a higher priority fee. Expected: once the buyer is able to cancel, the seller's key can no longer be posted (postEscrowKey reverts), so steps 4 and 5 can never both be live. Actual on this code: cancel() succeeds first (B's 1 ether goes to pendingWithdrawals[B], e.buyer = 0), S's postEscrowKey reverts NoEscrowBuyer (its calldata, including K wrapped to B's key, is already public), B withdraws 1 ether and keeps K, S keeps the token with a key that is no longer secret. Deterministic Foundry check of the same state (test/scratch/Proof_LateKeyPost.t.sol): after warp(t0 + SELLER_WINDOW + 1), cancel() succeeds on a snapshot and, rolled back, postEscrowKey with a valid knowsWrap proof succeeds (emits EscrowKeyPosted) instead of reverting; the test's vm.expectRevert fails with 'next call did not revert as expected'. With the one-line deadline in postEscrowKey the test passes.","severity":"medium","snippet":"    function postEscrowKey(bytes calldata wrapped, address r, uint256 z) external payable {","title":"Resale escrow: the seller may still post the key after SELLER_WINDOW, when the buyer can already cancel(); a mempool-watching buyer front-runs the post, takes the refund and keeps the content key for "}],"hash":"d67254d676bce6873408c1061c73c055a3abf020a0a5b0c845ea7d91d50b8023","nodeId":"35463145-fed9-40f2-b251-3901f2b8c6fe","outcome":"completed","summary":"Finding recorded and the tracked tree is unchanged. Wrapping up with the report.\n\n**Outcome:** one medium finding, with a Foundry proof that fails on this commit and passes with a one-line fix. Nothing else reproduced. No tracked file was changed; `.imd-findings.json` holds the finding and `test/scratch/Proof_LateKeyPost.t.sol` holds the proof.\n\n**The finding (medium, `src/ArtifactsPiece.sol:234`, `postEscrowKey`).** The resale escrow lets the buyer `cancel()` once 24 hours have passed since paying, but `postEscrowKey` has no deadline. From hour 24 on, both are open at once. A seller who posts the key then exposes it as public calldata, and a mempool-watching buyer front-runs with `cancel()`, withdraws the full price, and keeps the piece's only content key without paying. The key cannot be rotated, so the piece's exclusivity is gone for good. The README cites this exact hazard as the reason for the window, but the window only protects posts made inside it. Fix: refuse a post at or after `paidAt + SELLER_WINDOW`. I verified the proof flips with that one line, that the fixed runtime still fits EIP-170 as a runtime copy, and that the escrow invariant handler must gain the same time condition.\n\n**What was read in full:** all eight launched contracts, plus `ArtCollection`, the four base contracts, the four libraries, the interfaces, `launch.json`, the README and ADAPTATION.md, the two protected tests, and the test fixture and escrow invariant handler. `ImdBuybackBurner` is outside this launch and was only skimmed for its surface. Nothing in scope was unreachable.\n\n**Checks run.** `forge build --skip test` passes in 40 seconds. The proof fails on this code and passes with the fix. A PUSH-skipping scan of every launched runtime found no DELEGATECALL, CALLCODE or SELFDESTRUCT, and every runtime is under 24,576 bytes. The manifest has only the schema keys, eight unique names, one argument per constructor parameter in order, and 1,260 characters of notes.\n\n**Not reported, and why.** Self-brokering, the spot-balance holders gate, owner configuration after deployment, and the set-once setters were all raised and dispositioned in earlier rounds as stated design. The VRF and fallback-draw rules, the Chaum-Pedersen and Schnorr checks in KeyProof, the Fisher-Yates assignment, the ledger's split and conservation, and the escrow's fund accounting all held up under the scenarios I traced. The full test suite was not re-run here because compiling it exceeded the ten-minute command limit on this machine.","treeHash":null,"usage":{"cachedInputTokens":2992860,"inputTokens":674,"model":"claude-fable-5-1","outputTokens":57802,"runtime":"claude","turns":33,"wallClockMs":1384665}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"4dd67dae195771b6","findings":[{"citation":"resolved","description":"ArtifactsFactory.buy/buyMany (_tokenGate, src/ArtifactsFactory.sol:346-348) and ArtifactsSource.bid (src/ArtifactsSource.sol:189) decide eligibility in the holders window from HolderGate.holdsToken, which is one balanceOf read of the gate token (IMD) at the instant of the call. Nothing ties the balance to a block before the sale opened or to holding it after the call returns. A contract that receives gateMinBalance of IMD, calls buy (or bid), and returns the IMD inside the same transaction is a holder for that one read and buys inside the window the brief reserves for holders. With a Uniswap v4 ETH/IMD pool on mainnet this costs one round-trip swap (or a flash loan) and no capital at rest. The window's purpose (holders first) is not enforced; no funds are lost or misrouted, so this is low. The brief asked for a balance gate, so this is a limitation of the chosen design; if the window is meant to be exclusive, gate on a balance recorded before saleOpenedAt (a snapshot or a balance read at an earlier block through a snapshot token) or require the wallet to be an EOA/seat holder. Same-call reentrancy is not involved: the attacker contract is the buyer itself.","line":78,"path":"src/base/HolderGate.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {ArtStorage} from \"src/ArtStorage.sol\";\nimport {ArtHouse} from \"src/ArtHouse.sol\";\nimport {KeyProof} from \"src/KeyProof.sol\";\nimport {ArtifactsPiece} from \"src/ArtifactsPiece.sol\";\nimport {ArtifactsFactory} from \"src/ArtifactsFactory.sol\";\nimport {HolderGate} from \"src/base/HolderGate.sol\";\nimport {IVRFCoordinatorV2Plus, Traits} from \"src/interfaces/Interfaces.sol\";\n\ncontract Token {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function mint(address to, uint256 amount) external {\n        balanceOf[to] += amount;\n    }\n\n    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n\n    function transferFrom(address from, address to, uint256 amount) external returns (bool) {\n        allowance[from][msg.sender] -= amount;\n        balanceOf[from] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\ncontract Vrf {\n    uint256 public nextId = 1;\n\n    function requestRandomWords(IVRFCoordinatorV2Plus.RandomWordsRequest calldata) external returns (uint256) {\n        return nextId++;\n    }\n}\n\n/// @dev A lender that hands out tokens for the duration of one call and takes them back (a flash loan).\ncontract Lender {\n    Token public token;\n\n    constructor(Token t) {\n        token = t;\n    }\n\n    function flash(address borrower, uint256 amount, bytes calldata data) external {\n        uint256 before = token.balanceOf(address(this));\n        token.transfer(borrower, amount);\n        (bool ok,) = borrower.call(data);\n        require(ok, \"borrower failed\");\n        require(token.balanceOf(address(this)) == before, \"not repaid\");\n    }\n}\n\ncontract Borrower {\n    ArtifactsFactory public factory;\n    Token public token;\n    Lender public lender;\n\n    constructor(ArtifactsFactory f, Token t, Lender l) {\n        factory = f;\n        token = t;\n        lender = l;\n    }\n\n    receive() external payable {}\n\n    function attack() external {\n        lender.flash(address(this), 100e18, abi.encodeCall(this.onFlash, ()));\n    }\n\n    function onFlash() external {\n        factory.buy{value: factory.price()}(address(0));\n        token.transfer(address(lender), 100e18);\n    }\n}\n\ncontract GateSnapshotTest is Test {\n    address curator = makeAddr(\"curator\");\n    address artist = makeAddr(\"artist\");\n    Token token;\n    ArtifactsFactory factory;\n\n    function setUp() public {\n        token = new Token();\n        Vrf vrf = new Vrf();\n        ArtStorage store = new ArtStorage(curator);\n        ArtHouse house = new ArtHouse(curator, address(store), address(token));\n        KeyProof kp = new KeyProof();\n        ArtifactsPiece impl = new ArtifactsPiece(address(kp));\n        factory = new ArtifactsFactory(curator, address(house), address(impl));\n        vm.startPrank(curator);\n        house.approveArtist(artist, \"A\");\n        house.setSaleModule(address(factory), true);\n        house.registerModuleCollection(address(factory), artist);\n        factory.configureVRF(address(vrf), bytes32(uint256(1)), 1, false);\n        for (uint256 i = 1; i <= 255; ++i) {\n            factory.setPiece(i, Traits(\"t\", \"p\", 1, \"d\"), hex\"01\", bytes32(uint256(i)));\n        }\n        factory.lock();\n        factory.setPrice(1 ether);\n        // holders first: 100 IMD for one hour\n        factory.setGate(address(0), address(token), 100e18, 1 hours);\n        factory.setSaleOpen(true);\n        vm.stopPrank();\n    }\n\n    function test_gateIsOnlyASnapshot() public {\n        Lender lender = new Lender(token);\n        token.mint(address(lender), 100e18);\n        Borrower b = new Borrower(factory, token, lender);\n        vm.deal(address(b), 10 ether);\n\n        // not a holder: refused in the window\n        vm.prank(address(b));\n        vm.expectRevert(HolderGate.NotEligible.selector);\n        factory.buy{value: 1 ether}(address(0));\n\n        // the same wallet, holding the tokens for one call only, must still be refused in the window:\n        // on the code as it is, the flash-held balance passes holdsToken and the purchase goes through\n        vm.expectRevert();\n        b.attack();\n        assertEq(factory.mintedBy(address(b)), 0, \"a non-holder bought inside the holders window\");\n        assertEq(token.balanceOf(address(b)), 0);\n    }\n}","reproduction":"State: factory locked, price 1 ether, VRF configured, setGate(address(0), IMD, 100e18, 1 hours), setSaleOpen(true), block.timestamp inside the first hour. Wallet B (a contract) holds 0 IMD. (1) B calls factory.buy{value: 1 ether}(address(0)) -> reverts HolderGate.NotEligible, as intended. (2) B asks a lender for 100e18 IMD, and in the lender's callback calls factory.buy{value: 1 ether}(address(0)) then transfers the 100e18 back; the lender checks it was repaid. Expected: the purchase in step 2 is refused like step 1 (B is not a holder). Actual: it succeeds: factory.mintedBy(B) == 1, factory.sold() == 1, B's IMD balance is 0 afterwards. The attached test (test/scratch/GateSnapshot.sol) expects the flash purchase to revert and fails on this code with 'next call did not revert as expected'.","severity":"low","snippet":"    function holdsToken(address account) public view returns (bool) {\n        address t = gateToken;\n        if (t == address(0)) return false;\n        (bool ok, uint256 b) = _readWord(t, abi.encodeCall(IBalanceOf.balanceOf, (account)));\n        return ok && b >= gateMinBalance;\n    }","title":"Holders window is a same-call balance snapshot: a wallet holding the gate token only for the duration of its own call (flash loan, or buy-then-sell on the ETH/IMD pool in one transaction) buys and bid"},{"citation":"resolved","description":"ArtifactsSource.setAuction refuses to open unless house.canRecordSale(address(this)) (src/ArtifactsSource.sol:153), so a winning bid can always settle. ArtifactsFactory.setSaleOpen has no such check: it only needs locked, price and a coordinator. The first setSaleOpen(true) sets saleOpenedAt once and forever (line 209); from that moment the holders window (_inGate(saleOpenedAt)), the mint phases (currentPhase) and the locks on configureVRF, setGate, setMemberGate and setMintPhases (all 'if (saleOpenedAt != 0) revert') are in force. If the curator opens before house.setSaleModule(factory, true) and house.registerModuleCollection(factory, artist) (both post-deployment steps in launch.json's notes), every _buy reaches house.recordSale and reverts there with NotSaleModule or NotModuleCollection (src/ArtHouse.sol:463-465), so nobody can buy, while the holders window and phase 1 keep counting down and cannot be restarted. Closing and reopening does not reset saleOpenedAt. Impact: a mis-ordered launch burns the holders-first window and the per-wallet phase caps (phase 1 may already be over when the first purchase is possible), the guarantees the gate and phases exist for. No funds are at risk, so low; the fix is the same one-line precondition setAuction already has.","line":203,"path":"src/ArtifactsFactory.sol","reproduction":"Fresh deployment; curator: factory.setPiece for 1..255, lock(), setPrice(1 ether), configureVRF(coordinator, keyHash, subId, false), setGate(seats, IMD, 100e18, 1 hours), setMintPhases(1 hours, 1, 0, 0), setSaleOpen(true) -- without having called house.setSaleModule(factory, true) / house.registerModuleCollection(factory, artist). A seat holder calls factory.buyWithSeat{value: 1 ether}(seatId, 1, address(0)). Expected (per setAuction's rule): the sale cannot open in this state, or the buy succeeds. Actual: setSaleOpen(true) succeeds and sets saleOpenedAt; the buy reverts inside house.recordSale with ArtHouse.NotSaleModule (NotModuleCollection once the module is approved but the collection is not registered). After 1 hour the curator registers the module and collection: gateEndsAt() has passed and currentPhase() returns (MAX_PER_WALLET, 0): the holders window and phase 1 elapsed with zero purchases possible, and setGate/setMintPhases now revert SaleIsOpen so they cannot be re-run.","severity":"low","snippet":"    function setSaleOpen(bool open) external onlyOwner {\n        if (open) {\n            if (saleEnded) revert SaleOver();\n            if (!locked) revert NotLocked();\n            if (price == 0) revert WrongPrice();\n            if (address(vrfCoordinator) == address(0)) revert VRFNotConfigured();\n            if (saleOpenedAt == 0) saleOpenedAt = uint64(block.timestamp);\n        }\n        saleOpen = open;\n        emit SaleOpenSet(open);\n    }","title":"ArtifactsFactory.setSaleOpen(true) starts the holders window, mint phases and the VRF/gate lock without checking the ledger can record its sales, unlike ArtifactsSource.setAuction; every buy then reve"},{"citation":"resolved","description":"rawFulfillRandomWords accepts an answer for a request whose fallback draw has started while block.number <= fallbackBlock[requestId] (only a later answer is refused). _assign records the edition but nothing clears fallbackBlock[requestId] or fallbackInFlight. finishFallbackDraw(requestId) afterwards deletes both and then calls _assign, which reverts AlreadyFulfilled, so the deletes are rolled back and both slots keep their stale values permanently. rerequestRandomness cannot clear them either (AlreadyFulfilled). Nothing else breaks: _fallbackLive(requestId) is false because requestEdition[requestId] != 0, so startFallbackDraw for other requests passes the FallbackBusy check and overwrites fallbackInFlight. Recorded as info because it is a reporting defect (fallbackInFlight()/fallbackBlock() say a draw is pending when it is done), not a loss or a stuck edition.","line":423,"path":"src/ArtifactsFactory.sol","reproduction":"Buyer buys one edition (request R at block P). At block B >= P + 21_600 with Chainlink silent for 21_600 blocks, anyone calls startFallbackDraw(R): fallbackBlock[R] = B + 5, fallbackInFlight = R. At block B + 2 the coordinator calls rawFulfillRandomWords(R, [w]): accepted, requestEdition[R] = e. At block B + 6 anyone calls finishFallbackDraw(R). Expected: the stale draw is cleared (or was cleared when the answer landed). Actual: it reverts AlreadyFulfilled, and fallbackBlock(R) == B + 5 and fallbackInFlight() == R remain forever.","severity":"info","snippet":"        uint256 target = fallbackBlock[requestId];\n        if (target != 0 && block.number > target) revert FallbackPending();\n        _assign(requestId, randomWords[0]);\n        lastAnsweredBlock = block.number;","title":"A Chainlink answer that lands inside a started fallback draw's window leaves fallbackBlock[requestId] and fallbackInFlight set forever (finishFallbackDraw then reverts AlreadyFulfilled); harmless to o"}],"hash":"e2f97d67ce1532e8abb282e44ddff1a66b490b3c4c46e52d5e564b1c5daec548","nodeId":"b1f1a5ed-e2fe-46d7-aed1-32dfdc945c5b","outcome":"completed","summary":"The review is complete. Findings are in `.imd-findings.json` at the repository root, with the scratch proof under `test/scratch/`, and no contract or configuration file was changed.\n\n**What I covered.** All contracts in the launch set plus `ImdBuybackBurner`, against the Execution Trace, Periphery and First Principles guides: every state-changing entry point the verifier listed has a coverage row (109 hold, 5 point at findings, 1 unreached). I traced the escrow state machine in `ArtifactsPiece` (list, buy, key, cancel, refund, fake-key proof, release, plain transfers, reveal), the VRF and fallback-draw machine in `ArtifactsFactory`, the auction in `ArtifactsSource`, the ledger splits and payouts in `ArtHouse`, the runtime-copy deployment, SSTORE2 and base64 encoders, and the manifest against each constructor. ETH conservation holds in the ledger and in every escrow outcome. The deployed runtime sizes are all under the EIP-170 limit.\n\n**Findings.**\n- **Low, with a failing Foundry proof.** The holders window is a same-call balance snapshot. A wallet that holds the gate token only for the duration of its own call (a flash loan, or a buy-then-sell on the ETH/IMD pool in one transaction) passes `holdsToken` and buys or bids inside the holders-first window. The scratch test shows a wallet refused with `NotEligible`, then buying successfully with a borrowed balance that is gone by the end of the transaction. No funds are lost. This is a limitation of the balance gate the brief asked for, so the author may accept it or snapshot balances before the sale opens.\n- **Low.** `ArtifactsFactory.setSaleOpen` has no `house.canRecordSale` precondition, unlike `ArtifactsSource.setAuction`. If the curator opens the editions sale before registering the factory as a sale module and module collection, every purchase reverts in the ledger while the holders window and mint phases, which start from the one-time `saleOpenedAt`, run down and cannot be restarted.\n- **Info.** A Chainlink answer that lands inside a started fallback draw's five-block window leaves `fallbackBlock` and `fallbackInFlight` set forever. Other draws are unaffected because the liveness check reads the assigned edition, so this is a reporting defect only.\n\n**Not verified.** I did not re-run the existing 259-test suite: compiling the full test tree with via-IR exceeded the ten-minute command limit on this machine, so I compiled sources alone and ran the scratch test with other tests skipped. I did not re-derive the secp256k1 arithmetic in `KeyProof`, only the escrow control flow around it. The identity.md seat address in `launch.json` could not be checked against mainnet from here.\n\n**Changes required by the findings.** None of the three findings requires a change before deployment. The second is a one-line precondition the author may want to add for symmetry with the auction, which would change the factory's runtime hash.","treeHash":null,"usage":{"cachedInputTokens":1951291,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":61149,"runtime":"claude","turns":33,"wallClockMs":1512001}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"0ef0dfae5a05e4be","findings":[],"hash":"f03e606f85acd992fd69dbb3f8ef9668635a2af3810b3d6564d808ee4fcd8d33","nodeId":"94b538ed-9fb6-4444-8283-698331944ad9","outcome":"failed","summary":"could not restore accepted work: accepted work conflicts with a dependency that changed the same files after it was accepted: Command failed: git -c user.name=IdentityMD Worker -c user.email=worker@identitymd.invalid merge --no-edit -m imd: reapply this node's accepted work 6474b1b0b78f8381778b89c232918e6f9501637b\n","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"claude","turns":0,"wallClockMs":2739}}],"verification":[{"checks":[{"durationMs":439750,"exitCode":0,"name":"build","output":"Compiling 78 files with Solc 0.8.26\nSolc 0.8.26 finished in 439.62s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> test/invariants/ArtHouseInvariant.t.sol:105:9:\n    |\n105 |         address buyer,\n    |         ^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":9710,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/BurnerFork.t.sol:BurnerForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 438.16µs (0.00ns CPU time)\n\nRan 5 tests for test/audit/KeyProofEdges.t.sol:KeyProofEdgesTest\n[PASS] test_adversarialE_isProvable() (gas: 107849)\n[PASS] test_adversarialE_proofIsActuallyChecked() (gas: 23615)\n[PASS] test_negatedSCannotFrame() (gas: 60700)\n[PASS] test_oddYWrapThatOpensIsNotFake() (gas: 37558)\n[PASS] test_xEqualsN_isMalformed() (gas: 13218)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.86ms (2.50ms CPU time)\n\nRan 6 tests for test/EscrowDeadline.t.sol:SourceEscrowDeadlineTest\n[PASS] testFuzz_postAfterDeadlineReverts(uint32) (runs: 64, μ: 367037, ~: 367037)\n[PASS] test_cancelledSaleCanBeBoughtAgain() (gas: 820699)\n[PASS] test_expiredSaleCanBeRefundedAndBoughtAgain() (gas: 940459)\n[PASS] test_postAtCancellationDeadlineReverts() (gas: 366895)\n[PASS] test_postJustBeforeDeadlinePreventsCancellation() (gas: 702323)\n[PASS] test_postOneSecondAfterDeadlineReverts() (gas: 367215)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 23.23ms (20.92ms CPU time)\n\nRan 10 tests for test/Artifacts.t.sol:ArtifactsPieceEscrowTest\n[PASS] test_escrowCancelBeforeKey_andDelist() (gas: 501042)\n[PASS] test_escrowHappyPath_buyerConfirms() (gas: 1181933)\n[PASS] test_escrowKeyMustNotBeEmpty() (gas: 311000)\n[PASS] test_escrowTimeoutRelease() (gas: 729073)\n[PASS] test_pieceViewingKeyZeroRejected() (gas: 168689)\n[PASS] test_plainTransferClearsKey_previousOwnerRekeys() (gas: 506819)\n[PASS] test_reentrancyOnEscrowWithdrawBlocked() (gas: 844317)\n[PASS] test_rewrapIsOneShotAndNonEmpty() (gas: 284134)\n[PASS] test_sellerCannotOverwriteKeyAfterRelease() (gas: 913380)\n[PASS] test_sourceOnlyReveal() (gas: 35552)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 23.77ms (3.81ms CPU time)\n\nRan 5 tests for test/ClaimEnd.t.sol:ClaimEndTest\n[PASS] test_claimMany_claimsEveryOneInOneCall() (gas: 18008525)\n[PASS] test_claimMany_emptyRefused_andTheCuratorCanClaimForBuyers() (gas: 12217339)\n[PASS] test_claimMany_isAllOrNothing() (gas: 18066805)\n[PASS] test_endSale_isFinal() (gas: 6879895)\n[PASS] test_endSale_needsTheSaleToHaveOpened_andWorksWhileClosed() (gas: 96083)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 24.30ms (3.19ms CPU time)\n\nRan 7 tests for test/Burner.t.sol:BurnerTest\n[PASS] test_anyoneBurnsHeldImd() (gas: 169949)\n[PASS] test_anyoneSwapsInSmallStepsAfter60QuietDays() (gas: 845755)\n[PASS] test_constructorChecks() (gas: 8711)\n[PASS] test_editionSaleToBurnedImd() (gas: 61811458)\n[PASS] test_onlyTheCuratorSwaps_withAMinimumAndADeadline() (gas: 653639)\n[PASS] test_onlyThePoolManagerCallsBack() (gas: 32189)\n[PASS] test_theNewOwnerSwapsAfterAHandover() (gas: 304000)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 24.71ms (20.11ms CPU time)\n\nRan 1 test for test/ClaimEnd.t.sol:EndBeforeOpenTest\n[PASS] test_endSale_beforeOpening_refused() (gas: 60691375)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 25.26ms (22.05ms CPU time)\n\nRan 4 tests for test/Phases.t.sol:PhasesTest\n[PASS] test_aSeatFollowsThePhases_whereverItGoes() (gas: 1758420)\n[PASS] test_afterTheWindow_anyoneUpToFive() (gas: 1052975)\n[PASS] test_capsRise_1_then_2_then_5_forAnImdHolder() (gas: 1751735)\n[PASS] test_setOnlyBeforeTheSaleOpens_andChecked() (gas: 333087)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 26.61ms (1.80ms CPU time)\n\nRan 1 test for test/audit/KeyReuseLeak.t.sol:KeyReuseLeakTest\n[PASS] test_copiedE_cantBePosted(uint256,uint256) (runs: 64, μ: 602935, ~: 603084)\nLogs:\n  Bound result 11818044032905497069688431977092257873442291733589656922755808936709498\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 27.25ms (24.74ms CPU time)\n\nRan 8 tests for test/KeyProof.t.sol:KeyProofTest\n[PASS] test_aJunkKeyIsProvenFake() (gas: 369871)\nLogs:\n  gas to check a fake-key proof: 44805\n\n[PASS] test_aKeyThatOpensIsNeverProvenFake() (gas: 368087)\n[PASS] test_aProofOnlyHoldsForItsBuyerPieceAndChain() (gas: 416867)\n[PASS] test_aProofOnlyHoldsForItsOwnWrappedKey() (gas: 416275)\n[PASS] test_aTamperedProofFails() (gas: 768976)\n[PASS] test_madeUpBytesAndTheOldFormatAreFake() (gas: 690806)\n[PASS] test_theRightKeyForSomeoneElseIsProvenFake() (gas: 368314)\n[PASS] test_viewingKeys() (gas: 34725)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 3.91ms (3.31ms CPU time)\n\nRan 4 tests for test/AuditRound3.t.sol:AuditRound3Test\n[PASS] test_aReturnDataBombCostsThePayerNothing() (gas: 694196)\n[PASS] test_aShareThatWaitsInTheLedgerIsAnnounced() (gas: 339941)\n[PASS] test_theArtistsPayoutCantMoveThePieceDuringARelease() (gas: 415877)\n[PASS] test_theArtistsPayoutCantRelistDuringARelease() (gas: 600564)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 28.58ms (934.24µs CPU time)\n\nRan 6 tests for test/Adversarial.t.sol:PieceEdgeTest\n[PASS] test_cancelThenSecondBuyerAndRoyaltyToChangedPayout() (gas: 1088077)\n[PASS] test_listingEdges() (gas: 1003054)\n[PASS] test_releaseAtExactly72HoursByStranger() (gas: 914095)\n[PASS] test_revealNeedsTheSourceLocked_andEmptyRendererURI() (gas: 6214987)\n[PASS] test_safeTransferReceivers() (gas: 670237)\n[PASS] test_transferAuthEdges() (gas: 350213)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 31.26ms (4.86ms CPU time)\n\nRan 18 tests for test/BrokerPass.t.sol:BrokerPassTest\n[PASS] test_capIs100() (gas: 19752778)\n[PASS] test_claimWithPiece_onceEverPerPiece() (gas: 6633588)\n[PASS] test_claimWithSeat_onceEverPerSeat() (gas: 376003)\n[PASS] test_claimWithTheSource() (gas: 5963894)\n[PASS] test_claimsWaitForTheStartTime_setOnceByTheCurator() (gas: 489742)\n[PASS] test_oneClaimPerWallet() (gas: 6934488)\n[PASS] test_passHolderCanBrokerTheirOwnBuy() (gas: 1022234)\n[PASS] test_passHolderEarnsOnMint_andTheRightMovesWithThePass() (gas: 2088098)\n[PASS] test_recordResaleRejectsAnythingButAPiece() (gas: 298286)\n[PASS] test_resaleBrokerShare_creditedInTheLedger() (gas: 7248761)\n[PASS] test_resaleBuyerWithAPassCanBrokerTheirOwnBuy() (gas: 7186065)\n[PASS] test_resaleFallsBackToThePieceWhenTheLedgerRefuses() (gas: 7201166)\n[PASS] test_resaleSellerCannotBeBroker() (gas: 7098605)\n[PASS] test_resaleWithoutEligibleBroker_sellerKeepsTheShare() (gas: 6887763)\n[PASS] test_setBrokerPassOnce() (gas: 64999)\n[PASS] test_sourceSplit_brokerAndArtistOnly() (gas: 6115735)\n[PASS] test_sourceSplit_noBrokerBurns() (gas: 5873176)\n[PASS] test_tokenURIIsOnChainJson() (gas: 388848)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 41.79ms (18.05ms CPU time)\n\nRan 6 tests for test/PieceImplementation.t.sol:PieceImplementationTest\n[PASS] test_auctionCannotOpenWithoutThePieceImplementation() (gas: 583552)\n[PASS] test_reviewsOfReturnsTheTailForAHugeCount() (gas: 858155)\n[PASS] test_saleCannotOpenBeforeTheLedgerRegistersTheFactory() (gas: 59090880)\n[PASS] test_saleCannotOpenWithoutThePieceImplementation() (gas: 58925629)\n[PASS] test_setPieceImplementationOnceAndOnlyByTheOwner() (gas: 294913)\n[PASS] test_vrfCallbackMinimumIsAboveOneDraw() (gas: 61580020)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 45.82ms (43.90ms CPU time)\n\nRan 6 tests for test/EscrowDeadline.t.sol:EditionEscrowDeadlineTest\n[PASS] testFuzz_postAfterDeadlineReverts(uint32) (runs: 64, μ: 367100, ~: 367100)\n[PASS] test_cancelledSaleCanBeBoughtAgain() (gas: 780559)\n[PASS] test_expiredSaleCanBeRefundedAndBoughtAgain() (gas: 900319)\n[PASS] test_postAtCancellationDeadlineReverts() (gas: 366958)\n[PASS] test_postJustBeforeDeadlinePreventsCancellation() (gas: 662150)\n[PASS] test_postOneSecondAfterDeadlineReverts() (gas: 367278)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 59.33ms (31.15ms CPU time)\n\nRan 21 tests for test/ArtHouse.t.sol:ArtHouseTest\n[PASS] testFuzz_ethSplitInvariant(uint96,bool,bool) (runs: 64, μ: 1192095, ~: 1162488)\n[PASS] testFuzz_imdSplitInvariant(uint96,bool) (runs: 64, μ: 1307757, ~: 1298483)\n[PASS] test_artistPayoutOnlyArtist_keptOnReapproval() (gas: 179207)\n[PASS] test_collectionMintOnlyHouse() (gas: 73967)\n[PASS] test_curationFlow_andFailures() (gas: 938837)\n[PASS] test_customSplit() (gas: 1124713)\n[PASS] test_deploymentWiring() (gas: 93139)\n[PASS] test_imdBuybackIsReleasedAndBurned() (gas: 1882866)\n[PASS] test_mintFailures() (gas: 1550882)\n[PASS] test_onlyCuratorApproves() (gas: 123827)\n[PASS] test_pieceOver100KBRejected() (gas: 21310484)\n[PASS] test_recordSaleOnlyModules() (gas: 120446)\n[PASS] test_reentrancyOnWithdrawBlocked() (gas: 1838346)\n[PASS] test_revokedArtistLosesCuration() (gas: 582575)\n[PASS] test_sealNeedsEveryPieceFinalized() (gas: 527413)\n[PASS] test_setHouseOnce() (gas: 78294)\n[PASS] test_submissions() (gas: 260658)\n[PASS] test_tokenURIOnChain() (gas: 1190981)\n[PASS] test_twoStepOwnership_noRenounce() (gas: 198046)\n[PASS] test_withdrawNothingReverts_andHouseGoesToCurrentOwner() (gas: 1241987)\n[PASS] test_wrongHashIsCorrectable() (gas: 777075)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 62.52ms (61.92ms CPU time)\n\nRan 1 test for test/LaunchGasCap.t.sol:LaunchGasCapTest\n[PASS] test_launchManifestFitsInOneMainnetTransaction() (gas: 27487764)\nLogs:\n  calldata bytes 66116\n  execution gas 14150696\n  total gas 15201436\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 38.43ms (38.30ms CPU time)\n\nRan 6 tests for test/PostLaunchWiring.t.sol:PostLaunchWiringTest\n[PASS] testFuzz_onlyTheOwnerSetsThePieceImplementation(address) (runs: 256, μ: 80915, ~: 80915)\n[PASS] testFuzz_theImplementationCannotBeInitialised(address) (runs: 256, μ: 59310, ~: 59434)\n[PASS] test_aClaimedEditionIsAnExactCopyOfTheImplementation() (gas: 67054282)\n[PASS] test_aCopyMadeOutsideTheFactoryIsNotAPiece() (gas: 5596863)\n[PASS] test_handoverDecidesWhoSetsThePieceImplementation() (gas: 496313)\n[PASS] test_implementationSurvivesASaleCloseAndReopen() (gas: 67143566)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 95.91ms (92.08ms CPU time)\n\nRan 1 test for test/fork/VrfFork.t.sol:VrfForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 700.81µs (0.00ns CPU time)\n\nRan 21 tests for test/EdgeProbes.t.sol:EdgeProbesTest\n[PASS] testFuzz_raiseRule_exactThreshold(uint256,uint256) (runs: 512, μ: 599031, ~: 598959)\nLogs:\n  Bound result 10362559951093511699\n  Bound result 691753520077718667246434098\n\n[PASS] test_bidBeforeOpen_andBelowReserve() (gas: 450952)\n[PASS] test_claimWithPiece_idsOutsideTheCollection() (gas: 245236)\n[PASS] test_deliverKey_beforeSettle_reverts() (gas: 37752)\n[PASS] test_dustRaise_oneWei() (gas: 584678)\n[PASS] test_extension_atExactBoundaries() (gas: 5941308)\n[PASS] test_ledger_withdrawAndRelease_failurePaths() (gas: 528986)\n[PASS] test_mint_failurePaths_andOneMintPerPiece() (gas: 2298970)\n[PASS] test_pieceByteCap_exactBoundary() (gas: 22844864)\n[PASS] test_plainCollection_curationFailurePaths() (gas: 1645904)\n[PASS] test_review_failurePaths() (gas: 418024)\n[PASS] test_review_noteLength_boundary() (gas: 444355)\n[PASS] test_reviewsOf_pagination_edges() (gas: 620874)\n[PASS] test_setAuction_failurePaths() (gas: 457785)\n[PASS] test_setClaimsOpenAt_bounds() (gas: 458468)\n[PASS] test_setClaimsOpenAt_followsFactoryOwner() (gas: 208294)\n[PASS] test_setClaimsOpenAt_pastOpensNow() (gas: 68589)\n[PASS] test_setGate_lockedAfterFirstBid() (gas: 530024)\n[PASS] test_settle_failurePaths() (gas: 6069145)\n[PASS] test_thesis_lengthBounds_andDecline() (gas: 833737)\n[PASS] test_voidUnsettled_graceBoundary_thenReopen() (gas: 6196630)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 117.21ms (121.00ms CPU time)\n\nRan 3 tests for test/Adversarial.t.sol:RuntimeTest\n[PASS] test_implementationsAreLocked() (gas: 104926)\n[PASS] test_launchedRuntimesAreBoundedAndHaveNoEscapeOpcodes() (gas: 60704522)\n[PASS] test_noRenounceAnywhere() (gas: 155551)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 89.83ms (87.57ms CPU time)\n\nRan 11 tests for test/Reviews.t.sol:ReviewsTest\n[PASS] testFuzz_tallyMatchesVoices(uint8[12]) (runs: 64, μ: 1438559, ~: 1442039)\n[PASS] test_aClaimedPieceIsAVoice_andAnUnclaimedOneIsNot() (gas: 67585998)\n[PASS] test_aMovedSeatStillHasOneVoice() (gas: 441792)\n[PASS] test_aSeatAndAPieceInOneWalletAreTwoVoices() (gas: 67310730)\n[PASS] test_anyoneAppliesToBeABroker() (gas: 224553)\n[PASS] test_anyonePublishesTheses() (gas: 810776)\n[PASS] test_changingAReviewMovesItsVote() (gas: 305393)\n[PASS] test_frozenOnceTheCuratorDecides_andAdvisoryOnly() (gas: 349039)\n[PASS] test_inputChecks() (gas: 307120)\n[PASS] test_onlyTheSeatHolderReviews() (gas: 97570)\n[PASS] test_seatsReview_andTheTallyFollows() (gas: 456977)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 122.72ms (74.12ms CPU time)\n\nRan 2 tests for test/LaunchDeployment.t.sol:LaunchDeploymentTest\n[PASS] test_allSevenConstructorsAcceptCodeLessDependencies() (gas: 52017547)\n[PASS] test_manifestOrderAndOwnerConfigurationRemainIntact() (gas: 76313890)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 135.24ms (198.50ms CPU time)\n\nRan 7 tests for test/Adversarial.t.sol:SourceEdgeTest\n[PASS] testFuzz_minimumRaiseIsCeilingOfFivePercent(uint96,uint96) (runs: 512, μ: 631776, ~: 631860)\nLogs:\n  Bound result 10368531\n  Bound result 455321846994\n\n[PASS] testFuzz_rendererHashIsKeccakOfConcatenation(bytes,bytes,bytes) (runs: 64, μ: 417894, ~: 414262)\n[PASS] test_bidBoundaries() (gas: 903854)\n[PASS] test_payloadChunkLimits() (gas: 5443398)\n[PASS] test_setAuctionEdges() (gas: 465767)\n[PASS] test_settleEdges_brokerSplit() (gas: 6921843)\n[PASS] test_settleWithUnapprovedBrokerPaysTheBurn() (gas: 5823007)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 91.00ms (102.57ms CPU time)\n\nRan 25 tests for test/NothingStuck.t.sol:NothingStuckTest\n[PASS] test_aBuyerNeedsAViewingKeyAProofCanUse() (gas: 67162390)\n[PASS] test_aJunkKeyIsProvenFake_paymentAndDepositToTheBuyer() (gas: 67746755)\n[PASS] test_aSilentSellerLetsTheBuyerCancelAfter24Hours() (gas: 67333847)\n[PASS] test_anAuctionClosedInTimeCannotBeVoided() (gas: 5800097)\n[PASS] test_anAuctionNobodyCanCloseGivesTheBidBack() (gas: 6090184)\n[PASS] test_callbackGasCanOnlyGoUpOnceTheSaleOpens() (gas: 60971574)\n[PASS] test_claimWithoutAKey_after30Days_thenTheKeyGoesIntoThePiece() (gas: 67114315)\n[PASS] test_curatorReKeysAPieceItsPreviousOwnerNeverDid() (gas: 67270449)\n[PASS] test_fallbackDraw_aStartedDrawsResultStands_finishedFromTheHistory() (gas: 61907143)\n[PASS] test_fallbackDraw_chainlinkStillWinsIfItAnswersFirst() (gas: 61661254)\n[PASS] test_fallbackDraw_countsFromThePurchase() (gas: 61837892)\n[PASS] test_fallbackDraw_oneAtATime() (gas: 62786175)\n[PASS] test_fallbackDraw_onlyAfterThreeDays_fromABlockNobodyKnew() (gas: 61820773)\n[PASS] test_fallbackDraw_startsAgainOnlyOnceItsHashIsGone() (gas: 61663827)\n[PASS] test_fallbackDraw_startsOnAYoungRequestTheCoordinatorNoLongerHolds() (gas: 61635778)\n[PASS] test_noProofBeforeAKey_andTheSellerCantDodgeOne() (gas: 67694073)\n[PASS] test_onlyAKeyTheSellerMadeCanBePosted() (gas: 67756130)\n[PASS] test_realKeys_aJunkKeyIsProvenFake() (gas: 907004)\nLogs:\n  gas for the buyer's proveFakeKey: 170130\n\n[PASS] test_realKeys_anHonestKeyCanNeverBeProvenFake() (gas: 1254824)\n[PASS] test_realKeys_theBuyerCantSwapViewingKeysToFrameTheSeller() (gas: 887941)\n[PASS] test_realKeys_theRightKeyWrappedToAnotherKeyIsFake() (gas: 894622)\n[PASS] test_the72HoursCountFromTheKey() (gas: 67755286)\n[PASS] test_theBuyerCantCancelUnderAPendingKey() (gas: 67530279)\n[PASS] test_theDepositIsExactly10Percent() (gas: 67634743)\n[PASS] test_theSellerCanRefundBeforeSendingAKey() (gas: 67441282)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 170.32ms (376.98ms CPU time)\n\nRan 1 test for test/EdgeProbes.t.sol:SourceVoidInvariantTest\n[PASS]\nSourceVoidInvariantTest invariants:\n[PASS] invariant_holdsExactlyWhatItOwes\n[PASS] invariant_settlementIsFinalAndSingle\n SourceVoidInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| SourceVoidHandler | bid            | 1035  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SourceVoidHandler | reopen         | 1036  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SourceVoidHandler | settle         | 1014  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SourceVoidHandler | voidUnsettled  | 1007  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SourceVoidHandler | warp           | 1033  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SourceVoidHandler | withdrawRefund | 1019  | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2135858570212705182\n  Bound result 65536\n  Bound result 118330\n  Bound result 3157198687268939155\n  Bound result 89934\n  Bound result 3410506478\n  Bound result 647374730\n  Bound result 1888\n  Bound result 921234825\n  Bound result 281600\n  Bound result 515251\n  Bound result 18\n  Bound result 303\n  Bound result 597693\n  Bound result 15916\n  Bound result 8722\n  Bound result 524800\n  Bound result 510438\n  Bound result 641837\n  Bound result 32320292\n  Bound result 50\n  Bound result 6400\n  Bound result 213914173\n  Bound result 921964786\n  Bound result 13354\n  Bound result 246400\n  Bound result 8211846308696627067\n  Bound result 93836\n  Bound result 499\n  Bound result 7155\n  Bound result 740\n  Bound result 237561\n  Bound result 3135\n  Bound result 8161\n  Bound result 6368\n  Bound result 2\n  Bound result 26\n  Bound result 1\n  Bound result 967396569\n  Bound result 47220\n  Bound result 200000\n  Bound result 114172\n  Bound result 10937\n  Bound result 65\n  Bound result 3959\n  Bound result 6611\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 662.37ms (657.39ms CPU time)\n\nRan 12 tests for test/Source.t.sol:ArtifactsSourceTest\n[PASS] testFuzz_revealOpensTheSealedSeed(bytes32,bytes32) (runs: 64, μ: 5847401, ~: 5847487)\n[PASS] test_auctionNeedsTheHouseToAcceptTheSale() (gas: 3287441)\n[PASS] test_auctionNeedsTheSourceLocked() (gas: 620787)\n[PASS] test_auctionReopensWhenNoBids() (gas: 445468)\n[PASS] test_auctionRules() (gas: 6690443)\n[PASS] test_bidReentrancyAndRefundPull() (gas: 770125)\n[PASS] test_deliverKeyOnceToTheWinner() (gas: 9195573)\n[PASS] test_noRevealWhileABuyerIsInEscrow() (gas: 8965997)\n[PASS] test_revealServesTheRendererWithItsSeed() (gas: 512444180)\nLogs:\n  revealed tokenURI gas: 2897295\n\n[PASS] test_revealTakesDownAListingWithNoBuyer() (gas: 8897385)\n[PASS] test_storedSeedIsSealed() (gas: 8687837)\n[PASS] test_tinyBidsMustStrictlyExceed() (gas: 942975)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 785.89ms (785.15ms CPU time)\n\nRan 1 test for test/invariants/SourceAuctionInvariant.t.sol:SourceAuctionInvariantTest\n[PASS]\nSourceAuctionInvariantTest invariants:\n[PASS] invariant_auctionConservation\n[PASS] invariant_highBidMonotone\n[PASS] invariant_settlementIsFinal\n SourceAuctionInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭----------------+--------------------+-------+---------+----------╮\n| Contract       | Selector           | Calls | Reverts | Discards |\n+==================================================================+\n| AuctionHandler | bid                | 856   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | payloadStaysLocked | 800   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | recordHigh         | 799   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | setAuction         | 788   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | settle             | 876   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | warp               | 846   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | withdrawRefund     | 795   | 0       | 0        |\n╰----------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 31\n  Bound result 1486\n  Bound result 8168\n  Bound result 536\n  Bound result 1513\n  Bound result 793\n  Bound result 5596\n  Bound result 1571\n  Bound result 400\n  Bound result 2000000000000000500\n  Bound result 599\n  Bound result 1000\n  Bound result 2000000000000011923\n  Bound result 27\n  Bound result 4366791704086718184\n  Bound result 1751\n  Bound result 649\n  Bound result 1659\n  Bound result 4288363214\n  Bound result 1736\n  Bound result 686\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.02s (1.02s CPU time)\n\nRan 12 tests for test/Gate.t.sol:GateTest\n[PASS] test_aHostileMembershipContractCountsAsNotMember() (gas: 62509470)\n[PASS] test_auction_gateFixedFromTheFirstBid() (gas: 716668)\n[PASS] test_auction_holdersFirstThenAnyone() (gas: 950650)\n[PASS] test_auction_membersBid_andTheMemberGateIsFixedFromTheFirstBid() (gas: 1009010)\n[PASS] test_brokenSeatContractCountsAsNotHeld() (gas: 61041666)\n[PASS] test_editions_gateFixedOnceTheSaleOpens() (gas: 61550600)\n[PASS] test_editions_holdersFirstThenAnyone() (gas: 62041819)\n[PASS] test_editions_membersBuyInTheWindow_asTokenHoldersDo() (gas: 62070062)\n[PASS] test_editions_noGateMeansOpen() (gas: 61284716)\n[PASS] test_editions_seatBuysUpToFivePerSeatWhereverItGoes() (gas: 62706626)\n[PASS] test_gateRules() (gas: 239527)\n[PASS] test_memberGateRules() (gas: 61272591)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 1.13s (124.17ms CPU time)\n\nRan 5 tests for test/invariants/BuybackConservation.t.sol:BuybackConservationTest\n[PASS]\nBuybackConservationTest invariants:\n[PASS] invariant_ethGoesOnlyToPool\n[PASS] invariant_imdGoesOnlyToBurnDestination\n BuybackConservationTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭----------------------------+----------------------+-------+---------+----------╮\n| Contract                   | Selector             | Calls | Reverts | Discards |\n+================================================================================+\n| BuybackConservationHandler | advanceTime          | 679   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | burnIMD              | 679   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | curatorSwap          | 686   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | donateETH            | 639   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | donateIMD            | 724   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | handover             | 713   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | publicSwap           | 671   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | rejectedSwap         | 685   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | unauthorizedCallback | 668   | 0       | 0        |\n╰----------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 127\n  Bound result 62514264337593543950335\n  Bound result 7063\n  Bound result 3000000000000000000\n\n[PASS] testFuzz_fundingBurnRoundTrip(uint96,uint96) (runs: 1000, μ: 645484, ~: 645531)\nLogs:\n  Bound result 4264337593543950335\n  Bound result 62514264337593543950335\n\n[PASS] test_failedCuratorSwapDoesNotPostponePublicLiveness() (gas: 896798)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 3\n\n[PASS] test_oneWeiSwapAndDirectBurnConserveFunds() (gas: 603515)\nLogs:\n  Bound result 1\n  Bound result 1\n\n[PASS] test_publicSwapDrainsRemainderBelowTheDailyCap() (gas: 334842)\nLogs:\n  Bound result 1\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.16s (1.81s CPU time)\n\nRan 11 tests for test/ReviewRound4.t.sol:ReviewRound4Test\n[PASS] testFuzz_gateViewsNeverRevert(address,address,address) (runs: 64, μ: 147464, ~: 147570)\n[PASS] testFuzz_theFallbackResultStandsAgainstAnyLateWord(uint256,bytes32) (runs: 64, μ: 61612804, ~: 61612759)\n[PASS] test_aDeadFallbackDrawCanBeRerequested() (gas: 62353184)\n[PASS] test_aLiveFallbackDrawStillCannotBeRerequested() (gas: 61865829)\n[PASS] test_gateSeats_dirtyOwnerWord_isNotHeld() (gas: 61084426)\n[PASS] test_gateSeats_noCode_isNotHeld() (gas: 61549406)\n[PASS] test_gateSeats_withCode_unchanged() (gas: 61881671)\n[PASS] test_gateToken_noCode_isNotHeld_andMembersStillBuy() (gas: 62076647)\n[PASS] test_noChainlinkAnswerOnceTheFallbackHashIsPublic() (gas: 61650518)\n[PASS] test_noFallbackOnARequestChainlinkMayStillAnswer() (gas: 61648831)\n[PASS] test_source_gateNoCode_bidsRefusedNotReverted_membersBid() (gas: 1000689)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 1.16s (992.38ms CPU time)\n\nRan 15 tests for test/LaunchAudit.t.sol:LaunchAuditTest\n[PASS] testFuzz_memberReplyMustBeExactlyOneWord(uint16,uint256,uint256) (runs: 64, μ: 436139, ~: 434959)\nLogs:\n  Bound result 1025000000000000000\n\n[PASS] test_attackerCannotInitializeCollectionAsRealHouse() (gas: 1082634)\n[PASS] test_attackerCannotInitializePieceAsRealFactory() (gas: 4983454)\n[PASS] test_attackerCannotInitializePieceAsRealSource() (gas: 4973750)\n[PASS] test_brokenBrokerPassDoesNotBlockEditionPurchase() (gas: 61686403)\n[PASS] test_brokenBrokerPassDoesNotBlockSourceSettlement() (gas: 19384786)\n[PASS] test_brokenPassDoesNotBlockPlainMintsInEitherCurrency() (gas: 2535075)\n[PASS] test_brokerPassMalformedRepliesCountAsIneligible() (gas: 934454)\n[PASS] test_claimedEditionsAreIndependentRuntimesAndStorage() (gas: 103418163)\n[PASS] test_dynamicMemberReplyCannotBypassEditionWindow() (gas: 61600926)\n[PASS] test_dynamicMemberReplyCannotBypassSourceWindow() (gas: 678888)\n[PASS] test_initializerRejectsEOAController() (gas: 6035471)\n[PASS] test_keyPostEventUnchangedBeforeAndAfterClaim() (gas: 67227720)\n[PASS] test_ownerCanClosePrimarySaleAndChangePendingAuctionSplit() (gas: 73130139)\n[PASS] test_plainCollectionIsIndependentRuntime() (gas: 4127353)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 1.20s (162.04ms CPU time)\n\nRan 23 tests for test/Adversarial.t.sol:ArtHouseEdgeTest\n[PASS] testFuzz_everyoneWithdrawsExactlyTheirShare(uint96,uint96,uint96) (runs: 256, μ: 2047930, ~: 2051430)\nLogs:\n  Bound result 12590441983\n  Bound result 52789833680220852523\n  Bound result 95\n\n[PASS] testFuzz_splitConservesAndHouseTakesRounding(uint16,uint16,uint16,uint96,uint8) (runs: 512, μ: 262627, ~: 263252)\nLogs:\n  Bound result 0\n  Bound result 949\n  Bound result 1\n  Bound result 2248466970756901\n\n[PASS] test_artistEdges() (gas: 1210240)\n[PASS] test_buybackOnlyToTheBurnerSetOnce() (gas: 460935)\n[PASS] test_clearThenReuploadKeepsSizeAccounting() (gas: 40763894)\n[PASS] test_collectionErc721Edges() (gas: 1436052)\n[PASS] test_constructorsDoNotCallDependencies() (gas: 48342)\n[PASS] test_constructorsRejectZeroDependencies() (gas: 4550)\n[PASS] test_curationEdges() (gas: 780836)\n[PASS] test_defaultSplit_agentHouseBurn() (gas: 381579)\n[PASS] test_mintWithIMD_falseReturnRejected() (gas: 2073855)\n[PASS] test_mintWithIMD_feeOnTransferRejected() (gas: 2297085)\n[PASS] test_mintWithIMD_stalePriceRejected() (gas: 1250853)\n[PASS] test_mintZeroPricesReject() (gas: 943137)\n[PASS] test_moduleCollectionsHaveNoPlainCuration() (gas: 376256)\n[PASS] test_pendingOwnerHasNoPowerBeforeAccepting() (gas: 197536)\n[PASS] test_registerModuleCollectionTwiceReverts() (gas: 44789)\n[PASS] test_revokedBrokerKeepsEarnedBalance_butEarnsNoMore() (gas: 1291624)\n[PASS] test_sealEmptyCollectionRevertsAndSealIsOnce() (gas: 657864)\n[PASS] test_splitExtremes() (gas: 1284500)\n[PASS] test_submissionEdges() (gas: 246348)\n[PASS] test_updatePieceAccessEdges() (gas: 1976567)\n[PASS] test_withdrawToRevertingPayoutKeepsBalance() (gas: 1372032)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 1.20s (1.26s CPU time)\n\nRan 16 tests for test/Artifacts.t.sol:ArtifactsFactoryTest\n[PASS] test_buyFailures() (gas: 61007948)\n[PASS] test_buyMany_cannotPassSupply() (gas: 98946207)\n[PASS] test_buyMany_fivePerWallet() (gas: 63871507)\n[PASS] test_buyRecordsSaleAndAssignsEveryEditionOnce() (gas: 178087349)\n[PASS] test_claimFlow_andFailures() (gas: 67420156)\n[PASS] test_postWrappedKeysInOneBatch() (gas: 67717995)\n[PASS] test_publishAndLock_accessAndFailures() (gas: 60948051)\n[PASS] test_rerequestAtOnceWhenTheCoordinatorAnsweredButTheCallbackFailed() (gas: 61886063)\n[PASS] test_rerequestRandomnessAfterDroppedRequest() (gas: 62044713)\n[PASS] test_saleControl() (gas: 61053844)\n[PASS] test_sealTokenURIMatchesR8Frame() (gas: 970376198)\n[PASS] test_viewingKeyZeroRejected() (gas: 33301)\n[PASS] test_vrfCallbackCannotBeReplayed() (gas: 61640492)\n[PASS] test_vrfCallbackGasIsTheCuratorsToTune() (gas: 61442257)\n[PASS] test_vrfCorrectableUntilTheSaleOpens_thenLockedForever() (gas: 62259505)\n[PASS] test_vrfMustBeConfiguredBeforeSelling() (gas: 98429)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 1.42s (1.70s CPU time)\n\nRan 1 test for test/invariants/PieceEscrowInvariant.t.sol:PieceEscrowInvariantTest\n[PASS]\nPieceEscrowInvariantTest invariants:\n[PASS] invariant_escrowConservation\n[PASS] invariant_escrowSellerOwns\n[PASS] invariant_royaltyAndIdentity\n[PASS] invariant_singleToken\n PieceEscrowInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭---------------+--------------------+-------+---------+----------╮\n| Contract      | Selector           | Calls | Reverts | Discards |\n+=================================================================+\n| EscrowHandler | approveAndTransfer | 372   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | buy                | 368   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | cancel             | 383   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | delist             | 408   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | list               | 400   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | postKey            | 384   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | proveFake          | 392   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | refundBuyer        | 376   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | registerKey        | 337   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | release            | 372   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | rewrap             | 391   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | transfer           | 382   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | warp               | 380   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | withdraw           | 404   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | withdrawRoyalty    | 411   | 0       | 0        |\n╰---------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 171443\n  Bound result 3000000000000000000\n  Bound result 18995\n  Bound result 10000\n  Bound result 577979407\n  Bound result 6657\n  Bound result 24782783692649250087\n  Bound result 1232000\n  Bound result 16620\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.66s (1.60s CPU time)\n\nRan 1 test for test/invariants/ArtifactsFactoryInvariant.t.sol:ArtifactsFactoryInvariantTest\n[PASS]\nArtifactsFactoryInvariantTest invariants:\n[PASS] invariant_claimedPiecesBelongToBuyers\n[PASS] invariant_counts\n[PASS] invariant_ledgerHoldsEveryPurchase\n[PASS] invariant_lockedAndPriced\n[PASS] invariant_walletLimit\n ArtifactsFactoryInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| FactoryHandler | buy               | 551   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | buyMany           | 483   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | claim             | 510   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | fulfil            | 549   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | lockedForever     | 504   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | replay            | 510   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | rerequest         | 552   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | setPrice          | 513   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | strangerFulfil    | 543   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | strangerRerequest | 520   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | toggleSale        | 525   | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4\n  Bound result 0\n  Bound result 3347074290\n  Bound result 5\n  Bound result 6\n  Bound result 6686558531025947288\n  Bound result 0\n  Bound result 4264337593543950335\n  Bound result 4264337593543950335\n  Bound result 1\n  Bound result 0\n  Bound result 17051\n  Bound result 4264337593543950333\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.74s (1.68s CPU time)\n\nRan 3 tests for test/invariants/FallbackDrawInvariant.t.sol:FallbackDrawInvariantTest\n[PASS]\nFallbackDrawInvariantTest invariants:\n[PASS] invariant_everyPurchaseOneEdition\n[PASS] invariant_oneFallbackAtATime\n[PASS] invariant_paymentsUntouched\n[PASS] invariant_retiredIdsStayDead\n FallbackDrawInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+------------------------+-------+---------+----------╮\n| Contract            | Selector               | Calls | Reverts | Discards |\n+===========================================================================+\n| FallbackDrawHandler | answer                 | 641   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | buy                    | 590   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | failedCallback         | 615   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | finishFallback         | 613   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | finishSettledOrRetired | 607   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | lateAnswerToRetired    | 576   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | rerequest              | 613   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | roll                   | 638   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | startFallback          | 588   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | strangerRerequest      | 663   | 0       | 0        |\n╰---------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 48\n  Bound result 5\n  Bound result 32\n  Bound result 13\n  Bound result 5\n  Bound result 27\n  Bound result 3\n  Bound result 17\n\n[PASS] test_deadFallbackIsClearedByARerequest() (gas: 1953402)\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 0\n\n[PASS] test_fallbackRouteIsReachable() (gas: 1626065)\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.89s (2.83s CPU time)\n\nRan 1 test for test/invariants/ArtHouseInvariant.t.sol:ArtHouseInvariantTest\n[PASS]\nArtHouseInvariantTest invariants:\n[PASS] invariant_constants\n[PASS] invariant_ethConservation\n[PASS] invariant_imdConservation\n[PASS] invariant_noOverWithdrawal\n[PASS] invariant_supplyAndSeal\n ArtHouseInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| LedgerHandler | handOver       | 389   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | mintETH        | 368   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | mintIMD        | 362   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | moduleSale     | 409   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | releaseBuyback | 427   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setBroker      | 415   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setPayout      | 401   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setPrices      | 373   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setSaleOpen    | 387   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setSplit       | 430   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | strangerCalls  | 400   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | withdraw       | 391   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | withdrawHouse  | 368   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 14264337593543950335\n  Bound result 9020\n  Bound result 244\n  Bound result 1637\n  Bound result 499\n  Bound result 16\n  Bound result 33\n  Bound result 5727\n  Bound result 85\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.45s (3.44s CPU time)\n\nRan 4 tests for test/invariants/BrokerClaimsInvariant.t.sol:BrokerClaimsInvariantTest\n[PASS]\nBrokerClaimsInvariantTest invariants:\n[PASS] invariant_claimHistorySurvivesTransfers\n[PASS] invariant_ownershipBalancesAndBrokerRightsAgree\n BrokerClaimsInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+------------------+-------+---------+----------╮\n| Contract            | Selector         | Calls | Reverts | Discards |\n+=====================================================================+\n| BrokerClaimsHandler | advanceTime      | 838   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | claimPiece       | 912   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | claimSeat        | 878   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | movePass         | 899   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | movePiece        | 940   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | moveSeat         | 859   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | rejectedTransfer | 818   | 0       | 0        |\n╰---------------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 166400\n  Bound result 69871\n  Bound result 50660\n  Bound result 53812\n  Bound result 166400\n  Bound result 150191\n\n[PASS] test_seatAndPassTransfersDoNotResetEitherClaimLimit() (gas: 1553655)\n[PASS] test_sourceClaimAlsoConsumesTheWalletsSeatEntitlement() (gas: 1137627)\n[PASS] test_startIsInclusiveAndClosedClaimsLeaveNoHistory() (gas: 1893855)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.97s (3.94s CPU time)\n\nRan 3 tests for test/invariants/ReviewHistoryInvariant.t.sol:ReviewHistoryInvariantTest\n[PASS]\nReviewHistoryInvariantTest invariants:\n[PASS] invariant_pagesKeepFirstReviewOrderAndLatestContents\n[PASS] invariant_thesisCountsDistinctAuthorsWithoutGrantingBrokerPowers\n[PASS] invariant_votesArePerCredentialAndFinalDecisionsFreezeRecords\n ReviewHistoryInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭----------------------+---------------+-------+---------+----------╮\n| Contract             | Selector      | Calls | Reverts | Discards |\n+===================================================================+\n| ReviewHistoryHandler | advanceTime   | 1096  | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | decide        | 1077  | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | invalidReview | 974   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | moveSeat      | 986   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | review        | 996   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | thesis        | 1015  | 0       | 0        |\n╰----------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 160000\n  Bound result 27\n  Bound result 8000\n  Bound result 20559\n  Bound result 224\n  Bound result 4151\n  Bound result 1919549\n  Bound result 1500198\n  Bound result 100000\n  Bound result 14304\n  Bound result 1425\n  Bound result 2488311\n\n[PASS] test_finalDecisionsFreezeOldAndNewHolderReviews() (gas: 1951281)\n[PASS] test_transferredSeatEditsOneExistingVoiceInPlace() (gas: 1175097)\nLogs:\n  Bound result 1\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 5.75s (5.74s CPU time)\n\nRan 13 tests for test/Adversarial.t.sol:ArtifactsEdgeTest\n[PASS] testFuzz_anyWordsAssignDistinctEditions(uint256[8]) (runs: 256, μ: 64674903, ~: 64677688)\n[PASS] testFuzz_sealFramesAnyTraits(uint8,uint8,uint8,uint8,uint8) (runs: 16, μ: 519762085, ~: 519759047)\nLogs:\n  Bound result 3\n\n[PASS] test_buyRevertsAtomicallyWhenCoordinatorReverts() (gas: 59259425)\n[PASS] test_callbackWithNoWordsReverts() (gas: 61562671)\n[PASS] test_claimedPieceIsAFullCopyOfTheImplementation() (gas: 67210216)\n[PASS] test_configureVRFRejectsZeroes() (gas: 262859)\n[PASS] test_duplicateRequestIdRejected() (gas: 59453766)\n[PASS] test_nonOwnerCannotRunTheSale() (gas: 60818142)\n[PASS] test_rerequestIsAtomicWhenCoordinatorReverts() (gas: 59947847)\n[PASS] test_rerequestWindowBoundaryAndChaining() (gas: 67785913)\n[PASS] test_setPieceEdges() (gas: 61051534)\n[PASS] test_unapprovedBuyerAsBrokerEarnsNothing_andOneWeiPriceWorks() (gas: 61500182)\n[PASS] test_wrappedKeyEdges() (gas: 67194117)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 9.58s (10.83s CPU time)\n\nRan 41 test suites in 9.59s (40.09s CPU time): 306 tests passed, 0 failed, 2 skipped (308 total tests)\n","passed":true},{"durationMs":128,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ArtCollection.approve(address,uint256)\",\"ArtCollection.initialize(address,string,string)\",\"ArtCollection.mint(address,uint256)\",\"ArtCollection.safeTransferFrom(address,address,uint256)\",\"ArtCollection.safeTransferFrom(address,address,uint256,bytes)\",\"ArtCollection.setApprovalForAll(address,bool)\",\"ArtCollection.transferFrom(address,address,uint256)\",\"ArtHouse.acceptOwnership()\",\"ArtHouse.approveArtist(address,string)\",\"ArtHouse.clearPiece(address,uint256)\",\"ArtHouse.createCollection(string,string,address)\",\"ArtHouse.decideSubmission(uint256,bool)\",\"ArtHouse.finalizePiece(address,uint256)\",\"ArtHouse.mint(address,uint256,address)\",\"ArtHouse.mintWithIMD(address,uint256,address,uint256)\",\"ArtHouse.recordResale(address,uint256,uint256)\",\"ArtHouse.recordSale(address,address,address)\",\"ArtHouse.registerModuleCollection(address,address)\",\"ArtHouse.registerPiece(address,uint256,bytes32,string,string)\",\"ArtHouse.releaseBuyback(address)\",\"ArtHouse.revokeArtist(address)\",\"ArtHouse.sealCollection(address)\",\"ArtHouse.setBroker(address,bool)\",\"ArtHouse.setBrokerPass(address)\",\"ArtHouse.setBuybackBurner(address)\",\"ArtHouse.setPayout(address)\",\"ArtHouse.setPrices(address,uint256,uint256)\",\"ArtHouse.setSaleModule(address,bool)\",\"ArtHouse.setSaleOpen(address,bool)\",\"ArtHouse.setSplit(address,uint16,uint16,uint16,uint16)\",\"ArtHouse.submit(bytes32,string)\",\"ArtHouse.transferOwnership(address)\",\"ArtHouse.updatePiece(address,uint256,bytes32,string,string)\",\"ArtHouse.uploadChunk(address,uint256,uint256,bytes)\",\"ArtHouse.withdraw(address)\",\"ArtHouse.withdrawHouse(address)\",\"ArtStorage.acceptOwnership()\",\"ArtStorage.clear(address,uint256)\",\"ArtStorage.setHouse(address)\",\"ArtStorage.transferOwnership(address)\",\"ArtStorage.write(address,uint256,uint256,bytes)\",\"ArtifactsFactory.acceptOwnership()\",\"ArtifactsFactory.buy(address)\",\"ArtifactsFactory.buyMany(uint256,address)\",\"ArtifactsFactory.buyWithSeat(uint256,uint256,address)\",\"ArtifactsFactory.claim(uint256)\",\"ArtifactsFactory.claimMany(uint256[])\",\"ArtifactsFactory.configureVRF(address,bytes32,uint256,bool)\",\"ArtifactsFactory.endSale()\",\"ArtifactsFactory.finishFallbackDraw(uint256)\",\"ArtifactsFactory.lock()\",\"ArtifactsFactory.postWrappedKey(uint256,bytes)\",\"ArtifactsFactory.postWrappedKeys(uint256[],bytes[])\",\"ArtifactsFactory.rawFulfillRandomWords(uint256,uint256[])\",\"ArtifactsFactory.registerViewingKey(bytes32)\",\"ArtifactsFactory.rerequestRandomness(uint256)\",\"ArtifactsFactory.setGate(address,address,uint256,uint64)\",\"ArtifactsFactory.setMemberGate(address,bytes4,uint256)\",\"ArtifactsFactory.setMintPhases(uint64,uint8,uint64,uint8)\",\"ArtifactsFactory.setPiece(uint256,(string,string,uint8,string),bytes,bytes32)\",\"ArtifactsFactory.setPieceImplementation(address)\",\"ArtifactsFactory.setPrice(uint256)\",\"ArtifactsFactory.setSaleOpen(bool)\",\"ArtifactsFactory.setVRFCallbackGas(uint32)\",\"ArtifactsFactory.startFallbackDraw(uint256)\",\"ArtifactsFactory.transferOwnership(address)\",\"ArtifactsPiece.approve(address,uint256)\",\"ArtifactsPiece.buy(bytes32,address)\",\"ArtifactsPiece.cancel()\",\"ArtifactsPiece.delist()\",\"ArtifactsPiece.initialize(address,address,uint256,address,(string,string,uint8,string),address,bytes32,bytes,bool,bytes32)\",\"ArtifactsPiece.list(uint256)\",\"ArtifactsPiece.postEscrowKey(bytes,address,uint256)\",\"ArtifactsPiece.proveFakeKey((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))\",\"ArtifactsPiece.refundBuyer()\",\"ArtifactsPiece.registerViewingKey(bytes32)\",\"ArtifactsPiece.release()\",\"ArtifactsPiece.reveal(bytes32)\",\"ArtifactsPiece.rewrapFor(bytes)\",\"ArtifactsPiece.safeTransferFrom(address,address,uint256)\",\"ArtifactsPiece.safeTransferFrom(address,address,uint256,bytes)\",\"ArtifactsPiece.setApprovalForAll(address,bool)\",\"ArtifactsPiece.transferFrom(address,address,uint256)\",\"ArtifactsPiece.withdraw()\",\"ArtifactsSource.acceptOwnership()\",\"ArtifactsSource.bid(address)\",\"ArtifactsSource.deliverKey(bytes)\",\"ArtifactsSource.lock(bytes32,bytes32)\",\"ArtifactsSource.resetRenderer()\",\"ArtifactsSource.setAuction(uint256,uint64)\",\"ArtifactsSource.setGate(address,address,uint256,uint64)\",\"ArtifactsSource.setMemberGate(address,bytes4,uint256)\",\"ArtifactsSource.setPieceImplementation(address)\",\"ArtifactsSource.settle()\",\"ArtifactsSource.storeRendererChunk(bytes)\",\"ArtifactsSource.transferOwnership(address)\",\"ArtifactsSource.voidUnsettled()\",\"ArtifactsSource.withdrawRefund()\",\"BrokerPass.approve(address,uint256)\",\"BrokerPass.claimWithPiece(uint256)\",\"BrokerPass.claimWithSeat(uint256)\",\"BrokerPass.safeTransferFrom(address,address,uint256)\",\"BrokerPass.safeTransferFrom(address,address,uint256,bytes)\",\"BrokerPass.setApprovalForAll(address,bool)\",\"BrokerPass.setClaimsOpenAt(uint64)\",\"BrokerPass.transferFrom(address,address,uint256)\",\"ImdBuybackBurner.burnEth(uint256,uint256,uint256)\",\"ImdBuybackBurner.burnImd()\",\"ImdBuybackBurner.receive()\",\"ImdBuybackBurner.unlockCallback(bytes)\",\"SubmissionReviews.applyAsBroker(string)\",\"SubmissionReviews.postThesis(uint256,string)\",\"SubmissionReviews.reviewAsPiece(uint256,uint256,uint8,string)\",\"SubmissionReviews.reviewAsSeat(uint256,uint256,uint8,string)\"],\"files\":{\".gitignore\":3,\"ADAPTATION.md\":586,\"README.md\":262,\"foundry.toml\":25,\"launch.burner.json\":17,\"launch.json\":55,\"launch.piece.json\":12,\"reference/PROTOCOL.md\":99,\"reference/RULES.md\":137,\"reference/audit/V13Audit.t.sol.txt\":381,\"reference/check-framed.js\":25,\"reference/framed/framed-003.svg\":1,\"reference/framed/framed-MASTER.svg\":1,\"reference/rules.js\":145,\"reference/the-source.renderer.html\":148,\"remappings.txt\":1,\"script/Deploy.s.sol\":41,\"src/ArtCollection.sol\":55,\"src/ArtHouse.sol\":609,\"src/ArtStorage.sol\":82,\"src/ArtifactsFactory.sol\":654,\"src/ArtifactsPiece.sol\":460,\"src/ArtifactsSource.sol\":286,\"src/BrokerPass.sol\":142,\"src/ImdBuybackBurner.sol\":163,\"src/KeyProof.sol\":154,\"src/SubmissionReviews.sol\":215,\"src/base/ERC721Lite.sol\":122,\"src/base/HolderGate.sol\":113,\"src/base/ReentrancyGuard.sol\":15,\"src/base/TwoStepOwnable.sol\":40,\"src/interfaces/Interfaces.sol\":93,\"src/libs/Clones.sol\":19,\"src/libs/Encoding.sol\":79,\"src/libs/SSTORE2.sol\":41,\"src/libs/Seal.sol\":102,\"test/Adversarial.t.sol\":1410,\"test/ArtHouse.t.sol\":463,\"test/Artifacts.t.sol\":674,\"test/AuditRound3.t.sol\":151,\"test/BrokerPass.t.sol\":373,\"test/Burner.t.sol\":161,\"test/ClaimEnd.t.sol\":152,\"test/EdgeProbes.t.sol\":718,\"test/EscrowDeadline.t.sol\":160,\"test/Fixture.sol\":232,\"test/Gate.t.sol\":295,\"test/KeyProof.t.sol\":134,\"test/LaunchAudit.t.sol\":338,\"test/LaunchDeployment.t.sol\":204,\"test/LaunchGasCap.t.sol\":92,\"test/NothingStuck.t.sol\":594,\"test/Phases.t.sol\":130,\"test/PieceImplementation.t.sol\":147,\"test/PostLaunchWiring.t.sol\":167,\"test/ReviewRound4.t.sol\":262,\"test/Reviews.t.sol\":264,\"test/Source.t.sol\":396,\"test/audit/KeyProofEdges.t.sol\":178,\"test/audit/KeyReuseLeak.t.sol\":38,\"test/fixtures/keyproof.json\":81,\"test/fork/BurnerFork.t.sol\":70,\"test/fork/VrfFork.t.sol\":131,\"test/invariants/ADDED_COVERAGE.md\":24,\"test/invariants/ArtHouseInvariant.t.sol\":444,\"test/invariants/ArtifactsFactoryInvariant.t.sol\":323,\"test/invariants/BrokerClaimsInvariant.t.sol\":275,\"test/invariants/BuybackConservation.t.sol\":246,\"test/invariants/FallbackDrawInvariant.t.sol\":417,\"test/invariants/PieceEscrowInvariant.t.sol\":446,\"test/invariants/ReviewHistoryInvariant.t.sol\":245,\"test/invariants/SourceAuctionInvariant.t.sol\":227,\"test/mocks/AdversarialMocks.sol\":134,\"test/mocks/MockPoolManager.sol\":57,\"test/mocks/MockSeats.sol\":27,\"test/mocks/Mocks.sol\":149,\"test/mocks/TestVRFCoordinator.sol\":46,\"test/utils/Base64Decode.sol\":83},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"044316bf802500677c352c7af6b9bed8b7446ccfdc4fb5a3dffdd9dd2eb6210a","verifiedTreeHash":"087d3d49ce78eb066f26b6ebde9dff1544bcc34c","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":408528,"exitCode":0,"name":"build","output":"Compiling 76 files with Solc 0.8.26\nSolc 0.8.26 finished in 408.40s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> test/invariants/ArtHouseInvariant.t.sol:105:9:\n    |\n105 |         address buyer,\n    |         ^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":10112,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/BurnerFork.t.sol:BurnerForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 356.72µs (0.00ns CPU time)\n\nRan 1 test for test/fork/VrfFork.t.sol:VrfForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 1.02ms (0.00ns CPU time)\n\nRan 5 tests for test/audit/KeyProofEdges.t.sol:KeyProofEdgesTest\n[PASS] test_adversarialE_isProvable() (gas: 107849)\n[PASS] test_adversarialE_proofIsActuallyChecked() (gas: 23615)\n[PASS] test_negatedSCannotFrame() (gas: 60700)\n[PASS] test_oddYWrapThatOpensIsNotFake() (gas: 37558)\n[PASS] test_xEqualsN_isMalformed() (gas: 13218)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 10.18ms (18.94ms CPU time)\n\nRan 4 tests for test/Phases.t.sol:PhasesTest\n[PASS] test_aSeatFollowsThePhases_whereverItGoes() (gas: 1758420)\n[PASS] test_afterTheWindow_anyoneUpToFive() (gas: 1052975)\n[PASS] test_capsRise_1_then_2_then_5_forAnImdHolder() (gas: 1751735)\n[PASS] test_setOnlyBeforeTheSaleOpens_andChecked() (gas: 333087)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 16.64ms (1.26ms CPU time)\n\nRan 1 test for test/LaunchGasCap.t.sol:LaunchGasCapTest\n[PASS] test_launchManifestFitsInOneMainnetTransaction() (gas: 27487764)\nLogs:\n  calldata bytes 66116\n  execution gas 14150696\n  total gas 15201436\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 21.56ms (21.43ms CPU time)\n\nRan 6 tests for test/Adversarial.t.sol:PieceEdgeTest\n[PASS] test_cancelThenSecondBuyerAndRoyaltyToChangedPayout() (gas: 1088077)\n[PASS] test_listingEdges() (gas: 1003054)\n[PASS] test_releaseAtExactly72HoursByStranger() (gas: 914095)\n[PASS] test_revealNeedsTheSourceLocked_andEmptyRendererURI() (gas: 6214987)\n[PASS] test_safeTransferReceivers() (gas: 670237)\n[PASS] test_transferAuthEdges() (gas: 350213)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 22.21ms (3.50ms CPU time)\n\nRan 6 tests for test/EscrowDeadline.t.sol:SourceEscrowDeadlineTest\n[PASS] testFuzz_postAfterDeadlineReverts(uint32) (runs: 64, μ: 367037, ~: 367037)\n[PASS] test_cancelledSaleCanBeBoughtAgain() (gas: 820699)\n[PASS] test_expiredSaleCanBeRefundedAndBoughtAgain() (gas: 940459)\n[PASS] test_postAtCancellationDeadlineReverts() (gas: 366895)\n[PASS] test_postJustBeforeDeadlinePreventsCancellation() (gas: 702323)\n[PASS] test_postOneSecondAfterDeadlineReverts() (gas: 367215)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 25.25ms (23.75ms CPU time)\n\nRan 7 tests for test/Burner.t.sol:BurnerTest\n[PASS] test_anyoneBurnsHeldImd() (gas: 169949)\n[PASS] test_anyoneSwapsInSmallStepsAfter60QuietDays() (gas: 845755)\n[PASS] test_constructorChecks() (gas: 8711)\n[PASS] test_editionSaleToBurnedImd() (gas: 61811458)\n[PASS] test_onlyTheCuratorSwaps_withAMinimumAndADeadline() (gas: 653639)\n[PASS] test_onlyThePoolManagerCallsBack() (gas: 32189)\n[PASS] test_theNewOwnerSwapsAfterAHandover() (gas: 304000)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 25.99ms (23.92ms CPU time)\n\nRan 1 test for test/audit/KeyReuseLeak.t.sol:KeyReuseLeakTest\n[PASS] test_copiedE_cantBePosted(uint256,uint256) (runs: 64, μ: 602934, ~: 603096)\nLogs:\n  Bound result 11818044032905497069688431977092257873442291733589656922755808936709498\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 26.41ms (24.42ms CPU time)\n\nRan 4 tests for test/AuditRound3.t.sol:AuditRound3Test\n[PASS] test_aReturnDataBombCostsThePayerNothing() (gas: 694196)\n[PASS] test_aShareThatWaitsInTheLedgerIsAnnounced() (gas: 339941)\n[PASS] test_theArtistsPayoutCantMoveThePieceDuringARelease() (gas: 415877)\n[PASS] test_theArtistsPayoutCantRelistDuringARelease() (gas: 600564)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 28.71ms (795.69µs CPU time)\n\nRan 8 tests for test/KeyProof.t.sol:KeyProofTest\n[PASS] test_aJunkKeyIsProvenFake() (gas: 369871)\nLogs:\n  gas to check a fake-key proof: 44805\n\n[PASS] test_aKeyThatOpensIsNeverProvenFake() (gas: 368087)\n[PASS] test_aProofOnlyHoldsForItsBuyerPieceAndChain() (gas: 416867)\n[PASS] test_aProofOnlyHoldsForItsOwnWrappedKey() (gas: 416275)\n[PASS] test_aTamperedProofFails() (gas: 768976)\n[PASS] test_madeUpBytesAndTheOldFormatAreFake() (gas: 690806)\n[PASS] test_theRightKeyForSomeoneElseIsProvenFake() (gas: 368314)\n[PASS] test_viewingKeys() (gas: 34725)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 5.26ms (4.40ms CPU time)\n\nRan 10 tests for test/Artifacts.t.sol:ArtifactsPieceEscrowTest\n[PASS] test_escrowCancelBeforeKey_andDelist() (gas: 501042)\n[PASS] test_escrowHappyPath_buyerConfirms() (gas: 1181933)\n[PASS] test_escrowKeyMustNotBeEmpty() (gas: 311000)\n[PASS] test_escrowTimeoutRelease() (gas: 729073)\n[PASS] test_pieceViewingKeyZeroRejected() (gas: 168689)\n[PASS] test_plainTransferClearsKey_previousOwnerRekeys() (gas: 506819)\n[PASS] test_reentrancyOnEscrowWithdrawBlocked() (gas: 844317)\n[PASS] test_rewrapIsOneShotAndNonEmpty() (gas: 284134)\n[PASS] test_sellerCannotOverwriteKeyAfterRelease() (gas: 913380)\n[PASS] test_sourceOnlyReveal() (gas: 35552)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 31.40ms (3.95ms CPU time)\n\nRan 18 tests for test/BrokerPass.t.sol:BrokerPassTest\n[PASS] test_capIs100() (gas: 19752778)\n[PASS] test_claimWithPiece_onceEverPerPiece() (gas: 6633588)\n[PASS] test_claimWithSeat_onceEverPerSeat() (gas: 376003)\n[PASS] test_claimWithTheSource() (gas: 5963894)\n[PASS] test_claimsWaitForTheStartTime_setOnceByTheCurator() (gas: 489742)\n[PASS] test_oneClaimPerWallet() (gas: 6934488)\n[PASS] test_passHolderCanBrokerTheirOwnBuy() (gas: 1022234)\n[PASS] test_passHolderEarnsOnMint_andTheRightMovesWithThePass() (gas: 2088098)\n[PASS] test_recordResaleRejectsAnythingButAPiece() (gas: 298286)\n[PASS] test_resaleBrokerShare_creditedInTheLedger() (gas: 7248761)\n[PASS] test_resaleBuyerWithAPassCanBrokerTheirOwnBuy() (gas: 7186065)\n[PASS] test_resaleFallsBackToThePieceWhenTheLedgerRefuses() (gas: 7201166)\n[PASS] test_resaleSellerCannotBeBroker() (gas: 7098605)\n[PASS] test_resaleWithoutEligibleBroker_sellerKeepsTheShare() (gas: 6887763)\n[PASS] test_setBrokerPassOnce() (gas: 64999)\n[PASS] test_sourceSplit_brokerAndArtistOnly() (gas: 6115735)\n[PASS] test_sourceSplit_noBrokerBurns() (gas: 5873176)\n[PASS] test_tokenURIIsOnChainJson() (gas: 388848)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 47.14ms (19.79ms CPU time)\n\nRan 21 tests for test/ArtHouse.t.sol:ArtHouseTest\n[PASS] testFuzz_ethSplitInvariant(uint96,bool,bool) (runs: 64, μ: 1192095, ~: 1162488)\n[PASS] testFuzz_imdSplitInvariant(uint96,bool) (runs: 64, μ: 1307757, ~: 1298483)\n[PASS] test_artistPayoutOnlyArtist_keptOnReapproval() (gas: 179207)\n[PASS] test_collectionMintOnlyHouse() (gas: 73967)\n[PASS] test_curationFlow_andFailures() (gas: 938837)\n[PASS] test_customSplit() (gas: 1124713)\n[PASS] test_deploymentWiring() (gas: 93139)\n[PASS] test_imdBuybackIsReleasedAndBurned() (gas: 1882866)\n[PASS] test_mintFailures() (gas: 1550882)\n[PASS] test_onlyCuratorApproves() (gas: 123827)\n[PASS] test_pieceOver100KBRejected() (gas: 21310484)\n[PASS] test_recordSaleOnlyModules() (gas: 120446)\n[PASS] test_reentrancyOnWithdrawBlocked() (gas: 1838346)\n[PASS] test_revokedArtistLosesCuration() (gas: 582575)\n[PASS] test_sealNeedsEveryPieceFinalized() (gas: 527413)\n[PASS] test_setHouseOnce() (gas: 78294)\n[PASS] test_submissions() (gas: 260658)\n[PASS] test_tokenURIOnChain() (gas: 1190981)\n[PASS] test_twoStepOwnership_noRenounce() (gas: 198046)\n[PASS] test_withdrawNothingReverts_andHouseGoesToCurrentOwner() (gas: 1241987)\n[PASS] test_wrongHashIsCorrectable() (gas: 777075)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 75.84ms (69.84ms CPU time)\n\nRan 1 test for test/ClaimEnd.t.sol:EndBeforeOpenTest\n[PASS] test_endSale_beforeOpening_refused() (gas: 60691375)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 15.04ms (13.18ms CPU time)\n\nRan 5 tests for test/ClaimEnd.t.sol:ClaimEndTest\n[PASS] test_claimMany_claimsEveryOneInOneCall() (gas: 18008525)\n[PASS] test_claimMany_emptyRefused_andTheCuratorCanClaimForBuyers() (gas: 12217339)\n[PASS] test_claimMany_isAllOrNothing() (gas: 18066805)\n[PASS] test_endSale_isFinal() (gas: 6879895)\n[PASS] test_endSale_needsTheSaleToHaveOpened_andWorksWhileClosed() (gas: 96083)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 19.13ms (2.71ms CPU time)\n\nRan 11 tests for test/Reviews.t.sol:ReviewsTest\n[PASS] testFuzz_tallyMatchesVoices(uint8[12]) (runs: 64, μ: 1436757, ~: 1440151)\n[PASS] test_aClaimedPieceIsAVoice_andAnUnclaimedOneIsNot() (gas: 67585998)\n[PASS] test_aMovedSeatStillHasOneVoice() (gas: 441792)\n[PASS] test_aSeatAndAPieceInOneWalletAreTwoVoices() (gas: 67310730)\n[PASS] test_anyoneAppliesToBeABroker() (gas: 224553)\n[PASS] test_anyonePublishesTheses() (gas: 810776)\n[PASS] test_changingAReviewMovesItsVote() (gas: 305393)\n[PASS] test_frozenOnceTheCuratorDecides_andAdvisoryOnly() (gas: 349039)\n[PASS] test_inputChecks() (gas: 307120)\n[PASS] test_onlyTheSeatHolderReviews() (gas: 97570)\n[PASS] test_seatsReview_andTheTallyFollows() (gas: 456977)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 124.51ms (79.88ms CPU time)\n\nRan 7 tests for test/Adversarial.t.sol:SourceEdgeTest\n[PASS] testFuzz_minimumRaiseIsCeilingOfFivePercent(uint96,uint96) (runs: 512, μ: 631776, ~: 631860)\nLogs:\n  Bound result 10368531\n  Bound result 455321846994\n\n[PASS] testFuzz_rendererHashIsKeccakOfConcatenation(bytes,bytes,bytes) (runs: 64, μ: 417881, ~: 414050)\n[PASS] test_bidBoundaries() (gas: 903854)\n[PASS] test_payloadChunkLimits() (gas: 5443398)\n[PASS] test_setAuctionEdges() (gas: 465767)\n[PASS] test_settleEdges_brokerSplit() (gas: 6921843)\n[PASS] test_settleWithUnapprovedBrokerPaysTheBurn() (gas: 5823007)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 127.01ms (126.03ms CPU time)\n\nRan 3 tests for test/Adversarial.t.sol:RuntimeTest\n[PASS] test_implementationsAreLocked() (gas: 104926)\n[PASS] test_launchedRuntimesAreBoundedAndHaveNoEscapeOpcodes() (gas: 60704522)\n[PASS] test_noRenounceAnywhere() (gas: 155551)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 142.30ms (131.54ms CPU time)\n\nRan 6 tests for test/EscrowDeadline.t.sol:EditionEscrowDeadlineTest\n[PASS] testFuzz_postAfterDeadlineReverts(uint32) (runs: 64, μ: 367100, ~: 367100)\n[PASS] test_cancelledSaleCanBeBoughtAgain() (gas: 780559)\n[PASS] test_expiredSaleCanBeRefundedAndBoughtAgain() (gas: 900319)\n[PASS] test_postAtCancellationDeadlineReverts() (gas: 366958)\n[PASS] test_postJustBeforeDeadlinePreventsCancellation() (gas: 662150)\n[PASS] test_postOneSecondAfterDeadlineReverts() (gas: 367278)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 55.51ms (31.08ms CPU time)\n\nRan 12 tests for test/Gate.t.sol:GateTest\n[PASS] test_aHostileMembershipContractCountsAsNotMember() (gas: 62509470)\n[PASS] test_auction_gateFixedFromTheFirstBid() (gas: 716668)\n[PASS] test_auction_holdersFirstThenAnyone() (gas: 950650)\n[PASS] test_auction_membersBid_andTheMemberGateIsFixedFromTheFirstBid() (gas: 1009010)\n[PASS] test_brokenSeatContractCountsAsNotHeld() (gas: 61041666)\n[PASS] test_editions_gateFixedOnceTheSaleOpens() (gas: 61550600)\n[PASS] test_editions_holdersFirstThenAnyone() (gas: 62041819)\n[PASS] test_editions_membersBuyInTheWindow_asTokenHoldersDo() (gas: 62070062)\n[PASS] test_editions_noGateMeansOpen() (gas: 61284716)\n[PASS] test_editions_seatBuysUpToFivePerSeatWhereverItGoes() (gas: 62706626)\n[PASS] test_gateRules() (gas: 239527)\n[PASS] test_memberGateRules() (gas: 61272591)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 175.02ms (133.95ms CPU time)\n\nRan 2 tests for test/LaunchDeployment.t.sol:LaunchDeploymentTest\n[PASS] test_allSevenConstructorsAcceptCodeLessDependencies() (gas: 52017547)\n[PASS] test_manifestOrderAndOwnerConfigurationRemainIntact() (gas: 76313890)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 178.36ms (156.36ms CPU time)\n\nRan 23 tests for test/Adversarial.t.sol:ArtHouseEdgeTest\n[PASS] testFuzz_everyoneWithdrawsExactlyTheirShare(uint96,uint96,uint96) (runs: 256, μ: 2047930, ~: 2051430)\nLogs:\n  Bound result 12590441983\n  Bound result 52789833680220852523\n  Bound result 95\n\n[PASS] testFuzz_splitConservesAndHouseTakesRounding(uint16,uint16,uint16,uint96,uint8) (runs: 512, μ: 262562, ~: 263240)\nLogs:\n  Bound result 5528\n  Bound result 36\n  Bound result 92\n  Bound result 13623317\n\n[PASS] test_artistEdges() (gas: 1210240)\n[PASS] test_buybackOnlyToTheBurnerSetOnce() (gas: 460935)\n[PASS] test_clearThenReuploadKeepsSizeAccounting() (gas: 40763894)\n[PASS] test_collectionErc721Edges() (gas: 1436052)\n[PASS] test_constructorsDoNotCallDependencies() (gas: 48342)\n[PASS] test_constructorsRejectZeroDependencies() (gas: 4550)\n[PASS] test_curationEdges() (gas: 780836)\n[PASS] test_defaultSplit_agentHouseBurn() (gas: 381579)\n[PASS] test_mintWithIMD_falseReturnRejected() (gas: 2073855)\n[PASS] test_mintWithIMD_feeOnTransferRejected() (gas: 2297085)\n[PASS] test_mintWithIMD_stalePriceRejected() (gas: 1250853)\n[PASS] test_mintZeroPricesReject() (gas: 943137)\n[PASS] test_moduleCollectionsHaveNoPlainCuration() (gas: 376256)\n[PASS] test_pendingOwnerHasNoPowerBeforeAccepting() (gas: 197536)\n[PASS] test_registerModuleCollectionTwiceReverts() (gas: 44789)\n[PASS] test_revokedBrokerKeepsEarnedBalance_butEarnsNoMore() (gas: 1291624)\n[PASS] test_sealEmptyCollectionRevertsAndSealIsOnce() (gas: 657864)\n[PASS] test_splitExtremes() (gas: 1284500)\n[PASS] test_submissionEdges() (gas: 246348)\n[PASS] test_updatePieceAccessEdges() (gas: 1976567)\n[PASS] test_withdrawToRevertingPayoutKeepsBalance() (gas: 1372032)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 181.09ms (244.95ms CPU time)\n\nRan 5 tests for test/invariants/BuybackConservation.t.sol:BuybackConservationTest\n[PASS]\nBuybackConservationTest invariants:\n[PASS] invariant_ethGoesOnlyToPool\n[PASS] invariant_imdGoesOnlyToBurnDestination\n BuybackConservationTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭----------------------------+----------------------+-------+---------+----------╮\n| Contract                   | Selector             | Calls | Reverts | Discards |\n+================================================================================+\n| BuybackConservationHandler | advanceTime          | 679   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | burnIMD              | 679   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | curatorSwap          | 686   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | donateETH            | 639   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | donateIMD            | 724   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | handover             | 713   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | publicSwap           | 671   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | rejectedSwap         | 685   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | unauthorizedCallback | 668   | 0       | 0        |\n╰----------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 1500000000000000000\n  Bound result 6729\n  Bound result 26\n\n[PASS] testFuzz_fundingBurnRoundTrip(uint96,uint96) (runs: 1000, μ: 645484, ~: 645531)\nLogs:\n  Bound result 15\n  Bound result 3287095715371001261041\n\n[PASS] test_failedCuratorSwapDoesNotPostponePublicLiveness() (gas: 896798)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 3\n\n[PASS] test_oneWeiSwapAndDirectBurnConserveFunds() (gas: 603515)\nLogs:\n  Bound result 1\n  Bound result 1\n\n[PASS] test_publicSwapDrainsRemainderBelowTheDailyCap() (gas: 334842)\nLogs:\n  Bound result 1\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 758.69ms (824.12ms CPU time)\n\nRan 11 tests for test/ReviewRound4.t.sol:ReviewRound4Test\n[PASS] testFuzz_gateViewsNeverRevert(address,address,address) (runs: 64, μ: 147464, ~: 147570)\n[PASS] testFuzz_theFallbackResultStandsAgainstAnyLateWord(uint256,bytes32) (runs: 64, μ: 61612779, ~: 61612765)\n[PASS] test_aDeadFallbackDrawCanBeRerequested() (gas: 62353184)\n[PASS] test_aLiveFallbackDrawStillCannotBeRerequested() (gas: 61865829)\n[PASS] test_gateSeats_dirtyOwnerWord_isNotHeld() (gas: 61084426)\n[PASS] test_gateSeats_noCode_isNotHeld() (gas: 61549406)\n[PASS] test_gateSeats_withCode_unchanged() (gas: 61881671)\n[PASS] test_gateToken_noCode_isNotHeld_andMembersStillBuy() (gas: 62076647)\n[PASS] test_noChainlinkAnswerOnceTheFallbackHashIsPublic() (gas: 61650518)\n[PASS] test_noFallbackOnARequestChainlinkMayStillAnswer() (gas: 61648831)\n[PASS] test_source_gateNoCode_bidsRefusedNotReverted_membersBid() (gas: 1000689)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 877.01ms (992.51ms CPU time)\n\nRan 1 test for test/invariants/SourceAuctionInvariant.t.sol:SourceAuctionInvariantTest\n[PASS]\nSourceAuctionInvariantTest invariants:\n[PASS] invariant_auctionConservation\n[PASS] invariant_highBidMonotone\n[PASS] invariant_settlementIsFinal\n SourceAuctionInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭----------------+--------------------+-------+---------+----------╮\n| Contract       | Selector           | Calls | Reverts | Discards |\n+==================================================================+\n| AuctionHandler | bid                | 856   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | payloadStaysLocked | 800   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | recordHigh         | 799   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | setAuction         | 788   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | settle             | 876   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | warp               | 846   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | withdrawRefund     | 795   | 0       | 0        |\n╰----------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 400\n  Bound result 1486\n  Bound result 8168\n  Bound result 4660\n  Bound result 1513\n  Bound result 793\n  Bound result 5596\n  Bound result 1571\n  Bound result 6400\n  Bound result 2000000000000250000\n  Bound result 279\n  Bound result 1800\n  Bound result 1000\n  Bound result 2000000000000011923\n  Bound result 33\n  Bound result 4366791704086718184\n  Bound result 1751\n  Bound result 649\n  Bound result 1659\n  Bound result 4288363214\n  Bound result 1736\n  Bound result 686\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 978.09ms (973.97ms CPU time)\n\nRan 12 tests for test/Source.t.sol:ArtifactsSourceTest\n[PASS] testFuzz_revealOpensTheSealedSeed(bytes32,bytes32) (runs: 64, μ: 5847412, ~: 5847481)\n[PASS] test_auctionNeedsTheHouseToAcceptTheSale() (gas: 3287441)\n[PASS] test_auctionNeedsTheSourceLocked() (gas: 620787)\n[PASS] test_auctionReopensWhenNoBids() (gas: 445468)\n[PASS] test_auctionRules() (gas: 6690443)\n[PASS] test_bidReentrancyAndRefundPull() (gas: 770125)\n[PASS] test_deliverKeyOnceToTheWinner() (gas: 9195573)\n[PASS] test_noRevealWhileABuyerIsInEscrow() (gas: 8965997)\n[PASS] test_revealServesTheRendererWithItsSeed() (gas: 512444180)\nLogs:\n  revealed tokenURI gas: 2897295\n\n[PASS] test_revealTakesDownAListingWithNoBuyer() (gas: 8897385)\n[PASS] test_storedSeedIsSealed() (gas: 8687837)\n[PASS] test_tinyBidsMustStrictlyExceed() (gas: 942975)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 1.13s (782.20ms CPU time)\n\nRan 16 tests for test/Artifacts.t.sol:ArtifactsFactoryTest\n[PASS] test_buyFailures() (gas: 61007948)\n[PASS] test_buyMany_cannotPassSupply() (gas: 98946207)\n[PASS] test_buyMany_fivePerWallet() (gas: 63871507)\n[PASS] test_buyRecordsSaleAndAssignsEveryEditionOnce() (gas: 178087349)\n[PASS] test_claimFlow_andFailures() (gas: 67420156)\n[PASS] test_postWrappedKeysInOneBatch() (gas: 67717995)\n[PASS] test_publishAndLock_accessAndFailures() (gas: 60948051)\n[PASS] test_rerequestAtOnceWhenTheCoordinatorAnsweredButTheCallbackFailed() (gas: 61886063)\n[PASS] test_rerequestRandomnessAfterDroppedRequest() (gas: 62044713)\n[PASS] test_saleControl() (gas: 61053844)\n[PASS] test_sealTokenURIMatchesR8Frame() (gas: 970376198)\n[PASS] test_viewingKeyZeroRejected() (gas: 33301)\n[PASS] test_vrfCallbackCannotBeReplayed() (gas: 61640492)\n[PASS] test_vrfCallbackGasIsTheCuratorsToTune() (gas: 61442257)\n[PASS] test_vrfCorrectableUntilTheSaleOpens_thenLockedForever() (gas: 62259505)\n[PASS] test_vrfMustBeConfiguredBeforeSelling() (gas: 98429)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 1.39s (1.57s CPU time)\n\nRan 6 tests for test/PieceImplementation.t.sol:PieceImplementationTest\n[PASS] test_auctionCannotOpenWithoutThePieceImplementation() (gas: 583552)\n[PASS] test_reviewsOfReturnsTheTailForAHugeCount() (gas: 858155)\n[PASS] test_saleCannotOpenBeforeTheLedgerRegistersTheFactory() (gas: 59090880)\n[PASS] test_saleCannotOpenWithoutThePieceImplementation() (gas: 58925629)\n[PASS] test_setPieceImplementationOnceAndOnlyByTheOwner() (gas: 294913)\n[PASS] test_vrfCallbackMinimumIsAboveOneDraw() (gas: 61580020)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 1.39s (54.85ms CPU time)\n\nRan 15 tests for test/LaunchAudit.t.sol:LaunchAuditTest\n[PASS] testFuzz_memberReplyMustBeExactlyOneWord(uint16,uint256,uint256) (runs: 64, μ: 436096, ~: 434920)\nLogs:\n  Bound result 249999\n\n[PASS] test_attackerCannotInitializeCollectionAsRealHouse() (gas: 1082634)\n[PASS] test_attackerCannotInitializePieceAsRealFactory() (gas: 4983454)\n[PASS] test_attackerCannotInitializePieceAsRealSource() (gas: 4973750)\n[PASS] test_brokenBrokerPassDoesNotBlockEditionPurchase() (gas: 61686403)\n[PASS] test_brokenBrokerPassDoesNotBlockSourceSettlement() (gas: 19384786)\n[PASS] test_brokenPassDoesNotBlockPlainMintsInEitherCurrency() (gas: 2535075)\n[PASS] test_brokerPassMalformedRepliesCountAsIneligible() (gas: 934454)\n[PASS] test_claimedEditionsAreIndependentRuntimesAndStorage() (gas: 103418163)\n[PASS] test_dynamicMemberReplyCannotBypassEditionWindow() (gas: 61600926)\n[PASS] test_dynamicMemberReplyCannotBypassSourceWindow() (gas: 678888)\n[PASS] test_initializerRejectsEOAController() (gas: 6035471)\n[PASS] test_keyPostEventUnchangedBeforeAndAfterClaim() (gas: 67227720)\n[PASS] test_ownerCanClosePrimarySaleAndChangePendingAuctionSplit() (gas: 73130139)\n[PASS] test_plainCollectionIsIndependentRuntime() (gas: 4127353)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 1.39s (240.21ms CPU time)\n\nRan 25 tests for test/NothingStuck.t.sol:NothingStuckTest\n[PASS] test_aBuyerNeedsAViewingKeyAProofCanUse() (gas: 67162390)\n[PASS] test_aJunkKeyIsProvenFake_paymentAndDepositToTheBuyer() (gas: 67746755)\n[PASS] test_aSilentSellerLetsTheBuyerCancelAfter24Hours() (gas: 67333847)\n[PASS] test_anAuctionClosedInTimeCannotBeVoided() (gas: 5800097)\n[PASS] test_anAuctionNobodyCanCloseGivesTheBidBack() (gas: 6090184)\n[PASS] test_callbackGasCanOnlyGoUpOnceTheSaleOpens() (gas: 60971574)\n[PASS] test_claimWithoutAKey_after30Days_thenTheKeyGoesIntoThePiece() (gas: 67114315)\n[PASS] test_curatorReKeysAPieceItsPreviousOwnerNeverDid() (gas: 67270449)\n[PASS] test_fallbackDraw_aStartedDrawsResultStands_finishedFromTheHistory() (gas: 61907143)\n[PASS] test_fallbackDraw_chainlinkStillWinsIfItAnswersFirst() (gas: 61661254)\n[PASS] test_fallbackDraw_countsFromThePurchase() (gas: 61837892)\n[PASS] test_fallbackDraw_oneAtATime() (gas: 62786175)\n[PASS] test_fallbackDraw_onlyAfterThreeDays_fromABlockNobodyKnew() (gas: 61820773)\n[PASS] test_fallbackDraw_startsAgainOnlyOnceItsHashIsGone() (gas: 61663827)\n[PASS] test_fallbackDraw_startsOnAYoungRequestTheCoordinatorNoLongerHolds() (gas: 61635778)\n[PASS] test_noProofBeforeAKey_andTheSellerCantDodgeOne() (gas: 67694073)\n[PASS] test_onlyAKeyTheSellerMadeCanBePosted() (gas: 67756130)\n[PASS] test_realKeys_aJunkKeyIsProvenFake() (gas: 907004)\nLogs:\n  gas for the buyer's proveFakeKey: 170130\n\n[PASS] test_realKeys_anHonestKeyCanNeverBeProvenFake() (gas: 1254824)\n[PASS] test_realKeys_theBuyerCantSwapViewingKeysToFrameTheSeller() (gas: 887941)\n[PASS] test_realKeys_theRightKeyWrappedToAnotherKeyIsFake() (gas: 894622)\n[PASS] test_the72HoursCountFromTheKey() (gas: 67755286)\n[PASS] test_theBuyerCantCancelUnderAPendingKey() (gas: 67530279)\n[PASS] test_theDepositIsExactly10Percent() (gas: 67634743)\n[PASS] test_theSellerCanRefundBeforeSendingAKey() (gas: 67441282)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 1.39s (357.87ms CPU time)\n\nRan 1 test for test/invariants/PieceEscrowInvariant.t.sol:PieceEscrowInvariantTest\n[PASS]\nPieceEscrowInvariantTest invariants:\n[PASS] invariant_escrowConservation\n[PASS] invariant_escrowSellerOwns\n[PASS] invariant_royaltyAndIdentity\n[PASS] invariant_singleToken\n PieceEscrowInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭---------------+--------------------+-------+---------+----------╮\n| Contract      | Selector           | Calls | Reverts | Discards |\n+=================================================================+\n| EscrowHandler | approveAndTransfer | 372   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | buy                | 368   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | cancel             | 383   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | delist             | 408   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | list               | 400   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | postKey            | 384   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | proveFake          | 392   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | refundBuyer        | 376   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | registerKey        | 337   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | release            | 372   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | rewrap             | 391   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | transfer           | 382   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | warp               | 380   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | withdraw           | 404   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | withdrawRoyalty    | 411   | 0       | 0        |\n╰---------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 171443\n  Bound result 29\n  Bound result 18997\n  Bound result 10000\n  Bound result 6581\n  Bound result 24782783692649250087\n  Bound result 85\n  Bound result 16618\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.53s (1.46s CPU time)\n\nRan 1 test for test/invariants/ArtifactsFactoryInvariant.t.sol:ArtifactsFactoryInvariantTest\n[PASS]\nArtifactsFactoryInvariantTest invariants:\n[PASS] invariant_claimedPiecesBelongToBuyers\n[PASS] invariant_counts\n[PASS] invariant_ledgerHoldsEveryPurchase\n[PASS] invariant_lockedAndPriced\n[PASS] invariant_walletLimit\n ArtifactsFactoryInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| FactoryHandler | buy               | 551   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | buyMany           | 483   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | claim             | 510   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | fulfil            | 549   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | lockedForever     | 504   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | replay            | 510   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | rerequest         | 552   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | setPrice          | 513   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | strangerFulfil    | 543   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | strangerRerequest | 520   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | toggleSale        | 525   | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 2\n  Bound result 3642\n  Bound result 5\n  Bound result 6\n  Bound result 4094202694630420282\n  Bound result 0\n  Bound result 4264337593543950335\n  Bound result 4264337593543950335\n  Bound result 1\n  Bound result 3\n  Bound result 406350608133546612\n  Bound result 4264337593543950333\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.65s (1.62s CPU time)\n\nRan 3 tests for test/invariants/FallbackDrawInvariant.t.sol:FallbackDrawInvariantTest\n[PASS]\nFallbackDrawInvariantTest invariants:\n[PASS] invariant_everyPurchaseOneEdition\n[PASS] invariant_oneFallbackAtATime\n[PASS] invariant_paymentsUntouched\n[PASS] invariant_retiredIdsStayDead\n FallbackDrawInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+------------------------+-------+---------+----------╮\n| Contract            | Selector               | Calls | Reverts | Discards |\n+===========================================================================+\n| FallbackDrawHandler | answer                 | 641   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | buy                    | 590   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | failedCallback         | 615   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | finishFallback         | 613   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | finishSettledOrRetired | 607   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | lateAnswerToRetired    | 576   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | rerequest              | 613   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | roll                   | 638   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | startFallback          | 588   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | strangerRerequest      | 663   | 0       | 0        |\n╰---------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 3\n  Bound result 13\n  Bound result 4\n  Bound result 30\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 46\n  Bound result 1\n  Bound result 2\n  Bound result 39\n\n[PASS] test_deadFallbackIsClearedByARerequest() (gas: 1953402)\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 0\n\n[PASS] test_fallbackRouteIsReachable() (gas: 1626065)\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.92s (2.86s CPU time)\n\nRan 1 test for test/invariants/ArtHouseInvariant.t.sol:ArtHouseInvariantTest\n[PASS]\nArtHouseInvariantTest invariants:\n[PASS] invariant_constants\n[PASS] invariant_ethConservation\n[PASS] invariant_imdConservation\n[PASS] invariant_noOverWithdrawal\n[PASS] invariant_supplyAndSeal\n ArtHouseInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| LedgerHandler | handOver       | 389   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | mintETH        | 368   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | mintIMD        | 362   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | moduleSale     | 409   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | releaseBuyback | 427   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setBroker      | 415   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setPayout      | 401   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setPrices      | 373   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setSaleOpen    | 387   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setSplit       | 430   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | strangerCalls  | 400   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | withdraw       | 391   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | withdrawHouse  | 368   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2000000000000000000\n  Bound result 9173\n  Bound result 512\n  Bound result 2010\n  Bound result 11\n  Bound result 299999\n  Bound result 33\n  Bound result 5727\n  Bound result 85\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.40s (3.39s CPU time)\n\nRan 4 tests for test/invariants/BrokerClaimsInvariant.t.sol:BrokerClaimsInvariantTest\n[PASS]\nBrokerClaimsInvariantTest invariants:\n[PASS] invariant_claimHistorySurvivesTransfers\n[PASS] invariant_ownershipBalancesAndBrokerRightsAgree\n BrokerClaimsInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+------------------+-------+---------+----------╮\n| Contract            | Selector         | Calls | Reverts | Discards |\n+=====================================================================+\n| BrokerClaimsHandler | advanceTime      | 838   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | claimPiece       | 912   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | claimSeat        | 878   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | movePass         | 899   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | movePiece        | 940   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | moveSeat         | 859   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | rejectedTransfer | 818   | 0       | 0        |\n╰---------------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 166400\n  Bound result 87317\n  Bound result 50660\n  Bound result 119674\n  Bound result 166400\n  Bound result 18668\n\n[PASS] test_seatAndPassTransfersDoNotResetEitherClaimLimit() (gas: 1553655)\n[PASS] test_sourceClaimAlsoConsumesTheWalletsSeatEntitlement() (gas: 1137627)\n[PASS] test_startIsInclusiveAndClosedClaimsLeaveNoHistory() (gas: 1893855)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.75s (3.72s CPU time)\n\nRan 3 tests for test/invariants/ReviewHistoryInvariant.t.sol:ReviewHistoryInvariantTest\n[PASS]\nReviewHistoryInvariantTest invariants:\n[PASS] invariant_pagesKeepFirstReviewOrderAndLatestContents\n[PASS] invariant_thesisCountsDistinctAuthorsWithoutGrantingBrokerPowers\n[PASS] invariant_votesArePerCredentialAndFinalDecisionsFreezeRecords\n ReviewHistoryInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭----------------------+---------------+-------+---------+----------╮\n| Contract             | Selector      | Calls | Reverts | Discards |\n+===================================================================+\n| ReviewHistoryHandler | advanceTime   | 1096  | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | decide        | 1077  | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | invalidReview | 974   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | moveSeat      | 986   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | review        | 996   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | thesis        | 1015  | 0       | 0        |\n╰----------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2000\n  Bound result 33\n  Bound result 12\n  Bound result 20559\n  Bound result 224\n  Bound result 4151\n  Bound result 1919549\n  Bound result 522199\n  Bound result 50000\n  Bound result 14304\n  Bound result 1425\n  Bound result 2488311\n\n[PASS] test_finalDecisionsFreezeOldAndNewHolderReviews() (gas: 1951281)\n[PASS] test_transferredSeatEditsOneExistingVoiceInPlace() (gas: 1175097)\nLogs:\n  Bound result 1\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 5.52s (5.52s CPU time)\n\nRan 13 tests for test/Adversarial.t.sol:ArtifactsEdgeTest\n[PASS] testFuzz_anyWordsAssignDistinctEditions(uint256[8]) (runs: 256, μ: 64674779, ~: 64677728)\n[PASS] testFuzz_sealFramesAnyTraits(uint8,uint8,uint8,uint8,uint8) (runs: 16, μ: 519762294, ~: 519759047)\nLogs:\n  Bound result 3\n\n[PASS] test_buyRevertsAtomicallyWhenCoordinatorReverts() (gas: 59259425)\n[PASS] test_callbackWithNoWordsReverts() (gas: 61562671)\n[PASS] test_claimedPieceIsAFullCopyOfTheImplementation() (gas: 67210216)\n[PASS] test_configureVRFRejectsZeroes() (gas: 262859)\n[PASS] test_duplicateRequestIdRejected() (gas: 59453766)\n[PASS] test_nonOwnerCannotRunTheSale() (gas: 60818142)\n[PASS] test_rerequestIsAtomicWhenCoordinatorReverts() (gas: 59947847)\n[PASS] test_rerequestWindowBoundaryAndChaining() (gas: 67785913)\n[PASS] test_setPieceEdges() (gas: 61051534)\n[PASS] test_unapprovedBuyerAsBrokerEarnsNothing_andOneWeiPriceWorks() (gas: 61500182)\n[PASS] test_wrappedKeyEdges() (gas: 67194117)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 9.99s (11.22s CPU time)\n\nRan 38 test suites in 10.00s (39.41s CPU time): 278 tests passed, 0 failed, 2 skipped (280 total tests)\n","passed":true},{"durationMs":98,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ArtCollection.approve(address,uint256)\",\"ArtCollection.initialize(address,string,string)\",\"ArtCollection.mint(address,uint256)\",\"ArtCollection.safeTransferFrom(address,address,uint256)\",\"ArtCollection.safeTransferFrom(address,address,uint256,bytes)\",\"ArtCollection.setApprovalForAll(address,bool)\",\"ArtCollection.transferFrom(address,address,uint256)\",\"ArtHouse.acceptOwnership()\",\"ArtHouse.approveArtist(address,string)\",\"ArtHouse.clearPiece(address,uint256)\",\"ArtHouse.createCollection(string,string,address)\",\"ArtHouse.decideSubmission(uint256,bool)\",\"ArtHouse.finalizePiece(address,uint256)\",\"ArtHouse.mint(address,uint256,address)\",\"ArtHouse.mintWithIMD(address,uint256,address,uint256)\",\"ArtHouse.recordResale(address,uint256,uint256)\",\"ArtHouse.recordSale(address,address,address)\",\"ArtHouse.registerModuleCollection(address,address)\",\"ArtHouse.registerPiece(address,uint256,bytes32,string,string)\",\"ArtHouse.releaseBuyback(address)\",\"ArtHouse.revokeArtist(address)\",\"ArtHouse.sealCollection(address)\",\"ArtHouse.setBroker(address,bool)\",\"ArtHouse.setBrokerPass(address)\",\"ArtHouse.setBuybackBurner(address)\",\"ArtHouse.setPayout(address)\",\"ArtHouse.setPrices(address,uint256,uint256)\",\"ArtHouse.setSaleModule(address,bool)\",\"ArtHouse.setSaleOpen(address,bool)\",\"ArtHouse.setSplit(address,uint16,uint16,uint16,uint16)\",\"ArtHouse.submit(bytes32,string)\",\"ArtHouse.transferOwnership(address)\",\"ArtHouse.updatePiece(address,uint256,bytes32,string,string)\",\"ArtHouse.uploadChunk(address,uint256,uint256,bytes)\",\"ArtHouse.withdraw(address)\",\"ArtHouse.withdrawHouse(address)\",\"ArtStorage.acceptOwnership()\",\"ArtStorage.clear(address,uint256)\",\"ArtStorage.setHouse(address)\",\"ArtStorage.transferOwnership(address)\",\"ArtStorage.write(address,uint256,uint256,bytes)\",\"ArtifactsFactory.acceptOwnership()\",\"ArtifactsFactory.buy(address)\",\"ArtifactsFactory.buyMany(uint256,address)\",\"ArtifactsFactory.buyWithSeat(uint256,uint256,address)\",\"ArtifactsFactory.claim(uint256)\",\"ArtifactsFactory.claimMany(uint256[])\",\"ArtifactsFactory.configureVRF(address,bytes32,uint256,bool)\",\"ArtifactsFactory.endSale()\",\"ArtifactsFactory.finishFallbackDraw(uint256)\",\"ArtifactsFactory.lock()\",\"ArtifactsFactory.postWrappedKey(uint256,bytes)\",\"ArtifactsFactory.postWrappedKeys(uint256[],bytes[])\",\"ArtifactsFactory.rawFulfillRandomWords(uint256,uint256[])\",\"ArtifactsFactory.registerViewingKey(bytes32)\",\"ArtifactsFactory.rerequestRandomness(uint256)\",\"ArtifactsFactory.setGate(address,address,uint256,uint64)\",\"ArtifactsFactory.setMemberGate(address,bytes4,uint256)\",\"ArtifactsFactory.setMintPhases(uint64,uint8,uint64,uint8)\",\"ArtifactsFactory.setPiece(uint256,(string,string,uint8,string),bytes,bytes32)\",\"ArtifactsFactory.setPieceImplementation(address)\",\"ArtifactsFactory.setPrice(uint256)\",\"ArtifactsFactory.setSaleOpen(bool)\",\"ArtifactsFactory.setVRFCallbackGas(uint32)\",\"ArtifactsFactory.startFallbackDraw(uint256)\",\"ArtifactsFactory.transferOwnership(address)\",\"ArtifactsPiece.approve(address,uint256)\",\"ArtifactsPiece.buy(bytes32,address)\",\"ArtifactsPiece.cancel()\",\"ArtifactsPiece.delist()\",\"ArtifactsPiece.initialize(address,address,uint256,address,(string,string,uint8,string),address,bytes32,bytes,bool,bytes32)\",\"ArtifactsPiece.list(uint256)\",\"ArtifactsPiece.postEscrowKey(bytes,address,uint256)\",\"ArtifactsPiece.proveFakeKey((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))\",\"ArtifactsPiece.refundBuyer()\",\"ArtifactsPiece.registerViewingKey(bytes32)\",\"ArtifactsPiece.release()\",\"ArtifactsPiece.reveal(bytes32)\",\"ArtifactsPiece.rewrapFor(bytes)\",\"ArtifactsPiece.safeTransferFrom(address,address,uint256)\",\"ArtifactsPiece.safeTransferFrom(address,address,uint256,bytes)\",\"ArtifactsPiece.setApprovalForAll(address,bool)\",\"ArtifactsPiece.transferFrom(address,address,uint256)\",\"ArtifactsPiece.withdraw()\",\"ArtifactsSource.acceptOwnership()\",\"ArtifactsSource.bid(address)\",\"ArtifactsSource.deliverKey(bytes)\",\"ArtifactsSource.lock(bytes32,bytes32)\",\"ArtifactsSource.resetRenderer()\",\"ArtifactsSource.setAuction(uint256,uint64)\",\"ArtifactsSource.setGate(address,address,uint256,uint64)\",\"ArtifactsSource.setMemberGate(address,bytes4,uint256)\",\"ArtifactsSource.setPieceImplementation(address)\",\"ArtifactsSource.settle()\",\"ArtifactsSource.storeRendererChunk(bytes)\",\"ArtifactsSource.transferOwnership(address)\",\"ArtifactsSource.voidUnsettled()\",\"ArtifactsSource.withdrawRefund()\",\"BrokerPass.approve(address,uint256)\",\"BrokerPass.claimWithPiece(uint256)\",\"BrokerPass.claimWithSeat(uint256)\",\"BrokerPass.safeTransferFrom(address,address,uint256)\",\"BrokerPass.safeTransferFrom(address,address,uint256,bytes)\",\"BrokerPass.setApprovalForAll(address,bool)\",\"BrokerPass.setClaimsOpenAt(uint64)\",\"BrokerPass.transferFrom(address,address,uint256)\",\"ImdBuybackBurner.burnEth(uint256,uint256,uint256)\",\"ImdBuybackBurner.burnImd()\",\"ImdBuybackBurner.receive()\",\"ImdBuybackBurner.unlockCallback(bytes)\",\"SubmissionReviews.applyAsBroker(string)\",\"SubmissionReviews.postThesis(uint256,string)\",\"SubmissionReviews.reviewAsPiece(uint256,uint256,uint8,string)\",\"SubmissionReviews.reviewAsSeat(uint256,uint256,uint8,string)\"],\"files\":{\".gitignore\":3,\"ADAPTATION.md\":586,\"README.md\":262,\"foundry.toml\":25,\"launch.burner.json\":17,\"launch.json\":55,\"launch.piece.json\":12,\"reference/PROTOCOL.md\":99,\"reference/RULES.md\":137,\"reference/audit/V13Audit.t.sol.txt\":381,\"reference/check-framed.js\":25,\"reference/framed/framed-003.svg\":1,\"reference/framed/framed-MASTER.svg\":1,\"reference/rules.js\":145,\"reference/the-source.renderer.html\":148,\"remappings.txt\":1,\"script/Deploy.s.sol\":41,\"src/ArtCollection.sol\":55,\"src/ArtHouse.sol\":609,\"src/ArtStorage.sol\":82,\"src/ArtifactsFactory.sol\":654,\"src/ArtifactsPiece.sol\":460,\"src/ArtifactsSource.sol\":286,\"src/BrokerPass.sol\":142,\"src/ImdBuybackBurner.sol\":163,\"src/KeyProof.sol\":154,\"src/SubmissionReviews.sol\":215,\"src/base/ERC721Lite.sol\":122,\"src/base/HolderGate.sol\":113,\"src/base/ReentrancyGuard.sol\":15,\"src/base/TwoStepOwnable.sol\":40,\"src/interfaces/Interfaces.sol\":93,\"src/libs/Clones.sol\":19,\"src/libs/Encoding.sol\":79,\"src/libs/SSTORE2.sol\":41,\"src/libs/Seal.sol\":102,\"test/Adversarial.t.sol\":1410,\"test/ArtHouse.t.sol\":463,\"test/Artifacts.t.sol\":674,\"test/AuditRound3.t.sol\":151,\"test/BrokerPass.t.sol\":373,\"test/Burner.t.sol\":161,\"test/ClaimEnd.t.sol\":152,\"test/EscrowDeadline.t.sol\":160,\"test/Fixture.sol\":232,\"test/Gate.t.sol\":295,\"test/KeyProof.t.sol\":134,\"test/LaunchAudit.t.sol\":338,\"test/LaunchDeployment.t.sol\":204,\"test/LaunchGasCap.t.sol\":92,\"test/NothingStuck.t.sol\":594,\"test/Phases.t.sol\":130,\"test/PieceImplementation.t.sol\":147,\"test/ReviewRound4.t.sol\":262,\"test/Reviews.t.sol\":264,\"test/Source.t.sol\":396,\"test/audit/KeyProofEdges.t.sol\":178,\"test/audit/KeyReuseLeak.t.sol\":38,\"test/fixtures/keyproof.json\":81,\"test/fork/BurnerFork.t.sol\":70,\"test/fork/VrfFork.t.sol\":131,\"test/invariants/ADDED_COVERAGE.md\":24,\"test/invariants/ArtHouseInvariant.t.sol\":444,\"test/invariants/ArtifactsFactoryInvariant.t.sol\":323,\"test/invariants/BrokerClaimsInvariant.t.sol\":275,\"test/invariants/BuybackConservation.t.sol\":246,\"test/invariants/FallbackDrawInvariant.t.sol\":417,\"test/invariants/PieceEscrowInvariant.t.sol\":446,\"test/invariants/ReviewHistoryInvariant.t.sol\":245,\"test/invariants/SourceAuctionInvariant.t.sol\":227,\"test/mocks/AdversarialMocks.sol\":134,\"test/mocks/MockPoolManager.sol\":57,\"test/mocks/MockSeats.sol\":27,\"test/mocks/Mocks.sol\":149,\"test/mocks/TestVRFCoordinator.sol\":46,\"test/utils/Base64Decode.sol\":83},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":11014,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/ArtHouse.sol:559: ArtHouse._pay(address,address,uint256) (src/ArtHouse.sol#559-566) sends eth to arbitrary user\n[high/medium] weak-prng at src/ArtifactsFactory.sol:501: ArtifactsFactory._assign(uint256,uint256) (src/ArtifactsFactory.sol#501-517) uses a weak PRNG: \"idx = uint16(word % left) (src/ArtifactsFactory.sol#506)\"\n[high/medium] reentrancy-balance at src/ArtHouse.sol:431: Reentrancy in ArtHouse._pullIMD(address,uint256) (src/ArtHouse.sol#431-436):\n[high/medium] reentrancy-eth at src/ArtifactsPiece.sol:297: Reentrancy in ArtifactsPiece.release() (src/ArtifactsPiece.sol#297-333):\n[medium/medium] divide-before-multiply at src/libs/Encoding.sol:8: Encoding.base64(bytes) (src/libs/Encoding.sol#8-37) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/ArtifactsFactory.sol:482: ArtifactsFactory.finishFallbackDraw(uint256) (src/ArtifactsFactory.sol#482-491) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ArtifactsFactory.sol:482: ArtifactsFactory.finishFallbackDraw(uint256) (src/ArtifactsFactory.sol#482-491) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ArtifactsSource.sol:197: ArtifactsSource.gateEndsAt() (src/ArtifactsSource.sol#197-199) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ArtifactsFactory.sol:494: ArtifactsFactory._hashOf(uint256) (src/ArtifactsFactory.sol#494-499) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ImdBuybackBurner.sol:136: ImdBuybackBurner.burnImd() (src/ImdBuybackBurner.sol#136-142) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ArtifactsFactory.sol:474: ArtifactsFactory._fallbackLive(uint256) (src/ArtifactsFactory.sol#474-478) uses a dangerous strict equality:\n[medium/medium] uninitialized-local at src/SubmissionReviews.sol:103: SubmissionReviews.reviewAsSeat(uint256,uint256,SubmissionReviews.Verdict,string).holder (src/SubmissionReviews.sol#103) is a local variable never initialized\n[medium/medium] uninitialized-local at src/BrokerPass.sol:85: BrokerPass.claimWithPiece(uint256).piece (src/BrokerPass.sol#85) is a local variable never initialized\n[medium/medium] uninitialized-local at src/ArtifactsPiece.sol:311: ArtifactsPiece.release().brokerShare (src/ArtifactsPiece.sol#311) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SubmissionReviews.sol:115: SubmissionReviews.reviewAsPiece(uint256,uint256,SubmissionReviews.Verdict,string).piece (src/SubmissionReviews.sol#115) is a local variable never initialized\n[medium/medium] uninitialized-local at src/ArtifactsPiece.sol:441: ArtifactsPiece._revealedURI().page (src/ArtifactsPiece.sol#441) is a local variable never initialized\n[medium/medium] unused-return at src/SubmissionReviews.sol:123: SubmissionReviews._review(uint256,uint256,SubmissionReviews.Verdict,string) (src/SubmissionReviews.sol#123-139) ignores return value by (None,None,None,status) = house.submissions(submissionId) (src/SubmissionReviews.sol#127)\n[medium/medium] unused-return at src/ArtHouse.sol:353: ArtHouse.uploadChunk(address,uint256,uint256,bytes) (src/ArtHouse.sol#353-364) ignores return value by artStorage.write(collection,pieceId,index,data) (src/ArtHouse.sol#363)\n[medium/medium] unused-return at src/SubmissionReviews.sol:160: SubmissionReviews._thesis(uint256,string) (src/SubmissionReviews.sol#160-169) ignores return value by (None,None,None,status) = house.submissions(submissionId) (src/SubmissionReviews.sol#164)\n[medium/medium] unused-return at src/ImdBuybackBurner.sol:146: ImdBuybackBurner.unlockCallback(bytes) (src/ImdBuybackBurner.sol#146-162) ignores return value by poolManager.settle{value: ethIn}() (src/ImdBuybackBurner.sol#159)\n[low/medium] missing-zero-check at src/ArtifactsSource.sol:201: ArtifactsSource.bid(address).broker (src/ArtifactsSource.sol#201) lacks a zero-check on :\n[low/medium] missing-zero-check at src/ArtifactsPiece.sol:124: ArtifactsPiece.initialize(address,address,uint256,address,Traits,address,bytes32,bytes,bool,bytes32).ciphertext_ (src/ArtifactsPiece.sol#124) lacks a zero-check on :\n[low/medium] missing-zero-check at src/ImdBuybackBurner.sol:91: ImdBuybackBurner.constructor(address,address,address,uint24,int24,address).poolHooks_ (src/ImdBuybackBurner.sol#91) lacks a zero-check on :\n[low/medium] calls-loop at src/ArtifactsFactory.sol:420: ArtifactsFactory._requestRandomness(address,uint256) (src/ArtifactsFactory.sol#420-435) has external calls inside a loop: requestId = vrfCoordinator.requestRandomWords(IVRFCoordinatorV2Plus.RandomWordsRequest({keyHash:vrfKeyHash,subId:vrfSubscriptionId,requestConfirmations:VRF_CONFIRMATIONS,callbackGasLimit:vrfCallbackGas,numWords:1,extraArgs:abi.encodeWithSelector(bytes4(keccak256(bytes)(VRF ExtraArgsV1)),vrfNativePayment)})) (src/ArtifactsFactory.sol#421-430)\n[low/medium] calls-loop at src/ArtifactsFactory.sol:420: ArtifactsFactory._requestRandomness(address,uint256) (src/ArtifactsFactory.sol#420-435) has external calls inside a loop: requestId = vrfCoordinator.requestRandomWords(IVRFCoordinatorV2Plus.RandomWordsRequest({keyHash:vrfKeyHash,subId:vrfSubscriptionId,requestConfirmations:VRF_CONFIRMATIONS,callbackGasLimit:vrfCallbackGas,numWords:1,extraArgs:abi.encodeWithSelector(bytes4(keccak256(bytes)(VRF ExtraArgsV1)),vrfNativePayment)})) (src/ArtifactsFactory.sol#421-430)\n[low/medium] calls-loop at src/ArtifactsFactory.sol:577: ArtifactsFactory._claim(uint256) (src/ArtifactsFactory.sol#577-603) has external calls inside a loop: IArtifactsPiece(piece).initialize(address(this),address(house),edition,buyer,p.traits,p.ciphertext,p.commitment,wrapped,false,viewingKeyOf[buyer]) (src/ArtifactsFactory.sol#589-601)\n[low/medium] calls-loop at src/ArtifactsFactory.sol:420: ArtifactsFactory._requestRandomness(address,uint256) (src/ArtifactsFactory.sol#420-435) has external calls inside a loop: requestId = vrfCoordinator.requestRandomWords(IVRFCoordinatorV2Plus.RandomWordsRequest({keyHash:vrfKeyHash,subId:vrfSubscriptionId,requestConfirmations:VRF_CONFIRMATIONS,callbackGasLimit:vrfCallbackGas,numWords:1,extraArgs:abi.encodeWithSelector(bytes4(keccak256(bytes)(VRF ExtraArgsV1)),vrfNativePayment)})) (src/ArtifactsFactory.sol#421-430)\n[low/medium] calls-loop at src/ArtifactsFactory.sol:541: ArtifactsFactory._postWrappedKey(uint256,bytes) (src/ArtifactsFactory.sol#541-560) has external calls inside a loop: IArtifactsPiece(piece).rewrapFor(wrapped) (src/ArtifactsFactory.sol#549)\n[low/medium] reentrancy-benign at src/ArtifactsFactory.sol:369: Reentrancy in ArtifactsFactory._buy(uint256,address) (src/ArtifactsFactory.sol#369-385):\n[low/medium] reentrancy-benign at src/ImdBuybackBurner.sol:136: Reentrancy in ImdBuybackBurner.burnImd() (src/ImdBuybackBurner.sol#136-142):\n[low/medium] reentrancy-benign at src/ImdBuybackBurner.sol:110: Reentrancy in ImdBuybackBurner.burnEth(uint256,uint256,uint256) (src/ImdBuybackBurner.sol#110-133):\n[low/medium] reentrancy-benign at src/ArtHouse.sol:237: Reentrancy in ArtHouse.createCollection(string,string,address) (src/ArtHouse.sol#237-247):\n[low/medium] reentrancy-benign at src/ArtifactsFactory.sol:420: Reentrancy in ArtifactsFactory._requestRandomness(address,uint256) (src/ArtifactsFactory.sol#420-435):\n[low/medium] reentrancy-events at src/ArtifactsFactory.sol:392: Reentrancy in ArtifactsFactory.rerequestRandomness(uint256) (src/ArtifactsFactory.sol#392-410):\n[low/medium] reentrancy-events at src/ArtifactsSource.sol:152: Reentrancy in ArtifactsSource.deliverKey(bytes) (src/ArtifactsSource.sol#152-159):\n[low/medium] reentrancy-events at src/ImdBuybackBurner.sol:136: Reentrancy in ImdBuybackBurner.burnImd() (src/ImdBuybackBurner.sol#136-142):\n[low/medium] reentrancy-events at src/ArtHouse.sol:367: Reentrancy in ArtHouse.clearPiece(address,uint256) (src/ArtHouse.sol#367-375):\n[low/medium] reentrancy-events at src/ImdBuybackBurner.sol:110: Reentrancy in ImdBuybackBurner.burnEth(uint256,uint256,uint256) (src/ImdBuybackBurner.sol#110-133):\n[low/medium] reentrancy-events at src/ArtHouse.sol:237: Reentrancy in ArtHouse.createCollection(string,string,address) (src/ArtHouse.sol#237-247):\n[low/medium] timestamp at src/ArtifactsPiece.sol:202: ArtifactsPiece.delist() (src/ArtifactsPiece.sol#202-207) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:299: ArtifactsFactory.setMintPhases(uint64,uint8,uint64,uint8) (src/ArtifactsFactory.sol#299-312) uses timestamp for comparisons\n[low/medium] timestamp at src/BrokerPass.sol:67: BrokerPass.setClaimsOpenAt(uint64) (src/BrokerPass.sol#67-73) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:237: ArtifactsFactory.endSale() (src/ArtifactsFactory.sol#237-246) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsSource.sol:228: ArtifactsSource.settle() (src/ArtifactsSource.sol#228-256) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:365: ArtifactsFactory._tokenGate() (src/ArtifactsFactory.sol#365-367) uses timestamp for comparisons\n[low/medium] timestamp at src/BrokerPass.sol:76: BrokerPass.claimsOpen() (src/BrokerPass.sol#76-78) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:279: ArtifactsFactory.setGate(address,address,uint256,uint64) (src/ArtifactsFactory.sol#279-282) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsSource.sol:197: ArtifactsSource.gateEndsAt() (src/ArtifactsSource.sol#197-199) uses timestamp for comparisons\n[low/medium] timestamp at src/ImdBuybackBurner.sol:110: ImdBuybackBurner.burnEth(uint256,uint256,uint256) (src/ImdBuybackBurner.sol#110-133) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsPiece.sol:356: ArtifactsPiece._beforeTransfer(address,address,uint256) (src/ArtifactsPiece.sol#356-364) uses timestamp for comparisons\n[low/medium] timestamp at src/base/HolderGate.sol:73: HolderGate._inGate(uint256) (src/base/HolderGate.sol#73-75) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsPiece.sol:297: ArtifactsPiece.release() (src/ArtifactsPiece.sol#297-333) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsPiece.sol:281: ArtifactsPiece.cancel() (src/ArtifactsPiece.sol#281-293) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsPiece.sol:373: ArtifactsPiece.reveal(bytes32) (src/ArtifactsPiece.sol#373-387) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:577: ArtifactsFactory._claim(uint256) (src/ArtifactsFactory.sol#577-603) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:251: ArtifactsFactory.configureVRF(address,bytes32,uint256,bool) (src/ArtifactsFactory.sol#251-262) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:219: ArtifactsFactory.setSaleOpen(bool) (src/ArtifactsFactory.sol#219-232) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:316: ArtifactsFactory.currentPhase() (src/ArtifactsFactory.sol#316-324) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsSource.sol:260: ArtifactsSource.voidUnsettled() (src/ArtifactsSource.sol#260-272) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsSource.sol:201: ArtifactsSource.bid(address) (src/ArtifactsSource.sol#201-216) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:268: ArtifactsFactory.setVRFCallbackGas(uint32) (src/ArtifactsFactory.sol#268-273) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsPiece.sol:236: ArtifactsPiece.postEscrowKey(bytes,address,uint256) (src/ArtifactsPiece.sol#236-249) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:286: ArtifactsFactory.setMemberGate(address,bytes4,uint256) (src/ArtifactsFactory.sol#286-289) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsSource.sol:165: ArtifactsSource.setAuction(uint256,uint64) (src/ArtifactsSource.sol#165-178) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:292: ArtifactsFactory.gateEndsAt() (src/ArtifactsFactory.sol#292-294) uses timestamp for comparisons","passed":true},{"durationMs":656,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/ArtCollection.sol:44: `abi.encodePacked()` Hash Collision (6 places)\n[high] contract-locks-ether at src/ArtifactsFactory.sol:13: Contract locks Ether without a withdraw function (2 places)\n[high] eth-send-unchecked-address at src/ArtifactsPiece.sol:344: ETH transferred without address checks (2 places)\n[high] reentrancy-state-change at src/ArtHouse.sol:360: Reentrancy: State change after external call (19 places)\n[low] centralization-risk at src/ArtHouse.sol:176: Centralization Risk (38 places)\n[low] costly-loop at src/ArtifactsFactory.sol:381: Costly operations inside loop (3 places)\n[low] empty-block at src/base/ERC721Lite.sol:121: Empty Block\n[low] large-numeric-literal at src/ArtHouse.sol:15: Large Numeric Literal (11 places)\n[low] literal-instead-of-constant at src/ArtifactsFactory.sol:417: Literal Instead of Constant (35 places)\n[low] require-revert-in-loop at src/ArtHouse.sol:394: Loop Contains `require`/`revert` (4 places)\n[low] state-change-without-event at src/ArtCollection.sol:20: State Change Without Event (5 places)\n[low] state-no-address-check at src/ArtifactsPiece.sol:133: Address State Variable Set Without Checks (3 places)\n[low] storage-array-length-not-cached at src/ArtifactsSource.sol:134: Storage Array Length not Cached\n[low] unchecked-return at src/ArtCollection.sol:42: Unchecked Return (5 places)\n[low] uninitialized-local-variable at src/ArtHouse.sol:394: Uninitialized Local Variable (6 places)\n[low] unsafe-erc20-operation at src/ArtHouse.sol:434: Unsafe ERC20 Operation (3 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"339f891276f4734b751d600897391d325771dc0a0a8c3855e257ed59e178b278","verifiedTreeHash":"3800c6315b97154a3894462c3ce7fee9a970edea","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":433332,"exitCode":0,"name":"build","output":"Compiling 75 files with Solc 0.8.26\nSolc 0.8.26 finished in 433.20s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> test/invariants/ArtHouseInvariant.t.sol:105:9:\n    |\n105 |         address buyer,\n    |         ^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":10922,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/BurnerFork.t.sol:BurnerForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 388.17µs (0.00ns CPU time)\n\nRan 5 tests for test/audit/KeyProofEdges.t.sol:KeyProofEdgesTest\n[PASS] test_adversarialE_isProvable() (gas: 107849)\n[PASS] test_adversarialE_proofIsActuallyChecked() (gas: 23615)\n[PASS] test_negatedSCannotFrame() (gas: 60700)\n[PASS] test_oddYWrapThatOpensIsNotFake() (gas: 37558)\n[PASS] test_xEqualsN_isMalformed() (gas: 13218)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 2.08ms (1.74ms CPU time)\n\nRan 8 tests for test/KeyProof.t.sol:KeyProofTest\n[PASS] test_aJunkKeyIsProvenFake() (gas: 369871)\nLogs:\n  gas to check a fake-key proof: 44805\n\n[PASS] test_aKeyThatOpensIsNeverProvenFake() (gas: 368087)\n[PASS] test_aProofOnlyHoldsForItsBuyerPieceAndChain() (gas: 416867)\n[PASS] test_aProofOnlyHoldsForItsOwnWrappedKey() (gas: 416275)\n[PASS] test_aTamperedProofFails() (gas: 768976)\n[PASS] test_madeUpBytesAndTheOldFormatAreFake() (gas: 690806)\n[PASS] test_theRightKeyForSomeoneElseIsProvenFake() (gas: 368314)\n[PASS] test_viewingKeys() (gas: 34725)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 5.18ms (4.25ms CPU time)\n\nRan 1 test for test/ClaimEnd.t.sol:EndBeforeOpenTest\n[PASS] test_endSale_beforeOpening_refused() (gas: 60691353)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 23.40ms (21.03ms CPU time)\n\nRan 5 tests for test/ClaimEnd.t.sol:ClaimEndTest\n[PASS] test_claimMany_claimsEveryOneInOneCall() (gas: 18006141)\n[PASS] test_claimMany_emptyRefused_andTheCuratorCanClaimForBuyers() (gas: 12215083)\n[PASS] test_claimMany_isAllOrNothing() (gas: 18060421)\n[PASS] test_endSale_isFinal() (gas: 6877701)\n[PASS] test_endSale_needsTheSaleToHaveOpened_andWorksWhileClosed() (gas: 96083)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 23.47ms (3.45ms CPU time)\n\nRan 6 tests for test/Adversarial.t.sol:PieceEdgeTest\n[PASS] test_cancelThenSecondBuyerAndRoyaltyToChangedPayout() (gas: 1088077)\n[PASS] test_listingEdges() (gas: 1003054)\n[PASS] test_releaseAtExactly72HoursByStranger() (gas: 914095)\n[PASS] test_revealNeedsTheSourceLocked_andEmptyRendererURI() (gas: 6214987)\n[PASS] test_safeTransferReceivers() (gas: 670237)\n[PASS] test_transferAuthEdges() (gas: 350213)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 26.87ms (4.27ms CPU time)\n\nRan 7 tests for test/Burner.t.sol:BurnerTest\n[PASS] test_anyoneBurnsHeldImd() (gas: 169949)\n[PASS] test_anyoneSwapsInSmallStepsAfter60QuietDays() (gas: 845755)\n[PASS] test_constructorChecks() (gas: 8711)\n[PASS] test_editionSaleToBurnedImd() (gas: 61800771)\n[PASS] test_onlyTheCuratorSwaps_withAMinimumAndADeadline() (gas: 653639)\n[PASS] test_onlyThePoolManagerCallsBack() (gas: 32189)\n[PASS] test_theNewOwnerSwapsAfterAHandover() (gas: 304000)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 31.83ms (29.06ms CPU time)\n\nRan 1 test for test/audit/KeyReuseLeak.t.sol:KeyReuseLeakTest\n[PASS] test_copiedE_cantBePosted(uint256,uint256) (runs: 64, μ: 602933, ~: 603096)\nLogs:\n  Bound result 11818044032905497069688431977092257873442291733589656922755808936709498\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 35.29ms (32.47ms CPU time)\n\nRan 6 tests for test/EscrowDeadline.t.sol:SourceEscrowDeadlineTest\n[PASS] testFuzz_postAfterDeadlineReverts(uint32) (runs: 64, μ: 367037, ~: 367037)\n[PASS] test_cancelledSaleCanBeBoughtAgain() (gas: 820699)\n[PASS] test_expiredSaleCanBeRefundedAndBoughtAgain() (gas: 940459)\n[PASS] test_postAtCancellationDeadlineReverts() (gas: 366895)\n[PASS] test_postJustBeforeDeadlinePreventsCancellation() (gas: 702323)\n[PASS] test_postOneSecondAfterDeadlineReverts() (gas: 367215)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 36.27ms (33.71ms CPU time)\n\nRan 4 tests for test/Phases.t.sol:PhasesTest\n[PASS] test_aSeatFollowsThePhases_whereverItGoes() (gas: 1747601)\n[PASS] test_afterTheWindow_anyoneUpToFive() (gas: 1042332)\n[PASS] test_capsRise_1_then_2_then_5_forAnImdHolder() (gas: 1740916)\n[PASS] test_setOnlyBeforeTheSaleOpens_andChecked() (gas: 322444)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 36.51ms (1.34ms CPU time)\n\nRan 18 tests for test/BrokerPass.t.sol:BrokerPassTest\n[PASS] test_capIs100() (gas: 19752778)\n[PASS] test_claimWithPiece_onceEverPerPiece() (gas: 6631460)\n[PASS] test_claimWithSeat_onceEverPerSeat() (gas: 376003)\n[PASS] test_claimWithTheSource() (gas: 5959629)\n[PASS] test_claimsWaitForTheStartTime_setOnceByTheCurator() (gas: 489742)\n[PASS] test_oneClaimPerWallet() (gas: 6932360)\n[PASS] test_passHolderCanBrokerTheirOwnBuy() (gas: 1022212)\n[PASS] test_passHolderEarnsOnMint_andTheRightMovesWithThePass() (gas: 2088032)\n[PASS] test_recordResaleRejectsAnythingButAPiece() (gas: 298286)\n[PASS] test_resaleBrokerShare_creditedInTheLedger() (gas: 7246633)\n[PASS] test_resaleBuyerWithAPassCanBrokerTheirOwnBuy() (gas: 7183937)\n[PASS] test_resaleFallsBackToThePieceWhenTheLedgerRefuses() (gas: 7199038)\n[PASS] test_resaleSellerCannotBeBroker() (gas: 7096477)\n[PASS] test_resaleWithoutEligibleBroker_sellerKeepsTheShare() (gas: 6885635)\n[PASS] test_setBrokerPassOnce() (gas: 64999)\n[PASS] test_sourceSplit_brokerAndArtistOnly() (gas: 6111470)\n[PASS] test_sourceSplit_noBrokerBurns() (gas: 5868911)\n[PASS] test_tokenURIIsOnChainJson() (gas: 388848)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 37.80ms (15.55ms CPU time)\n\nRan 4 tests for test/AuditRound3.t.sol:AuditRound3Test\n[PASS] test_aReturnDataBombCostsThePayerNothing() (gas: 694152)\n[PASS] test_aShareThatWaitsInTheLedgerIsAnnounced() (gas: 339919)\n[PASS] test_theArtistsPayoutCantMoveThePieceDuringARelease() (gas: 415877)\n[PASS] test_theArtistsPayoutCantRelistDuringARelease() (gas: 600564)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 41.35ms (724.57µs CPU time)\n\nRan 21 tests for test/ArtHouse.t.sol:ArtHouseTest\n[PASS] testFuzz_ethSplitInvariant(uint96,bool,bool) (runs: 64, μ: 1192097, ~: 1162488)\n[PASS] testFuzz_imdSplitInvariant(uint96,bool) (runs: 64, μ: 1307757, ~: 1298483)\n[PASS] test_artistPayoutOnlyArtist_keptOnReapproval() (gas: 179207)\n[PASS] test_collectionMintOnlyHouse() (gas: 73967)\n[PASS] test_curationFlow_andFailures() (gas: 938837)\n[PASS] test_customSplit() (gas: 1124713)\n[PASS] test_deploymentWiring() (gas: 93139)\n[PASS] test_imdBuybackIsReleasedAndBurned() (gas: 1882866)\n[PASS] test_mintFailures() (gas: 1550882)\n[PASS] test_onlyCuratorApproves() (gas: 123827)\n[PASS] test_pieceOver100KBRejected() (gas: 21310484)\n[PASS] test_recordSaleOnlyModules() (gas: 120446)\n[PASS] test_reentrancyOnWithdrawBlocked() (gas: 1838346)\n[PASS] test_revokedArtistLosesCuration() (gas: 582575)\n[PASS] test_sealNeedsEveryPieceFinalized() (gas: 527413)\n[PASS] test_setHouseOnce() (gas: 78294)\n[PASS] test_submissions() (gas: 260658)\n[PASS] test_tokenURIOnChain() (gas: 1190981)\n[PASS] test_twoStepOwnership_noRenounce() (gas: 198046)\n[PASS] test_withdrawNothingReverts_andHouseGoesToCurrentOwner() (gas: 1241987)\n[PASS] test_wrongHashIsCorrectable() (gas: 777075)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 69.04ms (72.93ms CPU time)\n\nRan 11 tests for test/Reviews.t.sol:ReviewsTest\n[PASS] testFuzz_tallyMatchesVoices(uint8[12]) (runs: 64, μ: 1436811, ~: 1441101)\n[PASS] test_aClaimedPieceIsAVoice_andAnUnclaimedOneIsNot() (gas: 67573205)\n[PASS] test_aMovedSeatStillHasOneVoice() (gas: 441792)\n[PASS] test_aSeatAndAPieceInOneWalletAreTwoVoices() (gas: 67297937)\n[PASS] test_anyoneAppliesToBeABroker() (gas: 224553)\n[PASS] test_anyonePublishesTheses() (gas: 810776)\n[PASS] test_changingAReviewMovesItsVote() (gas: 305393)\n[PASS] test_frozenOnceTheCuratorDecides_andAdvisoryOnly() (gas: 349039)\n[PASS] test_inputChecks() (gas: 307196)\n[PASS] test_onlyTheSeatHolderReviews() (gas: 97570)\n[PASS] test_seatsReview_andTheTallyFollows() (gas: 457095)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 67.56ms (83.83ms CPU time)\n\nRan 6 tests for test/EscrowDeadline.t.sol:EditionEscrowDeadlineTest\n[PASS] testFuzz_postAfterDeadlineReverts(uint32) (runs: 64, μ: 367100, ~: 367100)\n[PASS] test_cancelledSaleCanBeBoughtAgain() (gas: 780559)\n[PASS] test_expiredSaleCanBeRefundedAndBoughtAgain() (gas: 900319)\n[PASS] test_postAtCancellationDeadlineReverts() (gas: 366958)\n[PASS] test_postJustBeforeDeadlinePreventsCancellation() (gas: 662150)\n[PASS] test_postOneSecondAfterDeadlineReverts() (gas: 367278)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 82.72ms (47.95ms CPU time)\n\nRan 10 tests for test/Artifacts.t.sol:ArtifactsPieceEscrowTest\n[PASS] test_escrowCancelBeforeKey_andDelist() (gas: 501042)\n[PASS] test_escrowHappyPath_buyerConfirms() (gas: 1181933)\n[PASS] test_escrowKeyMustNotBeEmpty() (gas: 311000)\n[PASS] test_escrowTimeoutRelease() (gas: 729073)\n[PASS] test_pieceViewingKeyZeroRejected() (gas: 168689)\n[PASS] test_plainTransferClearsKey_previousOwnerRekeys() (gas: 506819)\n[PASS] test_reentrancyOnEscrowWithdrawBlocked() (gas: 844317)\n[PASS] test_rewrapIsOneShotAndNonEmpty() (gas: 284134)\n[PASS] test_sellerCannotOverwriteKeyAfterRelease() (gas: 913380)\n[PASS] test_sourceOnlyReveal() (gas: 35552)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 60.89ms (3.22ms CPU time)\n\nRan 3 tests for test/Adversarial.t.sol:RuntimeTest\n[PASS] test_implementationsAreLocked() (gas: 104926)\n[PASS] test_launchedRuntimesAreBoundedAndHaveNoEscapeOpcodes() (gas: 60145375)\n[PASS] test_noRenounceAnywhere() (gas: 155507)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 84.08ms (81.35ms CPU time)\n\nRan 21 tests for test/EdgeProbes.t.sol:EdgeProbesTest\n[PASS] testFuzz_raiseRule_exactThreshold(uint256,uint256) (runs: 512, μ: 596850, ~: 596778)\nLogs:\n  Bound result 10362559951093511699\n  Bound result 691753520077718667246434098\n\n[PASS] test_bidBeforeOpen_andBelowReserve() (gas: 448793)\n[PASS] test_claimWithPiece_idsOutsideTheCollection() (gas: 245236)\n[PASS] test_deliverKey_beforeSettle_reverts() (gas: 37752)\n[PASS] test_dustRaise_oneWei() (gas: 582475)\n[PASS] test_extension_atExactBoundaries() (gas: 5937043)\n[PASS] test_ledger_withdrawAndRelease_failurePaths() (gas: 528986)\n[PASS] test_mint_failurePaths_andOneMintPerPiece() (gas: 2298970)\n[PASS] test_pieceByteCap_exactBoundary() (gas: 22844864)\n[PASS] test_plainCollection_curationFailurePaths() (gas: 1645904)\n[PASS] test_review_failurePaths() (gas: 418024)\n[PASS] test_review_noteLength_boundary() (gas: 444355)\n[PASS] test_reviewsOf_pagination_edges() (gas: 621035)\n[PASS] test_setAuction_failurePaths() (gas: 453489)\n[PASS] test_setClaimsOpenAt_bounds() (gas: 458468)\n[PASS] test_setClaimsOpenAt_followsFactoryOwner() (gas: 208272)\n[PASS] test_setClaimsOpenAt_pastOpensNow() (gas: 68589)\n[PASS] test_setGate_lockedAfterFirstBid() (gas: 525728)\n[PASS] test_settle_failurePaths() (gas: 6060584)\n[PASS] test_thesis_lengthBounds_andDecline() (gas: 833737)\n[PASS] test_voidUnsettled_graceBoundary_thenReopen() (gas: 6190101)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 97.00ms (100.78ms CPU time)\n\nRan 1 test for test/fork/VrfFork.t.sol:VrfForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 748.92µs (0.00ns CPU time)\n\nRan 7 tests for test/Adversarial.t.sol:SourceEdgeTest\n[PASS] testFuzz_minimumRaiseIsCeilingOfFivePercent(uint96,uint96) (runs: 512, μ: 629577, ~: 629679)\nLogs:\n  Bound result 10368531\n  Bound result 455321846994\n\n[PASS] testFuzz_rendererHashIsKeccakOfConcatenation(bytes,bytes,bytes) (runs: 64, μ: 417784, ~: 413978)\n[PASS] test_bidBoundaries() (gas: 901651)\n[PASS] test_payloadChunkLimits() (gas: 5443288)\n[PASS] test_setAuctionEdges() (gas: 459334)\n[PASS] test_settleEdges_brokerSplit() (gas: 6915419)\n[PASS] test_settleWithUnapprovedBrokerPaysTheBurn() (gas: 5818742)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 134.58ms (133.49ms CPU time)\n\nRan 15 tests for test/LaunchAudit.t.sol:LaunchAuditTest\n[PASS] testFuzz_memberReplyMustBeExactlyOneWord(uint16,uint256,uint256) (runs: 64, μ: 436310, ~: 434920)\nLogs:\n  Bound result 925000000000000000\n\n[PASS] test_attackerCannotInitializeCollectionAsRealHouse() (gas: 1082634)\n[PASS] test_attackerCannotInitializePieceAsRealFactory() (gas: 4983454)\n[PASS] test_attackerCannotInitializePieceAsRealSource() (gas: 4973750)\n[PASS] test_brokenBrokerPassDoesNotBlockEditionPurchase() (gas: 61675694)\n[PASS] test_brokenBrokerPassDoesNotBlockSourceSettlement() (gas: 19380521)\n[PASS] test_brokenPassDoesNotBlockPlainMintsInEitherCurrency() (gas: 2535075)\n[PASS] test_brokerPassMalformedRepliesCountAsIneligible() (gas: 934454)\n[PASS] test_claimedEditionsAreIndependentRuntimesAndStorage() (gas: 103403242)\n[PASS] test_dynamicMemberReplyCannotBypassEditionWindow() (gas: 61590217)\n[PASS] test_dynamicMemberReplyCannotBypassSourceWindow() (gas: 676729)\n[PASS] test_initializerRejectsEOAController() (gas: 6035471)\n[PASS] test_keyPostEventUnchangedBeforeAndAfterClaim() (gas: 67214905)\n[PASS] test_ownerCanClosePrimarySaleAndChangePendingAuctionSplit() (gas: 73113059)\n[PASS] test_plainCollectionIsIndependentRuntime() (gas: 4127353)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 170.30ms (183.94ms CPU time)\n\nRan 2 tests for test/LaunchDeployment.t.sol:LaunchDeploymentTest\n[PASS] test_allEightConstructorsAcceptCodeLessDependencies() (gas: 75014953)\n[PASS] test_manifestOrderAndOwnerConfigurationRemainIntact() (gas: 81642215)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 177.79ms (197.34ms CPU time)\n\nRan 1 test for test/EdgeProbes.t.sol:SourceVoidInvariantTest\n[PASS]\nSourceVoidInvariantTest invariants:\n[PASS] invariant_holdsExactlyWhatItOwes\n[PASS] invariant_settlementIsFinalAndSingle\n SourceVoidInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭-------------------+----------------+-------+---------+----------╮\n| Contract          | Selector       | Calls | Reverts | Discards |\n+=================================================================+\n| SourceVoidHandler | bid            | 1035  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SourceVoidHandler | reopen         | 1036  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SourceVoidHandler | settle         | 1014  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SourceVoidHandler | voidUnsettled  | 1007  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SourceVoidHandler | warp           | 1033  | 0       | 0        |\n|-------------------+----------------+-------+---------+----------|\n| SourceVoidHandler | withdrawRefund | 1019  | 0       | 0        |\n╰-------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 14224\n  Bound result 22000\n  Bound result 118330\n  Bound result 3157198687268939155\n  Bound result 89934\n  Bound result 3154\n  Bound result 7721025198361401722\n  Bound result 2511\n  Bound result 12121025198361401724\n  Bound result 41\n  Bound result 3603\n  Bound result 3374607431768211456\n  Bound result 151451\n  Bound result 79268\n  Bound result 4010879412705960511\n  Bound result 9698\n  Bound result 384000\n  Bound result 275475\n  Bound result 641837\n  Bound result 4996246591618198496\n  Bound result 450000000000000000\n  Bound result 6400\n  Bound result 31337\n  Bound result 8808857693383575074\n  Bound result 1632172736091742818\n  Bound result 19200\n  Bound result 8211846308696627067\n  Bound result 93836\n  Bound result 172800\n  Bound result 124011\n  Bound result 571\n  Bound result 6627\n  Bound result 1007\n  Bound result 7562\n  Bound result 8311\n  Bound result 2\n  Bound result 78\n  Bound result 1\n  Bound result 12727076458279521813\n  Bound result 19978\n  Bound result 8904335757337482424\n  Bound result 178860\n  Bound result 11674\n  Bound result 5163141518161494337\n  Bound result 230\n  Bound result 1084\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 687.84ms (684.80ms CPU time)\n\nRan 11 tests for test/ReviewRound4.t.sol:ReviewRound4Test\n[PASS] testFuzz_gateViewsNeverRevert(address,address,address) (runs: 64, μ: 147446, ~: 147548)\n[PASS] testFuzz_theFallbackResultStandsAgainstAnyLateWord(uint256,bytes32) (runs: 64, μ: 61602091, ~: 61602044)\n[PASS] test_aDeadFallbackDrawCanBeRerequested() (gas: 62342387)\n[PASS] test_aLiveFallbackDrawStillCannotBeRerequested() (gas: 61855098)\n[PASS] test_gateSeats_dirtyOwnerWord_isNotHeld() (gas: 61073739)\n[PASS] test_gateSeats_noCode_isNotHeld() (gas: 61538697)\n[PASS] test_gateSeats_withCode_unchanged() (gas: 61870940)\n[PASS] test_gateToken_noCode_isNotHeld_andMembersStillBuy() (gas: 62065872)\n[PASS] test_noChainlinkAnswerOnceTheFallbackHashIsPublic() (gas: 61639787)\n[PASS] test_noFallbackOnARequestChainlinkMayStillAnswer() (gas: 61638100)\n[PASS] test_source_gateNoCode_bidsRefusedNotReverted_membersBid() (gas: 998508)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 832.57ms (1.00s CPU time)\n\nRan 12 tests for test/Source.t.sol:ArtifactsSourceTest\n[PASS] testFuzz_revealOpensTheSealedSeed(bytes32,bytes32) (runs: 64, μ: 5843086, ~: 5843172)\n[PASS] test_auctionNeedsTheHouseToAcceptTheSale() (gas: 3285282)\n[PASS] test_auctionNeedsTheSourceLocked() (gas: 620659)\n[PASS] test_auctionReopensWhenNoBids() (gas: 441150)\n[PASS] test_auctionRules() (gas: 6681882)\n[PASS] test_bidReentrancyAndRefundPull() (gas: 767944)\n[PASS] test_deliverKeyOnceToTheWinner() (gas: 9191286)\n[PASS] test_noRevealWhileABuyerIsInEscrow() (gas: 8961688)\n[PASS] test_revealServesTheRendererWithItsSeed() (gas: 512439761)\nLogs:\n  revealed tokenURI gas: 2897251\n\n[PASS] test_revealTakesDownAListingWithNoBuyer() (gas: 8893098)\n[PASS] test_storedSeedIsSealed() (gas: 8683528)\n[PASS] test_tinyBidsMustStrictlyExceed() (gas: 940816)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 838.48ms (833.47ms CPU time)\n\nRan 5 tests for test/invariants/BuybackConservation.t.sol:BuybackConservationTest\n[PASS]\nBuybackConservationTest invariants:\n[PASS] invariant_ethGoesOnlyToPool\n[PASS] invariant_imdGoesOnlyToBurnDestination\n BuybackConservationTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭----------------------------+----------------------+-------+---------+----------╮\n| Contract                   | Selector             | Calls | Reverts | Discards |\n+================================================================================+\n| BuybackConservationHandler | advanceTime          | 679   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | burnIMD              | 679   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | curatorSwap          | 686   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | donateETH            | 639   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | donateIMD            | 724   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | handover             | 713   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | publicSwap           | 671   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | rejectedSwap         | 685   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | unauthorizedCallback | 668   | 0       | 0        |\n╰----------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 1500000000000000000\n  Bound result 6729\n  Bound result 26\n\n[PASS] testFuzz_fundingBurnRoundTrip(uint96,uint96) (runs: 1000, μ: 645484, ~: 645531)\nLogs:\n  Bound result 4264337593543950335\n  Bound result 62514264337593543950335\n\n[PASS] test_failedCuratorSwapDoesNotPostponePublicLiveness() (gas: 896798)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 3\n\n[PASS] test_oneWeiSwapAndDirectBurnConserveFunds() (gas: 603515)\nLogs:\n  Bound result 1\n  Bound result 1\n\n[PASS] test_publicSwapDrainsRemainderBelowTheDailyCap() (gas: 334842)\nLogs:\n  Bound result 1\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 875.94ms (1.01s CPU time)\n\nRan 25 tests for test/NothingStuck.t.sol:NothingStuckTest\n[PASS] test_aBuyerNeedsAViewingKeyAProofCanUse() (gas: 67149597)\n[PASS] test_aJunkKeyIsProvenFake_paymentAndDepositToTheBuyer() (gas: 67733962)\n[PASS] test_aSilentSellerLetsTheBuyerCancelAfter24Hours() (gas: 67321054)\n[PASS] test_anAuctionClosedInTimeCannotBeVoided() (gas: 5795810)\n[PASS] test_anAuctionNobodyCanCloseGivesTheBidBack() (gas: 6083672)\n[PASS] test_callbackGasCanOnlyGoUpOnceTheSaleOpens() (gas: 60960821)\n[PASS] test_claimWithoutAKey_after30Days_thenTheKeyGoesIntoThePiece() (gas: 67101500)\n[PASS] test_curatorReKeysAPieceItsPreviousOwnerNeverDid() (gas: 67257656)\n[PASS] test_fallbackDraw_aStartedDrawsResultStands_finishedFromTheHistory() (gas: 61896434)\n[PASS] test_fallbackDraw_chainlinkStillWinsIfItAnswersFirst() (gas: 61650523)\n[PASS] test_fallbackDraw_countsFromThePurchase() (gas: 61827139)\n[PASS] test_fallbackDraw_oneAtATime() (gas: 62775290)\n[PASS] test_fallbackDraw_onlyAfterThreeDays_fromABlockNobodyKnew() (gas: 61810020)\n[PASS] test_fallbackDraw_startsAgainOnlyOnceItsHashIsGone() (gas: 61653096)\n[PASS] test_fallbackDraw_startsOnAYoungRequestTheCoordinatorNoLongerHolds() (gas: 61625047)\n[PASS] test_noProofBeforeAKey_andTheSellerCantDodgeOne() (gas: 67681280)\n[PASS] test_onlyAKeyTheSellerMadeCanBePosted() (gas: 67743337)\n[PASS] test_realKeys_aJunkKeyIsProvenFake() (gas: 907004)\nLogs:\n  gas for the buyer's proveFakeKey: 170130\n\n[PASS] test_realKeys_anHonestKeyCanNeverBeProvenFake() (gas: 1254824)\n[PASS] test_realKeys_theBuyerCantSwapViewingKeysToFrameTheSeller() (gas: 887941)\n[PASS] test_realKeys_theRightKeyWrappedToAnotherKeyIsFake() (gas: 894622)\n[PASS] test_the72HoursCountFromTheKey() (gas: 67742493)\n[PASS] test_theBuyerCantCancelUnderAPendingKey() (gas: 67517486)\n[PASS] test_theDepositIsExactly10Percent() (gas: 67621950)\n[PASS] test_theSellerCanRefundBeforeSendingAKey() (gas: 67428489)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 1.11s (371.91ms CPU time)\n\nRan 1 test for test/invariants/SourceAuctionInvariant.t.sol:SourceAuctionInvariantTest\n[PASS]\nSourceAuctionInvariantTest invariants:\n[PASS] invariant_auctionConservation\n[PASS] invariant_highBidMonotone\n[PASS] invariant_settlementIsFinal\n SourceAuctionInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭----------------+--------------------+-------+---------+----------╮\n| Contract       | Selector           | Calls | Reverts | Discards |\n+==================================================================+\n| AuctionHandler | bid                | 856   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | payloadStaysLocked | 800   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | recordHigh         | 799   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | setAuction         | 788   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | settle             | 876   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | warp               | 846   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | withdrawRefund     | 795   | 0       | 0        |\n╰----------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1566\n  Bound result 36\n  Bound result 10029\n  Bound result 4660\n  Bound result 80\n  Bound result 793\n  Bound result 5596\n  Bound result 6400\n  Bound result 800\n  Bound result 1800\n  Bound result 255\n  Bound result 33\n  Bound result 4366791704086718184\n  Bound result 2000000003894677768\n  Bound result 477\n  Bound result 649\n  Bound result 1386\n  Bound result 283\n  Bound result 1733\n  Bound result 1341\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.01s (1.00s CPU time)\n\nRan 12 tests for test/Gate.t.sol:GateTest\n[PASS] test_aHostileMembershipContractCountsAsNotMember() (gas: 62498695)\n[PASS] test_auction_gateFixedFromTheFirstBid() (gas: 714509)\n[PASS] test_auction_holdersFirstThenAnyone() (gas: 948469)\n[PASS] test_auction_membersBid_andTheMemberGateIsFixedFromTheFirstBid() (gas: 1006851)\n[PASS] test_brokenSeatContractCountsAsNotHeld() (gas: 61030979)\n[PASS] test_editions_gateFixedOnceTheSaleOpens() (gas: 61529270)\n[PASS] test_editions_holdersFirstThenAnyone() (gas: 62031088)\n[PASS] test_editions_membersBuyInTheWindow_asTokenHoldersDo() (gas: 62059353)\n[PASS] test_editions_noGateMeansOpen() (gas: 61274007)\n[PASS] test_editions_seatBuysUpToFivePerSeatWhereverItGoes() (gas: 62695785)\n[PASS] test_gateRules() (gas: 239527)\n[PASS] test_memberGateRules() (gas: 61261926)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 1.20s (143.17ms CPU time)\n\nRan 16 tests for test/Artifacts.t.sol:ArtifactsFactoryTest\n[PASS] test_buyFailures() (gas: 60997239)\n[PASS] test_buyMany_cannotPassSupply() (gas: 98935498)\n[PASS] test_buyMany_fivePerWallet() (gas: 63860710)\n[PASS] test_buyRecordsSaleAndAssignsEveryEditionOnce() (gas: 178065420)\n[PASS] test_claimFlow_andFailures() (gas: 67407363)\n[PASS] test_postWrappedKeysInOneBatch() (gas: 67705114)\n[PASS] test_publishAndLock_accessAndFailures() (gas: 60947985)\n[PASS] test_rerequestAtOnceWhenTheCoordinatorAnsweredButTheCallbackFailed() (gas: 61875354)\n[PASS] test_rerequestRandomnessAfterDroppedRequest() (gas: 62033982)\n[PASS] test_saleControl() (gas: 61043179)\n[PASS] test_sealTokenURIMatchesR8Frame() (gas: 970363405)\n[PASS] test_viewingKeyZeroRejected() (gas: 33301)\n[PASS] test_vrfCallbackCannotBeReplayed() (gas: 61629805)\n[PASS] test_vrfCallbackGasIsTheCuratorsToTune() (gas: 61431482)\n[PASS] test_vrfCorrectableUntilTheSaleOpens_thenLockedForever() (gas: 62248774)\n[PASS] test_vrfMustBeConfiguredBeforeSelling() (gas: 46850)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 1.48s (1.79s CPU time)\n\nRan 1 test for test/invariants/PieceEscrowInvariant.t.sol:PieceEscrowInvariantTest\n[PASS]\nPieceEscrowInvariantTest invariants:\n[PASS] invariant_escrowConservation\n[PASS] invariant_escrowSellerOwns\n[PASS] invariant_royaltyAndIdentity\n[PASS] invariant_singleToken\n PieceEscrowInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭---------------+--------------------+-------+---------+----------╮\n| Contract      | Selector           | Calls | Reverts | Discards |\n+=================================================================+\n| EscrowHandler | approveAndTransfer | 372   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | buy                | 368   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | cancel             | 383   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | delist             | 408   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | list               | 400   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | postKey            | 384   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | proveFake          | 392   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | refundBuyer        | 376   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | registerKey        | 337   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | release            | 372   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | rewrap             | 391   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | transfer           | 382   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | warp               | 380   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | withdraw           | 404   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | withdrawRoyalty    | 411   | 0       | 0        |\n╰---------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 171443\n  Bound result 29\n  Bound result 21001\n  Bound result 10000\n  Bound result 9474\n  Bound result 9045\n  Bound result 24782783692649250087\n  Bound result 41\n  Bound result 17521\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.71s (1.65s CPU time)\n\nRan 1 test for test/invariants/ArtifactsFactoryInvariant.t.sol:ArtifactsFactoryInvariantTest\n[PASS]\nArtifactsFactoryInvariantTest invariants:\n[PASS] invariant_claimedPiecesBelongToBuyers\n[PASS] invariant_counts\n[PASS] invariant_ledgerHoldsEveryPurchase\n[PASS] invariant_lockedAndPriced\n[PASS] invariant_walletLimit\n ArtifactsFactoryInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| FactoryHandler | buy               | 551   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | buyMany           | 483   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | claim             | 510   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | fulfil            | 549   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | lockedForever     | 504   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | replay            | 510   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | rerequest         | 552   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | setPrice          | 513   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | strangerFulfil    | 543   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | strangerRerequest | 520   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | toggleSale        | 525   | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 2\n  Bound result 3375794026\n  Bound result 5\n  Bound result 6\n  Bound result 8893983141532395648\n  Bound result 0\n  Bound result 4264337593543950335\n  Bound result 4264337593543950335\n  Bound result 1\n  Bound result 1\n  Bound result 17004\n  Bound result 4264337593543950333\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.85s (1.81s CPU time)\n\nRan 3 tests for test/invariants/FallbackDrawInvariant.t.sol:FallbackDrawInvariantTest\n[PASS]\nFallbackDrawInvariantTest invariants:\n[PASS] invariant_everyPurchaseOneEdition\n[PASS] invariant_oneFallbackAtATime\n[PASS] invariant_paymentsUntouched\n[PASS] invariant_retiredIdsStayDead\n FallbackDrawInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+------------------------+-------+---------+----------╮\n| Contract            | Selector               | Calls | Reverts | Discards |\n+===========================================================================+\n| FallbackDrawHandler | answer                 | 641   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | buy                    | 590   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | failedCallback         | 615   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | finishFallback         | 613   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | finishSettledOrRetired | 607   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | lateAnswerToRetired    | 576   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | rerequest              | 613   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | roll                   | 638   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | startFallback          | 588   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | strangerRerequest      | 663   | 0       | 0        |\n╰---------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 3\n  Bound result 33\n  Bound result 4\n  Bound result 3\n  Bound result 4\n  Bound result 1\n  Bound result 15\n  Bound result 0\n  Bound result 1\n  Bound result 2\n  Bound result 2\n  Bound result 17\n\n[PASS] test_deadFallbackIsClearedByARerequest() (gas: 1953077)\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 0\n\n[PASS] test_fallbackRouteIsReachable() (gas: 1625757)\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.10s (3.07s CPU time)\n\nRan 1 test for test/invariants/ArtHouseInvariant.t.sol:ArtHouseInvariantTest\n[PASS]\nArtHouseInvariantTest invariants:\n[PASS] invariant_constants\n[PASS] invariant_ethConservation\n[PASS] invariant_imdConservation\n[PASS] invariant_noOverWithdrawal\n[PASS] invariant_supplyAndSeal\n ArtHouseInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| LedgerHandler | handOver       | 389   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | mintETH        | 368   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | mintIMD        | 362   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | moduleSale     | 409   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | releaseBuyback | 427   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setBroker      | 415   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setPayout      | 401   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setPrices      | 373   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setSaleOpen    | 387   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setSplit       | 430   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | strangerCalls  | 400   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | withdraw       | 391   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | withdrawHouse  | 368   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1500000000000000000\n  Bound result 15572\n  Bound result 95\n  Bound result 3017\n  Bound result 43\n  Bound result 49152\n  Bound result 33\n  Bound result 5727\n  Bound result 85\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.51s (3.50s CPU time)\n\nRan 4 tests for test/invariants/BrokerClaimsInvariant.t.sol:BrokerClaimsInvariantTest\n[PASS]\nBrokerClaimsInvariantTest invariants:\n[PASS] invariant_claimHistorySurvivesTransfers\n[PASS] invariant_ownershipBalancesAndBrokerRightsAgree\n BrokerClaimsInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+------------------+-------+---------+----------╮\n| Contract            | Selector         | Calls | Reverts | Discards |\n+=====================================================================+\n| BrokerClaimsHandler | advanceTime      | 838   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | claimPiece       | 912   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | claimSeat        | 878   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | movePass         | 899   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | movePiece        | 940   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | moveSeat         | 859   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | rejectedTransfer | 818   | 0       | 0        |\n╰---------------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 166400\n  Bound result 31337\n  Bound result 50660\n  Bound result 120331\n  Bound result 166400\n  Bound result 168660\n\n[PASS] test_seatAndPassTransfersDoNotResetEitherClaimLimit() (gas: 1553655)\n[PASS] test_sourceClaimAlsoConsumesTheWalletsSeatEntitlement() (gas: 1137627)\n[PASS] test_startIsInclusiveAndClosedClaimsLeaveNoHistory() (gas: 1893855)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.06s (4.00s CPU time)\n\nRan 3 tests for test/invariants/ReviewHistoryInvariant.t.sol:ReviewHistoryInvariantTest\n[PASS]\nReviewHistoryInvariantTest invariants:\n[PASS] invariant_pagesKeepFirstReviewOrderAndLatestContents\n[PASS] invariant_thesisCountsDistinctAuthorsWithoutGrantingBrokerPowers\n[PASS] invariant_votesArePerCredentialAndFinalDecisionsFreezeRecords\n ReviewHistoryInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭----------------------+---------------+-------+---------+----------╮\n| Contract             | Selector      | Calls | Reverts | Discards |\n+===================================================================+\n| ReviewHistoryHandler | advanceTime   | 1096  | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | decide        | 1077  | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | invalidReview | 974   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | moveSeat      | 986   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | review        | 996   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | thesis        | 1015  | 0       | 0        |\n╰----------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2000\n  Bound result 27\n  Bound result 408000\n  Bound result 21079\n  Bound result 224\n  Bound result 4776\n  Bound result 2526\n  Bound result 839460\n  Bound result 50000\n  Bound result 352\n  Bound result 9740\n  Bound result 8026\n\n[PASS] test_finalDecisionsFreezeOldAndNewHolderReviews() (gas: 1951545)\n[PASS] test_transferredSeatEditsOneExistingVoiceInPlace() (gas: 1175361)\nLogs:\n  Bound result 1\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 5.95s (5.95s CPU time)\n\nRan 13 tests for test/Adversarial.t.sol:ArtifactsEdgeTest\n[PASS] testFuzz_anyWordsAssignDistinctEditions(uint256[8]) (runs: 256, μ: 64664291, ~: 64666917)\n[PASS] testFuzz_sealFramesAnyTraits(uint8,uint8,uint8,uint8,uint8) (runs: 16, μ: 519750954, ~: 519749233)\nLogs:\n  Bound result 3\n\n[PASS] test_buyRevertsAtomicallyWhenCoordinatorReverts() (gas: 59197366)\n[PASS] test_callbackWithNoWordsReverts() (gas: 61551984)\n[PASS] test_claimedPieceIsAFullCopyOfTheImplementation() (gas: 67197423)\n[PASS] test_configureVRFRejectsZeroes() (gas: 211437)\n[PASS] test_duplicateRequestIdRejected() (gas: 59391685)\n[PASS] test_nonOwnerCannotRunTheSale() (gas: 60818098)\n[PASS] test_rerequestIsAtomicWhenCoordinatorReverts() (gas: 59885766)\n[PASS] test_rerequestWindowBoundaryAndChaining() (gas: 67773076)\n[PASS] test_setPieceEdges() (gas: 61051490)\n[PASS] test_unapprovedBuyerAsBrokerEarnsNothing_andOneWeiPriceWorks() (gas: 61489495)\n[PASS] test_wrappedKeyEdges() (gas: 67181302)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 10.78s (12.05s CPU time)\n\nRan 23 tests for test/Adversarial.t.sol:ArtHouseEdgeTest\n[PASS] testFuzz_everyoneWithdrawsExactlyTheirShare(uint96,uint96,uint96) (runs: 256, μ: 2047937, ~: 2051385)\nLogs:\n  Bound result 12590441983\n  Bound result 52789833680220852523\n  Bound result 95\n\n[PASS] testFuzz_splitConservesAndHouseTakesRounding(uint16,uint16,uint16,uint96,uint8) (runs: 512, μ: 262364, ~: 263246)\nLogs:\n  Bound result 5528\n  Bound result 36\n  Bound result 92\n  Bound result 13623317\n\n[PASS] test_artistEdges() (gas: 1210240)\n[PASS] test_buybackOnlyToTheBurnerSetOnce() (gas: 460935)\n[PASS] test_clearThenReuploadKeepsSizeAccounting() (gas: 40763894)\n[PASS] test_collectionErc721Edges() (gas: 1436052)\n[PASS] test_constructorsDoNotCallDependencies() (gas: 36654)\n[PASS] test_constructorsRejectZeroDependencies() (gas: 4550)\n[PASS] test_curationEdges() (gas: 780836)\n[PASS] test_defaultSplit_agentHouseBurn() (gas: 381579)\n[PASS] test_mintWithIMD_falseReturnRejected() (gas: 2073855)\n[PASS] test_mintWithIMD_feeOnTransferRejected() (gas: 2297085)\n[PASS] test_mintWithIMD_stalePriceRejected() (gas: 1250853)\n[PASS] test_mintZeroPricesReject() (gas: 943137)\n[PASS] test_moduleCollectionsHaveNoPlainCuration() (gas: 376256)\n[PASS] test_pendingOwnerHasNoPowerBeforeAccepting() (gas: 197527)\n[PASS] test_registerModuleCollectionTwiceReverts() (gas: 44789)\n[PASS] test_revokedBrokerKeepsEarnedBalance_butEarnsNoMore() (gas: 1291624)\n[PASS] test_sealEmptyCollectionRevertsAndSealIsOnce() (gas: 657864)\n[PASS] test_splitExtremes() (gas: 1284500)\n[PASS] test_submissionEdges() (gas: 246348)\n[PASS] test_updatePieceAccessEdges() (gas: 1976561)\n[PASS] test_withdrawToRevertingPayoutKeepsBalance() (gas: 1372032)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 10.78s (10.86s CPU time)\n\nRan 38 test suites in 10.79s (51.04s CPU time): 293 tests passed, 0 failed, 2 skipped (295 total tests)\n","passed":true},{"durationMs":154,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ArtCollection.approve(address,uint256)\",\"ArtCollection.initialize(address,string,string)\",\"ArtCollection.mint(address,uint256)\",\"ArtCollection.safeTransferFrom(address,address,uint256)\",\"ArtCollection.safeTransferFrom(address,address,uint256,bytes)\",\"ArtCollection.setApprovalForAll(address,bool)\",\"ArtCollection.transferFrom(address,address,uint256)\",\"ArtHouse.acceptOwnership()\",\"ArtHouse.approveArtist(address,string)\",\"ArtHouse.clearPiece(address,uint256)\",\"ArtHouse.createCollection(string,string,address)\",\"ArtHouse.decideSubmission(uint256,bool)\",\"ArtHouse.finalizePiece(address,uint256)\",\"ArtHouse.mint(address,uint256,address)\",\"ArtHouse.mintWithIMD(address,uint256,address,uint256)\",\"ArtHouse.recordResale(address,uint256,uint256)\",\"ArtHouse.recordSale(address,address,address)\",\"ArtHouse.registerModuleCollection(address,address)\",\"ArtHouse.registerPiece(address,uint256,bytes32,string,string)\",\"ArtHouse.releaseBuyback(address)\",\"ArtHouse.revokeArtist(address)\",\"ArtHouse.sealCollection(address)\",\"ArtHouse.setBroker(address,bool)\",\"ArtHouse.setBrokerPass(address)\",\"ArtHouse.setBuybackBurner(address)\",\"ArtHouse.setPayout(address)\",\"ArtHouse.setPrices(address,uint256,uint256)\",\"ArtHouse.setSaleModule(address,bool)\",\"ArtHouse.setSaleOpen(address,bool)\",\"ArtHouse.setSplit(address,uint16,uint16,uint16,uint16)\",\"ArtHouse.submit(bytes32,string)\",\"ArtHouse.transferOwnership(address)\",\"ArtHouse.updatePiece(address,uint256,bytes32,string,string)\",\"ArtHouse.uploadChunk(address,uint256,uint256,bytes)\",\"ArtHouse.withdraw(address)\",\"ArtHouse.withdrawHouse(address)\",\"ArtStorage.acceptOwnership()\",\"ArtStorage.clear(address,uint256)\",\"ArtStorage.setHouse(address)\",\"ArtStorage.transferOwnership(address)\",\"ArtStorage.write(address,uint256,uint256,bytes)\",\"ArtifactsFactory.acceptOwnership()\",\"ArtifactsFactory.buy(address)\",\"ArtifactsFactory.buyMany(uint256,address)\",\"ArtifactsFactory.buyWithSeat(uint256,uint256,address)\",\"ArtifactsFactory.claim(uint256)\",\"ArtifactsFactory.claimMany(uint256[])\",\"ArtifactsFactory.configureVRF(address,bytes32,uint256,bool)\",\"ArtifactsFactory.endSale()\",\"ArtifactsFactory.finishFallbackDraw(uint256)\",\"ArtifactsFactory.lock()\",\"ArtifactsFactory.postWrappedKey(uint256,bytes)\",\"ArtifactsFactory.postWrappedKeys(uint256[],bytes[])\",\"ArtifactsFactory.rawFulfillRandomWords(uint256,uint256[])\",\"ArtifactsFactory.registerViewingKey(bytes32)\",\"ArtifactsFactory.rerequestRandomness(uint256)\",\"ArtifactsFactory.setGate(address,address,uint256,uint64)\",\"ArtifactsFactory.setMemberGate(address,bytes4,uint256)\",\"ArtifactsFactory.setMintPhases(uint64,uint8,uint64,uint8)\",\"ArtifactsFactory.setPiece(uint256,(string,string,uint8,string),bytes,bytes32)\",\"ArtifactsFactory.setPrice(uint256)\",\"ArtifactsFactory.setSaleOpen(bool)\",\"ArtifactsFactory.setVRFCallbackGas(uint32)\",\"ArtifactsFactory.startFallbackDraw(uint256)\",\"ArtifactsFactory.transferOwnership(address)\",\"ArtifactsPiece.approve(address,uint256)\",\"ArtifactsPiece.buy(bytes32,address)\",\"ArtifactsPiece.cancel()\",\"ArtifactsPiece.delist()\",\"ArtifactsPiece.initialize(address,address,uint256,address,(string,string,uint8,string),address,bytes32,bytes,bool,bytes32)\",\"ArtifactsPiece.list(uint256)\",\"ArtifactsPiece.postEscrowKey(bytes,address,uint256)\",\"ArtifactsPiece.proveFakeKey((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))\",\"ArtifactsPiece.refundBuyer()\",\"ArtifactsPiece.registerViewingKey(bytes32)\",\"ArtifactsPiece.release()\",\"ArtifactsPiece.reveal(bytes32)\",\"ArtifactsPiece.rewrapFor(bytes)\",\"ArtifactsPiece.safeTransferFrom(address,address,uint256)\",\"ArtifactsPiece.safeTransferFrom(address,address,uint256,bytes)\",\"ArtifactsPiece.setApprovalForAll(address,bool)\",\"ArtifactsPiece.transferFrom(address,address,uint256)\",\"ArtifactsPiece.withdraw()\",\"ArtifactsSource.acceptOwnership()\",\"ArtifactsSource.bid(address)\",\"ArtifactsSource.deliverKey(bytes)\",\"ArtifactsSource.lock(bytes32,bytes32)\",\"ArtifactsSource.resetRenderer()\",\"ArtifactsSource.setAuction(uint256,uint64)\",\"ArtifactsSource.setGate(address,address,uint256,uint64)\",\"ArtifactsSource.setMemberGate(address,bytes4,uint256)\",\"ArtifactsSource.settle()\",\"ArtifactsSource.storeRendererChunk(bytes)\",\"ArtifactsSource.transferOwnership(address)\",\"ArtifactsSource.voidUnsettled()\",\"ArtifactsSource.withdrawRefund()\",\"BrokerPass.approve(address,uint256)\",\"BrokerPass.claimWithPiece(uint256)\",\"BrokerPass.claimWithSeat(uint256)\",\"BrokerPass.safeTransferFrom(address,address,uint256)\",\"BrokerPass.safeTransferFrom(address,address,uint256,bytes)\",\"BrokerPass.setApprovalForAll(address,bool)\",\"BrokerPass.setClaimsOpenAt(uint64)\",\"BrokerPass.transferFrom(address,address,uint256)\",\"ImdBuybackBurner.burnEth(uint256,uint256,uint256)\",\"ImdBuybackBurner.burnImd()\",\"ImdBuybackBurner.receive()\",\"ImdBuybackBurner.unlockCallback(bytes)\",\"SubmissionReviews.applyAsBroker(string)\",\"SubmissionReviews.postThesis(uint256,string)\",\"SubmissionReviews.reviewAsPiece(uint256,uint256,uint8,string)\",\"SubmissionReviews.reviewAsSeat(uint256,uint256,uint8,string)\"],\"files\":{\".gitignore\":3,\"ADAPTATION.md\":463,\"README.md\":256,\"foundry.toml\":25,\"launch.burner.json\":17,\"launch.json\":63,\"reference/PROTOCOL.md\":99,\"reference/RULES.md\":137,\"reference/audit/V13Audit.t.sol.txt\":381,\"reference/check-framed.js\":25,\"reference/framed/framed-003.svg\":1,\"reference/framed/framed-MASTER.svg\":1,\"reference/rules.js\":145,\"reference/the-source.renderer.html\":148,\"remappings.txt\":1,\"script/Deploy.s.sol\":39,\"src/ArtCollection.sol\":55,\"src/ArtHouse.sol\":609,\"src/ArtStorage.sol\":82,\"src/ArtifactsFactory.sol\":635,\"src/ArtifactsPiece.sol\":460,\"src/ArtifactsSource.sol\":271,\"src/BrokerPass.sol\":142,\"src/ImdBuybackBurner.sol\":163,\"src/KeyProof.sol\":154,\"src/SubmissionReviews.sol\":215,\"src/base/ERC721Lite.sol\":122,\"src/base/HolderGate.sol\":113,\"src/base/ReentrancyGuard.sol\":15,\"src/base/TwoStepOwnable.sol\":40,\"src/interfaces/Interfaces.sol\":93,\"src/libs/Clones.sol\":19,\"src/libs/Encoding.sol\":79,\"src/libs/SSTORE2.sol\":41,\"src/libs/Seal.sol\":102,\"test/Adversarial.t.sol\":1409,\"test/ArtHouse.t.sol\":463,\"test/Artifacts.t.sol\":673,\"test/AuditRound3.t.sol\":151,\"test/BrokerPass.t.sol\":373,\"test/Burner.t.sol\":161,\"test/ClaimEnd.t.sol\":152,\"test/EdgeProbes.t.sol\":718,\"test/EscrowDeadline.t.sol\":160,\"test/Fixture.sol\":230,\"test/Gate.t.sol\":295,\"test/KeyProof.t.sol\":134,\"test/LaunchAudit.t.sol\":338,\"test/LaunchDeployment.t.sol\":191,\"test/NothingStuck.t.sol\":594,\"test/Phases.t.sol\":130,\"test/ReviewRound4.t.sol\":262,\"test/Reviews.t.sol\":264,\"test/Source.t.sol\":396,\"test/audit/KeyProofEdges.t.sol\":178,\"test/audit/KeyReuseLeak.t.sol\":38,\"test/fixtures/keyproof.json\":81,\"test/fork/BurnerFork.t.sol\":70,\"test/fork/VrfFork.t.sol\":131,\"test/invariants/ADDED_COVERAGE.md\":24,\"test/invariants/ArtHouseInvariant.t.sol\":444,\"test/invariants/ArtifactsFactoryInvariant.t.sol\":323,\"test/invariants/BrokerClaimsInvariant.t.sol\":275,\"test/invariants/BuybackConservation.t.sol\":246,\"test/invariants/FallbackDrawInvariant.t.sol\":417,\"test/invariants/PieceEscrowInvariant.t.sol\":446,\"test/invariants/ReviewHistoryInvariant.t.sol\":245,\"test/invariants/SourceAuctionInvariant.t.sol\":227,\"test/mocks/AdversarialMocks.sol\":134,\"test/mocks/MockPoolManager.sol\":57,\"test/mocks/MockSeats.sol\":27,\"test/mocks/Mocks.sol\":149,\"test/mocks/TestVRFCoordinator.sol\":46,\"test/utils/Base64Decode.sol\":83},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3f77377327b1a82b45978b976949f49e9d19f7f0817465eb2ecd1b0552a5043a","verifiedTreeHash":"4c195944b761911e6da38b8c78a1ca745b089fa5","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":827650,"exitCode":0,"name":"build","output":"Compiling 74 files with Solc 0.8.26\nSolc 0.8.26 finished in 827.43s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> test/invariants/ArtHouseInvariant.t.sol:105:9:\n    |\n105 |         address buyer,\n    |         ^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":16726,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/BurnerFork.t.sol:BurnerForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 669.38µs (0.00ns CPU time)\n\nRan 1 test for test/fork/VrfFork.t.sol:VrfForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 2.12ms (0.00ns CPU time)\n\nRan 5 tests for test/audit/KeyProofEdges.t.sol:KeyProofEdgesTest\n[PASS] test_adversarialE_isProvable() (gas: 107849)\n[PASS] test_adversarialE_proofIsActuallyChecked() (gas: 23615)\n[PASS] test_negatedSCannotFrame() (gas: 60700)\n[PASS] test_oddYWrapThatOpensIsNotFake() (gas: 37558)\n[PASS] test_xEqualsN_isMalformed() (gas: 13218)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 3.50ms (3.00ms CPU time)\n\nRan 8 tests for test/KeyProof.t.sol:KeyProofTest\n[PASS] test_aJunkKeyIsProvenFake() (gas: 369871)\nLogs:\n  gas to check a fake-key proof: 44805\n\n[PASS] test_aKeyThatOpensIsNeverProvenFake() (gas: 368087)\n[PASS] test_aProofOnlyHoldsForItsBuyerPieceAndChain() (gas: 416867)\n[PASS] test_aProofOnlyHoldsForItsOwnWrappedKey() (gas: 416275)\n[PASS] test_aTamperedProofFails() (gas: 768976)\n[PASS] test_madeUpBytesAndTheOldFormatAreFake() (gas: 690806)\n[PASS] test_theRightKeyForSomeoneElseIsProvenFake() (gas: 368314)\n[PASS] test_viewingKeys() (gas: 34725)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 6.79ms (5.34ms CPU time)\n\nRan 7 tests for test/Burner.t.sol:BurnerTest\n[PASS] test_anyoneBurnsHeldImd() (gas: 169949)\n[PASS] test_anyoneSwapsInSmallStepsAfter60QuietDays() (gas: 845755)\n[PASS] test_constructorChecks() (gas: 8711)\n[PASS] test_editionSaleToBurnedImd() (gas: 61800771)\n[PASS] test_onlyTheCuratorSwaps_withAMinimumAndADeadline() (gas: 653639)\n[PASS] test_onlyThePoolManagerCallsBack() (gas: 32189)\n[PASS] test_theNewOwnerSwapsAfterAHandover() (gas: 304000)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 36.20ms (28.52ms CPU time)\n\nRan 6 tests for test/Adversarial.t.sol:PieceEdgeTest\n[PASS] test_cancelThenSecondBuyerAndRoyaltyToChangedPayout() (gas: 1088077)\n[PASS] test_listingEdges() (gas: 1003054)\n[PASS] test_releaseAtExactly72HoursByStranger() (gas: 914095)\n[PASS] test_revealNeedsTheSourceLocked_andEmptyRendererURI() (gas: 6214987)\n[PASS] test_safeTransferReceivers() (gas: 670237)\n[PASS] test_transferAuthEdges() (gas: 350213)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 43.88ms (5.53ms CPU time)\n\nRan 4 tests for test/Phases.t.sol:PhasesTest\n[PASS] test_aSeatFollowsThePhases_whereverItGoes() (gas: 1747601)\n[PASS] test_afterTheWindow_anyoneUpToFive() (gas: 1042332)\n[PASS] test_capsRise_1_then_2_then_5_forAnImdHolder() (gas: 1740916)\n[PASS] test_setOnlyBeforeTheSaleOpens_andChecked() (gas: 322444)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 44.77ms (2.78ms CPU time)\n\nRan 6 tests for test/EscrowDeadline.t.sol:SourceEscrowDeadlineTest\n[PASS] testFuzz_postAfterDeadlineReverts(uint32) (runs: 64, μ: 367037, ~: 367037)\n[PASS] test_cancelledSaleCanBeBoughtAgain() (gas: 820699)\n[PASS] test_expiredSaleCanBeRefundedAndBoughtAgain() (gas: 940459)\n[PASS] test_postAtCancellationDeadlineReverts() (gas: 366895)\n[PASS] test_postJustBeforeDeadlinePreventsCancellation() (gas: 702323)\n[PASS] test_postOneSecondAfterDeadlineReverts() (gas: 367215)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 45.72ms (41.35ms CPU time)\n\nRan 4 tests for test/AuditRound3.t.sol:AuditRound3Test\n[PASS] test_aReturnDataBombCostsThePayerNothing() (gas: 694152)\n[PASS] test_aShareThatWaitsInTheLedgerIsAnnounced() (gas: 339919)\n[PASS] test_theArtistsPayoutCantMoveThePieceDuringARelease() (gas: 415877)\n[PASS] test_theArtistsPayoutCantRelistDuringARelease() (gas: 600564)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 50.47ms (1.49ms CPU time)\n\nRan 1 test for test/ClaimEnd.t.sol:EndBeforeOpenTest\n[PASS] test_endSale_beforeOpening_refused() (gas: 60691353)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 56.13ms (48.76ms CPU time)\n\nRan 10 tests for test/Artifacts.t.sol:ArtifactsPieceEscrowTest\n[PASS] test_escrowCancelBeforeKey_andDelist() (gas: 501042)\n[PASS] test_escrowHappyPath_buyerConfirms() (gas: 1181933)\n[PASS] test_escrowKeyMustNotBeEmpty() (gas: 311000)\n[PASS] test_escrowTimeoutRelease() (gas: 729073)\n[PASS] test_pieceViewingKeyZeroRejected() (gas: 168689)\n[PASS] test_plainTransferClearsKey_previousOwnerRekeys() (gas: 506819)\n[PASS] test_reentrancyOnEscrowWithdrawBlocked() (gas: 844317)\n[PASS] test_rewrapIsOneShotAndNonEmpty() (gas: 284134)\n[PASS] test_sellerCannotOverwriteKeyAfterRelease() (gas: 913380)\n[PASS] test_sourceOnlyReveal() (gas: 35552)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 57.04ms (4.21ms CPU time)\n\nRan 5 tests for test/ClaimEnd.t.sol:ClaimEndTest\n[PASS] test_claimMany_claimsEveryOneInOneCall() (gas: 18006141)\n[PASS] test_claimMany_emptyRefused_andTheCuratorCanClaimForBuyers() (gas: 12215083)\n[PASS] test_claimMany_isAllOrNothing() (gas: 18060421)\n[PASS] test_endSale_isFinal() (gas: 6877701)\n[PASS] test_endSale_needsTheSaleToHaveOpened_andWorksWhileClosed() (gas: 96083)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 65.03ms (7.10ms CPU time)\n\nRan 1 test for test/audit/KeyReuseLeak.t.sol:KeyReuseLeakTest\n[PASS] test_copiedE_cantBePosted(uint256,uint256) (runs: 64, μ: 602937, ~: 603108)\nLogs:\n  Bound result 11818044032905497069688431977092257873442291733589656922755808936709498\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 72.34ms (65.51ms CPU time)\n\nRan 18 tests for test/BrokerPass.t.sol:BrokerPassTest\n[PASS] test_capIs100() (gas: 19752778)\n[PASS] test_claimWithPiece_onceEverPerPiece() (gas: 6631460)\n[PASS] test_claimWithSeat_onceEverPerSeat() (gas: 376003)\n[PASS] test_claimWithTheSource() (gas: 5959629)\n[PASS] test_claimsWaitForTheStartTime_setOnceByTheCurator() (gas: 489742)\n[PASS] test_oneClaimPerWallet() (gas: 6932360)\n[PASS] test_passHolderCanBrokerTheirOwnBuy() (gas: 1022212)\n[PASS] test_passHolderEarnsOnMint_andTheRightMovesWithThePass() (gas: 2088032)\n[PASS] test_recordResaleRejectsAnythingButAPiece() (gas: 298286)\n[PASS] test_resaleBrokerShare_creditedInTheLedger() (gas: 7246633)\n[PASS] test_resaleBuyerWithAPassCanBrokerTheirOwnBuy() (gas: 7183937)\n[PASS] test_resaleFallsBackToThePieceWhenTheLedgerRefuses() (gas: 7199038)\n[PASS] test_resaleSellerCannotBeBroker() (gas: 7096477)\n[PASS] test_resaleWithoutEligibleBroker_sellerKeepsTheShare() (gas: 6885635)\n[PASS] test_setBrokerPassOnce() (gas: 64999)\n[PASS] test_sourceSplit_brokerAndArtistOnly() (gas: 6111470)\n[PASS] test_sourceSplit_noBrokerBurns() (gas: 5868911)\n[PASS] test_tokenURIIsOnChainJson() (gas: 388848)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 84.66ms (24.05ms CPU time)\n\nRan 6 tests for test/EscrowDeadline.t.sol:EditionEscrowDeadlineTest\n[PASS] testFuzz_postAfterDeadlineReverts(uint32) (runs: 64, μ: 367100, ~: 367100)\n[PASS] test_cancelledSaleCanBeBoughtAgain() (gas: 780559)\n[PASS] test_expiredSaleCanBeRefundedAndBoughtAgain() (gas: 900319)\n[PASS] test_postAtCancellationDeadlineReverts() (gas: 366958)\n[PASS] test_postJustBeforeDeadlinePreventsCancellation() (gas: 662150)\n[PASS] test_postOneSecondAfterDeadlineReverts() (gas: 367278)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 104.93ms (52.53ms CPU time)\n\nRan 21 tests for test/ArtHouse.t.sol:ArtHouseTest\n[PASS] testFuzz_ethSplitInvariant(uint96,bool,bool) (runs: 64, μ: 1192097, ~: 1162488)\n[PASS] testFuzz_imdSplitInvariant(uint96,bool) (runs: 64, μ: 1307757, ~: 1298483)\n[PASS] test_artistPayoutOnlyArtist_keptOnReapproval() (gas: 179207)\n[PASS] test_collectionMintOnlyHouse() (gas: 73967)\n[PASS] test_curationFlow_andFailures() (gas: 938837)\n[PASS] test_customSplit() (gas: 1124713)\n[PASS] test_deploymentWiring() (gas: 93139)\n[PASS] test_imdBuybackIsReleasedAndBurned() (gas: 1882866)\n[PASS] test_mintFailures() (gas: 1550882)\n[PASS] test_onlyCuratorApproves() (gas: 123827)\n[PASS] test_pieceOver100KBRejected() (gas: 21310484)\n[PASS] test_recordSaleOnlyModules() (gas: 120446)\n[PASS] test_reentrancyOnWithdrawBlocked() (gas: 1838346)\n[PASS] test_revokedArtistLosesCuration() (gas: 582575)\n[PASS] test_sealNeedsEveryPieceFinalized() (gas: 527413)\n[PASS] test_setHouseOnce() (gas: 78294)\n[PASS] test_submissions() (gas: 260658)\n[PASS] test_tokenURIOnChain() (gas: 1190981)\n[PASS] test_twoStepOwnership_noRenounce() (gas: 198046)\n[PASS] test_withdrawNothingReverts_andHouseGoesToCurrentOwner() (gas: 1241987)\n[PASS] test_wrongHashIsCorrectable() (gas: 777075)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 114.44ms (114.12ms CPU time)\n\nRan 7 tests for test/Adversarial.t.sol:SourceEdgeTest\n[PASS] testFuzz_minimumRaiseIsCeilingOfFivePercent(uint96,uint96) (runs: 512, μ: 629577, ~: 629679)\nLogs:\n  Bound result 10368531\n  Bound result 455321846994\n\n[PASS] testFuzz_rendererHashIsKeccakOfConcatenation(bytes,bytes,bytes) (runs: 64, μ: 417957, ~: 413819)\n[PASS] test_bidBoundaries() (gas: 901651)\n[PASS] test_payloadChunkLimits() (gas: 5443288)\n[PASS] test_setAuctionEdges() (gas: 459334)\n[PASS] test_settleEdges_brokerSplit() (gas: 6915419)\n[PASS] test_settleWithUnapprovedBrokerPaysTheBurn() (gas: 5818742)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 179.94ms (188.87ms CPU time)\n\nRan 3 tests for test/Adversarial.t.sol:RuntimeTest\n[PASS] test_implementationsAreLocked() (gas: 104926)\n[PASS] test_launchedRuntimesAreBoundedAndHaveNoEscapeOpcodes() (gas: 60145375)\n[PASS] test_noRenounceAnywhere() (gas: 155507)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 181.01ms (173.09ms CPU time)\n\nRan 2 tests for test/LaunchDeployment.t.sol:LaunchDeploymentTest\n[PASS] test_allEightConstructorsAcceptCodeLessDependencies() (gas: 75014953)\n[PASS] test_manifestOrderAndOwnerConfigurationRemainIntact() (gas: 81642215)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 198.95ms (376.79ms CPU time)\n\nRan 15 tests for test/LaunchAudit.t.sol:LaunchAuditTest\n[PASS] testFuzz_memberReplyMustBeExactlyOneWord(uint16,uint256,uint256) (runs: 64, μ: 435739, ~: 434920)\nLogs:\n  Bound result 8193\n\n[PASS] test_attackerCannotInitializeCollectionAsRealHouse() (gas: 1082634)\n[PASS] test_attackerCannotInitializePieceAsRealFactory() (gas: 4983454)\n[PASS] test_attackerCannotInitializePieceAsRealSource() (gas: 4973750)\n[PASS] test_brokenBrokerPassDoesNotBlockEditionPurchase() (gas: 61675694)\n[PASS] test_brokenBrokerPassDoesNotBlockSourceSettlement() (gas: 19380521)\n[PASS] test_brokenPassDoesNotBlockPlainMintsInEitherCurrency() (gas: 2535075)\n[PASS] test_brokerPassMalformedRepliesCountAsIneligible() (gas: 934454)\n[PASS] test_claimedEditionsAreIndependentRuntimesAndStorage() (gas: 103403242)\n[PASS] test_dynamicMemberReplyCannotBypassEditionWindow() (gas: 61590217)\n[PASS] test_dynamicMemberReplyCannotBypassSourceWindow() (gas: 676729)\n[PASS] test_initializerRejectsEOAController() (gas: 6035471)\n[PASS] test_keyPostEventUnchangedBeforeAndAfterClaim() (gas: 67214905)\n[PASS] test_ownerCanClosePrimarySaleAndChangePendingAuctionSplit() (gas: 73113059)\n[PASS] test_plainCollectionIsIndependentRuntime() (gas: 4127353)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 233.55ms (304.42ms CPU time)\n\nRan 11 tests for test/Reviews.t.sol:ReviewsTest\n[PASS] testFuzz_tallyMatchesVoices(uint8[12]) (runs: 64, μ: 1437327, ~: 1442033)\n[PASS] test_aClaimedPieceIsAVoice_andAnUnclaimedOneIsNot() (gas: 67573205)\n[PASS] test_aMovedSeatStillHasOneVoice() (gas: 441792)\n[PASS] test_aSeatAndAPieceInOneWalletAreTwoVoices() (gas: 67297937)\n[PASS] test_anyoneAppliesToBeABroker() (gas: 224553)\n[PASS] test_anyonePublishesTheses() (gas: 810776)\n[PASS] test_changingAReviewMovesItsVote() (gas: 305393)\n[PASS] test_frozenOnceTheCuratorDecides_andAdvisoryOnly() (gas: 349039)\n[PASS] test_inputChecks() (gas: 307196)\n[PASS] test_onlyTheSeatHolderReviews() (gas: 97570)\n[PASS] test_seatsReview_andTheTallyFollows() (gas: 457095)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 257.91ms (123.33ms CPU time)\n\nRan 12 tests for test/Gate.t.sol:GateTest\n[PASS] test_aHostileMembershipContractCountsAsNotMember() (gas: 62498695)\n[PASS] test_auction_gateFixedFromTheFirstBid() (gas: 714509)\n[PASS] test_auction_holdersFirstThenAnyone() (gas: 948469)\n[PASS] test_auction_membersBid_andTheMemberGateIsFixedFromTheFirstBid() (gas: 1006851)\n[PASS] test_brokenSeatContractCountsAsNotHeld() (gas: 61030979)\n[PASS] test_editions_gateFixedOnceTheSaleOpens() (gas: 61529270)\n[PASS] test_editions_holdersFirstThenAnyone() (gas: 62031088)\n[PASS] test_editions_membersBuyInTheWindow_asTokenHoldersDo() (gas: 62059353)\n[PASS] test_editions_noGateMeansOpen() (gas: 61274007)\n[PASS] test_editions_seatBuysUpToFivePerSeatWhereverItGoes() (gas: 62695785)\n[PASS] test_gateRules() (gas: 239527)\n[PASS] test_memberGateRules() (gas: 61261926)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 283.48ms (242.63ms CPU time)\n\nRan 25 tests for test/NothingStuck.t.sol:NothingStuckTest\n[PASS] test_aBuyerNeedsAViewingKeyAProofCanUse() (gas: 67149597)\n[PASS] test_aJunkKeyIsProvenFake_paymentAndDepositToTheBuyer() (gas: 67733962)\n[PASS] test_aSilentSellerLetsTheBuyerCancelAfter24Hours() (gas: 67321054)\n[PASS] test_anAuctionClosedInTimeCannotBeVoided() (gas: 5795810)\n[PASS] test_anAuctionNobodyCanCloseGivesTheBidBack() (gas: 6083672)\n[PASS] test_callbackGasCanOnlyGoUpOnceTheSaleOpens() (gas: 60960821)\n[PASS] test_claimWithoutAKey_after30Days_thenTheKeyGoesIntoThePiece() (gas: 67101500)\n[PASS] test_curatorReKeysAPieceItsPreviousOwnerNeverDid() (gas: 67257656)\n[PASS] test_fallbackDraw_aStartedDrawsResultStands_finishedFromTheHistory() (gas: 61896434)\n[PASS] test_fallbackDraw_chainlinkStillWinsIfItAnswersFirst() (gas: 61650523)\n[PASS] test_fallbackDraw_countsFromThePurchase() (gas: 61827139)\n[PASS] test_fallbackDraw_oneAtATime() (gas: 62775290)\n[PASS] test_fallbackDraw_onlyAfterThreeDays_fromABlockNobodyKnew() (gas: 61810020)\n[PASS] test_fallbackDraw_startsAgainOnlyOnceItsHashIsGone() (gas: 61653096)\n[PASS] test_fallbackDraw_startsOnAYoungRequestTheCoordinatorNoLongerHolds() (gas: 61625047)\n[PASS] test_noProofBeforeAKey_andTheSellerCantDodgeOne() (gas: 67681280)\n[PASS] test_onlyAKeyTheSellerMadeCanBePosted() (gas: 67743337)\n[PASS] test_realKeys_aJunkKeyIsProvenFake() (gas: 907004)\nLogs:\n  gas for the buyer's proveFakeKey: 170130\n\n[PASS] test_realKeys_anHonestKeyCanNeverBeProvenFake() (gas: 1254824)\n[PASS] test_realKeys_theBuyerCantSwapViewingKeysToFrameTheSeller() (gas: 887941)\n[PASS] test_realKeys_theRightKeyWrappedToAnotherKeyIsFake() (gas: 894622)\n[PASS] test_the72HoursCountFromTheKey() (gas: 67742493)\n[PASS] test_theBuyerCantCancelUnderAPendingKey() (gas: 67517486)\n[PASS] test_theDepositIsExactly10Percent() (gas: 67621950)\n[PASS] test_theSellerCanRefundBeforeSendingAKey() (gas: 67428489)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 283.68ms (739.49ms CPU time)\n\nRan 5 tests for test/invariants/BuybackConservation.t.sol:BuybackConservationTest\n[PASS]\nBuybackConservationTest invariants:\n[PASS] invariant_ethGoesOnlyToPool\n[PASS] invariant_imdGoesOnlyToBurnDestination\n BuybackConservationTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭----------------------------+----------------------+-------+---------+----------╮\n| Contract                   | Selector             | Calls | Reverts | Discards |\n+================================================================================+\n| BuybackConservationHandler | advanceTime          | 679   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | burnIMD              | 679   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | curatorSwap          | 686   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | donateETH            | 639   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | donateIMD            | 724   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | handover             | 713   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | publicSwap           | 671   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | rejectedSwap         | 685   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | unauthorizedCallback | 668   | 0       | 0        |\n╰----------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5000000000000000000\n  Bound result 2000000000000000000\n  Bound result 7031\n  Bound result 78\n\n[PASS] testFuzz_fundingBurnRoundTrip(uint96,uint96) (runs: 1000, μ: 645484, ~: 645531)\nLogs:\n  Bound result 4264337593543950335\n  Bound result 62514264337593543950335\n\n[PASS] test_failedCuratorSwapDoesNotPostponePublicLiveness() (gas: 896798)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 3\n\n[PASS] test_oneWeiSwapAndDirectBurnConserveFunds() (gas: 603515)\nLogs:\n  Bound result 1\n  Bound result 1\n\n[PASS] test_publicSwapDrainsRemainderBelowTheDailyCap() (gas: 334842)\nLogs:\n  Bound result 1\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.10s (1.33s CPU time)\n\nRan 12 tests for test/Source.t.sol:ArtifactsSourceTest\n[PASS] testFuzz_revealOpensTheSealedSeed(bytes32,bytes32) (runs: 64, μ: 5843090, ~: 5843178)\n[PASS] test_auctionNeedsTheHouseToAcceptTheSale() (gas: 3285282)\n[PASS] test_auctionNeedsTheSourceLocked() (gas: 620659)\n[PASS] test_auctionReopensWhenNoBids() (gas: 441150)\n[PASS] test_auctionRules() (gas: 6681882)\n[PASS] test_bidReentrancyAndRefundPull() (gas: 767944)\n[PASS] test_deliverKeyOnceToTheWinner() (gas: 9191286)\n[PASS] test_noRevealWhileABuyerIsInEscrow() (gas: 8961688)\n[PASS] test_revealServesTheRendererWithItsSeed() (gas: 512439761)\nLogs:\n  revealed tokenURI gas: 2897251\n\n[PASS] test_revealTakesDownAListingWithNoBuyer() (gas: 8893098)\n[PASS] test_storedSeedIsSealed() (gas: 8683528)\n[PASS] test_tinyBidsMustStrictlyExceed() (gas: 940816)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 1.28s (1.28s CPU time)\n\nRan 1 test for test/invariants/SourceAuctionInvariant.t.sol:SourceAuctionInvariantTest\n[PASS]\nSourceAuctionInvariantTest invariants:\n[PASS] invariant_auctionConservation\n[PASS] invariant_highBidMonotone\n[PASS] invariant_settlementIsFinal\n SourceAuctionInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭----------------+--------------------+-------+---------+----------╮\n| Contract       | Selector           | Calls | Reverts | Discards |\n+==================================================================+\n| AuctionHandler | bid                | 856   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | payloadStaysLocked | 800   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | recordHigh         | 799   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | setAuction         | 788   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | settle             | 876   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | warp               | 846   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | withdrawRefund     | 795   | 0       | 0        |\n╰----------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 64\n  Bound result 36\n  Bound result 10029\n  Bound result 6400\n  Bound result 80\n  Bound result 793\n  Bound result 5596\n  Bound result 85\n  Bound result 2000000000000000987\n  Bound result 1400\n  Bound result 255\n  Bound result 33\n  Bound result 4366791704086718184\n  Bound result 4000000003581908589\n  Bound result 478\n  Bound result 649\n  Bound result 1413\n  Bound result 50\n  Bound result 231\n  Bound result 6000000000000000245\n  Bound result 415\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.59s (1.58s CPU time)\n\nRan 11 tests for test/ReviewRound4.t.sol:ReviewRound4Test\n[PASS] testFuzz_gateViewsNeverRevert(address,address,address) (runs: 64, μ: 147446, ~: 147548)\n[PASS] testFuzz_theFallbackResultStandsAgainstAnyLateWord(uint256,bytes32) (runs: 64, μ: 61602097, ~: 61602050)\n[PASS] test_aDeadFallbackDrawCanBeRerequested() (gas: 62342387)\n[PASS] test_aLiveFallbackDrawStillCannotBeRerequested() (gas: 61855098)\n[PASS] test_gateSeats_dirtyOwnerWord_isNotHeld() (gas: 61073739)\n[PASS] test_gateSeats_noCode_isNotHeld() (gas: 61538697)\n[PASS] test_gateSeats_withCode_unchanged() (gas: 61870940)\n[PASS] test_gateToken_noCode_isNotHeld_andMembersStillBuy() (gas: 62065872)\n[PASS] test_noChainlinkAnswerOnceTheFallbackHashIsPublic() (gas: 61639787)\n[PASS] test_noFallbackOnARequestChainlinkMayStillAnswer() (gas: 61638100)\n[PASS] test_source_gateNoCode_bidsRefusedNotReverted_membersBid() (gas: 998508)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 1.62s (1.86s CPU time)\n\nRan 1 test for test/invariants/PieceEscrowInvariant.t.sol:PieceEscrowInvariantTest\n[PASS]\nPieceEscrowInvariantTest invariants:\n[PASS] invariant_escrowConservation\n[PASS] invariant_escrowSellerOwns\n[PASS] invariant_royaltyAndIdentity\n[PASS] invariant_singleToken\n PieceEscrowInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭---------------+--------------------+-------+---------+----------╮\n| Contract      | Selector           | Calls | Reverts | Discards |\n+=================================================================+\n| EscrowHandler | approveAndTransfer | 372   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | buy                | 368   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | cancel             | 383   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | delist             | 408   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | list               | 400   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | postKey            | 384   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | proveFake          | 392   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | refundBuyer        | 376   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | registerKey        | 337   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | release            | 372   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | rewrap             | 391   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | transfer           | 382   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | warp               | 380   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | withdraw           | 404   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | withdrawRoyalty    | 411   | 0       | 0        |\n╰---------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 171443\n  Bound result 78\n  Bound result 21001\n  Bound result 10000\n  Bound result 9474\n  Bound result 9045\n  Bound result 24782783692649250087\n  Bound result 576000\n  Bound result 17522\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.49s (2.41s CPU time)\n\nRan 1 test for test/invariants/ArtifactsFactoryInvariant.t.sol:ArtifactsFactoryInvariantTest\n[PASS]\nArtifactsFactoryInvariantTest invariants:\n[PASS] invariant_claimedPiecesBelongToBuyers\n[PASS] invariant_counts\n[PASS] invariant_ledgerHoldsEveryPurchase\n[PASS] invariant_lockedAndPriced\n[PASS] invariant_walletLimit\n ArtifactsFactoryInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| FactoryHandler | buy               | 551   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | buyMany           | 483   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | claim             | 510   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | fulfil            | 549   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | lockedForever     | 504   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | replay            | 510   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | rerequest         | 552   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | setPrice          | 513   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | strangerFulfil    | 543   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | strangerRerequest | 520   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | toggleSale        | 525   | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 3375794026\n  Bound result 5\n  Bound result 6\n  Bound result 8893983141532395648\n  Bound result 1\n  Bound result 4264337593543950335\n  Bound result 4264337593543950335\n  Bound result 1\n  Bound result 1\n  Bound result 17004\n  Bound result 4264337593543950333\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.70s (2.63s CPU time)\n\nRan 3 tests for test/invariants/FallbackDrawInvariant.t.sol:FallbackDrawInvariantTest\n[PASS]\nFallbackDrawInvariantTest invariants:\n[PASS] invariant_everyPurchaseOneEdition\n[PASS] invariant_oneFallbackAtATime\n[PASS] invariant_paymentsUntouched\n[PASS] invariant_retiredIdsStayDead\n FallbackDrawInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+------------------------+-------+---------+----------╮\n| Contract            | Selector               | Calls | Reverts | Discards |\n+===========================================================================+\n| FallbackDrawHandler | answer                 | 641   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | buy                    | 590   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | failedCallback         | 615   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | finishFallback         | 613   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | finishSettledOrRetired | 607   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | lateAnswerToRetired    | 576   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | rerequest              | 613   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | roll                   | 638   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | startFallback          | 588   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | strangerRerequest      | 663   | 0       | 0        |\n╰---------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 29\n  Bound result 5\n  Bound result 20\n  Bound result 29\n  Bound result 8\n  Bound result 1\n  Bound result 3\n  Bound result 42\n\n[PASS] test_deadFallbackIsClearedByARerequest() (gas: 1953077)\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 0\n\n[PASS] test_fallbackRouteIsReachable() (gas: 1625757)\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.71s (4.64s CPU time)\n\nRan 1 test for test/invariants/ArtHouseInvariant.t.sol:ArtHouseInvariantTest\n[PASS]\nArtHouseInvariantTest invariants:\n[PASS] invariant_constants\n[PASS] invariant_ethConservation\n[PASS] invariant_imdConservation\n[PASS] invariant_noOverWithdrawal\n[PASS] invariant_supplyAndSeal\n ArtHouseInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| LedgerHandler | handOver       | 389   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | mintETH        | 368   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | mintIMD        | 362   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | moduleSale     | 409   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | releaseBuyback | 427   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setBroker      | 415   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setPayout      | 401   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setPrices      | 373   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setSaleOpen    | 387   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setSplit       | 430   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | strangerCalls  | 400   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | withdraw       | 391   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | withdrawHouse  | 368   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 200000000000000000\n  Bound result 15419\n  Bound result 95\n  Bound result 2965\n  Bound result 986\n  Bound result 299999\n  Bound result 33\n  Bound result 5727\n  Bound result 85\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.83s (5.82s CPU time)\n\nRan 4 tests for test/invariants/BrokerClaimsInvariant.t.sol:BrokerClaimsInvariantTest\n[PASS]\nBrokerClaimsInvariantTest invariants:\n[PASS] invariant_claimHistorySurvivesTransfers\n[PASS] invariant_ownershipBalancesAndBrokerRightsAgree\n BrokerClaimsInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+------------------+-------+---------+----------╮\n| Contract            | Selector         | Calls | Reverts | Discards |\n+=====================================================================+\n| BrokerClaimsHandler | advanceTime      | 838   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | claimPiece       | 912   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | claimSeat        | 878   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | movePass         | 899   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | movePiece        | 940   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | moveSeat         | 859   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | rejectedTransfer | 818   | 0       | 0        |\n╰---------------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 166400\n  Bound result 170866\n  Bound result 50660\n  Bound result 120331\n  Bound result 166400\n  Bound result 168662\n\n[PASS] test_seatAndPassTransfersDoNotResetEitherClaimLimit() (gas: 1553655)\n[PASS] test_sourceClaimAlsoConsumesTheWalletsSeatEntitlement() (gas: 1137627)\n[PASS] test_startIsInclusiveAndClosedClaimsLeaveNoHistory() (gas: 1893855)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 6.41s (6.34s CPU time)\n\nRan 3 tests for test/invariants/ReviewHistoryInvariant.t.sol:ReviewHistoryInvariantTest\n[PASS]\nReviewHistoryInvariantTest invariants:\n[PASS] invariant_pagesKeepFirstReviewOrderAndLatestContents\n[PASS] invariant_thesisCountsDistinctAuthorsWithoutGrantingBrokerPowers\n[PASS] invariant_votesArePerCredentialAndFinalDecisionsFreezeRecords\n ReviewHistoryInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭----------------------+---------------+-------+---------+----------╮\n| Contract             | Selector      | Calls | Reverts | Discards |\n+===================================================================+\n| ReviewHistoryHandler | advanceTime   | 1096  | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | decide        | 1077  | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | invalidReview | 974   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | moveSeat      | 986   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | review        | 996   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | thesis        | 1015  | 0       | 0        |\n╰----------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2336000\n  Bound result 33\n  Bound result 19\n  Bound result 21079\n  Bound result 224\n  Bound result 4776\n  Bound result 2526\n  Bound result 1461004\n  Bound result 50000\n  Bound result 2537077\n  Bound result 1826\n  Bound result 7684\n\n[PASS] test_finalDecisionsFreezeOldAndNewHolderReviews() (gas: 1951545)\n[PASS] test_transferredSeatEditsOneExistingVoiceInPlace() (gas: 1175361)\nLogs:\n  Bound result 1\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 9.21s (9.21s CPU time)\n\nRan 23 tests for test/Adversarial.t.sol:ArtHouseEdgeTest\n[PASS] testFuzz_everyoneWithdrawsExactlyTheirShare(uint96,uint96,uint96) (runs: 256, μ: 2047937, ~: 2051385)\nLogs:\n  Bound result 12590441983\n  Bound result 52789833680220852523\n  Bound result 95\n\n[PASS] testFuzz_splitConservesAndHouseTakesRounding(uint16,uint16,uint16,uint96,uint8) (runs: 512, μ: 262253, ~: 263033)\nLogs:\n  Bound result 0\n  Bound result 949\n  Bound result 1\n  Bound result 2248466970756901\n\n[PASS] test_artistEdges() (gas: 1210240)\n[PASS] test_buybackOnlyToTheBurnerSetOnce() (gas: 460935)\n[PASS] test_clearThenReuploadKeepsSizeAccounting() (gas: 40763894)\n[PASS] test_collectionErc721Edges() (gas: 1436052)\n[PASS] test_constructorsDoNotCallDependencies() (gas: 36654)\n[PASS] test_constructorsRejectZeroDependencies() (gas: 4550)\n[PASS] test_curationEdges() (gas: 780836)\n[PASS] test_defaultSplit_agentHouseBurn() (gas: 381579)\n[PASS] test_mintWithIMD_falseReturnRejected() (gas: 2073855)\n[PASS] test_mintWithIMD_feeOnTransferRejected() (gas: 2297085)\n[PASS] test_mintWithIMD_stalePriceRejected() (gas: 1250853)\n[PASS] test_mintZeroPricesReject() (gas: 943137)\n[PASS] test_moduleCollectionsHaveNoPlainCuration() (gas: 376256)\n[PASS] test_pendingOwnerHasNoPowerBeforeAccepting() (gas: 197527)\n[PASS] test_registerModuleCollectionTwiceReverts() (gas: 44789)\n[PASS] test_revokedBrokerKeepsEarnedBalance_butEarnsNoMore() (gas: 1291624)\n[PASS] test_sealEmptyCollectionRevertsAndSealIsOnce() (gas: 657864)\n[PASS] test_splitExtremes() (gas: 1284500)\n[PASS] test_submissionEdges() (gas: 246348)\n[PASS] test_updatePieceAccessEdges() (gas: 1976561)\n[PASS] test_withdrawToRevertingPayoutKeepsBalance() (gas: 1372032)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 16.51s (16.64s CPU time)\n\nRan 16 tests for test/Artifacts.t.sol:ArtifactsFactoryTest\n[PASS] test_buyFailures() (gas: 60997239)\n[PASS] test_buyMany_cannotPassSupply() (gas: 98935498)\n[PASS] test_buyMany_fivePerWallet() (gas: 63860710)\n[PASS] test_buyRecordsSaleAndAssignsEveryEditionOnce() (gas: 178065420)\n[PASS] test_claimFlow_andFailures() (gas: 67407363)\n[PASS] test_postWrappedKeysInOneBatch() (gas: 67705114)\n[PASS] test_publishAndLock_accessAndFailures() (gas: 60947985)\n[PASS] test_rerequestAtOnceWhenTheCoordinatorAnsweredButTheCallbackFailed() (gas: 61875354)\n[PASS] test_rerequestRandomnessAfterDroppedRequest() (gas: 62033982)\n[PASS] test_saleControl() (gas: 61043179)\n[PASS] test_sealTokenURIMatchesR8Frame() (gas: 970363405)\n[PASS] test_viewingKeyZeroRejected() (gas: 33301)\n[PASS] test_vrfCallbackCannotBeReplayed() (gas: 61629805)\n[PASS] test_vrfCallbackGasIsTheCuratorsToTune() (gas: 61431482)\n[PASS] test_vrfCorrectableUntilTheSaleOpens_thenLockedForever() (gas: 62248774)\n[PASS] test_vrfMustBeConfiguredBeforeSelling() (gas: 46850)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 16.51s (3.34s CPU time)\n\nRan 13 tests for test/Adversarial.t.sol:ArtifactsEdgeTest\n[PASS] testFuzz_anyWordsAssignDistinctEditions(uint256[8]) (runs: 256, μ: 64664233, ~: 64666893)\n[PASS] testFuzz_sealFramesAnyTraits(uint8,uint8,uint8,uint8,uint8) (runs: 16, μ: 519751208, ~: 519749233)\nLogs:\n  Bound result 3\n\n[PASS] test_buyRevertsAtomicallyWhenCoordinatorReverts() (gas: 59197366)\n[PASS] test_callbackWithNoWordsReverts() (gas: 61551984)\n[PASS] test_claimedPieceIsAFullCopyOfTheImplementation() (gas: 67197423)\n[PASS] test_configureVRFRejectsZeroes() (gas: 211437)\n[PASS] test_duplicateRequestIdRejected() (gas: 59391685)\n[PASS] test_nonOwnerCannotRunTheSale() (gas: 60818098)\n[PASS] test_rerequestIsAtomicWhenCoordinatorReverts() (gas: 59885766)\n[PASS] test_rerequestWindowBoundaryAndChaining() (gas: 67773076)\n[PASS] test_setPieceEdges() (gas: 61051490)\n[PASS] test_unapprovedBuyerAsBrokerEarnsNothing_andOneWeiPriceWorks() (gas: 61489495)\n[PASS] test_wrappedKeyEdges() (gas: 67181302)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 16.51s (18.78s CPU time)\n\nRan 36 test suites in 16.52s (88.86s CPU time): 271 tests passed, 0 failed, 2 skipped (273 total tests)\n","passed":true},{"durationMs":250,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ArtCollection.approve(address,uint256)\",\"ArtCollection.initialize(address,string,string)\",\"ArtCollection.mint(address,uint256)\",\"ArtCollection.safeTransferFrom(address,address,uint256)\",\"ArtCollection.safeTransferFrom(address,address,uint256,bytes)\",\"ArtCollection.setApprovalForAll(address,bool)\",\"ArtCollection.transferFrom(address,address,uint256)\",\"ArtHouse.acceptOwnership()\",\"ArtHouse.approveArtist(address,string)\",\"ArtHouse.clearPiece(address,uint256)\",\"ArtHouse.createCollection(string,string,address)\",\"ArtHouse.decideSubmission(uint256,bool)\",\"ArtHouse.finalizePiece(address,uint256)\",\"ArtHouse.mint(address,uint256,address)\",\"ArtHouse.mintWithIMD(address,uint256,address,uint256)\",\"ArtHouse.recordResale(address,uint256,uint256)\",\"ArtHouse.recordSale(address,address,address)\",\"ArtHouse.registerModuleCollection(address,address)\",\"ArtHouse.registerPiece(address,uint256,bytes32,string,string)\",\"ArtHouse.releaseBuyback(address)\",\"ArtHouse.revokeArtist(address)\",\"ArtHouse.sealCollection(address)\",\"ArtHouse.setBroker(address,bool)\",\"ArtHouse.setBrokerPass(address)\",\"ArtHouse.setBuybackBurner(address)\",\"ArtHouse.setPayout(address)\",\"ArtHouse.setPrices(address,uint256,uint256)\",\"ArtHouse.setSaleModule(address,bool)\",\"ArtHouse.setSaleOpen(address,bool)\",\"ArtHouse.setSplit(address,uint16,uint16,uint16,uint16)\",\"ArtHouse.submit(bytes32,string)\",\"ArtHouse.transferOwnership(address)\",\"ArtHouse.updatePiece(address,uint256,bytes32,string,string)\",\"ArtHouse.uploadChunk(address,uint256,uint256,bytes)\",\"ArtHouse.withdraw(address)\",\"ArtHouse.withdrawHouse(address)\",\"ArtStorage.acceptOwnership()\",\"ArtStorage.clear(address,uint256)\",\"ArtStorage.setHouse(address)\",\"ArtStorage.transferOwnership(address)\",\"ArtStorage.write(address,uint256,uint256,bytes)\",\"ArtifactsFactory.acceptOwnership()\",\"ArtifactsFactory.buy(address)\",\"ArtifactsFactory.buyMany(uint256,address)\",\"ArtifactsFactory.buyWithSeat(uint256,uint256,address)\",\"ArtifactsFactory.claim(uint256)\",\"ArtifactsFactory.claimMany(uint256[])\",\"ArtifactsFactory.configureVRF(address,bytes32,uint256,bool)\",\"ArtifactsFactory.endSale()\",\"ArtifactsFactory.finishFallbackDraw(uint256)\",\"ArtifactsFactory.lock()\",\"ArtifactsFactory.postWrappedKey(uint256,bytes)\",\"ArtifactsFactory.postWrappedKeys(uint256[],bytes[])\",\"ArtifactsFactory.rawFulfillRandomWords(uint256,uint256[])\",\"ArtifactsFactory.registerViewingKey(bytes32)\",\"ArtifactsFactory.rerequestRandomness(uint256)\",\"ArtifactsFactory.setGate(address,address,uint256,uint64)\",\"ArtifactsFactory.setMemberGate(address,bytes4,uint256)\",\"ArtifactsFactory.setMintPhases(uint64,uint8,uint64,uint8)\",\"ArtifactsFactory.setPiece(uint256,(string,string,uint8,string),bytes,bytes32)\",\"ArtifactsFactory.setPrice(uint256)\",\"ArtifactsFactory.setSaleOpen(bool)\",\"ArtifactsFactory.setVRFCallbackGas(uint32)\",\"ArtifactsFactory.startFallbackDraw(uint256)\",\"ArtifactsFactory.transferOwnership(address)\",\"ArtifactsPiece.approve(address,uint256)\",\"ArtifactsPiece.buy(bytes32,address)\",\"ArtifactsPiece.cancel()\",\"ArtifactsPiece.delist()\",\"ArtifactsPiece.initialize(address,address,uint256,address,(string,string,uint8,string),address,bytes32,bytes,bool,bytes32)\",\"ArtifactsPiece.list(uint256)\",\"ArtifactsPiece.postEscrowKey(bytes,address,uint256)\",\"ArtifactsPiece.proveFakeKey((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))\",\"ArtifactsPiece.refundBuyer()\",\"ArtifactsPiece.registerViewingKey(bytes32)\",\"ArtifactsPiece.release()\",\"ArtifactsPiece.reveal(bytes32)\",\"ArtifactsPiece.rewrapFor(bytes)\",\"ArtifactsPiece.safeTransferFrom(address,address,uint256)\",\"ArtifactsPiece.safeTransferFrom(address,address,uint256,bytes)\",\"ArtifactsPiece.setApprovalForAll(address,bool)\",\"ArtifactsPiece.transferFrom(address,address,uint256)\",\"ArtifactsPiece.withdraw()\",\"ArtifactsSource.acceptOwnership()\",\"ArtifactsSource.bid(address)\",\"ArtifactsSource.deliverKey(bytes)\",\"ArtifactsSource.lock(bytes32,bytes32)\",\"ArtifactsSource.resetRenderer()\",\"ArtifactsSource.setAuction(uint256,uint64)\",\"ArtifactsSource.setGate(address,address,uint256,uint64)\",\"ArtifactsSource.setMemberGate(address,bytes4,uint256)\",\"ArtifactsSource.settle()\",\"ArtifactsSource.storeRendererChunk(bytes)\",\"ArtifactsSource.transferOwnership(address)\",\"ArtifactsSource.voidUnsettled()\",\"ArtifactsSource.withdrawRefund()\",\"BrokerPass.approve(address,uint256)\",\"BrokerPass.claimWithPiece(uint256)\",\"BrokerPass.claimWithSeat(uint256)\",\"BrokerPass.safeTransferFrom(address,address,uint256)\",\"BrokerPass.safeTransferFrom(address,address,uint256,bytes)\",\"BrokerPass.setApprovalForAll(address,bool)\",\"BrokerPass.setClaimsOpenAt(uint64)\",\"BrokerPass.transferFrom(address,address,uint256)\",\"ImdBuybackBurner.burnEth(uint256,uint256,uint256)\",\"ImdBuybackBurner.burnImd()\",\"ImdBuybackBurner.receive()\",\"ImdBuybackBurner.unlockCallback(bytes)\",\"SubmissionReviews.applyAsBroker(string)\",\"SubmissionReviews.postThesis(uint256,string)\",\"SubmissionReviews.reviewAsPiece(uint256,uint256,uint8,string)\",\"SubmissionReviews.reviewAsSeat(uint256,uint256,uint8,string)\"],\"files\":{\".gitignore\":3,\"ADAPTATION.md\":463,\"README.md\":256,\"foundry.toml\":25,\"launch.burner.json\":17,\"launch.json\":63,\"reference/PROTOCOL.md\":99,\"reference/RULES.md\":137,\"reference/audit/V13Audit.t.sol.txt\":381,\"reference/check-framed.js\":25,\"reference/framed/framed-003.svg\":1,\"reference/framed/framed-MASTER.svg\":1,\"reference/rules.js\":145,\"reference/the-source.renderer.html\":148,\"remappings.txt\":1,\"script/Deploy.s.sol\":39,\"src/ArtCollection.sol\":55,\"src/ArtHouse.sol\":609,\"src/ArtStorage.sol\":82,\"src/ArtifactsFactory.sol\":635,\"src/ArtifactsPiece.sol\":460,\"src/ArtifactsSource.sol\":271,\"src/BrokerPass.sol\":142,\"src/ImdBuybackBurner.sol\":163,\"src/KeyProof.sol\":154,\"src/SubmissionReviews.sol\":215,\"src/base/ERC721Lite.sol\":122,\"src/base/HolderGate.sol\":113,\"src/base/ReentrancyGuard.sol\":15,\"src/base/TwoStepOwnable.sol\":40,\"src/interfaces/Interfaces.sol\":93,\"src/libs/Clones.sol\":19,\"src/libs/Encoding.sol\":79,\"src/libs/SSTORE2.sol\":41,\"src/libs/Seal.sol\":102,\"test/Adversarial.t.sol\":1409,\"test/ArtHouse.t.sol\":463,\"test/Artifacts.t.sol\":673,\"test/AuditRound3.t.sol\":151,\"test/BrokerPass.t.sol\":373,\"test/Burner.t.sol\":161,\"test/ClaimEnd.t.sol\":152,\"test/EscrowDeadline.t.sol\":160,\"test/Fixture.sol\":230,\"test/Gate.t.sol\":295,\"test/KeyProof.t.sol\":134,\"test/LaunchAudit.t.sol\":338,\"test/LaunchDeployment.t.sol\":191,\"test/NothingStuck.t.sol\":594,\"test/Phases.t.sol\":130,\"test/ReviewRound4.t.sol\":262,\"test/Reviews.t.sol\":264,\"test/Source.t.sol\":396,\"test/audit/KeyProofEdges.t.sol\":178,\"test/audit/KeyReuseLeak.t.sol\":38,\"test/fixtures/keyproof.json\":81,\"test/fork/BurnerFork.t.sol\":70,\"test/fork/VrfFork.t.sol\":131,\"test/invariants/ADDED_COVERAGE.md\":24,\"test/invariants/ArtHouseInvariant.t.sol\":444,\"test/invariants/ArtifactsFactoryInvariant.t.sol\":323,\"test/invariants/BrokerClaimsInvariant.t.sol\":275,\"test/invariants/BuybackConservation.t.sol\":246,\"test/invariants/FallbackDrawInvariant.t.sol\":417,\"test/invariants/PieceEscrowInvariant.t.sol\":446,\"test/invariants/ReviewHistoryInvariant.t.sol\":245,\"test/invariants/SourceAuctionInvariant.t.sol\":227,\"test/mocks/AdversarialMocks.sol\":134,\"test/mocks/MockPoolManager.sol\":57,\"test/mocks/MockSeats.sol\":27,\"test/mocks/Mocks.sol\":149,\"test/mocks/TestVRFCoordinator.sol\":46,\"test/utils/Base64Decode.sol\":83},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":22003,"exitCode":0,"name":"slither","output":"[high/medium] arbitrary-send-eth at src/ArtHouse.sol:559: ArtHouse._pay(address,address,uint256) (src/ArtHouse.sol#559-566) sends eth to arbitrary user\n[high/medium] weak-prng at src/ArtifactsFactory.sol:482: ArtifactsFactory._assign(uint256,uint256) (src/ArtifactsFactory.sol#482-498) uses a weak PRNG: \"idx = uint16(word % left) (src/ArtifactsFactory.sol#487)\"\n[high/medium] reentrancy-balance at src/ArtHouse.sol:431: Reentrancy in ArtHouse._pullIMD(address,uint256) (src/ArtHouse.sol#431-436):\n[high/medium] reentrancy-eth at src/ArtifactsPiece.sol:297: Reentrancy in ArtifactsPiece.release() (src/ArtifactsPiece.sol#297-333):\n[medium/medium] divide-before-multiply at src/libs/Encoding.sol:8: Encoding.base64(bytes) (src/libs/Encoding.sol#8-37) performs a multiplication on the result of a division:\n[medium/high] incorrect-equality at src/ArtifactsFactory.sol:455: ArtifactsFactory._fallbackLive(uint256) (src/ArtifactsFactory.sol#455-459) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ArtifactsFactory.sol:463: ArtifactsFactory.finishFallbackDraw(uint256) (src/ArtifactsFactory.sol#463-472) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ArtifactsSource.sol:182: ArtifactsSource.gateEndsAt() (src/ArtifactsSource.sol#182-184) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ArtifactsFactory.sol:475: ArtifactsFactory._hashOf(uint256) (src/ArtifactsFactory.sol#475-480) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ImdBuybackBurner.sol:136: ImdBuybackBurner.burnImd() (src/ImdBuybackBurner.sol#136-142) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/ArtifactsFactory.sol:463: ArtifactsFactory.finishFallbackDraw(uint256) (src/ArtifactsFactory.sol#463-472) uses a dangerous strict equality:\n[medium/medium] uninitialized-local at src/SubmissionReviews.sol:103: SubmissionReviews.reviewAsSeat(uint256,uint256,SubmissionReviews.Verdict,string).holder (src/SubmissionReviews.sol#103) is a local variable never initialized\n[medium/medium] uninitialized-local at src/BrokerPass.sol:85: BrokerPass.claimWithPiece(uint256).piece (src/BrokerPass.sol#85) is a local variable never initialized\n[medium/medium] uninitialized-local at src/ArtifactsPiece.sol:311: ArtifactsPiece.release().brokerShare (src/ArtifactsPiece.sol#311) is a local variable never initialized\n[medium/medium] uninitialized-local at src/SubmissionReviews.sol:115: SubmissionReviews.reviewAsPiece(uint256,uint256,SubmissionReviews.Verdict,string).piece (src/SubmissionReviews.sol#115) is a local variable never initialized\n[medium/medium] uninitialized-local at src/ArtifactsPiece.sol:441: ArtifactsPiece._revealedURI().page (src/ArtifactsPiece.sol#441) is a local variable never initialized\n[medium/medium] unused-return at src/SubmissionReviews.sol:123: SubmissionReviews._review(uint256,uint256,SubmissionReviews.Verdict,string) (src/SubmissionReviews.sol#123-139) ignores return value by (None,None,None,status) = house.submissions(submissionId) (src/SubmissionReviews.sol#127)\n[medium/medium] unused-return at src/ArtHouse.sol:353: ArtHouse.uploadChunk(address,uint256,uint256,bytes) (src/ArtHouse.sol#353-364) ignores return value by artStorage.write(collection,pieceId,index,data) (src/ArtHouse.sol#363)\n[medium/medium] unused-return at src/SubmissionReviews.sol:160: SubmissionReviews._thesis(uint256,string) (src/SubmissionReviews.sol#160-169) ignores return value by (None,None,None,status) = house.submissions(submissionId) (src/SubmissionReviews.sol#164)\n[medium/medium] unused-return at src/ImdBuybackBurner.sol:146: ImdBuybackBurner.unlockCallback(bytes) (src/ImdBuybackBurner.sol#146-162) ignores return value by poolManager.settle{value: ethIn}() (src/ImdBuybackBurner.sol#159)\n[low/medium] missing-zero-check at src/ArtifactsSource.sol:186: ArtifactsSource.bid(address).broker (src/ArtifactsSource.sol#186) lacks a zero-check on :\n[low/medium] missing-zero-check at src/ArtifactsPiece.sol:124: ArtifactsPiece.initialize(address,address,uint256,address,Traits,address,bytes32,bytes,bool,bytes32).ciphertext_ (src/ArtifactsPiece.sol#124) lacks a zero-check on :\n[low/medium] missing-zero-check at src/ImdBuybackBurner.sol:91: ImdBuybackBurner.constructor(address,address,address,uint24,int24,address).poolHooks_ (src/ImdBuybackBurner.sol#91) lacks a zero-check on :\n[low/medium] calls-loop at src/ArtifactsFactory.sol:401: ArtifactsFactory._requestRandomness(address,uint256) (src/ArtifactsFactory.sol#401-416) has external calls inside a loop: requestId = vrfCoordinator.requestRandomWords(IVRFCoordinatorV2Plus.RandomWordsRequest({keyHash:vrfKeyHash,subId:vrfSubscriptionId,requestConfirmations:VRF_CONFIRMATIONS,callbackGasLimit:vrfCallbackGas,numWords:1,extraArgs:abi.encodeWithSelector(bytes4(keccak256(bytes)(VRF ExtraArgsV1)),vrfNativePayment)})) (src/ArtifactsFactory.sol#402-411)\n[low/medium] calls-loop at src/ArtifactsFactory.sol:558: ArtifactsFactory._claim(uint256) (src/ArtifactsFactory.sol#558-584) has external calls inside a loop: IArtifactsPiece(piece).initialize(address(this),address(house),edition,buyer,p.traits,p.ciphertext,p.commitment,wrapped,false,viewingKeyOf[buyer]) (src/ArtifactsFactory.sol#570-582)\n[low/medium] calls-loop at src/ArtifactsFactory.sol:401: ArtifactsFactory._requestRandomness(address,uint256) (src/ArtifactsFactory.sol#401-416) has external calls inside a loop: requestId = vrfCoordinator.requestRandomWords(IVRFCoordinatorV2Plus.RandomWordsRequest({keyHash:vrfKeyHash,subId:vrfSubscriptionId,requestConfirmations:VRF_CONFIRMATIONS,callbackGasLimit:vrfCallbackGas,numWords:1,extraArgs:abi.encodeWithSelector(bytes4(keccak256(bytes)(VRF ExtraArgsV1)),vrfNativePayment)})) (src/ArtifactsFactory.sol#402-411)\n[low/medium] calls-loop at src/ArtifactsFactory.sol:522: ArtifactsFactory._postWrappedKey(uint256,bytes) (src/ArtifactsFactory.sol#522-541) has external calls inside a loop: IArtifactsPiece(piece).rewrapFor(wrapped) (src/ArtifactsFactory.sol#530)\n[low/medium] calls-loop at src/ArtifactsFactory.sol:401: ArtifactsFactory._requestRandomness(address,uint256) (src/ArtifactsFactory.sol#401-416) has external calls inside a loop: requestId = vrfCoordinator.requestRandomWords(IVRFCoordinatorV2Plus.RandomWordsRequest({keyHash:vrfKeyHash,subId:vrfSubscriptionId,requestConfirmations:VRF_CONFIRMATIONS,callbackGasLimit:vrfCallbackGas,numWords:1,extraArgs:abi.encodeWithSelector(bytes4(keccak256(bytes)(VRF ExtraArgsV1)),vrfNativePayment)})) (src/ArtifactsFactory.sol#402-411)\n[low/medium] reentrancy-benign at src/ArtifactsFactory.sol:350: Reentrancy in ArtifactsFactory._buy(uint256,address) (src/ArtifactsFactory.sol#350-366):\n[low/medium] reentrancy-benign at src/ImdBuybackBurner.sol:136: Reentrancy in ImdBuybackBurner.burnImd() (src/ImdBuybackBurner.sol#136-142):\n[low/medium] reentrancy-benign at src/ArtifactsFactory.sol:401: Reentrancy in ArtifactsFactory._requestRandomness(address,uint256) (src/ArtifactsFactory.sol#401-416):\n[low/medium] reentrancy-benign at src/ImdBuybackBurner.sol:110: Reentrancy in ImdBuybackBurner.burnEth(uint256,uint256,uint256) (src/ImdBuybackBurner.sol#110-133):\n[low/medium] reentrancy-benign at src/ArtHouse.sol:237: Reentrancy in ArtHouse.createCollection(string,string,address) (src/ArtHouse.sol#237-247):\n[low/medium] reentrancy-events at src/ImdBuybackBurner.sol:136: Reentrancy in ImdBuybackBurner.burnImd() (src/ImdBuybackBurner.sol#136-142):\n[low/medium] reentrancy-events at src/ArtifactsFactory.sol:373: Reentrancy in ArtifactsFactory.rerequestRandomness(uint256) (src/ArtifactsFactory.sol#373-391):\n[low/medium] reentrancy-events at src/ArtHouse.sol:367: Reentrancy in ArtHouse.clearPiece(address,uint256) (src/ArtHouse.sol#367-375):\n[low/medium] reentrancy-events at src/ImdBuybackBurner.sol:110: Reentrancy in ImdBuybackBurner.burnEth(uint256,uint256,uint256) (src/ImdBuybackBurner.sol#110-133):\n[low/medium] reentrancy-events at src/ArtHouse.sol:237: Reentrancy in ArtHouse.createCollection(string,string,address) (src/ArtHouse.sol#237-247):\n[low/medium] reentrancy-events at src/ArtifactsSource.sol:138: Reentrancy in ArtifactsSource.deliverKey(bytes) (src/ArtifactsSource.sol#138-145):\n[low/medium] timestamp at src/ArtifactsFactory.sol:273: ArtifactsFactory.gateEndsAt() (src/ArtifactsFactory.sol#273-275) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsPiece.sol:202: ArtifactsPiece.delist() (src/ArtifactsPiece.sol#202-207) uses timestamp for comparisons\n[low/medium] timestamp at src/BrokerPass.sol:67: BrokerPass.setClaimsOpenAt(uint64) (src/BrokerPass.sol#67-73) uses timestamp for comparisons\n[low/medium] timestamp at src/BrokerPass.sol:76: BrokerPass.claimsOpen() (src/BrokerPass.sol#76-78) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:558: ArtifactsFactory._claim(uint256) (src/ArtifactsFactory.sol#558-584) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:260: ArtifactsFactory.setGate(address,address,uint256,uint64) (src/ArtifactsFactory.sol#260-263) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:232: ArtifactsFactory.configureVRF(address,bytes32,uint256,bool) (src/ArtifactsFactory.sol#232-243) uses timestamp for comparisons\n[low/medium] timestamp at src/ImdBuybackBurner.sol:110: ImdBuybackBurner.burnEth(uint256,uint256,uint256) (src/ImdBuybackBurner.sol#110-133) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:297: ArtifactsFactory.currentPhase() (src/ArtifactsFactory.sol#297-305) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsPiece.sol:356: ArtifactsPiece._beforeTransfer(address,address,uint256) (src/ArtifactsPiece.sol#356-364) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:280: ArtifactsFactory.setMintPhases(uint64,uint8,uint64,uint8) (src/ArtifactsFactory.sol#280-293) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsSource.sol:182: ArtifactsSource.gateEndsAt() (src/ArtifactsSource.sol#182-184) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsSource.sol:245: ArtifactsSource.voidUnsettled() (src/ArtifactsSource.sol#245-257) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsSource.sol:186: ArtifactsSource.bid(address) (src/ArtifactsSource.sol#186-201) uses timestamp for comparisons\n[low/medium] timestamp at src/base/HolderGate.sol:73: HolderGate._inGate(uint256) (src/base/HolderGate.sol#73-75) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsPiece.sol:297: ArtifactsPiece.release() (src/ArtifactsPiece.sol#297-333) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsSource.sol:151: ArtifactsSource.setAuction(uint256,uint64) (src/ArtifactsSource.sol#151-163) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:218: ArtifactsFactory.endSale() (src/ArtifactsFactory.sol#218-227) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:267: ArtifactsFactory.setMemberGate(address,bytes4,uint256) (src/ArtifactsFactory.sol#267-270) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsPiece.sol:281: ArtifactsPiece.cancel() (src/ArtifactsPiece.sol#281-293) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsPiece.sol:373: ArtifactsPiece.reveal(bytes32) (src/ArtifactsPiece.sol#373-387) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:203: ArtifactsFactory.setSaleOpen(bool) (src/ArtifactsFactory.sol#203-213) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsSource.sol:213: ArtifactsSource.settle() (src/ArtifactsSource.sol#213-241) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsPiece.sol:236: ArtifactsPiece.postEscrowKey(bytes,address,uint256) (src/ArtifactsPiece.sol#236-249) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:249: ArtifactsFactory.setVRFCallbackGas(uint32) (src/ArtifactsFactory.sol#249-254) uses timestamp for comparisons\n[low/medium] timestamp at src/ArtifactsFactory.sol:346: ArtifactsFactory._tokenGate() (src/ArtifactsFactory.sol#346-348) uses timestamp for comparisons","passed":true},{"durationMs":977,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/ArtCollection.sol:44: `abi.encodePacked()` Hash Collision (6 places)\n[high] contract-locks-ether at src/ArtifactsFactory.sol:13: Contract locks Ether without a withdraw function (2 places)\n[high] eth-send-unchecked-address at src/ArtifactsPiece.sol:344: ETH transferred without address checks (2 places)\n[high] reentrancy-state-change at src/ArtHouse.sol:360: Reentrancy: State change after external call (18 places)\n[low] centralization-risk at src/ArtHouse.sol:176: Centralization Risk (36 places)\n[low] costly-loop at src/ArtifactsFactory.sol:362: Costly operations inside loop (3 places)\n[low] empty-block at src/base/ERC721Lite.sol:121: Empty Block\n[low] large-numeric-literal at src/ArtHouse.sol:15: Large Numeric Literal (11 places)\n[low] literal-instead-of-constant at src/ArtifactsFactory.sol:398: Literal Instead of Constant (35 places)\n[low] require-revert-in-loop at src/ArtHouse.sol:394: Loop Contains `require`/`revert` (4 places)\n[low] state-change-without-event at src/ArtCollection.sol:20: State Change Without Event (5 places)\n[low] state-no-address-check at src/ArtifactsPiece.sol:133: Address State Variable Set Without Checks (3 places)\n[low] storage-array-length-not-cached at src/ArtifactsSource.sol:120: Storage Array Length not Cached\n[low] unchecked-return at src/ArtCollection.sol:42: Unchecked Return (5 places)\n[low] uninitialized-local-variable at src/ArtHouse.sol:394: Uninitialized Local Variable (6 places)\n[low] unsafe-erc20-operation at src/ArtHouse.sol:434: Unsafe ERC20 Operation (3 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"99bf83519d570252e52da0b0e11932f5cdf0d9437902862fe760fb8358a47226","verifiedTreeHash":"2f2a1c1e6cbd4fafcb1395eb9359a9901e7a1fda","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":874119,"exitCode":0,"name":"build","output":"Compiling 74 files with Solc 0.8.26\nSolc 0.8.26 finished in 873.89s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> test/invariants/ArtHouseInvariant.t.sol:105:9:\n    |\n105 |         address buyer,\n    |         ^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":17959,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/VrfFork.t.sol:VrfForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 15.53ms (0.00ns CPU time)\n\nRan 5 tests for test/audit/KeyProofEdges.t.sol:KeyProofEdgesTest\n[PASS] test_adversarialE_isProvable() (gas: 107849)\n[PASS] test_adversarialE_proofIsActuallyChecked() (gas: 23615)\n[PASS] test_negatedSCannotFrame() (gas: 60700)\n[PASS] test_oddYWrapThatOpensIsNotFake() (gas: 37558)\n[PASS] test_xEqualsN_isMalformed() (gas: 13218)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 20.52ms (19.96ms CPU time)\n\nRan 8 tests for test/KeyProof.t.sol:KeyProofTest\n[PASS] test_aJunkKeyIsProvenFake() (gas: 369871)\nLogs:\n  gas to check a fake-key proof: 44805\n\n[PASS] test_aKeyThatOpensIsNeverProvenFake() (gas: 368087)\n[PASS] test_aProofOnlyHoldsForItsBuyerPieceAndChain() (gas: 416867)\n[PASS] test_aProofOnlyHoldsForItsOwnWrappedKey() (gas: 416275)\n[PASS] test_aTamperedProofFails() (gas: 768976)\n[PASS] test_madeUpBytesAndTheOldFormatAreFake() (gas: 690806)\n[PASS] test_theRightKeyForSomeoneElseIsProvenFake() (gas: 368314)\n[PASS] test_viewingKeys() (gas: 34725)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 28.77ms (12.71ms CPU time)\n\nRan 7 tests for test/Burner.t.sol:BurnerTest\n[PASS] test_anyoneBurnsHeldImd() (gas: 169949)\n[PASS] test_anyoneSwapsInSmallStepsAfter60QuietDays() (gas: 845755)\n[PASS] test_constructorChecks() (gas: 8711)\n[PASS] test_editionSaleToBurnedImd() (gas: 61800771)\n[PASS] test_onlyTheCuratorSwaps_withAMinimumAndADeadline() (gas: 653639)\n[PASS] test_onlyThePoolManagerCallsBack() (gas: 32189)\n[PASS] test_theNewOwnerSwapsAfterAHandover() (gas: 304000)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 48.50ms (34.49ms CPU time)\n\nRan 1 test for test/fork/BurnerFork.t.sol:BurnerForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 288.40µs (0.00ns CPU time)\n\nRan 4 tests for test/Phases.t.sol:PhasesTest\n[PASS] test_aSeatFollowsThePhases_whereverItGoes() (gas: 1747601)\n[PASS] test_afterTheWindow_anyoneUpToFive() (gas: 1042332)\n[PASS] test_capsRise_1_then_2_then_5_forAnImdHolder() (gas: 1740916)\n[PASS] test_setOnlyBeforeTheSaleOpens_andChecked() (gas: 322444)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 50.69ms (2.73ms CPU time)\n\nRan 4 tests for test/AuditRound3.t.sol:AuditRound3Test\n[PASS] test_aReturnDataBombCostsThePayerNothing() (gas: 694152)\n[PASS] test_aShareThatWaitsInTheLedgerIsAnnounced() (gas: 339919)\n[PASS] test_theArtistsPayoutCantMoveThePieceDuringARelease() (gas: 415877)\n[PASS] test_theArtistsPayoutCantRelistDuringARelease() (gas: 600564)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 53.91ms (1.40ms CPU time)\n\nRan 6 tests for test/Adversarial.t.sol:PieceEdgeTest\n[PASS] test_cancelThenSecondBuyerAndRoyaltyToChangedPayout() (gas: 1088077)\n[PASS] test_listingEdges() (gas: 1003054)\n[PASS] test_releaseAtExactly72HoursByStranger() (gas: 914095)\n[PASS] test_revealNeedsTheSourceLocked_andEmptyRendererURI() (gas: 6214987)\n[PASS] test_safeTransferReceivers() (gas: 670237)\n[PASS] test_transferAuthEdges() (gas: 350213)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 60.45ms (7.44ms CPU time)\n\nRan 5 tests for test/ClaimEnd.t.sol:ClaimEndTest\n[PASS] test_claimMany_claimsEveryOneInOneCall() (gas: 18006141)\n[PASS] test_claimMany_emptyRefused_andTheCuratorCanClaimForBuyers() (gas: 12215083)\n[PASS] test_claimMany_isAllOrNothing() (gas: 18060421)\n[PASS] test_endSale_isFinal() (gas: 6877701)\n[PASS] test_endSale_needsTheSaleToHaveOpened_andWorksWhileClosed() (gas: 96083)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 70.74ms (5.86ms CPU time)\n\nRan 18 tests for test/BrokerPass.t.sol:BrokerPassTest\n[PASS] test_capIs100() (gas: 19752778)\n[PASS] test_claimWithPiece_onceEverPerPiece() (gas: 6631460)\n[PASS] test_claimWithSeat_onceEverPerSeat() (gas: 376003)\n[PASS] test_claimWithTheSource() (gas: 5959629)\n[PASS] test_claimsWaitForTheStartTime_setOnceByTheCurator() (gas: 489742)\n[PASS] test_oneClaimPerWallet() (gas: 6932360)\n[PASS] test_passHolderCanBrokerTheirOwnBuy() (gas: 1022212)\n[PASS] test_passHolderEarnsOnMint_andTheRightMovesWithThePass() (gas: 2088032)\n[PASS] test_recordResaleRejectsAnythingButAPiece() (gas: 298286)\n[PASS] test_resaleBrokerShare_creditedInTheLedger() (gas: 7246633)\n[PASS] test_resaleBuyerWithAPassCanBrokerTheirOwnBuy() (gas: 7183937)\n[PASS] test_resaleFallsBackToThePieceWhenTheLedgerRefuses() (gas: 7199038)\n[PASS] test_resaleSellerCannotBeBroker() (gas: 7096477)\n[PASS] test_resaleWithoutEligibleBroker_sellerKeepsTheShare() (gas: 6885635)\n[PASS] test_setBrokerPassOnce() (gas: 64999)\n[PASS] test_sourceSplit_brokerAndArtistOnly() (gas: 6111470)\n[PASS] test_sourceSplit_noBrokerBurns() (gas: 5868911)\n[PASS] test_tokenURIIsOnChainJson() (gas: 388848)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 77.32ms (31.37ms CPU time)\n\nRan 1 test for test/audit/KeyReuseLeak.t.sol:KeyReuseLeakTest\n[PASS] test_copiedE_cantBePosted(uint256,uint256) (runs: 64, μ: 602937, ~: 603108)\nLogs:\n  Bound result 11818044032905497069688431977092257873442291733589656922755808936709498\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 81.57ms (64.71ms CPU time)\n\nRan 6 tests for test/EscrowDeadline.t.sol:EditionEscrowDeadlineTest\n[PASS] testFuzz_postAfterDeadlineReverts(uint32) (runs: 64, μ: 367100, ~: 367100)\n[PASS] test_cancelledSaleCanBeBoughtAgain() (gas: 780559)\n[PASS] test_expiredSaleCanBeRefundedAndBoughtAgain() (gas: 900319)\n[PASS] test_postAtCancellationDeadlineReverts() (gas: 366958)\n[PASS] test_postJustBeforeDeadlinePreventsCancellation() (gas: 662150)\n[PASS] test_postOneSecondAfterDeadlineReverts() (gas: 367278)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 94.40ms (37.52ms CPU time)\n\nRan 21 tests for test/ArtHouse.t.sol:ArtHouseTest\n[PASS] testFuzz_ethSplitInvariant(uint96,bool,bool) (runs: 64, μ: 1192097, ~: 1162488)\n[PASS] testFuzz_imdSplitInvariant(uint96,bool) (runs: 64, μ: 1307757, ~: 1298483)\n[PASS] test_artistPayoutOnlyArtist_keptOnReapproval() (gas: 179207)\n[PASS] test_collectionMintOnlyHouse() (gas: 73967)\n[PASS] test_curationFlow_andFailures() (gas: 938837)\n[PASS] test_customSplit() (gas: 1124713)\n[PASS] test_deploymentWiring() (gas: 93139)\n[PASS] test_imdBuybackIsReleasedAndBurned() (gas: 1882866)\n[PASS] test_mintFailures() (gas: 1550882)\n[PASS] test_onlyCuratorApproves() (gas: 123827)\n[PASS] test_pieceOver100KBRejected() (gas: 21310484)\n[PASS] test_recordSaleOnlyModules() (gas: 120446)\n[PASS] test_reentrancyOnWithdrawBlocked() (gas: 1838346)\n[PASS] test_revokedArtistLosesCuration() (gas: 582575)\n[PASS] test_sealNeedsEveryPieceFinalized() (gas: 527413)\n[PASS] test_setHouseOnce() (gas: 78294)\n[PASS] test_submissions() (gas: 260658)\n[PASS] test_tokenURIOnChain() (gas: 1190981)\n[PASS] test_twoStepOwnership_noRenounce() (gas: 198046)\n[PASS] test_withdrawNothingReverts_andHouseGoesToCurrentOwner() (gas: 1241987)\n[PASS] test_wrongHashIsCorrectable() (gas: 777075)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 99.87ms (102.58ms CPU time)\n\nRan 1 test for test/ClaimEnd.t.sol:EndBeforeOpenTest\n[PASS] test_endSale_beforeOpening_refused() (gas: 60691353)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 40.73ms (36.83ms CPU time)\n\nRan 6 tests for test/EscrowDeadline.t.sol:SourceEscrowDeadlineTest\n[PASS] testFuzz_postAfterDeadlineReverts(uint32) (runs: 64, μ: 367037, ~: 367037)\n[PASS] test_cancelledSaleCanBeBoughtAgain() (gas: 820699)\n[PASS] test_expiredSaleCanBeRefundedAndBoughtAgain() (gas: 940459)\n[PASS] test_postAtCancellationDeadlineReverts() (gas: 366895)\n[PASS] test_postJustBeforeDeadlinePreventsCancellation() (gas: 702323)\n[PASS] test_postOneSecondAfterDeadlineReverts() (gas: 367215)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 110.26ms (48.54ms CPU time)\n\nRan 10 tests for test/Artifacts.t.sol:ArtifactsPieceEscrowTest\n[PASS] test_escrowCancelBeforeKey_andDelist() (gas: 501042)\n[PASS] test_escrowHappyPath_buyerConfirms() (gas: 1181933)\n[PASS] test_escrowKeyMustNotBeEmpty() (gas: 311000)\n[PASS] test_escrowTimeoutRelease() (gas: 729073)\n[PASS] test_pieceViewingKeyZeroRejected() (gas: 168689)\n[PASS] test_plainTransferClearsKey_previousOwnerRekeys() (gas: 506819)\n[PASS] test_reentrancyOnEscrowWithdrawBlocked() (gas: 844317)\n[PASS] test_rewrapIsOneShotAndNonEmpty() (gas: 284134)\n[PASS] test_sellerCannotOverwriteKeyAfterRelease() (gas: 913380)\n[PASS] test_sourceOnlyReveal() (gas: 35552)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 39.40ms (4.93ms CPU time)\n\nRan 11 tests for test/Reviews.t.sol:ReviewsTest\n[PASS] testFuzz_tallyMatchesVoices(uint8[12]) (runs: 64, μ: 1437327, ~: 1442033)\n[PASS] test_aClaimedPieceIsAVoice_andAnUnclaimedOneIsNot() (gas: 67573205)\n[PASS] test_aMovedSeatStillHasOneVoice() (gas: 441792)\n[PASS] test_aSeatAndAPieceInOneWalletAreTwoVoices() (gas: 67297937)\n[PASS] test_anyoneAppliesToBeABroker() (gas: 224553)\n[PASS] test_anyonePublishesTheses() (gas: 810776)\n[PASS] test_changingAReviewMovesItsVote() (gas: 305393)\n[PASS] test_frozenOnceTheCuratorDecides_andAdvisoryOnly() (gas: 349039)\n[PASS] test_inputChecks() (gas: 307196)\n[PASS] test_onlyTheSeatHolderReviews() (gas: 97570)\n[PASS] test_seatsReview_andTheTallyFollows() (gas: 457095)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 151.54ms (144.41ms CPU time)\n\nRan 7 tests for test/Adversarial.t.sol:SourceEdgeTest\n[PASS] testFuzz_minimumRaiseIsCeilingOfFivePercent(uint96,uint96) (runs: 512, μ: 629577, ~: 629679)\nLogs:\n  Bound result 10368531\n  Bound result 455321846994\n\n[PASS] testFuzz_rendererHashIsKeccakOfConcatenation(bytes,bytes,bytes) (runs: 64, μ: 417957, ~: 413819)\n[PASS] test_bidBoundaries() (gas: 901651)\n[PASS] test_payloadChunkLimits() (gas: 5443288)\n[PASS] test_setAuctionEdges() (gas: 459334)\n[PASS] test_settleEdges_brokerSplit() (gas: 6915419)\n[PASS] test_settleWithUnapprovedBrokerPaysTheBurn() (gas: 5818742)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 160.42ms (169.97ms CPU time)\n\nRan 3 tests for test/Adversarial.t.sol:RuntimeTest\n[PASS] test_implementationsAreLocked() (gas: 104926)\n[PASS] test_launchedRuntimesAreBoundedAndHaveNoEscapeOpcodes() (gas: 60145375)\n[PASS] test_noRenounceAnywhere() (gas: 155507)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 215.45ms (207.13ms CPU time)\n\nRan 23 tests for test/Adversarial.t.sol:ArtHouseEdgeTest\n[PASS] testFuzz_everyoneWithdrawsExactlyTheirShare(uint96,uint96,uint96) (runs: 256, μ: 2047937, ~: 2051385)\nLogs:\n  Bound result 12590441983\n  Bound result 52789833680220852523\n  Bound result 95\n\n[PASS] testFuzz_splitConservesAndHouseTakesRounding(uint16,uint16,uint16,uint96,uint8) (runs: 512, μ: 262253, ~: 263033)\nLogs:\n  Bound result 5528\n  Bound result 36\n  Bound result 92\n  Bound result 13623317\n\n[PASS] test_artistEdges() (gas: 1210240)\n[PASS] test_buybackOnlyToTheBurnerSetOnce() (gas: 460935)\n[PASS] test_clearThenReuploadKeepsSizeAccounting() (gas: 40763894)\n[PASS] test_collectionErc721Edges() (gas: 1436052)\n[PASS] test_constructorsDoNotCallDependencies() (gas: 36654)\n[PASS] test_constructorsRejectZeroDependencies() (gas: 4550)\n[PASS] test_curationEdges() (gas: 780836)\n[PASS] test_defaultSplit_agentHouseBurn() (gas: 381579)\n[PASS] test_mintWithIMD_falseReturnRejected() (gas: 2073855)\n[PASS] test_mintWithIMD_feeOnTransferRejected() (gas: 2297085)\n[PASS] test_mintWithIMD_stalePriceRejected() (gas: 1250853)\n[PASS] test_mintZeroPricesReject() (gas: 943137)\n[PASS] test_moduleCollectionsHaveNoPlainCuration() (gas: 376256)\n[PASS] test_pendingOwnerHasNoPowerBeforeAccepting() (gas: 197527)\n[PASS] test_registerModuleCollectionTwiceReverts() (gas: 44789)\n[PASS] test_revokedBrokerKeepsEarnedBalance_butEarnsNoMore() (gas: 1291624)\n[PASS] test_sealEmptyCollectionRevertsAndSealIsOnce() (gas: 657864)\n[PASS] test_splitExtremes() (gas: 1284500)\n[PASS] test_submissionEdges() (gas: 246348)\n[PASS] test_updatePieceAccessEdges() (gas: 1976561)\n[PASS] test_withdrawToRevertingPayoutKeepsBalance() (gas: 1372032)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 292.40ms (326.84ms CPU time)\n\nRan 2 tests for test/LaunchDeployment.t.sol:LaunchDeploymentTest\n[PASS] test_allEightConstructorsAcceptCodeLessDependencies() (gas: 75014953)\n[PASS] test_manifestOrderAndOwnerConfigurationRemainIntact() (gas: 81642215)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 292.77ms (304.38ms CPU time)\n\nRan 25 tests for test/NothingStuck.t.sol:NothingStuckTest\n[PASS] test_aBuyerNeedsAViewingKeyAProofCanUse() (gas: 67149597)\n[PASS] test_aJunkKeyIsProvenFake_paymentAndDepositToTheBuyer() (gas: 67733962)\n[PASS] test_aSilentSellerLetsTheBuyerCancelAfter24Hours() (gas: 67321054)\n[PASS] test_anAuctionClosedInTimeCannotBeVoided() (gas: 5795810)\n[PASS] test_anAuctionNobodyCanCloseGivesTheBidBack() (gas: 6083672)\n[PASS] test_callbackGasCanOnlyGoUpOnceTheSaleOpens() (gas: 60960821)\n[PASS] test_claimWithoutAKey_after30Days_thenTheKeyGoesIntoThePiece() (gas: 67101500)\n[PASS] test_curatorReKeysAPieceItsPreviousOwnerNeverDid() (gas: 67257656)\n[PASS] test_fallbackDraw_aStartedDrawsResultStands_finishedFromTheHistory() (gas: 61896434)\n[PASS] test_fallbackDraw_chainlinkStillWinsIfItAnswersFirst() (gas: 61650523)\n[PASS] test_fallbackDraw_countsFromThePurchase() (gas: 61827139)\n[PASS] test_fallbackDraw_oneAtATime() (gas: 62775290)\n[PASS] test_fallbackDraw_onlyAfterThreeDays_fromABlockNobodyKnew() (gas: 61810020)\n[PASS] test_fallbackDraw_startsAgainOnlyOnceItsHashIsGone() (gas: 61653096)\n[PASS] test_fallbackDraw_startsOnAYoungRequestTheCoordinatorNoLongerHolds() (gas: 61625047)\n[PASS] test_noProofBeforeAKey_andTheSellerCantDodgeOne() (gas: 67681280)\n[PASS] test_onlyAKeyTheSellerMadeCanBePosted() (gas: 67743337)\n[PASS] test_realKeys_aJunkKeyIsProvenFake() (gas: 907004)\nLogs:\n  gas for the buyer's proveFakeKey: 170130\n\n[PASS] test_realKeys_anHonestKeyCanNeverBeProvenFake() (gas: 1254824)\n[PASS] test_realKeys_theBuyerCantSwapViewingKeysToFrameTheSeller() (gas: 887941)\n[PASS] test_realKeys_theRightKeyWrappedToAnotherKeyIsFake() (gas: 894622)\n[PASS] test_the72HoursCountFromTheKey() (gas: 67742493)\n[PASS] test_theBuyerCantCancelUnderAPendingKey() (gas: 67517486)\n[PASS] test_theDepositIsExactly10Percent() (gas: 67621950)\n[PASS] test_theSellerCanRefundBeforeSendingAKey() (gas: 67428489)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 390.31ms (696.16ms CPU time)\n\nRan 5 tests for test/invariants/BuybackConservation.t.sol:BuybackConservationTest\n[PASS]\nBuybackConservationTest invariants:\n[PASS] invariant_ethGoesOnlyToPool\n[PASS] invariant_imdGoesOnlyToBurnDestination\n BuybackConservationTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭----------------------------+----------------------+-------+---------+----------╮\n| Contract                   | Selector             | Calls | Reverts | Discards |\n+================================================================================+\n| BuybackConservationHandler | advanceTime          | 679   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | burnIMD              | 679   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | curatorSwap          | 686   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | donateETH            | 639   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | donateIMD            | 724   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | handover             | 713   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | publicSwap           | 671   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | rejectedSwap         | 685   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | unauthorizedCallback | 668   | 0       | 0        |\n╰----------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5000000000000000000\n  Bound result 2000000000000000000\n  Bound result 7031\n  Bound result 78\n\n[PASS] testFuzz_fundingBurnRoundTrip(uint96,uint96) (runs: 1000, μ: 645484, ~: 645531)\nLogs:\n  Bound result 2\n  Bound result 7329\n\n[PASS] test_failedCuratorSwapDoesNotPostponePublicLiveness() (gas: 896798)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 3\n\n[PASS] test_oneWeiSwapAndDirectBurnConserveFunds() (gas: 603515)\nLogs:\n  Bound result 1\n  Bound result 1\n\n[PASS] test_publicSwapDrainsRemainderBelowTheDailyCap() (gas: 334842)\nLogs:\n  Bound result 1\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.20s (1.29s CPU time)\n\nRan 1 test for test/invariants/SourceAuctionInvariant.t.sol:SourceAuctionInvariantTest\n[PASS]\nSourceAuctionInvariantTest invariants:\n[PASS] invariant_auctionConservation\n[PASS] invariant_highBidMonotone\n[PASS] invariant_settlementIsFinal\n SourceAuctionInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭----------------+--------------------+-------+---------+----------╮\n| Contract       | Selector           | Calls | Reverts | Discards |\n+==================================================================+\n| AuctionHandler | bid                | 856   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | payloadStaysLocked | 800   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | recordHigh         | 799   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | setAuction         | 788   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | settle             | 876   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | warp               | 846   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | withdrawRefund     | 795   | 0       | 0        |\n╰----------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 64\n  Bound result 36\n  Bound result 10029\n  Bound result 6400\n  Bound result 80\n  Bound result 793\n  Bound result 5596\n  Bound result 85\n  Bound result 2000000000000000987\n  Bound result 1400\n  Bound result 255\n  Bound result 33\n  Bound result 4366791704086718184\n  Bound result 4000000003581908589\n  Bound result 478\n  Bound result 649\n  Bound result 1413\n  Bound result 50\n  Bound result 231\n  Bound result 6000000000000000245\n  Bound result 415\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.54s (1.52s CPU time)\n\nRan 1 test for test/invariants/PieceEscrowInvariant.t.sol:PieceEscrowInvariantTest\n[PASS]\nPieceEscrowInvariantTest invariants:\n[PASS] invariant_escrowConservation\n[PASS] invariant_escrowSellerOwns\n[PASS] invariant_royaltyAndIdentity\n[PASS] invariant_singleToken\n PieceEscrowInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭---------------+--------------------+-------+---------+----------╮\n| Contract      | Selector           | Calls | Reverts | Discards |\n+=================================================================+\n| EscrowHandler | approveAndTransfer | 372   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | buy                | 368   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | cancel             | 383   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | delist             | 408   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | list               | 400   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | postKey            | 384   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | proveFake          | 392   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | refundBuyer        | 376   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | registerKey        | 337   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | release            | 372   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | rewrap             | 391   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | transfer           | 382   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | warp               | 380   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | withdraw           | 404   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | withdrawRoyalty    | 411   | 0       | 0        |\n╰---------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 171443\n  Bound result 78\n  Bound result 21001\n  Bound result 10000\n  Bound result 9474\n  Bound result 9045\n  Bound result 24782783692649250087\n  Bound result 576000\n  Bound result 17522\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.48s (2.40s CPU time)\n\nRan 15 tests for test/LaunchAudit.t.sol:LaunchAuditTest\n[PASS] testFuzz_memberReplyMustBeExactlyOneWord(uint16,uint256,uint256) (runs: 64, μ: 435739, ~: 434920)\nLogs:\n  Bound result 8193\n\n[PASS] test_attackerCannotInitializeCollectionAsRealHouse() (gas: 1082634)\n[PASS] test_attackerCannotInitializePieceAsRealFactory() (gas: 4983454)\n[PASS] test_attackerCannotInitializePieceAsRealSource() (gas: 4973750)\n[PASS] test_brokenBrokerPassDoesNotBlockEditionPurchase() (gas: 61675694)\n[PASS] test_brokenBrokerPassDoesNotBlockSourceSettlement() (gas: 19380521)\n[PASS] test_brokenPassDoesNotBlockPlainMintsInEitherCurrency() (gas: 2535075)\n[PASS] test_brokerPassMalformedRepliesCountAsIneligible() (gas: 934454)\n[PASS] test_claimedEditionsAreIndependentRuntimesAndStorage() (gas: 103403242)\n[PASS] test_dynamicMemberReplyCannotBypassEditionWindow() (gas: 61590217)\n[PASS] test_dynamicMemberReplyCannotBypassSourceWindow() (gas: 676729)\n[PASS] test_initializerRejectsEOAController() (gas: 6035471)\n[PASS] test_keyPostEventUnchangedBeforeAndAfterClaim() (gas: 67214905)\n[PASS] test_ownerCanClosePrimarySaleAndChangePendingAuctionSplit() (gas: 73113059)\n[PASS] test_plainCollectionIsIndependentRuntime() (gas: 4127353)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 2.60s (411.32ms CPU time)\n\nRan 12 tests for test/Gate.t.sol:GateTest\n[PASS] test_aHostileMembershipContractCountsAsNotMember() (gas: 62498695)\n[PASS] test_auction_gateFixedFromTheFirstBid() (gas: 714509)\n[PASS] test_auction_holdersFirstThenAnyone() (gas: 948469)\n[PASS] test_auction_membersBid_andTheMemberGateIsFixedFromTheFirstBid() (gas: 1006851)\n[PASS] test_brokenSeatContractCountsAsNotHeld() (gas: 61030979)\n[PASS] test_editions_gateFixedOnceTheSaleOpens() (gas: 61529270)\n[PASS] test_editions_holdersFirstThenAnyone() (gas: 62031088)\n[PASS] test_editions_membersBuyInTheWindow_asTokenHoldersDo() (gas: 62059353)\n[PASS] test_editions_noGateMeansOpen() (gas: 61274007)\n[PASS] test_editions_seatBuysUpToFivePerSeatWhereverItGoes() (gas: 62695785)\n[PASS] test_gateRules() (gas: 239527)\n[PASS] test_memberGateRules() (gas: 61261926)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 2.60s (252.62ms CPU time)\n\nRan 11 tests for test/ReviewRound4.t.sol:ReviewRound4Test\n[PASS] testFuzz_gateViewsNeverRevert(address,address,address) (runs: 64, μ: 147446, ~: 147548)\n[PASS] testFuzz_theFallbackResultStandsAgainstAnyLateWord(uint256,bytes32) (runs: 64, μ: 61602097, ~: 61602050)\n[PASS] test_aDeadFallbackDrawCanBeRerequested() (gas: 62342387)\n[PASS] test_aLiveFallbackDrawStillCannotBeRerequested() (gas: 61855098)\n[PASS] test_gateSeats_dirtyOwnerWord_isNotHeld() (gas: 61073739)\n[PASS] test_gateSeats_noCode_isNotHeld() (gas: 61538697)\n[PASS] test_gateSeats_withCode_unchanged() (gas: 61870940)\n[PASS] test_gateToken_noCode_isNotHeld_andMembersStillBuy() (gas: 62065872)\n[PASS] test_noChainlinkAnswerOnceTheFallbackHashIsPublic() (gas: 61639787)\n[PASS] test_noFallbackOnARequestChainlinkMayStillAnswer() (gas: 61638100)\n[PASS] test_source_gateNoCode_bidsRefusedNotReverted_membersBid() (gas: 998508)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 2.60s (2.01s CPU time)\n\nRan 1 test for test/invariants/ArtifactsFactoryInvariant.t.sol:ArtifactsFactoryInvariantTest\n[PASS]\nArtifactsFactoryInvariantTest invariants:\n[PASS] invariant_claimedPiecesBelongToBuyers\n[PASS] invariant_counts\n[PASS] invariant_ledgerHoldsEveryPurchase\n[PASS] invariant_lockedAndPriced\n[PASS] invariant_walletLimit\n ArtifactsFactoryInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| FactoryHandler | buy               | 551   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | buyMany           | 483   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | claim             | 510   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | fulfil            | 549   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | lockedForever     | 504   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | replay            | 510   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | rerequest         | 552   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | setPrice          | 513   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | strangerFulfil    | 543   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | strangerRerequest | 520   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | toggleSale        | 525   | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 0\n  Bound result 0\n  Bound result 3375794026\n  Bound result 5\n  Bound result 6\n  Bound result 8893983141532395648\n  Bound result 1\n  Bound result 4264337593543950335\n  Bound result 4264337593543950335\n  Bound result 1\n  Bound result 1\n  Bound result 17004\n  Bound result 4264337593543950333\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.73s (2.64s CPU time)\n\nRan 3 tests for test/invariants/FallbackDrawInvariant.t.sol:FallbackDrawInvariantTest\n[PASS]\nFallbackDrawInvariantTest invariants:\n[PASS] invariant_everyPurchaseOneEdition\n[PASS] invariant_oneFallbackAtATime\n[PASS] invariant_paymentsUntouched\n[PASS] invariant_retiredIdsStayDead\n FallbackDrawInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+------------------------+-------+---------+----------╮\n| Contract            | Selector               | Calls | Reverts | Discards |\n+===========================================================================+\n| FallbackDrawHandler | answer                 | 641   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | buy                    | 590   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | failedCallback         | 615   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | finishFallback         | 613   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | finishSettledOrRetired | 607   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | lateAnswerToRetired    | 576   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | rerequest              | 613   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | roll                   | 638   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | startFallback          | 588   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | strangerRerequest      | 663   | 0       | 0        |\n╰---------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2\n  Bound result 29\n  Bound result 5\n  Bound result 20\n  Bound result 29\n  Bound result 8\n  Bound result 1\n  Bound result 3\n  Bound result 42\n\n[PASS] test_deadFallbackIsClearedByARerequest() (gas: 1953077)\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 0\n\n[PASS] test_fallbackRouteIsReachable() (gas: 1625757)\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 4.62s (4.55s CPU time)\n\nRan 1 test for test/invariants/ArtHouseInvariant.t.sol:ArtHouseInvariantTest\n[PASS]\nArtHouseInvariantTest invariants:\n[PASS] invariant_constants\n[PASS] invariant_ethConservation\n[PASS] invariant_imdConservation\n[PASS] invariant_noOverWithdrawal\n[PASS] invariant_supplyAndSeal\n ArtHouseInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| LedgerHandler | handOver       | 389   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | mintETH        | 368   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | mintIMD        | 362   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | moduleSale     | 409   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | releaseBuyback | 427   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setBroker      | 415   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setPayout      | 401   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setPrices      | 373   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setSaleOpen    | 387   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setSplit       | 430   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | strangerCalls  | 400   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | withdraw       | 391   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | withdrawHouse  | 368   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 200000000000000000\n  Bound result 15419\n  Bound result 95\n  Bound result 2965\n  Bound result 986\n  Bound result 299999\n  Bound result 33\n  Bound result 5727\n  Bound result 85\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.61s (5.59s CPU time)\n\nRan 4 tests for test/invariants/BrokerClaimsInvariant.t.sol:BrokerClaimsInvariantTest\n[PASS]\nBrokerClaimsInvariantTest invariants:\n[PASS] invariant_claimHistorySurvivesTransfers\n[PASS] invariant_ownershipBalancesAndBrokerRightsAgree\n BrokerClaimsInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+------------------+-------+---------+----------╮\n| Contract            | Selector         | Calls | Reverts | Discards |\n+=====================================================================+\n| BrokerClaimsHandler | advanceTime      | 838   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | claimPiece       | 912   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | claimSeat        | 878   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | movePass         | 899   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | movePiece        | 940   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | moveSeat         | 859   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | rejectedTransfer | 818   | 0       | 0        |\n╰---------------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 166400\n  Bound result 170866\n  Bound result 50660\n  Bound result 120331\n  Bound result 166400\n  Bound result 168662\n\n[PASS] test_seatAndPassTransfersDoNotResetEitherClaimLimit() (gas: 1553655)\n[PASS] test_sourceClaimAlsoConsumesTheWalletsSeatEntitlement() (gas: 1137627)\n[PASS] test_startIsInclusiveAndClosedClaimsLeaveNoHistory() (gas: 1893855)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 6.42s (6.34s CPU time)\n\nRan 3 tests for test/invariants/ReviewHistoryInvariant.t.sol:ReviewHistoryInvariantTest\n[PASS]\nReviewHistoryInvariantTest invariants:\n[PASS] invariant_pagesKeepFirstReviewOrderAndLatestContents\n[PASS] invariant_thesisCountsDistinctAuthorsWithoutGrantingBrokerPowers\n[PASS] invariant_votesArePerCredentialAndFinalDecisionsFreezeRecords\n ReviewHistoryInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭----------------------+---------------+-------+---------+----------╮\n| Contract             | Selector      | Calls | Reverts | Discards |\n+===================================================================+\n| ReviewHistoryHandler | advanceTime   | 1096  | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | decide        | 1077  | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | invalidReview | 974   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | moveSeat      | 986   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | review        | 996   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | thesis        | 1015  | 0       | 0        |\n╰----------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2336000\n  Bound result 33\n  Bound result 19\n  Bound result 21079\n  Bound result 224\n  Bound result 4776\n  Bound result 2526\n  Bound result 1461004\n  Bound result 50000\n  Bound result 2537077\n  Bound result 1826\n  Bound result 7684\n\n[PASS] test_finalDecisionsFreezeOldAndNewHolderReviews() (gas: 1951545)\n[PASS] test_transferredSeatEditsOneExistingVoiceInPlace() (gas: 1175361)\nLogs:\n  Bound result 1\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 9.36s (9.35s CPU time)\n\nRan 16 tests for test/Artifacts.t.sol:ArtifactsFactoryTest\n[PASS] test_buyFailures() (gas: 60997239)\n[PASS] test_buyMany_cannotPassSupply() (gas: 98935498)\n[PASS] test_buyMany_fivePerWallet() (gas: 63860710)\n[PASS] test_buyRecordsSaleAndAssignsEveryEditionOnce() (gas: 178065420)\n[PASS] test_claimFlow_andFailures() (gas: 67407363)\n[PASS] test_postWrappedKeysInOneBatch() (gas: 67705114)\n[PASS] test_publishAndLock_accessAndFailures() (gas: 60947985)\n[PASS] test_rerequestAtOnceWhenTheCoordinatorAnsweredButTheCallbackFailed() (gas: 61875354)\n[PASS] test_rerequestRandomnessAfterDroppedRequest() (gas: 62033982)\n[PASS] test_saleControl() (gas: 61043179)\n[PASS] test_sealTokenURIMatchesR8Frame() (gas: 970363405)\n[PASS] test_viewingKeyZeroRejected() (gas: 33301)\n[PASS] test_vrfCallbackCannotBeReplayed() (gas: 61629805)\n[PASS] test_vrfCallbackGasIsTheCuratorsToTune() (gas: 61431482)\n[PASS] test_vrfCorrectableUntilTheSaleOpens_thenLockedForever() (gas: 62248774)\n[PASS] test_vrfMustBeConfiguredBeforeSelling() (gas: 46850)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 17.62s (3.16s CPU time)\n\nRan 12 tests for test/Source.t.sol:ArtifactsSourceTest\n[PASS] testFuzz_revealOpensTheSealedSeed(bytes32,bytes32) (runs: 64, μ: 5843090, ~: 5843178)\n[PASS] test_auctionNeedsTheHouseToAcceptTheSale() (gas: 3285282)\n[PASS] test_auctionNeedsTheSourceLocked() (gas: 620659)\n[PASS] test_auctionReopensWhenNoBids() (gas: 441150)\n[PASS] test_auctionRules() (gas: 6681882)\n[PASS] test_bidReentrancyAndRefundPull() (gas: 767944)\n[PASS] test_deliverKeyOnceToTheWinner() (gas: 9191286)\n[PASS] test_noRevealWhileABuyerIsInEscrow() (gas: 8961688)\n[PASS] test_revealServesTheRendererWithItsSeed() (gas: 512439761)\nLogs:\n  revealed tokenURI gas: 2897251\n\n[PASS] test_revealTakesDownAListingWithNoBuyer() (gas: 8893098)\n[PASS] test_storedSeedIsSealed() (gas: 8683528)\n[PASS] test_tinyBidsMustStrictlyExceed() (gas: 940816)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 17.68s (1.61s CPU time)\n\nRan 13 tests for test/Adversarial.t.sol:ArtifactsEdgeTest\n[PASS] testFuzz_anyWordsAssignDistinctEditions(uint256[8]) (runs: 256, μ: 64664233, ~: 64666893)\n[PASS] testFuzz_sealFramesAnyTraits(uint8,uint8,uint8,uint8,uint8) (runs: 16, μ: 519751208, ~: 519749233)\nLogs:\n  Bound result 3\n\n[PASS] test_buyRevertsAtomicallyWhenCoordinatorReverts() (gas: 59197366)\n[PASS] test_callbackWithNoWordsReverts() (gas: 61551984)\n[PASS] test_claimedPieceIsAFullCopyOfTheImplementation() (gas: 67197423)\n[PASS] test_configureVRFRejectsZeroes() (gas: 211437)\n[PASS] test_duplicateRequestIdRejected() (gas: 59391685)\n[PASS] test_nonOwnerCannotRunTheSale() (gas: 60818098)\n[PASS] test_rerequestIsAtomicWhenCoordinatorReverts() (gas: 59885766)\n[PASS] test_rerequestWindowBoundaryAndChaining() (gas: 67773076)\n[PASS] test_setPieceEdges() (gas: 61051490)\n[PASS] test_unapprovedBuyerAsBrokerEarnsNothing_andOneWeiPriceWorks() (gas: 61489495)\n[PASS] test_wrappedKeyEdges() (gas: 67181302)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 17.68s (19.93s CPU time)\n\nRan 36 test suites in 17.70s (97.13s CPU time): 271 tests passed, 0 failed, 2 skipped (273 total tests)\n","passed":true},{"durationMs":226,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ArtCollection.approve(address,uint256)\",\"ArtCollection.initialize(address,string,string)\",\"ArtCollection.mint(address,uint256)\",\"ArtCollection.safeTransferFrom(address,address,uint256)\",\"ArtCollection.safeTransferFrom(address,address,uint256,bytes)\",\"ArtCollection.setApprovalForAll(address,bool)\",\"ArtCollection.transferFrom(address,address,uint256)\",\"ArtHouse.acceptOwnership()\",\"ArtHouse.approveArtist(address,string)\",\"ArtHouse.clearPiece(address,uint256)\",\"ArtHouse.createCollection(string,string,address)\",\"ArtHouse.decideSubmission(uint256,bool)\",\"ArtHouse.finalizePiece(address,uint256)\",\"ArtHouse.mint(address,uint256,address)\",\"ArtHouse.mintWithIMD(address,uint256,address,uint256)\",\"ArtHouse.recordResale(address,uint256,uint256)\",\"ArtHouse.recordSale(address,address,address)\",\"ArtHouse.registerModuleCollection(address,address)\",\"ArtHouse.registerPiece(address,uint256,bytes32,string,string)\",\"ArtHouse.releaseBuyback(address)\",\"ArtHouse.revokeArtist(address)\",\"ArtHouse.sealCollection(address)\",\"ArtHouse.setBroker(address,bool)\",\"ArtHouse.setBrokerPass(address)\",\"ArtHouse.setBuybackBurner(address)\",\"ArtHouse.setPayout(address)\",\"ArtHouse.setPrices(address,uint256,uint256)\",\"ArtHouse.setSaleModule(address,bool)\",\"ArtHouse.setSaleOpen(address,bool)\",\"ArtHouse.setSplit(address,uint16,uint16,uint16,uint16)\",\"ArtHouse.submit(bytes32,string)\",\"ArtHouse.transferOwnership(address)\",\"ArtHouse.updatePiece(address,uint256,bytes32,string,string)\",\"ArtHouse.uploadChunk(address,uint256,uint256,bytes)\",\"ArtHouse.withdraw(address)\",\"ArtHouse.withdrawHouse(address)\",\"ArtStorage.acceptOwnership()\",\"ArtStorage.clear(address,uint256)\",\"ArtStorage.setHouse(address)\",\"ArtStorage.transferOwnership(address)\",\"ArtStorage.write(address,uint256,uint256,bytes)\",\"ArtifactsFactory.acceptOwnership()\",\"ArtifactsFactory.buy(address)\",\"ArtifactsFactory.buyMany(uint256,address)\",\"ArtifactsFactory.buyWithSeat(uint256,uint256,address)\",\"ArtifactsFactory.claim(uint256)\",\"ArtifactsFactory.claimMany(uint256[])\",\"ArtifactsFactory.configureVRF(address,bytes32,uint256,bool)\",\"ArtifactsFactory.endSale()\",\"ArtifactsFactory.finishFallbackDraw(uint256)\",\"ArtifactsFactory.lock()\",\"ArtifactsFactory.postWrappedKey(uint256,bytes)\",\"ArtifactsFactory.postWrappedKeys(uint256[],bytes[])\",\"ArtifactsFactory.rawFulfillRandomWords(uint256,uint256[])\",\"ArtifactsFactory.registerViewingKey(bytes32)\",\"ArtifactsFactory.rerequestRandomness(uint256)\",\"ArtifactsFactory.setGate(address,address,uint256,uint64)\",\"ArtifactsFactory.setMemberGate(address,bytes4,uint256)\",\"ArtifactsFactory.setMintPhases(uint64,uint8,uint64,uint8)\",\"ArtifactsFactory.setPiece(uint256,(string,string,uint8,string),bytes,bytes32)\",\"ArtifactsFactory.setPrice(uint256)\",\"ArtifactsFactory.setSaleOpen(bool)\",\"ArtifactsFactory.setVRFCallbackGas(uint32)\",\"ArtifactsFactory.startFallbackDraw(uint256)\",\"ArtifactsFactory.transferOwnership(address)\",\"ArtifactsPiece.approve(address,uint256)\",\"ArtifactsPiece.buy(bytes32,address)\",\"ArtifactsPiece.cancel()\",\"ArtifactsPiece.delist()\",\"ArtifactsPiece.initialize(address,address,uint256,address,(string,string,uint8,string),address,bytes32,bytes,bool,bytes32)\",\"ArtifactsPiece.list(uint256)\",\"ArtifactsPiece.postEscrowKey(bytes,address,uint256)\",\"ArtifactsPiece.proveFakeKey((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))\",\"ArtifactsPiece.refundBuyer()\",\"ArtifactsPiece.registerViewingKey(bytes32)\",\"ArtifactsPiece.release()\",\"ArtifactsPiece.reveal(bytes32)\",\"ArtifactsPiece.rewrapFor(bytes)\",\"ArtifactsPiece.safeTransferFrom(address,address,uint256)\",\"ArtifactsPiece.safeTransferFrom(address,address,uint256,bytes)\",\"ArtifactsPiece.setApprovalForAll(address,bool)\",\"ArtifactsPiece.transferFrom(address,address,uint256)\",\"ArtifactsPiece.withdraw()\",\"ArtifactsSource.acceptOwnership()\",\"ArtifactsSource.bid(address)\",\"ArtifactsSource.deliverKey(bytes)\",\"ArtifactsSource.lock(bytes32,bytes32)\",\"ArtifactsSource.resetRenderer()\",\"ArtifactsSource.setAuction(uint256,uint64)\",\"ArtifactsSource.setGate(address,address,uint256,uint64)\",\"ArtifactsSource.setMemberGate(address,bytes4,uint256)\",\"ArtifactsSource.settle()\",\"ArtifactsSource.storeRendererChunk(bytes)\",\"ArtifactsSource.transferOwnership(address)\",\"ArtifactsSource.voidUnsettled()\",\"ArtifactsSource.withdrawRefund()\",\"BrokerPass.approve(address,uint256)\",\"BrokerPass.claimWithPiece(uint256)\",\"BrokerPass.claimWithSeat(uint256)\",\"BrokerPass.safeTransferFrom(address,address,uint256)\",\"BrokerPass.safeTransferFrom(address,address,uint256,bytes)\",\"BrokerPass.setApprovalForAll(address,bool)\",\"BrokerPass.setClaimsOpenAt(uint64)\",\"BrokerPass.transferFrom(address,address,uint256)\",\"ImdBuybackBurner.burnEth(uint256,uint256,uint256)\",\"ImdBuybackBurner.burnImd()\",\"ImdBuybackBurner.receive()\",\"ImdBuybackBurner.unlockCallback(bytes)\",\"SubmissionReviews.applyAsBroker(string)\",\"SubmissionReviews.postThesis(uint256,string)\",\"SubmissionReviews.reviewAsPiece(uint256,uint256,uint8,string)\",\"SubmissionReviews.reviewAsSeat(uint256,uint256,uint8,string)\"],\"files\":{\".gitignore\":3,\"ADAPTATION.md\":463,\"README.md\":256,\"foundry.toml\":25,\"launch.burner.json\":17,\"launch.json\":63,\"reference/PROTOCOL.md\":99,\"reference/RULES.md\":137,\"reference/audit/V13Audit.t.sol.txt\":381,\"reference/check-framed.js\":25,\"reference/framed/framed-003.svg\":1,\"reference/framed/framed-MASTER.svg\":1,\"reference/rules.js\":145,\"reference/the-source.renderer.html\":148,\"remappings.txt\":1,\"script/Deploy.s.sol\":39,\"src/ArtCollection.sol\":55,\"src/ArtHouse.sol\":609,\"src/ArtStorage.sol\":82,\"src/ArtifactsFactory.sol\":635,\"src/ArtifactsPiece.sol\":460,\"src/ArtifactsSource.sol\":271,\"src/BrokerPass.sol\":142,\"src/ImdBuybackBurner.sol\":163,\"src/KeyProof.sol\":154,\"src/SubmissionReviews.sol\":215,\"src/base/ERC721Lite.sol\":122,\"src/base/HolderGate.sol\":113,\"src/base/ReentrancyGuard.sol\":15,\"src/base/TwoStepOwnable.sol\":40,\"src/interfaces/Interfaces.sol\":93,\"src/libs/Clones.sol\":19,\"src/libs/Encoding.sol\":79,\"src/libs/SSTORE2.sol\":41,\"src/libs/Seal.sol\":102,\"test/Adversarial.t.sol\":1409,\"test/ArtHouse.t.sol\":463,\"test/Artifacts.t.sol\":673,\"test/AuditRound3.t.sol\":151,\"test/BrokerPass.t.sol\":373,\"test/Burner.t.sol\":161,\"test/ClaimEnd.t.sol\":152,\"test/EscrowDeadline.t.sol\":160,\"test/Fixture.sol\":230,\"test/Gate.t.sol\":295,\"test/KeyProof.t.sol\":134,\"test/LaunchAudit.t.sol\":338,\"test/LaunchDeployment.t.sol\":191,\"test/NothingStuck.t.sol\":594,\"test/Phases.t.sol\":130,\"test/ReviewRound4.t.sol\":262,\"test/Reviews.t.sol\":264,\"test/Source.t.sol\":396,\"test/audit/KeyProofEdges.t.sol\":178,\"test/audit/KeyReuseLeak.t.sol\":38,\"test/fixtures/keyproof.json\":81,\"test/fork/BurnerFork.t.sol\":70,\"test/fork/VrfFork.t.sol\":131,\"test/invariants/ADDED_COVERAGE.md\":24,\"test/invariants/ArtHouseInvariant.t.sol\":444,\"test/invariants/ArtifactsFactoryInvariant.t.sol\":323,\"test/invariants/BrokerClaimsInvariant.t.sol\":275,\"test/invariants/BuybackConservation.t.sol\":246,\"test/invariants/FallbackDrawInvariant.t.sol\":417,\"test/invariants/PieceEscrowInvariant.t.sol\":446,\"test/invariants/ReviewHistoryInvariant.t.sol\":245,\"test/invariants/SourceAuctionInvariant.t.sol\":227,\"test/mocks/AdversarialMocks.sol\":134,\"test/mocks/MockPoolManager.sol\":57,\"test/mocks/MockSeats.sol\":27,\"test/mocks/Mocks.sol\":149,\"test/mocks/TestVRFCoordinator.sol\":46,\"test/utils/Base64Decode.sol\":83},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"9c79ce8e98df34371699aa78e1d2af2e20f1c3818d5b5e5e9d538f78febb7844","verifiedTreeHash":"e372ade977842495920fb6d02f0cbaf27ca82361","verifierVersion":"0.1.0+a6ee6548"},{"checks":[{"durationMs":431518,"exitCode":0,"name":"build","output":"Compiling 76 files with Solc 0.8.26\nSolc 0.8.26 finished in 431.40s\nCompiler run successful with warnings:\nWarning (5667): Unused function parameter. Remove or comment out the variable name to silence this warning.\n   --> test/invariants/ArtHouseInvariant.t.sol:105:9:\n    |\n105 |         address buyer,\n    |         ^^^^^^^^^^^^^\n\n","passed":true},{"durationMs":9818,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/fork/BurnerFork.t.sol:BurnerForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 439.51µs (0.00ns CPU time)\n\nRan 8 tests for test/KeyProof.t.sol:KeyProofTest\n[PASS] test_aJunkKeyIsProvenFake() (gas: 369871)\nLogs:\n  gas to check a fake-key proof: 44805\n\n[PASS] test_aKeyThatOpensIsNeverProvenFake() (gas: 368087)\n[PASS] test_aProofOnlyHoldsForItsBuyerPieceAndChain() (gas: 416867)\n[PASS] test_aProofOnlyHoldsForItsOwnWrappedKey() (gas: 416275)\n[PASS] test_aTamperedProofFails() (gas: 768976)\n[PASS] test_madeUpBytesAndTheOldFormatAreFake() (gas: 690806)\n[PASS] test_theRightKeyForSomeoneElseIsProvenFake() (gas: 368314)\n[PASS] test_viewingKeys() (gas: 34725)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 5.07ms (4.18ms CPU time)\n\nRan 1 test for test/ClaimEnd.t.sol:EndBeforeOpenTest\n[PASS] test_endSale_beforeOpening_refused() (gas: 60691375)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 17.39ms (14.62ms CPU time)\n\nRan 6 tests for test/EscrowDeadline.t.sol:SourceEscrowDeadlineTest\n[PASS] testFuzz_postAfterDeadlineReverts(uint32) (runs: 64, μ: 367037, ~: 367037)\n[PASS] test_cancelledSaleCanBeBoughtAgain() (gas: 820699)\n[PASS] test_expiredSaleCanBeRefundedAndBoughtAgain() (gas: 940459)\n[PASS] test_postAtCancellationDeadlineReverts() (gas: 366895)\n[PASS] test_postJustBeforeDeadlinePreventsCancellation() (gas: 702323)\n[PASS] test_postOneSecondAfterDeadlineReverts() (gas: 367215)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 24.09ms (21.51ms CPU time)\n\nRan 5 tests for test/ClaimEnd.t.sol:ClaimEndTest\n[PASS] test_claimMany_claimsEveryOneInOneCall() (gas: 18008525)\n[PASS] test_claimMany_emptyRefused_andTheCuratorCanClaimForBuyers() (gas: 12217339)\n[PASS] test_claimMany_isAllOrNothing() (gas: 18066805)\n[PASS] test_endSale_isFinal() (gas: 6879895)\n[PASS] test_endSale_needsTheSaleToHaveOpened_andWorksWhileClosed() (gas: 96083)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 25.76ms (3.12ms CPU time)\n\nRan 4 tests for test/Phases.t.sol:PhasesTest\n[PASS] test_aSeatFollowsThePhases_whereverItGoes() (gas: 1758420)\n[PASS] test_afterTheWindow_anyoneUpToFive() (gas: 1052975)\n[PASS] test_capsRise_1_then_2_then_5_forAnImdHolder() (gas: 1751735)\n[PASS] test_setOnlyBeforeTheSaleOpens_andChecked() (gas: 333087)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 28.19ms (1.78ms CPU time)\n\nRan 6 tests for test/Adversarial.t.sol:PieceEdgeTest\n[PASS] test_cancelThenSecondBuyerAndRoyaltyToChangedPayout() (gas: 1088077)\n[PASS] test_listingEdges() (gas: 1003054)\n[PASS] test_releaseAtExactly72HoursByStranger() (gas: 914095)\n[PASS] test_revealNeedsTheSourceLocked_andEmptyRendererURI() (gas: 6214987)\n[PASS] test_safeTransferReceivers() (gas: 670237)\n[PASS] test_transferAuthEdges() (gas: 350213)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 29.48ms (3.76ms CPU time)\n\nRan 4 tests for test/AuditRound3.t.sol:AuditRound3Test\n[PASS] test_aReturnDataBombCostsThePayerNothing() (gas: 694196)\n[PASS] test_aShareThatWaitsInTheLedgerIsAnnounced() (gas: 339941)\n[PASS] test_theArtistsPayoutCantMoveThePieceDuringARelease() (gas: 415877)\n[PASS] test_theArtistsPayoutCantRelistDuringARelease() (gas: 600564)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 31.54ms (925.98µs CPU time)\n\nRan 1 test for test/audit/KeyReuseLeak.t.sol:KeyReuseLeakTest\n[PASS] test_copiedE_cantBePosted(uint256,uint256) (runs: 64, μ: 602934, ~: 603096)\nLogs:\n  Bound result 11818044032905497069688431977092257873442291733589656922755808936709498\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 35.37ms (31.86ms CPU time)\n\nRan 18 tests for test/BrokerPass.t.sol:BrokerPassTest\n[PASS] test_capIs100() (gas: 19752778)\n[PASS] test_claimWithPiece_onceEverPerPiece() (gas: 6633588)\n[PASS] test_claimWithSeat_onceEverPerSeat() (gas: 376003)\n[PASS] test_claimWithTheSource() (gas: 5963894)\n[PASS] test_claimsWaitForTheStartTime_setOnceByTheCurator() (gas: 489742)\n[PASS] test_oneClaimPerWallet() (gas: 6934488)\n[PASS] test_passHolderCanBrokerTheirOwnBuy() (gas: 1022234)\n[PASS] test_passHolderEarnsOnMint_andTheRightMovesWithThePass() (gas: 2088098)\n[PASS] test_recordResaleRejectsAnythingButAPiece() (gas: 298286)\n[PASS] test_resaleBrokerShare_creditedInTheLedger() (gas: 7248761)\n[PASS] test_resaleBuyerWithAPassCanBrokerTheirOwnBuy() (gas: 7186065)\n[PASS] test_resaleFallsBackToThePieceWhenTheLedgerRefuses() (gas: 7201166)\n[PASS] test_resaleSellerCannotBeBroker() (gas: 7098605)\n[PASS] test_resaleWithoutEligibleBroker_sellerKeepsTheShare() (gas: 6887763)\n[PASS] test_setBrokerPassOnce() (gas: 64999)\n[PASS] test_sourceSplit_brokerAndArtistOnly() (gas: 6115735)\n[PASS] test_sourceSplit_noBrokerBurns() (gas: 5873176)\n[PASS] test_tokenURIIsOnChainJson() (gas: 388848)\nSuite result: ok. 18 passed; 0 failed; 0 skipped; finished in 36.57ms (16.52ms CPU time)\n\nRan 1 test for test/LaunchGasCap.t.sol:LaunchGasCapTest\n[PASS] test_launchManifestFitsInOneMainnetTransaction() (gas: 27487764)\nLogs:\n  calldata bytes 66116\n  execution gas 14150696\n  total gas 15201436\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 37.38ms (37.29ms CPU time)\n\nRan 6 tests for test/PieceImplementation.t.sol:PieceImplementationTest\n[PASS] test_auctionCannotOpenWithoutThePieceImplementation() (gas: 583552)\n[PASS] test_reviewsOfReturnsTheTailForAHugeCount() (gas: 858155)\n[PASS] test_saleCannotOpenBeforeTheLedgerRegistersTheFactory() (gas: 59090880)\n[PASS] test_saleCannotOpenWithoutThePieceImplementation() (gas: 58925629)\n[PASS] test_setPieceImplementationOnceAndOnlyByTheOwner() (gas: 294913)\n[PASS] test_vrfCallbackMinimumIsAboveOneDraw() (gas: 61580020)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 46.71ms (62.49ms CPU time)\n\nRan 6 tests for test/EscrowDeadline.t.sol:EditionEscrowDeadlineTest\n[PASS] testFuzz_postAfterDeadlineReverts(uint32) (runs: 64, μ: 367100, ~: 367100)\n[PASS] test_cancelledSaleCanBeBoughtAgain() (gas: 780559)\n[PASS] test_expiredSaleCanBeRefundedAndBoughtAgain() (gas: 900319)\n[PASS] test_postAtCancellationDeadlineReverts() (gas: 366958)\n[PASS] test_postJustBeforeDeadlinePreventsCancellation() (gas: 662150)\n[PASS] test_postOneSecondAfterDeadlineReverts() (gas: 367278)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 46.02ms (27.71ms CPU time)\n\nRan 21 tests for test/ArtHouse.t.sol:ArtHouseTest\n[PASS] testFuzz_ethSplitInvariant(uint96,bool,bool) (runs: 64, μ: 1192095, ~: 1162488)\n[PASS] testFuzz_imdSplitInvariant(uint96,bool) (runs: 64, μ: 1307757, ~: 1298483)\n[PASS] test_artistPayoutOnlyArtist_keptOnReapproval() (gas: 179207)\n[PASS] test_collectionMintOnlyHouse() (gas: 73967)\n[PASS] test_curationFlow_andFailures() (gas: 938837)\n[PASS] test_customSplit() (gas: 1124713)\n[PASS] test_deploymentWiring() (gas: 93139)\n[PASS] test_imdBuybackIsReleasedAndBurned() (gas: 1882866)\n[PASS] test_mintFailures() (gas: 1550882)\n[PASS] test_onlyCuratorApproves() (gas: 123827)\n[PASS] test_pieceOver100KBRejected() (gas: 21310484)\n[PASS] test_recordSaleOnlyModules() (gas: 120446)\n[PASS] test_reentrancyOnWithdrawBlocked() (gas: 1838346)\n[PASS] test_revokedArtistLosesCuration() (gas: 582575)\n[PASS] test_sealNeedsEveryPieceFinalized() (gas: 527413)\n[PASS] test_setHouseOnce() (gas: 78294)\n[PASS] test_submissions() (gas: 260658)\n[PASS] test_tokenURIOnChain() (gas: 1190981)\n[PASS] test_twoStepOwnership_noRenounce() (gas: 198046)\n[PASS] test_withdrawNothingReverts_andHouseGoesToCurrentOwner() (gas: 1241987)\n[PASS] test_wrongHashIsCorrectable() (gas: 777075)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 63.71ms (64.70ms CPU time)\n\nRan 7 tests for test/Burner.t.sol:BurnerTest\n[PASS] test_anyoneBurnsHeldImd() (gas: 169949)\n[PASS] test_anyoneSwapsInSmallStepsAfter60QuietDays() (gas: 845755)\n[PASS] test_constructorChecks() (gas: 8711)\n[PASS] test_editionSaleToBurnedImd() (gas: 61811458)\n[PASS] test_onlyTheCuratorSwaps_withAMinimumAndADeadline() (gas: 653639)\n[PASS] test_onlyThePoolManagerCallsBack() (gas: 32189)\n[PASS] test_theNewOwnerSwapsAfterAHandover() (gas: 304000)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 29.93ms (27.08ms CPU time)\n\nRan 11 tests for test/Reviews.t.sol:ReviewsTest\n[PASS] testFuzz_tallyMatchesVoices(uint8[12]) (runs: 64, μ: 1436757, ~: 1440151)\n[PASS] test_aClaimedPieceIsAVoice_andAnUnclaimedOneIsNot() (gas: 67585998)\n[PASS] test_aMovedSeatStillHasOneVoice() (gas: 441792)\n[PASS] test_aSeatAndAPieceInOneWalletAreTwoVoices() (gas: 67310730)\n[PASS] test_anyoneAppliesToBeABroker() (gas: 224553)\n[PASS] test_anyonePublishesTheses() (gas: 810776)\n[PASS] test_changingAReviewMovesItsVote() (gas: 305393)\n[PASS] test_frozenOnceTheCuratorDecides_andAdvisoryOnly() (gas: 349039)\n[PASS] test_inputChecks() (gas: 307120)\n[PASS] test_onlyTheSeatHolderReviews() (gas: 97570)\n[PASS] test_seatsReview_andTheTallyFollows() (gas: 456977)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 62.18ms (95.83ms CPU time)\n\nRan 3 tests for test/Adversarial.t.sol:RuntimeTest\n[PASS] test_implementationsAreLocked() (gas: 104926)\n[PASS] test_launchedRuntimesAreBoundedAndHaveNoEscapeOpcodes() (gas: 60704522)\n[PASS] test_noRenounceAnywhere() (gas: 155551)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 76.78ms (74.74ms CPU time)\n\nRan 7 tests for test/Adversarial.t.sol:SourceEdgeTest\n[PASS] testFuzz_minimumRaiseIsCeilingOfFivePercent(uint96,uint96) (runs: 512, μ: 631776, ~: 631860)\nLogs:\n  Bound result 10368531\n  Bound result 455321846994\n\n[PASS] testFuzz_rendererHashIsKeccakOfConcatenation(bytes,bytes,bytes) (runs: 64, μ: 417881, ~: 414050)\n[PASS] test_bidBoundaries() (gas: 903854)\n[PASS] test_payloadChunkLimits() (gas: 5443398)\n[PASS] test_setAuctionEdges() (gas: 465767)\n[PASS] test_settleEdges_brokerSplit() (gas: 6921843)\n[PASS] test_settleWithUnapprovedBrokerPaysTheBurn() (gas: 5823007)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 99.87ms (98.74ms CPU time)\n\nRan 5 tests for test/audit/KeyProofEdges.t.sol:KeyProofEdgesTest\n[PASS] test_adversarialE_isProvable() (gas: 107849)\n[PASS] test_adversarialE_proofIsActuallyChecked() (gas: 23615)\n[PASS] test_negatedSCannotFrame() (gas: 60700)\n[PASS] test_oddYWrapThatOpensIsNotFake() (gas: 37558)\n[PASS] test_xEqualsN_isMalformed() (gas: 13218)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 101.18ms (11.98ms CPU time)\n\nRan 1 test for test/fork/VrfFork.t.sol:VrfForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 738.75µs (0.00ns CPU time)\n\nRan 2 tests for test/LaunchDeployment.t.sol:LaunchDeploymentTest\n[PASS] test_allSevenConstructorsAcceptCodeLessDependencies() (gas: 52017547)\n[PASS] test_manifestOrderAndOwnerConfigurationRemainIntact() (gas: 76313890)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 124.00ms (167.43ms CPU time)\n\nRan 12 tests for test/Gate.t.sol:GateTest\n[PASS] test_aHostileMembershipContractCountsAsNotMember() (gas: 62509470)\n[PASS] test_auction_gateFixedFromTheFirstBid() (gas: 716668)\n[PASS] test_auction_holdersFirstThenAnyone() (gas: 950650)\n[PASS] test_auction_membersBid_andTheMemberGateIsFixedFromTheFirstBid() (gas: 1009010)\n[PASS] test_brokenSeatContractCountsAsNotHeld() (gas: 61041666)\n[PASS] test_editions_gateFixedOnceTheSaleOpens() (gas: 61550600)\n[PASS] test_editions_holdersFirstThenAnyone() (gas: 62041819)\n[PASS] test_editions_membersBuyInTheWindow_asTokenHoldersDo() (gas: 62070062)\n[PASS] test_editions_noGateMeansOpen() (gas: 61284716)\n[PASS] test_editions_seatBuysUpToFivePerSeatWhereverItGoes() (gas: 62706626)\n[PASS] test_gateRules() (gas: 239527)\n[PASS] test_memberGateRules() (gas: 61272591)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 170.72ms (172.96ms CPU time)\n\nRan 23 tests for test/Adversarial.t.sol:ArtHouseEdgeTest\n[PASS] testFuzz_everyoneWithdrawsExactlyTheirShare(uint96,uint96,uint96) (runs: 256, μ: 2047930, ~: 2051430)\nLogs:\n  Bound result 12590441983\n  Bound result 52789833680220852523\n  Bound result 95\n\n[PASS] testFuzz_splitConservesAndHouseTakesRounding(uint16,uint16,uint16,uint96,uint8) (runs: 512, μ: 262562, ~: 263240)\nLogs:\n  Bound result 0\n  Bound result 949\n  Bound result 1\n  Bound result 2248466970756901\n\n[PASS] test_artistEdges() (gas: 1210240)\n[PASS] test_buybackOnlyToTheBurnerSetOnce() (gas: 460935)\n[PASS] test_clearThenReuploadKeepsSizeAccounting() (gas: 40763894)\n[PASS] test_collectionErc721Edges() (gas: 1436052)\n[PASS] test_constructorsDoNotCallDependencies() (gas: 48342)\n[PASS] test_constructorsRejectZeroDependencies() (gas: 4550)\n[PASS] test_curationEdges() (gas: 780836)\n[PASS] test_defaultSplit_agentHouseBurn() (gas: 381579)\n[PASS] test_mintWithIMD_falseReturnRejected() (gas: 2073855)\n[PASS] test_mintWithIMD_feeOnTransferRejected() (gas: 2297085)\n[PASS] test_mintWithIMD_stalePriceRejected() (gas: 1250853)\n[PASS] test_mintZeroPricesReject() (gas: 943137)\n[PASS] test_moduleCollectionsHaveNoPlainCuration() (gas: 376256)\n[PASS] test_pendingOwnerHasNoPowerBeforeAccepting() (gas: 197536)\n[PASS] test_registerModuleCollectionTwiceReverts() (gas: 44789)\n[PASS] test_revokedBrokerKeepsEarnedBalance_butEarnsNoMore() (gas: 1291624)\n[PASS] test_sealEmptyCollectionRevertsAndSealIsOnce() (gas: 657864)\n[PASS] test_splitExtremes() (gas: 1284500)\n[PASS] test_submissionEdges() (gas: 246348)\n[PASS] test_updatePieceAccessEdges() (gas: 1976567)\n[PASS] test_withdrawToRevertingPayoutKeepsBalance() (gas: 1372032)\nSuite result: ok. 23 passed; 0 failed; 0 skipped; finished in 170.94ms (235.25ms CPU time)\n\nRan 5 tests for test/invariants/BuybackConservation.t.sol:BuybackConservationTest\n[PASS]\nBuybackConservationTest invariants:\n[PASS] invariant_ethGoesOnlyToPool\n[PASS] invariant_imdGoesOnlyToBurnDestination\n BuybackConservationTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭----------------------------+----------------------+-------+---------+----------╮\n| Contract                   | Selector             | Calls | Reverts | Discards |\n+================================================================================+\n| BuybackConservationHandler | advanceTime          | 679   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | burnIMD              | 679   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | curatorSwap          | 686   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | donateETH            | 639   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | donateIMD            | 724   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | handover             | 713   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | publicSwap           | 671   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | rejectedSwap         | 685   | 0       | 0        |\n|----------------------------+----------------------+-------+---------+----------|\n| BuybackConservationHandler | unauthorizedCallback | 668   | 0       | 0        |\n╰----------------------------+----------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000000\n  Bound result 1500000000000000000\n  Bound result 6729\n  Bound result 26\n\n[PASS] testFuzz_fundingBurnRoundTrip(uint96,uint96) (runs: 1000, μ: 645484, ~: 645531)\nLogs:\n  Bound result 192\n  Bound result 62514264337593543950335\n\n[PASS] test_failedCuratorSwapDoesNotPostponePublicLiveness() (gas: 896798)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 3\n\n[PASS] test_oneWeiSwapAndDirectBurnConserveFunds() (gas: 603515)\nLogs:\n  Bound result 1\n  Bound result 1\n\n[PASS] test_publicSwapDrainsRemainderBelowTheDailyCap() (gas: 334842)\nLogs:\n  Bound result 1\n\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 728.77ms (803.66ms CPU time)\n\nRan 12 tests for test/Source.t.sol:ArtifactsSourceTest\n[PASS] testFuzz_revealOpensTheSealedSeed(bytes32,bytes32) (runs: 64, μ: 5847412, ~: 5847481)\n[PASS] test_auctionNeedsTheHouseToAcceptTheSale() (gas: 3287441)\n[PASS] test_auctionNeedsTheSourceLocked() (gas: 620787)\n[PASS] test_auctionReopensWhenNoBids() (gas: 445468)\n[PASS] test_auctionRules() (gas: 6690443)\n[PASS] test_bidReentrancyAndRefundPull() (gas: 770125)\n[PASS] test_deliverKeyOnceToTheWinner() (gas: 9195573)\n[PASS] test_noRevealWhileABuyerIsInEscrow() (gas: 8965997)\n[PASS] test_revealServesTheRendererWithItsSeed() (gas: 512444180)\nLogs:\n  revealed tokenURI gas: 2897295\n\n[PASS] test_revealTakesDownAListingWithNoBuyer() (gas: 8897385)\n[PASS] test_storedSeedIsSealed() (gas: 8687837)\n[PASS] test_tinyBidsMustStrictlyExceed() (gas: 942975)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 812.46ms (810.92ms CPU time)\n\nRan 11 tests for test/ReviewRound4.t.sol:ReviewRound4Test\n[PASS] testFuzz_gateViewsNeverRevert(address,address,address) (runs: 64, μ: 147464, ~: 147570)\n[PASS] testFuzz_theFallbackResultStandsAgainstAnyLateWord(uint256,bytes32) (runs: 64, μ: 61612779, ~: 61612765)\n[PASS] test_aDeadFallbackDrawCanBeRerequested() (gas: 62353184)\n[PASS] test_aLiveFallbackDrawStillCannotBeRerequested() (gas: 61865829)\n[PASS] test_gateSeats_dirtyOwnerWord_isNotHeld() (gas: 61084426)\n[PASS] test_gateSeats_noCode_isNotHeld() (gas: 61549406)\n[PASS] test_gateSeats_withCode_unchanged() (gas: 61881671)\n[PASS] test_gateToken_noCode_isNotHeld_andMembersStillBuy() (gas: 62076647)\n[PASS] test_noChainlinkAnswerOnceTheFallbackHashIsPublic() (gas: 61650518)\n[PASS] test_noFallbackOnARequestChainlinkMayStillAnswer() (gas: 61648831)\n[PASS] test_source_gateNoCode_bidsRefusedNotReverted_membersBid() (gas: 1000689)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 900.75ms (1.05s CPU time)\n\nRan 1 test for test/invariants/SourceAuctionInvariant.t.sol:SourceAuctionInvariantTest\n[PASS]\nSourceAuctionInvariantTest invariants:\n[PASS] invariant_auctionConservation\n[PASS] invariant_highBidMonotone\n[PASS] invariant_settlementIsFinal\n SourceAuctionInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭----------------+--------------------+-------+---------+----------╮\n| Contract       | Selector           | Calls | Reverts | Discards |\n+==================================================================+\n| AuctionHandler | bid                | 856   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | payloadStaysLocked | 800   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | recordHigh         | 799   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | setAuction         | 788   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | settle             | 876   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | warp               | 846   | 0       | 0        |\n|----------------+--------------------+-------+---------+----------|\n| AuctionHandler | withdrawRefund     | 795   | 0       | 0        |\n╰----------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 400\n  Bound result 1486\n  Bound result 8168\n  Bound result 4660\n  Bound result 1513\n  Bound result 793\n  Bound result 5596\n  Bound result 1571\n  Bound result 6400\n  Bound result 2000000000000250000\n  Bound result 279\n  Bound result 1800\n  Bound result 1000\n  Bound result 2000000000000011923\n  Bound result 33\n  Bound result 4366791704086718184\n  Bound result 1751\n  Bound result 649\n  Bound result 1659\n  Bound result 4288363214\n  Bound result 1736\n  Bound result 686\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 919.10ms (915.58ms CPU time)\n\nRan 15 tests for test/LaunchAudit.t.sol:LaunchAuditTest\n[PASS] testFuzz_memberReplyMustBeExactlyOneWord(uint16,uint256,uint256) (runs: 64, μ: 436096, ~: 434920)\nLogs:\n  Bound result 249999\n\n[PASS] test_attackerCannotInitializeCollectionAsRealHouse() (gas: 1082634)\n[PASS] test_attackerCannotInitializePieceAsRealFactory() (gas: 4983454)\n[PASS] test_attackerCannotInitializePieceAsRealSource() (gas: 4973750)\n[PASS] test_brokenBrokerPassDoesNotBlockEditionPurchase() (gas: 61686403)\n[PASS] test_brokenBrokerPassDoesNotBlockSourceSettlement() (gas: 19384786)\n[PASS] test_brokenPassDoesNotBlockPlainMintsInEitherCurrency() (gas: 2535075)\n[PASS] test_brokerPassMalformedRepliesCountAsIneligible() (gas: 934454)\n[PASS] test_claimedEditionsAreIndependentRuntimesAndStorage() (gas: 103418163)\n[PASS] test_dynamicMemberReplyCannotBypassEditionWindow() (gas: 61600926)\n[PASS] test_dynamicMemberReplyCannotBypassSourceWindow() (gas: 678888)\n[PASS] test_initializerRejectsEOAController() (gas: 6035471)\n[PASS] test_keyPostEventUnchangedBeforeAndAfterClaim() (gas: 67227720)\n[PASS] test_ownerCanClosePrimarySaleAndChangePendingAuctionSplit() (gas: 73130139)\n[PASS] test_plainCollectionIsIndependentRuntime() (gas: 4127353)\nSuite result: ok. 15 passed; 0 failed; 0 skipped; finished in 1.17s (189.69ms CPU time)\n\nRan 16 tests for test/Artifacts.t.sol:ArtifactsFactoryTest\n[PASS] test_buyFailures() (gas: 61007948)\n[PASS] test_buyMany_cannotPassSupply() (gas: 98946207)\n[PASS] test_buyMany_fivePerWallet() (gas: 63871507)\n[PASS] test_buyRecordsSaleAndAssignsEveryEditionOnce() (gas: 178087349)\n[PASS] test_claimFlow_andFailures() (gas: 67420156)\n[PASS] test_postWrappedKeysInOneBatch() (gas: 67717995)\n[PASS] test_publishAndLock_accessAndFailures() (gas: 60948051)\n[PASS] test_rerequestAtOnceWhenTheCoordinatorAnsweredButTheCallbackFailed() (gas: 61886063)\n[PASS] test_rerequestRandomnessAfterDroppedRequest() (gas: 62044713)\n[PASS] test_saleControl() (gas: 61053844)\n[PASS] test_sealTokenURIMatchesR8Frame() (gas: 970376198)\n[PASS] test_viewingKeyZeroRejected() (gas: 33301)\n[PASS] test_vrfCallbackCannotBeReplayed() (gas: 61640492)\n[PASS] test_vrfCallbackGasIsTheCuratorsToTune() (gas: 61442257)\n[PASS] test_vrfCorrectableUntilTheSaleOpens_thenLockedForever() (gas: 62259505)\n[PASS] test_vrfMustBeConfiguredBeforeSelling() (gas: 98429)\nSuite result: ok. 16 passed; 0 failed; 0 skipped; finished in 1.36s (1.68s CPU time)\n\nRan 1 test for test/invariants/PieceEscrowInvariant.t.sol:PieceEscrowInvariantTest\n[PASS]\nPieceEscrowInvariantTest invariants:\n[PASS] invariant_escrowConservation\n[PASS] invariant_escrowSellerOwns\n[PASS] invariant_royaltyAndIdentity\n[PASS] invariant_singleToken\n PieceEscrowInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭---------------+--------------------+-------+---------+----------╮\n| Contract      | Selector           | Calls | Reverts | Discards |\n+=================================================================+\n| EscrowHandler | approveAndTransfer | 372   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | buy                | 368   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | cancel             | 383   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | delist             | 408   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | list               | 400   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | postKey            | 384   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | proveFake          | 392   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | refundBuyer        | 376   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | registerKey        | 337   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | release            | 372   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | rewrap             | 391   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | transfer           | 382   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | warp               | 380   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | withdraw           | 404   | 0       | 0        |\n|---------------+--------------------+-------+---------+----------|\n| EscrowHandler | withdrawRoyalty    | 411   | 0       | 0        |\n╰---------------+--------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 171443\n  Bound result 29\n  Bound result 18997\n  Bound result 10000\n  Bound result 6581\n  Bound result 24782783692649250087\n  Bound result 85\n  Bound result 16618\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.48s (1.44s CPU time)\n\nRan 1 test for test/invariants/ArtifactsFactoryInvariant.t.sol:ArtifactsFactoryInvariantTest\n[PASS]\nArtifactsFactoryInvariantTest invariants:\n[PASS] invariant_claimedPiecesBelongToBuyers\n[PASS] invariant_counts\n[PASS] invariant_ledgerHoldsEveryPurchase\n[PASS] invariant_lockedAndPriced\n[PASS] invariant_walletLimit\n ArtifactsFactoryInvariantTest invariants (runs: 96, calls: 5760, reverts: 0)\n\n╭----------------+-------------------+-------+---------+----------╮\n| Contract       | Selector          | Calls | Reverts | Discards |\n+=================================================================+\n| FactoryHandler | buy               | 551   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | buyMany           | 483   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | claim             | 510   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | fulfil            | 549   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | lockedForever     | 504   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | replay            | 510   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | rerequest         | 552   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | setPrice          | 513   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | strangerFulfil    | 543   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | strangerRerequest | 520   | 0       | 0        |\n|----------------+-------------------+-------+---------+----------|\n| FactoryHandler | toggleSale        | 525   | 0       | 0        |\n╰----------------+-------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1\n  Bound result 2\n  Bound result 3642\n  Bound result 5\n  Bound result 6\n  Bound result 4094202694630420282\n  Bound result 0\n  Bound result 4264337593543950335\n  Bound result 4264337593543950335\n  Bound result 1\n  Bound result 3\n  Bound result 406350608133546612\n  Bound result 4264337593543950333\n  Bound result 3\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.66s (1.62s CPU time)\n\nRan 3 tests for test/invariants/FallbackDrawInvariant.t.sol:FallbackDrawInvariantTest\n[PASS]\nFallbackDrawInvariantTest invariants:\n[PASS] invariant_everyPurchaseOneEdition\n[PASS] invariant_oneFallbackAtATime\n[PASS] invariant_paymentsUntouched\n[PASS] invariant_retiredIdsStayDead\n FallbackDrawInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+------------------------+-------+---------+----------╮\n| Contract            | Selector               | Calls | Reverts | Discards |\n+===========================================================================+\n| FallbackDrawHandler | answer                 | 641   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | buy                    | 590   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | failedCallback         | 615   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | finishFallback         | 613   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | finishSettledOrRetired | 607   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | lateAnswerToRetired    | 576   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | rerequest              | 613   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | roll                   | 638   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | startFallback          | 588   | 0       | 0        |\n|---------------------+------------------------+-------+---------+----------|\n| FallbackDrawHandler | strangerRerequest      | 663   | 0       | 0        |\n╰---------------------+------------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 3\n  Bound result 13\n  Bound result 4\n  Bound result 30\n  Bound result 2\n  Bound result 1\n  Bound result 1\n  Bound result 2\n  Bound result 46\n  Bound result 1\n  Bound result 2\n  Bound result 39\n\n[PASS] test_deadFallbackIsClearedByARerequest() (gas: 1953402)\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 0\n\n[PASS] test_fallbackRouteIsReachable() (gas: 1626065)\nLogs:\n  Bound result 1\n  Bound result 0\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 2.82s (2.78s CPU time)\n\nRan 1 test for test/invariants/ArtHouseInvariant.t.sol:ArtHouseInvariantTest\n[PASS]\nArtHouseInvariantTest invariants:\n[PASS] invariant_constants\n[PASS] invariant_ethConservation\n[PASS] invariant_imdConservation\n[PASS] invariant_noOverWithdrawal\n[PASS] invariant_supplyAndSeal\n ArtHouseInvariantTest invariants (runs: 128, calls: 5120, reverts: 0)\n\n╭---------------+----------------+-------+---------+----------╮\n| Contract      | Selector       | Calls | Reverts | Discards |\n+=============================================================+\n| LedgerHandler | handOver       | 389   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | mintETH        | 368   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | mintIMD        | 362   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | moduleSale     | 409   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | releaseBuyback | 427   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setBroker      | 415   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setPayout      | 401   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setPrices      | 373   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setSaleOpen    | 387   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | setSplit       | 430   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | strangerCalls  | 400   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | withdraw       | 391   | 0       | 0        |\n|---------------+----------------+-------+---------+----------|\n| LedgerHandler | withdrawHouse  | 368   | 0       | 0        |\n╰---------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2000000000000000000\n  Bound result 9173\n  Bound result 512\n  Bound result 2010\n  Bound result 11\n  Bound result 299999\n  Bound result 33\n  Bound result 5727\n  Bound result 85\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 3.48s (3.47s CPU time)\n\nRan 4 tests for test/invariants/BrokerClaimsInvariant.t.sol:BrokerClaimsInvariantTest\n[PASS]\nBrokerClaimsInvariantTest invariants:\n[PASS] invariant_claimHistorySurvivesTransfers\n[PASS] invariant_ownershipBalancesAndBrokerRightsAgree\n BrokerClaimsInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭---------------------+------------------+-------+---------+----------╮\n| Contract            | Selector         | Calls | Reverts | Discards |\n+=====================================================================+\n| BrokerClaimsHandler | advanceTime      | 838   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | claimPiece       | 912   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | claimSeat        | 878   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | movePass         | 899   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | movePiece        | 940   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | moveSeat         | 859   | 0       | 0        |\n|---------------------+------------------+-------+---------+----------|\n| BrokerClaimsHandler | rejectedTransfer | 818   | 0       | 0        |\n╰---------------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 166400\n  Bound result 87317\n  Bound result 50660\n  Bound result 119674\n  Bound result 166400\n  Bound result 18668\n\n[PASS] test_seatAndPassTransfersDoNotResetEitherClaimLimit() (gas: 1553655)\n[PASS] test_sourceClaimAlsoConsumesTheWalletsSeatEntitlement() (gas: 1137627)\n[PASS] test_startIsInclusiveAndClosedClaimsLeaveNoHistory() (gas: 1893855)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 3.82s (3.78s CPU time)\n\nRan 3 tests for test/invariants/ReviewHistoryInvariant.t.sol:ReviewHistoryInvariantTest\n[PASS]\nReviewHistoryInvariantTest invariants:\n[PASS] invariant_pagesKeepFirstReviewOrderAndLatestContents\n[PASS] invariant_thesisCountsDistinctAuthorsWithoutGrantingBrokerPowers\n[PASS] invariant_votesArePerCredentialAndFinalDecisionsFreezeRecords\n ReviewHistoryInvariantTest invariants (runs: 96, calls: 6144, reverts: 0)\n\n╭----------------------+---------------+-------+---------+----------╮\n| Contract             | Selector      | Calls | Reverts | Discards |\n+===================================================================+\n| ReviewHistoryHandler | advanceTime   | 1096  | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | decide        | 1077  | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | invalidReview | 974   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | moveSeat      | 986   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | review        | 996   | 0       | 0        |\n|----------------------+---------------+-------+---------+----------|\n| ReviewHistoryHandler | thesis        | 1015  | 0       | 0        |\n╰----------------------+---------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2000\n  Bound result 33\n  Bound result 12\n  Bound result 20559\n  Bound result 224\n  Bound result 4151\n  Bound result 1919549\n  Bound result 522199\n  Bound result 50000\n  Bound result 14304\n  Bound result 1425\n  Bound result 2488311\n\n[PASS] test_finalDecisionsFreezeOldAndNewHolderReviews() (gas: 1951281)\n[PASS] test_transferredSeatEditsOneExistingVoiceInPlace() (gas: 1175097)\nLogs:\n  Bound result 1\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 5.77s (5.77s CPU time)\n\nRan 13 tests for test/Adversarial.t.sol:ArtifactsEdgeTest\n[PASS] testFuzz_anyWordsAssignDistinctEditions(uint256[8]) (runs: 256, μ: 64674779, ~: 64677728)\n[PASS] testFuzz_sealFramesAnyTraits(uint8,uint8,uint8,uint8,uint8) (runs: 16, μ: 519762294, ~: 519759047)\nLogs:\n  Bound result 3\n\n[PASS] test_buyRevertsAtomicallyWhenCoordinatorReverts() (gas: 59259425)\n[PASS] test_callbackWithNoWordsReverts() (gas: 61562671)\n[PASS] test_claimedPieceIsAFullCopyOfTheImplementation() (gas: 67210216)\n[PASS] test_configureVRFRejectsZeroes() (gas: 262859)\n[PASS] test_duplicateRequestIdRejected() (gas: 59453766)\n[PASS] test_nonOwnerCannotRunTheSale() (gas: 60818142)\n[PASS] test_rerequestIsAtomicWhenCoordinatorReverts() (gas: 59947847)\n[PASS] test_rerequestWindowBoundaryAndChaining() (gas: 67785913)\n[PASS] test_setPieceEdges() (gas: 61051534)\n[PASS] test_unapprovedBuyerAsBrokerEarnsNothing_andOneWeiPriceWorks() (gas: 61500182)\n[PASS] test_wrappedKeyEdges() (gas: 67194117)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 9.67s (10.95s CPU time)\n\nRan 10 tests for test/Artifacts.t.sol:ArtifactsPieceEscrowTest\n[PASS] test_escrowCancelBeforeKey_andDelist() (gas: 501042)\n[PASS] test_escrowHappyPath_buyerConfirms() (gas: 1181933)\n[PASS] test_escrowKeyMustNotBeEmpty() (gas: 311000)\n[PASS] test_escrowTimeoutRelease() (gas: 729073)\n[PASS] test_pieceViewingKeyZeroRejected() (gas: 168689)\n[PASS] test_plainTransferClearsKey_previousOwnerRekeys() (gas: 506819)\n[PASS] test_reentrancyOnEscrowWithdrawBlocked() (gas: 844317)\n[PASS] test_rewrapIsOneShotAndNonEmpty() (gas: 284134)\n[PASS] test_sellerCannotOverwriteKeyAfterRelease() (gas: 913380)\n[PASS] test_sourceOnlyReveal() (gas: 35552)\nSuite result: ok. 10 passed; 0 failed; 0 skipped; finished in 9.65s (3.15ms CPU time)\n\nRan 25 tests for test/NothingStuck.t.sol:NothingStuckTest\n[PASS] test_aBuyerNeedsAViewingKeyAProofCanUse() (gas: 67162390)\n[PASS] test_aJunkKeyIsProvenFake_paymentAndDepositToTheBuyer() (gas: 67746755)\n[PASS] test_aSilentSellerLetsTheBuyerCancelAfter24Hours() (gas: 67333847)\n[PASS] test_anAuctionClosedInTimeCannotBeVoided() (gas: 5800097)\n[PASS] test_anAuctionNobodyCanCloseGivesTheBidBack() (gas: 6090184)\n[PASS] test_callbackGasCanOnlyGoUpOnceTheSaleOpens() (gas: 60971574)\n[PASS] test_claimWithoutAKey_after30Days_thenTheKeyGoesIntoThePiece() (gas: 67114315)\n[PASS] test_curatorReKeysAPieceItsPreviousOwnerNeverDid() (gas: 67270449)\n[PASS] test_fallbackDraw_aStartedDrawsResultStands_finishedFromTheHistory() (gas: 61907143)\n[PASS] test_fallbackDraw_chainlinkStillWinsIfItAnswersFirst() (gas: 61661254)\n[PASS] test_fallbackDraw_countsFromThePurchase() (gas: 61837892)\n[PASS] test_fallbackDraw_oneAtATime() (gas: 62786175)\n[PASS] test_fallbackDraw_onlyAfterThreeDays_fromABlockNobodyKnew() (gas: 61820773)\n[PASS] test_fallbackDraw_startsAgainOnlyOnceItsHashIsGone() (gas: 61663827)\n[PASS] test_fallbackDraw_startsOnAYoungRequestTheCoordinatorNoLongerHolds() (gas: 61635778)\n[PASS] test_noProofBeforeAKey_andTheSellerCantDodgeOne() (gas: 67694073)\n[PASS] test_onlyAKeyTheSellerMadeCanBePosted() (gas: 67756130)\n[PASS] test_realKeys_aJunkKeyIsProvenFake() (gas: 907004)\nLogs:\n  gas for the buyer's proveFakeKey: 170130\n\n[PASS] test_realKeys_anHonestKeyCanNeverBeProvenFake() (gas: 1254824)\n[PASS] test_realKeys_theBuyerCantSwapViewingKeysToFrameTheSeller() (gas: 887941)\n[PASS] test_realKeys_theRightKeyWrappedToAnotherKeyIsFake() (gas: 894622)\n[PASS] test_the72HoursCountFromTheKey() (gas: 67755286)\n[PASS] test_theBuyerCantCancelUnderAPendingKey() (gas: 67530279)\n[PASS] test_theDepositIsExactly10Percent() (gas: 67634743)\n[PASS] test_theSellerCanRefundBeforeSendingAKey() (gas: 67441282)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 9.67s (368.25ms CPU time)\n\nRan 38 test suites in 9.68s (55.17s CPU time): 278 tests passed, 0 failed, 2 skipped (280 total tests)\n","passed":true},{"durationMs":111,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"ArtCollection.approve(address,uint256)\",\"ArtCollection.initialize(address,string,string)\",\"ArtCollection.mint(address,uint256)\",\"ArtCollection.safeTransferFrom(address,address,uint256)\",\"ArtCollection.safeTransferFrom(address,address,uint256,bytes)\",\"ArtCollection.setApprovalForAll(address,bool)\",\"ArtCollection.transferFrom(address,address,uint256)\",\"ArtHouse.acceptOwnership()\",\"ArtHouse.approveArtist(address,string)\",\"ArtHouse.clearPiece(address,uint256)\",\"ArtHouse.createCollection(string,string,address)\",\"ArtHouse.decideSubmission(uint256,bool)\",\"ArtHouse.finalizePiece(address,uint256)\",\"ArtHouse.mint(address,uint256,address)\",\"ArtHouse.mintWithIMD(address,uint256,address,uint256)\",\"ArtHouse.recordResale(address,uint256,uint256)\",\"ArtHouse.recordSale(address,address,address)\",\"ArtHouse.registerModuleCollection(address,address)\",\"ArtHouse.registerPiece(address,uint256,bytes32,string,string)\",\"ArtHouse.releaseBuyback(address)\",\"ArtHouse.revokeArtist(address)\",\"ArtHouse.sealCollection(address)\",\"ArtHouse.setBroker(address,bool)\",\"ArtHouse.setBrokerPass(address)\",\"ArtHouse.setBuybackBurner(address)\",\"ArtHouse.setPayout(address)\",\"ArtHouse.setPrices(address,uint256,uint256)\",\"ArtHouse.setSaleModule(address,bool)\",\"ArtHouse.setSaleOpen(address,bool)\",\"ArtHouse.setSplit(address,uint16,uint16,uint16,uint16)\",\"ArtHouse.submit(bytes32,string)\",\"ArtHouse.transferOwnership(address)\",\"ArtHouse.updatePiece(address,uint256,bytes32,string,string)\",\"ArtHouse.uploadChunk(address,uint256,uint256,bytes)\",\"ArtHouse.withdraw(address)\",\"ArtHouse.withdrawHouse(address)\",\"ArtStorage.acceptOwnership()\",\"ArtStorage.clear(address,uint256)\",\"ArtStorage.setHouse(address)\",\"ArtStorage.transferOwnership(address)\",\"ArtStorage.write(address,uint256,uint256,bytes)\",\"ArtifactsFactory.acceptOwnership()\",\"ArtifactsFactory.buy(address)\",\"ArtifactsFactory.buyMany(uint256,address)\",\"ArtifactsFactory.buyWithSeat(uint256,uint256,address)\",\"ArtifactsFactory.claim(uint256)\",\"ArtifactsFactory.claimMany(uint256[])\",\"ArtifactsFactory.configureVRF(address,bytes32,uint256,bool)\",\"ArtifactsFactory.endSale()\",\"ArtifactsFactory.finishFallbackDraw(uint256)\",\"ArtifactsFactory.lock()\",\"ArtifactsFactory.postWrappedKey(uint256,bytes)\",\"ArtifactsFactory.postWrappedKeys(uint256[],bytes[])\",\"ArtifactsFactory.rawFulfillRandomWords(uint256,uint256[])\",\"ArtifactsFactory.registerViewingKey(bytes32)\",\"ArtifactsFactory.rerequestRandomness(uint256)\",\"ArtifactsFactory.setGate(address,address,uint256,uint64)\",\"ArtifactsFactory.setMemberGate(address,bytes4,uint256)\",\"ArtifactsFactory.setMintPhases(uint64,uint8,uint64,uint8)\",\"ArtifactsFactory.setPiece(uint256,(string,string,uint8,string),bytes,bytes32)\",\"ArtifactsFactory.setPieceImplementation(address)\",\"ArtifactsFactory.setPrice(uint256)\",\"ArtifactsFactory.setSaleOpen(bool)\",\"ArtifactsFactory.setVRFCallbackGas(uint32)\",\"ArtifactsFactory.startFallbackDraw(uint256)\",\"ArtifactsFactory.transferOwnership(address)\",\"ArtifactsPiece.approve(address,uint256)\",\"ArtifactsPiece.buy(bytes32,address)\",\"ArtifactsPiece.cancel()\",\"ArtifactsPiece.delist()\",\"ArtifactsPiece.initialize(address,address,uint256,address,(string,string,uint8,string),address,bytes32,bytes,bool,bytes32)\",\"ArtifactsPiece.list(uint256)\",\"ArtifactsPiece.postEscrowKey(bytes,address,uint256)\",\"ArtifactsPiece.proveFakeKey((uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256,uint256))\",\"ArtifactsPiece.refundBuyer()\",\"ArtifactsPiece.registerViewingKey(bytes32)\",\"ArtifactsPiece.release()\",\"ArtifactsPiece.reveal(bytes32)\",\"ArtifactsPiece.rewrapFor(bytes)\",\"ArtifactsPiece.safeTransferFrom(address,address,uint256)\",\"ArtifactsPiece.safeTransferFrom(address,address,uint256,bytes)\",\"ArtifactsPiece.setApprovalForAll(address,bool)\",\"ArtifactsPiece.transferFrom(address,address,uint256)\",\"ArtifactsPiece.withdraw()\",\"ArtifactsSource.acceptOwnership()\",\"ArtifactsSource.bid(address)\",\"ArtifactsSource.deliverKey(bytes)\",\"ArtifactsSource.lock(bytes32,bytes32)\",\"ArtifactsSource.resetRenderer()\",\"ArtifactsSource.setAuction(uint256,uint64)\",\"ArtifactsSource.setGate(address,address,uint256,uint64)\",\"ArtifactsSource.setMemberGate(address,bytes4,uint256)\",\"ArtifactsSource.setPieceImplementation(address)\",\"ArtifactsSource.settle()\",\"ArtifactsSource.storeRendererChunk(bytes)\",\"ArtifactsSource.transferOwnership(address)\",\"ArtifactsSource.voidUnsettled()\",\"ArtifactsSource.withdrawRefund()\",\"BrokerPass.approve(address,uint256)\",\"BrokerPass.claimWithPiece(uint256)\",\"BrokerPass.claimWithSeat(uint256)\",\"BrokerPass.safeTransferFrom(address,address,uint256)\",\"BrokerPass.safeTransferFrom(address,address,uint256,bytes)\",\"BrokerPass.setApprovalForAll(address,bool)\",\"BrokerPass.setClaimsOpenAt(uint64)\",\"BrokerPass.transferFrom(address,address,uint256)\",\"ImdBuybackBurner.burnEth(uint256,uint256,uint256)\",\"ImdBuybackBurner.burnImd()\",\"ImdBuybackBurner.receive()\",\"ImdBuybackBurner.unlockCallback(bytes)\",\"SubmissionReviews.applyAsBroker(string)\",\"SubmissionReviews.postThesis(uint256,string)\",\"SubmissionReviews.reviewAsPiece(uint256,uint256,uint8,string)\",\"SubmissionReviews.reviewAsSeat(uint256,uint256,uint8,string)\"],\"files\":{\".gitignore\":3,\"ADAPTATION.md\":586,\"README.md\":262,\"foundry.toml\":25,\"launch.burner.json\":17,\"launch.json\":55,\"launch.piece.json\":12,\"reference/PROTOCOL.md\":99,\"reference/RULES.md\":137,\"reference/audit/V13Audit.t.sol.txt\":381,\"reference/check-framed.js\":25,\"reference/framed/framed-003.svg\":1,\"reference/framed/framed-MASTER.svg\":1,\"reference/rules.js\":145,\"reference/the-source.renderer.html\":148,\"remappings.txt\":1,\"script/Deploy.s.sol\":41,\"src/ArtCollection.sol\":55,\"src/ArtHouse.sol\":609,\"src/ArtStorage.sol\":82,\"src/ArtifactsFactory.sol\":654,\"src/ArtifactsPiece.sol\":460,\"src/ArtifactsSource.sol\":286,\"src/BrokerPass.sol\":142,\"src/ImdBuybackBurner.sol\":163,\"src/KeyProof.sol\":154,\"src/SubmissionReviews.sol\":215,\"src/base/ERC721Lite.sol\":122,\"src/base/HolderGate.sol\":113,\"src/base/ReentrancyGuard.sol\":15,\"src/base/TwoStepOwnable.sol\":40,\"src/interfaces/Interfaces.sol\":93,\"src/libs/Clones.sol\":19,\"src/libs/Encoding.sol\":79,\"src/libs/SSTORE2.sol\":41,\"src/libs/Seal.sol\":102,\"test/Adversarial.t.sol\":1410,\"test/ArtHouse.t.sol\":463,\"test/Artifacts.t.sol\":674,\"test/AuditRound3.t.sol\":151,\"test/BrokerPass.t.sol\":373,\"test/Burner.t.sol\":161,\"test/ClaimEnd.t.sol\":152,\"test/EscrowDeadline.t.sol\":160,\"test/Fixture.sol\":232,\"test/Gate.t.sol\":295,\"test/KeyProof.t.sol\":134,\"test/LaunchAudit.t.sol\":338,\"test/LaunchDeployment.t.sol\":204,\"test/LaunchGasCap.t.sol\":92,\"test/NothingStuck.t.sol\":594,\"test/Phases.t.sol\":130,\"test/PieceImplementation.t.sol\":147,\"test/ReviewRound4.t.sol\":262,\"test/Reviews.t.sol\":264,\"test/Source.t.sol\":396,\"test/audit/KeyProofEdges.t.sol\":178,\"test/audit/KeyReuseLeak.t.sol\":38,\"test/fixtures/keyproof.json\":81,\"test/fork/BurnerFork.t.sol\":70,\"test/fork/VrfFork.t.sol\":131,\"test/invariants/ADDED_COVERAGE.md\":24,\"test/invariants/ArtHouseInvariant.t.sol\":444,\"test/invariants/ArtifactsFactoryInvariant.t.sol\":323,\"test/invariants/BrokerClaimsInvariant.t.sol\":275,\"test/invariants/BuybackConservation.t.sol\":246,\"test/invariants/FallbackDrawInvariant.t.sol\":417,\"test/invariants/PieceEscrowInvariant.t.sol\":446,\"test/invariants/ReviewHistoryInvariant.t.sol\":245,\"test/invariants/SourceAuctionInvariant.t.sol\":227,\"test/mocks/AdversarialMocks.sol\":134,\"test/mocks/MockPoolManager.sol\":57,\"test/mocks/MockSeats.sol\":27,\"test/mocks/Mocks.sol\":149,\"test/mocks/TestVRFCoordinator.sol\":46,\"test/utils/Base64Decode.sol\":83},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"cb1c3505f5222206891e78f59210f7941af4e4933264063eaf58a928f1720998","verifiedTreeHash":"37e6462f7b0c1d1e6ed05ac439f0948e86643dc1","verifierVersion":"0.1.0+a6ee6548"}]}