{"assessments":[],"deployments":[],"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":"4c96c6ff-9121-4ff3-9a7b-fb0db56cc9bc","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"6312bcd748d9b43d0fef0e4edcea5047f88643e9efec4897103a63678e088630","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":"52000524e8b91c0f2569a9aa6168dd9a04797febff48ebdba9da52937cd2332a","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":"a40a120b3d23b8c2a387b2f8c33d66cf7bff4130efa0c4f59e86ccc3eb91c5e2","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":"f0d67b605f4cdfc1f66e105ba72c91778304a2d6fb27c65d5287cc71b548c099","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":"df542c141971e679b5aea5764d7886fc37ca1a8e196cfc3862cf89815d968c38","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":"c1e9cb7282f169649afe7ac0c201c69beaa6d4968fac8aac620124e843a870d6","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":"cf3b280aa027d6918867bd3741b56a4fd1734173c9284e369302d8ba12cf0922","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":"0e23ef197adced26d134d0074264b033035a2a2004a9ff5cadd01a3c74d065af","dependsOn":["adapt_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"6d540ecb637648fab28c023f26034e4fc6807599077a16c2012cf335918354b2","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":"The Imdex 5 is an index of the five largest tokens paired with IMD on Ethereum, in one coin: pay IMD in to mint it, hand it back to redeem the holdings, and the IMD oracle refreshes the list each week.\n\nDeploy this repository exactly as it is, at commit a578235451bde04d976ea0512d62bba2a4e14d61, as a new evm_contracts launch on Ethereum mainnet (chain id 1). One contract, Imdex5, no constructor arguments. Contracts only: no launch token, pool or website.\nToken name: The Imdex 5\nToken symbol: IMDEX5\nTotal supply: 0 at deployment, no cap: a mint issues, a redeem burns, nothing else mints.\nWho can call what: anyone calls everything. No owner, admin, role or setting. Upgrades and pausing: none.\n\nHISTORY: this is the code of launch 2343 (identity-md-launches/launch-2343-the-imdex-5 at c100c77) with the fixes audit 705dd677 asked for, already made and tested here (171 unit and fuzz tests and 8 mainnet fork tests pass; 23,552 bytes runtime):\n1. (medium) A rebalance swap, or a redeemToImd sale, that takes its input and delivers nothing reverts NothingOut inside swapSelf, so it is skipped, not booked. A rebalance swap must also deliver at least half its input's value at the pool price before it, or it reverts PoorFill and is skipped. A mint's exact-output residual buy is exempt from both: its shortfall is charged at the pool price, so mint stays open.\n2. (low) The swap amount is converted with SafeCast. (low) mint refuses minShares above shares before any buy.\nTHREAT_MODEL.md states the rules and the accepted limits; read it first.\n\nFINDINGS IN THIS LAUNCH: fix every finding of medium or above with the smallest change that removes it, and list each in the README. Low and informational findings: document, do not redesign.\n\nKEEP EVERYTHING ELSE AS IT IS. solc 0.8.26, optimizer 200 runs, via_ir, cancun, bytecode_hash none. The constructor calls no contract. Stay under 24,576 bytes.\n\nMUST ATTACK: a rebalance swap that pays dust or less than half its value and is still booked; a redeemToImd sale that pays nothing and is still booked (a redeemToImd sale that pays dust is the redeemer's own choice, protected by its minimum); any mint that succeeds while issuing fewer than minShares; any path where a reverted mint still takes IMD; any way held differs from the real balance; a mint that dilutes holders in value, including through a residual's price being moved before a mint; a redeem that cannot pay; an expired or under-quorum answer changing the list.","parentJobId":null,"planHash":"1f1ce8134c9565609cc4a85102caee08bc45b2fed317f3c679ae2af24d1e7485","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"4c96c6ff-9121-4ff3-9a7b-fb0db56cc9bc","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2361-the-imdex-5"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"53932","feedbackHash":"e4dd7e9a40d24734911411e8f064562cc5f8ae6aaa10f6191b77c6ee33e1d53a","nodeKey":"adapt_contract_project","submissionHash":"832e4fb35c92624c0a210b304d83867c2836c858d994c3c0f7feafcb4575f774","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51331","feedbackHash":"f231d9ad1335d649d9c203f9b3c26bb024a7ebc2fe6733ab9054714989c2f735","nodeKey":"adapt_contract_project","submissionHash":"6312bcd748d9b43d0fef0e4edcea5047f88643e9efec4897103a63678e088630","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51494","feedbackHash":"e66380d956c985b2f7b0337caa5d092ad95337fc55f69cb7b2a14a56e0a8ecc6","nodeKey":"audit_economics","submissionHash":"52000524e8b91c0f2569a9aa6168dd9a04797febff48ebdba9da52937cd2332a","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51473","feedbackHash":"ae2cc5b1fe720990b5974863afa6c880ce583a208eb3581e4acd1ebb719f3820","nodeKey":"audit_flow","submissionHash":"a40a120b3d23b8c2a387b2f8c33d66cf7bff4130efa0c4f59e86ccc3eb91c5e2","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51367","feedbackHash":"ec9c6defd62147d4aefae71fb0b61dea775e24249577c64ace6f15a25cbc5166","nodeKey":"audit_imported_code","submissionHash":"f0d67b605f4cdfc1f66e105ba72c91778304a2d6fb27c65d5287cc71b548c099","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51203","feedbackHash":"3d68908e9acd03fb5ad14bbb5200823d2cc4e43d087c9ba85fd4439719afd2d8","nodeKey":"audit_judge","submissionHash":"9070d92b183a3a52bbbbdbead4026889f67456c0f08ebe52653eeb28cd7dcee0","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52011","feedbackHash":"8d51e0df2c6fc81a91bde74de9bb9ad3dce2c6eca3e0a489e7486ebcacd316e2","nodeKey":"audit_judge","submissionHash":"df542c141971e679b5aea5764d7886fc37ca1a8e196cfc3862cf89815d968c38","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52216","feedbackHash":"6543499f1a7f0979f5b9debf2e72ff27f2fc74d9eaba7462752fbc3d5df3c3e7","nodeKey":"audit_math","submissionHash":"c1e9cb7282f169649afe7ac0c201c69beaa6d4968fac8aac620124e843a870d6","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51162","feedbackHash":"5c48721a9a336f26123f208fc430a95762f65cfedb76ebeca6d27f2bbdf803fd","nodeKey":"audit_permissions","submissionHash":"cf3b280aa027d6918867bd3741b56a4fd1734173c9284e369302d8ba12cf0922","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51141","feedbackHash":"6cbf4be4c9f229d97feab7539cd7037e5c02fd70dd1d3a04e67be1630a187050","nodeKey":"manifest","submissionHash":"0e23ef197adced26d134d0074264b033035a2a2004a9ff5cadd01a3c74d065af","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52552","feedbackHash":"408e5899b54776fa79d397f563d364b3e7c1c94041ed72404265e4d2c18a03ac","nodeKey":"manifest","submissionHash":"e112052d02b05068112d45b41894537b10e48c4ede24272fa5819e63dfa72461","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"53925","feedbackHash":"46f262d7b8cd01176f2b710d4f119109c9d5ac6f7660fa5568744f65a006fc06","nodeKey":"write_foundry_tests","submissionHash":"6d540ecb637648fab28c023f26034e4fc6807599077a16c2012cf335918354b2","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"53941","feedbackHash":"5bd0198a06c2f4639363198d1a249a5a096a2a9f5816a60446dc07d4e404942e","nodeKey":"write_foundry_tests","submissionHash":"2ce09356d4305278f816f003b8a60ba79e6f3be0d5615900d21432a69397ba01","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"6c04b6b7e8cbe7d94c670fac512d99625c49eb92766553415d4580ee3063577e","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"d9b17067d858af7926b98d62d6884c4c1dfccb35c18990600b92e885b95732d5","device":"7d454e6cee88c390","findings":[],"hash":"0e23ef197adced26d134d0074264b033035a2a2004a9ff5cadd01a3c74d065af","nodeId":"82cf7160-504b-4ddd-99d9-517e6113d86f","outcome":"completed","summary":"The finding held and is fixed. Only launch.json changed, plus the required response file.\n\n**What was wrong.** The notes said the 0.50% fee on redeems goes into feeImd. The redeem function at src/Imdex5.sol:209-219 keeps that 0.50% in held and idleImd for the remaining holders and never writes feeImd. Only mint, mintFirst and the IMD proceeds of redeemToImd credit feeImd, which is what README line 147 already says.\n\n**What I changed.** The notes sentence now describes the fee into feeImd as applying to mints and to redeemToImd's IMD proceeds, and states that redeem pays 99.50% in kind with the 0.50% staying with the remaining holders. The schema fields are untouched: kind evm_contracts, one contract Imdex5, no constructor arguments.\n\n**Verification.**\n- launch.json parses, has exactly the three schema keys, and the notes are 3,568 characters.\n- The response file .imd-responses.json answers the finding with verdict fixed and is git-excluded as the harness expects.\n- Full test run with the verifier fuzz seed passed, with only the fork tests skipped for lack of a fork URL.\n- git status shows launch.json as the only modified tracked file.","treeHash":"3c5e96e22a774f39bb649fb08c6251767d197f29","usage":{"cachedInputTokens":225847,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":4125,"runtime":"claude","turns":11,"wallClockMs":242590}},{"artifacts":[],"attempt":1,"bundleHash":"eb926a2f4b14a4ac22e0ca96a8a7b1b23708b11b595ac14a616a456ae7539fcc","device":"fea1c984a93ab45d","findings":[{"description":"The threat model explicitly treats list coins as untrusted and allows false-returning tokens, while requiring held plus owed to remain backed. _pay uses a low-level token call and treats a false or malformed return as failure without reverting the token call. If the token debited the index before returning false, the transfer remains committed and _pay also adds the full amount to owed. A later successful claim pays the same entitlement again from remaining holders' assets; their held balance is now undercollateralized. Both redeem and the in-kind fallback of redeemToImd reach _pay. This needs an unusual but reachable token behavior, so it is medium rather than a claim about the current mainnet starting tokens. Isolate the transfer and return-data validation in one reverting self-call (similar to swapSelf), then record owed only after that subcall has rolled back; preserve the payment gas limit.","line":650,"path":"src/Imdex5.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Imdex5} from \"src/Imdex5.sol\";\nimport {IPoolManager, IUnlockCallback} from \"src/Interfaces.sol\";\n\ncontract FalseReturnCoin {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n    bool public falseAfterTransfer;\n\n    function mint(address to, uint256 amount) external { balanceOf[to] += amount; }\n    function setFalseAfterTransfer(bool enabled) external { falseAfterTransfer = enabled; }\n    function approve(address spender, uint256 amount) external returns (bool) {\n        allowance[msg.sender][spender] = amount;\n        return true;\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    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        // A false return does not revert this token's state changes.\n        return !falseAfterTransfer;\n    }\n}\n\n/// Fixed 1:1 fills for initial funding only. Enforces actual transfer settlement;\n/// no swaps occur during the failing redeem/claim sequence.\ncontract FalseReturnFundingPool is IPoolManager {\n    address private synced;\n    uint256 private balanceBefore;\n    address private input;\n    address private output;\n    uint256 private debt;\n    uint256 private credit;\n    bool private unlocked;\n\n    function unlock(bytes calldata data) external returns (bytes memory result) {\n        require(!unlocked);\n        unlocked = true;\n        result = IUnlockCallback(msg.sender).unlockCallback(data);\n        require(debt == 0 && credit == 0);\n        unlocked = false;\n    }\n    function swap(PoolKey memory key, SwapParams memory params, bytes calldata) external returns (int256) {\n        require(unlocked && debt == 0 && credit == 0);\n        require(params.amountSpecified < 0);\n        uint256 amount = uint256(-params.amountSpecified);\n        require(amount <= uint256(uint128(type(int128).max)));\n        input = params.zeroForOne ? key.currency0 : key.currency1;\n        output = params.zeroForOne ? key.currency1 : key.currency0;\n        debt = amount;\n        credit = amount;\n        int128 a0 = params.zeroForOne ? -int128(uint128(amount)) : int128(uint128(amount));\n        int128 a1 = -a0;\n        return int256((uint256(uint128(a0)) << 128) | uint256(uint128(a1)));\n    }\n    function sync(address currency) external {\n        require(unlocked && currency == input);\n        synced = currency;\n        balanceBefore = FalseReturnCoin(currency).balanceOf(address(this));\n    }\n    function settle() external payable returns (uint256 paid) {\n        paid = FalseReturnCoin(synced).balanceOf(address(this)) - balanceBefore;\n        debt -= paid;\n    }\n    function take(address currency, address to, uint256 amount) external {\n        require(unlocked && currency == output);\n        credit -= amount;\n        require(FalseReturnCoin(currency).transfer(to, amount));\n    }\n    function extsload(bytes32) external pure returns (bytes32) { return bytes32(uint256(1 << 96)); }\n    function exttload(bytes32) external view returns (bytes32) {\n        return bytes32(uint256(debt > 0 ? 1 : 0) + uint256(credit > 0 ? 1 : 0));\n    }\n}\n\ncontract FalseReturnProofTest is Test {\n    function test_redeemAndClaimMustNotPayTheSameEntitlementTwice() public {\n        Imdex5 index = new Imdex5();\n        address holder = makeAddr(\"remaining holder\");\n        address redeemer = makeAddr(\"redeemer\");\n        FalseReturnCoin template = new FalseReturnCoin();\n        vm.etch(index.IMD(), address(template).code);\n        vm.etch(index.POOL_MANAGER(), address(new FalseReturnFundingPool()).code);\n        Imdex5.Coin[] memory coins = index.coins();\n        for (uint256 i; i < coins.length; ++i) {\n            vm.etch(coins[i].token, address(template).code);\n            FalseReturnCoin(coins[i].token).mint(index.POOL_MANAGER(), 1000e18);\n        }\n        FalseReturnCoin imd = FalseReturnCoin(index.IMD());\n        imd.mint(holder, 1000e18);\n        vm.startPrank(holder);\n        imd.approve(address(index), 1000e18);\n        index.mintFirst(1000e18, new uint256[](5));\n        uint256 shares = index.balanceOf(holder) / 4;\n        index.transfer(redeemer, shares);\n        vm.stopPrank();\n\n        FalseReturnCoin coin = FalseReturnCoin(coins[0].token);\n        uint256 entitlement = index.held(address(coin)) * shares * 9950 / (index.totalSupply() * 10_000);\n        coin.setFalseAfterTransfer(true);\n        vm.prank(redeemer);\n        index.redeem(shares);\n        coin.setFalseAfterTransfer(false);\n        if (index.owed(redeemer, address(coin)) != 0) {\n            vm.prank(redeemer);\n            index.claim(address(coin));\n        }\n\n        // Expected 49.50125 coins once; actual 99.0025 coins paid from other holders' backing.\n        assertEq(coin.balanceOf(redeemer), entitlement, \"redeem + claim paid the same entitlement twice\");\n        assertEq(coin.balanceOf(address(index)), index.held(address(coin)), \"remaining holdings are undercollateralized\");\n    }\n}","reproduction":"Run the self-contained proof as test/FalseReturnProof.t.sol with forge test --match-path test/FalseReturnProof.t.sol. It deploys the unchanged Imdex5, funds a first mint with 1000 IMD at 1:1 mock pools, and gives a redeemer one quarter of the 995 issued shares. One held token transfers the redemption payment but returns false. The token then resumes normal returns and the redeemer claims. Expected: the redeemer receives the 49.50125-coin entitlement once and all remaining held coins are backed. Actual: the redeemer receives 99.0025 coins, twice the entitlement, leaving a 49.50125-coin deficit against other holders. Locally reproduced with forge 1.8.3: FAIL redeem + claim paid the same entitlement twice: 99002500000000000000 != 49501250000000000000.","severity":"medium","title":"A token transfer that moves funds then returns false is credited again as owed"}],"hash":"2ce09356d4305278f816f003b8a60ba79e6f3be0d5615900d21432a69397ba01","nodeId":"d8b3647f-1bba-4f86-9bc9-7475dea4232f","outcome":"completed","summary":"Added adversarial tests and stateful invariants.\n\nValidation: `forge build` passed; seeded `forge test` reported **188 passed, 0 failed, 7 fork tests skipped**.\n\nReported one **medium double-payment defect** with a reproduced failing proof in `.imd-findings.json`. Application code and configuration remain unchanged.","treeHash":"ff4e10a734712decaa6fc53bcdb518be78272504","usage":{"cachedInputTokens":3612160,"inputTokens":146413,"model":"gpt-6-astra","outputTokens":25862,"runtime":"codex","turns":9,"wallClockMs":943476}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3a40eaafbd83a6bc","findings":[{"citation":"resolved","description":"In _redeemToImd a coin whose sale reverts or fills short is paid in kind at once, through _payInKind -> _pay -> token.call{gas: PAY_GAS}(transfer), while the index is still inside PoolManager.unlock (line 235 opens it; _redeemToImd runs from unlockCallback). Every other external call the index makes inside an unlock is wrapped in swapSelf, whose BadDelta check (line 598) reads the manager's NonzeroDeltaCount and reverts the skippable call if any address holds an unsettled delta. The in-kind payment has no such guard. Uniswap v4's take() is callable by any address while the manager is unlocked and debits the caller's own delta, so a listed coin whose transfer calls PoolManager.take(IMD, attacker, 1) when msg.sender is the index leaves a nonzero delta on the coin contract; PoolManager.unlock then reverts CurrencyNotSettled after unlockCallback returns, and the whole redeemToImd reverts. The coin only needs to (a) be deliverable by the manager (buys work, so mint, mintFirst and rebalance adopt and hold it) and (b) refuse transfers to the manager (so every sale by redeemToImd and rebalance fails and it is never sold and never leaves held). Threat model: coins are 'trusted to nothing' and may revert; invariant 4 promises redeemToImd pays 'alike' with redeem; the accepted limit covers a coin blocking mint, not a coin blocking redeemToImd. Precondition: the coin is in _coins with held > 0, which the oracle's weekly list grants to any launch token with a >=100 IMD pool ranked by spot price x total supply (gameable by a launch with a large supply). redeem keeps working, so funds are not frozen; the IMD exit is. Severity per the threat model's scale: 'a core function can be blocked by someone else'. Smallest fix preserving behaviour: do not call the coin inside the unlock. Either record the in-kind amount as owed[caller][token] (plus Owed event) in _payInKind when called from _redeemToImd so the redeemer claims it afterwards, or collect the in-kind (token, amount) pairs in the unlock and pay them with _pay after IPoolManager.unlock returns in redeemToImd. A cheaper partial guard, checking exttload(NONZERO_DELTA_COUNT_SLOT) after _pay and recording owed if nonzero, does not help because the manager's delta cannot be undone once taken.","line":479,"path":"src/Imdex5.sol","reproduction":"State: five listed coins with pools (mock PoolManager etched at the mainnet address, as the repo's tests do); coin 0's token contract is TakerERC20: transfer(to, amount) reverts if to == POOL_MANAGER, and if msg.sender == index while the manager is unlocked it calls PoolManager.take(IMD, attacker, 1) before transferring normally. Calls: alice mintFirst(1000e18, zeros) -> succeeds, held[coin0] > 0. bob mint(100e18, 200e18, 0) -> succeeds (buys go through the manager, msg.sender is the manager). alice redeem(1e18) -> succeeds (outside unlock, take reverts ManagerLocked in v4; the mock mirrors that). bob redeemToImd(bobShares, 0): coin 0's swapSelf reverts (transfer to manager refused) -> catch -> _payInKind -> _pay -> coin0.transfer(bob, paid) -> PoolManager.take(IMD, attacker, 1) succeeds and leaves delta -1 wei on coin 0 -> unlockCallback returns -> PoolManager.unlock reverts CurrencyNotSettled. Expected: bob receives IMD for coins 1-4 plus his idle share, coin 0 in kind at 99.5%. Actual: revert CurrencyNotSettled; the same for alice and every holder, on every attempt, as long as held[coin0] > 0, which no rebalance can reduce because its sales revert. test/scratch/RedeemToImdBrick.t.sol fails on this code with CurrencyNotSettled.","severity":"medium","snippet":"                _payInKind(coin.token, caller, amount, keepBps);","title":"redeemToImd pays a failed sale's coin in kind inside the PoolManager unlock, so a listed coin that touches the PoolManager from its transfer bricks redeemToImd for every holder"},{"citation":"resolved","description":"Step (3) skips the trim when listCount < 4 (line 522), acknowledging that a quarter cap cannot be met by fewer than four coins, but step (4) still limits every buy to room = cap - value with cap = total / WEIGHT_DIVISOR (line 521), where total includes idleImd. With three list coins and all value in idle IMD each coin may reach only 25% of total, 75% is invested and 25% stays idle; the next rebalance to the same list finds room = 0 for every coin and spends nothing, so the idle quarter persists until the list grows to four or five coins. Holders pay the 0.50% fee on an 'index of the five largest tokens' that holds a fixed fraction in cash; a minter is charged idlePart at par for it. No funds are lost and redeem/redeemToImd return the idle IMD at par, so this is a low: a design gap between steps (3) and (4), not a loss. Fix if wanted: in step (4) skip the room cap when listCount < 4 (mirroring step (3)), or use cap = total / min(WEIGHT_DIVISOR, listCount) for lists under four; otherwise document the cash fraction for short lists in THREAT_MODEL.md.","line":536,"path":"src/Imdex5.sol","reproduction":"Repo mocks (Imdex5Base): mintFirst(alice, 100e18) over five coins; deliver a signed three-coin list of the first three launches; rebalance(). Two leavers sell in full under the 1% limit (20 IMD each into 10,000 IMD pools), so coins().length == 3 and no residual remains. Observed: idleImd = 24.9047e18 against total value 99.6855e18 (idle + held x pool price), 24.98%. Warp 7 days, deliver the same three-coin list again, rebalance(): idleImd unchanged at 24.9047e18. Expected per the NatSpec 'spends idle IMD on the list in equal parts': idle near zero after the second rebalance. test/scratch/QuarterCap.t.sol reproduces (passes, asserting the idle quarter persists).","severity":"low","snippet":"            uint256 room = cap > value ? cap - value : 0;","title":"With fewer than four list coins the quarter-weight cap in rebalance step (4) leaves 25% (3 coins), 50% (2) or 75% (1) of holders' value as idle IMD that no rebalance ever invests"}],"hash":"52000524e8b91c0f2569a9aa6168dd9a04797febff48ebdba9da52937cd2332a","nodeId":"f1e49f2b-4dc4-4bd2-9c2f-f7c9b069bdf6","outcome":"completed","summary":"The review is complete. The findings file is at the repository root, and git shows no tracked file changed. Only the untracked findings file and the scratch tests, which are ignored, were added.\n\n**Outcome.** The economics of the Imdex 5 hold on every must-attack path I traced, with two exceptions reported in `.imd-findings.json`.\n\n**Finding 1, medium.** The `redeemToImd` path pays a failed sale's coin in kind while the index is still inside the PoolManager unlock, with no guard against the coin touching the manager. Every swap goes through `swapSelf`, which reverts on an unsettled delta, but the in-kind leg calls the coin's transfer directly. A listed coin whose transfer calls the manager's take function for one wei of IMD leaves an unsettled delta, and the unlock reverts with `CurrencyNotSettled`. That blocks `redeemToImd` for every holder for as long as the coin is held, and since the coin refuses sales no rebalance removes it. Plain `redeem` still works, so funds are not frozen. The proof test fails on the current code for exactly that reason. The smallest fix is to book the in-kind amount as owed, or pay it after the unlock returns.\n\n**Finding 2, low.** With a list of fewer than four coins, step four of `rebalance` still caps each buy at a quarter of total value, while the trim in step three is already skipped for such lists. A three-coin list therefore keeps about a quarter of holders' value as idle IMD after every rebalance. The repro shows idle at 24.98% of value, unchanged after a second rebalance to the same list. No loss, but the stated behaviour of spending idle IMD on the list does not hold for short lists.\n\n**Covered and holding.** Mint rounding and minShares, the reverted-mint-takes-nothing path, IMD and held accounting through all four unlock operations, the residual price-move dilution cases, NothingOut and PoorFill skip paths in both pool orientations, the redeem payout rules, and the oracle expiry, quorum and replay checks. All 177 existing tests pass. The one area I could not reach is concentrated-liquidity behaviour of exact-out residual buys and hook return deltas on a real Uniswap v4 fork, since no fork URL is available here.","treeHash":null,"usage":{"cachedInputTokens":1337268,"inputTokens":386,"model":"claude-fable-5-1","outputTokens":52682,"runtime":"claude","turns":28,"wallClockMs":1345982}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ea62f3bebece9304","findings":[],"hash":"62a3f425dba6bf206e7751af6fa70ea57df10e2f52f7c504db708425787c3729","nodeId":"1c15ce29-987a-4b07-91dd-bb544042ebfe","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":5100908}},{"artifacts":[],"attempt":1,"bundleHash":"e21913460607236b3b829869a0b950328f985e1301f99de1d4ef6d72cacdd195","device":"d2d5a117dd72f6b4","findings":[],"hash":"6312bcd748d9b43d0fef0e4edcea5047f88643e9efec4897103a63678e088630","nodeId":"423a72b9-d52d-42bf-922b-d427109381fb","outcome":"completed","summary":"Both medium findings reproduced on the starting tree and are fixed. The four advisory findings were real and are handled by documentation, as the brief directs for lows. All checks pass.\n\n**What I did**\n\n- **Payments run in a reverting self-call.** `_pay` now calls the new `paySelf`, which only the contract itself may call and which uses `safeTransfer`, inside a try/catch with `PAY_GAS`. A coin that moves funds and then returns false is rolled back by the revert before the amount is recorded as owed, so it is paid once or owed once, never both. The predicate is the same as before: revert, false return, gas burn, or no code all become owed.\n- **In-kind payouts of `redeemToImd` happen after the unlock.** The internal redeem books each unsold part under the redeem rule into an array and returns it from the unlock callback. The public function decodes it and pays with the same `_pay` once the PoolManager is locked again. No coin is called while the manager is unlocked, so a coin whose transfer calls `take` can no longer revert every holder's IMD exit. I chose this over owed-then-claim so redeemers still receive the coin in the same transaction, which keeps existing tests valid.\n- **Documentation for the lows.** The threat model's wrong line about a rebalance dropping a dead coin is corrected. The short-list idle fraction and the all-or-nothing `submit` are recorded as accepted limits. `forge fmt` was run on `src`.\n- **Tests.** New `test/Imdex5Payments.t.sol` has eight tests, four of which fail on the old source with the reviewer's exact symptoms. Two pinned limits were added to the documented-limits suite. The mock coin gained a \"move funds, then return false\" mode.\n- **Responses.** `.imd-responses.json` answers all six findings as fixed, with what was run and changed.\n\n**Verification**\n\n| Check | Result |\n| --- | --- |\n| Reviewer's two proofs | fail on starting tree, pass now |\n| Full suite with verifier seed | 196 passed, 0 failed, 7 fork tests skipped |\n| Runtime size | 23,869 bytes, 707 under the limit |\n| Forbidden opcodes in reachable code | none |\n| `forge fmt --check` on src, test, mocks | clean |\n\nThe runtime grew by 317 bytes. README, THREAT_MODEL.md and ADAPTATION.md describe the changes and the reproductions. Build configuration, dependencies and launch.json were not touched.","treeHash":"30b0290eecf2fa19d17c8476c516c9c7ec349e64","usage":{"cachedInputTokens":3540072,"inputTokens":866,"model":"claude-fable-5-1","outputTokens":53011,"runtime":"claude","turns":65,"wallClockMs":2169250}},{"artifacts":[],"attempt":1,"bundleHash":"480574370c6950252ce33c62d0605bc37cd5da51661c828ac5f25f0df27018c1","device":"96ecbe9236c400bb","findings":[],"hash":"6d540ecb637648fab28c023f26034e4fc6807599077a16c2012cf335918354b2","nodeId":"d8b3647f-1bba-4f86-9bc9-7475dea4232f","outcome":"completed","summary":"I extended my claims invariant to cover the code the implementer changed after my last round, and the full suite passes with the verifier's seed: 199 passed, 0 failed, 7 skipped. The 7 skipped are the existing mainnet fork tests, which need a fork URL that this machine and the verifier don't have, so a run against live mainnet state is still needed before deployment.\n\nThe defect I reported last round has been fixed by the implementer (commit `0f6c496`). A coin could move the funds and then return `false`, and the index would also record the amount as owed, so the redeemer was paid twice. Payments now go through `paySelf`, which undoes the transfer when it reports failure. The same commit also changed `redeemToImd` so that a coin it cannot sell is paid in kind only after the pool manager is locked again.\n\nChanges, all in `test/`:\n\n- **`test/Imdex5Claims.invariant.t.sol`:**\n  - **That failing coin is now in the random sequences.** The handler can now put a coin into the \"moves the funds, then returns false\" mode, so that case runs against both `redeem` and `redeemToImd`. The invariant checks that each coin balance equals what the index holds plus what it owes, so a double payment would fail it.\n  - **New random `redeemToImd` action.** It checks against balances measured independently, not against the contract's own numbers:\n    - each coin's drop in holdings equals what the pool took plus the in-kind share, and that share follows the redeem rule (99.5% of the unsold part, 100% for the last holder);\n    - the in-kind share equals what the redeemer received plus a new debt;\n    - IMD paid out plus the fee equals the IMD the sales and idle balance released, and the last holder pays no fee;\n    - no IMD debt is created;\n    - a minimum that can't be met undoes the whole call.\n  - **One fixed test, `test_handlerRedeemToImdOwesInKindOnce`.** A coin whose pool is dead and whose transfer moves the funds then returns false ends up owed once and not received; a call with an unreachable minimum rolls back; the debt is then claimed once, in full.\n- **`test/README.md`:** the defect section now says it is fixed and how the tests cover it.\n\nI found no new defects, so there is no `.imd-findings.json`. I didn't commit; the changes are in the working tree.","treeHash":"85db901132a9c073df930bd680aee2c0259197af","usage":{"cachedInputTokens":611678,"inputTokens":24,"model":"claude-opus-5-5","outputTokens":11279,"runtime":"claude","turns":13,"wallClockMs":465323}},{"artifacts":[],"attempt":1,"bundleHash":"fbc052b9176db766c901d4ae73832ff8e96a2bb24445f67450b166127cdd1785","device":"8109087d965ddf6c","findings":[],"hash":"832e4fb35c92624c0a210b304d83867c2836c858d994c3c0f7feafcb4575f774","nodeId":"423a72b9-d52d-42bf-922b-d427109381fb","outcome":"completed","summary":"Done. The audit of commit a578235 reported one low and three informational findings and nothing of medium or above, so the contract source is unchanged and the launch deploys the repository as it arrived.\n\n**What I verified**\n\n- `forge build` and `forge test` pass with the verifier's fuzz seed. The run finished with 177 tests passed and the 7 mainnet fork tests skipped, as they do without a fork URL.\n- Imdex5 runtime is 23,552 bytes, unchanged, 1,024 under the EIP-170 limit. The constructor takes no arguments and calls no contract.\n- Only `README.md`, `THREAT_MODEL.md`, `ADAPTATION.md` and one new test file changed. The build configuration, dependencies and `launch.json` are untouched.\n\n**The four findings, reproduced**\n\n- **Low, pre-moved pool (9f216ca3):** reproduces exactly as the auditor described. A 44% pump of the entering coin's pool before `rebalance()` books about 30% fewer coins for the same IMD, and a dumped leaver sells at the dumped price. Documented as an accepted bound: a limited swap trades at most about 1% of a pool's reserve per coin per week, no IMD leaves the accounting, and the mainnet pool fee makes the sandwich a net cost to the mover. A caller-independent reference price would be a redesign, which the brief forbids for a low.\n- **Info, residual clearance (0a7c3762):** reproduces, with a correction. The limited sale sells about 1% of the pool's coin reserve per rebalance, not half the holding. A residual under that clears entirely the next week, which the new test shows.\n- **Info, failed request costs the week (18ca8bf9):** reproduces for both a failure callback and a close after two days. This is the \"weekly at most\" rule and is documented.\n- **Info, Intake refund stranding IMD (e2325942):** does not reproduce. I read the live Intake's source from Sourcify, where it has a full creation and runtime match. It forwards every payment to its payee inside the request call and holds nothing, and its failure path only calls the consumer's failure selector. No IMD can come back, so nothing can be stranded. A test now pins the accounting invariant across a failed request.\n\n**Files**\n\n- `test/Imdex5DocumentedLimits.t.sol` pins all four behaviours so a later change shows up.\n- `README.md` gains a \"Findings in this launch\" table and security notes for each limit.\n- `THREAT_MODEL.md` lists the limits under the accepted section with the test count updated.\n- `ADAPTATION.md` opens with this revision, the reproductions with their figures, and the validation commands.\n\nThe work is committed on the detached HEAD as bb75b85 on top of a578235. One open item for the deployer: the fork tests were not run here because no RPC was available, and the Intake's behaviour was confirmed from its verified source rather than from a live call.","treeHash":"6bc0339fc9e95c36e1f9caf682bb028e345d0961","usage":{"cachedInputTokens":1422426,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":32464,"runtime":"claude","turns":40,"wallClockMs":1312436}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"896d1238054266ca","findings":[{"citation":"resolved","description":"THREAT_MODEL.md lists 'return false' among the behaviours a list coin may have, and invariant 2 requires held[coin] to equal the coin balance the contract actually holds. _pay makes a low-level call and, when ok is true but the return word is not 1, treats the transfer as failed and adds the full amount to owed[to][token] (line 656) without undoing the call. A coin whose transfer debits the sender and then returns false therefore pays the redeemer in full AND leaves the same amount claimable. The later claim() uses safeTransfer, which succeeds once the coin returns true again (or returns no data), and pays the entitlement a second time out of the coins that back the remaining holders: the contract's balance of that coin is then below held[coin]. Reachable from redeem() and from the in-kind fallback of _redeemToImd() (via _payInKind). The condition is an unusual token (an ERC-20 that both moves funds and returns false, or one that toggles between the two), so medium under the threat model's scale: loss under unusual but reachable conditions, and a broken invariant 2. Smallest fix preserving the design: perform the transfer and its return-data check in a reverting self-call (as swapSelf does for swaps), with PAY_GAS, and record owed only when that self-call reverts, so a false return rolls the token's own state change back before the amount is recorded as owed. Reported by the independent tester (write_foundry_tests); reproduced here with its proof.","line":650,"path":"src/Imdex5.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Imdex5} from \"src/Imdex5.sol\";\nimport {IPoolManager, IUnlockCallback} from \"src/Interfaces.sol\";\n\ncontract FalseReturnCoin {\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n    bool public falseAfterTransfer;\n\n    function mint(address to, uint256 amount) external { balanceOf[to] += amount; }\n    function setFalseAfterTransfer(bool enabled) external { falseAfterTransfer = enabled; }\n    function approve(address spender, uint256 amount) external returns (bool) {\n        allowance[msg.sender][spender] = amount;\n        return true;\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    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        // A false return does not revert this token's state changes.\n        return !falseAfterTransfer;\n    }\n}\n\n/// Fixed 1:1 fills for initial funding only. Enforces actual transfer settlement;\n/// no swaps occur during the failing redeem/claim sequence.\ncontract FalseReturnFundingPool is IPoolManager {\n    address private synced;\n    uint256 private balanceBefore;\n    address private input;\n    address private output;\n    uint256 private debt;\n    uint256 private credit;\n    bool private unlocked;\n\n    function unlock(bytes calldata data) external returns (bytes memory result) {\n        require(!unlocked);\n        unlocked = true;\n        result = IUnlockCallback(msg.sender).unlockCallback(data);\n        require(debt == 0 && credit == 0);\n        unlocked = false;\n    }\n    function swap(PoolKey memory key, SwapParams memory params, bytes calldata) external returns (int256) {\n        require(unlocked && debt == 0 && credit == 0);\n        require(params.amountSpecified < 0);\n        uint256 amount = uint256(-params.amountSpecified);\n        require(amount <= uint256(uint128(type(int128).max)));\n        input = params.zeroForOne ? key.currency0 : key.currency1;\n        output = params.zeroForOne ? key.currency1 : key.currency0;\n        debt = amount;\n        credit = amount;\n        int128 a0 = params.zeroForOne ? -int128(uint128(amount)) : int128(uint128(amount));\n        int128 a1 = -a0;\n        return int256((uint256(uint128(a0)) << 128) | uint256(uint128(a1)));\n    }\n    function sync(address currency) external {\n        require(unlocked && currency == input);\n        synced = currency;\n        balanceBefore = FalseReturnCoin(currency).balanceOf(address(this));\n    }\n    function settle() external payable returns (uint256 paid) {\n        paid = FalseReturnCoin(synced).balanceOf(address(this)) - balanceBefore;\n        debt -= paid;\n    }\n    function take(address currency, address to, uint256 amount) external {\n        require(unlocked && currency == output);\n        credit -= amount;\n        require(FalseReturnCoin(currency).transfer(to, amount));\n    }\n    function extsload(bytes32) external pure returns (bytes32) { return bytes32(uint256(1 << 96)); }\n    function exttload(bytes32) external view returns (bytes32) {\n        return bytes32(uint256(debt > 0 ? 1 : 0) + uint256(credit > 0 ? 1 : 0));\n    }\n}\n\ncontract FalseReturnProofTest is Test {\n    function test_redeemAndClaimMustNotPayTheSameEntitlementTwice() public {\n        Imdex5 index = new Imdex5();\n        address holder = makeAddr(\"remaining holder\");\n        address redeemer = makeAddr(\"redeemer\");\n        FalseReturnCoin template = new FalseReturnCoin();\n        vm.etch(index.IMD(), address(template).code);\n        vm.etch(index.POOL_MANAGER(), address(new FalseReturnFundingPool()).code);\n        Imdex5.Coin[] memory coins = index.coins();\n        for (uint256 i; i < coins.length; ++i) {\n            vm.etch(coins[i].token, address(template).code);\n            FalseReturnCoin(coins[i].token).mint(index.POOL_MANAGER(), 1000e18);\n        }\n        FalseReturnCoin imd = FalseReturnCoin(index.IMD());\n        imd.mint(holder, 1000e18);\n        vm.startPrank(holder);\n        imd.approve(address(index), 1000e18);\n        index.mintFirst(1000e18, new uint256[](5));\n        uint256 shares = index.balanceOf(holder) / 4;\n        index.transfer(redeemer, shares);\n        vm.stopPrank();\n\n        FalseReturnCoin coin = FalseReturnCoin(coins[0].token);\n        uint256 entitlement = index.held(address(coin)) * shares * 9950 / (index.totalSupply() * 10_000);\n        coin.setFalseAfterTransfer(true);\n        vm.prank(redeemer);\n        index.redeem(shares);\n        coin.setFalseAfterTransfer(false);\n        if (index.owed(redeemer, address(coin)) != 0) {\n            vm.prank(redeemer);\n            index.claim(address(coin));\n        }\n\n        // Expected 49.50125 coins once; actual 99.0025 coins paid from other holders' backing.\n        assertEq(coin.balanceOf(redeemer), entitlement, \"redeem + claim paid the same entitlement twice\");\n        assertEq(coin.balanceOf(address(index)), index.held(address(coin)), \"remaining holdings are undercollateralized\");\n    }\n}","reproduction":"Run `forge test --match-path test/scratch/FalseReturnProof.t.sol` (the attached proof). It deploys Imdex5 unchanged, etches a 1:1 PoolManager and plain coins, lets holder mintFirst(1000e18) and transfer a quarter of the 995e18 shares to redeemer; coin 0 is switched to 'transfer the funds, then return false'; redeemer calls redeem(shares); the coin is switched back; redeemer calls claim(coin0). Expected: redeemer holds the single entitlement 49.50125e18 and index.balance(coin0) == held[coin0]. Actual on this tree: redeemer holds 99.0025e18 (twice the entitlement) and the index's coin-0 balance is 49.50125e18 below held[coin0]. Output: `[FAIL: redeem + claim paid the same entitlement twice: 99002500000000000000 != 49501250000000000000]`.","severity":"medium","snippet":"        (bool ok, bytes memory ret) = token.call{gas: PAY_GAS}(abi.encodeCall(IERC20.transfer, (to, amount)));","title":"A coin transfer that moves funds and then returns false is paid and also recorded as owed, so the redeemer is paid twice from other holders' backing"},{"citation":"resolved","description":"_redeemToImd runs inside PoolManager.unlock (opened at line 235). When a coin's sale reverts or fills short it calls _payInKind -> _pay -> token.call{gas: PAY_GAS}(transfer) while the manager is still unlocked. Every other external call the index makes inside an unlock goes through swapSelf, whose BadDelta check (line 598) reads NonzeroDeltaCount and reverts the skippable call if any address is left with an unsettled delta; the in-kind payment has no such guard and cannot be rolled back. In Uniswap v4, take() (and mint()) is callable by any address while the manager is unlocked and debits the caller's own delta, so a listed coin whose transfer, when msg.sender is the index and the manager is unlocked, calls PoolManager.take(IMD, anyone, 1) leaves a nonzero delta on the coin's address; unlock() then reverts CurrencyNotSettled after unlockCallback returns, and the whole redeemToImd reverts. The coin only needs to be deliverable by the manager (buys work, so mint, mintFirst and rebalance adopt it and held > 0) and to refuse, or sabotage, transfers to the manager (so no sale by redeemToImd or rebalance ever succeeds and held never reaches zero through the index). mint and redeem keep working, so funds are not frozen, but the IMD exit is blocked for all holders for as long as the coin is held, and the threat model's invariant 4 ('alike' by redeem and redeemToImd) and its stated intent that a coin whose sale fails is paid in kind do not hold. Precondition: the coin is adopted by a weekly list (any registered launch token with a >=100 IMD pool ranked by spot price x supply) or is among the constructor's five; coins are 'trusted to nothing' in THREAT_MODEL.md. Medium under the threat model's scale: a core function blocked by someone else. Smallest fix preserving the design: do not call the coin inside the unlock; in the RedeemToImd path record the in-kind amount as owed[caller][token] (with the Owed event) for the redeemer to claim() afterwards, or collect the (token, amount) pairs and pay them with _pay after IPoolManager.unlock returns in redeemToImd. Reported by audit_economics; reproduced here with my own test.","line":479,"path":"src/Imdex5.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {Test} from \"forge-std/Test.sol\";\nimport {Imdex5} from \"src/Imdex5.sol\";\nimport {IPoolManager, IUnlockCallback} from \"src/Interfaces.sol\";\n\n/// @dev A plain ERC-20 whose transfer, when the index calls it while the PoolManager is unlocked,\n/// takes 1 wei of IMD from the manager (take() is open to any address while unlocked and debits\n/// the caller's delta, as in Uniswap v4), and refuses transfers to the manager so it is never sold.\ncontract TakerCoin {\n    address constant IMD = 0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7;\n    address constant PM = 0x000000000004444c5dc75cB358380D2e3dE08A90;\n    address public index;\n    address public attacker;\n    mapping(address => uint256) public balanceOf;\n    mapping(address => mapping(address => uint256)) public allowance;\n\n    function set(address index_, address attacker_) external {\n        index = index_;\n        attacker = attacker_;\n    }\n\n    function mint(address to, uint256 amount) external {\n        balanceOf[to] += amount;\n    }\n\n    function approve(address spender, uint256 amount) external returns (bool) {\n        allowance[msg.sender][spender] = 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    function transfer(address to, uint256 amount) external returns (bool) {\n        require(to != PM, \"no sales\");\n        if (msg.sender == index && Pool(PM).unlocked()) {\n            IPoolManager(PM).take(IMD, attacker, 1);\n        }\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// @dev A plain ERC-20.\ncontract Coin {\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 approve(address spender, uint256 amount) external returns (bool) {\n        allowance[msg.sender][spender] = 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    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount;\n        balanceOf[to] += amount;\n        return true;\n    }\n}\n\n/// @dev A 1:1 PoolManager stand-in that mirrors v4's delta bookkeeping: `take` is open to any\n/// address while unlocked and debits the caller's own delta; `unlock` reverts CurrencyNotSettled\n/// if any address still has a nonzero delta when the callback returns.\ncontract Pool {\n    bytes32 constant NONZERO_DELTA_COUNT_SLOT = 0x7d4b3164c6e45b97e7d87b7125a44c5828d005af88f9d751cfd78729c5d99a0b;\n    bool public unlocked;\n    mapping(address => mapping(address => int256)) public delta;\n    uint256 public nonzero;\n    address private synced;\n    uint256 private syncedBalance;\n\n    error CurrencyNotSettled();\n    error ManagerLocked();\n\n    function unlock(bytes calldata data) external returns (bytes memory result) {\n        require(!unlocked);\n        unlocked = true;\n        result = IUnlockCallback(msg.sender).unlockCallback(data);\n        if (nonzero != 0) revert CurrencyNotSettled();\n        unlocked = false;\n    }\n\n    function _account(address who, address cur, int256 d) private {\n        int256 before = delta[who][cur];\n        int256 after_ = before + d;\n        delta[who][cur] = after_;\n        if (before == 0 && after_ != 0) nonzero += 1;\n        else if (before != 0 && after_ == 0) nonzero -= 1;\n    }\n\n    function swap(IPoolManager.PoolKey memory key, IPoolManager.SwapParams memory p, bytes calldata)\n        external\n        returns (int256)\n    {\n        if (!unlocked) revert ManagerLocked();\n        uint256 amount = p.amountSpecified < 0 ? uint256(-p.amountSpecified) : uint256(p.amountSpecified);\n        address inCur = p.zeroForOne ? key.currency0 : key.currency1;\n        address outCur = p.zeroForOne ? key.currency1 : key.currency0;\n        _account(msg.sender, inCur, -int256(amount));\n        _account(msg.sender, outCur, int256(amount));\n        int256 a0 = p.zeroForOne ? -int256(amount) : int256(amount);\n        int256 a1 = p.zeroForOne ? int256(amount) : -int256(amount);\n        return int256((uint256(a0) << 128) | uint256(uint128(int128(a1))));\n    }\n\n    function sync(address currency) external {\n        synced = currency;\n        syncedBalance = Coin(currency).balanceOf(address(this));\n    }\n\n    function settle() external payable returns (uint256 paid) {\n        paid = Coin(synced).balanceOf(address(this)) - syncedBalance;\n        _account(msg.sender, synced, int256(paid));\n    }\n\n    function take(address currency, address to, uint256 amount) external {\n        if (!unlocked) revert ManagerLocked();\n        _account(msg.sender, currency, -int256(amount));\n        require(Coin(currency).transfer(to, amount));\n    }\n\n    function extsload(bytes32) external pure returns (bytes32) {\n        return bytes32(uint256(1 << 96));\n    }\n\n    function exttload(bytes32 slot) external view returns (bytes32) {\n        if (slot != NONZERO_DELTA_COUNT_SLOT) return 0;\n        return bytes32(nonzero);\n    }\n}\n\ncontract RedeemToImdBrickProofTest is Test {\n    Imdex5 index;\n    Coin imd;\n    TakerCoin bad;\n    address alice = makeAddr(\"alice\");\n    address bob = makeAddr(\"bob\");\n    address attacker = makeAddr(\"attacker\");\n\n    function setUp() public {\n        index = new Imdex5();\n        vm.etch(index.IMD(), address(new Coin()).code);\n        imd = Coin(index.IMD());\n        vm.etch(index.POOL_MANAGER(), address(new Pool()).code);\n        Imdex5.Coin[] memory coins = index.coins();\n        for (uint256 i; i < coins.length; ++i) {\n            if (i == 0) {\n                vm.etch(coins[i].token, address(new TakerCoin()).code);\n                TakerCoin(coins[i].token).set(address(index), attacker);\n                bad = TakerCoin(coins[i].token);\n            } else {\n                vm.etch(coins[i].token, address(new Coin()).code);\n            }\n            Coin(coins[i].token).mint(index.POOL_MANAGER(), 1_000_000e18);\n        }\n        imd.mint(index.POOL_MANAGER(), 1_000_000e18);\n        imd.mint(alice, 10_000e18);\n        imd.mint(bob, 10_000e18);\n        vm.prank(alice);\n        imd.approve(address(index), type(uint256).max);\n        vm.prank(bob);\n        imd.approve(address(index), type(uint256).max);\n    }\n\n    function test_redeemToImdPaysInKindWhenAHeldCoinTouchesTheManager() public {\n        vm.prank(alice);\n        index.mintFirst(1000e18, new uint256[](5));\n        assertGt(index.held(address(bad)), 0);\n        vm.prank(bob);\n        index.mint(100e18, 200e18, 0);\n\n        // Expected: the coin whose sale fails is paid in kind (or recorded as owed) and the rest\n        // in IMD. Actual on this code: the in-kind transfer runs inside the unlock, the coin\n        // takes 1 wei of IMD from the manager, and the unlock reverts CurrencyNotSettled.\n        uint256 bobShares = index.balanceOf(bob);\n        uint256 imdBefore = imd.balanceOf(bob);\n        vm.prank(bob);\n        index.redeemToImd(bobShares, 0);\n        assertGt(imd.balanceOf(bob), imdBefore, \"bob was paid IMD for the sellable coins\");\n        assertEq(index.balanceOf(bob), 0);\n    }\n}","reproduction":"Run `forge test --match-path test/scratch/RedeemToImdBrickProof.t.sol` (the attached proof). Setup: Imdex5 unchanged; a 1:1 PoolManager stand-in etched at the mainnet address that mirrors v4's rules (take() open to any caller while unlocked, debiting the caller's delta; unlock() reverts CurrencyNotSettled if any delta is nonzero after the callback); coin 0's token is TakerCoin: transfer() reverts when to == POOL_MANAGER, and when msg.sender == index while the manager is unlocked it first calls PoolManager.take(IMD, attacker, 1). Calls: alice mintFirst(1000e18, zeros) succeeds (held[coin0] > 0); bob mint(100e18, 200e18, 0) succeeds; bob redeemToImd(balanceOf(bob), 0). Expected: bob receives IMD for coins 1-4 plus his idle share and coin 0 in kind (or owed) at 99.5%. Actual: revert CurrencyNotSettled, for bob and for every other holder on every attempt while held[coin0] > 0 (test/scratch/RedeemToImdBrick.t.sol asserts this standing state, and that redeem() still works). Output: `[FAIL: CurrencyNotSettled()] test_redeemToImdPaysInKindWhenAHeldCoinTouchesTheManager()`.","severity":"medium","snippet":"                _payInKind(coin.token, caller, amount, keepBps);","title":"redeemToImd pays a failed sale's coin in kind inside the PoolManager unlock, so a held coin that touches the manager from its transfer makes redeemToImd revert for every holder"},{"citation":"resolved","description":"Step (3) skips the trim when listCount < 4 (line 522) because a quarter cap cannot be met by fewer than four coins, but step (4) still limits each buy to room = cap - value with cap = total / WEIGHT_DIVISOR (line 521), where total includes idleImd. With k < 4 list coins at most k/4 of the index's value can be invested; the rest stays idleImd, and every later rebalance to the same list finds room = 0 for each coin and spends nothing. submit accepts lists of 1 to 5 launches (line 321), so a week in which fewer than four pools hold 100 IMD produces this state. mint keeps the idle proportion (idlePart), so later minters inherit it. No funds are lost, redeem and redeemToImd return the idle IMD at par, so low: a gap between steps (3) and (4) that is not documented as a limit. If wanted, cap step (4)'s room by total / min(listCount, WEIGHT_DIVISOR), or document the cash fraction for short lists. Reported by audit_economics (three coins) and audit_math (two coins); merged, reproduced here with two coins.","line":536,"path":"src/Imdex5.sol","reproduction":"Repo mocks (test/Imdex5Base.sol: five coins, pools 1,000,000 coin / 10,000 IMD). alice mintFirst(100e18); deliver a signed two-launch list (launches 1282, 1283); rebalance(). Measured in test/scratch/LowChecks.t.sol test_quarterCapLeavesIdleWithTwoCoins: idleImd = 49.7896e18, coin value = 49.8340e18 (about 50% idle), coins().length == 2 (leavers fully sold). Warp 7 days, deliver the same list, rebalance(): idleImd is unchanged at 49.789600999999999999e18. Expected per the NatSpec 'spends idle IMD on the list in equal parts': idle near zero after the second rebalance. Actual: half the index stays in IMD indefinitely.","severity":"low","snippet":"            uint256 room = cap > value ? cap - value : 0;","title":"With fewer than four list coins the quarter-weight cap in rebalance step (4) leaves 25%-75% of the index as idle IMD that no later rebalance invests"},{"citation":"resolved","description":"_rebalance step (1) tries to sell the leaver through the same dead pool (_trySell is skipped), step (2) keeps it as a residual because held > 0 (src/Imdex5.sol line 510: `if (!_inList(next, old[i].token) && held[old[i].token] > 0) _coins.push(old[i]);`), and _mintMore's residual branch reverts BuyFailed on it (lines 432-434) on every later mint, through every later rebalance, for as long as the pool is dead. The only exits are the pool working again or every holder redeeming so held reaches zero. The accepted-limit text on line 29 states the opposite; line 30 states it correctly for residuals. Whoever controls a listed coin's hook or token (a pausable token, a hook that can be made to revert) can therefore keep mint closed for everyone without holding a share. This is the documented tradeoff of audit 3bd5e1aa (settling a reverted residual buy at spot was worse), so low: fix the documentation on line 29 (and the matching README text) rather than redesign. Reported by audit_flow; reproduced here.","line":29,"path":"THREAT_MODEL.md","reproduction":"test/scratch/LowChecks.t.sol test_deadResidualBlocksMintThroughRebalances (repo mocks): alice mintFirst(1000e18); pm.setDead(key(coin0), true); bob mint(10e18, 100e18, 0) reverts. Deliver and submit a list of the other four launches plus 2000, rebalance(): listCount == 5, coins().length == 6 with coin0 kept as a residual, held(coin0) > 0; bob mint reverts BuyFailed(coin0). Warp 7 days, deliver the same list, rebalance() again: coins().length still 6; bob mint reverts BuyFailed(coin0) again; alice redeem(1e18) succeeds. Expected per THREAT_MODEL.md line 29: a rebalance drops the coin and mint reopens. Actual: no rebalance drops it.","severity":"low","snippet":"- A coin in the list whose pool dies blocks `mint` until a `rebalance` drops it; `redeem` still works.","title":"THREAT_MODEL.md says a dead list coin blocks mint 'until a rebalance drops it'; no rebalance drops a coin whose pool is dead while held > 0, so mint stays blocked until the pool revives or every holde"},{"citation":"resolved","description":"The on-chain QUESTION (line 63) selects any launch 'recorded in either IdentityMD launch registry' with a qualifying IMD pool, ranked by spot price x total supply; it does not require the launch to have a 'token' and a 'hook' artifact. submit consumes the answer through _lookup, which reverts ArtifactMissing (line 678) when either artifact is absent and NotRecorded (line 672) when neither registry records the launch, and the answer is all-or-nothing. By then onOracleResult has closed the request (openSince = 0), rebalance reverts NoNextList, and ask reverts AskTooSoon until lastAsk + 7 days (line 254): the 0.5 IMD oracle price and the 0.25 IMD ask reward are spent for nothing. A contracts-only launch is recorded without a hook artifact, and anyone can give such a launch's ERC-20 a 100-IMD v4 pool at fee 12500, so an honest answer can name it week after week while it ranks; the accepted limit 18ca8bf9 covers one lost week, not a standing condition. Impact is bounded (mint, redeem and redeemToImd keep working; the list freezes and fees leak 0.75 IMD per week), so low. Smallest change preserving the design: in submit, skip an entry that is not recorded or lacks an artifact and adopt the remaining entries (still requiring at least one), or add the artifact requirement to the question's exclusion clause. Reported by audit_permissions; reproduced here from the existing test and the ask interval.","line":678,"path":"src/Imdex5.sol","reproduction":"The repository's own test/Imdex5Revised.t.sol test_submitRejectsALaunchWithoutAHookOrAToken shows the revert: regA.record(3000, tokenOnly, address(0)); fund(2e18); ask(); deliver a signed answer [3000] through the Intake; submit(a, sig) reverts ArtifactMissing(3000); nextList() is empty. The same test then has to warp 7 days before ask() succeeds again (AskTooSoon before that), and feeImd has dropped 0.75e18 per cycle. For a five-entry answer [1282,1283,737,1075,3000] the revert is the same: expected the four consumable launches adopted, actual nothing adopted, rebalance() reverts NoNextList until the next week's answer, which repeats the revert while launch 3000 ranks.","severity":"low","snippet":"        if (token == address(0) || hook == address(0)) revert ArtifactMissing(launch);","title":"One answer entry whose launch lacks a token or hook artifact makes submit revert for the whole list, costing the week and its 0.75 IMD, and repeats every week the oracle ranks that launch"},{"citation":"resolved","description":"In redeem (src/Imdex5.sol lines 209-219) keepBps = BPS - FEE_BPS leaves 0.50% of the redeemed share of every coin in held[token] and of the idle part in idleImd; feeImd is untouched, as README.md line 147 correctly states ('the 0.50% stays with the remaining holders'). The note's other figures (177 tests, 23,552 bytes) match this tree. Notes are explanatory text, not deployment authority; the schema fields (kind evm_contracts, one contract Imdex5 with no constructor arguments) are correct for a contracts-only launch with no owner. Documentation only. Reported by audit_permissions; the stale-count part of its finding does not apply to this tree.","line":9,"path":"launch.json","reproduction":"Repo mocks: alice mintFirst(1000e18) sets feeImd to 5e18; alice redeem(100e18): feeImd stays 5e18 while held[coin] drops by 99.5% of the proportional amount (the 0.5% remains in held). Expected per the note: feeImd grows by the redeem fee. Actual: feeImd unchanged.","severity":"info","snippet":"Unchanged: the 0.50% fee on mints, redeems and redeemToImd into feeImd","title":"launch.json notes say the 0.50% fee on redeems goes into feeImd; redeem credits nothing to feeImd, the 0.50% stays in held and idleImd with the remaining holders"},{"citation":"resolved","description":"Line 578 is 139 columns; `forge fmt --check src` exits 1 with a diff that splits the IPoolManager.swap call across lines 578-584. Every other line of src/ and test/ is formatted. No behavioural effect; running `forge fmt` on the file is the whole fix. Reported by audit_permissions; reproduced here.","line":578,"path":"src/Imdex5.sol","reproduction":"Run `forge fmt --check src` on this tree. Expected: exit 0. Actual: exit 1 and 'Diff in src/Imdex5.sol' at lines 577-584.","severity":"info","snippet":"            .swap(key, IPoolManager.SwapParams(zeroForOne, exactOut ? SafeCast.toInt256(amount) : -SafeCast.toInt256(amount), limit), \"\");","title":"forge fmt --check fails on src/Imdex5.sol at the SafeCast swap line"}],"hash":"9070d92b183a3a52bbbbdbead4026889f67456c0f08ebe52653eeb28cd7dcee0","nodeId":"1c15ce29-987a-4b07-91dd-bb544042ebfe","outcome":"completed","summary":"The findings file is written and validated. All seven findings carry reproductions, both mediums carry failing proof tests, and the coverage record answers all 17 entry points plus four invariant rows.\n\n**Outcome:** seven findings kept, two medium, three low, two info. One specialist finding was dropped and two were merged.\n\n**Kept, with reproduction on this tree:**\n- **Medium, `_pay` double payment** (src/Imdex5.sol:650). A coin whose transfer moves funds and then returns false is paid and also recorded as owed, so a later claim pays the entitlement a second time from other holders' backing. The tester's proof fails here with the stated values, and it is attached.\n- **Medium, redeemToImd brick** (src/Imdex5.sol:479). The in-kind fallback transfers a held coin inside the PoolManager unlock with no delta guard. A coin that calls `take` from its transfer leaves an unsettled delta and every redeemToImd reverts CurrencyNotSettled while it is held. I wrote a proof that fails here and a second test confirming the standing state while redeem still works.\n- **Low, quarter cap on short lists** (merged from economics and math). With two list coins, half the index stays as idle IMD and a second rebalance spends nothing. Measured in a scratch test.\n- **Low, dead residual documentation** (THREAT_MODEL.md:29). No rebalance drops a dead coin while held is positive; mint stays blocked through repeated rebalances. Confirmed in a scratch test.\n- **Low, ArtifactMissing stall** (src/Imdex5.sol:678). One unconsumable answer entry rejects the whole list and costs the week. Reproduced from the repository's own test plus the ask interval.\n- **Info, manifest note** says redeem fees go to feeImd; they stay with holders. The note's test count and size figures do match this tree, so that part of the specialist's claim was discarded.\n- **Info, forge fmt** fails on line 578. Reproduced.\n\n**Dropped:** the flow specialist's claim that no fork test calls `ask()` against the live Intake. The rebalance fork test does so at test/Fix3Rebalance.fork.t.sol:79.\n\n**My own pass** found nothing beyond these. Size holds at 23,552 bytes, the constructor calls no contract, mint cannot take IMD on revert, minShares is enforced before issuance, and only a signed, unexpired, quorum answer can change the list.","treeHash":null,"usage":{"cachedInputTokens":1844496,"inputTokens":548,"model":"claude-fable-5-1","outputTokens":32038,"runtime":"claude","turns":27,"wallClockMs":767289}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"dc34db8e17664ebd","findings":[{"citation":"resolved","description":"Control flow across transactions. A list coin whose pool rejects swaps (hook reverts or burns gas, token paused so take() fails, pool removed) makes every mint revert BuyFailed, which is accepted. The threat model (THREAT_MODEL.md line 29) says this lasts 'until a rebalance drops it'. It does not: _rebalance step 1 tries to sell the leaver through the same dead pool (_trySell is skipped), step 2 keeps it as a residual because held > 0 (line 510), and _mintMore's residual branch reverts BuyFailed on it (lines 432-434) on every later mint, through every later rebalance, for as long as the pool is dead. There is no path that drops a residual with held > 0 other than a successful sale or every holder redeeming so held reaches 0. The index becomes redeem-only for the lifetime of the outage; the only recovery is for all holders to exit and restart with mintFirst. Whoever controls a listed coin's hook or token (a pausable token, an upgradeable or pausable hook) can therefore freeze mint for everyone without holding any share. This is the documented tradeoff of audit 3bd5e1aa (settling a reverted residual buy at spot was worse), so it is reported as low: document it accurately rather than redesign. Minimal documentation fix: in THREAT_MODEL.md line 29 and README, state that a dead coin blocks mint until its pool works again or its holding reaches zero, and that a rebalance does not remove it while held > 0.","line":432,"path":"src/Imdex5.sol","reproduction":"Mock setup (test/Imdex5Base.sol _deployAll). 1) alice mintFirst(1000e18). 2) pm.setDead(key(coin0), true). 3) bob mint(10e18, 100e18, 0) reverts (BuyFailed coin0). 4) fund, ask, deliver and submit a list of the other four coins plus NEW_TOKEN (launch 2000), then rebalance(): coin0's sale is SwapSkipped, listCount == 5, coins().length == 6 with coin0 at index 5 and held(coin0) > 0. 5) bob mint(10e18, 100e18, 0) reverts BuyFailed(coin0). 6) warp 7 days, deliver and submit the same list, rebalance() again: coins().length is still 6. 7) bob mint reverts BuyFailed(coin0) again. Expected per THREAT_MODEL.md line 29: mint is blocked 'until a rebalance drops it'. Actual: no rebalance drops it; mint is blocked until the pool revives or every holder redeems. redeem(shares) still works. Verified with test/scratch/DeadResidual.t.sol (passes on this code, asserting the blocked state).","severity":"low","snippet":"                } catch {\n                    revert BuyFailed(coin.token);\n                }","title":"A residual whose pool stays dead blocks mint indefinitely; no rebalance can drop it while held > 0 (threat model says a rebalance drops a dead list coin)"},{"citation":"resolved","description":"The eight fork tests cover mint, redeem, rebalance and the floor against the five real pools, but none calls ask() against the real Intake (0xa43e...DE82), so the hard-coded requestWithFailure ABI, the 0.5 IMD pull and the reward path were only ever checked against test/mocks/Mocks.sol MockIntake. The oracle request is the only way the list can ever change, so a wrong selector or a different pull amount would have left the index frozen on its constructor list with invariant 1 broken by 0.5 IMD per ask. Checked here against mainnet at block 26238865: the Intake runtime contains selector 0x9a78c321 (requestWithFailure(bytes32,bytes,(address,bytes4),bytes4,address,uint256)), both registries expose isRecorded(uint64) and artifactsOf(uint64), ORACLE_SIGNER has no code (an EOA, so the ECDSA path of SignatureChecker applies), and a deployed Imdex5 after fund(2e18) and ask() has openSince != 0, pays the caller exactly 0.25 IMD, leaves feeImd == 1.25e18 == its IMD balance and no allowance to the Intake; the five constructor coins resolve to the same token and hook artifacts _lookup would read. No defect; recorded as an untested edge the suite should cover so a future Intake change is caught.","line":9,"path":"test/Fix3.fork.t.sol","reproduction":"Fork of mainnet at block 26238865: X = new Imdex5(); deal 10 IMD to alice; alice approves X, X.fund(2e18), X.ask(). Expected and actual: openSince() != 0, alice receives 0.25e18 IMD, X.feeImd() == 1.25e18 == IMD.balanceOf(X), allowance(X, INTAKE) == 0. See test/scratch/AskFork.t.sol (passes with --fork-url).","severity":"info","snippet":"/// forge test --match-contract Fix3ForkTest --fork-url <rpc> -vv","title":"No fork test exercises ask() against the live Intake; a scratch fork test shows the request path works and keeps invariant 1"}],"hash":"a40a120b3d23b8c2a387b2f8c33d66cf7bff4130efa0c4f59e86ccc3eb91c5e2","nodeId":"762d81e6-0fda-4458-b3c6-e4e137f4c9ff","outcome":"completed","summary":"The review is complete. The findings file is written at the repository root and no source, test or configuration file was changed.\n\n**Outcome.** No medium or higher defect was found in the control flow. The full non-fork suite passes (177 tests), and the one path the suite only mocks, `ask()` against the live Intake, works on a mainnet fork at the current block and keeps the IMD accounting invariant.\n\n**Findings recorded in `.imd-findings.json`**\n\n- **Low. A dead-pool residual blocks mint indefinitely.** A list coin whose pool rejects swaps is dropped from the list by a rebalance but stays as a residual while its holding is above zero, and every later mint reverts on it through every later rebalance. The threat model says a rebalance \"drops\" such a coin, which it cannot. This is the accepted tradeoff of an earlier audit, so the recommended fix is to state the limit accurately rather than redesign. Reproduced with the project mocks in a scratch test.\n- **Info. No fork test covers `ask()`.** The oracle request path is the only way the list can change, and it was only ever exercised against a mock Intake. I verified it against mainnet: the Intake exposes the expected selector, both registries answer, the signer is an EOA, the request opens, the caller gets 0.25 IMD, and the contract's IMD balance equals its fee accounting with no leftover allowance. Recorded as an untested edge, not a defect.\n\n**Coverage.** All 17 listed entry points have a row. Mint is marked with finding 1; everything else holds after tracing checks, state changes and failure paths, including the must-attack items: nothing-out and poor-fill rebalance swaps are skipped, a nothing-out sale in redeemToImd is paid in kind, minShares is enforced after scaling, a reverted mint refunds everything by reverting the whole unlock, held only moves by measured receipts or exact transfers, and the list can only change through an unexpired attestation with four agreeing members whose hash the Intake delivered.\n\n**Not reached.** I could not build a net-profit proof for the \"dump a taxed residual, then mint\" scenario within the budget. The threat model's own tests argue the shortfall is charged at the traded price, and I found no counterexample, but I did not quantify the attacker's fee cost against the 2% shortfall, so that economic edge is left as unverified rather than cleared.","treeHash":null,"usage":{"cachedInputTokens":1579650,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":51744,"runtime":"claude","turns":28,"wallClockMs":1369125}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9c6767b941fcfedc","findings":[],"hash":"a938eee1d82cbf153f144ade1991e1ca882e2b9a12b782ea2bcc6260d3569fbf","nodeId":"762d81e6-0fda-4458-b3c6-e4e137f4c9ff","outcome":"failed","summary":"runtime failed","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":"claude-fable-5-1","outputTokens":0,"runtime":"claude","turns":0,"wallClockMs":579231}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"47f3603854a893a3","findings":[{"citation":"resolved","description":"Boundary x invariant seam. In _rebalance, cap = total / WEIGHT_DIVISOR (4) is always applied to step (4)'s buys, while step (3)'s trim is skipped when listCount < 4 because a 25% cap cannot be met by fewer than four coins. The two are not symmetric: with listCount = k < 4, each list coin can only be bought up to total/4, so (1 - k/4) of the index's value stays as idleImd. Every later rebalance computes the same cap, and room is 0 for every coin, so nothing more is bought. mint keeps the idle proportion (idlePart = idleImd * minted / supply), so later minters inherit it too. The oracle question allows answers of 1-5 coins (submit accepts n in 1..MAX_LIST) when fewer than five pools hold 100 IMD. In that case 'an index of the largest tokens' holds 50% (k=2) or 75% (k=1) IMD for as long as the list stays short. Nothing is stolen, and the README rule 'a buy stops at 25% weight' describes the mechanism, but its consequence for a short list (permanently uninvested IMD) is not documented anywhere. Minimal fix if wanted: for the step-4 room only, use total / min(listCount, WEIGHT_DIVISOR) as the cap. Otherwise document it as a limit.","line":536,"path":"src/Imdex5.sol","reproduction":"Mock setup of test/Imdex5Base.sol (five list coins, pools 1,000,000 coin / 10,000 IMD). alice mintFirst(100e18). _deliverList([launch 1282, launch 1283]) then rebalance(): the three leavers are sold into idleImd, then each of the two coins is bought only up to cap = total/4. Measured: idleImd = 49.79e18, coin value = 49.83e18 (about 50% idle). After warp 7 days, a second identical _deliverList + rebalance(): idleImd is still exactly 49.789600999999999999e18 and coin value is unchanged, because room = 0 for both coins. Expected: the idle IMD is spent on the list, as for a list of four or five coins. Actual: half the index stays in IMD indefinitely.","severity":"low","snippet":"            uint256 room = cap > value ? cap - value : 0;\n            uint256 spend = part < room ? part : room;","title":"With a list of 1-3 coins the 25% buy cap leaves 25-75% of the index permanently in idle IMD (trim is exempted below four coins, the buy cap is not)"}],"hash":"c1e9cb7282f169649afe7ac0c201c69beaa6d4968fac8aac620124e843a870d6","nodeId":"cb8f8c7e-546b-4c73-a6ae-465582a8fe94","outcome":"completed","summary":"I found nothing of medium severity or above in the math. There is one low finding. The report is in `.imd-findings.json`, with a coverage row for all 17 entry points plus two invariants. No repository files changed; the scratch test I ran has been deleted.\n\n**Finding (low): a short list leaves part of the index in IMD for good** (`src/Imdex5.sol:536`)\n- **Cause:** `rebalance` caps each buy at a quarter of total value (`cap = total / 4`) even when the list has fewer than four coins. Selling down to 25% is skipped below four coins, because a list that short can't meet the cap, but the buy cap still applies.\n- **Effect:** with a list of k coins, 1 − k/4 of the value stays as idle IMD. That is 50% for two coins and 75% for one. Later rebalances buy nothing more, and mints keep the same proportion.\n- **Reproduction:** on the project's mock setup I minted 100 IMD first, submitted a two-coin list and rebalanced. Idle IMD was 49.79 and the coins were worth 49.83. A second identical rebalance a week later left idle IMD at exactly the same 49.789600999999999999 IMD.\n- **Fix, if wanted:** for the buy step only, cap each coin at `total / min(listCount, 4)`. Otherwise document it. Nothing is lost; the README says \"a buy stops at 25% weight\" but never states this consequence for a short list.\n\nEach of the required attacks was checked against the code and held:\n- **Rebalance swaps paying dust or under half their value:** every rebalance swap goes through the half-value check (`PoorFill`) and the zero-output check (`NothingOut`). Exactly half passes, as the brief says.\n- **redeemToImd sale that pays nothing:** it reverts `NothingOut`, and that coin is paid to the redeemer in kind instead.\n- **Mint issuing fewer than minShares:** `minShares` is checked before any buy and again after.\n- **Reverted mint keeping IMD:** not possible; the IMD pull and the buys are all in one transaction.\n- **Dilution:** the coin and idle-IMD amounts a minter pays round up and the shares issued round down. A residual's shortfall is charged, rounded up, at the price after the mint's own buy.\n- **`held` versus the real balance:** every credit is the measured balance change, every debit is what was actually sent, and failed payments go to `owed`.\n- **A redeem that cannot pay:** payments that fail become claimable `owed` instead of reverting.\n- **Expired or under-quorum answers:** `submit` checks the signed `agreed >= 4`, the expiry and issue time, and the signature.\n\nI also checked rounding direction on every division, overflow in the price-to-value conversion (it would need a holding above about 3.4e38 wei), the 1% price-move limit, and first-mint share inflation. Accounting is internal, so a donation can't inflate the share price.\n\nNot covered beyond what the threat model already accepts: price moved before a residual's taxed buy, and exact Uniswap v4 hook-delta behaviour on mainnet. I didn't run fork tests.","treeHash":null,"usage":{"cachedInputTokens":1297058,"inputTokens":30,"model":"claude-opus-5-5","outputTokens":30045,"runtime":"claude","turns":15,"wallClockMs":348403}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"771f83f312eace21","findings":[{"citation":"resolved","description":"Seam: access x asymmetry. The question (QUESTION, line 63) selects any launch 'recorded in either IdentityMD launch registry' whose Uniswap v4 pool against IMD at fee 12500 holds 100 IMD or more, ranked by spot price times total supply. It does not require the launch to have a 'token' and a 'hook' artifact, nor that the pool be the one keyed by the registry hook. submit (line 314) consumes the answer through _lookup (line 668), which reverts ArtifactMissing when either artifact is absent and NotRecorded (line 672) when neither registry records the launch. The two domains differ, and the whole answer is one all-or-nothing list: one unconsumable entry makes submit revert for the entire week. onOracleResult has already closed the request (openSince = 0, line 288), rebalance reverts NoNextList, and ask reverts AskTooSoon until lastAsk + 7 days (line 254). The 0.5 IMD oracle price and the 0.25 IMD ask reward are spent for nothing. The amplifier is unprivileged: anyone can create a v4 IMD pool (fee 12500) with 100 IMD for the ERC-20 of a recorded launch that has no hook artifact. Contracts-only launches are recorded without a hook (registry B records launch 1282's non-token contracts under role 'other'; a contracts-only launch has no 'hook' role at all), and this index is itself such a launch: its share IMDEX5 is a plain ERC-20 whose spot price is about one IMD and whose supply is the IMD under management, so once a 100-IMD IMDEX5/IMD pool exists and the index's own market value ranks in the top five, every honest weekly answer names it and no list can ever be adopted again while it stays ranked. The existing test test_submitRejectsALaunchWithoutAHookOrAToken treats the revert as intended for one answer; the week-long stall and its repetition are not in THREAT_MODEL.md's accepted limits (18ca8bf9 covers one lost week, not a standing condition). Impact is bounded: mint, redeem and redeemToImd keep working, the list is frozen and fees leak 0.5 IMD per week. Smallest change preserving the design: in submit, skip (do not revert on) an entry whose launch is not recorded or lacks a token or hook artifact, and accept the remaining entries as the next list (still requiring at least one); alternatively mention such launches in the exclusion clause of QUESTION. Reproduction confirmed with test/scratch/ArtifactGap.t.sol on this tree (mocks: registry A records launch 3000 with a token and no hook).","line":678,"path":"src/Imdex5.sol","reproduction":"State: supply > 0 after mintFirst; feeImd >= 0.75 IMD (fund(2e18)). 1) bob: ask() -> feeImd drops 0.75e18, request opens. 2) Intake delivers onOracleResult(openRequest, a, '') where a.answer = abi.encode([1282,1283,737,1075,3000]) as bytes32[], a.agreed = 5, signed by the oracle signer for this contract; launch 3000 is recorded in registry A with artifacts [distributor, token] and no hook. Result: openSince = 0, answerHash = keccak256(a.answer). 3) bob: submit(a, sig) -> reverts ArtifactMissing(3000) (expected under the design: the four consumable launches adopted; actual: nothing adopted). 4) rebalance() -> NoNextList; ask() -> AskTooSoon until lastAsk + 7 days. 5) After 7 days ask() succeeds, answerHash resets to 0; the same ranked launch produces the same revert the next week. Expected: a list update per week while fees last. Actual: the list never changes while a hook-less recorded launch ranks top five, 0.75 IMD of fees spent per week.","severity":"low","snippet":"        if (token == address(0) || hook == address(0)) revert ArtifactMissing(launch);","title":"Trust gap: the oracle question admits launches that submit cannot consume, so one such launch in the top five stalls the list every week (ArtifactMissing)"},{"citation":"resolved","description":"The manifest notes say the 0.50% fee on redeems goes into feeImd. In redeem (src/Imdex5.sol lines 209-219) the 0.50% is never credited to feeImd: keepBps = BPS - FEE_BPS leaves it in held[token] and idleImd, with the remaining holders, as README.md line 147 correctly states. The same notes also say '145 tests; the 7 mainnet fork tests skip' and 'runtime measured 23,266 bytes', while this tree has 177 passing tests, 7 skipped fork tests in 3 fork files (THREAT_MODEL.md says 8 fork tests), and the brief states 23,552 bytes. Notes are explanatory text, not deployment authority, and the schema fields (kind, one contract Imdex5 with no constructor arguments, no $owner) are correct for a contracts-only launch with no owner. Documentation only; no code change.","line":9,"path":"launch.json","reproduction":"Read launch.json line 9 and compare with src/Imdex5.sol redeem(): after mintFirst(1000e18) by alice and redeem(100e18) by alice, feeImd is unchanged (still the first mint's 0.50%), while held[token] retains 0.50% of the redeemed share of each coin. Expected per the notes: feeImd grows by the redeem fee. Actual: feeImd unchanged.","severity":"info","snippet":"the 0.50% fee on mints, redeems and redeemToImd into feeImd","title":"launch.json notes describe the redeem fee destination, test count, fork-test count and runtime size inaccurately"},{"citation":"resolved","description":"The project uses forge fmt (every other line of src/ and test/ is formatted; the machine policy for this launch runs `forge fmt --check`). Commit 646635a's SafeCast change left line 578 at 139 columns; `forge fmt --check src` exits 1 and prints a diff that splits the call across lines 578-584. No behavioural effect; the compiled bytecode is identical after formatting. The author's next revision should run `forge fmt` on src/Imdex5.sol so the verifier's format check passes.","line":578,"path":"src/Imdex5.sol","reproduction":"Run `forge fmt --check src` on this tree (a578235 / 85b1a75). Expected: exit 0, no diff. Actual: exit 1 with 'Diff in src/Imdex5.sol' at lines 577-584, reformatting the IPoolManager.swap call.","severity":"info","snippet":"            .swap(key, IPoolManager.SwapParams(zeroForOne, exactOut ? SafeCast.toInt256(amount) : -SafeCast.toInt256(amount), limit), \"\");","title":"forge fmt --check fails on src/Imdex5.sol at the SafeCast swap line introduced by the 705dd677 fix"}],"hash":"cf3b280aa027d6918867bd3741b56a4fd1734173c9284e369302d8ba12cf0922","nodeId":"8de0ef71-dc3b-448d-853f-5b90c90dcd70","outcome":"completed","summary":"The review is complete. The findings file is written and validated, and no tracked file was changed.\n\n**Result: the permission model holds.** Every open entry point is open by design, and the four guarded ones (`onOracleResult`, `onOracleFailure`, `unlockCallback`, `swapSelf`) check the right caller on every path. No storage variable has a weaker-guarded writer, no reentrancy path reaches `unlockCallback` from an untrusted coin or hook, and gas-starving a single rebalance swap is impossible because the swap stipend is smaller than what the rest of the call needs. I verified the chain facts on mainnet: all five constructor pools have a live price, both registries return the same token and hook as the constructor, the oracle signer is an EOA, and the transient-slot constant is correct.\n\n**Findings written to `.imd-findings.json`** (nothing medium or above, so no proof test):\n\n- **Low, trust gap in the oracle flow.** The on-chain question admits any recorded launch with a 100 IMD pool, but `submit` reverts `ArtifactMissing` for a launch without token and hook artifacts. One such launch in the top five kills the whole week's list, with the request already closed and `ask` locked for seven days. Anyone can trigger it by pooling the ERC-20 of a contracts-only launch, and the index's own share token qualifies once its managed value ranks top five. Confirmed with a scratch test. Suggested smallest fix: skip unconsumable entries in `submit` instead of reverting.\n- **Info.** The launch.json notes misstate where the redeem fee goes and carry stale test and size counts.\n- **Info.** `forge fmt --check src` fails on the SafeCast swap line added by the 705dd677 fix.\n\n**Coverage:** all 17 listed entry points have a row. 15 hold, two (`submit`, `onOracleResult`) point at finding 1. Two extra rows record what I did not reach: the behaviour of the 24 KB MARG hook on a fork, and the off-chain ranking's gameability, whose on-chain consequences stay inside the documented limits.\n\nThe baseline suite passed before I started (177 passed, 7 fork tests skipped). The scratch test lives under `test/scratch/`, which is not submitted.","treeHash":null,"usage":{"cachedInputTokens":2079370,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":55070,"runtime":"claude","turns":32,"wallClockMs":1244586}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"a406deaac63a93b0","findings":[{"citation":"resolved","description":"Documentation only; nothing in the schema fields is wrong (kind evm_contracts, one contract Imdex5, no constructor arguments, no owner), and notes are explanatory text, not deployment authority. The two medium fixes of this round (paySelf and paying redeemToImd's in-kind part after the unlock) grew the runtime from 23,552 to 23,869 bytes (README.md lines 15 and 332 and THREAT_MODEL.md say so) and the suite from 177 to 199 tests (187 in THREAT_MODEL.md before the independent tester's three new files), but the notes still state 23,552 bytes, 177 tests and describe the deployed source as 'the accepted source at commit a578235451bde04d976ea0512d62bba2a4e14d61', the commit before these fixes. The notes also do not mention the paySelf self-call or that redeemToImd's in-kind part is paid after the unlock, the two behaviours this round changed. The author's answer to a1d062f9 said only the fee sentence changed, which is true; the stale figures predate that edit. Settled findings from the previous round, for the record: eade2f07 (false-return coin paid twice) is fixed, its proof passes on this tree, _pay now runs SafeERC20.safeTransfer inside the self-call paySelf under PAY_GAS and records owed only when that call reverts; e3e0815c (redeemToImd bricked by a coin that touches the manager) is fixed, its proof passes, _redeemToImd returns the in-kind amounts through unlockCallback and redeemToImd pays them with _pay after the manager is locked; 2ff07688, 87c33a5f and e7a4430f are documented in THREAT_MODEL.md and README.md with pinned tests as agreed (lows documented, not redesigned); a1d062f9's fee sentence and e819c3fc's formatting are fixed (forge fmt --check src test exits 0). Full suite: 199 tests pass with the verifier's seed, the 8 mainnet fork tests pass against mainnet at block 26,239,762 (RPC https://eth.llamarpc.com or any mainnet endpoint), runtime 23,869 bytes.","line":9,"path":"launch.json","reproduction":"Run `forge build --sizes | grep Imdex5` on this tree: runtime size 23,869 bytes. Run `forge test --no-match-path 'test/scratch/*'`: 199 passed, 7 skipped (fork). Read launch.json line 9: the notes say 'runtime 23,552 bytes' and '177 unit and fuzz tests' and 'the accepted source at commit a578235451bde04d976ea0512d62bba2a4e14d61'. `git log -1` on this tree is c90a247f6636d55ef5f5fd384c49441df2402485, and `git show a578235:src/Imdex5.sol` has no paySelf. Expected: notes that match the tree being deployed (23,869 bytes, the current commit, the two fixes). Actual: the figures and commit of the previous source.","severity":"info","snippet":"runtime 23,552 bytes, under 24,576, with no DELEGATECALL, CALLCODE or SELFDESTRUCT. Local check: forge build and forge test with the verifier fuzz seed pass (177 unit and fuzz tests; the mainnet fork tests skip without a fork URL).","title":"launch.json notes still quote the pre-fix runtime size (23,552 bytes), test count (177) and 'accepted source at commit a578235' although the revised code is 23,869 bytes with 199 tests"}],"hash":"df542c141971e679b5aea5764d7886fc37ca1a8e196cfc3862cf89815d968c38","nodeId":"1c15ce29-987a-4b07-91dd-bb544042ebfe","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. Nothing else needs to be done.\n\n**Both medium findings are fixed.** I ran my two attached proofs against the revised code and both pass. The false-return coin is now paid through `paySelf`, a reverting self-call using SafeERC20 under PAY_GAS, so a coin that moves funds and then returns false is rolled back and owed once, never paid twice. The redeemToImd in-kind payments are now returned from the unlock as an array and paid after the PoolManager is locked, so a coin whose transfer touches the manager can no longer revert every holder's IMD exit. The regression tests in `test/Imdex5Payments.t.sol` cover both.\n\n**The five advisory items are settled as agreed.** The short-list idle fraction, the dead-residual wording, and the all-or-nothing submit are documented in THREAT_MODEL.md and README.md with pinned tests. The launch.json fee sentence is corrected and `forge fmt --check` on src and test exits 0.\n\n**Verification on this tree:**\n\n| Check | Result |\n|---|---|\n| Full suite with verifier seed | 199 passed, 7 fork tests skipped |\n| 8 mainnet fork tests via local RPC | all pass at block 26,239,762 |\n| Runtime size | 23,869 bytes, 707 under the limit |\n| Format check | clean |\n\n**One new item, info only.** The launch.json notes still quote the pre-fix figures: 23,552 bytes, 177 tests, and \"accepted source at commit a578235\", while the tree being deployed is 23,869 bytes with 199 tests and includes the two fixes. The schema fields are correct. The coverage record answers all 18 entry points as holds, plus three invariant and build rows. The scratch copies of the proofs were removed, so the tree is unchanged apart from the findings file.","treeHash":null,"usage":{"cachedInputTokens":733519,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":14830,"runtime":"claude","turns":14,"wallClockMs":834264}},{"artifacts":[],"attempt":1,"bundleHash":"c491230d418beb1f2b0227de6ffb94aaef6c0b5e6e681d42dcf33d25d89d7b17","device":"809ae05b6282abad","findings":[],"hash":"e112052d02b05068112d45b41894537b10e48c4ede24272fa5819e63dfa72461","nodeId":"82cf7160-504b-4ddd-99d9-517e6113d86f","outcome":"completed","summary":"launch.json is written and verified, and it is the only file changed in the repository.\n\nThe manifest declares kind `evm_contracts` with one contract, `Imdex5`, and an empty `constructorArgs` list. The accepted source at commit `a578235` is identical to the working tree's `src` tree, and the ABI confirms `constructor()` takes zero inputs and is nonpayable, with no receive or fallback. The notes describe the ERC-20 share named The Imdex 5 with symbol IMDEX5, supply 0 at deployment and no cap, no owner, admin, role, pause or upgrade, the seeded five-coin starting list, the hard-coded chain constants, and the audit 705dd677 fixes. They also record that this launch's audit found one low and three informational findings, none medium or above, all documented without a code change. No token, pool or owner fields appear.\n\nChecks run:\n- `forge build --sizes`: Imdex5 runtime is 23,552 bytes, under the 24,576 limit.\n- `forge test` with the verifier fuzz seed: 177 passed, 0 failed, 7 fork tests skipped without an RPC URL.\n- A scratch empty-chain deploy rehearsal passed: the constructor needs no outside code and yields name The Imdex 5, symbol IMDEX5, 18 decimals, zero supply and five coins.\n- Manifest validation: only `kind`, `contracts` and `notes`; the unique identifier `Imdex5` is within 32 characters; zero constructor arguments; notes 3,383 characters.\n- `git status` shows only `launch.json` modified; `lib/` is ordinary tracked files and there is no submodule.","treeHash":"14b905446e545e4e7cb061c527143f1031646096","usage":{"cachedInputTokens":461952,"inputTokens":77375,"model":"claude-fable-5-1","outputTokens":40644,"runtime":"claude","turns":36,"wallClockMs":444857}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"ddfb1efa72fe9a94","findings":[{"citation":"resolved","description":"swapSelf reads p0 from the pool's slot0 immediately before the swap and `_swap` derives its 1% sqrt-price limit from the same reading. Both guards therefore bound a rebalance swap relative to whatever the price is when `rebalance()` runs, not relative to the price before the caller's own transaction. Anyone can call `rebalance()` once a list is submitted, so the caller can move a list coin's price up (or a leaving coin's price down) in the same block, call `rebalance()`, and the step (4) buy (or step (1)/(3) sell) executes at the moved price, passes PoorFill (valueOut at p0 is ~98% of valueIn) and is booked into `held`/`idleImd`. The loss is bounded: the index trades at most what moves the sqrt price 1% (~1% of the pool's IMD reserve per coin per rebalance), and on mainnet the 1.25% pool fee each way makes the sandwich net-negative for the attacker in every size I computed (e.g. pool 10,000 IMD, pump 2,000 IMD in, index buys 99 IMD: index overpays ~30 IMD, attacker pays ~50 IMD in fees and gains ~30), so it is griefing at a cost, not profitable extraction. It is not among THREAT_MODEL.md's accepted limits and no test moves a pool before a rebalance. Document as an accepted bound; a redesign (TWAP reference) is not warranted.","line":369,"path":"src/Imdex5.sol","reproduction":"Mocks from test/Imdex5Base.sol. alice mintFirst(1000e18); deliver a list that replaces the fifth coin with launch 2000 (NEW_TOKEN, pool 1,000,000 coins / 10,000 IMD). Fair run: bob rebalance() -> held[NEW_TOKEN] = 2,035.6e18 coins for the ~99 IMD the leaver's sale produced. Pumped run from the same snapshot: set NEW_TOKEN's pool to 833,333 coins / 12,000 IMD (price +44%, what a 2,000 IMD buy does), bob rebalance() -> no SwapSkipped, held[NEW_TOKEN] = 1,414.1e18 (30% fewer coins for the same IMD), idleImd left = 4 wei in both runs. Expected: a fill 30% under the pre-manipulation value is refused or bounded by a reference the caller cannot set; actual: booked, because PoorFill compares against the pumped p0. Scratch test used: test/scratch/Sandwich.t.sol (asserts pumpedGot < fairGot; passes on this code).","severity":"low","snippet":"        uint256 p0 = limited ? _sqrtPrice(_key(token, hook)) : 0;","title":"PoorFill and the 2% limit are measured against the spot price the rebalance caller can set first, so a pre-moved pool is bought or sold at the moved price and still booked"},{"citation":"resolved","description":"Step (1) sells a leaving coin with `limited = true`, which stops after a 1% sqrt-price move, i.e. roughly 1% of the pool's coin reserve. A holding larger than that stays as a residual and is retried only at the next weekly rebalance (step (1) again, limited again). Residuals are appended to `_coins` without bound, every `mint` must buy each one exact-out (a residual whose pool rejects the buy blocks mint, as THREAT_MODEL.md accepts), every `redeem` pays each one with PAY_GAS and every `rebalance` spends up to SWAP_GAS on each. With the documented accepted behaviour this is a gas and availability note, not a loss: holders keep the coins. Document the clearance rate so operators expect residuals to be the normal state after a list change, and so the gas growth is known.","line":510,"path":"src/Imdex5.sol","reproduction":"Mocks from test/Imdex5Base.sol. alice mintFirst(1000e18) (each coin ~199 IMD worth, pool 1,000,000 coins / 10,000 IMD); deliver a list replacing the fifth coin; bob rebalance(). Before: held[leaver] = 19,511.7e18. After one rebalance: held[leaver] = 9,607.8e18 (49% still held as a residual at index 5 of coins()). A second rebalance a week later clears about half of what remains, and so on; with a pool ten times deeper relative to the holding it takes proportionally more cycles. Expected per README: 'sells what leaves'; actual: sells ~1% of the pool's reserve per week.","severity":"info","snippet":"            if (!_inList(next, old[i].token) && held[old[i].token] > 0) _coins.push(old[i]);","title":"A limited sell clears only about half of a leaving holding per rebalance, so residuals persist for weeks and every mint, redeem and rebalance loops over them"},{"citation":"resolved","description":"`lastAsk` is set when the request is opened. If the Intake later calls `onOracleFailure`, delivers an answer with `agreed < 4` (ignored, request stays open until `closeRequest` after 2 days), or delivers an answer that `submit` cannot use (a launch not recorded, an attestation that expires before anyone submits), nothing resets `lastAsk`, so the next `ask()` reverts AskTooSoon until seven days after the failed attempt. The 0.5 IMD oracle price is also spent. This matches the stated 'weekly at most' rule and is an availability note only; document it.","line":257,"path":"src/Imdex5.sol","reproduction":"Mocks. alice fund(2e18); bob ask() at T (lastAsk = T, openSince = T, feeImd -= 0.75e18). Intake calls onOracleFailure(openRequest, 1, 'x', 0, 0, '') at T + 1 hour: openSince = 0. bob ask() at T + 1 hour + 1 second: expected (if a failed request were retryable) a new request; actual: revert AskTooSoon, until T + 7 days.","severity":"info","snippet":"        lastAsk = uint64(block.timestamp);","title":"ask() commits the 7-day interval before the request's outcome, so a failed, under-quorum or closed request costs the whole week"},{"citation":"resolved","description":"`ask()` debits `feeImd` by ORACLE_PRICE + REWARD and the Intake pulls ORACLE_PRICE. `onOracleFailure` only closes the request. If the version 2 Intake refunds the asset to the requester on failure (not verifiable here: the Intake is a mainnet contract outside this repository and no fork URL was available), the 0.5 IMD arrives at the contract but is added to neither `feeImd` nor `idleImd`; no function moves unaccounted IMD, so it is stranded and invariant 1 ('nothing is unaccounted') is broken by 0.5 IMD per failed request. README line 259 states the invariant assumes the Intake pulls exactly ORACLE_PRICE; the refund case is not stated. Confirm the Intake's failure path and document the outcome either way; if it refunds, the smallest change is `feeImd += ORACLE_PRICE` in onOracleFailure only when the balance shows the refund.","line":298,"path":"src/Imdex5.sol","reproduction":"Mocks, with the Intake mock extended to transfer 0.5e18 IMD back before calling onOracleFailure: alice fund(2e18); bob ask(); intake refunds 0.5e18 and calls onOracleFailure(openRequest, ...). Then imd.balanceOf(index) == feeImd + idleImd + 0.5e18; no entry point reduces that gap (fund only adds; rewards and the oracle price are paid from feeImd). Expected: every IMD held is in feeImd or idleImd; actual: 0.5 IMD unreachable.","severity":"info","snippet":"        openSince = 0;","title":"IMD the Intake might return on a failed request is unaccounted and cannot leave the contract (could not verify the live Intake)"}],"hash":"f0d67b605f4cdfc1f66e105ba72c91778304a2d6fb27c65d5287cc71b548c099","nodeId":"fef50f55-1ef1-4edb-9703-790bb75a00c5","outcome":"completed","summary":"The findings file is valid, all four snippets match their lines, the scratch directory is removed, and the working tree holds only `.imd-findings.json` (ignored by git status output above, which is empty for tracked files).\n\n## Review result\n\n**No finding of medium or above.** The three source contracts, `Imdex5.sol`, `OracleAttestation.sol` and `Interfaces.sol`, were read in full, along with the mocks, the base test harness and the 705dd677 regression tests. The baseline suite builds and the attack-focused unit file passes under forge 1.8.3. The full non-fork run exceeded a 400-second timeout in the invariant suites, so I did not wait for it. Fork tests could not run, since no fork URL is available here.\n\n**Every item on the must-attack list holds on this code:**\n- A rebalance swap paying nothing or under half its value reverts inside `swapSelf` and is skipped; booking happens only on a returned result.\n- A `redeemToImd` sale paying nothing reverts NothingOut and falls back to in-kind payment.\n- `mint` checks `minShares` against the final `minted` and refuses `minShares > shares` before any buy.\n- A reverted mint takes nothing: the IMD pull and the unlock are in one transaction, and every failure path reverts rather than catching.\n- `held` is credited from measured balance deltas; a short settle leaves a nonzero delta count, which reverts the swap frame. I confirmed from the v4 delta math that a hook cannot make an exact-in swap take more than its input.\n- The residual shortfall is charged at the post-buy price, which a buy can only raise. Moving it down first costs the mover more than the 2% tax bound can return.\n- Redeem pays or records owed; the last holder is paid in full on both paths.\n- The list changes only through a signed, unexpired attestation with `agreed >= 4` whose answer hash the Intake delivered for this contract's open request.\n\n**Reported as low or informational, documented in the file:**\n1. **Low.** PoorFill and the 2% limit are measured against the spot the rebalance caller can move first. A pre-pumped pool was bought at 30% fewer coins per IMD and still booked. Bounded by the limit and, on mainnet, net-negative for the attacker because of the 1.25% fee each way. Nothing in the suite moves a pool before a rebalance.\n2. **Info.** A limited sell clears about half of a leaving holding per rebalance, so residuals persist for weeks and `_coins` grows without bound, with gas growing in every entry point.\n3. **Info.** `lastAsk` is set when a request opens, so a failed or unusable answer costs the whole 7-day interval.\n4. **Info.** If the live Intake refunds the oracle price on failure, that IMD is stranded and unaccounted. The Intake could not be reached to confirm.\n\n**Not reached:** the mainnet PoolManager, both registries, the Intake and the oracle signer contract. Their behaviour is taken from the interfaces and the README's fork-test claims.","treeHash":null,"usage":{"cachedInputTokens":1068883,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":51479,"runtime":"claude","turns":22,"wallClockMs":1239841}}],"verification":[{"checks":[{"durationMs":104100,"exitCode":0,"name":"build","output":"Compiling 69 files with Solc 0.8.26\nSolc 0.8.26 finished in 104.00s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/Imdex5.sol:644:5:\n    |\n644 |     function _amountValue(address token, uint256 amount, uint256 sqrtP, Math.Rounding r)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Fix3.fork.t.sol:76:5:\n   |\n76 |     function _checkBacked(Imdex5.Coin[] memory cs, string memory when) internal {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Fix3Rebalance.fork.t.sol:44:5:\n   |\n44 |     function _backed(string memory when) internal {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":53527,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/Fix3Floor.fork.t.sol:Fix3FloorForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 264.61µs (0.00ns CPU time)\n\nRan 3 tests for test/Fix3.fork.t.sol:Fix3ForkTest\n[SKIP] test_fixed_with_1000_IMD() (gas: 0)\n[SKIP] test_fixed_with_100_IMD() (gas: 0)\n[SKIP] test_fixed_with_10_IMD() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 335.90µs (169.71µs CPU time)\n\nRan 3 tests for test/Fix3Rebalance.fork.t.sol:Fix3RebalanceForkTest\n[SKIP] test_dropTheTaxedCoin_fourRemain() (gas: 0)\n[SKIP] test_reorderSameFive() (gas: 0)\n[SKIP] test_shrinkToThree_bigFund() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 348.66µs (107.34µs CPU time)\n\nRan 2 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_callbackSelectorIsCanonical() (gas: 4542)\n[PASS] test_digestMatchesTheProtocol() (gas: 13361)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 609.08µs (76.84µs CPU time)\n\nRan 3 tests for test/Imdex5RebalanceNothingOut.t.sol:Imdex5RebalanceNothingOutTest\n[PASS] test_aRebalanceBuyThatDeliversNothingIsSkipped() (gas: 3557928)\n[PASS] test_aRebalanceBuyThatPaysDustIsSkippedAndAFairOneTrades() (gas: 5831071)\n[PASS] test_aRebalanceSellThatPaysNothingIsSkipped() (gas: 3079117)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 16.83ms (14.46ms CPU time)\n\nRan 48 tests for test/Imdex5.t.sol:Imdex5Test\n[PASS] testFuzz_mintThenRedeemNeverPaysMoreThanDeposited(uint256,uint256) (runs: 256, μ: 2439277, ~: 2421615)\nLogs:\n  Bound result 4999000000000000041871\n  Bound result 1469700996642154189164\n\n[PASS] test_askPaysIntakeAndCaller() (gas: 1138091)\n[PASS] test_askReturnsWithoutFees() (gas: 155267)\n[PASS] test_askSevenDayInterval() (gas: 1190059)\n[PASS] test_bodyIsTheJsonTheBriefDescribes() (gas: 30576)\n[PASS] test_closeRequestAfterTwoDays() (gas: 1027427)\n[PASS] test_deployment() (gas: 94874)\n[PASS] test_feeImdOnlyLeavesForOracleAndRewards() (gas: 4967725)\n[PASS] test_fundAddsToFeeImd() (gas: 147803)\n[PASS] test_hookCannotReenter() (gas: 5175609)\n[PASS] test_mintBuysProportionallyAndRefunds() (gas: 1833087)\n[PASS] test_mintFirstBuysEqualPartsAndTakesFee() (gas: 1105437)\n[PASS] test_mintFirstKeepsWhatAPoolCouldNotTakeAsIdle() (gas: 1330484)\n[PASS] test_mintFirstRequiresZeroSupplyAndRightLength() (gas: 1023353)\n[PASS] test_mintFirstRevertsOnMinOut() (gas: 728115)\n[PASS] test_mintFirstRevertsWhenABuyFails() (gas: 815588)\n[PASS] test_mintFirstRevertsWhenABuyReturnsNothing() (gas: 2116051)\n[PASS] test_mintNeverIssuesSharesForNothing() (gas: 328111)\n[PASS] test_mintRequiresSupply() (gas: 40065)\n[PASS] test_mintRevertsOverMaxImdIn() (gas: 1735646)\n[PASS] test_mintRevertsWhenABuyFailsButScalesANonzeroShortFill() (gas: 2279081)\n[PASS] test_mintRoundsAgainstTheMinter() (gas: 1714378)\n[PASS] test_onOracleFailureOnlyFromIntake() (gas: 1065204)\n[PASS] test_onOracleResultStoresOnlyTheOpenRequestFromTheIntake() (gas: 1303085)\n[PASS] test_rebalanceNeedsAList() (gas: 41343)\n[PASS] test_rebalanceSellsAdoptsAndBuys() (gas: 5320154)\n[PASS] test_rebalanceSkipsADeadPool() (gas: 2992072)\n[PASS] test_rebalanceSkipsAHookThatLeavesAnUnsettledDelta() (gas: 3909146)\n[PASS] test_rebalanceSurvivesAHookThatBurnsAllGas() (gas: 5526604)\n[PASS] test_rebalanceTrimsAHoldingOverAQuarter() (gas: 3486749)\n[PASS] test_rebalanceWithNothingHeld() (gas: 2267403)\n[PASS] test_redeemCannotBeBlockedByACoin() (gas: 1581524)\n[PASS] test_redeemLastSharesPaysEverything() (gas: 2150587)\n[PASS] test_redeemPaysInKindLessHalfPercent() (gas: 1353150)\n[PASS] test_redeemRejectsZeroAndTooMany() (gas: 987406)\n[PASS] test_redeemSurvivesCoinsThatBurnAllGas() (gas: 4354830)\n[PASS] test_redeemToImdChargesTheFeeWhileOthersHold() (gas: 1676317)\n[PASS] test_redeemToImdPaysAShortFillInKindLessHalfPercent() (gas: 1789016)\n[PASS] test_redeemToImdPaysInKindWhenASaleFails() (gas: 2989586)\n[PASS] test_redeemToImdRevertsBelowMinOut() (gas: 1788250)\n[PASS] test_redeemToImdSellsAndTheLastHolderPaysNoFee() (gas: 1759494)\n[PASS] test_redeemToImdSurvivesAHookThatBurnsGas() (gas: 2467168)\n[PASS] test_submitRejectsASignedAttestationWithoutQuorum() (gas: 1128965)\n[PASS] test_submitRejectsAnExpiredAttestation() (gas: 1089679)\n[PASS] test_submitRejectsBadLists() (gas: 4719084)\n[PASS] test_submitRejectsWrongAnswerAndForgedSignature() (gas: 1646440)\n[PASS] test_submitStoresTheNextListAndRewards() (gas: 1527456)\n[PASS] test_unlockCallbackAndSwapSelfAreNotCallable() (gas: 103502)\nSuite result: ok. 48 passed; 0 failed; 0 skipped; finished in 397.68ms (440.46ms CPU time)\n\nRan 8 tests for test/Imdex5Payments.t.sol:Imdex5PaymentsTest\n[PASS] test_aShortSaleIsPaidInKindAfterTheUnlockAndInImdForTheRest() (gas: 1811675)\n[PASS] test_everyFailureModeIsOwedOnceAndNothingMoves(uint8) (runs: 256, μ: 1642615, ~: 1585547)\nLogs:\n  Bound result 4\n\n[PASS] test_inKindPaymentsMatchTheRedeemRule(uint256,uint256) (runs: 256, μ: 1770840, ~: 1747647)\nLogs:\n  Bound result 41870\n  Bound result 24\n\n[PASS] test_paySelfRefusesEveryoneButTheIndex() (gas: 955891)\n[PASS] test_redeemOfACoinThatMovesFundsAndReturnsFalsePaysOnce() (gas: 1589415)\n[PASS] test_redeemStillWorksWithTheTouchingCoinHeld() (gas: 1809516)\n[PASS] test_redeemToImdInKindOfACoinThatMovesFundsAndReturnsFalsePaysOnce() (gas: 1996642)\n[PASS] test_redeemToImdPaysAnUnsellableCoinInKindAfterTheUnlock() (gas: 3931668)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 454.08ms (436.85ms CPU time)\n\nRan 8 tests for test/Imdex5DocumentedLimits.t.sol:Imdex5DocumentedLimitsTest\n[PASS] test_aClosedRequestCostsTheWholeWeek() (gas: 1161934)\n[PASS] test_aDeadListCoinIsNotDroppedByARebalanceAndBlocksMintUntilItsPoolWorks() (gas: 6626330)\n[PASS] test_aFailedRequestCostsTheWholeWeek() (gas: 1239868)\n[PASS] test_aFailedRequestLeavesEveryImdAccounted() (gas: 3597193)\n[PASS] test_aLeaverDumpedBeforeARebalanceIsSoldAtTheDumpedPriceAndBooked() (gas: 5366763)\n[PASS] test_aLimitedSaleSellsAboutOnePercentOfTheReservePerRebalance() (gas: 5830453)\n[PASS] test_aListOfFewerThanFourCoinsLeavesTheRestIdle() (gas: 3877093)\n[PASS] test_aPoolMovedBeforeARebalanceIsBoughtAtTheMovedPriceAndBooked() (gas: 4775509)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 459.20ms (28.61ms CPU time)\n\nRan 21 tests for test/Imdex5MustAttack.t.sol:Imdex5MustAttackTest\n[PASS] testFuzz_dustMintsRoundAgainstTheMinter(uint256) (runs: 200, μ: 1916982, ~: 1917130)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_heldTracksBalanceThroughEveryPath(uint16,uint256) (runs: 64, μ: 7885887, ~: 7898376)\nLogs:\n  Bound result 15\n  Bound result 255959118\n\n[PASS] testFuzz_mintKeepsOnlyWhatItSpends(uint256,uint256) (runs: 200, μ: 2886349, ~: 2886400)\nLogs:\n  Bound result 1736447536937430820392\n  Bound result 879575096729760215450\n\n[PASS] testFuzz_mintNeverDilutesPerShare(uint256,uint256,uint256) (runs: 300, μ: 2992516, ~: 3002751)\nLogs:\n  Bound result 1\n  Bound result 29943871\n  Bound result 6234427\n\n[PASS] testFuzz_mintNeverIssuesBelowTheFloor(uint256,uint256,uint256,uint256) (runs: 300, μ: 2168781, ~: 2215211)\nLogs:\n  Bound result 0\n  Bound result 23213\n  Bound result 845000000000000000000\n  Bound result 1913\n\n[PASS] testFuzz_redeemAlwaysPaysProRata(uint256,bool) (runs: 200, μ: 3371050, ~: 3194234)\nLogs:\n  Bound result 3791\n\n[PASS] testFuzz_residualDumpedThenBoughtInFullDilutesNobodyInCoins(uint256,uint256) (runs: 100, μ: 4767800, ~: 4767884)\nLogs:\n  Bound result 228\n  Bound result 65745656028961577779\n\n[PASS] testFuzz_residualShortFillAtUndisturbedPriceDilutesNobody(uint16,uint256) (runs: 100, μ: 5243626, ~: 5243571)\nLogs:\n  Bound result 2588\n  Bound result 205614647028961577779\n\n[PASS] testFuzz_underQuorumDeliveryIsIgnored(uint16) (runs: 50, μ: 1081658, ~: 1081725)\nLogs:\n  Bound result 2\n\n[PASS] test_answerOtherThanDeliveredIsRefused() (gas: 1126306)\n[PASS] test_callbackFromAnyoneElseIsIgnored() (gas: 1062805)\n[PASS] test_expiredAnswerNeverChangesTheList() (gas: 1456084)\n[PASS] test_floorAboveRequestAlwaysReverts() (gas: 1228176)\n[PASS] test_floorBoundaryIsExact() (gas: 3493331)\n[PASS] test_futureIssuedAnswerIsRefused() (gas: 1093361)\n[PASS] test_owedCoinsAreTheOnlyGapBetweenHeldAndBalance() (gas: 1746449)\n[PASS] test_redeemPaysWhenEveryCoinAndPoolMisbehaves() (gas: 4090794)\n[PASS] test_residualShortFillDoesNotCutSharesBelowFloor() (gas: 4839475)\n[PASS] test_revertedMintsTakeNothing_everyPath() (gas: 9280692)\n[PASS] test_underQuorumSignedAnswerNeverChangesTheList() (gas: 1092421)\n[PASS] test_wrongSignerAndReplayAreRefused() (gas: 1491962)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 459.22ms (2.40s CPU time)\n\nRan 9 tests for test/Imdex5ShortFill.t.sol:Imdex5ShortFillTest\n[PASS] testFuzz_mintUsesTheLeastFilledCoinAndChargesEveryBuy(uint256,uint16[5]) (runs: 256, μ: 1634776, ~: 1643440)\nLogs:\n  Bound result 499000370204935467971\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 4510\n  Bound result 312\n\n[PASS] test_fullFillPassesFloor() (gas: 743937)\n[PASS] test_mintRevertsAndRollsBackEarlierBuysWhenACoinDeliversZero() (gas: 1288533)\n[PASS] test_mintRevertsWhenANonzeroFillRoundsSharesToZero() (gas: 1198010)\n[PASS] test_shortFillChargesIdleImdForTheSharesIssuedOnly() (gas: 2607317)\n[PASS] test_shortFillMintsTheDeliveredFraction() (gas: 869879)\n[PASS] test_shortFillStillEnforcesMaxImdInAndRollsBack() (gas: 1742002)\n[PASS] test_sliverFillBelowFloorRevertsAndRollsBack() (gas: 1194221)\n[PASS] test_sliverFillWithoutFloorIssuesASliver() (gas: 1288456)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 464.44ms (470.23ms CPU time)\n\nRan 27 tests for test/Imdex5Revised.t.sol:Imdex5RevisedTest\n[PASS] testFuzz_mintFirstKeepsAPartialFillIdle(uint256,uint256) (runs: 256, μ: 1105064, ~: 1105080)\nLogs:\n  Bound result 41870\n  Bound result 3124\n\n[PASS] testFuzz_redeemToImdPaysADeadCoinExactlyAsRedeemDoes(uint256) (runs: 256, μ: 2016453, ~: 2008784)\nLogs:\n  Bound result 36094350109516419251\n\n[PASS] testFuzz_redeemToImdPaysAShortFillInKindUnderTheRedeemRule(uint256,uint256) (runs: 256, μ: 1837305, ~: 1837618)\nLogs:\n  Bound result 994000000000000041870\n  Bound result 19260430990447016672714\n\n[PASS] test_aCoinThatBurnsItsGasIsOwedAndTheIdleImdStillPaid() (gas: 1631385)\n[PASS] test_askAndCloseAtTheirExactBoundaries() (gas: 1205911)\n[PASS] test_askIsBlockedWhileAListAwaitsRebalance() (gas: 3314147)\n[PASS] test_claimThatFailsKeepsTheDebt() (gas: 1302771)\n[PASS] test_hookCannotCallSwapSelfOrTheOracleCallbacks() (gas: 3507060)\n[PASS] test_hookCannotCloseOrAnswerTheOpenRequestDuringASwap() (gas: 4136780)\n[PASS] test_lastRedeemerToImdTakesAllOfADeadCoin() (gas: 1758698)\n[PASS] test_margUsesItsOwnHookAndTheOthersShareG() (gas: 48938)\n[PASS] test_mintFirstPartialFillIsRedeemedProRataNotTwice() (gas: 1669924)\n[PASS] test_mintFirstRefusesAPoolThatReturnsNothingOnALargeAmount() (gas: 745257)\n[PASS] test_mintFirstRefusesDustThatBuysNothing() (gas: 2166229)\n[PASS] test_mintFirstRevertsWholeWhenTheHookMisbehaves() (gas: 992464212)\n[PASS] test_mintRevertsWholeWhenTheHookBurnsGasForTheIndex() (gas: 993093705)\n[PASS] test_mintRevertsWholeWhenTheHookLeavesADeltaUnsettled() (gas: 1346547)\n[PASS] test_mintSkipsAListCoinHeldAtZeroAndTheNextRebalanceBuysIt() (gas: 5590055)\n[PASS] test_onOracleResultNeedsExactlyFourAgreed() (gas: 1159398)\n[PASS] test_owedAccumulatesAcrossRedeemsAndIsPaidOnce() (gas: 2212746)\n[PASS] test_rebalanceSkipsEveryBurningSwapAndStillAdoptsTheList() (gas: 3730546)\n[PASS] test_redeemSurvivesFiveGasBurningCoinsWithOrdinaryGas() (gas: 5789971)\n[PASS] test_redeemToImdPaysInKindWhenTheHookLeavesADeltaUnsettled() (gas: 2244486)\n[PASS] test_redeemToImdPaysInKindWhenTheSaleWouldPayNothing() (gas: 1834334)\n[PASS] test_submitRejectsALaunchWithoutAHookOrAToken() (gas: 1854053)\n[PASS] test_submitTakesAnAttestationOnce() (gas: 1462114)\n[PASS] test_submitUsesTheRegistryArtifactsNotTheStartingList() (gas: 1560763)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 491.97ms (867.58ms CPU time)\n\nRan 7 tests for test/Imdex5TaxedCoin.t.sol:Imdex5TaxedCoinTest\n[PASS] testFuzz_taxedCoinLifecycle(uint256,uint256,uint256) (runs: 256, μ: 7884936, ~: 7891222)\nLogs:\n  Bound result 499000000000000020330\n  Bound result 499000000000000021258\n  Bound result 899000000000000003350\n\n[PASS] test_firstMintCreditsOnlyWhatArrives() (gas: 1254324)\n[PASS] test_firstMintMinOutChecksTheNetReceipt() (gas: 1360017)\n[PASS] test_lastHolderCanReceiveEveryCoinAfterAnImdExit() (gas: 2650034)\n[PASS] test_outstandingOwedIsNotCountedAsANewReceiptAndRemainsClaimable() (gas: 5203128)\n[PASS] test_taxedCoinFullLifecycle() (gas: 7880256)\n[PASS] test_taxedRebalanceBuyCreditsOnlyNewReceipts() (gas: 5610140)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 491.80ms (505.05ms CPU time)\n\nRan 6 tests for test/Imdex5ResidualSpot.t.sol:Imdex5ResidualSpotTest\n[PASS] testFuzz_aDeadResidualFailsTheMintAtAnyPrice(uint256,uint256) (runs: 256, μ: 4336377, ~: 4336350)\nLogs:\n  Bound result 1000000\n  Bound result 10990\n\n[PASS] testFuzz_aDumpedResidualThatTradesIsBoughtInFull(uint256,uint256) (runs: 256, μ: 4331752, ~: 4331834)\nLogs:\n  Bound result 870\n  Bound result 961686996960945898538\n\n[PASS] test_aDumpedResidualWhoseBuyRevertsCannotBeMintedAtSpot() (gas: 4727855)\n[PASS] test_aResidualHookThatBurnsGasFailsTheMint() (gas: 5765103)\n[PASS] test_aResidualHookThatLeavesADeltaFailsTheMint() (gas: 4189311)\n[PASS] test_aResidualShortFillIsChargedAtLeastItsFairValue() (gas: 4167201)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 547.09ms (650.83ms CPU time)\n\nRan 9 tests for test/Imdex5TaxEverywhere.t.sol:Imdex5TaxEverywhereTest\n[PASS] testFuzz_everyCoinTaxedLifecycle(uint16[5],uint256,uint256,uint256) (runs: 200, μ: 9154396, ~: 9161501)\nLogs:\n  Bound result 522\n  Bound result 4\n  Bound result 0\n  Bound result 1650\n  Bound result 5\n  Bound result 1000000000000000001\n  Bound result 145307749937601156090\n  Bound result 351550328808361567419\n\n[PASS] testFuzz_theMostTaxedCoinDecidesTheMint(uint8,uint16,uint16,uint256) (runs: 200, μ: 2682310, ~: 2710403)\nLogs:\n  Bound result 4\n  Bound result 88\n  Bound result 23\n  Bound result 499000000000000000168\n\n[PASS] test_aCoinTaxingItsOwnSettlementIsNeverSoldAndIsPaidInKind() (gas: 6654013)\n[PASS] test_aCoinTaxingItsOwnSettlementStaysAResidualThroughARebalance() (gas: 7228940)\n[PASS] test_aCoinThatKeepsEverythingFailsALaterMintWholeAndRedeemsStillPay() (gas: 6656942)\n[PASS] test_aCoinThatKeepsEverythingFailsTheFirstMintWhole() (gas: 1465665)\n[PASS] test_aCoinThatKeepsEverythingFailsTheOneWeiMint() (gas: 3419980)\n[PASS] test_aDonationNeitherChangesHeldNorInflatesAMintOrARedeem() (gas: 2485957)\n[PASS] test_taxOnTopOfAPartialFillCreditsTheNetAndMintsThatFraction() (gas: 5248115)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 546.96ms (723.46ms CPU time)\n\nRan 35 tests for test/Imdex5Edges.t.sol:Imdex5EdgesTest\n[PASS] testFuzz_mintBuysExactlyTheRoundedUpShare(uint256) (runs: 512, μ: 1921120, ~: 1920943)\nLogs:\n  Bound result 142331555720891817868\n\n[PASS] testFuzz_mintFirstMintsExactlyTheRest(uint256) (runs: 512, μ: 1009061, ~: 1012937)\nLogs:\n  Bound result 795000000000000000000\n\n[PASS] testFuzz_onOracleResultForAnotherRequestIsIgnored(bytes32,uint16) (runs: 256, μ: 1028841, ~: 1028926)\n[PASS] testFuzz_onOracleResultFromAStrangerChangesNothing(address,bytes32,uint16) (runs: 256, μ: 1075788, ~: 1075934)\n[PASS] testFuzz_redeemNeverPaysAboveProRata(uint256,uint256) (runs: 512, μ: 1563809, ~: 1564057)\nLogs:\n  Bound result 537116319407267999905\n  Bound result 129627388551853696245\n\n[PASS] testFuzz_splittingARedeemStaysUnderProRata(uint256,uint256) (runs: 256, μ: 1763443, ~: 1763697)\nLogs:\n  Bound result 41870\n  Bound result 590500998564422435044\n\n[PASS] test_aLaterAskReplacesAnUnsubmittedAnswer() (gas: 1888261)\n[PASS] test_aReenteringCoinCannotReenterAndIsNotPaidTwice() (gas: 2678873)\n[PASS] test_aReenteringCoinCannotReenterMintOrRebalanceFromRedeem() (gas: 3875928)\n[PASS] test_aThinResidualPoolDoesNotStarveAFlooredMint() (gas: 3601998)\n[PASS] test_anUnsubmittedAnswerDoesNotSurviveAFailedLaterAsk() (gas: 1356986)\n[PASS] test_askRevertsWholeWhenTheIntakeRefuses() (gas: 334316)\n[PASS] test_askThresholdIsExactlyThreeQuartersOfAnImd() (gas: 1102053)\n[PASS] test_closeRequestNeedsAnOpenOne() (gas: 1003962)\n[PASS] test_closingARequestDoesNotResetTheInterval() (gas: 1162249)\n[PASS] test_mintCannotBeFreeWhenTheIndexHoldsValue() (gas: 1770169)\n[PASS] test_onOracleResultAfterCloseIsIgnored() (gas: 1098982)\n[PASS] test_onOracleResultWithFiveEntriesFitsTheStipend() (gas: 1144218)\n[PASS] test_oneGasBurningCoinDoesNotBlockRedeemGivenGas() (gas: 1664334)\n[PASS] test_rebalanceBuyMovesAPoolAtMostTwoPercent() (gas: 3712366)\n[PASS] test_rebalanceBuyStopsAtAQuarterWeight() (gas: 4043569)\n[PASS] test_rebalanceDoesNotTrimWithFewerThanFourCoins() (gas: 3278151)\n[PASS] test_rebalanceSellMovesAPoolAtMostTwoPercent() (gas: 3311615)\n[PASS] test_rebalanceTrimsToAQuarterNotBelow() (gas: 3800659)\n[PASS] test_redeemHalfPercentStaysWithRemainingHolders() (gas: 1564922)\n[PASS] test_redeemIdleImdThatCannotBeSentIsOwed() (gas: 1399648)\n[PASS] test_redeemToATokenWithoutCodeBecomesOwedAndClaimableLater() (gas: 1271159)\n[PASS] test_residualsAreRedeemedAndADeadOneBlocksMintWithoutTakingImd() (gas: 5310656)\n[PASS] test_rewardsNeverDipIntoIdleImd() (gas: 2725576)\n[PASS] test_sharesTransferLikeAnyErc20AndMoveNoHoldings() (gas: 1468821)\n[PASS] test_submitAndRebalancePayNoRewardWithoutFees() (gas: 3268731)\n[PASS] test_submitRejectsATamperedAnswerEvenWithAValidSignatureElsewhere() (gas: 1142814)\n[PASS] test_submitRejectsAnAttestationSignedForAnotherChain() (gas: 1444728)\n[PASS] test_submitRejectsAnAttestationSignedForAnotherConsumer() (gas: 1110033)\n[PASS] test_submitRejectsMalformedAnswerBytes() (gas: 1348345)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 547.19ms (2.45s CPU time)\n\nRan 1 test for test/Imdex5TaxEverywhere.t.sol:Imdex5AllCoinsTaxedInvariantTest\n[PASS]\nImdex5AllCoinsTaxedInvariantTest invariants:\n[PASS] invariant_taxed_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_taxed_coinBalancesAreHeldPlusOwed\n[PASS] invariant_taxed_everyHoldingIsListed\n[PASS] invariant_taxed_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_taxed_zeroSupplyMeansNothingHeld\n Imdex5AllCoinsTaxedInvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 209   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 245   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 212   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 432   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 222   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 244   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 205   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 225   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 203   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 205   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 218   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 199   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 194   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 233   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 179   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| TaxKnobs      | setTax           | 209   | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 23574\n  Bound result 39596972668088003129\n  Bound result 159708578027544712484\n  Bound result 1435743504598885\n  Bound result 4046341548624796396\n  Bound result 37241578766611975504\n  Bound result 561081\n  Bound result 1181523227569837\n  Bound result 2882\n  Bound result 4838\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.24s (1.24s CPU time)\n\nRan 1 test for test/Imdex5.invariant.t.sol:Imdex5InvariantTest\n[PASS]\nImdex5InvariantTest invariants:\n[PASS] invariant_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_coinBalancesAreHeldPlusOwed\n[PASS] invariant_feeImdLeavesOnlyForTheOracleAndRewards\n[PASS] invariant_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_listShape\n[PASS] invariant_noFreeMintWhileValueIsHeld\n[PASS] invariant_requestStateIsConsistent\n[PASS] invariant_zeroSupplyMeansNothingHeld\n Imdex5InvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 195   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 207   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | closeRequest     | 200   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverFailure   | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 189   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 196   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 368   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 201   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 196   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 217   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 243   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 195   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 207   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 217   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 186   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 191   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 220   | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000\n  Bound result 250000000000000000\n  Bound result 100\n  Bound result 95077525804709816\n  Bound result 130108602367599074406\n  Bound result 8\n  Bound result 21205\n  Bound result 19784\n  Bound result 48695705407054151679\n  Bound result 691198\n  Bound result 52\n  Bound result 14842461967901804\n  Bound result 128\n  Bound result 5000000000000000000000\n  Bound result 3798186580743\n  Bound result 7203576932671098327118\n  Bound result 2989\n  Bound result 19\n  Bound result 14534\n  Bound result 76800\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.66s (1.65s CPU time)\n\nRan 1 test for test/Imdex5Floor.invariant.t.sol:Imdex5FloorInvariantTest\n[PASS]\nImdex5FloorInvariantTest invariants:\n[PASS] invariant_heldIsTheRealBalance\n[PASS] invariant_mintNeverDilutesListCoinsOrIdle\n[PASS] invariant_noMintBelowTheFloor\n[PASS] invariant_noSharesMeansNothingHeld\n[PASS] invariant_redeemAlwaysPays\n[PASS] invariant_revertedMintMovesNothing\n Imdex5FloorInvariantTest invariants (runs: 128, calls: 5120, reverts: 485)\n\n╭--------------------+-------------+-------+---------+----------╮\n| Contract           | Selector    | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5FloorHandler | claim       | 476   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | mint        | 1355  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | mintFirst   | 471   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | movePrice   | 488   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | rebalanceTo | 485   | 485     | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | redeem      | 461   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | redeemToImd | 452   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | setMaxIn    | 486   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | setTax      | 446   | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 17988\n  Bound result 8000000\n  Bound result 14\n  Bound result 23194\n  Bound result 10000000000000000000\n  Bound result 250000000000000000000\n  Bound result 18\n  Bound result 18274\n  Bound result 795000000000000000000\n  Bound result 10700\n  Bound result 10481\n  Bound result 21000000000000000\n  Bound result 7723\n  Bound result 1250000000000000000\n  Bound result 21295\n  Bound result 3600\n  Bound result 302\n  Bound result 935410\n  Bound result 128309\n  Bound result 737\n  Bound result 668914790000187751563860\n  Bound result 143\n  Bound result 3700\n  Bound result 41593\n  Bound result 11697\n  Bound result 131\n  Bound result 1657574480\n  Bound result 12345\n  Bound result 171743644\n  Bound result 97\n  Bound result 999906\n  Bound result 56504\n  Bound result 19681\n  Bound result 9811\n  Bound result 808\n  Bound result 86400\n  Bound result 18376\n  Bound result 14593\n  Bound result 3703\n  Bound result 1000\n  Bound result 776161\n  Bound result 9\n  Bound result 1961489024083263169695\n  Bound result 9\n  Bound result 385109759167368303030\n  Bound result 7935\n  Bound result 4294967295\n  Bound result 5103\n  Bound result 5460\n  Bound result 3751\n  Bound result 1325303303857141750390\n  Bound result 628057317341387608512442\n  Bound result 385\n  Bound result 395037\n  Bound result 2591\n  Bound result 750000000000000000\n  Bound result 4244\n  Bound result 104659385212754494\n  Bound result 5475\n  Bound result 352710984976227550984\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.34s (2.33s CPU time)\n\nRan 1 test for test/Imdex5.invariant.t.sol:Imdex5TaxedCoinInvariantTest\n[PASS]\nImdex5TaxedCoinInvariantTest invariants:\n[PASS] invariant_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_coinBalancesAreHeldPlusOwed\n[PASS] invariant_feeImdLeavesOnlyForTheOracleAndRewards\n[PASS] invariant_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_listShape\n[PASS] invariant_noFreeMintWhileValueIsHeld\n[PASS] invariant_requestStateIsConsistent\n[PASS] invariant_zeroSupplyMeansNothingHeld\n Imdex5TaxedCoinInvariantTest invariants (runs: 256, calls: 128000, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 6636  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 6695  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | closeRequest     | 6752  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverFailure   | 6801  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 6714  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 6680  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 13445 | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 6752  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 6685  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 6897  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 6601  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 6664  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 6713  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 6671  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 6830  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 6860  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 6729  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 6875  | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5000\n  Bound result 10000\n  Bound result 796000000000000000000\n  Bound result 1\n  Bound result 5\n  Bound result 2500\n  Bound result 14986\n  Bound result 900\n  Bound result 4442\n  Bound result 259200\n  Bound result 9363\n  Bound result 10100\n  Bound result 97\n  Bound result 100000000000000000007\n  Bound result 278400\n  Bound result 7694\n  Bound result 498\n  Bound result 19\n  Bound result 200\n  Bound result 995\n  Bound result 10205\n  Bound result 2253\n  Bound result 2375006463929377708838\n  Bound result 7092\n  Bound result 5173\n  Bound result 16297\n  Bound result 1000000\n  Bound result 13731\n  Bound result 17\n  Bound result 5000000000000000000\n  Bound result 48502129467053274668\n  Bound result 14789\n  Bound result 409601\n  Bound result 8373\n  Bound result 1250000000000000000\n  Bound result 1\n  Bound result 52\n  Bound result 21303\n  Bound result 19005\n  Bound result 11934\n  Bound result 50000000000000000000\n  Bound result 19529035837012967424\n  Bound result 1\n  Bound result 21440\n  Bound result 244124153722729520859\n  Bound result 15\n  Bound result 8000000\n  Bound result 400\n  Bound result 16256747033301207744\n  Bound result 4295128739\n  Bound result 1250000000000000000\n  Bound result 116\n  Bound result 752236290749736908835\n  Bound result 4197\n  Bound result 3947352266\n  Bound result 1407547839\n  Bound result 18267\n  Bound result 227787\n  Bound result 14909361\n  Bound result 1584039999992075417870\n  Bound result 3651225853206024640256\n  Bound result 18432581510183677324\n  Bound result 6060183457451234540\n  Bound result 40\n  Bound result 192161677547341\n  Bound result 179200\n  Bound result 383229\n  Bound result 3000\n  Bound result 1600674703329883424600\n  Bound result 22097\n  Bound result 842404886189632279074\n  Bound result 1561568134220081\n  Bound result 1835002550\n  Bound result 3914\n  Bound result 995000000000000000000\n  Bound result 543524713\n  Bound result 3\n  Bound result 19770\n  Bound result 835154038208087377692\n  Bound result 12\n  Bound result 10001\n  Bound result 9000000000000000000000\n  Bound result 95569915997759\n  Bound result 3640233672442416055654\n  Bound result 14453\n  Bound result 244683692235269982909\n  Bound result 995\n  Bound result 300000000000000000000\n  Bound result 3998064850896419180\n  Bound result 4243\n  Bound result 9999\n  Bound result 1000000\n  Bound result 10066\n  Bound result 17740\n  Bound result 1464\n  Bound result 3024\n  Bound result 46789382\n  Bound result 1277357496780828113775\n  Bound result 300000\n  Bound result 4680\n  Bound result 7903\n  Bound result 37000000000000000000\n  Bound result 663\n  Bound result 409600\n  Bound result 701\n  Bound result 691200\n  Bound result 1175\n  Bound result 6638920480343422698825\n  Bound result 606466993197716298426\n  Bound result 7723537686814318915\n  Bound result 9\n  Bound result 845000000000000000000\n  Bound result 648\n  Bound result 12500\n  Bound result 6706918671917263329036\n  Bound result 117\n  Bound result 105\n  Bound result 20305\n  Bound result 4969\n  Bound result 48\n  Bound result 15384\n  Bound result 3914\n  Bound result 1269580902088475\n  Bound result 1892\n  Bound result 90000000000000000000\n  Bound result 1009740783342623579853\n  Bound result 59432570749\n  Bound result 3409\n  Bound result 665599\n  Bound result 189000000000000000000\n  Bound result 467983\n  Bound result 35565581044098666410\n  Bound result 18\n  Bound result 16\n  Bound result 9900\n  Bound result 435200\n  Bound result 8470\n  Bound result 64555113031370214551\n  Bound result 372304\n  Bound result 3914\n  Bound result 850\n  Bound result 29972353795135207118\n  Bound result 126\n  Bound result 22184\n  Bound result 3988822378723970342\n  Bound result 2838\n  Bound result 396\n  Bound result 3551\n  Bound result 2099001389632691726440\n  Bound result 719098455508\n  Bound result 8\n  Bound result 56105859838815273451\n  Bound result 390607565778990750519\n  Bound result 1089\n  Bound result 10205\n  Bound result 13016\n  Bound result 628300582653018868317\n  Bound result 404098525\n  Bound result 401500446371068597093\n  Bound result 20072\n  Bound result 19617\n  Bound result 12563\n  Bound result 242491800579533448577\n  Bound result 232291430357359863756\n  Bound result 24\n  Bound result 387049075431225224503\n  Bound result 4103680023\n  Bound result 512669\n  Bound result 24576\n  Bound result 13483\n  Bound result 20189\n  Bound result 13813\n  Bound result 5\n  Bound result 10141\n  Bound result 48\n  Bound result 38729993491980444079\n  Bound result 2075\n  Bound result 37000000000000000000\n  Bound result 9302\n  Bound result 4215\n  Bound result 45005851881584441735\n  Bound result 14603\n  Bound result 227911189\n  Bound result 1464\n  Bound result 6508073461624214398\n  Bound result 18\n  Bound result 3349\n  Bound result 3000000\n  Bound result 24\n  Bound result 179200\n  Bound result 298500000000000000000\n  Bound result 7334152250576480803051\n  Bound result 16449\n  Bound result 2\n  Bound result 4279821500179731564388\n  Bound result 28\n  Bound result 16384\n  Bound result 14555\n  Bound result 15306\n  Bound result 98000000000000000000\n  Bound result 305629815860574079455\n  Bound result 5371898599104954036841\n  Bound result 13871\n  Bound result 200000\n  Bound result 19680\n  Bound result 18704\n  Bound result 23232\n  Bound result 49748743718592964825\n  Bound result 150\n  Bound result 3912\n  Bound result 8620267240960944027\n  Bound result 23076\n  Bound result 10868998138528\n  Bound result 8966\n  Bound result 500\n  Bound result 2617\n  Bound result 371636862\n  Bound result 50000000000000000000\n  Bound result 17489\n  Bound result 14710155217814443019\n  Bound result 11\n  Bound result 10685\n  Bound result 112404\n  Bound result 153136435505138746713\n  Bound result 9397\n  Bound result 13442\n  Bound result 1915\n  Bound result 614400\n  Bound result 166610407825966\n  Bound result 8874128406286795470271\n  Bound result 2000000000000000000\n  Bound result 1000000\n  Bound result 25991565099094819854\n  Bound result 457458273476601995153\n  Bound result 10\n  Bound result 371636862\n  Bound result 4441901832873497227\n  Bound result 43970082674719530902\n  Bound result 1669\n  Bound result 7\n  Bound result 900\n  Bound result 3421199997214612311\n  Bound result 3340458043\n  Bound result 29450080379481609596\n  Bound result 53050117879788799269\n  Bound result 40\n  Bound result 33236839714825751583\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 53.42s (53.42s CPU time)\n\nRan 19 test suites in 53.43s (63.54s CPU time): 187 tests passed, 0 failed, 7 skipped (194 total tests)\n","passed":true},{"durationMs":68,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Imdex5.approve(address,uint256)\",\"Imdex5.ask()\",\"Imdex5.claim(address)\",\"Imdex5.closeRequest()\",\"Imdex5.fund(uint256)\",\"Imdex5.mint(uint256,uint256,uint256)\",\"Imdex5.mintFirst(uint256,uint256[])\",\"Imdex5.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Imdex5.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Imdex5.paySelf(address,address,uint256)\",\"Imdex5.rebalance()\",\"Imdex5.redeem(uint256)\",\"Imdex5.redeemToImd(uint256,uint256)\",\"Imdex5.submit((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Imdex5.swapSelf(address,address,bool,uint256,bool,bool)\",\"Imdex5.transfer(address,uint256)\",\"Imdex5.transferFrom(address,address,uint256)\",\"Imdex5.unlockCallback(bytes)\"],\"files\":{\".gitignore\":2,\"ADAPTATION.md\":436,\"README.md\":404,\"THREAT_MODEL.md\":52,\"foundry.toml\":19,\"launch.json\":10,\"src/Imdex5.sol\":703,\"src/Interfaces.sol\":61,\"src/OracleAttestation.sol\":221,\"test/Fix3.fork.t.sol\":97,\"test/Fix3Floor.fork.t.sol\":67,\"test/Fix3Rebalance.fork.t.sol\":151,\"test/Imdex5.invariant.t.sol\":544,\"test/Imdex5.t.sol\":1070,\"test/Imdex5Base.sol\":175,\"test/Imdex5DocumentedLimits.t.sol\":313,\"test/Imdex5Edges.t.sol\":741,\"test/Imdex5Floor.invariant.t.sol\":335,\"test/Imdex5MustAttack.t.sol\":596,\"test/Imdex5Payments.t.sol\":242,\"test/Imdex5RebalanceNothingOut.t.sol\":106,\"test/Imdex5ResidualSpot.t.sol\":182,\"test/Imdex5Revised.t.sol\":522,\"test/Imdex5ShortFill.t.sol\":226,\"test/Imdex5TaxEverywhere.t.sol\":529,\"test/Imdex5TaxedCoin.t.sol\":252,\"test/OracleConsumerConformance.t.sol\":74,\"test/mocks/AttackMocks.sol\":85,\"test/mocks/Mocks.sol\":339,\"test/mocks/PoolTaxERC20.sol\":25,\"test/mocks/TaxERC20.sol\":36},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"0e23ef197adced26d134d0074264b033035a2a2004a9ff5cadd01a3c74d065af","verifiedTreeHash":"3c5e96e22a774f39bb649fb08c6251767d197f29","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":110670,"exitCode":0,"name":"build","output":"Compiling 71 files with Solc 0.8.26\nSolc 0.8.26 finished in 110.57s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/Imdex5.sol:619:5:\n    |\n619 |     function _amountValue(address token, uint256 amount, uint256 sqrtP, Math.Rounding r)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Fix3.fork.t.sol:76:5:\n   |\n76 |     function _checkBacked(Imdex5.Coin[] memory cs, string memory when) internal {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Fix3Rebalance.fork.t.sol:44:5:\n   |\n44 |     function _backed(string memory when) internal {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":55786,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/Fix3Floor.fork.t.sol:Fix3FloorForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 481.33µs (0.00ns CPU time)\n\nRan 3 tests for test/Fix3.fork.t.sol:Fix3ForkTest\n[SKIP] test_fixed_with_1000_IMD() (gas: 0)\n[SKIP] test_fixed_with_100_IMD() (gas: 0)\n[SKIP] test_fixed_with_10_IMD() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 653.73µs (85.18µs CPU time)\n\nRan 3 tests for test/Fix3Rebalance.fork.t.sol:Fix3RebalanceForkTest\n[SKIP] test_dropTheTaxedCoin_fourRemain() (gas: 0)\n[SKIP] test_reorderSameFive() (gas: 0)\n[SKIP] test_shrinkToThree_bigFund() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 655.66µs (156.06µs CPU time)\n\nRan 2 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_callbackSelectorIsCanonical() (gas: 4542)\n[PASS] test_digestMatchesTheProtocol() (gas: 13358)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 821.43µs (67.79µs CPU time)\n\nRan 3 tests for test/Imdex5RebalanceNothingOut.t.sol:Imdex5RebalanceNothingOutTest\n[PASS] test_aRebalanceBuyThatDeliversNothingIsSkipped() (gas: 3554835)\n[PASS] test_aRebalanceBuyThatPaysDustIsSkippedAndAFairOneTrades() (gas: 5824331)\n[PASS] test_aRebalanceSellThatPaysNothingIsSkipped() (gas: 3077196)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 14.38ms (9.77ms CPU time)\n\nRan 9 tests for test/Imdex5ShortFill.t.sol:Imdex5ShortFillTest\n[PASS] testFuzz_mintUsesTheLeastFilledCoinAndChargesEveryBuy(uint256,uint16[5]) (runs: 256, μ: 1633303, ~: 1641669)\nLogs:\n  Bound result 499000370204935467971\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 4510\n  Bound result 312\n\n[PASS] test_fullFillPassesFloor() (gas: 742684)\n[PASS] test_mintRevertsAndRollsBackEarlierBuysWhenACoinDeliversZero() (gas: 1287089)\n[PASS] test_mintRevertsWhenANonzeroFillRoundsSharesToZero() (gas: 1196464)\n[PASS] test_shortFillChargesIdleImdForTheSharesIssuedOnly() (gas: 2600724)\n[PASS] test_shortFillMintsTheDeliveredFraction() (gas: 868543)\n[PASS] test_shortFillStillEnforcesMaxImdInAndRollsBack() (gas: 1739999)\n[PASS] test_sliverFillBelowFloorRevertsAndRollsBack() (gas: 1192676)\n[PASS] test_sliverFillWithoutFloorIssuesASliver() (gas: 1286856)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 314.67ms (316.89ms CPU time)\n\nRan 48 tests for test/Imdex5.t.sol:Imdex5Test\n[PASS] testFuzz_mintThenRedeemNeverPaysMoreThanDeposited(uint256,uint256) (runs: 256, μ: 2431235, ~: 2413924)\nLogs:\n  Bound result 4999000000000000041871\n  Bound result 1469700996642154189164\n\n[PASS] test_askPaysIntakeAndCaller() (gas: 1137820)\n[PASS] test_askReturnsWithoutFees() (gas: 155189)\n[PASS] test_askSevenDayInterval() (gas: 1189679)\n[PASS] test_bodyIsTheJsonTheBriefDescribes() (gas: 30573)\n[PASS] test_closeRequestAfterTwoDays() (gas: 1027162)\n[PASS] test_deployment() (gas: 94831)\n[PASS] test_feeImdOnlyLeavesForOracleAndRewards() (gas: 4953702)\n[PASS] test_fundAddsToFeeImd() (gas: 147750)\n[PASS] test_hookCannotReenter() (gas: 5165847)\n[PASS] test_mintBuysProportionallyAndRefunds() (gas: 1830731)\n[PASS] test_mintFirstBuysEqualPartsAndTakesFee() (gas: 1104287)\n[PASS] test_mintFirstKeepsWhatAPoolCouldNotTakeAsIdle() (gas: 1324958)\n[PASS] test_mintFirstRequiresZeroSupplyAndRightLength() (gas: 1022265)\n[PASS] test_mintFirstRevertsOnMinOut() (gas: 727292)\n[PASS] test_mintFirstRevertsWhenABuyFails() (gas: 814715)\n[PASS] test_mintFirstRevertsWhenABuyReturnsNothing() (gas: 2113671)\n[PASS] test_mintNeverIssuesSharesForNothing() (gas: 328007)\n[PASS] test_mintRequiresSupply() (gas: 40062)\n[PASS] test_mintRevertsOverMaxImdIn() (gas: 1733451)\n[PASS] test_mintRevertsWhenABuyFailsButScalesANonzeroShortFill() (gas: 2276274)\n[PASS] test_mintRoundsAgainstTheMinter() (gas: 1712059)\n[PASS] test_onOracleFailureOnlyFromIntake() (gas: 1064889)\n[PASS] test_onOracleResultStoresOnlyTheOpenRequestFromTheIntake() (gas: 1302614)\n[PASS] test_rebalanceNeedsAList() (gas: 41318)\n[PASS] test_rebalanceSellsAdoptsAndBuys() (gas: 5314843)\n[PASS] test_rebalanceSkipsADeadPool() (gas: 2986813)\n[PASS] test_rebalanceSkipsAHookThatLeavesAnUnsettledDelta() (gas: 3905692)\n[PASS] test_rebalanceSurvivesAHookThatBurnsAllGas() (gas: 5523181)\n[PASS] test_rebalanceTrimsAHoldingOverAQuarter() (gas: 3483754)\n[PASS] test_rebalanceWithNothingHeld() (gas: 2266196)\n[PASS] test_redeemCannotBeBlockedByACoin() (gas: 1575798)\n[PASS] test_redeemLastSharesPaysEverything() (gas: 2144787)\n[PASS] test_redeemPaysInKindLessHalfPercent() (gas: 1347551)\n[PASS] test_redeemRejectsZeroAndTooMany() (gas: 986277)\n[PASS] test_redeemSurvivesCoinsThatBurnAllGas() (gas: 4399653)\n[PASS] test_redeemToImdChargesTheFeeWhileOthersHold() (gas: 1669851)\n[PASS] test_redeemToImdPaysAShortFillInKindLessHalfPercent() (gas: 1781855)\n[PASS] test_redeemToImdPaysInKindWhenASaleFails() (gas: 2970886)\n[PASS] test_redeemToImdRevertsBelowMinOut() (gas: 1784845)\n[PASS] test_redeemToImdSellsAndTheLastHolderPaysNoFee() (gas: 1753012)\n[PASS] test_redeemToImdSurvivesAHookThatBurnsGas() (gas: 2458804)\n[PASS] test_submitRejectsASignedAttestationWithoutQuorum() (gas: 1128741)\n[PASS] test_submitRejectsAnExpiredAttestation() (gas: 1089458)\n[PASS] test_submitRejectsBadLists() (gas: 4717094)\n[PASS] test_submitRejectsWrongAnswerAndForgedSignature() (gas: 1645920)\n[PASS] test_submitStoresTheNextListAndRewards() (gas: 1527045)\n[PASS] test_unlockCallbackAndSwapSelfAreNotCallable() (gas: 103382)\nSuite result: ok. 48 passed; 0 failed; 0 skipped; finished in 437.36ms (487.37ms CPU time)\n\nRan 3 tests for test/Imdex5OracleAuthentication.t.sol:Imdex5OracleAuthenticationTest\n[PASS] testFuzz_lateDeliveryCannotRefreshExpiredSignature(uint256) (runs: 128, μ: 1336777, ~: 1336915)\nLogs:\n  Bound result 715383\n\n[PASS] testFuzz_mutatingAnySignedFieldCannotAdoptAList(uint8,uint256) (runs: 512, μ: 1325557, ~: 1325432)\nLogs:\n  Bound result 97000000000000000000\n\n[PASS] testFuzz_quorumForgeryDoesNotConsumeTheValidAnswer(uint16) (runs: 128, μ: 2216299, ~: 2216366)\nLogs:\n  Bound result 3\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 472.40ms (1.12s CPU time)\n\nRan 35 tests for test/Imdex5Edges.t.sol:Imdex5EdgesTest\n[PASS] testFuzz_mintBuysExactlyTheRoundedUpShare(uint256) (runs: 512, μ: 1918736, ~: 1918560)\nLogs:\n  Bound result 2500\n\n[PASS] testFuzz_mintFirstMintsExactlyTheRest(uint256) (runs: 512, μ: 1007746, ~: 1011747)\nLogs:\n  Bound result 2500\n\n[PASS] testFuzz_onOracleResultForAnotherRequestIsIgnored(bytes32,uint16) (runs: 256, μ: 1028603, ~: 1028683)\n[PASS] testFuzz_onOracleResultFromAStrangerChangesNothing(address,bytes32,uint16) (runs: 256, μ: 1075484, ~: 1075635)\n[PASS] testFuzz_redeemNeverPaysAboveProRata(uint256,uint256) (runs: 512, μ: 1557735, ~: 1558400)\nLogs:\n  Bound result 537116319407267999905\n  Bound result 129627388551853696245\n\n[PASS] testFuzz_splittingARedeemStaysUnderProRata(uint256,uint256) (runs: 256, μ: 1748773, ~: 1749084)\nLogs:\n  Bound result 114000000000000000019\n  Bound result 3600\n\n[PASS] test_aLaterAskReplacesAnUnsubmittedAnswer() (gas: 1887604)\n[PASS] test_aReenteringCoinCannotReenterAndIsNotPaidTwice() (gas: 2668935)\n[PASS] test_aReenteringCoinCannotReenterMintOrRebalanceFromRedeem() (gas: 3865756)\n[PASS] test_aThinResidualPoolDoesNotStarveAFlooredMint() (gas: 3598885)\n[PASS] test_anUnsubmittedAnswerDoesNotSurviveAFailedLaterAsk() (gas: 1356525)\n[PASS] test_askRevertsWholeWhenTheIntakeRefuses() (gas: 334213)\n[PASS] test_askThresholdIsExactlyThreeQuartersOfAnImd() (gas: 1101757)\n[PASS] test_closeRequestNeedsAnOpenOne() (gas: 1003747)\n[PASS] test_closingARequestDoesNotResetTheInterval() (gas: 1161894)\n[PASS] test_mintCannotBeFreeWhenTheIndexHoldsValue() (gas: 1767683)\n[PASS] test_onOracleResultAfterCloseIsIgnored() (gas: 1098689)\n[PASS] test_onOracleResultWithFiveEntriesFitsTheStipend() (gas: 1144000)\n[PASS] test_oneGasBurningCoinDoesNotBlockRedeemGivenGas() (gas: 1666702)\n[PASS] test_rebalanceBuyMovesAPoolAtMostTwoPercent() (gas: 3708965)\n[PASS] test_rebalanceBuyStopsAtAQuarterWeight() (gas: 4039961)\n[PASS] test_rebalanceDoesNotTrimWithFewerThanFourCoins() (gas: 3275415)\n[PASS] test_rebalanceSellMovesAPoolAtMostTwoPercent() (gas: 3308625)\n[PASS] test_rebalanceTrimsToAQuarterNotBelow() (gas: 3797382)\n[PASS] test_redeemHalfPercentStaysWithRemainingHolders() (gas: 1555707)\n[PASS] test_redeemIdleImdThatCannotBeSentIsOwed() (gas: 1394007)\n[PASS] test_redeemToATokenWithoutCodeBecomesOwedAndClaimableLater() (gas: 1266147)\n[PASS] test_residualsAreRedeemedAndADeadOneBlocksMintWithoutTakingImd() (gas: 5296057)\n[PASS] test_rewardsNeverDipIntoIdleImd() (gas: 2724139)\n[PASS] test_sharesTransferLikeAnyErc20AndMoveNoHoldings() (gas: 1463090)\n[PASS] test_submitAndRebalancePayNoRewardWithoutFees() (gas: 3266014)\n[PASS] test_submitRejectsATamperedAnswerEvenWithAValidSignatureElsewhere() (gas: 1142590)\n[PASS] test_submitRejectsAnAttestationSignedForAnotherChain() (gas: 1444342)\n[PASS] test_submitRejectsAnAttestationSignedForAnotherConsumer() (gas: 1109787)\n[PASS] test_submitRejectsMalformedAnswerBytes() (gas: 1347909)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 508.70ms (1.65s CPU time)\n\nRan 27 tests for test/Imdex5Revised.t.sol:Imdex5RevisedTest\n[PASS] testFuzz_mintFirstKeepsAPartialFillIdle(uint256,uint256) (runs: 256, μ: 1103916, ~: 1103879)\nLogs:\n  Bound result 41870\n  Bound result 3124\n\n[PASS] testFuzz_redeemToImdPaysADeadCoinExactlyAsRedeemDoes(uint256) (runs: 256, μ: 2004831, ~: 1997273)\nLogs:\n  Bound result 36094350109516419251\n\n[PASS] testFuzz_redeemToImdPaysAShortFillInKindUnderTheRedeemRule(uint256,uint256) (runs: 256, μ: 1830205, ~: 1830423)\nLogs:\n  Bound result 114000000000000000000\n  Bound result 2235513285616235889569\n\n[PASS] test_aCoinThatBurnsItsGasIsOwedAndTheIdleImdStillPaid() (gas: 1632787)\n[PASS] test_askAndCloseAtTheirExactBoundaries() (gas: 1205506)\n[PASS] test_askIsBlockedWhileAListAwaitsRebalance() (gas: 3311094)\n[PASS] test_claimThatFailsKeepsTheDebt() (gas: 1297142)\n[PASS] test_hookCannotCallSwapSelfOrTheOracleCallbacks() (gas: 3504050)\n[PASS] test_hookCannotCloseOrAnswerTheOpenRequestDuringASwap() (gas: 4132895)\n[PASS] test_lastRedeemerToImdTakesAllOfADeadCoin() (gas: 1751646)\n[PASS] test_margUsesItsOwnHookAndTheOthersShareG() (gas: 48935)\n[PASS] test_mintFirstPartialFillIsRedeemedProRataNotTwice() (gas: 1658991)\n[PASS] test_mintFirstRefusesAPoolThatReturnsNothingOnALargeAmount() (gas: 744528)\n[PASS] test_mintFirstRefusesDustThatBuysNothing() (gas: 2164851)\n[PASS] test_mintFirstRevertsWholeWhenTheHookMisbehaves() (gas: 992464204)\n[PASS] test_mintRevertsWholeWhenTheHookBurnsGasForTheIndex() (gas: 993092592)\n[PASS] test_mintRevertsWholeWhenTheHookLeavesADeltaUnsettled() (gas: 1344999)\n[PASS] test_mintSkipsAListCoinHeldAtZeroAndTheNextRebalanceBuysIt() (gas: 5584542)\n[PASS] test_onOracleResultNeedsExactlyFourAgreed() (gas: 1159030)\n[PASS] test_owedAccumulatesAcrossRedeemsAndIsPaidOnce() (gas: 2201232)\n[PASS] test_rebalanceSkipsEveryBurningSwapAndStillAdoptsTheList() (gas: 3728848)\n[PASS] test_redeemSurvivesFiveGasBurningCoinsWithOrdinaryGas() (gas: 5815669)\n[PASS] test_redeemToImdPaysInKindWhenTheHookLeavesADeltaUnsettled() (gas: 2232685)\n[PASS] test_redeemToImdPaysInKindWhenTheSaleWouldPayNothing() (gas: 1827210)\n[PASS] test_submitRejectsALaunchWithoutAHookOrAToken() (gas: 1853617)\n[PASS] test_submitTakesAnAttestationOnce() (gas: 1461722)\n[PASS] test_submitUsesTheRegistryArtifactsNotTheStartingList() (gas: 1560405)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 512.63ms (569.68ms CPU time)\n\nRan 7 tests for test/Imdex5TaxedCoin.t.sol:Imdex5TaxedCoinTest\n[PASS] testFuzz_taxedCoinLifecycle(uint256,uint256,uint256) (runs: 256, μ: 7860580, ~: 7866621)\nLogs:\n  Bound result 3000000000000000000\n  Bound result 499000000000000010497\n  Bound result 110999999999999999989\n\n[PASS] test_firstMintCreditsOnlyWhatArrives() (gas: 1253139)\n[PASS] test_firstMintMinOutChecksTheNetReceipt() (gas: 1358575)\n[PASS] test_lastHolderCanReceiveEveryCoinAfterAnImdExit() (gas: 2639725)\n[PASS] test_outstandingOwedIsNotCountedAsANewReceiptAndRemainsClaimable() (gas: 5187089)\n[PASS] test_taxedCoinFullLifecycle() (gas: 7855579)\n[PASS] test_taxedRebalanceBuyCreditsOnlyNewReceipts() (gas: 5602832)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 523.32ms (532.91ms CPU time)\n\nRan 6 tests for test/Imdex5SwapBoundaries.t.sol:Imdex5SwapBoundariesTest\n[PASS] testFuzz_rebalanceFillThreshold(bool,bool,uint256,uint256) (runs: 256, μ: 4791166, ~: 5030489)\nLogs:\n  Bound result 499999999999999999990\n  Bound result 123000000000000000000\n\n[PASS] testFuzz_zeroOutputSaleAndMinimumRollback(bool,uint256) (runs: 128, μ: 4851678, ~: 4782341)\nLogs:\n  Bound result 994000000332339489481\n\n[PASS] test_buyBoundary_coinAfterImd() (gas: 9413934)\n[PASS] test_buyBoundary_coinBeforeImd() (gas: 9411349)\n[PASS] test_sellBoundary_coinAfterImd() (gas: 9427969)\n[PASS] test_sellBoundary_coinBeforeImd() (gas: 9441179)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 572.72ms (1.13s CPU time)\n\nRan 6 tests for test/Imdex5ResidualSpot.t.sol:Imdex5ResidualSpotTest\n[PASS] testFuzz_aDeadResidualFailsTheMintAtAnyPrice(uint256,uint256) (runs: 256, μ: 4332174, ~: 4332142)\nLogs:\n  Bound result 41870\n  Bound result 514500996960984155724\n\n[PASS] testFuzz_aDumpedResidualThatTradesIsBoughtInFull(uint256,uint256) (runs: 256, μ: 4327386, ~: 4327460)\nLogs:\n  Bound result 870\n  Bound result 961686996960945898538\n\n[PASS] test_aDumpedResidualWhoseBuyRevertsCannotBeMintedAtSpot() (gas: 4719189)\n[PASS] test_aResidualHookThatBurnsGasFailsTheMint() (gas: 5759824)\n[PASS] test_aResidualHookThatLeavesADeltaFailsTheMint() (gas: 4184860)\n[PASS] test_aResidualShortFillIsChargedAtLeastItsFairValue() (gas: 4162861)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 572.75ms (1.02s CPU time)\n\nRan 6 tests for test/Imdex5DocumentedLimits.t.sol:Imdex5DocumentedLimitsTest\n[PASS] test_aClosedRequestCostsTheWholeWeek() (gas: 1161557)\n[PASS] test_aFailedRequestCostsTheWholeWeek() (gas: 1239424)\n[PASS] test_aFailedRequestLeavesEveryImdAccounted() (gas: 3588988)\n[PASS] test_aLeaverDumpedBeforeARebalanceIsSoldAtTheDumpedPriceAndBooked() (gas: 5360659)\n[PASS] test_aLimitedSaleSellsAboutOnePercentOfTheReservePerRebalance() (gas: 5819675)\n[PASS] test_aPoolMovedBeforeARebalanceIsBoughtAtTheMovedPriceAndBooked() (gas: 4770587)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 573.13ms (14.48ms CPU time)\n\nRan 21 tests for test/Imdex5MustAttack.t.sol:Imdex5MustAttackTest\n[PASS] testFuzz_dustMintsRoundAgainstTheMinter(uint256) (runs: 200, μ: 1914573, ~: 1914725)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_heldTracksBalanceThroughEveryPath(uint16,uint256) (runs: 64, μ: 7864198, ~: 7876691)\nLogs:\n  Bound result 13\n  Bound result 16292\n\n[PASS] testFuzz_mintKeepsOnlyWhatItSpends(uint256,uint256) (runs: 200, μ: 2882643, ~: 2882690)\nLogs:\n  Bound result 1043727738203858024858\n  Bound result 3467419166308302189410\n\n[PASS] testFuzz_mintNeverDilutesPerShare(uint256,uint256,uint256) (runs: 300, μ: 2988718, ~: 2998689)\nLogs:\n  Bound result 3\n  Bound result 43572987471554833870\n  Bound result 2156595945001528631478\n\n[PASS] testFuzz_mintNeverIssuesBelowTheFloor(uint256,uint256,uint256,uint256) (runs: 300, μ: 2169927, ~: 2212666)\nLogs:\n  Bound result 3\n  Bound result 23202\n  Bound result 97000000000000000000\n  Bound result 2209\n\n[PASS] testFuzz_redeemAlwaysPaysProRata(uint256,bool) (runs: 200, μ: 3358185, ~: 3182548)\nLogs:\n  Bound result 4002\n\n[PASS] testFuzz_residualDumpedThenBoughtInFullDilutesNobodyInCoins(uint256,uint256) (runs: 100, μ: 4763344, ~: 4763426)\nLogs:\n  Bound result 228\n  Bound result 65745656028961577779\n\n[PASS] testFuzz_residualShortFillAtUndisturbedPriceDilutesNobody(uint16,uint256) (runs: 100, μ: 5237448, ~: 5237405)\nLogs:\n  Bound result 2588\n  Bound result 205614647028961577779\n\n[PASS] testFuzz_underQuorumDeliveryIsIgnored(uint16) (runs: 50, μ: 1081384, ~: 1081454)\nLogs:\n  Bound result 2\n\n[PASS] test_answerOtherThanDeliveredIsRefused() (gas: 1126082)\n[PASS] test_callbackFromAnyoneElseIsIgnored() (gas: 1062537)\n[PASS] test_expiredAnswerNeverChangesTheList() (gas: 1455673)\n[PASS] test_floorAboveRequestAlwaysReverts() (gas: 1226882)\n[PASS] test_floorBoundaryIsExact() (gas: 3488224)\n[PASS] test_futureIssuedAnswerIsRefused() (gas: 1093115)\n[PASS] test_owedCoinsAreTheOnlyGapBetweenHeldAndBalance() (gas: 1740619)\n[PASS] test_redeemPaysWhenEveryCoinAndPoolMisbehaves() (gas: 4089935)\n[PASS] test_residualShortFillDoesNotCutSharesBelowFloor() (gas: 4833676)\n[PASS] test_revertedMintsTakeNothing_everyPath() (gas: 9268454)\n[PASS] test_underQuorumSignedAnswerNeverChangesTheList() (gas: 1092175)\n[PASS] test_wrongSignerAndReplayAreRefused() (gas: 1491573)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 573.27ms (3.36s CPU time)\n\nRan 9 tests for test/Imdex5TaxEverywhere.t.sol:Imdex5TaxEverywhereTest\n[PASS] testFuzz_everyCoinTaxedLifecycle(uint16[5],uint256,uint256,uint256) (runs: 200, μ: 9130293, ~: 9137873)\nLogs:\n  Bound result 522\n  Bound result 4\n  Bound result 0\n  Bound result 1650\n  Bound result 5\n  Bound result 1000000000000000001\n  Bound result 145307749937601156090\n  Bound result 351550328808361567419\n\n[PASS] testFuzz_theMostTaxedCoinDecidesTheMint(uint8,uint16,uint16,uint256) (runs: 200, μ: 2680526, ~: 2707883)\nLogs:\n  Bound result 4\n  Bound result 88\n  Bound result 23\n  Bound result 499000000000000000168\n\n[PASS] test_aCoinTaxingItsOwnSettlementIsNeverSoldAndIsPaidInKind() (gas: 6636522)\n[PASS] test_aCoinTaxingItsOwnSettlementStaysAResidualThroughARebalance() (gas: 7215158)\n[PASS] test_aCoinThatKeepsEverythingFailsALaterMintWholeAndRedeemsStillPay() (gas: 6648639)\n[PASS] test_aCoinThatKeepsEverythingFailsTheFirstMintWhole() (gas: 1464724)\n[PASS] test_aCoinThatKeepsEverythingFailsTheOneWeiMint() (gas: 3415669)\n[PASS] test_aDonationNeitherChangesHeldNorInflatesAMintOrARedeem() (gas: 2474905)\n[PASS] test_taxOnTopOfAPartialFillCreditsTheNetAndMintsThatFraction() (gas: 5236820)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 620.72ms (1.24s CPU time)\n\nRan 1 test for test/Imdex5TaxEverywhere.t.sol:Imdex5AllCoinsTaxedInvariantTest\n[PASS]\nImdex5AllCoinsTaxedInvariantTest invariants:\n[PASS] invariant_taxed_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_taxed_coinBalancesAreHeldPlusOwed\n[PASS] invariant_taxed_everyHoldingIsListed\n[PASS] invariant_taxed_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_taxed_zeroSupplyMeansNothingHeld\n Imdex5AllCoinsTaxedInvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 209   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 245   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 212   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 432   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 222   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 244   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 205   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 225   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 203   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 205   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 218   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 199   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 194   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 233   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 179   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| TaxKnobs      | setTax           | 209   | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2228\n  Bound result 39596972668088003129\n  Bound result 159708578027544712484\n  Bound result 1435743504598885\n  Bound result 4046341548624796396\n  Bound result 37241578766611975504\n  Bound result 561081\n  Bound result 18352\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.38s (1.37s CPU time)\n\nRan 1 test for test/Imdex5.invariant.t.sol:Imdex5InvariantTest\n[PASS]\nImdex5InvariantTest invariants:\n[PASS] invariant_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_coinBalancesAreHeldPlusOwed\n[PASS] invariant_feeImdLeavesOnlyForTheOracleAndRewards\n[PASS] invariant_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_listShape\n[PASS] invariant_noFreeMintWhileValueIsHeld\n[PASS] invariant_requestStateIsConsistent\n[PASS] invariant_zeroSupplyMeansNothingHeld\n Imdex5InvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 195   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 207   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | closeRequest     | 200   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverFailure   | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 189   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 196   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 368   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 201   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 196   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 217   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 243   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 195   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 207   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 217   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 186   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 191   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 220   | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 24\n  Bound result 250000000000000000\n  Bound result 99\n  Bound result 92921902991758555\n  Bound result 130108602367599074406\n  Bound result 6058\n  Bound result 19\n  Bound result 21157\n  Bound result 18648\n  Bound result 6325\n  Bound result 691198\n  Bound result 900\n  Bound result 128\n  Bound result 298500000000000000000\n  Bound result 3798186580743\n  Bound result 4043602527277512139398\n  Bound result 153600\n  Bound result 537600\n  Bound result 11761\n  Bound result 75\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.94s (1.93s CPU time)\n\nRan 1 test for test/Imdex5Floor.invariant.t.sol:Imdex5FloorInvariantTest\n[PASS]\nImdex5FloorInvariantTest invariants:\n[PASS] invariant_heldIsTheRealBalance\n[PASS] invariant_mintNeverDilutesListCoinsOrIdle\n[PASS] invariant_noMintBelowTheFloor\n[PASS] invariant_noSharesMeansNothingHeld\n[PASS] invariant_redeemAlwaysPays\n[PASS] invariant_revertedMintMovesNothing\n Imdex5FloorInvariantTest invariants (runs: 128, calls: 5120, reverts: 485)\n\n╭--------------------+-------------+-------+---------+----------╮\n| Contract           | Selector    | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5FloorHandler | claim       | 476   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | mint        | 1355  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | mintFirst   | 471   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | movePrice   | 488   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | rebalanceTo | 485   | 485     | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | redeem      | 461   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | redeemToImd | 452   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | setMaxIn    | 486   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | setTax      | 446   | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 52\n  Bound result 30000000\n  Bound result 13\n  Bound result 22841\n  Bound result 100000000000000000000\n  Bound result 795000000000000000000\n  Bound result 200\n  Bound result 928675183851808800450\n  Bound result 2500\n  Bound result 10826\n  Bound result 9937\n  Bound result 18\n  Bound result 1804\n  Bound result 50249999999998879720\n  Bound result 20809\n  Bound result 1000000000000000\n  Bound result 302\n  Bound result 935410\n  Bound result 9801\n  Bound result 737\n  Bound result 3643\n  Bound result 7\n  Bound result 900\n  Bound result 504\n  Bound result 238\n  Bound result 3478\n  Bound result 2112\n  Bound result 12345\n  Bound result 762\n  Bound result 995000000000000111976\n  Bound result 999906\n  Bound result 1079\n  Bound result 8256\n  Bound result 7\n  Bound result 234\n  Bound result 1\n  Bound result 534\n  Bound result 2989\n  Bound result 776161\n  Bound result 8\n  Bound result 451\n  Bound result 8\n  Bound result 160\n  Bound result 501\n  Bound result 371636862\n  Bound result 365\n  Bound result 5318\n  Bound result 2\n  Bound result 374\n  Bound result 628057317341387608512442\n  Bound result 9\n  Bound result 39510\n  Bound result 192\n  Bound result 860\n  Bound result 4243\n  Bound result 655\n  Bound result 715\n  Bound result 352710984976227550984\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.50s (2.49s CPU time)\n\nRan 2 tests for test/Imdex5Claims.invariant.t.sol:Imdex5ClaimsInvariantTest\n[PASS] invariant_everyHolderAndCreditorIsBacked() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+----------------+-------+---------+----------╮\n| Contract            | Selector       | Calls | Reverts | Discards |\n+===================================================================+\n| Imdex5ClaimsHandler | changeFailure  | 2624  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| Imdex5ClaimsHandler | claim          | 2845  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| Imdex5ClaimsHandler | exitAll        | 2750  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| Imdex5ClaimsHandler | mint           | 2743  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| Imdex5ClaimsHandler | redeem         | 2794  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| Imdex5ClaimsHandler | transferShares | 2628  | 0       | 0        |\n╰---------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 4999999999999998194\n  Bound result 13205\n  Bound result 924\n  Bound result 60\n  Bound result 40\n  Bound result 40000000000000000061\n  Bound result 10558689\n  Bound result 2301\n  Bound result 40000000000010558690\n  Bound result 2000\n  Bound result 1925\n  Bound result 40000000000000002001\n  Bound result 0\n  Bound result 0\n  Bound result 4999999999999999401\n  Bound result 2138\n  Bound result 250000000000000000\n  Bound result 12880\n  Bound result 40249999999999999751\n  Bound result 581343\n  Bound result 0\n  Bound result 31337\n  Bound result 2824\n  Bound result 40000000000000031338\n  Bound result 15190\n  Bound result 9360\n  Bound result 40000000000000015191\n  Bound result 87\n  Bound result 83\n  Bound result 40000000000000000088\n  Bound result 0\n  Bound result 22947\n  Bound result 49748743718592964825\n  Bound result 1005025125628139546\n  Bound result 49748743718592964825\n  Bound result 2583\n  Bound result 0\n  Bound result 0\n  Bound result 0\n  Bound result 1618685519454\n  Bound result 0\n  Bound result 0\n  Bound result 33195178594\n  Bound result 14092011490\n  Bound result 40000000033195178595\n  Bound result 200000\n  Bound result 2363\n  Bound result 40000000000000200001\n  Bound result 925312023154198\n  Bound result 637176602214857\n  Bound result 40000925312023154199\n\n[PASS] test_handlerExercisesDebtAcrossEpochs() (gas: 8555372)\nLogs:\n  Bound result 0\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 0\n  Bound result 20000000000000000000\n  Bound result 0\n  Bound result 20000000000000000000\n\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.17s (11.18s CPU time)\n\nRan 1 test for test/Imdex5.invariant.t.sol:Imdex5TaxedCoinInvariantTest\n[PASS]\nImdex5TaxedCoinInvariantTest invariants:\n[PASS] invariant_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_coinBalancesAreHeldPlusOwed\n[PASS] invariant_feeImdLeavesOnlyForTheOracleAndRewards\n[PASS] invariant_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_listShape\n[PASS] invariant_noFreeMintWhileValueIsHeld\n[PASS] invariant_requestStateIsConsistent\n[PASS] invariant_zeroSupplyMeansNothingHeld\n Imdex5TaxedCoinInvariantTest invariants (runs: 256, calls: 128000, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 6636  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 6695  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | closeRequest     | 6752  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverFailure   | 6801  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 6714  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 6680  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 13445 | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 6752  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 6685  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 6897  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 6601  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 6664  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 6713  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 6671  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 6830  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 6860  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 6729  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 6875  | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 10000000000000000001\n  Bound result 10000\n  Bound result 2000000000000000000000\n  Bound result 1\n  Bound result 5\n  Bound result 500\n  Bound result 15083\n  Bound result 5000\n  Bound result 3684404903264110310512\n  Bound result 749999999999999999\n  Bound result 3531608784706796\n  Bound result 9336\n  Bound result 10100\n  Bound result 50000000000000000000\n  Bound result 31337\n  Bound result 64\n  Bound result 798\n  Bound result 537600\n  Bound result 97\n  Bound result 40\n  Bound result 9805\n  Bound result 2137\n  Bound result 8053702507179067602235\n  Bound result 7184\n  Bound result 1000000\n  Bound result 13148\n  Bound result 16\n  Bound result 3000000000000000000\n  Bound result 70680258616604407606\n  Bound result 17486\n  Bound result 14424\n  Bound result 51200\n  Bound result 474644205\n  Bound result 50000000000000000096\n  Bound result 250000000000000000000\n  Bound result 2778\n  Bound result 18807\n  Bound result 11042\n  Bound result 50000000000000000000\n  Bound result 19529035837012967424\n  Bound result 1\n  Bound result 20874\n  Bound result 18446744073709551615\n  Bound result 244124153722729520859\n  Bound result 14\n  Bound result 30000000\n  Bound result 2827\n  Bound result 21000000000000000\n  Bound result 16256747033301207744\n  Bound result 4295128739\n  Bound result 50000000000000018903\n  Bound result 4486\n  Bound result 14976\n  Bound result 2145\n  Bound result 18095\n  Bound result 227787\n  Bound result 345\n  Bound result 144\n  Bound result 3801745994619372053626\n  Bound result 6392145789925666180836\n  Bound result 856\n  Bound result 549138697588118556275\n  Bound result 938806901625094101\n  Bound result 105\n  Bound result 192161677547341\n  Bound result 995\n  Bound result 383229\n  Bound result 895227043080345747134\n  Bound result 200000\n  Bound result 21801\n  Bound result 1245009380193614460558\n  Bound result 1561568134220081\n  Bound result 137\n  Bound result 306876416713\n  Bound result 659918\n  Bound result 5000000000000000000\n  Bound result 363240568583816918682\n  Bound result 3041954473\n  Bound result 75\n  Bound result 3\n  Bound result 20380\n  Bound result 6600674703330123224000\n  Bound result 11\n  Bound result 123000000000000000000\n  Bound result 199000000000000000000\n  Bound result 95569915997759\n  Bound result 826089444747359256579\n  Bound result 822\n  Bound result 246\n  Bound result 40\n  Bound result 8000000\n  Bound result 25\n  Bound result 4242\n  Bound result 1024890152141501920803\n  Bound result 1000000\n  Bound result 58955410094952565183\n  Bound result 17740\n  Bound result 1365\n  Bound result 419097519794350080453\n  Bound result 46789382\n  Bound result 7810217506737447630525\n  Bound result 300000\n  Bound result 4946\n  Bound result 8637\n  Bound result 900\n  Bound result 398\n  Bound result 900\n  Bound result 683\n  Bound result 2000000000000000000\n  Bound result 1175\n  Bound result 1831025479586927316951\n  Bound result 1007481387540788994747\n  Bound result 7723537686814318915\n  Bound result 8\n  Bound result 97000000000000000000\n  Bound result 465\n  Bound result 12500\n  Bound result 4829\n  Bound result 490\n  Bound result 95\n  Bound result 21302\n  Bound result 5571\n  Bound result 499999999999999999991\n  Bound result 331791504433173175208\n  Bound result 659918\n  Bound result 87\n  Bound result 2115\n  Bound result 2592000\n  Bound result 355371368259947951038\n  Bound result 59432570749\n  Bound result 4094\n  Bound result 128000\n  Bound result 40\n  Bound result 467983\n  Bound result 40086051435290964784\n  Bound result 200\n  Bound result 15\n  Bound result 9900\n  Bound result 9950\n  Bound result 77736\n  Bound result 64555113031370214551\n  Bound result 42495\n  Bound result 659918\n  Bound result 13433\n  Bound result 29972353795135207118\n  Bound result 9097\n  Bound result 15457\n  Bound result 3988822378723970342\n  Bound result 38\n  Bound result 509501994039946377749\n  Bound result 14\n  Bound result 2558856151174558035476\n  Bound result 719098455508\n  Bound result 19\n  Bound result 21\n  Bound result 390607565778990750519\n  Bound result 362\n  Bound result 9805\n  Bound result 68\n  Bound result 206\n  Bound result 404098526\n  Bound result 401500446371068597093\n  Bound result 13\n  Bound result 202753\n  Bound result 13894\n  Bound result 166\n  Bound result 4357459358252982820656\n  Bound result 100000\n  Bound result 96\n  Bound result 3946109765\n  Bound result 512669\n  Bound result 5\n  Bound result 17\n  Bound result 11199\n  Bound result 136\n  Bound result 19888\n  Bound result 5\n  Bound result 4\n  Bound result 8\n  Bound result 5\n  Bound result 3\n  Bound result 168\n  Bound result 8711\n  Bound result 4233\n  Bound result 45005851881584441735\n  Bound result 32\n  Bound result 1380412149\n  Bound result 1452\n  Bound result 50\n  Bound result 2000\n  Bound result 9950000000000000000\n  Bound result 100000\n  Bound result 115200\n  Bound result 39\n  Bound result 8452023512068802466863\n  Bound result 15\n  Bound result 2\n  Bound result 3716131320551376796591\n  Bound result 41\n  Bound result 14335\n  Bound result 11793\n  Bound result 90\n  Bound result 1\n  Bound result 114\n  Bound result 303150997643025878596\n  Bound result 49999999999999999999\n  Bound result 50\n  Bound result 19692\n  Bound result 8\n  Bound result 98\n  Bound result 98000000000000000000\n  Bound result 1\n  Bound result 15\n  Bound result 22435\n  Bound result 10868998138528\n  Bound result 15\n  Bound result 11\n  Bound result 2493\n  Bound result 1\n  Bound result 200000\n  Bound result 2\n  Bound result 9\n  Bound result 1\n  Bound result 9313\n  Bound result 112404\n  Bound result 43\n  Bound result 1\n  Bound result 1779\n  Bound result 128000\n  Bound result 46\n  Bound result 4293972215960108140952\n  Bound result 13\n  Bound result 10\n  Bound result 17\n  Bound result 448470150297282218609\n  Bound result 9\n  Bound result 3349\n  Bound result 8253486438452365479\n  Bound result 9\n  Bound result 4\n  Bound result 634660973179066256\n  Bound result 2447209286\n  Bound result 39\n  Bound result 180803645860531383777\n  Bound result 33236839714825751583\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 55.67s (55.66s CPU time)\n\nRan 21 test suites in 55.67s (78.35s CPU time): 188 tests passed, 0 failed, 7 skipped (195 total tests)\n","passed":true},{"durationMs":92,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Imdex5.approve(address,uint256)\",\"Imdex5.ask()\",\"Imdex5.claim(address)\",\"Imdex5.closeRequest()\",\"Imdex5.fund(uint256)\",\"Imdex5.mint(uint256,uint256,uint256)\",\"Imdex5.mintFirst(uint256,uint256[])\",\"Imdex5.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Imdex5.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Imdex5.rebalance()\",\"Imdex5.redeem(uint256)\",\"Imdex5.redeemToImd(uint256,uint256)\",\"Imdex5.submit((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Imdex5.swapSelf(address,address,bool,uint256,bool,bool)\",\"Imdex5.transfer(address,uint256)\",\"Imdex5.transferFrom(address,address,uint256)\",\"Imdex5.unlockCallback(bytes)\"],\"files\":{\".gitignore\":2,\"ADAPTATION.md\":328,\"README.md\":361,\"THREAT_MODEL.md\":49,\"foundry.toml\":19,\"launch.json\":10,\"src/Imdex5.sol\":680,\"src/Interfaces.sol\":61,\"src/OracleAttestation.sol\":221,\"test/Fix3.fork.t.sol\":97,\"test/Fix3Floor.fork.t.sol\":67,\"test/Fix3Rebalance.fork.t.sol\":151,\"test/Imdex5.invariant.t.sol\":544,\"test/Imdex5.t.sol\":1070,\"test/Imdex5Base.sol\":175,\"test/Imdex5Claims.invariant.t.sol\":313,\"test/Imdex5DocumentedLimits.t.sol\":239,\"test/Imdex5Edges.t.sol\":741,\"test/Imdex5Floor.invariant.t.sol\":335,\"test/Imdex5MustAttack.t.sol\":596,\"test/Imdex5OracleAuthentication.t.sol\":139,\"test/Imdex5RebalanceNothingOut.t.sol\":106,\"test/Imdex5ResidualSpot.t.sol\":182,\"test/Imdex5Revised.t.sol\":522,\"test/Imdex5ShortFill.t.sol\":226,\"test/Imdex5SwapBoundaries.t.sol\":222,\"test/Imdex5TaxEverywhere.t.sol\":529,\"test/Imdex5TaxedCoin.t.sol\":252,\"test/OracleConsumerConformance.t.sol\":74,\"test/README.md\":30,\"test/mocks/AttackMocks.sol\":85,\"test/mocks/Mocks.sol\":337,\"test/mocks/PoolTaxERC20.sol\":25,\"test/mocks/TaxERC20.sol\":36},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2ce09356d4305278f816f003b8a60ba79e6f3be0d5615900d21432a69397ba01","verifiedTreeHash":"ff4e10a734712decaa6fc53bcdb518be78272504","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":103326,"exitCode":0,"name":"build","output":"Compiling 69 files with Solc 0.8.26\nSolc 0.8.26 finished in 103.23s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/Imdex5.sol:644:5:\n    |\n644 |     function _amountValue(address token, uint256 amount, uint256 sqrtP, Math.Rounding r)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Fix3.fork.t.sol:76:5:\n   |\n76 |     function _checkBacked(Imdex5.Coin[] memory cs, string memory when) internal {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Fix3Rebalance.fork.t.sol:44:5:\n   |\n44 |     function _backed(string memory when) internal {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":53621,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/Fix3Floor.fork.t.sol:Fix3FloorForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 290.19µs (0.00ns CPU time)\n\nRan 3 tests for test/Fix3Rebalance.fork.t.sol:Fix3RebalanceForkTest\n[SKIP] test_dropTheTaxedCoin_fourRemain() (gas: 0)\n[SKIP] test_reorderSameFive() (gas: 0)\n[SKIP] test_shrinkToThree_bigFund() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 494.92µs (206.94µs CPU time)\n\nRan 2 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_callbackSelectorIsCanonical() (gas: 4542)\n[PASS] test_digestMatchesTheProtocol() (gas: 13361)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 526.08µs (78.95µs CPU time)\n\nRan 3 tests for test/Fix3.fork.t.sol:Fix3ForkTest\n[SKIP] test_fixed_with_1000_IMD() (gas: 0)\n[SKIP] test_fixed_with_100_IMD() (gas: 0)\n[SKIP] test_fixed_with_10_IMD() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 815.71µs (91.55µs CPU time)\n\nRan 8 tests for test/Imdex5DocumentedLimits.t.sol:Imdex5DocumentedLimitsTest\n[PASS] test_aClosedRequestCostsTheWholeWeek() (gas: 1161934)\n[PASS] test_aDeadListCoinIsNotDroppedByARebalanceAndBlocksMintUntilItsPoolWorks() (gas: 6626330)\n[PASS] test_aFailedRequestCostsTheWholeWeek() (gas: 1239868)\n[PASS] test_aFailedRequestLeavesEveryImdAccounted() (gas: 3597193)\n[PASS] test_aLeaverDumpedBeforeARebalanceIsSoldAtTheDumpedPriceAndBooked() (gas: 5366763)\n[PASS] test_aLimitedSaleSellsAboutOnePercentOfTheReservePerRebalance() (gas: 5830453)\n[PASS] test_aListOfFewerThanFourCoinsLeavesTheRestIdle() (gas: 3877093)\n[PASS] test_aPoolMovedBeforeARebalanceIsBoughtAtTheMovedPriceAndBooked() (gas: 4775509)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 11.61ms (27.35ms CPU time)\n\nRan 3 tests for test/Imdex5RebalanceNothingOut.t.sol:Imdex5RebalanceNothingOutTest\n[PASS] test_aRebalanceBuyThatDeliversNothingIsSkipped() (gas: 3557928)\n[PASS] test_aRebalanceBuyThatPaysDustIsSkippedAndAFairOneTrades() (gas: 5831071)\n[PASS] test_aRebalanceSellThatPaysNothingIsSkipped() (gas: 3079117)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 463.04ms (9.27ms CPU time)\n\nRan 48 tests for test/Imdex5.t.sol:Imdex5Test\n[PASS] testFuzz_mintThenRedeemNeverPaysMoreThanDeposited(uint256,uint256) (runs: 256, μ: 2439277, ~: 2421615)\nLogs:\n  Bound result 4999000000000000041871\n  Bound result 1469700996642154189164\n\n[PASS] test_askPaysIntakeAndCaller() (gas: 1138091)\n[PASS] test_askReturnsWithoutFees() (gas: 155267)\n[PASS] test_askSevenDayInterval() (gas: 1190059)\n[PASS] test_bodyIsTheJsonTheBriefDescribes() (gas: 30576)\n[PASS] test_closeRequestAfterTwoDays() (gas: 1027427)\n[PASS] test_deployment() (gas: 94874)\n[PASS] test_feeImdOnlyLeavesForOracleAndRewards() (gas: 4967725)\n[PASS] test_fundAddsToFeeImd() (gas: 147803)\n[PASS] test_hookCannotReenter() (gas: 5175609)\n[PASS] test_mintBuysProportionallyAndRefunds() (gas: 1833087)\n[PASS] test_mintFirstBuysEqualPartsAndTakesFee() (gas: 1105437)\n[PASS] test_mintFirstKeepsWhatAPoolCouldNotTakeAsIdle() (gas: 1330484)\n[PASS] test_mintFirstRequiresZeroSupplyAndRightLength() (gas: 1023353)\n[PASS] test_mintFirstRevertsOnMinOut() (gas: 728115)\n[PASS] test_mintFirstRevertsWhenABuyFails() (gas: 815588)\n[PASS] test_mintFirstRevertsWhenABuyReturnsNothing() (gas: 2116051)\n[PASS] test_mintNeverIssuesSharesForNothing() (gas: 328111)\n[PASS] test_mintRequiresSupply() (gas: 40065)\n[PASS] test_mintRevertsOverMaxImdIn() (gas: 1735646)\n[PASS] test_mintRevertsWhenABuyFailsButScalesANonzeroShortFill() (gas: 2279081)\n[PASS] test_mintRoundsAgainstTheMinter() (gas: 1714378)\n[PASS] test_onOracleFailureOnlyFromIntake() (gas: 1065204)\n[PASS] test_onOracleResultStoresOnlyTheOpenRequestFromTheIntake() (gas: 1303085)\n[PASS] test_rebalanceNeedsAList() (gas: 41343)\n[PASS] test_rebalanceSellsAdoptsAndBuys() (gas: 5320154)\n[PASS] test_rebalanceSkipsADeadPool() (gas: 2992072)\n[PASS] test_rebalanceSkipsAHookThatLeavesAnUnsettledDelta() (gas: 3909146)\n[PASS] test_rebalanceSurvivesAHookThatBurnsAllGas() (gas: 5526604)\n[PASS] test_rebalanceTrimsAHoldingOverAQuarter() (gas: 3486749)\n[PASS] test_rebalanceWithNothingHeld() (gas: 2267403)\n[PASS] test_redeemCannotBeBlockedByACoin() (gas: 1581524)\n[PASS] test_redeemLastSharesPaysEverything() (gas: 2150587)\n[PASS] test_redeemPaysInKindLessHalfPercent() (gas: 1353150)\n[PASS] test_redeemRejectsZeroAndTooMany() (gas: 987406)\n[PASS] test_redeemSurvivesCoinsThatBurnAllGas() (gas: 4354830)\n[PASS] test_redeemToImdChargesTheFeeWhileOthersHold() (gas: 1676317)\n[PASS] test_redeemToImdPaysAShortFillInKindLessHalfPercent() (gas: 1789016)\n[PASS] test_redeemToImdPaysInKindWhenASaleFails() (gas: 2989586)\n[PASS] test_redeemToImdRevertsBelowMinOut() (gas: 1788250)\n[PASS] test_redeemToImdSellsAndTheLastHolderPaysNoFee() (gas: 1759494)\n[PASS] test_redeemToImdSurvivesAHookThatBurnsGas() (gas: 2467168)\n[PASS] test_submitRejectsASignedAttestationWithoutQuorum() (gas: 1128965)\n[PASS] test_submitRejectsAnExpiredAttestation() (gas: 1089679)\n[PASS] test_submitRejectsBadLists() (gas: 4719084)\n[PASS] test_submitRejectsWrongAnswerAndForgedSignature() (gas: 1646440)\n[PASS] test_submitStoresTheNextListAndRewards() (gas: 1527456)\n[PASS] test_unlockCallbackAndSwapSelfAreNotCallable() (gas: 103502)\nSuite result: ok. 48 passed; 0 failed; 0 skipped; finished in 492.35ms (472.81ms CPU time)\n\nRan 9 tests for test/Imdex5ShortFill.t.sol:Imdex5ShortFillTest\n[PASS] testFuzz_mintUsesTheLeastFilledCoinAndChargesEveryBuy(uint256,uint16[5]) (runs: 256, μ: 1634776, ~: 1643440)\nLogs:\n  Bound result 499000370204935467971\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 4510\n  Bound result 312\n\n[PASS] test_fullFillPassesFloor() (gas: 743937)\n[PASS] test_mintRevertsAndRollsBackEarlierBuysWhenACoinDeliversZero() (gas: 1288533)\n[PASS] test_mintRevertsWhenANonzeroFillRoundsSharesToZero() (gas: 1198010)\n[PASS] test_shortFillChargesIdleImdForTheSharesIssuedOnly() (gas: 2607317)\n[PASS] test_shortFillMintsTheDeliveredFraction() (gas: 869879)\n[PASS] test_shortFillStillEnforcesMaxImdInAndRollsBack() (gas: 1742002)\n[PASS] test_sliverFillBelowFloorRevertsAndRollsBack() (gas: 1194221)\n[PASS] test_sliverFillWithoutFloorIssuesASliver() (gas: 1288456)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 514.92ms (521.08ms CPU time)\n\nRan 27 tests for test/Imdex5Revised.t.sol:Imdex5RevisedTest\n[PASS] testFuzz_mintFirstKeepsAPartialFillIdle(uint256,uint256) (runs: 256, μ: 1105064, ~: 1105080)\nLogs:\n  Bound result 41870\n  Bound result 3124\n\n[PASS] testFuzz_redeemToImdPaysADeadCoinExactlyAsRedeemDoes(uint256) (runs: 256, μ: 2016453, ~: 2008784)\nLogs:\n  Bound result 36094350109516419251\n\n[PASS] testFuzz_redeemToImdPaysAShortFillInKindUnderTheRedeemRule(uint256,uint256) (runs: 256, μ: 1837305, ~: 1837618)\nLogs:\n  Bound result 994000000000000041870\n  Bound result 19260430990447016672714\n\n[PASS] test_aCoinThatBurnsItsGasIsOwedAndTheIdleImdStillPaid() (gas: 1631385)\n[PASS] test_askAndCloseAtTheirExactBoundaries() (gas: 1205911)\n[PASS] test_askIsBlockedWhileAListAwaitsRebalance() (gas: 3314147)\n[PASS] test_claimThatFailsKeepsTheDebt() (gas: 1302771)\n[PASS] test_hookCannotCallSwapSelfOrTheOracleCallbacks() (gas: 3507060)\n[PASS] test_hookCannotCloseOrAnswerTheOpenRequestDuringASwap() (gas: 4136780)\n[PASS] test_lastRedeemerToImdTakesAllOfADeadCoin() (gas: 1758698)\n[PASS] test_margUsesItsOwnHookAndTheOthersShareG() (gas: 48938)\n[PASS] test_mintFirstPartialFillIsRedeemedProRataNotTwice() (gas: 1669924)\n[PASS] test_mintFirstRefusesAPoolThatReturnsNothingOnALargeAmount() (gas: 745257)\n[PASS] test_mintFirstRefusesDustThatBuysNothing() (gas: 2166229)\n[PASS] test_mintFirstRevertsWholeWhenTheHookMisbehaves() (gas: 992464212)\n[PASS] test_mintRevertsWholeWhenTheHookBurnsGasForTheIndex() (gas: 993093705)\n[PASS] test_mintRevertsWholeWhenTheHookLeavesADeltaUnsettled() (gas: 1346547)\n[PASS] test_mintSkipsAListCoinHeldAtZeroAndTheNextRebalanceBuysIt() (gas: 5590055)\n[PASS] test_onOracleResultNeedsExactlyFourAgreed() (gas: 1159398)\n[PASS] test_owedAccumulatesAcrossRedeemsAndIsPaidOnce() (gas: 2212746)\n[PASS] test_rebalanceSkipsEveryBurningSwapAndStillAdoptsTheList() (gas: 3730546)\n[PASS] test_redeemSurvivesFiveGasBurningCoinsWithOrdinaryGas() (gas: 5789971)\n[PASS] test_redeemToImdPaysInKindWhenTheHookLeavesADeltaUnsettled() (gas: 2244486)\n[PASS] test_redeemToImdPaysInKindWhenTheSaleWouldPayNothing() (gas: 1834334)\n[PASS] test_submitRejectsALaunchWithoutAHookOrAToken() (gas: 1854053)\n[PASS] test_submitTakesAnAttestationOnce() (gas: 1462114)\n[PASS] test_submitUsesTheRegistryArtifactsNotTheStartingList() (gas: 1560763)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 514.99ms (987.87ms CPU time)\n\nRan 6 tests for test/Imdex5ResidualSpot.t.sol:Imdex5ResidualSpotTest\n[PASS] testFuzz_aDeadResidualFailsTheMintAtAnyPrice(uint256,uint256) (runs: 256, μ: 4336377, ~: 4336350)\nLogs:\n  Bound result 41870\n  Bound result 514500996960984155724\n\n[PASS] testFuzz_aDumpedResidualThatTradesIsBoughtInFull(uint256,uint256) (runs: 256, μ: 4331752, ~: 4331834)\nLogs:\n  Bound result 870\n  Bound result 961686996960945898538\n\n[PASS] test_aDumpedResidualWhoseBuyRevertsCannotBeMintedAtSpot() (gas: 4727855)\n[PASS] test_aResidualHookThatBurnsGasFailsTheMint() (gas: 5765103)\n[PASS] test_aResidualHookThatLeavesADeltaFailsTheMint() (gas: 4189311)\n[PASS] test_aResidualShortFillIsChargedAtLeastItsFairValue() (gas: 4167201)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 515.06ms (1.00s CPU time)\n\nRan 21 tests for test/Imdex5MustAttack.t.sol:Imdex5MustAttackTest\n[PASS] testFuzz_dustMintsRoundAgainstTheMinter(uint256) (runs: 200, μ: 1916982, ~: 1917130)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_heldTracksBalanceThroughEveryPath(uint16,uint256) (runs: 64, μ: 7885887, ~: 7898376)\nLogs:\n  Bound result 15\n  Bound result 255959118\n\n[PASS] testFuzz_mintKeepsOnlyWhatItSpends(uint256,uint256) (runs: 200, μ: 2886349, ~: 2886400)\nLogs:\n  Bound result 1043727738203858024858\n  Bound result 3467419166308302189410\n\n[PASS] testFuzz_mintNeverDilutesPerShare(uint256,uint256,uint256) (runs: 300, μ: 2992516, ~: 3002751)\nLogs:\n  Bound result 3\n  Bound result 43572987471554833870\n  Bound result 2156595945001528631478\n\n[PASS] testFuzz_mintNeverIssuesBelowTheFloor(uint256,uint256,uint256,uint256) (runs: 300, μ: 2168781, ~: 2215211)\nLogs:\n  Bound result 1\n  Bound result 6048343\n  Bound result 1750858071\n  Bound result 38176593\n\n[PASS] testFuzz_redeemAlwaysPaysProRata(uint256,bool) (runs: 200, μ: 3371050, ~: 3194234)\nLogs:\n  Bound result 3791\n\n[PASS] testFuzz_residualDumpedThenBoughtInFullDilutesNobodyInCoins(uint256,uint256) (runs: 100, μ: 4767800, ~: 4767884)\nLogs:\n  Bound result 228\n  Bound result 65745656028961577779\n\n[PASS] testFuzz_residualShortFillAtUndisturbedPriceDilutesNobody(uint16,uint256) (runs: 100, μ: 5243626, ~: 5243571)\nLogs:\n  Bound result 2588\n  Bound result 205614647028961577779\n\n[PASS] testFuzz_underQuorumDeliveryIsIgnored(uint16) (runs: 50, μ: 1081658, ~: 1081725)\nLogs:\n  Bound result 2\n\n[PASS] test_answerOtherThanDeliveredIsRefused() (gas: 1126306)\n[PASS] test_callbackFromAnyoneElseIsIgnored() (gas: 1062805)\n[PASS] test_expiredAnswerNeverChangesTheList() (gas: 1456084)\n[PASS] test_floorAboveRequestAlwaysReverts() (gas: 1228176)\n[PASS] test_floorBoundaryIsExact() (gas: 3493331)\n[PASS] test_futureIssuedAnswerIsRefused() (gas: 1093361)\n[PASS] test_owedCoinsAreTheOnlyGapBetweenHeldAndBalance() (gas: 1746449)\n[PASS] test_redeemPaysWhenEveryCoinAndPoolMisbehaves() (gas: 4090794)\n[PASS] test_residualShortFillDoesNotCutSharesBelowFloor() (gas: 4839475)\n[PASS] test_revertedMintsTakeNothing_everyPath() (gas: 9280692)\n[PASS] test_underQuorumSignedAnswerNeverChangesTheList() (gas: 1092421)\n[PASS] test_wrongSignerAndReplayAreRefused() (gas: 1491962)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 515.13ms (2.73s CPU time)\n\nRan 35 tests for test/Imdex5Edges.t.sol:Imdex5EdgesTest\n[PASS] testFuzz_mintBuysExactlyTheRoundedUpShare(uint256) (runs: 512, μ: 1921120, ~: 1920943)\nLogs:\n  Bound result 795000000000000000000\n\n[PASS] testFuzz_mintFirstMintsExactlyTheRest(uint256) (runs: 512, μ: 1009061, ~: 1012937)\nLogs:\n  Bound result 795000000000000000000\n\n[PASS] testFuzz_onOracleResultForAnotherRequestIsIgnored(bytes32,uint16) (runs: 256, μ: 1028841, ~: 1028926)\n[PASS] testFuzz_onOracleResultFromAStrangerChangesNothing(address,bytes32,uint16) (runs: 256, μ: 1075788, ~: 1075934)\n[PASS] testFuzz_redeemNeverPaysAboveProRata(uint256,uint256) (runs: 512, μ: 1563809, ~: 1564057)\nLogs:\n  Bound result 1440455176173218228431\n  Bound result 1212214740792879686770\n\n[PASS] testFuzz_splittingARedeemStaysUnderProRata(uint256,uint256) (runs: 256, μ: 1763443, ~: 1763697)\nLogs:\n  Bound result 41870\n  Bound result 590500998564422435044\n\n[PASS] test_aLaterAskReplacesAnUnsubmittedAnswer() (gas: 1888261)\n[PASS] test_aReenteringCoinCannotReenterAndIsNotPaidTwice() (gas: 2678873)\n[PASS] test_aReenteringCoinCannotReenterMintOrRebalanceFromRedeem() (gas: 3875928)\n[PASS] test_aThinResidualPoolDoesNotStarveAFlooredMint() (gas: 3601998)\n[PASS] test_anUnsubmittedAnswerDoesNotSurviveAFailedLaterAsk() (gas: 1356986)\n[PASS] test_askRevertsWholeWhenTheIntakeRefuses() (gas: 334316)\n[PASS] test_askThresholdIsExactlyThreeQuartersOfAnImd() (gas: 1102053)\n[PASS] test_closeRequestNeedsAnOpenOne() (gas: 1003962)\n[PASS] test_closingARequestDoesNotResetTheInterval() (gas: 1162249)\n[PASS] test_mintCannotBeFreeWhenTheIndexHoldsValue() (gas: 1770169)\n[PASS] test_onOracleResultAfterCloseIsIgnored() (gas: 1098982)\n[PASS] test_onOracleResultWithFiveEntriesFitsTheStipend() (gas: 1144218)\n[PASS] test_oneGasBurningCoinDoesNotBlockRedeemGivenGas() (gas: 1664334)\n[PASS] test_rebalanceBuyMovesAPoolAtMostTwoPercent() (gas: 3712366)\n[PASS] test_rebalanceBuyStopsAtAQuarterWeight() (gas: 4043569)\n[PASS] test_rebalanceDoesNotTrimWithFewerThanFourCoins() (gas: 3278151)\n[PASS] test_rebalanceSellMovesAPoolAtMostTwoPercent() (gas: 3311615)\n[PASS] test_rebalanceTrimsToAQuarterNotBelow() (gas: 3800659)\n[PASS] test_redeemHalfPercentStaysWithRemainingHolders() (gas: 1564922)\n[PASS] test_redeemIdleImdThatCannotBeSentIsOwed() (gas: 1399648)\n[PASS] test_redeemToATokenWithoutCodeBecomesOwedAndClaimableLater() (gas: 1271159)\n[PASS] test_residualsAreRedeemedAndADeadOneBlocksMintWithoutTakingImd() (gas: 5310656)\n[PASS] test_rewardsNeverDipIntoIdleImd() (gas: 2725576)\n[PASS] test_sharesTransferLikeAnyErc20AndMoveNoHoldings() (gas: 1468821)\n[PASS] test_submitAndRebalancePayNoRewardWithoutFees() (gas: 3268731)\n[PASS] test_submitRejectsATamperedAnswerEvenWithAValidSignatureElsewhere() (gas: 1142814)\n[PASS] test_submitRejectsAnAttestationSignedForAnotherChain() (gas: 1444728)\n[PASS] test_submitRejectsAnAttestationSignedForAnotherConsumer() (gas: 1110033)\n[PASS] test_submitRejectsMalformedAnswerBytes() (gas: 1348345)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 515.23ms (1.45s CPU time)\n\nRan 8 tests for test/Imdex5Payments.t.sol:Imdex5PaymentsTest\n[PASS] test_aShortSaleIsPaidInKindAfterTheUnlockAndInImdForTheRest() (gas: 1811675)\n[PASS] test_everyFailureModeIsOwedOnceAndNothingMoves(uint8) (runs: 256, μ: 1642615, ~: 1585547)\nLogs:\n  Bound result 1\n\n[PASS] test_inKindPaymentsMatchTheRedeemRule(uint256,uint256) (runs: 256, μ: 1770840, ~: 1747647)\nLogs:\n  Bound result 7092\n  Bound result 31\n\n[PASS] test_paySelfRefusesEveryoneButTheIndex() (gas: 955891)\n[PASS] test_redeemOfACoinThatMovesFundsAndReturnsFalsePaysOnce() (gas: 1589415)\n[PASS] test_redeemStillWorksWithTheTouchingCoinHeld() (gas: 1809516)\n[PASS] test_redeemToImdInKindOfACoinThatMovesFundsAndReturnsFalsePaysOnce() (gas: 1996642)\n[PASS] test_redeemToImdPaysAnUnsellableCoinInKindAfterTheUnlock() (gas: 3931668)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 515.92ms (955.81ms CPU time)\n\nRan 9 tests for test/Imdex5TaxEverywhere.t.sol:Imdex5TaxEverywhereTest\n[PASS] testFuzz_everyCoinTaxedLifecycle(uint16[5],uint256,uint256,uint256) (runs: 200, μ: 9154396, ~: 9161501)\nLogs:\n  Bound result 522\n  Bound result 4\n  Bound result 0\n  Bound result 1650\n  Bound result 5\n  Bound result 1000000000000000001\n  Bound result 145307749937601156090\n  Bound result 351550328808361567419\n\n[PASS] testFuzz_theMostTaxedCoinDecidesTheMint(uint8,uint16,uint16,uint256) (runs: 200, μ: 2682310, ~: 2710403)\nLogs:\n  Bound result 4\n  Bound result 88\n  Bound result 23\n  Bound result 499000000000000000168\n\n[PASS] test_aCoinTaxingItsOwnSettlementIsNeverSoldAndIsPaidInKind() (gas: 6654013)\n[PASS] test_aCoinTaxingItsOwnSettlementStaysAResidualThroughARebalance() (gas: 7228940)\n[PASS] test_aCoinThatKeepsEverythingFailsALaterMintWholeAndRedeemsStillPay() (gas: 6656942)\n[PASS] test_aCoinThatKeepsEverythingFailsTheFirstMintWhole() (gas: 1465665)\n[PASS] test_aCoinThatKeepsEverythingFailsTheOneWeiMint() (gas: 3419980)\n[PASS] test_aDonationNeitherChangesHeldNorInflatesAMintOrARedeem() (gas: 2485957)\n[PASS] test_taxOnTopOfAPartialFillCreditsTheNetAndMintsThatFraction() (gas: 5248115)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 604.97ms (1.12s CPU time)\n\nRan 7 tests for test/Imdex5TaxedCoin.t.sol:Imdex5TaxedCoinTest\n[PASS] testFuzz_taxedCoinLifecycle(uint256,uint256,uint256) (runs: 256, μ: 7884936, ~: 7891222)\nLogs:\n  Bound result 5000000000000000000\n  Bound result 499000000000000010535\n  Bound result 899000000001800000001\n\n[PASS] test_firstMintCreditsOnlyWhatArrives() (gas: 1254324)\n[PASS] test_firstMintMinOutChecksTheNetReceipt() (gas: 1360017)\n[PASS] test_lastHolderCanReceiveEveryCoinAfterAnImdExit() (gas: 2650034)\n[PASS] test_outstandingOwedIsNotCountedAsANewReceiptAndRemainsClaimable() (gas: 5203128)\n[PASS] test_taxedCoinFullLifecycle() (gas: 7880256)\n[PASS] test_taxedRebalanceBuyCreditsOnlyNewReceipts() (gas: 5610140)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 605.19ms (615.70ms CPU time)\n\nRan 1 test for test/Imdex5TaxEverywhere.t.sol:Imdex5AllCoinsTaxedInvariantTest\n[PASS]\nImdex5AllCoinsTaxedInvariantTest invariants:\n[PASS] invariant_taxed_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_taxed_coinBalancesAreHeldPlusOwed\n[PASS] invariant_taxed_everyHoldingIsListed\n[PASS] invariant_taxed_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_taxed_zeroSupplyMeansNothingHeld\n Imdex5AllCoinsTaxedInvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 209   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 245   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 212   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 432   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 222   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 244   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 205   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 225   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 203   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 205   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 218   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 199   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 194   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 233   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 179   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| TaxKnobs      | setTax           | 209   | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 23574\n  Bound result 39596972668088003129\n  Bound result 159708578027544712484\n  Bound result 1435743504598885\n  Bound result 4046341548624796396\n  Bound result 37241578766611975504\n  Bound result 561081\n  Bound result 1181523227569837\n  Bound result 2882\n  Bound result 4838\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.37s (1.36s CPU time)\n\nRan 1 test for test/Imdex5.invariant.t.sol:Imdex5InvariantTest\n[PASS]\nImdex5InvariantTest invariants:\n[PASS] invariant_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_coinBalancesAreHeldPlusOwed\n[PASS] invariant_feeImdLeavesOnlyForTheOracleAndRewards\n[PASS] invariant_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_listShape\n[PASS] invariant_noFreeMintWhileValueIsHeld\n[PASS] invariant_requestStateIsConsistent\n[PASS] invariant_zeroSupplyMeansNothingHeld\n Imdex5InvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 195   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 207   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | closeRequest     | 200   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverFailure   | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 189   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 196   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 368   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 201   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 196   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 217   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 243   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 195   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 207   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 217   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 186   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 191   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 220   | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000\n  Bound result 250000000000000000\n  Bound result 100\n  Bound result 95077525804709816\n  Bound result 130108602367599074406\n  Bound result 8\n  Bound result 21205\n  Bound result 19784\n  Bound result 48695705407054151679\n  Bound result 691198\n  Bound result 52\n  Bound result 14842461967901804\n  Bound result 128\n  Bound result 5000000000000000000000\n  Bound result 3798186580743\n  Bound result 7203576932671098327118\n  Bound result 2989\n  Bound result 19\n  Bound result 14534\n  Bound result 76800\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.76s (1.75s CPU time)\n\nRan 1 test for test/Imdex5Floor.invariant.t.sol:Imdex5FloorInvariantTest\n[PASS]\nImdex5FloorInvariantTest invariants:\n[PASS] invariant_heldIsTheRealBalance\n[PASS] invariant_mintNeverDilutesListCoinsOrIdle\n[PASS] invariant_noMintBelowTheFloor\n[PASS] invariant_noSharesMeansNothingHeld\n[PASS] invariant_redeemAlwaysPays\n[PASS] invariant_revertedMintMovesNothing\n Imdex5FloorInvariantTest invariants (runs: 128, calls: 5120, reverts: 485)\n\n╭--------------------+-------------+-------+---------+----------╮\n| Contract           | Selector    | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5FloorHandler | claim       | 476   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | mint        | 1355  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | mintFirst   | 471   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | movePrice   | 488   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | rebalanceTo | 485   | 485     | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | redeem      | 461   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | redeemToImd | 452   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | setMaxIn    | 486   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | setTax      | 446   | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 17988\n  Bound result 8000000\n  Bound result 14\n  Bound result 23194\n  Bound result 10000000000000000000\n  Bound result 250000000000000000000\n  Bound result 18\n  Bound result 18274\n  Bound result 795000000000000000000\n  Bound result 10700\n  Bound result 10481\n  Bound result 21000000000000000\n  Bound result 7723\n  Bound result 1250000000000000000\n  Bound result 21295\n  Bound result 3600\n  Bound result 302\n  Bound result 935410\n  Bound result 128309\n  Bound result 737\n  Bound result 668914790000187751563860\n  Bound result 143\n  Bound result 3700\n  Bound result 41593\n  Bound result 11697\n  Bound result 131\n  Bound result 1657574480\n  Bound result 12345\n  Bound result 171743644\n  Bound result 97\n  Bound result 999906\n  Bound result 56504\n  Bound result 19681\n  Bound result 9811\n  Bound result 808\n  Bound result 86400\n  Bound result 18376\n  Bound result 14593\n  Bound result 3703\n  Bound result 1000\n  Bound result 776161\n  Bound result 9\n  Bound result 1961489024083263169695\n  Bound result 9\n  Bound result 385109759167368303030\n  Bound result 7935\n  Bound result 4294967295\n  Bound result 5103\n  Bound result 5460\n  Bound result 3751\n  Bound result 1325303303857141750390\n  Bound result 628057317341387608512442\n  Bound result 385\n  Bound result 395037\n  Bound result 2591\n  Bound result 750000000000000000\n  Bound result 4244\n  Bound result 104659385212754494\n  Bound result 5475\n  Bound result 352710984976227550984\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.41s (2.40s CPU time)\n\nRan 1 test for test/Imdex5.invariant.t.sol:Imdex5TaxedCoinInvariantTest\n[PASS]\nImdex5TaxedCoinInvariantTest invariants:\n[PASS] invariant_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_coinBalancesAreHeldPlusOwed\n[PASS] invariant_feeImdLeavesOnlyForTheOracleAndRewards\n[PASS] invariant_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_listShape\n[PASS] invariant_noFreeMintWhileValueIsHeld\n[PASS] invariant_requestStateIsConsistent\n[PASS] invariant_zeroSupplyMeansNothingHeld\n Imdex5TaxedCoinInvariantTest invariants (runs: 256, calls: 128000, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 6636  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 6695  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | closeRequest     | 6752  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverFailure   | 6801  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 6714  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 6680  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 13445 | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 6752  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 6685  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 6897  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 6601  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 6664  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 6713  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 6671  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 6830  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 6860  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 6729  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 6875  | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5000\n  Bound result 10000\n  Bound result 796000000000000000000\n  Bound result 1\n  Bound result 5\n  Bound result 2500\n  Bound result 14986\n  Bound result 900\n  Bound result 4442\n  Bound result 259200\n  Bound result 9363\n  Bound result 10100\n  Bound result 97\n  Bound result 100000000000000000007\n  Bound result 278400\n  Bound result 7694\n  Bound result 498\n  Bound result 19\n  Bound result 200\n  Bound result 995\n  Bound result 10205\n  Bound result 2253\n  Bound result 2375006463929377708838\n  Bound result 7092\n  Bound result 5173\n  Bound result 16297\n  Bound result 1000000\n  Bound result 13731\n  Bound result 17\n  Bound result 5000000000000000000\n  Bound result 48502129467053274668\n  Bound result 14789\n  Bound result 409601\n  Bound result 8373\n  Bound result 1250000000000000000\n  Bound result 1\n  Bound result 52\n  Bound result 21303\n  Bound result 19005\n  Bound result 11934\n  Bound result 50000000000000000000\n  Bound result 19529035837012967424\n  Bound result 1\n  Bound result 21440\n  Bound result 244124153722729520859\n  Bound result 15\n  Bound result 8000000\n  Bound result 400\n  Bound result 16256747033301207744\n  Bound result 4295128739\n  Bound result 1250000000000000000\n  Bound result 116\n  Bound result 752236290749736908835\n  Bound result 4197\n  Bound result 3947352266\n  Bound result 1407547839\n  Bound result 18267\n  Bound result 227787\n  Bound result 14909361\n  Bound result 1584039999992075417870\n  Bound result 3651981675899630272706\n  Bound result 18432581510183677324\n  Bound result 6060183457451234540\n  Bound result 40\n  Bound result 192161677547341\n  Bound result 179200\n  Bound result 383229\n  Bound result 3000\n  Bound result 1600674703329883424600\n  Bound result 22097\n  Bound result 842404886189632279074\n  Bound result 1561568134220081\n  Bound result 1835002550\n  Bound result 3914\n  Bound result 995000000000000000000\n  Bound result 543524713\n  Bound result 3\n  Bound result 19770\n  Bound result 835154038208379491092\n  Bound result 12\n  Bound result 10001\n  Bound result 9000000000000000000000\n  Bound result 95569915997759\n  Bound result 3640233672442416644809\n  Bound result 14452\n  Bound result 900512285242223348\n  Bound result 995\n  Bound result 300000000000000000000\n  Bound result 3998064749972073790\n  Bound result 4243\n  Bound result 9999\n  Bound result 1000000\n  Bound result 3108\n  Bound result 17740\n  Bound result 1464\n  Bound result 2564\n  Bound result 46789382\n  Bound result 5057564185943467425593\n  Bound result 300000\n  Bound result 4784\n  Bound result 1362988038691064713533\n  Bound result 37000000000000000000\n  Bound result 5211\n  Bound result 409600\n  Bound result 701\n  Bound result 691200\n  Bound result 1175\n  Bound result 6371496613749010781523\n  Bound result 34727578791472318966\n  Bound result 7723537686814318915\n  Bound result 9\n  Bound result 845000000000000000000\n  Bound result 650\n  Bound result 12500\n  Bound result 4485\n  Bound result 4154238503127154614\n  Bound result 105\n  Bound result 20954\n  Bound result 4600\n  Bound result 48\n  Bound result 1461034992436679982050\n  Bound result 3914\n  Bound result 1269580902088475\n  Bound result 2339\n  Bound result 90000000000000000000\n  Bound result 1101262383249352959443\n  Bound result 59432570749\n  Bound result 3530\n  Bound result 665599\n  Bound result 189000000000000000000\n  Bound result 467983\n  Bound result 30720964162442775370\n  Bound result 18\n  Bound result 16\n  Bound result 9900\n  Bound result 435200\n  Bound result 8471\n  Bound result 64555113031370214551\n  Bound result 160768\n  Bound result 3914\n  Bound result 1107\n  Bound result 29972353795135207118\n  Bound result 10321\n  Bound result 22331\n  Bound result 3988822378723970342\n  Bound result 2838\n  Bound result 2462\n  Bound result 3603\n  Bound result 2103240212011416401483\n  Bound result 719098455508\n  Bound result 8\n  Bound result 206823879501917075251\n  Bound result 390607565778990750519\n  Bound result 1089\n  Bound result 10205\n  Bound result 5747\n  Bound result 601898553109652243912\n  Bound result 404098524\n  Bound result 401500446371068597093\n  Bound result 20058\n  Bound result 18704\n  Bound result 13223\n  Bound result 87948612319878036378\n  Bound result 2709983190802854131546\n  Bound result 24\n  Bound result 911671916125587023695\n  Bound result 587\n  Bound result 512669\n  Bound result 5\n  Bound result 24576\n  Bound result 13470\n  Bound result 17726\n  Bound result 13659\n  Bound result 5\n  Bound result 1000\n  Bound result 48\n  Bound result 81795649844130935261\n  Bound result 2075\n  Bound result 37000000000000000000\n  Bound result 9264\n  Bound result 4215\n  Bound result 45005851881584441735\n  Bound result 659919\n  Bound result 227911190\n  Bound result 1464\n  Bound result 6508073461624214398\n  Bound result 18\n  Bound result 3349\n  Bound result 3000000\n  Bound result 24\n  Bound result 179200\n  Bound result 298500000000000000000\n  Bound result 7395834510040258660486\n  Bound result 16483\n  Bound result 2\n  Bound result 9118219222434214432408\n  Bound result 4767\n  Bound result 16400\n  Bound result 14535\n  Bound result 7051\n  Bound result 98000000000000000000\n  Bound result 61891407081633746711\n  Bound result 4501777708634087657259\n  Bound result 13862\n  Bound result 200000\n  Bound result 19582\n  Bound result 19508\n  Bound result 18555\n  Bound result 49748743718592964825\n  Bound result 150\n  Bound result 789\n  Bound result 3561530411373071134\n  Bound result 23197\n  Bound result 10868998138528\n  Bound result 8537\n  Bound result 500\n  Bound result 2303470865898793446900\n  Bound result 371636862\n  Bound result 50000000000000000000\n  Bound result 5371\n  Bound result 15911989805923296874\n  Bound result 11\n  Bound result 10796\n  Bound result 112404\n  Bound result 213234\n  Bound result 9426\n  Bound result 13759\n  Bound result 165\n  Bound result 614400\n  Bound result 166610407825966\n  Bound result 6402355717664980086660\n  Bound result 2000000000000000000\n  Bound result 1000000\n  Bound result 326689197493955373324\n  Bound result 1850065384481930257464\n  Bound result 10\n  Bound result 371636862\n  Bound result 100000000000000000007\n  Bound result 172609\n  Bound result 1338\n  Bound result 7\n  Bound result 900\n  Bound result 14322087365428442922\n  Bound result 3065004149\n  Bound result 11902\n  Bound result 4197524999788880987176\n  Bound result 40\n  Bound result 33236839714825751583\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 53.52s (53.51s CPU time)\n\nRan 19 test suites in 53.53s (64.33s CPU time): 187 tests passed, 0 failed, 7 skipped (194 total tests)\n","passed":true},{"durationMs":55,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Imdex5.approve(address,uint256)\",\"Imdex5.ask()\",\"Imdex5.claim(address)\",\"Imdex5.closeRequest()\",\"Imdex5.fund(uint256)\",\"Imdex5.mint(uint256,uint256,uint256)\",\"Imdex5.mintFirst(uint256,uint256[])\",\"Imdex5.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Imdex5.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Imdex5.paySelf(address,address,uint256)\",\"Imdex5.rebalance()\",\"Imdex5.redeem(uint256)\",\"Imdex5.redeemToImd(uint256,uint256)\",\"Imdex5.submit((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Imdex5.swapSelf(address,address,bool,uint256,bool,bool)\",\"Imdex5.transfer(address,uint256)\",\"Imdex5.transferFrom(address,address,uint256)\",\"Imdex5.unlockCallback(bytes)\"],\"files\":{\".gitignore\":2,\"ADAPTATION.md\":436,\"README.md\":404,\"THREAT_MODEL.md\":52,\"foundry.toml\":19,\"launch.json\":10,\"src/Imdex5.sol\":703,\"src/Interfaces.sol\":61,\"src/OracleAttestation.sol\":221,\"test/Fix3.fork.t.sol\":97,\"test/Fix3Floor.fork.t.sol\":67,\"test/Fix3Rebalance.fork.t.sol\":151,\"test/Imdex5.invariant.t.sol\":544,\"test/Imdex5.t.sol\":1070,\"test/Imdex5Base.sol\":175,\"test/Imdex5DocumentedLimits.t.sol\":313,\"test/Imdex5Edges.t.sol\":741,\"test/Imdex5Floor.invariant.t.sol\":335,\"test/Imdex5MustAttack.t.sol\":596,\"test/Imdex5Payments.t.sol\":242,\"test/Imdex5RebalanceNothingOut.t.sol\":106,\"test/Imdex5ResidualSpot.t.sol\":182,\"test/Imdex5Revised.t.sol\":522,\"test/Imdex5ShortFill.t.sol\":226,\"test/Imdex5TaxEverywhere.t.sol\":529,\"test/Imdex5TaxedCoin.t.sol\":252,\"test/OracleConsumerConformance.t.sol\":74,\"test/mocks/AttackMocks.sol\":85,\"test/mocks/Mocks.sol\":339,\"test/mocks/PoolTaxERC20.sol\":25,\"test/mocks/TaxERC20.sol\":36},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":5165,"exitCode":0,"name":"slither","output":"[high/medium] reentrancy-balance at src/Imdex5.sol:390: Reentrancy in Imdex5._mintFirst(address,uint256,uint256[]) (src/Imdex5.sol#390-409):\n[high/medium] reentrancy-balance at src/Imdex5.sol:411: Reentrancy in Imdex5._mintMore(address,uint256,uint256,uint256) (src/Imdex5.sol#411-466):\n[high/medium] reentrancy-balance at src/Imdex5.sol:411: Reentrancy in Imdex5._mintMore(address,uint256,uint256,uint256) (src/Imdex5.sol#411-466):\n[medium/high] incorrect-equality at src/Imdex5.sol:470: Imdex5._redeemToImd(address,uint256,uint256,uint256) (src/Imdex5.sol#470-511) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Imdex5.sol:390: Imdex5._mintFirst(address,uint256,uint256[]) (src/Imdex5.sol#390-409) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Imdex5.sol:369: Imdex5.swapSelf(address,address,bool,uint256,bool,bool) (src/Imdex5.sol#369-387) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Imdex5.sol:644: Imdex5._amountValue(address,uint256,uint256,Math.Rounding) (src/Imdex5.sol#644-652) uses a dangerous strict equality:\n[medium/high] incorrect-equality at src/Imdex5.sol:411: Imdex5._mintMore(address,uint256,uint256,uint256) (src/Imdex5.sol#411-466) uses a dangerous strict equality:\n[medium/medium] reentrancy-no-eth at src/Imdex5.sol:513: Reentrancy in Imdex5._rebalance() (src/Imdex5.sol#513-559):\n[medium/medium] reentrancy-no-eth at src/Imdex5.sol:205: Reentrancy in Imdex5.redeem(uint256) (src/Imdex5.sol#205-226):\n[medium/medium] reentrancy-no-eth at src/Imdex5.sol:513: Reentrancy in Imdex5._rebalance() (src/Imdex5.sol#513-559):\n[medium/medium] reentrancy-no-eth at src/Imdex5.sol:390: Reentrancy in Imdex5._mintFirst(address,uint256,uint256[]) (src/Imdex5.sol#390-409):\n[medium/medium] reentrancy-no-eth at src/Imdex5.sol:513: Reentrancy in Imdex5._rebalance() (src/Imdex5.sol#513-559):\n[medium/medium] reentrancy-no-eth at src/Imdex5.sol:470: Reentrancy in Imdex5._redeemToImd(address,uint256,uint256,uint256) (src/Imdex5.sol#470-511):\n[medium/medium] uninitialized-local at src/Imdex5.sol:692: Imdex5._lookup(uint64).registry (src/Imdex5.sol#692) is a local variable never initialized\n[medium/medium] unused-return at src/Imdex5.sol:194: Imdex5.mint(uint256,uint256,uint256) (src/Imdex5.sol#194-200) ignores return value by IPoolManager(POOL_MANAGER).unlock(abi.encode(Op.Mint,msg.sender,shares,maxImdIn,minShares,new uint256[](0))) (src/Imdex5.sol#198-199)\n[medium/medium] unused-return at src/Imdex5.sol:346: Imdex5.rebalance() (src/Imdex5.sol#346-351) ignores return value by IPoolManager(POOL_MANAGER).unlock(abi.encode(Op.Rebalance,msg.sender,0,0,0,new uint256[](0))) (src/Imdex5.sol#348)\n[medium/medium] unused-return at src/Imdex5.sol:584: Imdex5._swap(address,address,bool,uint256,bool,bool) (src/Imdex5.sol#584-625) ignores return value by IPoolManager(POOL_MANAGER).settle() (src/Imdex5.sol#615)\n[medium/medium] unused-return at src/Imdex5.sol:181: Imdex5.mintFirst(uint256,uint256[]) (src/Imdex5.sol#181-187) ignores return value by IPoolManager(POOL_MANAGER).unlock(abi.encode(Op.MintFirst,msg.sender,imdIn,0,0,minOut)) (src/Imdex5.sol#186)\n[low/medium] calls-loop at src/Imdex5.sol:584: Imdex5._swap(address,address,bool,uint256,bool,bool) (src/Imdex5.sol#584-625) has external calls inside a loop: before = IERC20(outCur).balanceOf(address(this)) (src/Imdex5.sol#618)\n[low/medium] calls-loop at src/Imdex5.sol:691: Imdex5._lookup(uint64) (src/Imdex5.sol#691-702) has external calls inside a loop: artifacts = registry.artifactsOf(launch) (src/Imdex5.sol#696)\n[low/medium] calls-loop at src/Imdex5.sol:411: Imdex5._mintMore(address,uint256,uint256,uint256) (src/Imdex5.sol#411-466) has external calls inside a loop: (rIn,rOut) = this.swapSelf{gas: SWAP_GAS}(coin.token,coin.hook,true,need,true,false) (src/Imdex5.sol#431-439)\n[low/medium] calls-loop at src/Imdex5.sol:584: Imdex5._swap(address,address,bool,uint256,bool,bool) (src/Imdex5.sol#584-625) has external calls inside a loop: amountOut = IERC20(outCur).balanceOf(address(this)) - before (src/Imdex5.sol#620)\n[low/medium] calls-loop at src/Imdex5.sol:584: Imdex5._swap(address,address,bool,uint256,bool,bool) (src/Imdex5.sol#584-625) has external calls inside a loop: IPoolManager(POOL_MANAGER).sync(inCur) (src/Imdex5.sol#613)\n[low/medium] calls-loop at src/Imdex5.sol:691: Imdex5._lookup(uint64) (src/Imdex5.sol#691-702) has external calls inside a loop: REGISTRY_A.isRecorded(launch) (src/Imdex5.sol#693)\n[low/medium] calls-loop at src/Imdex5.sol:632: Imdex5._sqrtPrice(IPoolManager.PoolKey) (src/Imdex5.sol#632-635) has external calls inside a loop: uint256(uint160(uint256(IPoolManager(POOL_MANAGER).extsload(slot)))) (src/Imdex5.sol#634)\n[low/medium] calls-loop at src/Imdex5.sol:584: Imdex5._swap(address,address,bool,uint256,bool,bool) (src/Imdex5.sol#584-625) has external calls inside a loop: IPoolManager(POOL_MANAGER).exttload(NONZERO_DELTA_COUNT_SLOT) != 0 (src/Imdex5.sol#623)\n[low/medium] calls-loop at src/Imdex5.sol:584: Imdex5._swap(address,address,bool,uint256,bool,bool) (src/Imdex5.sol#584-625) has external calls inside a loop: delta = IPoolManager(POOL_MANAGER).swap(key,IPoolManager.SwapParams(zeroForOne,- SafeCast.toInt256(amount),limit),) (src/Imdex5.sol#596-603)\n[low/medium] calls-loop at src/Imdex5.sol:573: Imdex5._tryBuy(Imdex5.Coin,uint256) (src/Imdex5.sol#573-582) has external calls inside a loop: (amountIn,out) = this.swapSelf{gas: SWAP_GAS}(coin.token,coin.hook,true,imdAmount,false,true) (src/Imdex5.sol#574-581)\n[low/medium] calls-loop at src/Imdex5.sol:674: Imdex5._pay(address,address,uint256) (src/Imdex5.sol#674-682) has external calls inside a loop: this.paySelf{gas: PAY_GAS}(token,to,amount) (src/Imdex5.sol#676-681)\n[low/medium] calls-loop at src/Imdex5.sol:584: Imdex5._swap(address,address,bool,uint256,bool,bool) (src/Imdex5.sol#584-625) has external calls inside a loop: delta = IPoolManager(POOL_MANAGER).swap(key,IPoolManager.SwapParams(zeroForOne,SafeCast.toInt256(amount),limit),) (src/Imdex5.sol#596-603)\n[low/medium] calls-loop at src/Imdex5.sol:562: Imdex5._trySell(Imdex5.Coin,uint256) (src/Imdex5.sol#562-571) has external calls inside a loop: (amountIn,out) = this.swapSelf{gas: SWAP_GAS}(coin.token,coin.hook,false,amount,false,true) (src/Imdex5.sol#563-570)\n[low/medium] calls-loop at src/Imdex5.sol:584: Imdex5._swap(address,address,bool,uint256,bool,bool) (src/Imdex5.sol#584-625) has external calls inside a loop: IPoolManager(POOL_MANAGER).settle() (src/Imdex5.sol#615)\n[low/medium] calls-loop at src/Imdex5.sol:584: Imdex5._swap(address,address,bool,uint256,bool,bool) (src/Imdex5.sol#584-625) has external calls inside a loop: IPoolManager(POOL_MANAGER).take(outCur,address(this),amountOut) (src/Imdex5.sol#619)\n[low/medium] calls-loop at src/Imdex5.sol:674: Imdex5._pay(address,address,uint256) (src/Imdex5.sol#674-682) has external calls inside a loop: this.paySelf{gas: PAY_GAS}(token,to,amount) (src/Imdex5.sol#676-681)\n[low/medium] calls-loop at src/Imdex5.sol:470: Imdex5._redeemToImd(address,uint256,uint256,uint256) (src/Imdex5.sol#470-511) has external calls inside a loop: (amountIn,sold) = this.swapSelf{gas: SWAP_GAS}(coin.token,coin.hook,false,amount,false,false) (src/Imdex5.sol#484-491)\n[low/medium] calls-loop at src/Imdex5.sol:691: Imdex5._lookup(uint64) (src/Imdex5.sol#691-702) has external calls inside a loop: REGISTRY_B.isRecorded(launch) (src/Imdex5.sol#694)\n[low/medium] reentrancy-benign at src/Imdex5.sol:674: Reentrancy in Imdex5._pay(address,address,uint256) (src/Imdex5.sol#674-682):\n[low/medium] reentrancy-benign at src/Imdex5.sol:513: Reentrancy in Imdex5._rebalance() (src/Imdex5.sol#513-559):\n[low/medium] reentrancy-benign at src/Imdex5.sol:573: Reentrancy in Imdex5._tryBuy(Imdex5.Coin,uint256) (src/Imdex5.sol#573-582):\n[low/medium] reentrancy-benign at src/Imdex5.sol:346: Reentrancy in Imdex5.rebalance() (src/Imdex5.sol#346-351):\n[low/medium] reentrancy-benign at src/Imdex5.sol:562: Reentrancy in Imdex5._trySell(Imdex5.Coin,uint256) (src/Imdex5.sol#562-571):\n[low/medium] reentrancy-benign at src/Imdex5.sol:255: Reentrancy in Imdex5.ask() (src/Imdex5.sol#255-280):\n[low/medium] reentrancy-benign at src/Imdex5.sol:470: Reentrancy in Imdex5._redeemToImd(address,uint256,uint256,uint256) (src/Imdex5.sol#470-511):\n[low/medium] reentrancy-events at src/Imdex5.sol:584: Reentrancy in Imdex5._swap(address,address,bool,uint256,bool,bool) (src/Imdex5.sol#584-625):\n[low/medium] reentrancy-events at src/Imdex5.sol:573: Reentrancy in Imdex5._tryBuy(Imdex5.Coin,uint256) (src/Imdex5.sol#573-582):\n[low/medium] reentrancy-events at src/Imdex5.sol:513: Reentrancy in Imdex5._rebalance() (src/Imdex5.sol#513-559):\n[low/medium] reentrancy-events at src/Imdex5.sol:562: Reentrancy in Imdex5._trySell(Imdex5.Coin,uint256) (src/Imdex5.sol#562-571):\n[low/medium] reentrancy-events at src/Imdex5.sol:470: Reentrancy in Imdex5._redeemToImd(address,uint256,uint256,uint256) (src/Imdex5.sol#470-511):\n[low/medium] reentrancy-events at src/Imdex5.sol:513: Reentrancy in Imdex5._rebalance() (src/Imdex5.sol#513-559):\n[low/medium] timestamp at src/Imdex5.sol:255: Imdex5.ask() (src/Imdex5.sol#255-280) uses timestamp for comparisons\n[low/medium] timestamp at src/Imdex5.sol:308: Imdex5.closeRequest() (src/Imdex5.sol#308-314) uses timestamp for comparisons\n[low/medium] timestamp at src/Imdex5.sol:284: Imdex5.onOracleResult(bytes32,OracleAttestation.Attestation,bytes) (src/Imdex5.sol#284-295) uses timestamp for comparisons\n[low/medium] timestamp at src/Imdex5.sol:298: Imdex5.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes) (src/Imdex5.sol#298-305) uses timestamp for comparisons\n[low/medium] timestamp at src/OracleAttestation.sol:157: OracleAttestationConsumer._verifyAttestation(OracleAttestation.Attestation,bytes) (src/OracleAttestation.sol#157-165) uses timestamp for comparisons","passed":true},{"durationMs":588,"exitCode":0,"name":"aderyn","output":"[high] abi-encode-packed-hash-collision at src/Imdex5.sol:159: `abi.encodePacked()` Hash Collision\n[high] reentrancy-state-change at src/Imdex5.sol:267: Reentrancy: State change after external call\n[low] costly-loop at src/Imdex5.sol:212: Costly operations inside loop (12 places)\n[low] internal-function-used-once at src/OracleAttestation.sol:210: Internal Function Used Only Once\n[low] large-numeric-literal at src/Imdex5.sol:36: Large Numeric Literal (3 places)\n[low] require-revert-in-loop at src/Imdex5.sol:330: Loop Contains `require`/`revert` (4 places)\n[low] unchecked-return at src/Imdex5.sol:186: Unchecked Return (4 places)\n[low] unused-import at src/Imdex5.sol:7: Unused Import","passed":true},{"durationMs":8045,"exitCode":0,"name":"proof eade2f074ce0","output":"Compiling 53 files with Solc 0.8.26\nSolc 0.8.26 finished in 7.51s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/Imdex5.sol:644:5:\n    |\n644 |     function _amountValue(address token, uint256 amount, uint256 sqrtP, Math.Rounding r)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n\nRan 1 test for test/imd-proof-325e0d55/Proof_eade2f074ce0.t.sol:FalseReturnProofTest\n[PASS] test_redeemAndClaimMustNotPayTheSameEntitlementTwice() (gas: 8092389)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.30ms (1.02ms CPU time)\n\nRan 1 test suite in 2.73ms (1.30ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true},{"durationMs":4683,"exitCode":0,"name":"proof e3e0815cfcf5","output":"2026-10-21T06:33:39.569888Z ERROR foundry_compilers_artifacts_solc::sources: error=\"/tmp/imd-verify-cj1vWV/repo/test/imd-proof-325e0d55/Proof_eade2f074ce0.t.sol\": No such file or directory (os error 2)\nCompiling 1 files with Solc 0.8.26\nSolc 0.8.26 finished in 4.14s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/Imdex5.sol:644:5:\n    |\n644 |     function _amountValue(address token, uint256 amount, uint256 sqrtP, Math.Rounding r)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\n\nRan 1 test for test/imd-proof-55050ded/Proof_e3e0815cfcf5.t.sol:RedeemToImdBrickProofTest\n[PASS] test_redeemToImdPaysInKindWhenAHeldCoinTouchesTheManager() (gas: 1875135)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.77ms (822.90µs CPU time)\n\nRan 1 test suite in 2.45ms (1.77ms CPU time): 1 tests passed, 0 failed, 0 skipped (1 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6312bcd748d9b43d0fef0e4edcea5047f88643e9efec4897103a63678e088630","verifiedTreeHash":"30b0290eecf2fa19d17c8476c516c9c7ec349e64","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":140115,"exitCode":0,"name":"build","output":"Compiling 72 files with Solc 0.8.26\nSolc 0.8.26 finished in 139.99s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/Imdex5.sol:644:5:\n    |\n644 |     function _amountValue(address token, uint256 amount, uint256 sqrtP, Math.Rounding r)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Fix3.fork.t.sol:76:5:\n   |\n76 |     function _checkBacked(Imdex5.Coin[] memory cs, string memory when) internal {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Fix3Rebalance.fork.t.sol:44:5:\n   |\n44 |     function _backed(string memory when) internal {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":62546,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/Fix3Rebalance.fork.t.sol:Fix3RebalanceForkTest\n[SKIP] test_dropTheTaxedCoin_fourRemain() (gas: 0)\n[SKIP] test_reorderSameFive() (gas: 0)\n[SKIP] test_shrinkToThree_bigFund() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 662.21µs (922.76µs CPU time)\n\nRan 1 test for test/Fix3Floor.fork.t.sol:Fix3FloorForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 651.14µs (0.00ns CPU time)\n\nRan 3 tests for test/Fix3.fork.t.sol:Fix3ForkTest\n[SKIP] test_fixed_with_1000_IMD() (gas: 0)\n[SKIP] test_fixed_with_100_IMD() (gas: 0)\n[SKIP] test_fixed_with_10_IMD() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 918.95µs (1.41ms CPU time)\n\nRan 2 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_callbackSelectorIsCanonical() (gas: 4542)\n[PASS] test_digestMatchesTheProtocol() (gas: 13361)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 957.95µs (81.54µs CPU time)\n\nRan 8 tests for test/Imdex5DocumentedLimits.t.sol:Imdex5DocumentedLimitsTest\n[PASS] test_aClosedRequestCostsTheWholeWeek() (gas: 1161934)\n[PASS] test_aDeadListCoinIsNotDroppedByARebalanceAndBlocksMintUntilItsPoolWorks() (gas: 6626330)\n[PASS] test_aFailedRequestCostsTheWholeWeek() (gas: 1239868)\n[PASS] test_aFailedRequestLeavesEveryImdAccounted() (gas: 3597193)\n[PASS] test_aLeaverDumpedBeforeARebalanceIsSoldAtTheDumpedPriceAndBooked() (gas: 5366763)\n[PASS] test_aLimitedSaleSellsAboutOnePercentOfTheReservePerRebalance() (gas: 5830453)\n[PASS] test_aListOfFewerThanFourCoinsLeavesTheRestIdle() (gas: 3877093)\n[PASS] test_aPoolMovedBeforeARebalanceIsBoughtAtTheMovedPriceAndBooked() (gas: 4775509)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 38.62ms (38.02ms CPU time)\n\nRan 9 tests for test/Imdex5ShortFill.t.sol:Imdex5ShortFillTest\n[PASS] testFuzz_mintUsesTheLeastFilledCoinAndChargesEveryBuy(uint256,uint16[5]) (runs: 256, μ: 1634780, ~: 1643440)\nLogs:\n  Bound result 499000370204935467971\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 4510\n  Bound result 312\n\n[PASS] test_fullFillPassesFloor() (gas: 743937)\n[PASS] test_mintRevertsAndRollsBackEarlierBuysWhenACoinDeliversZero() (gas: 1288533)\n[PASS] test_mintRevertsWhenANonzeroFillRoundsSharesToZero() (gas: 1198010)\n[PASS] test_shortFillChargesIdleImdForTheSharesIssuedOnly() (gas: 2607317)\n[PASS] test_shortFillMintsTheDeliveredFraction() (gas: 869879)\n[PASS] test_shortFillStillEnforcesMaxImdInAndRollsBack() (gas: 1742002)\n[PASS] test_sliverFillBelowFloorRevertsAndRollsBack() (gas: 1194221)\n[PASS] test_sliverFillWithoutFloorIssuesASliver() (gas: 1288456)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 270.61ms (274.69ms CPU time)\n\nRan 8 tests for test/Imdex5Payments.t.sol:Imdex5PaymentsTest\n[PASS] test_aShortSaleIsPaidInKindAfterTheUnlockAndInImdForTheRest() (gas: 1811675)\n[PASS] test_everyFailureModeIsOwedOnceAndNothingMoves(uint8) (runs: 256, μ: 1642615, ~: 1585547)\nLogs:\n  Bound result 4\n\n[PASS] test_inKindPaymentsMatchTheRedeemRule(uint256,uint256) (runs: 256, μ: 1770402, ~: 1747586)\nLogs:\n  Bound result 41870\n  Bound result 24\n\n[PASS] test_paySelfRefusesEveryoneButTheIndex() (gas: 955891)\n[PASS] test_redeemOfACoinThatMovesFundsAndReturnsFalsePaysOnce() (gas: 1589415)\n[PASS] test_redeemStillWorksWithTheTouchingCoinHeld() (gas: 1809516)\n[PASS] test_redeemToImdInKindOfACoinThatMovesFundsAndReturnsFalsePaysOnce() (gas: 1996642)\n[PASS] test_redeemToImdPaysAnUnsellableCoinInKindAfterTheUnlock() (gas: 3931668)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 602.60ms (531.70ms CPU time)\n\nRan 6 tests for test/Imdex5SwapBoundaries.t.sol:Imdex5SwapBoundariesTest\n[PASS] testFuzz_rebalanceFillThreshold(bool,bool,uint256,uint256) (runs: 256, μ: 4796081, ~: 5034494)\nLogs:\n  Bound result 97000000000000000000\n  Bound result 771234571812062352090\n\n[PASS] testFuzz_zeroOutputSaleAndMinimumRollback(bool,uint256) (runs: 128, μ: 4832665, ~: 4763330)\nLogs:\n  Bound result 994000000000002592001\n\n[PASS] test_buyBoundary_coinAfterImd() (gas: 9423070)\n[PASS] test_buyBoundary_coinBeforeImd() (gas: 9420485)\n[PASS] test_sellBoundary_coinAfterImd() (gas: 9438555)\n[PASS] test_sellBoundary_coinBeforeImd() (gas: 9451763)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 604.70ms (932.12ms CPU time)\n\nRan 48 tests for test/Imdex5.t.sol:Imdex5Test\n[PASS] testFuzz_mintThenRedeemNeverPaysMoreThanDeposited(uint256,uint256) (runs: 256, μ: 2438969, ~: 2421627)\nLogs:\n  Bound result 4999000000000000041871\n  Bound result 1469700996642154189164\n\n[PASS] test_askPaysIntakeAndCaller() (gas: 1138091)\n[PASS] test_askReturnsWithoutFees() (gas: 155267)\n[PASS] test_askSevenDayInterval() (gas: 1190059)\n[PASS] test_bodyIsTheJsonTheBriefDescribes() (gas: 30576)\n[PASS] test_closeRequestAfterTwoDays() (gas: 1027427)\n[PASS] test_deployment() (gas: 94874)\n[PASS] test_feeImdOnlyLeavesForOracleAndRewards() (gas: 4967725)\n[PASS] test_fundAddsToFeeImd() (gas: 147803)\n[PASS] test_hookCannotReenter() (gas: 5175609)\n[PASS] test_mintBuysProportionallyAndRefunds() (gas: 1833087)\n[PASS] test_mintFirstBuysEqualPartsAndTakesFee() (gas: 1105437)\n[PASS] test_mintFirstKeepsWhatAPoolCouldNotTakeAsIdle() (gas: 1330484)\n[PASS] test_mintFirstRequiresZeroSupplyAndRightLength() (gas: 1023353)\n[PASS] test_mintFirstRevertsOnMinOut() (gas: 728115)\n[PASS] test_mintFirstRevertsWhenABuyFails() (gas: 815588)\n[PASS] test_mintFirstRevertsWhenABuyReturnsNothing() (gas: 2116051)\n[PASS] test_mintNeverIssuesSharesForNothing() (gas: 328111)\n[PASS] test_mintRequiresSupply() (gas: 40065)\n[PASS] test_mintRevertsOverMaxImdIn() (gas: 1735646)\n[PASS] test_mintRevertsWhenABuyFailsButScalesANonzeroShortFill() (gas: 2279081)\n[PASS] test_mintRoundsAgainstTheMinter() (gas: 1714378)\n[PASS] test_onOracleFailureOnlyFromIntake() (gas: 1065204)\n[PASS] test_onOracleResultStoresOnlyTheOpenRequestFromTheIntake() (gas: 1303085)\n[PASS] test_rebalanceNeedsAList() (gas: 41343)\n[PASS] test_rebalanceSellsAdoptsAndBuys() (gas: 5320154)\n[PASS] test_rebalanceSkipsADeadPool() (gas: 2992072)\n[PASS] test_rebalanceSkipsAHookThatLeavesAnUnsettledDelta() (gas: 3909146)\n[PASS] test_rebalanceSurvivesAHookThatBurnsAllGas() (gas: 5526604)\n[PASS] test_rebalanceTrimsAHoldingOverAQuarter() (gas: 3486749)\n[PASS] test_rebalanceWithNothingHeld() (gas: 2267403)\n[PASS] test_redeemCannotBeBlockedByACoin() (gas: 1581524)\n[PASS] test_redeemLastSharesPaysEverything() (gas: 2150587)\n[PASS] test_redeemPaysInKindLessHalfPercent() (gas: 1353150)\n[PASS] test_redeemRejectsZeroAndTooMany() (gas: 987406)\n[PASS] test_redeemSurvivesCoinsThatBurnAllGas() (gas: 4354830)\n[PASS] test_redeemToImdChargesTheFeeWhileOthersHold() (gas: 1676317)\n[PASS] test_redeemToImdPaysAShortFillInKindLessHalfPercent() (gas: 1789016)\n[PASS] test_redeemToImdPaysInKindWhenASaleFails() (gas: 2989586)\n[PASS] test_redeemToImdRevertsBelowMinOut() (gas: 1788250)\n[PASS] test_redeemToImdSellsAndTheLastHolderPaysNoFee() (gas: 1759494)\n[PASS] test_redeemToImdSurvivesAHookThatBurnsGas() (gas: 2467168)\n[PASS] test_submitRejectsASignedAttestationWithoutQuorum() (gas: 1128965)\n[PASS] test_submitRejectsAnExpiredAttestation() (gas: 1089679)\n[PASS] test_submitRejectsBadLists() (gas: 4719084)\n[PASS] test_submitRejectsWrongAnswerAndForgedSignature() (gas: 1646440)\n[PASS] test_submitStoresTheNextListAndRewards() (gas: 1527456)\n[PASS] test_unlockCallbackAndSwapSelfAreNotCallable() (gas: 103502)\nSuite result: ok. 48 passed; 0 failed; 0 skipped; finished in 624.46ms (691.41ms CPU time)\n\nRan 27 tests for test/Imdex5Revised.t.sol:Imdex5RevisedTest\n[PASS] testFuzz_mintFirstKeepsAPartialFillIdle(uint256,uint256) (runs: 256, μ: 1104988, ~: 1105071)\nLogs:\n  Bound result 41870\n  Bound result 3124\n\n[PASS] testFuzz_redeemToImdPaysADeadCoinExactlyAsRedeemDoes(uint256) (runs: 256, μ: 2016439, ~: 2008784)\nLogs:\n  Bound result 36094350109516419251\n\n[PASS] testFuzz_redeemToImdPaysAShortFillInKindUnderTheRedeemRule(uint256,uint256) (runs: 256, μ: 1837299, ~: 1837618)\nLogs:\n  Bound result 994000000000000041870\n  Bound result 19260430990447016672714\n\n[PASS] test_aCoinThatBurnsItsGasIsOwedAndTheIdleImdStillPaid() (gas: 1631385)\n[PASS] test_askAndCloseAtTheirExactBoundaries() (gas: 1205911)\n[PASS] test_askIsBlockedWhileAListAwaitsRebalance() (gas: 3314147)\n[PASS] test_claimThatFailsKeepsTheDebt() (gas: 1302771)\n[PASS] test_hookCannotCallSwapSelfOrTheOracleCallbacks() (gas: 3507060)\n[PASS] test_hookCannotCloseOrAnswerTheOpenRequestDuringASwap() (gas: 4136780)\n[PASS] test_lastRedeemerToImdTakesAllOfADeadCoin() (gas: 1758698)\n[PASS] test_margUsesItsOwnHookAndTheOthersShareG() (gas: 48938)\n[PASS] test_mintFirstPartialFillIsRedeemedProRataNotTwice() (gas: 1669924)\n[PASS] test_mintFirstRefusesAPoolThatReturnsNothingOnALargeAmount() (gas: 745257)\n[PASS] test_mintFirstRefusesDustThatBuysNothing() (gas: 2166229)\n[PASS] test_mintFirstRevertsWholeWhenTheHookMisbehaves() (gas: 992464212)\n[PASS] test_mintRevertsWholeWhenTheHookBurnsGasForTheIndex() (gas: 993093705)\n[PASS] test_mintRevertsWholeWhenTheHookLeavesADeltaUnsettled() (gas: 1346547)\n[PASS] test_mintSkipsAListCoinHeldAtZeroAndTheNextRebalanceBuysIt() (gas: 5590055)\n[PASS] test_onOracleResultNeedsExactlyFourAgreed() (gas: 1159398)\n[PASS] test_owedAccumulatesAcrossRedeemsAndIsPaidOnce() (gas: 2212746)\n[PASS] test_rebalanceSkipsEveryBurningSwapAndStillAdoptsTheList() (gas: 3730546)\n[PASS] test_redeemSurvivesFiveGasBurningCoinsWithOrdinaryGas() (gas: 5789971)\n[PASS] test_redeemToImdPaysInKindWhenTheHookLeavesADeltaUnsettled() (gas: 2244486)\n[PASS] test_redeemToImdPaysInKindWhenTheSaleWouldPayNothing() (gas: 1834334)\n[PASS] test_submitRejectsALaunchWithoutAHookOrAToken() (gas: 1854053)\n[PASS] test_submitTakesAnAttestationOnce() (gas: 1462114)\n[PASS] test_submitUsesTheRegistryArtifactsNotTheStartingList() (gas: 1560763)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 632.17ms (1.12s CPU time)\n\nRan 21 tests for test/Imdex5MustAttack.t.sol:Imdex5MustAttackTest\n[PASS] testFuzz_dustMintsRoundAgainstTheMinter(uint256) (runs: 200, μ: 1916970, ~: 1917130)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_heldTracksBalanceThroughEveryPath(uint16,uint256) (runs: 64, μ: 7885879, ~: 7898370)\nLogs:\n  Bound result 15\n  Bound result 255959118\n\n[PASS] testFuzz_mintKeepsOnlyWhatItSpends(uint256,uint256) (runs: 200, μ: 2886341, ~: 2886443)\nLogs:\n  Bound result 1736447536937430820392\n  Bound result 879575096729760215450\n\n[PASS] testFuzz_mintNeverDilutesPerShare(uint256,uint256,uint256) (runs: 300, μ: 2992005, ~: 3002742)\nLogs:\n  Bound result 3\n  Bound result 43572987471554833870\n  Bound result 2156595945001528631478\n\n[PASS] testFuzz_mintNeverIssuesBelowTheFloor(uint256,uint256,uint256,uint256) (runs: 300, μ: 2166092, ~: 2215206)\nLogs:\n  Bound result 1\n  Bound result 6048343\n  Bound result 1750858071\n  Bound result 38176593\n\n[PASS] testFuzz_redeemAlwaysPaysProRata(uint256,bool) (runs: 200, μ: 3371052, ~: 3194234)\nLogs:\n  Bound result 3791\n\n[PASS] testFuzz_residualDumpedThenBoughtInFullDilutesNobodyInCoins(uint256,uint256) (runs: 100, μ: 4767810, ~: 4767884)\nLogs:\n  Bound result 228\n  Bound result 65745656028961577779\n\n[PASS] testFuzz_residualShortFillAtUndisturbedPriceDilutesNobody(uint16,uint256) (runs: 100, μ: 5243631, ~: 5243571)\nLogs:\n  Bound result 2588\n  Bound result 205614647028961577779\n\n[PASS] testFuzz_underQuorumDeliveryIsIgnored(uint16) (runs: 50, μ: 1081658, ~: 1081725)\nLogs:\n  Bound result 2\n\n[PASS] test_answerOtherThanDeliveredIsRefused() (gas: 1126306)\n[PASS] test_callbackFromAnyoneElseIsIgnored() (gas: 1062805)\n[PASS] test_expiredAnswerNeverChangesTheList() (gas: 1456084)\n[PASS] test_floorAboveRequestAlwaysReverts() (gas: 1228176)\n[PASS] test_floorBoundaryIsExact() (gas: 3493331)\n[PASS] test_futureIssuedAnswerIsRefused() (gas: 1093361)\n[PASS] test_owedCoinsAreTheOnlyGapBetweenHeldAndBalance() (gas: 1746449)\n[PASS] test_redeemPaysWhenEveryCoinAndPoolMisbehaves() (gas: 4090794)\n[PASS] test_residualShortFillDoesNotCutSharesBelowFloor() (gas: 4839475)\n[PASS] test_revertedMintsTakeNothing_everyPath() (gas: 9280692)\n[PASS] test_underQuorumSignedAnswerNeverChangesTheList() (gas: 1092421)\n[PASS] test_wrongSignerAndReplayAreRefused() (gas: 1491962)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 660.25ms (2.90s CPU time)\n\nRan 6 tests for test/Imdex5ResidualSpot.t.sol:Imdex5ResidualSpotTest\n[PASS] testFuzz_aDeadResidualFailsTheMintAtAnyPrice(uint256,uint256) (runs: 256, μ: 4336375, ~: 4336350)\nLogs:\n  Bound result 41870\n  Bound result 514500996960984155724\n\n[PASS] testFuzz_aDumpedResidualThatTradesIsBoughtInFull(uint256,uint256) (runs: 256, μ: 4331764, ~: 4331834)\nLogs:\n  Bound result 870\n  Bound result 961686996960945898538\n\n[PASS] test_aDumpedResidualWhoseBuyRevertsCannotBeMintedAtSpot() (gas: 4727855)\n[PASS] test_aResidualHookThatBurnsGasFailsTheMint() (gas: 5765103)\n[PASS] test_aResidualHookThatLeavesADeltaFailsTheMint() (gas: 4189311)\n[PASS] test_aResidualShortFillIsChargedAtLeastItsFairValue() (gas: 4167201)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 728.15ms (1.35s CPU time)\n\nRan 35 tests for test/Imdex5Edges.t.sol:Imdex5EdgesTest\n[PASS] testFuzz_mintBuysExactlyTheRoundedUpShare(uint256) (runs: 512, μ: 1921117, ~: 1920943)\nLogs:\n  Bound result 2500\n\n[PASS] testFuzz_mintFirstMintsExactlyTheRest(uint256) (runs: 512, μ: 1009182, ~: 1012937)\nLogs:\n  Bound result 14218914601\n\n[PASS] testFuzz_onOracleResultForAnotherRequestIsIgnored(bytes32,uint16) (runs: 256, μ: 1028830, ~: 1028926)\n[PASS] testFuzz_onOracleResultFromAStrangerChangesNothing(address,bytes32,uint16) (runs: 256, μ: 1075769, ~: 1075934)\n[PASS] testFuzz_redeemNeverPaysAboveProRata(uint256,uint256) (runs: 512, μ: 1563833, ~: 1564057)\nLogs:\n  Bound result 3498999999999999999834\n  Bound result 845000000000000000000\n\n[PASS] testFuzz_splittingARedeemStaysUnderProRata(uint256,uint256) (runs: 256, μ: 1763434, ~: 1763697)\nLogs:\n  Bound result 7321\n  Bound result 18220\n\n[PASS] test_aLaterAskReplacesAnUnsubmittedAnswer() (gas: 1888261)\n[PASS] test_aReenteringCoinCannotReenterAndIsNotPaidTwice() (gas: 2678873)\n[PASS] test_aReenteringCoinCannotReenterMintOrRebalanceFromRedeem() (gas: 3875928)\n[PASS] test_aThinResidualPoolDoesNotStarveAFlooredMint() (gas: 3601998)\n[PASS] test_anUnsubmittedAnswerDoesNotSurviveAFailedLaterAsk() (gas: 1356986)\n[PASS] test_askRevertsWholeWhenTheIntakeRefuses() (gas: 334316)\n[PASS] test_askThresholdIsExactlyThreeQuartersOfAnImd() (gas: 1102053)\n[PASS] test_closeRequestNeedsAnOpenOne() (gas: 1003962)\n[PASS] test_closingARequestDoesNotResetTheInterval() (gas: 1162249)\n[PASS] test_mintCannotBeFreeWhenTheIndexHoldsValue() (gas: 1770169)\n[PASS] test_onOracleResultAfterCloseIsIgnored() (gas: 1098982)\n[PASS] test_onOracleResultWithFiveEntriesFitsTheStipend() (gas: 1144218)\n[PASS] test_oneGasBurningCoinDoesNotBlockRedeemGivenGas() (gas: 1664334)\n[PASS] test_rebalanceBuyMovesAPoolAtMostTwoPercent() (gas: 3712366)\n[PASS] test_rebalanceBuyStopsAtAQuarterWeight() (gas: 4043569)\n[PASS] test_rebalanceDoesNotTrimWithFewerThanFourCoins() (gas: 3278151)\n[PASS] test_rebalanceSellMovesAPoolAtMostTwoPercent() (gas: 3311615)\n[PASS] test_rebalanceTrimsToAQuarterNotBelow() (gas: 3800659)\n[PASS] test_redeemHalfPercentStaysWithRemainingHolders() (gas: 1564922)\n[PASS] test_redeemIdleImdThatCannotBeSentIsOwed() (gas: 1399648)\n[PASS] test_redeemToATokenWithoutCodeBecomesOwedAndClaimableLater() (gas: 1271159)\n[PASS] test_residualsAreRedeemedAndADeadOneBlocksMintWithoutTakingImd() (gas: 5310656)\n[PASS] test_rewardsNeverDipIntoIdleImd() (gas: 2725576)\n[PASS] test_sharesTransferLikeAnyErc20AndMoveNoHoldings() (gas: 1468821)\n[PASS] test_submitAndRebalancePayNoRewardWithoutFees() (gas: 3268731)\n[PASS] test_submitRejectsATamperedAnswerEvenWithAValidSignatureElsewhere() (gas: 1142814)\n[PASS] test_submitRejectsAnAttestationSignedForAnotherChain() (gas: 1444728)\n[PASS] test_submitRejectsAnAttestationSignedForAnotherConsumer() (gas: 1110033)\n[PASS] test_submitRejectsMalformedAnswerBytes() (gas: 1348345)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 728.34ms (2.05s CPU time)\n\nRan 9 tests for test/Imdex5TaxEverywhere.t.sol:Imdex5TaxEverywhereTest\n[PASS] testFuzz_everyCoinTaxedLifecycle(uint16[5],uint256,uint256,uint256) (runs: 200, μ: 9153713, ~: 9160816)\nLogs:\n  Bound result 522\n  Bound result 4\n  Bound result 0\n  Bound result 1650\n  Bound result 5\n  Bound result 1000000000000000001\n  Bound result 145307749937601156090\n  Bound result 351550328808361567419\n\n[PASS] testFuzz_theMostTaxedCoinDecidesTheMint(uint8,uint16,uint16,uint256) (runs: 200, μ: 2681685, ~: 2710498)\nLogs:\n  Bound result 4\n  Bound result 88\n  Bound result 23\n  Bound result 499000000000000000168\n\n[PASS] test_aCoinTaxingItsOwnSettlementIsNeverSoldAndIsPaidInKind() (gas: 6654114)\n[PASS] test_aCoinTaxingItsOwnSettlementStaysAResidualThroughARebalance() (gas: 7229086)\n[PASS] test_aCoinThatKeepsEverythingFailsALaterMintWholeAndRedeemsStillPay() (gas: 6657012)\n[PASS] test_aCoinThatKeepsEverythingFailsTheFirstMintWhole() (gas: 1465795)\n[PASS] test_aCoinThatKeepsEverythingFailsTheOneWeiMint() (gas: 3420072)\n[PASS] test_aDonationNeitherChangesHeldNorInflatesAMintOrARedeem() (gas: 2486069)\n[PASS] test_taxOnTopOfAPartialFillCreditsTheNetAndMintsThatFraction() (gas: 5247841)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 784.73ms (1.34s CPU time)\n\nRan 3 tests for test/Imdex5RebalanceNothingOut.t.sol:Imdex5RebalanceNothingOutTest\n[PASS] test_aRebalanceBuyThatDeliversNothingIsSkipped() (gas: 3557928)\n[PASS] test_aRebalanceBuyThatPaysDustIsSkippedAndAFairOneTrades() (gas: 5831071)\n[PASS] test_aRebalanceSellThatPaysNothingIsSkipped() (gas: 3079117)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 784.75ms (19.87ms CPU time)\n\nRan 3 tests for test/Imdex5OracleAuthentication.t.sol:Imdex5OracleAuthenticationTest\n[PASS] testFuzz_lateDeliveryCannotRefreshExpiredSignature(uint256) (runs: 128, μ: 1337316, ~: 1337457)\nLogs:\n  Bound result 715383\n\n[PASS] testFuzz_mutatingAnySignedFieldCannotAdoptAList(uint8,uint256) (runs: 512, μ: 1325924, ~: 1325923)\nLogs:\n  Bound result 38065862774500996960984155724\n\n[PASS] testFuzz_quorumForgeryDoesNotConsumeTheValidAnswer(uint16) (runs: 128, μ: 2217418, ~: 2217487)\nLogs:\n  Bound result 3\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 784.87ms (1.02s CPU time)\n\nRan 7 tests for test/Imdex5TaxedCoin.t.sol:Imdex5TaxedCoinTest\n[PASS] testFuzz_taxedCoinLifecycle(uint256,uint256,uint256) (runs: 256, μ: 7885195, ~: 7891312)\nLogs:\n  Bound result 1000000000000000000\n  Bound result 33662223130306752602\n  Bound result 62210958024131096722\n\n[PASS] test_firstMintCreditsOnlyWhatArrives() (gas: 1254324)\n[PASS] test_firstMintMinOutChecksTheNetReceipt() (gas: 1360017)\n[PASS] test_lastHolderCanReceiveEveryCoinAfterAnImdExit() (gas: 2650034)\n[PASS] test_outstandingOwedIsNotCountedAsANewReceiptAndRemainsClaimable() (gas: 5203128)\n[PASS] test_taxedCoinFullLifecycle() (gas: 7880256)\n[PASS] test_taxedRebalanceBuyCreditsOnlyNewReceipts() (gas: 5610140)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 785.62ms (801.73ms CPU time)\n\nRan 1 test for test/Imdex5TaxEverywhere.t.sol:Imdex5AllCoinsTaxedInvariantTest\n[PASS]\nImdex5AllCoinsTaxedInvariantTest invariants:\n[PASS] invariant_taxed_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_taxed_coinBalancesAreHeldPlusOwed\n[PASS] invariant_taxed_everyHoldingIsListed\n[PASS] invariant_taxed_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_taxed_zeroSupplyMeansNothingHeld\n Imdex5AllCoinsTaxedInvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 209   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 245   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 212   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 432   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 222   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 244   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 205   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 225   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 203   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 205   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 218   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 199   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 194   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 233   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 179   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| TaxKnobs      | setTax           | 209   | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 23574\n  Bound result 39596972668088003129\n  Bound result 159708578027544712484\n  Bound result 1435743504598885\n  Bound result 4046341548624796396\n  Bound result 37241578766611975504\n  Bound result 561081\n  Bound result 418414218930000\n  Bound result 3098\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.57s (1.56s CPU time)\n\nRan 1 test for test/Imdex5.invariant.t.sol:Imdex5InvariantTest\n[PASS]\nImdex5InvariantTest invariants:\n[PASS] invariant_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_coinBalancesAreHeldPlusOwed\n[PASS] invariant_feeImdLeavesOnlyForTheOracleAndRewards\n[PASS] invariant_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_listShape\n[PASS] invariant_noFreeMintWhileValueIsHeld\n[PASS] invariant_requestStateIsConsistent\n[PASS] invariant_zeroSupplyMeansNothingHeld\n Imdex5InvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 195   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 207   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | closeRequest     | 200   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverFailure   | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 189   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 196   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 368   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 201   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 196   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 217   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 243   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 195   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 207   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 217   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 186   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 191   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 220   | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000\n  Bound result 250000000000000000\n  Bound result 37923870581915909\n  Bound result 130108602367599074406\n  Bound result 5171\n  Bound result 8\n  Bound result 20513\n  Bound result 19798\n  Bound result 5988\n  Bound result 691198\n  Bound result 48\n  Bound result 900\n  Bound result 128\n  Bound result 20000000000000000000\n  Bound result 3798186580743\n  Bound result 8642824578256375262108\n  Bound result 4242\n  Bound result 19\n  Bound result 15251\n  Bound result 75\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.87s (1.87s CPU time)\n\nRan 1 test for test/Imdex5Floor.invariant.t.sol:Imdex5FloorInvariantTest\n[PASS]\nImdex5FloorInvariantTest invariants:\n[PASS] invariant_heldIsTheRealBalance\n[PASS] invariant_mintNeverDilutesListCoinsOrIdle\n[PASS] invariant_noMintBelowTheFloor\n[PASS] invariant_noSharesMeansNothingHeld\n[PASS] invariant_redeemAlwaysPays\n[PASS] invariant_revertedMintMovesNothing\n Imdex5FloorInvariantTest invariants (runs: 128, calls: 5120, reverts: 485)\n\n╭--------------------+-------------+-------+---------+----------╮\n| Contract           | Selector    | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5FloorHandler | claim       | 476   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | mint        | 1355  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | mintFirst   | 471   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | movePrice   | 488   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | rebalanceTo | 485   | 485     | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | redeem      | 461   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | redeemToImd | 452   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | setMaxIn    | 486   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | setTax      | 446   | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 17988\n  Bound result 300000000000000000000\n  Bound result 15\n  Bound result 23182\n  Bound result 10000000000000000000\n  Bound result 795000000000000000000\n  Bound result 18\n  Bound result 18274\n  Bound result 2500\n  Bound result 10702\n  Bound result 10183\n  Bound result 400\n  Bound result 7769\n  Bound result 50499999999998683640\n  Bound result 20443\n  Bound result 1000000000000000\n  Bound result 302\n  Bound result 117727\n  Bound result 128309\n  Bound result 737\n  Bound result 186\n  Bound result 320\n  Bound result 900\n  Bound result 8511\n  Bound result 7648\n  Bound result 3542\n  Bound result 2114\n  Bound result 12345\n  Bound result 19\n  Bound result 97\n  Bound result 999906\n  Bound result 31974\n  Bound result 19199\n  Bound result 9000\n  Bound result 15842\n  Bound result 2000000000000000000\n  Bound result 18247\n  Bound result 14166\n  Bound result 3352\n  Bound result 4242\n  Bound result 776161\n  Bound result 10\n  Bound result 906433083472341717307\n  Bound result 10\n  Bound result 871338330553165653820\n  Bound result 44878156\n  Bound result 4294967295\n  Bound result 4887\n  Bound result 5508\n  Bound result 2563251\n  Bound result 1864110743798322951826\n  Bound result 628057317341387608512442\n  Bound result 385\n  Bound result 395037\n  Bound result 481235\n  Bound result 1646134214883989149512\n  Bound result 4245\n  Bound result 1380\n  Bound result 9999\n  Bound result 352710984976227550984\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.89s (2.88s CPU time)\n\nRan 3 tests for test/Imdex5Claims.invariant.t.sol:Imdex5ClaimsInvariantTest\n[PASS] invariant_everyHolderAndCreditorIsBacked() (runs: 256, calls: 16384, reverts: 0)\n\n╭---------------------+----------------+-------+---------+----------╮\n| Contract            | Selector       | Calls | Reverts | Discards |\n+===================================================================+\n| Imdex5ClaimsHandler | changeFailure  | 2284  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| Imdex5ClaimsHandler | claim          | 2384  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| Imdex5ClaimsHandler | exitAll        | 2337  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| Imdex5ClaimsHandler | mint           | 2315  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| Imdex5ClaimsHandler | redeem         | 2302  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| Imdex5ClaimsHandler | redeemToImd    | 2402  | 0       | 0        |\n|---------------------+----------------+-------+---------+----------|\n| Imdex5ClaimsHandler | transferShares | 2360  | 0       | 0        |\n╰---------------------+----------------+-------+---------+----------╯\n\nLogs:\n  Bound result 691200\n  Bound result 494999999999999999999\n  Bound result 0\n  Bound result 5186\n  Bound result 100\n  Bound result 2205830265730104839\n  Bound result 1999999999999999981\n  Bound result 0\n  Bound result 4999999999999999821\n  Bound result 50000000000000000000\n  Bound result 13318\n  Bound result 50000000000000000000\n  Bound result 4748743718592964816\n  Bound result 3300\n  Bound result 267\n  Bound result 40000000000000003301\n  Bound result 0\n  Bound result 13\n  Bound result 6\n  Bound result 40000000000000000014\n  Bound result 4748743718592964816\n  Bound result 2999999999999833334\n  Bound result 49956377360005866097\n  Bound result 200\n  Bound result 39247145262884245560\n  Bound result 43959923529534471779\n  Bound result 29502146473200927142\n  Bound result 42702024529096297304\n  Bound result 0\n  Bound result 1000000000000000000\n  Bound result 12941\n  Bound result 41000000000000000001\n  Bound result 16496\n  Bound result 13\n  Bound result 40000000000000016497\n  Bound result 20094\n  Bound result 0\n  Bound result 11\n  Bound result 1\n  Bound result 40000000000000000012\n  Bound result 50000000000000000000\n  Bound result 39999999999999999998\n  Bound result 39999999999999999501\n  Bound result 0\n  Bound result 5217\n  Bound result 259200\n  Bound result 16582148\n  Bound result 8182221\n  Bound result 40000000000016582149\n  Bound result 14\n  Bound result 0\n  Bound result 40000000000000000015\n\n[PASS] test_handlerExercisesDebtAcrossEpochs() (gas: 8601975)\nLogs:\n  Bound result 0\n  Bound result 1000000000000000000\n  Bound result 1000000000000000000\n  Bound result 0\n  Bound result 10000000000000000000\n  Bound result 0\n  Bound result 20000000000000000000\n  Bound result 0\n  Bound result 20000000000000000000\n\n[PASS] test_handlerRedeemToImdOwesInKindOnce() (gas: 5853711)\nLogs:\n  Bound result 0\n  Bound result 1\n  Bound result 100000000000000000000\n  Bound result 0\n\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 12.07s (12.09s CPU time)\n\nRan 1 test for test/Imdex5.invariant.t.sol:Imdex5TaxedCoinInvariantTest\n[PASS]\nImdex5TaxedCoinInvariantTest invariants:\n[PASS] invariant_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_coinBalancesAreHeldPlusOwed\n[PASS] invariant_feeImdLeavesOnlyForTheOracleAndRewards\n[PASS] invariant_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_listShape\n[PASS] invariant_noFreeMintWhileValueIsHeld\n[PASS] invariant_requestStateIsConsistent\n[PASS] invariant_zeroSupplyMeansNothingHeld\n Imdex5TaxedCoinInvariantTest invariants (runs: 256, calls: 128000, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 6636  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 6695  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | closeRequest     | 6752  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverFailure   | 6801  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 6714  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 6680  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 13445 | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 6752  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 6685  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 6897  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 6601  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 6664  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 6713  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 6671  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 6830  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 6860  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 6729  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 6875  | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5000\n  Bound result 10000\n  Bound result 9950000000000000000\n  Bound result 1\n  Bound result 4805072378723970342\n  Bound result 500\n  Bound result 14726\n  Bound result 900\n  Bound result 4196598814\n  Bound result 259200\n  Bound result 8717\n  Bound result 10100\n  Bound result 200\n  Bound result 31337\n  Bound result 396800\n  Bound result 6529\n  Bound result 460\n  Bound result 8\n  Bound result 200\n  Bound result 995\n  Bound result 10205\n  Bound result 1620\n  Bound result 7533640301368395257652\n  Bound result 6834\n  Bound result 7997\n  Bound result 1000000\n  Bound result 12234\n  Bound result 24576\n  Bound result 494999999999999999999\n  Bound result 21695\n  Bound result 12958\n  Bound result 51200\n  Bound result 9000\n  Bound result 2989\n  Bound result 48\n  Bound result 2923\n  Bound result 10690\n  Bound result 18895\n  Bound result 10118\n  Bound result 50000000000000000000\n  Bound result 19529035837012967424\n  Bound result 1\n  Bound result 20124\n  Bound result 244124153722729520859\n  Bound result 15\n  Bound result 300000000000000000000\n  Bound result 16256747033301207744\n  Bound result 4295128739\n  Bound result 6624870091220521956\n  Bound result 5000000000000000000\n  Bound result 63214438039571225\n  Bound result 3637\n  Bound result 3947352266\n  Bound result 2143\n  Bound result 18079\n  Bound result 227787\n  Bound result 3048\n  Bound result 14909361\n  Bound result 10190355234627470522\n  Bound result 5195007668960651921030\n  Bound result 3001\n  Bound result 7380264184286564\n  Bound result 2853\n  Bound result 105\n  Bound result 192161677547341\n  Bound result 995\n  Bound result 383229\n  Bound result 4774279667145238325\n  Bound result 66006747033298280177\n  Bound result 21381\n  Bound result 4175128513403437738\n  Bound result 1561568134220081\n  Bound result 1421\n  Bound result 178\n  Bound result 3914\n  Bound result 199000000000000000000\n  Bound result 14\n  Bound result 28237059604577306711\n  Bound result 3\n  Bound result 3\n  Bound result 19471\n  Bound result 1800000000\n  Bound result 13\n  Bound result 892863524893413060\n  Bound result 189000000000000000000\n  Bound result 95569915997759\n  Bound result 2973332520167463525938\n  Bound result 8835\n  Bound result 393130850767409818\n  Bound result 40\n  Bound result 298500000000000000000\n  Bound result 11459103040543244\n  Bound result 4244\n  Bound result 9950\n  Bound result 1000000\n  Bound result 17740\n  Bound result 1481\n  Bound result 46789382\n  Bound result 4039445811676979351279\n  Bound result 6\n  Bound result 4546\n  Bound result 8165\n  Bound result 37000000000000000000\n  Bound result 358\n  Bound result 900\n  Bound result 739\n  Bound result 200000\n  Bound result 9080329275066579172\n  Bound result 823276862486685613713\n  Bound result 544657703331994939\n  Bound result 7723537686814318915\n  Bound result 10\n  Bound result 97000000000000000000\n  Bound result 15613747976742509660\n  Bound result 12500\n  Bound result 4460\n  Bound result 105\n  Bound result 19823\n  Bound result 5162\n  Bound result 48\n  Bound result 5087797353129442843\n  Bound result 7\n  Bound result 1269580902088475\n  Bound result 8829796821773896477\n  Bound result 2592000\n  Bound result 368751009546875647\n  Bound result 59432570749\n  Bound result 2641\n  Bound result 640000\n  Bound result 8640291638658344\n  Bound result 467983\n  Bound result 4670083587257239092\n  Bound result 16\n  Bound result 9900\n  Bound result 256000\n  Bound result 520292\n  Bound result 64555113031370214551\n  Bound result 535483\n  Bound result 3914\n  Bound result 29972353795135207118\n  Bound result 9567\n  Bound result 21469\n  Bound result 14264337593543950336\n  Bound result 2839\n  Bound result 3050\n  Bound result 2006113368606586538968\n  Bound result 719098455508\n  Bound result 1473769833187744564\n  Bound result 390607565778990750519\n  Bound result 1075\n  Bound result 9805\n  Bound result 7320\n  Bound result 21137\n  Bound result 9671253210102585476698\n  Bound result 401500446371068597093\n  Bound result 17362\n  Bound result 16028\n  Bound result 12140\n  Bound result 9200520497500145432\n  Bound result 6013303575802274296506\n  Bound result 100000\n  Bound result 779521946266410741\n  Bound result 1178\n  Bound result 512669\n  Bound result 3000000000000000000\n  Bound result 12587\n  Bound result 17485\n  Bound result 18555\n  Bound result 5\n  Bound result 1140\n  Bound result 840992168559641534\n  Bound result 1247527790697392513\n  Bound result 1869\n  Bound result 2742302639166789325\n  Bound result 8256\n  Bound result 872375532\n  Bound result 45005851881584441735\n  Bound result 6784\n  Bound result 23199\n  Bound result 2250\n  Bound result 173296271895100398\n  Bound result 21000000000000000\n  Bound result 371636862\n  Bound result 45000000000000000000\n  Bound result 24\n  Bound result 179200\n  Bound result 5227724790517883585\n  Bound result 4432393828063952702986\n  Bound result 13807\n  Bound result 2\n  Bound result 7712699497262901580446\n  Bound result 4583\n  Bound result 15613\n  Bound result 13865\n  Bound result 7830\n  Bound result 3001\n  Bound result 6468569995078882153\n  Bound result 8474736524390931843335\n  Bound result 11720\n  Bound result 2126080246961468400\n  Bound result 18841\n  Bound result 16028\n  Bound result 18190\n  Bound result 3001\n  Bound result 150\n  Bound result 4541\n  Bound result 13601442074695903\n  Bound result 22123\n  Bound result 10868998138528\n  Bound result 8918\n  Bound result 10001\n  Bound result 2345\n  Bound result 4294967295\n  Bound result 50000000000000000000\n  Bound result 4455\n  Bound result 9632059962731810\n  Bound result 12\n  Bound result 8964\n  Bound result 112404\n  Bound result 232965\n  Bound result 483\n  Bound result 14148\n  Bound result 1779\n  Bound result 128000\n  Bound result 166610407825966\n  Bound result 5105450422936023471960\n  Bound result 691200\n  Bound result 1000000\n  Bound result 1341956296113047014\n  Bound result 4588556812063315363873\n  Bound result 11\n  Bound result 371636862\n  Bound result 31337\n  Bound result 567001618122137781\n  Bound result 1686973019597072785\n  Bound result 7\n  Bound result 5000\n  Bound result 5435335231554636714\n  Bound result 2705548849\n  Bound result 10158\n  Bound result 93488242897784891638\n  Bound result 105\n  Bound result 33236839714825751583\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 62.38s (62.38s CPU time)\n\nRan 22 test suites in 62.39s (88.82s CPU time): 199 tests passed, 0 failed, 7 skipped (206 total tests)\n","passed":true},{"durationMs":110,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Imdex5.approve(address,uint256)\",\"Imdex5.ask()\",\"Imdex5.claim(address)\",\"Imdex5.closeRequest()\",\"Imdex5.fund(uint256)\",\"Imdex5.mint(uint256,uint256,uint256)\",\"Imdex5.mintFirst(uint256,uint256[])\",\"Imdex5.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Imdex5.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Imdex5.paySelf(address,address,uint256)\",\"Imdex5.rebalance()\",\"Imdex5.redeem(uint256)\",\"Imdex5.redeemToImd(uint256,uint256)\",\"Imdex5.submit((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Imdex5.swapSelf(address,address,bool,uint256,bool,bool)\",\"Imdex5.transfer(address,uint256)\",\"Imdex5.transferFrom(address,address,uint256)\",\"Imdex5.unlockCallback(bytes)\"],\"files\":{\".gitignore\":2,\"ADAPTATION.md\":436,\"README.md\":404,\"THREAT_MODEL.md\":52,\"foundry.toml\":19,\"launch.json\":10,\"src/Imdex5.sol\":703,\"src/Interfaces.sol\":61,\"src/OracleAttestation.sol\":221,\"test/Fix3.fork.t.sol\":97,\"test/Fix3Floor.fork.t.sol\":67,\"test/Fix3Rebalance.fork.t.sol\":151,\"test/Imdex5.invariant.t.sol\":544,\"test/Imdex5.t.sol\":1070,\"test/Imdex5Base.sol\":175,\"test/Imdex5Claims.invariant.t.sol\":401,\"test/Imdex5DocumentedLimits.t.sol\":313,\"test/Imdex5Edges.t.sol\":741,\"test/Imdex5Floor.invariant.t.sol\":335,\"test/Imdex5MustAttack.t.sol\":596,\"test/Imdex5OracleAuthentication.t.sol\":139,\"test/Imdex5Payments.t.sol\":242,\"test/Imdex5RebalanceNothingOut.t.sol\":106,\"test/Imdex5ResidualSpot.t.sol\":182,\"test/Imdex5Revised.t.sol\":522,\"test/Imdex5ShortFill.t.sol\":226,\"test/Imdex5SwapBoundaries.t.sol\":222,\"test/Imdex5TaxEverywhere.t.sol\":529,\"test/Imdex5TaxedCoin.t.sol\":252,\"test/OracleConsumerConformance.t.sol\":74,\"test/README.md\":28,\"test/mocks/AttackMocks.sol\":85,\"test/mocks/Mocks.sol\":339,\"test/mocks/PoolTaxERC20.sol\":25,\"test/mocks/TaxERC20.sol\":36},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"6d540ecb637648fab28c023f26034e4fc6807599077a16c2012cf335918354b2","verifiedTreeHash":"85db901132a9c073df930bd680aee2c0259197af","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":114495,"exitCode":0,"name":"build","output":"Compiling 68 files with Solc 0.8.26\nSolc 0.8.26 finished in 114.38s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/Imdex5.sol:619:5:\n    |\n619 |     function _amountValue(address token, uint256 amount, uint256 sqrtP, Math.Rounding r)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Fix3.fork.t.sol:76:5:\n   |\n76 |     function _checkBacked(Imdex5.Coin[] memory cs, string memory when) internal {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Fix3Rebalance.fork.t.sol:44:5:\n   |\n44 |     function _backed(string memory when) internal {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":60549,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 1 test for test/Fix3Floor.fork.t.sol:Fix3FloorForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 262.82µs (0.00ns CPU time)\n\nRan 3 tests for test/Fix3.fork.t.sol:Fix3ForkTest\n[SKIP] test_fixed_with_1000_IMD() (gas: 0)\n[SKIP] test_fixed_with_100_IMD() (gas: 0)\n[SKIP] test_fixed_with_10_IMD() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 428.58µs (139.38µs CPU time)\n\nRan 3 tests for test/Fix3Rebalance.fork.t.sol:Fix3RebalanceForkTest\n[SKIP] test_dropTheTaxedCoin_fourRemain() (gas: 0)\n[SKIP] test_reorderSameFive() (gas: 0)\n[SKIP] test_shrinkToThree_bigFund() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 419.72µs (168.40µs CPU time)\n\nRan 2 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_callbackSelectorIsCanonical() (gas: 4542)\n[PASS] test_digestMatchesTheProtocol() (gas: 13358)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 516.38µs (61.94µs CPU time)\n\nRan 6 tests for test/Imdex5DocumentedLimits.t.sol:Imdex5DocumentedLimitsTest\n[PASS] test_aClosedRequestCostsTheWholeWeek() (gas: 1161557)\n[PASS] test_aFailedRequestCostsTheWholeWeek() (gas: 1239424)\n[PASS] test_aFailedRequestLeavesEveryImdAccounted() (gas: 3588988)\n[PASS] test_aLeaverDumpedBeforeARebalanceIsSoldAtTheDumpedPriceAndBooked() (gas: 5360659)\n[PASS] test_aLimitedSaleSellsAboutOnePercentOfTheReservePerRebalance() (gas: 5819675)\n[PASS] test_aPoolMovedBeforeARebalanceIsBoughtAtTheMovedPriceAndBooked() (gas: 4770587)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 16.15ms (13.81ms CPU time)\n\nRan 9 tests for test/Imdex5ShortFill.t.sol:Imdex5ShortFillTest\n[PASS] testFuzz_mintUsesTheLeastFilledCoinAndChargesEveryBuy(uint256,uint16[5]) (runs: 256, μ: 1633301, ~: 1641669)\nLogs:\n  Bound result 499000370204935467971\n  Bound result 0\n  Bound result 0\n  Bound result 3\n  Bound result 4510\n  Bound result 312\n\n[PASS] test_fullFillPassesFloor() (gas: 742684)\n[PASS] test_mintRevertsAndRollsBackEarlierBuysWhenACoinDeliversZero() (gas: 1287089)\n[PASS] test_mintRevertsWhenANonzeroFillRoundsSharesToZero() (gas: 1196464)\n[PASS] test_shortFillChargesIdleImdForTheSharesIssuedOnly() (gas: 2600724)\n[PASS] test_shortFillMintsTheDeliveredFraction() (gas: 868543)\n[PASS] test_shortFillStillEnforcesMaxImdInAndRollsBack() (gas: 1739999)\n[PASS] test_sliverFillBelowFloorRevertsAndRollsBack() (gas: 1192676)\n[PASS] test_sliverFillWithoutFloorIssuesASliver() (gas: 1286856)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 239.33ms (249.91ms CPU time)\n\nRan 7 tests for test/Imdex5TaxedCoin.t.sol:Imdex5TaxedCoinTest\n[PASS] testFuzz_taxedCoinLifecycle(uint256,uint256,uint256) (runs: 256, μ: 7860644, ~: 7866586)\nLogs:\n  Bound result 499000000000000024577\n  Bound result 499000000000000010497\n  Bound result 110999999999999999989\n\n[PASS] test_firstMintCreditsOnlyWhatArrives() (gas: 1253139)\n[PASS] test_firstMintMinOutChecksTheNetReceipt() (gas: 1358575)\n[PASS] test_lastHolderCanReceiveEveryCoinAfterAnImdExit() (gas: 2639725)\n[PASS] test_outstandingOwedIsNotCountedAsANewReceiptAndRemainsClaimable() (gas: 5187089)\n[PASS] test_taxedCoinFullLifecycle() (gas: 7855579)\n[PASS] test_taxedRebalanceBuyCreditsOnlyNewReceipts() (gas: 5602832)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 447.31ms (464.98ms CPU time)\n\nRan 27 tests for test/Imdex5Revised.t.sol:Imdex5RevisedTest\n[PASS] testFuzz_mintFirstKeepsAPartialFillIdle(uint256,uint256) (runs: 256, μ: 1103875, ~: 1103903)\nLogs:\n  Bound result 41870\n  Bound result 3124\n\n[PASS] testFuzz_redeemToImdPaysADeadCoinExactlyAsRedeemDoes(uint256) (runs: 256, μ: 2006112, ~: 1997273)\nLogs:\n  Bound result 36094350109516419251\n\n[PASS] testFuzz_redeemToImdPaysAShortFillInKindUnderTheRedeemRule(uint256,uint256) (runs: 256, μ: 1830218, ~: 1830423)\nLogs:\n  Bound result 994000000000000041870\n  Bound result 19260430990447016672714\n\n[PASS] test_aCoinThatBurnsItsGasIsOwedAndTheIdleImdStillPaid() (gas: 1632787)\n[PASS] test_askAndCloseAtTheirExactBoundaries() (gas: 1205506)\n[PASS] test_askIsBlockedWhileAListAwaitsRebalance() (gas: 3311094)\n[PASS] test_claimThatFailsKeepsTheDebt() (gas: 1297142)\n[PASS] test_hookCannotCallSwapSelfOrTheOracleCallbacks() (gas: 3504050)\n[PASS] test_hookCannotCloseOrAnswerTheOpenRequestDuringASwap() (gas: 4132895)\n[PASS] test_lastRedeemerToImdTakesAllOfADeadCoin() (gas: 1751646)\n[PASS] test_margUsesItsOwnHookAndTheOthersShareG() (gas: 48935)\n[PASS] test_mintFirstPartialFillIsRedeemedProRataNotTwice() (gas: 1658991)\n[PASS] test_mintFirstRefusesAPoolThatReturnsNothingOnALargeAmount() (gas: 744528)\n[PASS] test_mintFirstRefusesDustThatBuysNothing() (gas: 2164851)\n[PASS] test_mintFirstRevertsWholeWhenTheHookMisbehaves() (gas: 992464204)\n[PASS] test_mintRevertsWholeWhenTheHookBurnsGasForTheIndex() (gas: 993092592)\n[PASS] test_mintRevertsWholeWhenTheHookLeavesADeltaUnsettled() (gas: 1344999)\n[PASS] test_mintSkipsAListCoinHeldAtZeroAndTheNextRebalanceBuysIt() (gas: 5584542)\n[PASS] test_onOracleResultNeedsExactlyFourAgreed() (gas: 1159030)\n[PASS] test_owedAccumulatesAcrossRedeemsAndIsPaidOnce() (gas: 2201232)\n[PASS] test_rebalanceSkipsEveryBurningSwapAndStillAdoptsTheList() (gas: 3728848)\n[PASS] test_redeemSurvivesFiveGasBurningCoinsWithOrdinaryGas() (gas: 5815669)\n[PASS] test_redeemToImdPaysInKindWhenTheHookLeavesADeltaUnsettled() (gas: 2232685)\n[PASS] test_redeemToImdPaysInKindWhenTheSaleWouldPayNothing() (gas: 1827210)\n[PASS] test_submitRejectsALaunchWithoutAHookOrAToken() (gas: 1853617)\n[PASS] test_submitTakesAnAttestationOnce() (gas: 1461722)\n[PASS] test_submitUsesTheRegistryArtifactsNotTheStartingList() (gas: 1560405)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 453.78ms (1.25s CPU time)\n\nRan 35 tests for test/Imdex5Edges.t.sol:Imdex5EdgesTest\n[PASS] testFuzz_mintBuysExactlyTheRoundedUpShare(uint256) (runs: 512, μ: 1918738, ~: 1918560)\nLogs:\n  Bound result 795000000000000000000\n\n[PASS] testFuzz_mintFirstMintsExactlyTheRest(uint256) (runs: 512, μ: 1007840, ~: 1011747)\nLogs:\n  Bound result 795000000000000000000\n\n[PASS] testFuzz_onOracleResultForAnotherRequestIsIgnored(bytes32,uint16) (runs: 256, μ: 1028592, ~: 1028683)\n[PASS] testFuzz_onOracleResultFromAStrangerChangesNothing(address,bytes32,uint16) (runs: 256, μ: 1075469, ~: 1075635)\n[PASS] testFuzz_redeemNeverPaysAboveProRata(uint256,uint256) (runs: 512, μ: 1557836, ~: 1558400)\nLogs:\n  Bound result 537116319407267999905\n  Bound result 129627388551853696245\n\n[PASS] testFuzz_splittingARedeemStaysUnderProRata(uint256,uint256) (runs: 256, μ: 1748781, ~: 1749084)\nLogs:\n  Bound result 7437\n  Bound result 231\n\n[PASS] test_aLaterAskReplacesAnUnsubmittedAnswer() (gas: 1887604)\n[PASS] test_aReenteringCoinCannotReenterAndIsNotPaidTwice() (gas: 2668935)\n[PASS] test_aReenteringCoinCannotReenterMintOrRebalanceFromRedeem() (gas: 3865756)\n[PASS] test_aThinResidualPoolDoesNotStarveAFlooredMint() (gas: 3598885)\n[PASS] test_anUnsubmittedAnswerDoesNotSurviveAFailedLaterAsk() (gas: 1356525)\n[PASS] test_askRevertsWholeWhenTheIntakeRefuses() (gas: 334213)\n[PASS] test_askThresholdIsExactlyThreeQuartersOfAnImd() (gas: 1101757)\n[PASS] test_closeRequestNeedsAnOpenOne() (gas: 1003747)\n[PASS] test_closingARequestDoesNotResetTheInterval() (gas: 1161894)\n[PASS] test_mintCannotBeFreeWhenTheIndexHoldsValue() (gas: 1767683)\n[PASS] test_onOracleResultAfterCloseIsIgnored() (gas: 1098689)\n[PASS] test_onOracleResultWithFiveEntriesFitsTheStipend() (gas: 1144000)\n[PASS] test_oneGasBurningCoinDoesNotBlockRedeemGivenGas() (gas: 1666702)\n[PASS] test_rebalanceBuyMovesAPoolAtMostTwoPercent() (gas: 3708965)\n[PASS] test_rebalanceBuyStopsAtAQuarterWeight() (gas: 4039961)\n[PASS] test_rebalanceDoesNotTrimWithFewerThanFourCoins() (gas: 3275415)\n[PASS] test_rebalanceSellMovesAPoolAtMostTwoPercent() (gas: 3308625)\n[PASS] test_rebalanceTrimsToAQuarterNotBelow() (gas: 3797382)\n[PASS] test_redeemHalfPercentStaysWithRemainingHolders() (gas: 1555707)\n[PASS] test_redeemIdleImdThatCannotBeSentIsOwed() (gas: 1394007)\n[PASS] test_redeemToATokenWithoutCodeBecomesOwedAndClaimableLater() (gas: 1266147)\n[PASS] test_residualsAreRedeemedAndADeadOneBlocksMintWithoutTakingImd() (gas: 5296057)\n[PASS] test_rewardsNeverDipIntoIdleImd() (gas: 2724139)\n[PASS] test_sharesTransferLikeAnyErc20AndMoveNoHoldings() (gas: 1463090)\n[PASS] test_submitAndRebalancePayNoRewardWithoutFees() (gas: 3266014)\n[PASS] test_submitRejectsATamperedAnswerEvenWithAValidSignatureElsewhere() (gas: 1142590)\n[PASS] test_submitRejectsAnAttestationSignedForAnotherChain() (gas: 1444342)\n[PASS] test_submitRejectsAnAttestationSignedForAnotherConsumer() (gas: 1109787)\n[PASS] test_submitRejectsMalformedAnswerBytes() (gas: 1347909)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 500.95ms (1.10s CPU time)\n\nRan 3 tests for test/Imdex5RebalanceNothingOut.t.sol:Imdex5RebalanceNothingOutTest\n[PASS] test_aRebalanceBuyThatDeliversNothingIsSkipped() (gas: 3554835)\n[PASS] test_aRebalanceBuyThatPaysDustIsSkippedAndAFairOneTrades() (gas: 5824331)\n[PASS] test_aRebalanceSellThatPaysNothingIsSkipped() (gas: 3077196)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 501.05ms (8.23ms CPU time)\n\nRan 6 tests for test/Imdex5ResidualSpot.t.sol:Imdex5ResidualSpotTest\n[PASS] testFuzz_aDeadResidualFailsTheMintAtAnyPrice(uint256,uint256) (runs: 256, μ: 4332164, ~: 4332136)\nLogs:\n  Bound result 999999\n  Bound result 3600\n\n[PASS] testFuzz_aDumpedResidualThatTradesIsBoughtInFull(uint256,uint256) (runs: 256, μ: 4327369, ~: 4327460)\nLogs:\n  Bound result 176\n  Bound result 994999000000000000044\n\n[PASS] test_aDumpedResidualWhoseBuyRevertsCannotBeMintedAtSpot() (gas: 4719189)\n[PASS] test_aResidualHookThatBurnsGasFailsTheMint() (gas: 5759824)\n[PASS] test_aResidualHookThatLeavesADeltaFailsTheMint() (gas: 4184860)\n[PASS] test_aResidualShortFillIsChargedAtLeastItsFairValue() (gas: 4162861)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 529.23ms (821.65ms CPU time)\n\nRan 21 tests for test/Imdex5MustAttack.t.sol:Imdex5MustAttackTest\n[PASS] testFuzz_dustMintsRoundAgainstTheMinter(uint256) (runs: 200, μ: 1914569, ~: 1914720)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_heldTracksBalanceThroughEveryPath(uint16,uint256) (runs: 64, μ: 7864190, ~: 7876691)\nLogs:\n  Bound result 13\n  Bound result 16292\n\n[PASS] testFuzz_mintKeepsOnlyWhatItSpends(uint256,uint256) (runs: 200, μ: 2882652, ~: 2882707)\nLogs:\n  Bound result 1043727738203858024858\n  Bound result 3467419166308302189410\n\n[PASS] testFuzz_mintNeverDilutesPerShare(uint256,uint256,uint256) (runs: 300, μ: 2989478, ~: 2998704)\nLogs:\n  Bound result 3\n  Bound result 43572987471554833870\n  Bound result 2156595945001528631478\n\n[PASS] testFuzz_mintNeverIssuesBelowTheFloor(uint256,uint256,uint256,uint256) (runs: 300, μ: 2165321, ~: 2212664)\nLogs:\n  Bound result 1\n  Bound result 6048343\n  Bound result 1750858071\n  Bound result 38176593\n\n[PASS] testFuzz_redeemAlwaysPaysProRata(uint256,bool) (runs: 200, μ: 3358189, ~: 3182548)\nLogs:\n  Bound result 4002\n\n[PASS] testFuzz_residualDumpedThenBoughtInFullDilutesNobodyInCoins(uint256,uint256) (runs: 100, μ: 4763332, ~: 4763426)\nLogs:\n  Bound result 228\n  Bound result 65745656028961577779\n\n[PASS] testFuzz_residualShortFillAtUndisturbedPriceDilutesNobody(uint16,uint256) (runs: 100, μ: 5237443, ~: 5237405)\nLogs:\n  Bound result 2588\n  Bound result 205614647028961577779\n\n[PASS] testFuzz_underQuorumDeliveryIsIgnored(uint16) (runs: 50, μ: 1081384, ~: 1081454)\nLogs:\n  Bound result 2\n\n[PASS] test_answerOtherThanDeliveredIsRefused() (gas: 1126082)\n[PASS] test_callbackFromAnyoneElseIsIgnored() (gas: 1062537)\n[PASS] test_expiredAnswerNeverChangesTheList() (gas: 1455673)\n[PASS] test_floorAboveRequestAlwaysReverts() (gas: 1226882)\n[PASS] test_floorBoundaryIsExact() (gas: 3488224)\n[PASS] test_futureIssuedAnswerIsRefused() (gas: 1093115)\n[PASS] test_owedCoinsAreTheOnlyGapBetweenHeldAndBalance() (gas: 1740619)\n[PASS] test_redeemPaysWhenEveryCoinAndPoolMisbehaves() (gas: 4089935)\n[PASS] test_residualShortFillDoesNotCutSharesBelowFloor() (gas: 4833676)\n[PASS] test_revertedMintsTakeNothing_everyPath() (gas: 9268454)\n[PASS] test_underQuorumSignedAnswerNeverChangesTheList() (gas: 1092175)\n[PASS] test_wrongSignerAndReplayAreRefused() (gas: 1491573)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 529.39ms (3.23s CPU time)\n\nRan 48 tests for test/Imdex5.t.sol:Imdex5Test\n[PASS] testFuzz_mintThenRedeemNeverPaysMoreThanDeposited(uint256,uint256) (runs: 256, μ: 2431622, ~: 2413929)\nLogs:\n  Bound result 994999999999999999999\n  Bound result 3600\n\n[PASS] test_askPaysIntakeAndCaller() (gas: 1137820)\n[PASS] test_askReturnsWithoutFees() (gas: 155189)\n[PASS] test_askSevenDayInterval() (gas: 1189679)\n[PASS] test_bodyIsTheJsonTheBriefDescribes() (gas: 30573)\n[PASS] test_closeRequestAfterTwoDays() (gas: 1027162)\n[PASS] test_deployment() (gas: 94831)\n[PASS] test_feeImdOnlyLeavesForOracleAndRewards() (gas: 4953702)\n[PASS] test_fundAddsToFeeImd() (gas: 147750)\n[PASS] test_hookCannotReenter() (gas: 5165847)\n[PASS] test_mintBuysProportionallyAndRefunds() (gas: 1830731)\n[PASS] test_mintFirstBuysEqualPartsAndTakesFee() (gas: 1104287)\n[PASS] test_mintFirstKeepsWhatAPoolCouldNotTakeAsIdle() (gas: 1324958)\n[PASS] test_mintFirstRequiresZeroSupplyAndRightLength() (gas: 1022265)\n[PASS] test_mintFirstRevertsOnMinOut() (gas: 727292)\n[PASS] test_mintFirstRevertsWhenABuyFails() (gas: 814715)\n[PASS] test_mintFirstRevertsWhenABuyReturnsNothing() (gas: 2113671)\n[PASS] test_mintNeverIssuesSharesForNothing() (gas: 328007)\n[PASS] test_mintRequiresSupply() (gas: 40062)\n[PASS] test_mintRevertsOverMaxImdIn() (gas: 1733451)\n[PASS] test_mintRevertsWhenABuyFailsButScalesANonzeroShortFill() (gas: 2276274)\n[PASS] test_mintRoundsAgainstTheMinter() (gas: 1712059)\n[PASS] test_onOracleFailureOnlyFromIntake() (gas: 1064889)\n[PASS] test_onOracleResultStoresOnlyTheOpenRequestFromTheIntake() (gas: 1302614)\n[PASS] test_rebalanceNeedsAList() (gas: 41318)\n[PASS] test_rebalanceSellsAdoptsAndBuys() (gas: 5314843)\n[PASS] test_rebalanceSkipsADeadPool() (gas: 2986813)\n[PASS] test_rebalanceSkipsAHookThatLeavesAnUnsettledDelta() (gas: 3905692)\n[PASS] test_rebalanceSurvivesAHookThatBurnsAllGas() (gas: 5523181)\n[PASS] test_rebalanceTrimsAHoldingOverAQuarter() (gas: 3483754)\n[PASS] test_rebalanceWithNothingHeld() (gas: 2266196)\n[PASS] test_redeemCannotBeBlockedByACoin() (gas: 1575798)\n[PASS] test_redeemLastSharesPaysEverything() (gas: 2144787)\n[PASS] test_redeemPaysInKindLessHalfPercent() (gas: 1347551)\n[PASS] test_redeemRejectsZeroAndTooMany() (gas: 986277)\n[PASS] test_redeemSurvivesCoinsThatBurnAllGas() (gas: 4399653)\n[PASS] test_redeemToImdChargesTheFeeWhileOthersHold() (gas: 1669851)\n[PASS] test_redeemToImdPaysAShortFillInKindLessHalfPercent() (gas: 1781855)\n[PASS] test_redeemToImdPaysInKindWhenASaleFails() (gas: 2970886)\n[PASS] test_redeemToImdRevertsBelowMinOut() (gas: 1784845)\n[PASS] test_redeemToImdSellsAndTheLastHolderPaysNoFee() (gas: 1753012)\n[PASS] test_redeemToImdSurvivesAHookThatBurnsGas() (gas: 2458804)\n[PASS] test_submitRejectsASignedAttestationWithoutQuorum() (gas: 1128741)\n[PASS] test_submitRejectsAnExpiredAttestation() (gas: 1089458)\n[PASS] test_submitRejectsBadLists() (gas: 4717094)\n[PASS] test_submitRejectsWrongAnswerAndForgedSignature() (gas: 1645920)\n[PASS] test_submitStoresTheNextListAndRewards() (gas: 1527045)\n[PASS] test_unlockCallbackAndSwapSelfAreNotCallable() (gas: 103382)\nSuite result: ok. 48 passed; 0 failed; 0 skipped; finished in 581.55ms (620.52ms CPU time)\n\nRan 9 tests for test/Imdex5TaxEverywhere.t.sol:Imdex5TaxEverywhereTest\n[PASS] testFuzz_everyCoinTaxedLifecycle(uint16[5],uint256,uint256,uint256) (runs: 200, μ: 9130310, ~: 9137894)\nLogs:\n  Bound result 522\n  Bound result 4\n  Bound result 0\n  Bound result 1650\n  Bound result 5\n  Bound result 1000000000000000001\n  Bound result 145307749937601156090\n  Bound result 351550328808361567419\n\n[PASS] testFuzz_theMostTaxedCoinDecidesTheMint(uint8,uint16,uint16,uint256) (runs: 200, μ: 2679078, ~: 2707883)\nLogs:\n  Bound result 4\n  Bound result 88\n  Bound result 23\n  Bound result 499000000000000000168\n\n[PASS] test_aCoinTaxingItsOwnSettlementIsNeverSoldAndIsPaidInKind() (gas: 6636522)\n[PASS] test_aCoinTaxingItsOwnSettlementStaysAResidualThroughARebalance() (gas: 7215158)\n[PASS] test_aCoinThatKeepsEverythingFailsALaterMintWholeAndRedeemsStillPay() (gas: 6648639)\n[PASS] test_aCoinThatKeepsEverythingFailsTheFirstMintWhole() (gas: 1464724)\n[PASS] test_aCoinThatKeepsEverythingFailsTheOneWeiMint() (gas: 3416083)\n[PASS] test_aDonationNeitherChangesHeldNorInflatesAMintOrARedeem() (gas: 2474905)\n[PASS] test_taxOnTopOfAPartialFillCreditsTheNetAndMintsThatFraction() (gas: 5236820)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 582.03ms (861.91ms CPU time)\n\nRan 1 test for test/Imdex5TaxEverywhere.t.sol:Imdex5AllCoinsTaxedInvariantTest\n[PASS]\nImdex5AllCoinsTaxedInvariantTest invariants:\n[PASS] invariant_taxed_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_taxed_coinBalancesAreHeldPlusOwed\n[PASS] invariant_taxed_everyHoldingIsListed\n[PASS] invariant_taxed_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_taxed_zeroSupplyMeansNothingHeld\n Imdex5AllCoinsTaxedInvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 209   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 245   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 212   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 432   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 222   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 244   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 205   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 225   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 203   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 205   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 218   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 199   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 194   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 233   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 179   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| TaxKnobs      | setTax           | 209   | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2228\n  Bound result 39596972668088003129\n  Bound result 159708578027544712484\n  Bound result 1435743504598885\n  Bound result 4046341548624796396\n  Bound result 37241578766611975504\n  Bound result 561081\n  Bound result 18352\n  Bound result 4823\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.39s (1.39s CPU time)\n\nRan 1 test for test/Imdex5.invariant.t.sol:Imdex5InvariantTest\n[PASS]\nImdex5InvariantTest invariants:\n[PASS] invariant_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_coinBalancesAreHeldPlusOwed\n[PASS] invariant_feeImdLeavesOnlyForTheOracleAndRewards\n[PASS] invariant_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_listShape\n[PASS] invariant_noFreeMintWhileValueIsHeld\n[PASS] invariant_requestStateIsConsistent\n[PASS] invariant_zeroSupplyMeansNothingHeld\n Imdex5InvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 195   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 207   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | closeRequest     | 200   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverFailure   | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 189   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 196   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 368   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 201   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 196   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 217   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 243   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 195   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 207   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 217   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 186   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 191   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 220   | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000\n  Bound result 250000000000000000\n  Bound result 37923870581915909\n  Bound result 130108602367599074406\n  Bound result 4989\n  Bound result 499999999999999999941\n  Bound result 21341\n  Bound result 386061618322534054000\n  Bound result 211801472\n  Bound result 691198\n  Bound result 124999999899721100\n  Bound result 900\n  Bound result 15922815939445932\n  Bound result 300000000000000000000\n  Bound result 3798186580743\n  Bound result 8642824578239728897406\n  Bound result 51200\n  Bound result 307200\n  Bound result 12075\n  Bound result 76800\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.86s (1.85s CPU time)\n\nRan 1 test for test/Imdex5Floor.invariant.t.sol:Imdex5FloorInvariantTest\n[PASS]\nImdex5FloorInvariantTest invariants:\n[PASS] invariant_heldIsTheRealBalance\n[PASS] invariant_mintNeverDilutesListCoinsOrIdle\n[PASS] invariant_noMintBelowTheFloor\n[PASS] invariant_noSharesMeansNothingHeld\n[PASS] invariant_redeemAlwaysPays\n[PASS] invariant_revertedMintMovesNothing\n Imdex5FloorInvariantTest invariants (runs: 128, calls: 5120, reverts: 485)\n\n╭--------------------+-------------+-------+---------+----------╮\n| Contract           | Selector    | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5FloorHandler | claim       | 476   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | mint        | 1355  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | mintFirst   | 471   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | movePrice   | 488   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | rebalanceTo | 485   | 485     | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | redeem      | 461   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | redeemToImd | 452   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | setMaxIn    | 486   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | setTax      | 446   | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 52\n  Bound result 64\n  Bound result 12\n  Bound result 22841\n  Bound result 400\n  Bound result 250000000000000000000\n  Bound result 97\n  Bound result 233\n  Bound result 795000000000000000000\n  Bound result 229\n  Bound result 9950\n  Bound result 18\n  Bound result 2074\n  Bound result 4000000\n  Bound result 352211168179509276680912\n  Bound result 250\n  Bound result 302\n  Bound result 935410\n  Bound result 128309\n  Bound result 1283\n  Bound result 10\n  Bound result 769\n  Bound result 900\n  Bound result 523207357319650500753\n  Bound result 3476\n  Bound result 2112\n  Bound result 12345\n  Bound result 762\n  Bound result 999906\n  Bound result 13781\n  Bound result 19155\n  Bound result 9811\n  Bound result 3914\n  Bound result 82\n  Bound result 1738\n  Bound result 935796\n  Bound result 776161\n  Bound result 19\n  Bound result 770409809069669228099\n  Bound result 19\n  Bound result 739754773258269297475\n  Bound result 11814\n  Bound result 3349\n  Bound result 3889\n  Bound result 4977\n  Bound result 5000000000000000000\n  Bound result 632713822234561492774\n  Bound result 628057317341387608512442\n  Bound result 385\n  Bound result 395037\n  Bound result 32684\n  Bound result 500000000000000000000\n  Bound result 1000\n  Bound result 1046363170\n  Bound result 189000000000000000000\n  Bound result 352710984976227550984\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.50s (2.50s CPU time)\n\nRan 1 test for test/Imdex5.invariant.t.sol:Imdex5TaxedCoinInvariantTest\n[PASS]\nImdex5TaxedCoinInvariantTest invariants:\n[PASS] invariant_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_coinBalancesAreHeldPlusOwed\n[PASS] invariant_feeImdLeavesOnlyForTheOracleAndRewards\n[PASS] invariant_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_listShape\n[PASS] invariant_noFreeMintWhileValueIsHeld\n[PASS] invariant_requestStateIsConsistent\n[PASS] invariant_zeroSupplyMeansNothingHeld\n Imdex5TaxedCoinInvariantTest invariants (runs: 256, calls: 128000, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 6636  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 6695  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | closeRequest     | 6752  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverFailure   | 6801  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 6714  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 6680  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 13445 | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 6752  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 6685  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 6897  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 6601  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 6664  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 6713  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 6671  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 6830  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 6860  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 6729  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 6875  | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5000\n  Bound result 10000\n  Bound result 9950\n  Bound result 1\n  Bound result 2500\n  Bound result 14596\n  Bound result 5000\n  Bound result 9922775678212469121411\n  Bound result 259200\n  Bound result 3896\n  Bound result 10100\n  Bound result 50000000000000000000\n  Bound result 31337\n  Bound result 111616\n  Bound result 156\n  Bound result 537600\n  Bound result 97\n  Bound result 995\n  Bound result 10205\n  Bound result 1002\n  Bound result 986634463242516293634\n  Bound result 3\n  Bound result 14787\n  Bound result 1000000\n  Bound result 12398\n  Bound result 15\n  Bound result 12\n  Bound result 24576\n  Bound result 16275\n  Bound result 13221\n  Bound result 51200\n  Bound result 6404\n  Bound result 4000000\n  Bound result 3301\n  Bound result 2968\n  Bound result 9204\n  Bound result 18334\n  Bound result 10132\n  Bound result 50000000000000000000\n  Bound result 19529035837012967424\n  Bound result 1\n  Bound result 20036\n  Bound result 339\n  Bound result 244124153722729520859\n  Bound result 13\n  Bound result 64\n  Bound result 16256747033301207744\n  Bound result 574\n  Bound result 4000000\n  Bound result 3738\n  Bound result 231085584961338462284\n  Bound result 227787\n  Bound result 690\n  Bound result 5452710964165319844996\n  Bound result 261\n  Bound result 192161677547341\n  Bound result 995\n  Bound result 383229\n  Bound result 127\n  Bound result 691200\n  Bound result 19692\n  Bound result 37\n  Bound result 1561568134220081\n  Bound result 60\n  Bound result 1\n  Bound result 41\n  Bound result 3000000000000000000\n  Bound result 23\n  Bound result 1057584990\n  Bound result 3\n  Bound result 1000000\n  Bound result 10\n  Bound result 100\n  Bound result 164\n  Bound result 194040\n  Bound result 1000\n  Bound result 17740\n  Bound result 100000000000000000000\n  Bound result 900\n  Bound result 839\n  Bound result 86400\n  Bound result 5290\n  Bound result 16091\n  Bound result 298500000000000000000\n  Bound result 12500\n  Bound result 1175\n  Bound result 9189\n  Bound result 17026\n  Bound result 665599\n  Bound result 467983\n  Bound result 1230981784736890880\n  Bound result 9999\n  Bound result 8214\n  Bound result 20835\n  Bound result 64555113031370214551\n  Bound result 495225\n  Bound result 4294967295\n  Bound result 29972353795135207118\n  Bound result 2037090745\n  Bound result 3988822378723970342\n  Bound result 719098455508\n  Bound result 390607565778990750519\n  Bound result 100\n  Bound result 401500446371068597093\n  Bound result 7013\n  Bound result 45135272741319115404\n  Bound result 98000000000000000000\n  Bound result 100000\n  Bound result 1447874004306104728783\n  Bound result 512669\n  Bound result 371636862\n  Bound result 5\n  Bound result 10100\n  Bound result 45005851881584441735\n  Bound result 271584\n  Bound result 2000\n  Bound result 46000000000000000000\n  Bound result 24\n  Bound result 409600\n  Bound result 9028\n  Bound result 4854\n  Bound result 4191\n  Bound result 1383378919\n  Bound result 615\n  Bound result 534885\n  Bound result 10868998138528\n  Bound result 691200\n  Bound result 5460\n  Bound result 112404\n  Bound result 250000000000000000000\n  Bound result 16959\n  Bound result 1281\n  Bound result 614400\n  Bound result 1042189535521990014739\n  Bound result 1962561236446395606650\n  Bound result 44220867903532052528\n  Bound result 1000000000000000000007\n  Bound result 14629\n  Bound result 44513813373555797608\n  Bound result 14636\n  Bound result 737\n  Bound result 33236839714825751583\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 60.44s (60.43s CPU time)\n\nRan 18 test suites in 60.44s (70.57s CPU time): 177 tests passed, 0 failed, 7 skipped (184 total tests)\n","passed":true},{"durationMs":89,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Imdex5.approve(address,uint256)\",\"Imdex5.ask()\",\"Imdex5.claim(address)\",\"Imdex5.closeRequest()\",\"Imdex5.fund(uint256)\",\"Imdex5.mint(uint256,uint256,uint256)\",\"Imdex5.mintFirst(uint256,uint256[])\",\"Imdex5.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Imdex5.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Imdex5.rebalance()\",\"Imdex5.redeem(uint256)\",\"Imdex5.redeemToImd(uint256,uint256)\",\"Imdex5.submit((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Imdex5.swapSelf(address,address,bool,uint256,bool,bool)\",\"Imdex5.transfer(address,uint256)\",\"Imdex5.transferFrom(address,address,uint256)\",\"Imdex5.unlockCallback(bytes)\"],\"files\":{\".gitignore\":2,\"ADAPTATION.md\":328,\"README.md\":361,\"THREAT_MODEL.md\":49,\"foundry.toml\":19,\"launch.json\":10,\"src/Imdex5.sol\":680,\"src/Interfaces.sol\":61,\"src/OracleAttestation.sol\":221,\"test/Fix3.fork.t.sol\":97,\"test/Fix3Floor.fork.t.sol\":67,\"test/Fix3Rebalance.fork.t.sol\":151,\"test/Imdex5.invariant.t.sol\":544,\"test/Imdex5.t.sol\":1070,\"test/Imdex5Base.sol\":175,\"test/Imdex5DocumentedLimits.t.sol\":239,\"test/Imdex5Edges.t.sol\":741,\"test/Imdex5Floor.invariant.t.sol\":335,\"test/Imdex5MustAttack.t.sol\":596,\"test/Imdex5RebalanceNothingOut.t.sol\":106,\"test/Imdex5ResidualSpot.t.sol\":182,\"test/Imdex5Revised.t.sol\":522,\"test/Imdex5ShortFill.t.sol\":226,\"test/Imdex5TaxEverywhere.t.sol\":529,\"test/Imdex5TaxedCoin.t.sol\":252,\"test/OracleConsumerConformance.t.sol\":74,\"test/mocks/AttackMocks.sol\":85,\"test/mocks/Mocks.sol\":337,\"test/mocks/PoolTaxERC20.sol\":25,\"test/mocks/TaxERC20.sol\":36},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"832e4fb35c92624c0a210b304d83867c2836c858d994c3c0f7feafcb4575f774","verifiedTreeHash":"6bc0339fc9e95c36e1f9caf682bb028e345d0961","verifierVersion":"0.1.0+560ab6a2"},{"checks":[{"durationMs":113016,"exitCode":0,"name":"build","output":"Compiling 68 files with Solc 0.8.26\nSolc 0.8.26 finished in 112.91s\nCompiler run successful with warnings:\nWarning (2018): Function state mutability can be restricted to pure\n   --> src/Imdex5.sol:619:5:\n    |\n619 |     function _amountValue(address token, uint256 amount, uint256 sqrtP, Math.Rounding r)\n    |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Fix3.fork.t.sol:76:5:\n   |\n76 |     function _checkBacked(Imdex5.Coin[] memory cs, string memory when) internal {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\nWarning (2018): Function state mutability can be restricted to view\n  --> test/Fix3Rebalance.fork.t.sol:44:5:\n   |\n44 |     function _backed(string memory when) internal {\n   |     ^ (Relevant source part starts here and spans across multiple lines).\n\n","passed":true},{"durationMs":58155,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/Fix3.fork.t.sol:Fix3ForkTest\n[SKIP] test_fixed_with_1000_IMD() (gas: 0)\n[SKIP] test_fixed_with_100_IMD() (gas: 0)\n[SKIP] test_fixed_with_10_IMD() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 387.68µs (90.85µs CPU time)\n\nRan 1 test for test/Fix3Floor.fork.t.sol:Fix3FloorForkTest\n[SKIP: skipped] setUp() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 1 skipped; finished in 258.46µs (0.00ns CPU time)\n\nRan 3 tests for test/Fix3Rebalance.fork.t.sol:Fix3RebalanceForkTest\n[SKIP] test_dropTheTaxedCoin_fourRemain() (gas: 0)\n[SKIP] test_reorderSameFive() (gas: 0)\n[SKIP] test_shrinkToThree_bigFund() (gas: 0)\nSuite result: ok. 0 passed; 0 failed; 3 skipped; finished in 435.19µs (154.41µs CPU time)\n\nRan 2 tests for test/OracleConsumerConformance.t.sol:OracleConsumerConformanceTest\n[PASS] test_callbackSelectorIsCanonical() (gas: 4542)\n[PASS] test_digestMatchesTheProtocol() (gas: 13358)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 544.25µs (64.43µs CPU time)\n\nRan 6 tests for test/Imdex5DocumentedLimits.t.sol:Imdex5DocumentedLimitsTest\n[PASS] test_aClosedRequestCostsTheWholeWeek() (gas: 1161557)\n[PASS] test_aFailedRequestCostsTheWholeWeek() (gas: 1239424)\n[PASS] test_aFailedRequestLeavesEveryImdAccounted() (gas: 3588988)\n[PASS] test_aLeaverDumpedBeforeARebalanceIsSoldAtTheDumpedPriceAndBooked() (gas: 5360659)\n[PASS] test_aLimitedSaleSellsAboutOnePercentOfTheReservePerRebalance() (gas: 5819675)\n[PASS] test_aPoolMovedBeforeARebalanceIsBoughtAtTheMovedPriceAndBooked() (gas: 4770587)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 14.32ms (12.02ms CPU time)\n\nRan 9 tests for test/Imdex5ShortFill.t.sol:Imdex5ShortFillTest\n[PASS] testFuzz_mintUsesTheLeastFilledCoinAndChargesEveryBuy(uint256,uint16[5]) (runs: 256, μ: 1633301, ~: 1641669)\nLogs:\n  Bound result 499000000000000003547\n  Bound result 3592\n  Bound result 9805\n  Bound result 9999\n  Bound result 3692\n  Bound result 7861\n\n[PASS] test_fullFillPassesFloor() (gas: 742684)\n[PASS] test_mintRevertsAndRollsBackEarlierBuysWhenACoinDeliversZero() (gas: 1287089)\n[PASS] test_mintRevertsWhenANonzeroFillRoundsSharesToZero() (gas: 1196464)\n[PASS] test_shortFillChargesIdleImdForTheSharesIssuedOnly() (gas: 2600724)\n[PASS] test_shortFillMintsTheDeliveredFraction() (gas: 868543)\n[PASS] test_shortFillStillEnforcesMaxImdInAndRollsBack() (gas: 1739999)\n[PASS] test_sliverFillBelowFloorRevertsAndRollsBack() (gas: 1192676)\n[PASS] test_sliverFillWithoutFloorIssuesASliver() (gas: 1286856)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 476.16ms (480.76ms CPU time)\n\nRan 3 tests for test/Imdex5RebalanceNothingOut.t.sol:Imdex5RebalanceNothingOutTest\n[PASS] test_aRebalanceBuyThatDeliversNothingIsSkipped() (gas: 3554835)\n[PASS] test_aRebalanceBuyThatPaysDustIsSkippedAndAFairOneTrades() (gas: 5824331)\n[PASS] test_aRebalanceSellThatPaysNothingIsSkipped() (gas: 3077196)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 476.31ms (11.30ms CPU time)\n\nRan 7 tests for test/Imdex5TaxedCoin.t.sol:Imdex5TaxedCoinTest\n[PASS] testFuzz_taxedCoinLifecycle(uint256,uint256,uint256) (runs: 256, μ: 7860644, ~: 7866586)\nLogs:\n  Bound result 499000000000000019708\n  Bound result 499000000000000021214\n  Bound result 899000000000000000101\n\n[PASS] test_firstMintCreditsOnlyWhatArrives() (gas: 1253139)\n[PASS] test_firstMintMinOutChecksTheNetReceipt() (gas: 1358575)\n[PASS] test_lastHolderCanReceiveEveryCoinAfterAnImdExit() (gas: 2639725)\n[PASS] test_outstandingOwedIsNotCountedAsANewReceiptAndRemainsClaimable() (gas: 5187089)\n[PASS] test_taxedCoinFullLifecycle() (gas: 7855579)\n[PASS] test_taxedRebalanceBuyCreditsOnlyNewReceipts() (gas: 5602832)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 482.30ms (494.31ms CPU time)\n\nRan 6 tests for test/Imdex5ResidualSpot.t.sol:Imdex5ResidualSpotTest\n[PASS] testFuzz_aDeadResidualFailsTheMintAtAnyPrice(uint256,uint256) (runs: 256, μ: 4332164, ~: 4332136)\nLogs:\n  Bound result 41870\n  Bound result 514500996960984155724\n\n[PASS] testFuzz_aDumpedResidualThatTradesIsBoughtInFull(uint256,uint256) (runs: 256, μ: 4327369, ~: 4327460)\nLogs:\n  Bound result 870\n  Bound result 961686996960945898538\n\n[PASS] test_aDumpedResidualWhoseBuyRevertsCannotBeMintedAtSpot() (gas: 4719189)\n[PASS] test_aResidualHookThatBurnsGasFailsTheMint() (gas: 5759824)\n[PASS] test_aResidualHookThatLeavesADeltaFailsTheMint() (gas: 4184860)\n[PASS] test_aResidualShortFillIsChargedAtLeastItsFairValue() (gas: 4162861)\nSuite result: ok. 6 passed; 0 failed; 0 skipped; finished in 492.50ms (971.47ms CPU time)\n\nRan 48 tests for test/Imdex5.t.sol:Imdex5Test\n[PASS] testFuzz_mintThenRedeemNeverPaysMoreThanDeposited(uint256,uint256) (runs: 256, μ: 2431622, ~: 2413929)\nLogs:\n  Bound result 4999000000000000041871\n  Bound result 1469700996642154189164\n\n[PASS] test_askPaysIntakeAndCaller() (gas: 1137820)\n[PASS] test_askReturnsWithoutFees() (gas: 155189)\n[PASS] test_askSevenDayInterval() (gas: 1189679)\n[PASS] test_bodyIsTheJsonTheBriefDescribes() (gas: 30573)\n[PASS] test_closeRequestAfterTwoDays() (gas: 1027162)\n[PASS] test_deployment() (gas: 94831)\n[PASS] test_feeImdOnlyLeavesForOracleAndRewards() (gas: 4953702)\n[PASS] test_fundAddsToFeeImd() (gas: 147750)\n[PASS] test_hookCannotReenter() (gas: 5165847)\n[PASS] test_mintBuysProportionallyAndRefunds() (gas: 1830731)\n[PASS] test_mintFirstBuysEqualPartsAndTakesFee() (gas: 1104287)\n[PASS] test_mintFirstKeepsWhatAPoolCouldNotTakeAsIdle() (gas: 1324958)\n[PASS] test_mintFirstRequiresZeroSupplyAndRightLength() (gas: 1022265)\n[PASS] test_mintFirstRevertsOnMinOut() (gas: 727292)\n[PASS] test_mintFirstRevertsWhenABuyFails() (gas: 814715)\n[PASS] test_mintFirstRevertsWhenABuyReturnsNothing() (gas: 2113671)\n[PASS] test_mintNeverIssuesSharesForNothing() (gas: 328007)\n[PASS] test_mintRequiresSupply() (gas: 40062)\n[PASS] test_mintRevertsOverMaxImdIn() (gas: 1733451)\n[PASS] test_mintRevertsWhenABuyFailsButScalesANonzeroShortFill() (gas: 2276274)\n[PASS] test_mintRoundsAgainstTheMinter() (gas: 1712059)\n[PASS] test_onOracleFailureOnlyFromIntake() (gas: 1064889)\n[PASS] test_onOracleResultStoresOnlyTheOpenRequestFromTheIntake() (gas: 1302614)\n[PASS] test_rebalanceNeedsAList() (gas: 41318)\n[PASS] test_rebalanceSellsAdoptsAndBuys() (gas: 5314843)\n[PASS] test_rebalanceSkipsADeadPool() (gas: 2986813)\n[PASS] test_rebalanceSkipsAHookThatLeavesAnUnsettledDelta() (gas: 3905692)\n[PASS] test_rebalanceSurvivesAHookThatBurnsAllGas() (gas: 5523181)\n[PASS] test_rebalanceTrimsAHoldingOverAQuarter() (gas: 3483754)\n[PASS] test_rebalanceWithNothingHeld() (gas: 2266196)\n[PASS] test_redeemCannotBeBlockedByACoin() (gas: 1575798)\n[PASS] test_redeemLastSharesPaysEverything() (gas: 2144787)\n[PASS] test_redeemPaysInKindLessHalfPercent() (gas: 1347551)\n[PASS] test_redeemRejectsZeroAndTooMany() (gas: 986277)\n[PASS] test_redeemSurvivesCoinsThatBurnAllGas() (gas: 4399653)\n[PASS] test_redeemToImdChargesTheFeeWhileOthersHold() (gas: 1669851)\n[PASS] test_redeemToImdPaysAShortFillInKindLessHalfPercent() (gas: 1781855)\n[PASS] test_redeemToImdPaysInKindWhenASaleFails() (gas: 2970886)\n[PASS] test_redeemToImdRevertsBelowMinOut() (gas: 1784845)\n[PASS] test_redeemToImdSellsAndTheLastHolderPaysNoFee() (gas: 1753012)\n[PASS] test_redeemToImdSurvivesAHookThatBurnsGas() (gas: 2458804)\n[PASS] test_submitRejectsASignedAttestationWithoutQuorum() (gas: 1128741)\n[PASS] test_submitRejectsAnExpiredAttestation() (gas: 1089458)\n[PASS] test_submitRejectsBadLists() (gas: 4717094)\n[PASS] test_submitRejectsWrongAnswerAndForgedSignature() (gas: 1645920)\n[PASS] test_submitStoresTheNextListAndRewards() (gas: 1527045)\n[PASS] test_unlockCallbackAndSwapSelfAreNotCallable() (gas: 103382)\nSuite result: ok. 48 passed; 0 failed; 0 skipped; finished in 492.45ms (532.12ms CPU time)\n\nRan 21 tests for test/Imdex5MustAttack.t.sol:Imdex5MustAttackTest\n[PASS] testFuzz_dustMintsRoundAgainstTheMinter(uint256) (runs: 200, μ: 1914569, ~: 1914720)\nLogs:\n  Bound result 1\n\n[PASS] testFuzz_heldTracksBalanceThroughEveryPath(uint16,uint256) (runs: 64, μ: 7864190, ~: 7876691)\nLogs:\n  Bound result 13\n  Bound result 16292\n\n[PASS] testFuzz_mintKeepsOnlyWhatItSpends(uint256,uint256) (runs: 200, μ: 2882652, ~: 2882707)\nLogs:\n  Bound result 1043727738203858024858\n  Bound result 3467419166308302189410\n\n[PASS] testFuzz_mintNeverDilutesPerShare(uint256,uint256,uint256) (runs: 300, μ: 2989478, ~: 2998704)\nLogs:\n  Bound result 1\n  Bound result 667\n  Bound result 133067035277826613749\n\n[PASS] testFuzz_mintNeverIssuesBelowTheFloor(uint256,uint256,uint256,uint256) (runs: 300, μ: 2165321, ~: 2212664)\nLogs:\n  Bound result 3\n  Bound result 95\n  Bound result 20282\n  Bound result 8336\n\n[PASS] testFuzz_redeemAlwaysPaysProRata(uint256,bool) (runs: 200, μ: 3358189, ~: 3182548)\nLogs:\n  Bound result 4002\n\n[PASS] testFuzz_residualDumpedThenBoughtInFullDilutesNobodyInCoins(uint256,uint256) (runs: 100, μ: 4763332, ~: 4763426)\nLogs:\n  Bound result 228\n  Bound result 65745656028961577779\n\n[PASS] testFuzz_residualShortFillAtUndisturbedPriceDilutesNobody(uint16,uint256) (runs: 100, μ: 5237443, ~: 5237405)\nLogs:\n  Bound result 2588\n  Bound result 205614647028961577779\n\n[PASS] testFuzz_underQuorumDeliveryIsIgnored(uint16) (runs: 50, μ: 1081384, ~: 1081454)\nLogs:\n  Bound result 2\n\n[PASS] test_answerOtherThanDeliveredIsRefused() (gas: 1126082)\n[PASS] test_callbackFromAnyoneElseIsIgnored() (gas: 1062537)\n[PASS] test_expiredAnswerNeverChangesTheList() (gas: 1455673)\n[PASS] test_floorAboveRequestAlwaysReverts() (gas: 1226882)\n[PASS] test_floorBoundaryIsExact() (gas: 3488224)\n[PASS] test_futureIssuedAnswerIsRefused() (gas: 1093115)\n[PASS] test_owedCoinsAreTheOnlyGapBetweenHeldAndBalance() (gas: 1740619)\n[PASS] test_redeemPaysWhenEveryCoinAndPoolMisbehaves() (gas: 4089935)\n[PASS] test_residualShortFillDoesNotCutSharesBelowFloor() (gas: 4833676)\n[PASS] test_revertedMintsTakeNothing_everyPath() (gas: 9268454)\n[PASS] test_underQuorumSignedAnswerNeverChangesTheList() (gas: 1092175)\n[PASS] test_wrongSignerAndReplayAreRefused() (gas: 1491573)\nSuite result: ok. 21 passed; 0 failed; 0 skipped; finished in 553.40ms (2.26s CPU time)\n\nRan 27 tests for test/Imdex5Revised.t.sol:Imdex5RevisedTest\n[PASS] testFuzz_mintFirstKeepsAPartialFillIdle(uint256,uint256) (runs: 256, μ: 1103875, ~: 1103903)\nLogs:\n  Bound result 41870\n  Bound result 3124\n\n[PASS] testFuzz_redeemToImdPaysADeadCoinExactlyAsRedeemDoes(uint256) (runs: 256, μ: 2006112, ~: 1997273)\nLogs:\n  Bound result 36094350109516419251\n\n[PASS] testFuzz_redeemToImdPaysAShortFillInKindUnderTheRedeemRule(uint256,uint256) (runs: 256, μ: 1830218, ~: 1830423)\nLogs:\n  Bound result 994000000000000007760\n  Bound result 981211884\n\n[PASS] test_aCoinThatBurnsItsGasIsOwedAndTheIdleImdStillPaid() (gas: 1632787)\n[PASS] test_askAndCloseAtTheirExactBoundaries() (gas: 1205506)\n[PASS] test_askIsBlockedWhileAListAwaitsRebalance() (gas: 3311094)\n[PASS] test_claimThatFailsKeepsTheDebt() (gas: 1297142)\n[PASS] test_hookCannotCallSwapSelfOrTheOracleCallbacks() (gas: 3504050)\n[PASS] test_hookCannotCloseOrAnswerTheOpenRequestDuringASwap() (gas: 4132895)\n[PASS] test_lastRedeemerToImdTakesAllOfADeadCoin() (gas: 1751646)\n[PASS] test_margUsesItsOwnHookAndTheOthersShareG() (gas: 48935)\n[PASS] test_mintFirstPartialFillIsRedeemedProRataNotTwice() (gas: 1658991)\n[PASS] test_mintFirstRefusesAPoolThatReturnsNothingOnALargeAmount() (gas: 744528)\n[PASS] test_mintFirstRefusesDustThatBuysNothing() (gas: 2164851)\n[PASS] test_mintFirstRevertsWholeWhenTheHookMisbehaves() (gas: 992464204)\n[PASS] test_mintRevertsWholeWhenTheHookBurnsGasForTheIndex() (gas: 993092592)\n[PASS] test_mintRevertsWholeWhenTheHookLeavesADeltaUnsettled() (gas: 1344999)\n[PASS] test_mintSkipsAListCoinHeldAtZeroAndTheNextRebalanceBuysIt() (gas: 5584542)\n[PASS] test_onOracleResultNeedsExactlyFourAgreed() (gas: 1159030)\n[PASS] test_owedAccumulatesAcrossRedeemsAndIsPaidOnce() (gas: 2201232)\n[PASS] test_rebalanceSkipsEveryBurningSwapAndStillAdoptsTheList() (gas: 3728848)\n[PASS] test_redeemSurvivesFiveGasBurningCoinsWithOrdinaryGas() (gas: 5815669)\n[PASS] test_redeemToImdPaysInKindWhenTheHookLeavesADeltaUnsettled() (gas: 2232685)\n[PASS] test_redeemToImdPaysInKindWhenTheSaleWouldPayNothing() (gas: 1827210)\n[PASS] test_submitRejectsALaunchWithoutAHookOrAToken() (gas: 1853617)\n[PASS] test_submitTakesAnAttestationOnce() (gas: 1461722)\n[PASS] test_submitUsesTheRegistryArtifactsNotTheStartingList() (gas: 1560405)\nSuite result: ok. 27 passed; 0 failed; 0 skipped; finished in 555.94ms (1.30s CPU time)\n\nRan 35 tests for test/Imdex5Edges.t.sol:Imdex5EdgesTest\n[PASS] testFuzz_mintBuysExactlyTheRoundedUpShare(uint256) (runs: 512, μ: 1918738, ~: 1918560)\nLogs:\n  Bound result 14218914601\n\n[PASS] testFuzz_mintFirstMintsExactlyTheRest(uint256) (runs: 512, μ: 1007840, ~: 1011747)\nLogs:\n  Bound result 14218914601\n\n[PASS] testFuzz_onOracleResultForAnotherRequestIsIgnored(bytes32,uint16) (runs: 256, μ: 1028592, ~: 1028683)\n[PASS] testFuzz_onOracleResultFromAStrangerChangesNothing(address,bytes32,uint16) (runs: 256, μ: 1075469, ~: 1075635)\n[PASS] testFuzz_redeemNeverPaysAboveProRata(uint256,uint256) (runs: 512, μ: 1557836, ~: 1558400)\nLogs:\n  Bound result 4999000000000000041871\n  Bound result 1469700996642154189164\n\n[PASS] testFuzz_splittingARedeemStaysUnderProRata(uint256,uint256) (runs: 256, μ: 1748781, ~: 1749084)\nLogs:\n  Bound result 41870\n  Bound result 590500998564422435044\n\n[PASS] test_aLaterAskReplacesAnUnsubmittedAnswer() (gas: 1887604)\n[PASS] test_aReenteringCoinCannotReenterAndIsNotPaidTwice() (gas: 2668935)\n[PASS] test_aReenteringCoinCannotReenterMintOrRebalanceFromRedeem() (gas: 3865756)\n[PASS] test_aThinResidualPoolDoesNotStarveAFlooredMint() (gas: 3598885)\n[PASS] test_anUnsubmittedAnswerDoesNotSurviveAFailedLaterAsk() (gas: 1356525)\n[PASS] test_askRevertsWholeWhenTheIntakeRefuses() (gas: 334213)\n[PASS] test_askThresholdIsExactlyThreeQuartersOfAnImd() (gas: 1101757)\n[PASS] test_closeRequestNeedsAnOpenOne() (gas: 1003747)\n[PASS] test_closingARequestDoesNotResetTheInterval() (gas: 1161894)\n[PASS] test_mintCannotBeFreeWhenTheIndexHoldsValue() (gas: 1767683)\n[PASS] test_onOracleResultAfterCloseIsIgnored() (gas: 1098689)\n[PASS] test_onOracleResultWithFiveEntriesFitsTheStipend() (gas: 1144000)\n[PASS] test_oneGasBurningCoinDoesNotBlockRedeemGivenGas() (gas: 1666702)\n[PASS] test_rebalanceBuyMovesAPoolAtMostTwoPercent() (gas: 3708965)\n[PASS] test_rebalanceBuyStopsAtAQuarterWeight() (gas: 4039961)\n[PASS] test_rebalanceDoesNotTrimWithFewerThanFourCoins() (gas: 3275415)\n[PASS] test_rebalanceSellMovesAPoolAtMostTwoPercent() (gas: 3308625)\n[PASS] test_rebalanceTrimsToAQuarterNotBelow() (gas: 3797382)\n[PASS] test_redeemHalfPercentStaysWithRemainingHolders() (gas: 1555707)\n[PASS] test_redeemIdleImdThatCannotBeSentIsOwed() (gas: 1394007)\n[PASS] test_redeemToATokenWithoutCodeBecomesOwedAndClaimableLater() (gas: 1266147)\n[PASS] test_residualsAreRedeemedAndADeadOneBlocksMintWithoutTakingImd() (gas: 5296057)\n[PASS] test_rewardsNeverDipIntoIdleImd() (gas: 2724139)\n[PASS] test_sharesTransferLikeAnyErc20AndMoveNoHoldings() (gas: 1463090)\n[PASS] test_submitAndRebalancePayNoRewardWithoutFees() (gas: 3266014)\n[PASS] test_submitRejectsATamperedAnswerEvenWithAValidSignatureElsewhere() (gas: 1142590)\n[PASS] test_submitRejectsAnAttestationSignedForAnotherChain() (gas: 1444342)\n[PASS] test_submitRejectsAnAttestationSignedForAnotherConsumer() (gas: 1109787)\n[PASS] test_submitRejectsMalformedAnswerBytes() (gas: 1347909)\nSuite result: ok. 35 passed; 0 failed; 0 skipped; finished in 555.93ms (2.77s CPU time)\n\nRan 9 tests for test/Imdex5TaxEverywhere.t.sol:Imdex5TaxEverywhereTest\n[PASS] testFuzz_everyCoinTaxedLifecycle(uint16[5],uint256,uint256,uint256) (runs: 200, μ: 9130310, ~: 9137894)\nLogs:\n  Bound result 522\n  Bound result 4\n  Bound result 0\n  Bound result 1650\n  Bound result 5\n  Bound result 1000000000000000001\n  Bound result 145307749937601156090\n  Bound result 351550328808361567419\n\n[PASS] testFuzz_theMostTaxedCoinDecidesTheMint(uint8,uint16,uint16,uint256) (runs: 200, μ: 2679078, ~: 2707883)\nLogs:\n  Bound result 4\n  Bound result 88\n  Bound result 23\n  Bound result 499000000000000000168\n\n[PASS] test_aCoinTaxingItsOwnSettlementIsNeverSoldAndIsPaidInKind() (gas: 6636522)\n[PASS] test_aCoinTaxingItsOwnSettlementStaysAResidualThroughARebalance() (gas: 7215158)\n[PASS] test_aCoinThatKeepsEverythingFailsALaterMintWholeAndRedeemsStillPay() (gas: 6648639)\n[PASS] test_aCoinThatKeepsEverythingFailsTheFirstMintWhole() (gas: 1464724)\n[PASS] test_aCoinThatKeepsEverythingFailsTheOneWeiMint() (gas: 3416083)\n[PASS] test_aDonationNeitherChangesHeldNorInflatesAMintOrARedeem() (gas: 2474905)\n[PASS] test_taxOnTopOfAPartialFillCreditsTheNetAndMintsThatFraction() (gas: 5236820)\nSuite result: ok. 9 passed; 0 failed; 0 skipped; finished in 555.85ms (1.10s CPU time)\n\nRan 1 test for test/Imdex5TaxEverywhere.t.sol:Imdex5AllCoinsTaxedInvariantTest\n[PASS]\nImdex5AllCoinsTaxedInvariantTest invariants:\n[PASS] invariant_taxed_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_taxed_coinBalancesAreHeldPlusOwed\n[PASS] invariant_taxed_everyHoldingIsListed\n[PASS] invariant_taxed_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_taxed_zeroSupplyMeansNothingHeld\n Imdex5AllCoinsTaxedInvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 209   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 245   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 212   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 432   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 222   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 244   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 205   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 225   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 203   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 205   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 218   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 199   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 194   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 233   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 179   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| TaxKnobs      | setTax           | 209   | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 2228\n  Bound result 39596972668088003129\n  Bound result 159708578027544712484\n  Bound result 1435743504598885\n  Bound result 4046341548624796396\n  Bound result 37241578766611975504\n  Bound result 561081\n  Bound result 18352\n  Bound result 4823\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.43s (1.43s CPU time)\n\nRan 1 test for test/Imdex5.invariant.t.sol:Imdex5InvariantTest\n[PASS]\nImdex5InvariantTest invariants:\n[PASS] invariant_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_coinBalancesAreHeldPlusOwed\n[PASS] invariant_feeImdLeavesOnlyForTheOracleAndRewards\n[PASS] invariant_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_listShape\n[PASS] invariant_noFreeMintWhileValueIsHeld\n[PASS] invariant_requestStateIsConsistent\n[PASS] invariant_zeroSupplyMeansNothingHeld\n Imdex5InvariantTest invariants (runs: 96, calls: 3840, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 195   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 207   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | closeRequest     | 200   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverFailure   | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 189   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 196   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 368   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 201   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 196   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 217   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 206   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 243   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 195   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 207   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 217   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 186   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 191   | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 220   | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 1000000000000\n  Bound result 250000000000000000\n  Bound result 37923870581915909\n  Bound result 130108602367599074406\n  Bound result 4989\n  Bound result 499999999999999999941\n  Bound result 21341\n  Bound result 386061618322534054000\n  Bound result 211801472\n  Bound result 691198\n  Bound result 124999999899721100\n  Bound result 900\n  Bound result 15922815939445932\n  Bound result 300000000000000000000\n  Bound result 3798186580743\n  Bound result 8642824578239728897406\n  Bound result 51200\n  Bound result 307200\n  Bound result 12075\n  Bound result 76800\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.81s (1.81s CPU time)\n\nRan 1 test for test/Imdex5Floor.invariant.t.sol:Imdex5FloorInvariantTest\n[PASS]\nImdex5FloorInvariantTest invariants:\n[PASS] invariant_heldIsTheRealBalance\n[PASS] invariant_mintNeverDilutesListCoinsOrIdle\n[PASS] invariant_noMintBelowTheFloor\n[PASS] invariant_noSharesMeansNothingHeld\n[PASS] invariant_redeemAlwaysPays\n[PASS] invariant_revertedMintMovesNothing\n Imdex5FloorInvariantTest invariants (runs: 128, calls: 5120, reverts: 485)\n\n╭--------------------+-------------+-------+---------+----------╮\n| Contract           | Selector    | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5FloorHandler | claim       | 476   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | mint        | 1355  | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | mintFirst   | 471   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | movePrice   | 488   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | rebalanceTo | 485   | 485     | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | redeem      | 461   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | redeemToImd | 452   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | setMaxIn    | 486   | 0       | 0        |\n|--------------------+-------------+-------+---------+----------|\n| Imdex5FloorHandler | setTax      | 446   | 0       | 0        |\n╰--------------------+-------------+-------+---------+----------╯\n\nLogs:\n  Bound result 52\n  Bound result 64\n  Bound result 12\n  Bound result 22841\n  Bound result 400\n  Bound result 250000000000000000000\n  Bound result 97\n  Bound result 233\n  Bound result 795000000000000000000\n  Bound result 229\n  Bound result 9950\n  Bound result 18\n  Bound result 2074\n  Bound result 4000000\n  Bound result 352211168179509276680912\n  Bound result 250\n  Bound result 302\n  Bound result 935410\n  Bound result 128309\n  Bound result 1283\n  Bound result 10\n  Bound result 769\n  Bound result 900\n  Bound result 523207357319650500753\n  Bound result 3476\n  Bound result 2112\n  Bound result 12345\n  Bound result 762\n  Bound result 999906\n  Bound result 13781\n  Bound result 19155\n  Bound result 9811\n  Bound result 3914\n  Bound result 82\n  Bound result 1738\n  Bound result 935796\n  Bound result 776161\n  Bound result 19\n  Bound result 770409809069669228099\n  Bound result 19\n  Bound result 739754773258269297475\n  Bound result 11814\n  Bound result 3349\n  Bound result 3889\n  Bound result 4977\n  Bound result 5000000000000000000\n  Bound result 632713822234561492774\n  Bound result 628057317341387608512442\n  Bound result 385\n  Bound result 395037\n  Bound result 32684\n  Bound result 500000000000000000000\n  Bound result 1000\n  Bound result 1046363170\n  Bound result 189000000000000000000\n  Bound result 352710984976227550984\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 2.34s (2.33s CPU time)\n\nRan 1 test for test/Imdex5.invariant.t.sol:Imdex5TaxedCoinInvariantTest\n[PASS]\nImdex5TaxedCoinInvariantTest invariants:\n[PASS] invariant_actorsNeverExtractMoreImdThanTheyPutIn\n[PASS] invariant_coinBalancesAreHeldPlusOwed\n[PASS] invariant_feeImdLeavesOnlyForTheOracleAndRewards\n[PASS] invariant_imdBalanceIsIdlePlusFeePlusOwed\n[PASS] invariant_listShape\n[PASS] invariant_noFreeMintWhileValueIsHeld\n[PASS] invariant_requestStateIsConsistent\n[PASS] invariant_zeroSupplyMeansNothingHeld\n Imdex5TaxedCoinInvariantTest invariants (runs: 256, calls: 128000, reverts: 0)\n\n╭---------------+------------------+-------+---------+----------╮\n| Contract      | Selector         | Calls | Reverts | Discards |\n+===============================================================+\n| Imdex5Handler | ask              | 6636  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | claim            | 6695  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | closeRequest     | 6752  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverFailure   | 6801  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | deliverResult    | 6714  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | fund             | 6680  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mint             | 13445 | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | mintFirst        | 6752  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | rebalance        | 6685  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeem           | 6897  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | redeemToImd      | 6601  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setCoinFailMode  | 6664  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setHookMisbehave | 6713  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | setPoolMaxIn     | 6671  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | submit           | 6830  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | togglePool       | 6860  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | transferShares   | 6729  | 0       | 0        |\n|---------------+------------------+-------+---------+----------|\n| Imdex5Handler | warp             | 6875  | 0       | 0        |\n╰---------------+------------------+-------+---------+----------╯\n\nLogs:\n  Bound result 5000\n  Bound result 10000\n  Bound result 9950\n  Bound result 1\n  Bound result 2500\n  Bound result 14596\n  Bound result 5000\n  Bound result 9922775678212469121411\n  Bound result 259200\n  Bound result 3896\n  Bound result 10100\n  Bound result 50000000000000000000\n  Bound result 31337\n  Bound result 111616\n  Bound result 156\n  Bound result 537600\n  Bound result 97\n  Bound result 995\n  Bound result 10205\n  Bound result 1002\n  Bound result 986634463242516293634\n  Bound result 3\n  Bound result 14787\n  Bound result 1000000\n  Bound result 12398\n  Bound result 15\n  Bound result 12\n  Bound result 24576\n  Bound result 16275\n  Bound result 13221\n  Bound result 51200\n  Bound result 6404\n  Bound result 4000000\n  Bound result 3301\n  Bound result 2968\n  Bound result 9204\n  Bound result 18334\n  Bound result 10132\n  Bound result 50000000000000000000\n  Bound result 19529035837012967424\n  Bound result 1\n  Bound result 20036\n  Bound result 339\n  Bound result 244124153722729520859\n  Bound result 13\n  Bound result 64\n  Bound result 16256747033301207744\n  Bound result 574\n  Bound result 4000000\n  Bound result 3738\n  Bound result 231085584961338462284\n  Bound result 227787\n  Bound result 690\n  Bound result 5452710964165319844996\n  Bound result 261\n  Bound result 192161677547341\n  Bound result 995\n  Bound result 383229\n  Bound result 127\n  Bound result 691200\n  Bound result 19692\n  Bound result 37\n  Bound result 1561568134220081\n  Bound result 60\n  Bound result 1\n  Bound result 41\n  Bound result 3000000000000000000\n  Bound result 23\n  Bound result 1057584990\n  Bound result 3\n  Bound result 1000000\n  Bound result 10\n  Bound result 100\n  Bound result 164\n  Bound result 194040\n  Bound result 1000\n  Bound result 17740\n  Bound result 100000000000000000000\n  Bound result 900\n  Bound result 839\n  Bound result 86400\n  Bound result 5290\n  Bound result 16091\n  Bound result 298500000000000000000\n  Bound result 12500\n  Bound result 1175\n  Bound result 9189\n  Bound result 17026\n  Bound result 665599\n  Bound result 467983\n  Bound result 1230981784736890880\n  Bound result 9999\n  Bound result 8214\n  Bound result 20835\n  Bound result 64555113031370214551\n  Bound result 684144\n  Bound result 4294967295\n  Bound result 29972353795135207118\n  Bound result 2037090745\n  Bound result 3988822378723970342\n  Bound result 719098455508\n  Bound result 390607565778990750519\n  Bound result 100\n  Bound result 401500446371068597093\n  Bound result 7013\n  Bound result 45135272741319115404\n  Bound result 98000000000000000000\n  Bound result 100000\n  Bound result 1447874004306104728783\n  Bound result 512669\n  Bound result 5\n  Bound result 371636862\n  Bound result 10100\n  Bound result 45005851881584441735\n  Bound result 271584\n  Bound result 2000\n  Bound result 46000000000000000000\n  Bound result 24\n  Bound result 409600\n  Bound result 9028\n  Bound result 4854\n  Bound result 4191\n  Bound result 1383378919\n  Bound result 615\n  Bound result 534885\n  Bound result 10868998138528\n  Bound result 691200\n  Bound result 5460\n  Bound result 112404\n  Bound result 250000000000000000000\n  Bound result 16959\n  Bound result 1281\n  Bound result 614400\n  Bound result 1042189535521990014739\n  Bound result 1962561236446395606650\n  Bound result 44220867903532052528\n  Bound result 1000000000000000000007\n  Bound result 14629\n  Bound result 39348814741910323300\n  Bound result 14636\n  Bound result 737\n  Bound result 33236839714825751583\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 58.04s (58.04s CPU time)\n\nRan 18 test suites in 58.05s (68.28s CPU time): 177 tests passed, 0 failed, 7 skipped (184 total tests)\n","passed":true},{"durationMs":84,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Imdex5.approve(address,uint256)\",\"Imdex5.ask()\",\"Imdex5.claim(address)\",\"Imdex5.closeRequest()\",\"Imdex5.fund(uint256)\",\"Imdex5.mint(uint256,uint256,uint256)\",\"Imdex5.mintFirst(uint256,uint256[])\",\"Imdex5.onOracleFailure(bytes32,uint8,bytes32,uint16,uint16,bytes)\",\"Imdex5.onOracleResult(bytes32,(bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Imdex5.rebalance()\",\"Imdex5.redeem(uint256)\",\"Imdex5.redeemToImd(uint256,uint256)\",\"Imdex5.submit((bytes32,uint256,bytes32,uint8,bytes,uint256,uint64,uint64,bytes32,bytes32,uint16,uint16,uint16,uint64,uint64),bytes)\",\"Imdex5.swapSelf(address,address,bool,uint256,bool,bool)\",\"Imdex5.transfer(address,uint256)\",\"Imdex5.transferFrom(address,address,uint256)\",\"Imdex5.unlockCallback(bytes)\"],\"files\":{\".gitignore\":2,\"ADAPTATION.md\":328,\"README.md\":361,\"THREAT_MODEL.md\":49,\"foundry.toml\":19,\"launch.json\":10,\"src/Imdex5.sol\":680,\"src/Interfaces.sol\":61,\"src/OracleAttestation.sol\":221,\"test/Fix3.fork.t.sol\":97,\"test/Fix3Floor.fork.t.sol\":67,\"test/Fix3Rebalance.fork.t.sol\":151,\"test/Imdex5.invariant.t.sol\":544,\"test/Imdex5.t.sol\":1070,\"test/Imdex5Base.sol\":175,\"test/Imdex5DocumentedLimits.t.sol\":239,\"test/Imdex5Edges.t.sol\":741,\"test/Imdex5Floor.invariant.t.sol\":335,\"test/Imdex5MustAttack.t.sol\":596,\"test/Imdex5RebalanceNothingOut.t.sol\":106,\"test/Imdex5ResidualSpot.t.sol\":182,\"test/Imdex5Revised.t.sol\":522,\"test/Imdex5ShortFill.t.sol\":226,\"test/Imdex5TaxEverywhere.t.sol\":529,\"test/Imdex5TaxedCoin.t.sol\":252,\"test/OracleConsumerConformance.t.sol\":74,\"test/mocks/AttackMocks.sol\":85,\"test/mocks/Mocks.sol\":337,\"test/mocks/PoolTaxERC20.sol\":25,\"test/mocks/TaxERC20.sol\":36},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"e112052d02b05068112d45b41894537b10e48c4ede24272fa5819e63dfa72461","verifiedTreeHash":"14b905446e545e4e7cb061c527143f1031646096","verifierVersion":"0.1.0+560ab6a2"}]}