{"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":"5679c75c-7f01-4fd5-9174-bc5cfe20722d","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"795581373c9a399d27a4c8c4778ec96861a0f0d0b51eea6b9b437870f7bb2102","dependsOn":["build_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":"8354a6c6e898121b5ba95ecc6d2604c6d53f70416fb5e0fc4e13a15a274e5b03","dependsOn":["build_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":"68775e46b337b47b4dfe6780796c1a763a88da2f19adea5dc02842354584fbc3","dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","tools":[]},"key":"audit_judge","kind":"code","role":"review","skillHash":"3014f1ea5961918ca059453a484bf4c8bcbbfc2248dbe31d94ac7c5cdf8f50bd","skillId":"audit-judge","state":"accepted"},{"acceptedSubmissionHash":"35e68a4c59f2d42273b520d85f18b4e92aea2ab5b24a75f9997e3d0649d15d9c","dependsOn":["build_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":"88d7a79e76c396d63c1b9e3d98197bc0e0d7ad2a9a9cf4fa632aa0eededf650b","dependsOn":["build_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":"2e553bb040c76f73ca7bf479fcae72833f63a6be91c569a86713e03f854c1407","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"47381b166d1f406a34f0ebdc740ee21bc0383e56e7ad9084b26abf1bf7570904","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"02a09fb780cfc8fe5b8c6717cc5bccd243f26d0ffd753a8cf569dbe1385b35a5","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"047955fd578b1bd6c2f6fccf8302bb799d0112701c8a80cd536b0b02b3951774","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"73431852439ad3a343f3d2b7db1c43cd363b9f48f9bb51497374a0cf6d50b223","skillId":"write-foundry-tests","state":"accepted"}],"objective":"A custom token: Taxi (TAXI).\nToken name: Taxi\nToken symbol: TAXI\nToken supply: 100,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nWhat it does: On each transfer 1% of the amount goes to the fixed treasury 0x047f606fd5b2baa5f5c6c4ab8958e45cb6b054b7, except transfers from or to the factory, the pool manager and the rewards distributor. No owner, no way to change the fee.","parentJobId":null,"planHash":"34b1e0d9ae27168eeb251086b819498556379b3b7f23db3420447bec58fc8a62","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"5679c75c-7f01-4fd5-9174-bc5cfe20722d","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-536-custom-token-taxi-taxi"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50939","feedbackHash":"dc365f64014fd34521f5aad5198e45d43b6e402acadc82518f5022abd9a70f2b","nodeKey":"audit_economics","submissionHash":"795581373c9a399d27a4c8c4778ec96861a0f0d0b51eea6b9b437870f7bb2102","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51031","feedbackHash":"fc18bf840a5cd1d87aae0c5ef35fbcc3f2e9f1b31ad7cce63c8766d5cc71a819","nodeKey":"audit_flow","submissionHash":"8354a6c6e898121b5ba95ecc6d2604c6d53f70416fb5e0fc4e13a15a274e5b03","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51018","feedbackHash":"6d0d7683a7b573f02bb608c2d0bb7edcae4e913816b40c46c6549d5e34fe9854","nodeKey":"audit_judge","submissionHash":"68775e46b337b47b4dfe6780796c1a763a88da2f19adea5dc02842354584fbc3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50955","feedbackHash":"39fbe5f342e5aac403e1f95345a980116eaf4e6a0dc73f6b62a90d2f1f2abb88","nodeKey":"audit_judge","submissionHash":"05638391f2cafe6a0522eb61e0bd88269ac88575b648283cf5e350c134a6ff25","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51331","feedbackHash":"11c735f75a5366f3fd6f2175b88757305705b770530cd274b2c56da7a0b3e232","nodeKey":"audit_math","submissionHash":"35e68a4c59f2d42273b520d85f18b4e92aea2ab5b24a75f9997e3d0649d15d9c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50987","feedbackHash":"7eaacaf2fb9cea12641379d059b5796ee1bdd76298bce307a9d8364c5e96c124","nodeKey":"audit_permissions","submissionHash":"88d7a79e76c396d63c1b9e3d98197bc0e0d7ad2a9a9cf4fa632aa0eededf650b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"50971","feedbackHash":"2f1e7ea11cba0eb92538b8f96554143f74784c60e0833c87681727337a583fc9","nodeKey":"build_contract_project","submissionHash":"2e553bb040c76f73ca7bf479fcae72833f63a6be91c569a86713e03f854c1407","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50962","feedbackHash":"1416916e30052c922afe75412706abd6fee3fb3e53ad643bf3972800f913eb4c","nodeKey":"build_contract_project","submissionHash":"a9ea0749f31f18967d8f537e2aa2158d18c13ad0570e1b7d1ba04a599b6e224e","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50962","feedbackHash":"9670f2ff2fdacb0f00cd55dfa3f561918bced3c5a1b3ae7a2200628c864bb465","nodeKey":"manifest","submissionHash":"02a09fb780cfc8fe5b8c6717cc5bccd243f26d0ffd753a8cf569dbe1385b35a5","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50959","feedbackHash":"0877037a38b67e38fc7839f0002d9513416664ea65cda78dd04e5a50f8325053","nodeKey":"manifest","submissionHash":"728083d13090181fa7437220d72f4e5efd3a2b67cf752b2840a53dcc6b200be5","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50962","feedbackHash":"6e2a67f0b4141d872057465a289032178583c70d6af947fae12ec9b21cf324e8","nodeKey":"write_foundry_tests","submissionHash":"68e5c80a7d1859d2ac050dda19526b3e118fa3794eed8638e6ae829fdc3906bc","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50974","feedbackHash":"08d96b25dd971af69e890c030ff2c0f0cf26d0d667b2cf12df905d6917197de6","nodeKey":"write_foundry_tests","submissionHash":"047955fd578b1bd6c2f6fccf8302bb799d0112701c8a80cd536b0b02b3951774","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"4431868040ce1f0ef3132c5abdbc2e6889dfb7024c250d1295c7ae688e97e577","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"3ee3873140d9d19c4b17bd84b90f54c6a0ab46e80717fbe8ad0dbd1ca89001f5","device":"3f6a9bdd601cb99f","findings":[],"hash":"02a09fb780cfc8fe5b8c6717cc5bccd243f26d0ffd753a8cf569dbe1385b35a5","nodeId":"7c797da7-02be-4a5c-b1ee-f1b65ab126ce","outcome":"completed","summary":"Updated only [launch.json](/home/seat/.identitymd/work/5679c75c-7f01-4fd5-9174-bc5cfe20722d/7c797da7-02be-4a5c-b1ee-f1b65ab126ce/launch.json). Revised notes remove swarm allocation text and document the pool-manager fee bypass. Preserved constructor arguments, supply, economics, and pool settings.\n\nValidation passed: supplied schema checks, constructor ABI comparison, `forge build`, and all 39 local tests.","treeHash":"95829948881ee2cc2595efcab4711b104bab2785","usage":{"cachedInputTokens":194688,"inputTokens":30192,"model":"gpt-6-astra","outputTokens":3508,"runtime":"codex","turns":3,"wallClockMs":144721}},{"artifacts":[],"attempt":2,"bundleHash":"7908441c7b46aec047f06a6c2a4bf9281333e77c1e22885266e7205cdaf8028e","device":"98b4506bef931d13","findings":[],"hash":"047955fd578b1bd6c2f6fccf8302bb799d0112701c8a80cd536b0b02b3951774","nodeId":"986805f3-099b-4171-a685-446aaacc539e","outcome":"completed","summary":"The revision is committed and the tree is clean. The full suite passes from a clean, offline build with no environment variables, exactly as the verifier runs it.\n\n**What changed**\n\nThe earlier rejection was an upload failure, not a content one, so I rebuilt the revision as an extension of the accepted suite rather than a rewrite. The accepted files are untouched. Two new test files and a notes update were added under `test/`.\n\n- **Registry budget and malformed lookups** in `test/TaxiRegistryBoundary.t.sol`. A registry that answers with the gas it received shows the lookup stipend is at most 30,000 and is not raised by the caller. Registries demanding just under the budget are honored, and ones demanding it or more are treated as absent, so a claim through an over-budget registry arrives taxed rather than reverting. The decoder is fed a revert carrying a well-formed address, two-word and 33-byte answers, the value one above the address width, a zero word, and the widest canonical address. A registry that reads the token during lookup is honored, one that tries to write is absorbed and moves nothing, and one that re-enters the lookup recursively is bounded by the budget and never freezes a transfer.\n- **Single-transfer properties** in `test/TaxiTransferProperties.t.sol`. For any pair of the seven endpoints, the Transfer events are the oracle: a fee event comes first and only when due, replaying the events on a snapshot reproduces every balance, and no bystander balance or unspent allowance moves. Gas-starved transfers are all-or-nothing, pinned at 25,000 gas (reverts whole) and 120,000 gas (exemption applied whole).\n- `test/TAXI_TESTS.md` documents both files and notes the two catalogue properties the specification deliberately breaks: a taxable self-transfer costs the fee, and the treasury is not exempt.\n\n**Results**\n\n| Check | Result |\n|---|---|\n| `forge build --offline` from `forge clean` | success |\n| `forge test --offline` with empty environment | 63 passed, 0 failed |\n| Invariant campaign | 256 runs, 16,384 calls, 0 reverts |\n| `git status --porcelain` | clean, only `test/**` changed |\n\n**Findings**\n\nNo new defect was found, so no `.imd-findings.json` was written. The one harness failure during development was my own expected-allowance mistake for a self-transfer, grounded and fixed before trusting it. The known fee-avoidance route through the exempt pool manager remains documented in the README and covered by the accepted relay tests from the earlier round.","treeHash":"99bc79dd84e127fbbe0d3a519006a3099dad1b7f","usage":{"cachedInputTokens":1404943,"inputTokens":482,"model":"claude-fable-5-1","outputTokens":32359,"runtime":"claude","turns":37,"wallClockMs":480681}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"3c7630b22a73c1fb","findings":[{"citation":"resolved","description":"Merged from audit_economics (both its sync/settle/take variant and its ERC-6909 claim variant share this one root cause). _exempt() waives the fee whenever the pool manager is either endpoint of a transfer, in both directions. The Uniswap v4 PoolManager is not only a swap venue: inside unlock(), any caller may sync(TAXI), transfer TAXI in, settle() to receive a credit, and take(TAXI, anyRecipient, amount) to pay it out, with no pool initialised, no swap and no pool fee. The inbound leg is holder -> poolManager (exempt) and the outbound leg is poolManager -> recipient (exempt), so the pair is an ordinary A-to-B transfer on which the treasury receives 0 instead of 1%. The same credit can instead be mint()ed as the manager's ERC-6909 claim (id = uint160(token)), passed between wallets any number of times without Taxi._update running, and redeemed whole by burn()+take(). A one-time, unprivileged helper contract (or the already-deployed Universal Router's SETTLE/TAKE actions) makes this available to every holder for gas only. Who loses: the treasury 0x047f...54b7 loses 1% of every transfer whose sender chooses the relay; no holder loses funds and supply is unchanged. Impact: the token's single stated economic rule, 'on each transfer 1% of the amount goes to the fixed treasury', holds only for senders who volunteer it, and README.md lines 25-27 ('unrelated routers, pools, and intermediate wallet transfers are subject to the ordinary rule') overstate what is enforced. Scope note: the bidirectional pool manager exemption is what the brief asks for and what the launch floor needs (a taxed inbound leg makes a sell revert with CurrencyNotSettled; a taxed outbound leg shorts every buyer by 1% against the quoted amount). I see no fix inside Taxi.sol that keeps the agreed rule, so this is a scope decision for the requester: either accept and document that the fee is avoidable by design (correct README lines 25-27 and do not budget treasury income on wallet transfers), or change the economics (for example tax only the from == poolManager leg and accept that buyers receive 99% of the swap output). Do not change the exemption silently.","line":72,"path":"src/Taxi.sol","reproduction":"Reproduced with a stand-in that performs exactly the ERC-20 calls the v4 PoolManager performs under unlock(): the helper moves tokens holder -> manager via transferFrom (the sync/settle leg), then the manager calls token.transfer(recipient, amount) (the take leg). State: factory = LaunchFactoryMock with distributorOf returning 0; Taxi deployed with poolManager_ = manager M; factory transfers 2,000,000e18 TAXI to ALICE (exempt, arrives whole); treasury 0. Control: ALICE calls transfer(BOB, 1_000_000e18) -> BOB 990,000e18, treasury 10,000e18 (expected and actual). Bypass: ALICE calls approve(relay, 1_000_000e18) then relay.run(BOB, 1_000_000e18), which executes transferFrom(ALICE, M, 1_000_000e18) and then M calls transfer(BOB, 1_000_000e18). Expected if every ordinary holder-to-holder transfer is taxed: BOB +990,000e18 and treasury +10,000e18. Actual: BOB +1,000,000e18 (total 1,990,000e18), treasury unchanged at 10,000e18, M balance 0, ALICE 0. Both legs hit line 72 (to == poolManager, then from == poolManager) so _update takes the super._update path with no fee. On the real PoolManager the same two legs are produced by unlock -> unlockCallback { sync(TAXI); taxi.transferFrom(from, M, amount); settle(); take(TAXI, to, amount); }, which needs no initialised pool because sync/settle/take are onlyWhenUnlocked and net the delta to zero. ERC-6909 variant: replace take with mint(ALICE, uint160(taxi), amount); M.transfer(BOB, id, amount); M.transfer(CAROL, id, amount); burn(CAROL, id, amount) + take(TAXI, CAROL, amount): CAROL holds 1,000,000e18 after three changes of ownership, treasury +0 instead of about 29,701e18 under the fee rule. The specialist additionally reproduced this against the real v4-core PoolManager (commit 46c6834) with the same balances.","severity":"medium","snippet":"        if (from == factory || to == factory || from == poolManager || to == poolManager) return true;","title":"The 1% fee is optional: any holder can relay a wallet-to-wallet transfer through the exempt pool manager (sync/settle/take or ERC-6909 claims) and pay nothing to the treasury"}],"hash":"05638391f2cafe6a0522eb61e0bd88269ac88575b648283cf5e350c134a6ff25","nodeId":"5014b90f-d7b8-49a0-9dfb-92298e91356c","outcome":"completed","summary":"Review complete. The findings file is written and validated, and the scratch test was removed, so the tree holds only `.imd-findings.json` as new content.\n\n**Outcome:** one finding kept, at medium severity. The three entry points are all covered, two of them pointing at that finding.\n\n**What I verified**\n- The project builds cleanly on solc 0.8.26 and all 49 existing tests pass, including the 256-run invariant suite.\n- The economics specialist's finding reproduces. I wrote a scratch test with a stand-in that performs the same ERC-20 calls the Uniswap v4 PoolManager makes under unlock. A direct 1,000,000 TAXI transfer paid 10,000 TAXI to the treasury. The same transfer relayed through the pool manager paid nothing, because both legs match the exemption at `src/Taxi.sol:72`.\n- The specialist's two variants, sync/settle/take and ERC-6909 claims, share one root cause, so they are merged into a single finding.\n- The permissions, math, flow and test specialists reported nothing, and my own pass agreed. Supply, allowance handling, fee rounding, treasury and self-transfer aliases, the bounded registry lookup, and every launch flow leg behave as specified. The static-analysis lines are style notes only.\n\n**Severity and scope note:** no holder loses funds and supply is fixed, but the token's single stated economic rule is enforceable only for senders who volunteer it. The exemption is exactly what the brief asks for and what the launch floor requires, so I flagged this as a scope decision for the requester rather than a silent code change. The finding carries no proof file since it is below high severity.","treeHash":null,"usage":{"cachedInputTokens":378196,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":13276,"runtime":"claude","turns":14,"wallClockMs":186336}},{"artifacts":[],"attempt":1,"bundleHash":"8732ad107d38029ace286e70cf6de3813b62a2012b34392d938a31ad9c302f8a","device":"35c52a5b502e847c","findings":[],"hash":"2e553bb040c76f73ca7bf479fcae72833f63a6be91c569a86713e03f854c1407","nodeId":"6795bc13-64e2-43c7-a458-838b77f9635c","outcome":"completed","summary":"Reproduced the bypass with model tests. Updated README to document fee avoidance and unreliable treasury revenue.\n\nRecorded `disputed` in `.imd-responses.json`: preventing the bypass conflicts with the required exemptions. Production contracts remain unchanged.\n\nValidation passed: `forge build`, all 39 tests, and `forge fmt --check`.","treeHash":"55083fbfe55af4ad18a539d5455b5615257be7b0","usage":{"cachedInputTokens":375808,"inputTokens":63942,"model":"gpt-6-astra","outputTokens":6527,"runtime":"codex","turns":4,"wallClockMs":224553}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"d2d5a117dd72f6b4","findings":[],"hash":"35e68a4c59f2d42273b520d85f18b4e92aea2ab5b24a75f9997e3d0649d15d9c","nodeId":"9bef6d71-939b-4a09-beec-188d3f94dcc5","outcome":"completed","summary":"The review is complete. The findings file is in place and the full suite still passes with my scratch tests included.\n\n**Outcome: no defects found in the assigned area.** The fee arithmetic in `src/Taxi.sol` holds at every boundary the Math Precision, Boundary and Numerical Gap guides name, so `.imd-findings.json` carries an empty findings list and eight coverage rows, one per entry point plus invariants and both aderyn leads.\n\nWhat I verified, with tests run under `test/scratch/`:\n\n- **Fee rounding.** The fee is floor(amount / 100), zero below 100 base units. Checked at 0, 1, 99, 100, 101, 199, 200, 10,000, the whole 1e26 supply, and max-uint. Max-uint reverts cleanly with the gross balance error. The worst avoidable fee per transfer is 99 base units, which is dust and documented in the README.\n- **No underflow in the two-step update.** The gross balance check runs before either internal transfer, so the second transfer of amount minus fee can never fail, including when the sender is the treasury or sends to itself.\n- **Supply conservation.** The fee is a transfer, not a burn. The sum of balances equals total supply across 1,000 fuzzed three-hop sequences through the treasury.\n- **Registry boundary.** The distributor lookup is a 30,000-gas staticcall accepting exactly 32 return bytes. No code, revert, short or long return data, infinite loops, state writes, and a non-canonical address word all resolve to no exemption without reverting. A gas-limit sweep from 1,000 to 120,000 on a distributor claim never produced a call that succeeded while being taxed.\n- **Vendored dependency.** The OpenZeppelin files match the listed sha256 hashes and are byte-identical to upstream v5.0.2 at the stated commit.\n\nTwo things worth noting for the author, neither a defect. A registry whose lookup costs more than 30,000 gas makes claims taxed rather than reverting, which the README already states as a factory trust assumption. The `FEE_BPS` constant is declared but unused, since the fee uses a literal divisor of 100. Both compute the same 1% for every input, so there is no failing case, but a future edit to the constant would silently do nothing.\n\nNothing was left unreached. The only external dependency I could not inspect is the live factory's `distributorOf` return shape, since no network file or factory ABI was supplied. The protected harness uses a public mapping returning one address, which the token handles correctly.","treeHash":null,"usage":{"cachedInputTokens":961495,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":20609,"runtime":"claude","turns":15,"wallClockMs":334607}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"30a6c1a419ef4f9c","findings":[],"hash":"68775e46b337b47b4dfe6780796c1a763a88da2f19adea5dc02842354584fbc3","nodeId":"5014b90f-d7b8-49a0-9dfb-92298e91356c","outcome":"completed","summary":"The findings file is in place at the repository root and the environment excludes it from git by design. The review is complete.\n\n**Outcome: the one outstanding finding is settled, and no new defects were found.** The file `.imd-findings.json` holds an empty findings list and six coverage rows.\n\n**Round 1 finding, fee avoidable through the exempt pool manager.** The behaviour still exists. I re-ran the author's relay test and all three cases pass: relaying 1,000,000 TAXI through the manager delivers the full amount with the treasury unchanged. The source is byte-identical to the version I reviewed, which is the correct outcome. The brief requires every transfer from or to the pool manager to be exempt, and the launch floor's seed and swaps settle through exactly those legs. My round 1 remedy was a scope decision for the requester, either document the limitation or change the economics. The author chose to document it. The README no longer claims intermediate wallet routes are taxed, the new section describes both the sync/settle/take and ERC-6909 claim routes, and the manifest notes carry the same disclosure. The code implements the requested rule as specified, so there is no code defect to reopen. I dropped it rather than restating it.\n\n**Fresh read of the code.** All three entry points hold. Approve is unmodified OpenZeppelin. Transfer and transferFrom share one update path: gross balance required, amounts under 100 base units or exempt endpoints move whole, otherwise 1% to the treasury and the rest to the recipient. The only mint is in the constructor. The full suite of 63 tests, including the fuzz and invariant runs, passes.\n\n**One row marked unreached.** The protected launch-flow harness imports v4-core and factory-side sources that are not in this tree, so I could not execute it. I traced the launch legs in source instead and each takes the exempt path.","treeHash":null,"usage":{"cachedInputTokens":342949,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":6201,"runtime":"claude","turns":12,"wallClockMs":122643}},{"artifacts":[],"attempt":1,"bundleHash":"3717b43c08dfd771dbc4123d3640abdb1dba4246e56f9cd973e03b996750561b","device":"3f6a9bdd601cb99f","findings":[],"hash":"68e5c80a7d1859d2ac050dda19526b3e118fa3794eed8638e6ae829fdc3906bc","nodeId":"986805f3-099b-4171-a685-446aaacc539e","outcome":"completed","summary":"Added failure-path tests, fuzz properties, and three invariants covering supply, balances, allowances, and configuration. All changes are under `test/`.\n\nOffline verification passed: `forge build` and `forge test`—49 tests passed, including 16,384 randomized invariant calls. No confirmed defects found.\n\nProtected Uniswap integration remains unverified locally because its launch dependencies and environment are absent.","treeHash":"992c6bb7e46d0d193b3c578a8e062b9ffa6fb3bd","usage":{"cachedInputTokens":607232,"inputTokens":69719,"model":"gpt-6-astra","outputTokens":14412,"runtime":"codex","turns":7,"wallClockMs":512577}},{"artifacts":[],"attempt":1,"bundleHash":"5850686e1b395da0335fc006aaff48599ef44a12f537625d0119c4623b21f96b","device":"468e82a89b9bfe18","findings":[],"hash":"728083d13090181fa7437220d72f4e5efd3a2b67cf752b2840a53dcc6b200be5","nodeId":"7c797da7-02be-4a5c-b1ee-f1b65ab126ce","outcome":"completed","summary":"Done. The manifest is written and verified; nothing else in the tree was touched.\n\n**What I wrote** at `launch.json` in the repo root:\n\n- kind `custom_token`, token contract `Taxi`, name Taxi, symbol TAXI, 18 decimals.\n- constructorArgs `[\"$factory\", \"$poolManager\", \"$launchNumber\"]`, matching the accepted constructor `(address factory_, address poolManager_, uint64 launchNumber_)` in `src/Taxi.sol`.\n- totalSupply is the constructor's single mint to msg.sender, in minor units:\n\n  `100000000000000000000000000`\n\n- contracts is empty. The accepted tree has only the token and its `ILaunchFactory` interface, so there are no application contracts to name.\n- pool pairs with native ETH (zero address), fee 3000, tickSpacing 60. initialPrice is the sqrtPriceX96 derived from the 20 ETH cap over the full supply, which is provenance only.\n- economics is the job's object copied verbatim.\n- notes describe the 1% treasury fee, the factory, pool manager and distributor exemptions, the absence of any owner or setter, and the build settings. They are well under the 4000-character limit.\n\n**Checks run**\n\n| Check | Result |\n| --- | --- |\n| JSON parse plus schema pattern checks | passed |\n| `forge build --offline` | compiled cleanly |\n| `forge test --offline` | 36 passed, 0 failed |\n| git status | only launch.json added |\n\nThe stray dotfiles shown as untracked by git are the sandbox's device-node placeholders, not files I created.","treeHash":"fdff53eb738852cb9fa6b0d8ba13544c45123e71","usage":{"cachedInputTokens":274238,"inputTokens":194,"model":"claude-fable-5-1","outputTokens":4191,"runtime":"claude","turns":7,"wallClockMs":64634}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"72b617d4b615473a","findings":[{"citation":"resolved","description":"Economic Security (legitimate feature turned against the protocol / fee pushed to zero) and Flow Gap (execution x periphery x first principles). The exemption is keyed only on the pool manager being one endpoint of a transfer. The Uniswap v4 PoolManager is not only a swap venue: under unlock() anyone can sync(TAXI), transfer TAXI in, settle() to get a credit, and take(TAXI, anyRecipient, amount) to pay it out, with no pool, no swap and no pool fee involved. Both legs touch the pool manager, so both are exempt, and the two legs together are an ordinary A-to-B transfer on which the treasury receives 0 instead of 1%. The same credit can instead be minted as the manager's ERC-6909 claim (id = uint160(token)), which then circulates between wallets without Taxi._update ever running, and is redeemed whole by burn()+take(). The helper needs no privilege, holds no funds between calls and can be deployed once and used by everybody, so the cost is only gas (about 160k gas for the relayed transfer against about 98k for the taxed one in my run). Who loses: the treasury 0x047f...54b7, 1% of every transfer whose sender bothers to use the relay; no holder loses funds. The stated behaviour 'on each transfer 1% of the amount goes to the fixed treasury' therefore holds only for senders who volunteer it, and README.md lines 25-27 ('unrelated routers, pools, and intermediate wallet transfers are subject to the ordinary rule') are untrue for a wallet transfer relayed this way. Scope note, stated plainly: the pool manager exemption in both directions is what the brief asks for and what the launch floor needs (a taxed settle makes a sell revert with CurrencyNotSettled, and the floor wants buys and sells to move exactly what they say), so I do not see a fix inside Taxi.sol that keeps the agreed design. Taxing the manager's outbound leg (from == poolManager) would close the relay and the ERC-6909 exit but changes the brief's economics and shorts every buyer by 1%; that is a scope decision for the requester, not something to change silently. The in-scope remedy is to correct the README so the requester and the treasury operator know the fee is avoidable by design and do not budget on it.","line":72,"path":"src/Taxi.sol","reproduction":"Reproduced against the real Uniswap v4-core PoolManager (commit 46c6834, sources copied into test/scratch and compiled with --via-ir; scratch files are not part of the submission) and separately against a minimal sync/settle/take stand-in. State: PoolManager M deployed; Taxi deployed with poolManager_ = M, factory_ = a registry whose distributorOf returns address(0); ALICE holds 2,000,000 TAXI; treasury balance 0; no pool initialised. Relay contract R (unprivileged, anyone deploys it): run(to, amount) calls M.unlock(abi.encode(msg.sender, to, amount)); its unlockCallback does M.sync(Currency.wrap(taxi)); taxi.transferFrom(from, address(M), amount); M.settle(); M.take(Currency.wrap(taxi), to, amount). Control: ALICE calls taxi.transfer(BOB, 1_000_000e18) directly -> BOB receives 990,000 TAXI and treasury receives 10,000 TAXI (expected and actual). Bypass: ALICE calls taxi.approve(R, 1_000_000e18) then R.run(BOB, 1_000_000e18). Expected if every ordinary holder-to-holder transfer is taxed: BOB 990,000 TAXI, treasury 10,000 TAXI. Actual: BOB 1,000,000 TAXI, ALICE 1,000,000 TAXI left, treasury 0, M balance 0. ERC-6909 variant: in the callback replace take with M.mint(ALICE, uint160(taxi), 1_000_000e18); ALICE calls M.transfer(BOB, id, 1_000_000e18); BOB calls M.transfer(CAROL, id, 1_000_000e18); CAROL approves R on the claim and R does M.burn(CAROL, id, 1_000_000e18); M.take(taxi, CAROL, 1_000_000e18). Actual: CAROL holds 1,000,000 TAXI after three changes of ownership, treasury 0 (expected under the fee rule: three 1% fees, about 29,701 TAXI). Not run here: I believe the already-deployed v4 Universal Router can do the same with a SETTLE(payerIsUser) + TAKE action pair and no helper deployment, but I did not execute that and the finding does not depend on it.","severity":"medium","snippet":"if (from == factory || to == factory || from == poolManager || to == poolManager) return true;","title":"The 1% fee is optional: any holder can relay a wallet-to-wallet transfer through the exempt pool manager and pay nothing to the treasury"}],"hash":"795581373c9a399d27a4c8c4778ec96861a0f0d0b51eea6b9b437870f7bb2102","nodeId":"215d2676-0ab8-4a4e-a18a-68661798cef0","outcome":"completed","summary":"The review is complete: one medium finding, written to `.imd-findings.json` in the repository root along with the coverage record. No tracked file was changed.\n\n## Finding\n\n**Medium — the 1% fee is avoidable on any transfer** (`src/Taxi.sol:72`). Because any transfer to or from the pool manager is exempt, a holder can send tokens to another wallet through the Uniswap v4 PoolManager and pay nothing to the treasury.\n\n- **Relay path:** an unprivileged helper deposits into the manager and pays the recipient out again (`sync`, `transferFrom` to the manager, `settle`, `take`), with no pool or swap involved. Sending 1,000,000 TAXI this way delivered 1,000,000 to the recipient and 0 to the treasury; the direct transfer delivered 990,000 and 10,000.\n- **Claim-token path:** the same deposit can be minted as the manager's ERC-6909 claim, which changes hands without the token's fee logic running and is redeemed whole.\n- **Who loses:** only the treasury, 1% of every transfer whose sender uses the relay. No holder loses funds.\n- **Fix needs a scope decision:** the two-way pool manager exemption is what the brief asks for and what the launch flows need, so I see no fix inside `Taxi.sol` that keeps the agreed design. The in-scope remedy is correcting README lines 25–27, which say intermediate wallet transfers are taxed.\n\nI reproduced this against the real v4-core PoolManager (commit 46c6834, copied into `test/scratch/` and compiled with `--via-ir`), and separately against a minimal stand-in. I believe the already-deployed Universal Router can do the same without a helper, but I did not run that.\n\nThere is no Foundry proof attached: one is only required for critical or high, and a test that must pass \"once fixed\" would bind the author to a design change.\n\n## Coverage\n\n- **`transfer`, `transferFrom`:** marked `finding` (ref 1). Their balance checks, fee split, allowance handling and revert paths otherwise behave as written.\n- **`approve`:** holds. It is unmodified OpenZeppelin v5.0.2, and the vendored files match their recorded checksums.\n- **Supply conservation and exact debit:** hold. The sender is debited exactly the amount, including the self-transfer and treasury aliases.\n- **Fee rounding:** holds. The sub-100-base-unit zero fee is documented and worth under 1e-16 TAXI per transfer, so I did not report it.\n- **Distributor claim under low gas:** holds. A gas-starved registry lookup cannot turn a claim into a taxed one; it reverts instead (swept 5,000–120,000 gas, zero taxed claims).\n- **Registry dependency:** holds. Every failure mode falls back to taxed transfers rather than freezing them.\n- **Launch flows:** hold by reading against the protected harness.\n\n## Not done\n\n- The protected harness was not run; it needs the network's factory-side sources and environment, which are not in this tree.\n- The real factory's `distributorOf` gas cost could not be checked. The low-gas result assumes it stays under the 30,000-gas cap.\n- Areas outside economics, invariants and flow gaps were only looked at where they touched the fee path.\n\nThe existing suite passes (36/36). `test/scratch/` was removed after use.","treeHash":null,"usage":{"cachedInputTokens":1104357,"inputTokens":26,"model":"claude-fable-5-1","outputTokens":34121,"runtime":"claude","turns":22,"wallClockMs":379199}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"35c52a5b502e847c","findings":[],"hash":"7e85f71c5364a87995028611d0cadbef9b6b78343e40468744733256872c052c","nodeId":"986805f3-099b-4171-a685-446aaacc539e","outcome":"failed","summary":"bundle upload failed: fetch failed","treeHash":null,"usage":{"cachedInputTokens":1154304,"inputTokens":100486,"model":"gpt-6-astra","outputTokens":5780,"runtime":"codex","turns":6,"wallClockMs":261210}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"5fb4f77b3d119b1d","findings":[],"hash":"8354a6c6e898121b5ba95ecc6d2604c6d53f70416fb5e0fc4e13a15a274e5b03","nodeId":"2eb36195-12f7-4500-ac3b-7ebcb56f76fa","outcome":"completed","summary":"Recorded no substantiated defects and coverage for all three entry points in [.imd-findings.json](/root/.identitymd/work/5679c75c-7f01-4fd5-9174-bc5cfe20722d/2eb36195-12f7-4500-ac3b-7ebcb56f76fa/.imd-findings.json).\n\nAll 36 local Foundry tests passed. Protected launch integration remains unverified because required sources and dependencies are absent. No contract or configuration files changed.","treeHash":null,"usage":{"cachedInputTokens":457984,"inputTokens":71087,"model":"gpt-6-astra","outputTokens":4888,"runtime":"codex","turns":4,"wallClockMs":173125}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"18527ba42d5b89d7","findings":[],"hash":"88d7a79e76c396d63c1b9e3d98197bc0e0d7ad2a9a9cf4fa632aa0eededf650b","nodeId":"e82dbc50-5c1c-4d43-bc41-02678763a3d3","outcome":"completed","summary":"Saved [`.imd-findings.json`](/home/imd/.identitymd/work/5679c75c-7f01-4fd5-9174-bc5cfe20722d/e82dbc50-5c1c-4d43-bc41-02678763a3d3/.imd-findings.json) with no substantiated defects and coverage for all three entry points.\n\nAll 36 local tests passed. Production registry behavior and full protected launch integration remain unverified because required implementations and inputs are absent. No source or configuration files changed.","treeHash":null,"usage":{"cachedInputTokens":451200,"inputTokens":84941,"model":"gpt-6-astra","outputTokens":4821,"runtime":"codex","turns":4,"wallClockMs":175816}},{"artifacts":[],"attempt":1,"bundleHash":"c79c50d372cd60c836538155a7b77c5f8730e1f693f9924b48d05a47d13c27dc","device":"3f6a9bdd601cb99f","findings":[],"hash":"a9ea0749f31f18967d8f537e2aa2158d18c13ad0570e1b7d1ba04a599b6e224e","nodeId":"6795bc13-64e2-43c7-a458-838b77f9635c","outcome":"completed","summary":"Implemented Taxi with the fixed 100 million supply, 18 decimals, permanent 1% treasury fee, required exemptions, and no owner or configuration setters.\n\n- `forge build`, `forge test`, and `forge fmt --check` pass.\n- 36 tests pass, including 4,000 fuzz cases.\n- Dependencies are vendored for offline builds.\n- Deployment parameters and responsibilities are documented in [README.md](/home/seat/.identitymd/work/5679c75c-7f01-4fd5-9174-bc5cfe20722d/6795bc13-64e2-43c7-a458-838b77f9635c/README.md).\n\nThe protected launch harness requires external launch context and was not run locally.","treeHash":"5cf5213a79e45ed1981c25b0b84cc460d30fc71a","usage":{"cachedInputTokens":696576,"inputTokens":60723,"model":"gpt-6-astra","outputTokens":17870,"runtime":"codex","turns":7,"wallClockMs":641977}}],"verification":[{"checks":[{"durationMs":815,"exitCode":0,"name":"build","output":"Compiling 13 files with Solc 0.8.26\nSolc 0.8.26 finished in 744.37ms\nCompiler run successful!\n","passed":true},{"durationMs":1236,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/TaxiPoolManagerRelay.t.sol:TaxiPoolManagerRelayTest\n[PASS] test_claimOwnershipChangesAndRedemptionPayNoTaxiFee() (gas: 479454)\n[PASS] test_directTransferPaysFeeButPoolManagerRelayDoesNot() (gas: 329666)\n[PASS] test_relayStillRequiresHolderAllowance() (gas: 140505)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 3.96ms (1.28ms CPU time)\n\nRan 30 tests for test/Taxi.t.sol:TaxiTest\n[PASS] testFuzz_exemptAmountsArriveWhole(uint256,uint8,bool) (runs: 1000, μ: 244632, ~: 250478)\n[PASS] testFuzz_taxAndAllowanceConserveSupply(uint256,uint256) (runs: 1000, μ: 249396, ~: 253212)\n[PASS] test_allExemptEndpointsInBothDirections() (gas: 569751)\n[PASS] test_approvalEventReplacementAndRevocation() (gas: 160619)\n[PASS] test_directDeploymentMintsToActualDeployer() (gas: 22699)\n[PASS] test_distributorResolvedDynamicallyAndOnlyForThisLaunch() (gas: 479237)\n[PASS] test_entireBalanceCanBeTransferred() (gas: 154559)\n[PASS] test_exemptSpenderDoesNotExemptOrdinaryEndpoints() (gas: 476954)\n[PASS] test_factoryCannotSpendHolderWithoutApproval() (gas: 181987)\n[PASS] test_failedTransferFromRollsBackAllowance() (gas: 168696)\n[PASS] test_infiniteAllowanceIsPreserved() (gas: 194524)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 155463)\n[PASS] test_insufficientBalanceRevertsBeforeFee() (gas: 107785)\n[PASS] test_launchAllocationClaimsAndPoolRoundTripAreExact() (gas: 410871)\n[PASS] test_maxUintTransferRevertsWithoutOverflow() (gas: 88918)\n[PASS] test_metadataAndConstructorMint() (gas: 92835)\n[PASS] test_noAdminMintBurnOrConfigurationEntrypoints() (gas: 1593673)\n[PASS] test_rejectsZeroFactory() (gas: 3958)\n[PASS] test_rejectsZeroManager() (gas: 6053)\n[PASS] test_roundingBoundariesAndZeroTransfer() (gas: 393990)\n[PASS] test_runtimeHasNoDangerousOpcodes() (gas: 659401)\n[PASS] test_selfAndTreasuryTransfersRequireGrossBalance() (gas: 196702)\n[PASS] test_selfTransferPaysOnlyFee() (gas: 134640)\n[PASS] test_taxedTransferAndEvents() (gas: 182326)\n[PASS] test_transferFromAllExemptEndpointsInBothDirections() (gas: 930265)\n[PASS] test_transferFromConsumesGrossAllowance() (gas: 220244)\n[PASS] test_treasuryIncomingOutgoingAndSelfTransfers() (gas: 248864)\n[PASS] test_zeroAddressTransfersAndApprovalsRevert() (gas: 174704)\n[PASS] test_zeroRecipientTransferFromRollsBackAllowance() (gas: 151067)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 41089)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 1.05s (133.10ms CPU time)\n\nRan 5 tests for test/TaxiRegistry.t.sol:TaxiRegistryTest\n[PASS] testFuzz_registryFaultsDoNotFreezeOrdinaryTransfers(uint8) (runs: 1000, μ: 177096, ~: 167961)\n[PASS] test_failedRegistryDoesNotAffectFixedExemptions() (gas: 299011)\n[PASS] test_registryRecoveryIsRecognizedWithoutTokenConfiguration() (gas: 301030)\n[PASS] test_registryWithNoCodeDefaultsToTaxedTransfers() (gas: 101754)\n[PASS] test_successfulRegistryReadMakesDistributorExempt() (gas: 199757)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.17s (1.15s CPU time)\n\nRan 1 test for test/TaxiSequence.t.sol:TaxiSequenceTest\n[PASS] testFuzz_transferSequencesPreserveModelAndSupply(bytes32) (runs: 1000, μ: 7818242, ~: 7814591)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.17s (1.17s CPU time)\n\nRan 4 test suites in 1.17s (3.39s CPU time): 39 tests passed, 0 failed, 0 skipped (39 total tests)\n","passed":true},{"durationMs":53,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Taxi.approve(address,uint256)\",\"Taxi.transfer(address,uint256)\",\"Taxi.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":173,\"foundry.toml\":16,\"launch.json\":24,\"remappings.txt\":1,\"src/Taxi.sol\":76,\"src/interfaces/ILaunchFactory.sol\":7,\"test/Taxi.t.sol\":466,\"test/TaxiPoolManagerRelay.t.sol\":128,\"test/TaxiRegistry.t.sol\":114,\"test/TaxiSequence.t.sol\":73,\"test/helpers/LaunchFactoryMock.sol\":17,\"test/helpers/TestBase.sol\":41},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"02a09fb780cfc8fe5b8c6717cc5bccd243f26d0ffd753a8cf569dbe1385b35a5","verifiedTreeHash":"95829948881ee2cc2595efcab4711b104bab2785","verifierVersion":"0.1.0+9f8ef295"},{"checks":[{"durationMs":1120,"exitCode":0,"name":"build","output":"Compiling 18 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.06s\nCompiler run successful!\n","passed":true},{"durationMs":11480,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/TaxiPoolManagerRelay.t.sol:TaxiPoolManagerRelayTest\n[PASS] test_claimOwnershipChangesAndRedemptionPayNoTaxiFee() (gas: 479454)\n[PASS] test_directTransferPaysFeeButPoolManagerRelayDoesNot() (gas: 329666)\n[PASS] test_relayStillRequiresHolderAllowance() (gas: 140505)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 115.86ms (1.20ms CPU time)\n\nRan 11 tests for test/TaxiAdversarial.t.sol:TaxiAdversarialTest\n[PASS] testFuzz_exemptionIsEvaluatedAtSpendTime(uint256,bool) (runs: 1000, μ: 262258, ~: 243314)\n[PASS] testFuzz_failedDelegatedAliasPreservesBalanceAndAllowance(uint256,uint8,bool) (runs: 1000, μ: 184935, ~: 186156)\n[PASS] testFuzz_taxedRoundTripCannotCreateValueAndRoundingStaysBelowOneUnit(uint256) (runs: 1000, μ: 265989, ~: 271579)\n[PASS] test_delegatedSelfTransferConsumesGrossAllowanceAndCannotBeReplayed() (gas: 235620)\n[PASS] test_infiniteApprovalCanBeRevokedAndReplacedWithFiniteBudget() (gas: 475376)\n[PASS] test_launchNumberZeroAndMaxUseTheirOwnRegistryKey() (gas: 595165)\n[PASS] test_roundTripAtZeroOneFeeBoundariesAndFullSupply() (gas: 1872011)\n[PASS] test_transferFromByHolderStillRequiresExplicitAllowance() (gas: 252759)\n[PASS] test_treasuryDelegationConsumesGrossAllowanceDespiteSmallerDebit() (gas: 191263)\n[PASS] test_zeroSenderCannotReachConstructorMintPathEvenWithZeroAmount() (gas: 66731)\n[PASS] test_zeroTransferFromEmptyHolderNeedsNoApprovalAndEmitsTransfer() (gas: 77786)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 116.17ms (274.16ms CPU time)\n\nRan 4 tests for test/TaxiTransferProperties.t.sol:TaxiTransferPropertiesTest\n[PASS] testFuzz_bystanderStateIsUntouched(uint256,uint8,uint8,uint256) (runs: 1000, μ: 400308, ~: 406926)\n[PASS] testFuzz_gasStarvedTransferIsAllOrNothing(uint256,bool) (runs: 1000, μ: 111616, ~: 95646)\n[PASS] testFuzz_transferEventsAccountForEveryUnitMoved(uint256,uint8,uint8,bool) (runs: 1000, μ: 293400, ~: 285049)\n[PASS] test_gasStarvedTransferPinnedAtTooLittleAndEnough() (gas: 178046)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 116.17ms (334.87ms CPU time)\n\nRan 30 tests for test/Taxi.t.sol:TaxiTest\n[PASS] testFuzz_exemptAmountsArriveWhole(uint256,uint8,bool) (runs: 1000, μ: 243517, ~: 250380)\n[PASS] testFuzz_taxAndAllowanceConserveSupply(uint256,uint256) (runs: 1000, μ: 249274, ~: 253212)\n[PASS] test_allExemptEndpointsInBothDirections() (gas: 569751)\n[PASS] test_approvalEventReplacementAndRevocation() (gas: 160619)\n[PASS] test_directDeploymentMintsToActualDeployer() (gas: 22699)\n[PASS] test_distributorResolvedDynamicallyAndOnlyForThisLaunch() (gas: 479237)\n[PASS] test_entireBalanceCanBeTransferred() (gas: 154559)\n[PASS] test_exemptSpenderDoesNotExemptOrdinaryEndpoints() (gas: 476954)\n[PASS] test_factoryCannotSpendHolderWithoutApproval() (gas: 181987)\n[PASS] test_failedTransferFromRollsBackAllowance() (gas: 168696)\n[PASS] test_infiniteAllowanceIsPreserved() (gas: 194524)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 155463)\n[PASS] test_insufficientBalanceRevertsBeforeFee() (gas: 107785)\n[PASS] test_launchAllocationClaimsAndPoolRoundTripAreExact() (gas: 410871)\n[PASS] test_maxUintTransferRevertsWithoutOverflow() (gas: 88918)\n[PASS] test_metadataAndConstructorMint() (gas: 92835)\n[PASS] test_noAdminMintBurnOrConfigurationEntrypoints() (gas: 1593673)\n[PASS] test_rejectsZeroFactory() (gas: 3958)\n[PASS] test_rejectsZeroManager() (gas: 6053)\n[PASS] test_roundingBoundariesAndZeroTransfer() (gas: 393990)\n[PASS] test_runtimeHasNoDangerousOpcodes() (gas: 659401)\n[PASS] test_selfAndTreasuryTransfersRequireGrossBalance() (gas: 196702)\n[PASS] test_selfTransferPaysOnlyFee() (gas: 134640)\n[PASS] test_taxedTransferAndEvents() (gas: 182326)\n[PASS] test_transferFromAllExemptEndpointsInBothDirections() (gas: 930265)\n[PASS] test_transferFromConsumesGrossAllowance() (gas: 220244)\n[PASS] test_treasuryIncomingOutgoingAndSelfTransfers() (gas: 248864)\n[PASS] test_zeroAddressTransfersAndApprovalsRevert() (gas: 174704)\n[PASS] test_zeroRecipientTransferFromRollsBackAllowance() (gas: 151067)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 41089)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 116.79ms (236.48ms CPU time)\n\nRan 5 tests for test/TaxiRegistry.t.sol:TaxiRegistryTest\n[PASS] testFuzz_registryFaultsDoNotFreezeOrdinaryTransfers(uint8) (runs: 1000, μ: 176729, ~: 167961)\n[PASS] test_failedRegistryDoesNotAffectFixedExemptions() (gas: 299011)\n[PASS] test_registryRecoveryIsRecognizedWithoutTokenConfiguration() (gas: 301030)\n[PASS] test_registryWithNoCodeDefaultsToTaxedTransfers() (gas: 101754)\n[PASS] test_successfulRegistryReadMakesDistributorExempt() (gas: 199757)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 116.79ms (118.22ms CPU time)\n\nRan 7 tests for test/TaxiRegistryBoundary.t.sol:TaxiRegistryBoundaryTest\n[PASS] testFuzz_registryWithinBudgetIsHonoredAndBeyondBudgetIsSilentlyAbsent(uint256,bool) (runs: 1000, μ: 267899, ~: 283162)\n[PASS] test_budgetBoundaryPinnedJustBelowAndJustAboveTheCap() (gas: 435712)\n[PASS] test_lookupBudgetIsExactlyThirtyThousandGasAndNotRaisedByTheCaller() (gas: 171166)\n[PASS] test_malformedPayloadsAreAbsentAndWidestAddressIsAccepted() (gas: 878338)\n[PASS] test_registryReadingTheTokenDuringLookupIsHonored() (gas: 444524)\n[PASS] test_registryReenteringTheLookupNeverFreezesTransfers() (gas: 505620)\n[PASS] test_registryWritingTheTokenDuringLookupIsAbsentAndMovesNothing() (gas: 596813)\nSuite result: ok. 7 passed; 0 failed; 0 skipped; finished in 119.63ms (122.01ms CPU time)\n\nRan 1 test for test/TaxiSequence.t.sol:TaxiSequenceTest\n[PASS] testFuzz_transferSequencesPreserveModelAndSupply(bytes32) (runs: 1000, μ: 7814010, ~: 7797592)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 611.90ms (611.51ms CPU time)\n\nRan 2 tests for test/TaxiInvariant.t.sol:TaxiInvariantTest\n[PASS]\nTaxiInvariantTest invariants:\n[PASS] invariant_allowancesMatchAuthorizations\n[PASS] invariant_configurationAndRegistryStayConsistent\n[PASS] invariant_fixedSupplyAndExactBalances\n TaxiInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------+------------------------+-------+---------+----------╮\n| Contract    | Selector               | Calls | Reverts | Discards |\n+===================================================================+\n| TaxiHandler | approve                | 2448  | 0       | 0        |\n|-------------+------------------------+-------+---------+----------|\n| TaxiHandler | approveAndTransferFrom | 2331  | 0       | 0        |\n|-------------+------------------------+-------+---------+----------|\n| TaxiHandler | changeDistributor      | 2304  | 0       | 0        |\n|-------------+------------------------+-------+---------+----------|\n| TaxiHandler | rejectInvalidCall      | 2270  | 0       | 0        |\n|-------------+------------------------+-------+---------+----------|\n| TaxiHandler | transfer               | 2342  | 0       | 0        |\n|-------------+------------------------+-------+---------+----------|\n| TaxiHandler | transferBoundary       | 2366  | 0       | 0        |\n|-------------+------------------------+-------+---------+----------|\n| TaxiHandler | transferFrom           | 2323  | 0       | 0        |\n╰-------------+------------------------+-------+---------+----------╯\n\n[PASS] test_handlerExercisesPersistentStateAndEveryRejection() (gas: 12111873)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 11.42s (11.40s CPU time)\n\nRan 8 test suites in 11.42s (12.73s CPU time): 63 tests passed, 0 failed, 0 skipped (63 total tests)\n","passed":true},{"durationMs":31,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Taxi.approve(address,uint256)\",\"Taxi.transfer(address,uint256)\",\"Taxi.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":173,\"foundry.toml\":16,\"remappings.txt\":1,\"src/Taxi.sol\":76,\"src/interfaces/ILaunchFactory.sol\":7,\"test/TAXI_TESTS.md\":71,\"test/Taxi.t.sol\":466,\"test/TaxiAdversarial.t.sol\":231,\"test/TaxiInvariant.t.sol\":118,\"test/TaxiPoolManagerRelay.t.sol\":128,\"test/TaxiRegistry.t.sol\":114,\"test/TaxiRegistryBoundary.t.sol\":241,\"test/TaxiSequence.t.sol\":73,\"test/TaxiTransferProperties.t.sol\":186,\"test/helpers/LaunchFactoryMock.sol\":17,\"test/helpers/TaxiHandler.sol\":191,\"test/helpers/TestBase.sol\":41},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"047955fd578b1bd6c2f6fccf8302bb799d0112701c8a80cd536b0b02b3951774","verifiedTreeHash":"99bc79dd84e127fbbe0d3a519006a3099dad1b7f","verifierVersion":"0.1.0+9f8ef295"},{"checks":[{"durationMs":770,"exitCode":0,"name":"build","output":"Compiling 13 files with Solc 0.8.26\nSolc 0.8.26 finished in 701.30ms\nCompiler run successful!\n","passed":true},{"durationMs":1412,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 3 tests for test/TaxiPoolManagerRelay.t.sol:TaxiPoolManagerRelayTest\n[PASS] test_claimOwnershipChangesAndRedemptionPayNoTaxiFee() (gas: 479454)\n[PASS] test_directTransferPaysFeeButPoolManagerRelayDoesNot() (gas: 329666)\n[PASS] test_relayStillRequiresHolderAllowance() (gas: 140505)\nSuite result: ok. 3 passed; 0 failed; 0 skipped; finished in 1.18s (1.38ms CPU time)\n\nRan 30 tests for test/Taxi.t.sol:TaxiTest\n[PASS] testFuzz_exemptAmountsArriveWhole(uint256,uint8,bool) (runs: 1000, μ: 243925, ~: 250398)\n[PASS] testFuzz_taxAndAllowanceConserveSupply(uint256,uint256) (runs: 1000, μ: 249497, ~: 253212)\n[PASS] test_allExemptEndpointsInBothDirections() (gas: 569751)\n[PASS] test_approvalEventReplacementAndRevocation() (gas: 160619)\n[PASS] test_directDeploymentMintsToActualDeployer() (gas: 22699)\n[PASS] test_distributorResolvedDynamicallyAndOnlyForThisLaunch() (gas: 479237)\n[PASS] test_entireBalanceCanBeTransferred() (gas: 154559)\n[PASS] test_exemptSpenderDoesNotExemptOrdinaryEndpoints() (gas: 476954)\n[PASS] test_factoryCannotSpendHolderWithoutApproval() (gas: 181987)\n[PASS] test_failedTransferFromRollsBackAllowance() (gas: 168696)\n[PASS] test_infiniteAllowanceIsPreserved() (gas: 194524)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 155463)\n[PASS] test_insufficientBalanceRevertsBeforeFee() (gas: 107785)\n[PASS] test_launchAllocationClaimsAndPoolRoundTripAreExact() (gas: 410871)\n[PASS] test_maxUintTransferRevertsWithoutOverflow() (gas: 88918)\n[PASS] test_metadataAndConstructorMint() (gas: 92835)\n[PASS] test_noAdminMintBurnOrConfigurationEntrypoints() (gas: 1593673)\n[PASS] test_rejectsZeroFactory() (gas: 3958)\n[PASS] test_rejectsZeroManager() (gas: 6053)\n[PASS] test_roundingBoundariesAndZeroTransfer() (gas: 393990)\n[PASS] test_runtimeHasNoDangerousOpcodes() (gas: 659401)\n[PASS] test_selfAndTreasuryTransfersRequireGrossBalance() (gas: 196702)\n[PASS] test_selfTransferPaysOnlyFee() (gas: 134640)\n[PASS] test_taxedTransferAndEvents() (gas: 182326)\n[PASS] test_transferFromAllExemptEndpointsInBothDirections() (gas: 930265)\n[PASS] test_transferFromConsumesGrossAllowance() (gas: 220244)\n[PASS] test_treasuryIncomingOutgoingAndSelfTransfers() (gas: 248864)\n[PASS] test_zeroAddressTransfersAndApprovalsRevert() (gas: 174704)\n[PASS] test_zeroRecipientTransferFromRollsBackAllowance() (gas: 151067)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 41089)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 1.23s (147.55ms CPU time)\n\nRan 5 tests for test/TaxiRegistry.t.sol:TaxiRegistryTest\n[PASS] testFuzz_registryFaultsDoNotFreezeOrdinaryTransfers(uint8) (runs: 1000, μ: 179184, ~: 167961)\n[PASS] test_failedRegistryDoesNotAffectFixedExemptions() (gas: 299011)\n[PASS] test_registryRecoveryIsRecognizedWithoutTokenConfiguration() (gas: 301030)\n[PASS] test_registryWithNoCodeDefaultsToTaxedTransfers() (gas: 101754)\n[PASS] test_successfulRegistryReadMakesDistributorExempt() (gas: 199757)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.29s (1.24s CPU time)\n\nRan 1 test for test/TaxiSequence.t.sol:TaxiSequenceTest\n[PASS] testFuzz_transferSequencesPreserveModelAndSupply(bytes32) (runs: 1000, μ: 7811904, ~: 7801619)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.33s (1.33s CPU time)\n\nRan 4 test suites in 1.33s (5.02s CPU time): 39 tests passed, 0 failed, 0 skipped (39 total tests)\n","passed":true},{"durationMs":33,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Taxi.approve(address,uint256)\",\"Taxi.transfer(address,uint256)\",\"Taxi.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":173,\"foundry.toml\":16,\"remappings.txt\":1,\"src/Taxi.sol\":76,\"src/interfaces/ILaunchFactory.sol\":7,\"test/Taxi.t.sol\":466,\"test/TaxiPoolManagerRelay.t.sol\":128,\"test/TaxiRegistry.t.sol\":114,\"test/TaxiSequence.t.sol\":73,\"test/helpers/LaunchFactoryMock.sol\":17,\"test/helpers/TestBase.sol\":41},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"2e553bb040c76f73ca7bf479fcae72833f63a6be91c569a86713e03f854c1407","verifiedTreeHash":"55083fbfe55af4ad18a539d5455b5615257be7b0","verifierVersion":"0.1.0+9f8ef295"},{"checks":[{"durationMs":1016,"exitCode":0,"name":"build","output":"Compiling 15 files with Solc 0.8.26\nSolc 0.8.26 finished in 953.49ms\nCompiler run successful!\n","passed":true},{"durationMs":13868,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/TaxiRegistry.t.sol:TaxiRegistryTest\n[PASS] testFuzz_registryFaultsDoNotFreezeOrdinaryTransfers(uint8) (runs: 1000, μ: 178757, ~: 167961)\n[PASS] test_failedRegistryDoesNotAffectFixedExemptions() (gas: 299011)\n[PASS] test_registryRecoveryIsRecognizedWithoutTokenConfiguration() (gas: 301030)\n[PASS] test_registryWithNoCodeDefaultsToTaxedTransfers() (gas: 101754)\n[PASS] test_successfulRegistryReadMakesDistributorExempt() (gas: 199757)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 64.24ms (65.54ms CPU time)\n\nRan 30 tests for test/Taxi.t.sol:TaxiTest\n[PASS] testFuzz_exemptAmountsArriveWhole(uint256,uint8,bool) (runs: 1000, μ: 244227, ~: 250398)\n[PASS] testFuzz_taxAndAllowanceConserveSupply(uint256,uint256) (runs: 1000, μ: 249148, ~: 253212)\n[PASS] test_allExemptEndpointsInBothDirections() (gas: 569751)\n[PASS] test_approvalEventReplacementAndRevocation() (gas: 160619)\n[PASS] test_directDeploymentMintsToActualDeployer() (gas: 22699)\n[PASS] test_distributorResolvedDynamicallyAndOnlyForThisLaunch() (gas: 479237)\n[PASS] test_entireBalanceCanBeTransferred() (gas: 154559)\n[PASS] test_exemptSpenderDoesNotExemptOrdinaryEndpoints() (gas: 476954)\n[PASS] test_factoryCannotSpendHolderWithoutApproval() (gas: 181987)\n[PASS] test_failedTransferFromRollsBackAllowance() (gas: 168696)\n[PASS] test_infiniteAllowanceIsPreserved() (gas: 194524)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 155463)\n[PASS] test_insufficientBalanceRevertsBeforeFee() (gas: 107785)\n[PASS] test_launchAllocationClaimsAndPoolRoundTripAreExact() (gas: 410871)\n[PASS] test_maxUintTransferRevertsWithoutOverflow() (gas: 88918)\n[PASS] test_metadataAndConstructorMint() (gas: 92835)\n[PASS] test_noAdminMintBurnOrConfigurationEntrypoints() (gas: 1593673)\n[PASS] test_rejectsZeroFactory() (gas: 3958)\n[PASS] test_rejectsZeroManager() (gas: 6053)\n[PASS] test_roundingBoundariesAndZeroTransfer() (gas: 393990)\n[PASS] test_runtimeHasNoDangerousOpcodes() (gas: 659401)\n[PASS] test_selfAndTreasuryTransfersRequireGrossBalance() (gas: 196702)\n[PASS] test_selfTransferPaysOnlyFee() (gas: 134640)\n[PASS] test_taxedTransferAndEvents() (gas: 182326)\n[PASS] test_transferFromAllExemptEndpointsInBothDirections() (gas: 930265)\n[PASS] test_transferFromConsumesGrossAllowance() (gas: 220244)\n[PASS] test_treasuryIncomingOutgoingAndSelfTransfers() (gas: 248864)\n[PASS] test_zeroAddressTransfersAndApprovalsRevert() (gas: 174704)\n[PASS] test_zeroRecipientTransferFromRollsBackAllowance() (gas: 151067)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 41089)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 590.86ms (146.80ms CPU time)\n\nRan 11 tests for test/TaxiAdversarial.t.sol:TaxiAdversarialTest\n[PASS] testFuzz_exemptionIsEvaluatedAtSpendTime(uint256,bool) (runs: 1000, μ: 261541, ~: 243314)\n[PASS] testFuzz_failedDelegatedAliasPreservesBalanceAndAllowance(uint256,uint8,bool) (runs: 1000, μ: 185039, ~: 184382)\n[PASS] testFuzz_taxedRoundTripCannotCreateValueAndRoundingStaysBelowOneUnit(uint256) (runs: 1000, μ: 265835, ~: 271591)\n[PASS] test_delegatedSelfTransferConsumesGrossAllowanceAndCannotBeReplayed() (gas: 235620)\n[PASS] test_infiniteApprovalCanBeRevokedAndReplacedWithFiniteBudget() (gas: 475376)\n[PASS] test_launchNumberZeroAndMaxUseTheirOwnRegistryKey() (gas: 595165)\n[PASS] test_roundTripAtZeroOneFeeBoundariesAndFullSupply() (gas: 1872011)\n[PASS] test_transferFromByHolderStillRequiresExplicitAllowance() (gas: 252759)\n[PASS] test_treasuryDelegationConsumesGrossAllowanceDespiteSmallerDebit() (gas: 191263)\n[PASS] test_zeroSenderCannotReachConstructorMintPathEvenWithZeroAmount() (gas: 66731)\n[PASS] test_zeroTransferFromEmptyHolderNeedsNoApprovalAndEmitsTransfer() (gas: 77786)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 593.15ms (1.70s CPU time)\n\nRan 1 test for test/TaxiSequence.t.sol:TaxiSequenceTest\n[PASS] testFuzz_transferSequencesPreserveModelAndSupply(bytes32) (runs: 1000, μ: 7817107, ~: 7823476)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 619.25ms (618.80ms CPU time)\n\nRan 2 tests for test/TaxiInvariant.t.sol:TaxiInvariantTest\n[PASS]\nTaxiInvariantTest invariants:\n[PASS] invariant_allowancesMatchAuthorizations\n[PASS] invariant_configurationAndRegistryStayConsistent\n[PASS] invariant_fixedSupplyAndExactBalances\n TaxiInvariantTest invariants (runs: 256, calls: 16384, reverts: 0)\n\n╭-------------+------------------------+-------+---------+----------╮\n| Contract    | Selector               | Calls | Reverts | Discards |\n+===================================================================+\n| TaxiHandler | approve                | 2416  | 0       | 0        |\n|-------------+------------------------+-------+---------+----------|\n| TaxiHandler | approveAndTransferFrom | 2317  | 0       | 0        |\n|-------------+------------------------+-------+---------+----------|\n| TaxiHandler | changeDistributor      | 2266  | 0       | 0        |\n|-------------+------------------------+-------+---------+----------|\n| TaxiHandler | rejectInvalidCall      | 2390  | 0       | 0        |\n|-------------+------------------------+-------+---------+----------|\n| TaxiHandler | transfer               | 2376  | 0       | 0        |\n|-------------+------------------------+-------+---------+----------|\n| TaxiHandler | transferBoundary       | 2301  | 0       | 0        |\n|-------------+------------------------+-------+---------+----------|\n| TaxiHandler | transferFrom           | 2318  | 0       | 0        |\n╰-------------+------------------------+-------+---------+----------╯\n\n[PASS] test_handlerExercisesPersistentStateAndEveryRejection() (gas: 12111873)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 13.81s (13.81s CPU time)\n\nRan 5 test suites in 13.81s (15.68s CPU time): 49 tests passed, 0 failed, 0 skipped (49 total tests)\n","passed":true},{"durationMs":40,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Taxi.approve(address,uint256)\",\"Taxi.transfer(address,uint256)\",\"Taxi.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":137,\"foundry.toml\":16,\"remappings.txt\":1,\"src/Taxi.sol\":76,\"src/interfaces/ILaunchFactory.sol\":7,\"test/TAXI_TESTS.md\":45,\"test/Taxi.t.sol\":466,\"test/TaxiAdversarial.t.sol\":231,\"test/TaxiInvariant.t.sol\":118,\"test/TaxiRegistry.t.sol\":114,\"test/TaxiSequence.t.sol\":73,\"test/helpers/LaunchFactoryMock.sol\":17,\"test/helpers/TaxiHandler.sol\":191,\"test/helpers/TestBase.sol\":41},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"68e5c80a7d1859d2ac050dda19526b3e118fa3794eed8638e6ae829fdc3906bc","verifiedTreeHash":"992c6bb7e46d0d193b3c578a8e062b9ffa6fb3bd","verifierVersion":"0.1.0+9f8ef295"},{"checks":[{"durationMs":522,"exitCode":0,"name":"build","output":"Compiling 12 files with Solc 0.8.26\nSolc 0.8.26 finished in 457.33ms\nCompiler run successful!\n","passed":true},{"durationMs":674,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/TaxiRegistry.t.sol:TaxiRegistryTest\n[PASS] testFuzz_registryFaultsDoNotFreezeOrdinaryTransfers(uint8) (runs: 1000, μ: 177829, ~: 167961)\n[PASS] test_failedRegistryDoesNotAffectFixedExemptions() (gas: 299011)\n[PASS] test_registryRecoveryIsRecognizedWithoutTokenConfiguration() (gas: 301030)\n[PASS] test_registryWithNoCodeDefaultsToTaxedTransfers() (gas: 101754)\n[PASS] test_successfulRegistryReadMakesDistributorExempt() (gas: 199757)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 552.72ms (557.24ms CPU time)\n\nRan 30 tests for test/Taxi.t.sol:TaxiTest\n[PASS] testFuzz_exemptAmountsArriveWhole(uint256,uint8,bool) (runs: 1000, μ: 244196, ~: 250398)\n[PASS] testFuzz_taxAndAllowanceConserveSupply(uint256,uint256) (runs: 1000, μ: 248632, ~: 253212)\n[PASS] test_allExemptEndpointsInBothDirections() (gas: 569751)\n[PASS] test_approvalEventReplacementAndRevocation() (gas: 160619)\n[PASS] test_directDeploymentMintsToActualDeployer() (gas: 22699)\n[PASS] test_distributorResolvedDynamicallyAndOnlyForThisLaunch() (gas: 479237)\n[PASS] test_entireBalanceCanBeTransferred() (gas: 154559)\n[PASS] test_exemptSpenderDoesNotExemptOrdinaryEndpoints() (gas: 476954)\n[PASS] test_factoryCannotSpendHolderWithoutApproval() (gas: 181987)\n[PASS] test_failedTransferFromRollsBackAllowance() (gas: 168696)\n[PASS] test_infiniteAllowanceIsPreserved() (gas: 194524)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 155463)\n[PASS] test_insufficientBalanceRevertsBeforeFee() (gas: 107785)\n[PASS] test_launchAllocationClaimsAndPoolRoundTripAreExact() (gas: 410871)\n[PASS] test_maxUintTransferRevertsWithoutOverflow() (gas: 88918)\n[PASS] test_metadataAndConstructorMint() (gas: 92835)\n[PASS] test_noAdminMintBurnOrConfigurationEntrypoints() (gas: 1593673)\n[PASS] test_rejectsZeroFactory() (gas: 3958)\n[PASS] test_rejectsZeroManager() (gas: 6053)\n[PASS] test_roundingBoundariesAndZeroTransfer() (gas: 393990)\n[PASS] test_runtimeHasNoDangerousOpcodes() (gas: 659401)\n[PASS] test_selfAndTreasuryTransfersRequireGrossBalance() (gas: 196702)\n[PASS] test_selfTransferPaysOnlyFee() (gas: 134640)\n[PASS] test_taxedTransferAndEvents() (gas: 182326)\n[PASS] test_transferFromAllExemptEndpointsInBothDirections() (gas: 930265)\n[PASS] test_transferFromConsumesGrossAllowance() (gas: 220244)\n[PASS] test_treasuryIncomingOutgoingAndSelfTransfers() (gas: 248864)\n[PASS] test_zeroAddressTransfersAndApprovalsRevert() (gas: 174704)\n[PASS] test_zeroRecipientTransferFromRollsBackAllowance() (gas: 151067)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 41089)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 615.40ms (608.98ms CPU time)\n\nRan 1 test for test/TaxiSequence.t.sol:TaxiSequenceTest\n[PASS] testFuzz_transferSequencesPreserveModelAndSupply(bytes32) (runs: 1000, μ: 7808980, ~: 7804063)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 615.41ms (615.01ms CPU time)\n\nRan 3 test suites in 616.26ms (1.78s CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":30,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Taxi.approve(address,uint256)\",\"Taxi.transfer(address,uint256)\",\"Taxi.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":137,\"foundry.toml\":16,\"launch.json\":24,\"remappings.txt\":1,\"src/Taxi.sol\":76,\"src/interfaces/ILaunchFactory.sol\":7,\"test/Taxi.t.sol\":466,\"test/TaxiRegistry.t.sol\":114,\"test/TaxiSequence.t.sol\":73,\"test/helpers/LaunchFactoryMock.sol\":17,\"test/helpers/TestBase.sol\":41},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"728083d13090181fa7437220d72f4e5efd3a2b67cf752b2840a53dcc6b200be5","verifiedTreeHash":"fdff53eb738852cb9fa6b0d8ba13544c45123e71","verifierVersion":"0.1.0+9f8ef295"},{"checks":[{"durationMs":961,"exitCode":0,"name":"build","output":"Compiling 12 files with Solc 0.8.26\nSolc 0.8.26 finished in 868.21ms\nCompiler run successful!\n","passed":true},{"durationMs":1312,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 30 tests for test/Taxi.t.sol:TaxiTest\n[PASS] testFuzz_exemptAmountsArriveWhole(uint256,uint8,bool) (runs: 1000, μ: 244474, ~: 250398)\n[PASS] testFuzz_taxAndAllowanceConserveSupply(uint256,uint256) (runs: 1000, μ: 248913, ~: 253212)\n[PASS] test_allExemptEndpointsInBothDirections() (gas: 569751)\n[PASS] test_approvalEventReplacementAndRevocation() (gas: 160619)\n[PASS] test_directDeploymentMintsToActualDeployer() (gas: 22699)\n[PASS] test_distributorResolvedDynamicallyAndOnlyForThisLaunch() (gas: 479237)\n[PASS] test_entireBalanceCanBeTransferred() (gas: 154559)\n[PASS] test_exemptSpenderDoesNotExemptOrdinaryEndpoints() (gas: 476954)\n[PASS] test_factoryCannotSpendHolderWithoutApproval() (gas: 181987)\n[PASS] test_failedTransferFromRollsBackAllowance() (gas: 168696)\n[PASS] test_infiniteAllowanceIsPreserved() (gas: 194524)\n[PASS] test_insufficientAllowanceCannotPayOnlyNetAmount() (gas: 155463)\n[PASS] test_insufficientBalanceRevertsBeforeFee() (gas: 107785)\n[PASS] test_launchAllocationClaimsAndPoolRoundTripAreExact() (gas: 410871)\n[PASS] test_maxUintTransferRevertsWithoutOverflow() (gas: 88918)\n[PASS] test_metadataAndConstructorMint() (gas: 92835)\n[PASS] test_noAdminMintBurnOrConfigurationEntrypoints() (gas: 1593673)\n[PASS] test_rejectsZeroFactory() (gas: 3958)\n[PASS] test_rejectsZeroManager() (gas: 6053)\n[PASS] test_roundingBoundariesAndZeroTransfer() (gas: 393990)\n[PASS] test_runtimeHasNoDangerousOpcodes() (gas: 659401)\n[PASS] test_selfAndTreasuryTransfersRequireGrossBalance() (gas: 196702)\n[PASS] test_selfTransferPaysOnlyFee() (gas: 134640)\n[PASS] test_taxedTransferAndEvents() (gas: 182326)\n[PASS] test_transferFromAllExemptEndpointsInBothDirections() (gas: 930265)\n[PASS] test_transferFromConsumesGrossAllowance() (gas: 220244)\n[PASS] test_treasuryIncomingOutgoingAndSelfTransfers() (gas: 248864)\n[PASS] test_zeroAddressTransfersAndApprovalsRevert() (gas: 174704)\n[PASS] test_zeroRecipientTransferFromRollsBackAllowance() (gas: 151067)\n[PASS] test_zeroTransferFromEmptyAccountEmitsEvent() (gas: 41089)\nSuite result: ok. 30 passed; 0 failed; 0 skipped; finished in 1.20s (2.34s CPU time)\n\nRan 5 tests for test/TaxiRegistry.t.sol:TaxiRegistryTest\n[PASS] testFuzz_registryFaultsDoNotFreezeOrdinaryTransfers(uint8) (runs: 1000, μ: 177327, ~: 167961)\n[PASS] test_failedRegistryDoesNotAffectFixedExemptions() (gas: 299011)\n[PASS] test_registryRecoveryIsRecognizedWithoutTokenConfiguration() (gas: 301030)\n[PASS] test_registryWithNoCodeDefaultsToTaxedTransfers() (gas: 101754)\n[PASS] test_successfulRegistryReadMakesDistributorExempt() (gas: 199757)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.20s (1.20s CPU time)\n\nRan 1 test for test/TaxiSequence.t.sol:TaxiSequenceTest\n[PASS] testFuzz_transferSequencesPreserveModelAndSupply(bytes32) (runs: 1000, μ: 7814106, ~: 7813638)\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.17s (1.17s CPU time)\n\nRan 3 test suites in 1.21s (3.58s CPU time): 36 tests passed, 0 failed, 0 skipped (36 total tests)\n","passed":true},{"durationMs":60,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"Taxi.approve(address,uint256)\",\"Taxi.transfer(address,uint256)\",\"Taxi.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":3,\"README.md\":137,\"foundry.toml\":16,\"remappings.txt\":1,\"src/Taxi.sol\":76,\"src/interfaces/ILaunchFactory.sol\":7,\"test/Taxi.t.sol\":466,\"test/TaxiRegistry.t.sol\":114,\"test/TaxiSequence.t.sol\":73,\"test/helpers/LaunchFactoryMock.sol\":17,\"test/helpers/TestBase.sol\":41},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":860,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":326,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/Taxi.sol:9: Large Numeric Literal\n[low] literal-instead-of-constant at src/Taxi.sol:61: Literal Instead of Constant (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"a9ea0749f31f18967d8f537e2aa2158d18c13ad0570e1b7d1ba04a599b6e224e","verifiedTreeHash":"5cf5213a79e45ed1981c25b0b84cc460d30fc71a","verifierVersion":"0.1.0+9f8ef295"}]}