{"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":"8960e9c3-9bdc-4d25-b9d8-8bab43f494a8","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"3919a3b454d36531e174ffc289d8390f541584b93c6423517e6ec97dd47d3ee2","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":"b2b229a00760017833bfd89afc621a71dbc91ce02cfb1b5bc708006bd89a6524","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":"1f692d37e33a5da9be04bcf91988ca519a75c2d5d32731b9a253594a903c0029","dependsOn":["build_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":"7474894868b39fc88b8232d213963ec9f3dc9ff0a3955bc86793ba3445acded3","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":"d94790387a8079936735a403f2b53fc0b3ea965176601f268fd286c5124cfebd","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":"07729b34454a4c62441cdcbcc6b33dc5434b9a9fec5dfd334c35c1b35c2fbf99","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6b8d2c2ebd3301cff2be8edb1e1cc6ba65c858c02fe7247be81722b969842265","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"3dc139943e0e655cbdf9e33103f53409f00041ef7affdc72a7c889847115f2bc","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"d334ec4e4b56b12f725e7d10ffccf92d570e9108e4a676591f5b42e8b18a8742","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: seal (SEAL).\nToken name: seal\nToken symbol: SEAL\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.","parentJobId":null,"planHash":"e51eb7f2d038a7468c331de18dda5a7101d8f3815d45510614fc6d64a27dbead","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"8960e9c3-9bdc-4d25-b9d8-8bab43f494a8","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1623-seal"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51423","feedbackHash":"2930a9966d5ec40b8ab0ebeb39def66d39c349330bf33fabced5ecf0a539b64c","nodeKey":"audit_economics","submissionHash":"3919a3b454d36531e174ffc289d8390f541584b93c6423517e6ec97dd47d3ee2","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51511","feedbackHash":"cb3f1e5c07482f171afcc3fd13c69c8c7960e840e2a4bbfc98d9ef2d91f56c0b","nodeKey":"audit_flow","submissionHash":"b2b229a00760017833bfd89afc621a71dbc91ce02cfb1b5bc708006bd89a6524","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52250","feedbackHash":"6e4731c0ebd7b10bbd4b4046a225f5ed742bcac52560ba762dac3c53fc807762","nodeKey":"audit_judge","submissionHash":"1f692d37e33a5da9be04bcf91988ca519a75c2d5d32731b9a253594a903c0029","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51216","feedbackHash":"9431d7b51366ee22386798ac57c3a0f8c08e2681d82aba3f40ef061cc4bff389","nodeKey":"audit_math","submissionHash":"7474894868b39fc88b8232d213963ec9f3dc9ff0a3955bc86793ba3445acded3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52679","feedbackHash":"9aad6459477456fef42fd8deebc2f5fabfc22caee7e2f23be41ffb7a2c28f583","nodeKey":"audit_permissions","submissionHash":"d94790387a8079936735a403f2b53fc0b3ea965176601f268fd286c5124cfebd","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52665","feedbackHash":"124c429e1156c57980a808e802c6de02da802833027d4453cac4147ffea881e6","nodeKey":"build_contract_project","submissionHash":"07729b34454a4c62441cdcbcc6b33dc5434b9a9fec5dfd334c35c1b35c2fbf99","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51417","feedbackHash":"6536b39cb94cbacc7fedb11e8cef6da111ea30458e9ee8bade19bdaf36e71c6e","nodeKey":"manifest","submissionHash":"3dc139943e0e655cbdf9e33103f53409f00041ef7affdc72a7c889847115f2bc","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52668","feedbackHash":"96fc09d041d1fbbdcd02b4a01fd764ae4ec8e06237de6ff8921f008feb94e99d","nodeKey":"write_foundry_tests","submissionHash":"d334ec4e4b56b12f725e7d10ffccf92d570e9108e4a676591f5b42e8b18a8742","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"861d7bbe78be737612b14a2f965f0736b4594f5ab69ba6187d26eaa72cbb1d40","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"96902107cffcaa5aeebd78b7a489686a211c4e4febe0d03426aac993d801c688","device":"0ef0cddb99617930","findings":[],"hash":"07729b34454a4c62441cdcbcc6b33dc5434b9a9fec5dfd334c35c1b35c2fbf99","nodeId":"3b373742-9fd8-401d-b366-f9def0b6d170","outcome":"completed","summary":"The seal (SEAL) token project is complete, verified, and committed on main.\n\n**What was delivered**\n\n- `src/SealToken.sol` is a fixed-supply ERC-20 built on OpenZeppelin v5.4.0. The constructor takes no arguments and mints 1,000,000,000 SEAL with 18 decimals once to the deployer. There is no owner, mint, burnFrom, pause, blacklist or transfer tax, so every launch flow moves exact amounts.\n- `test/SealToken.t.sol` holds 26 tests covering metadata, the single mint event, absence of mint and privileged selectors, exact transfers, approvals, every documented revert, the launch-style distributor and remainder flows, a bytecode scan for DELEGATECALL, CALLCODE and SELFDESTRUCT, and three fuzz tests. Tests read no environment variables and do not depend on the caller.\n- `script/DeploySealToken.s.sol` exposes a `deploy()` function the tests call directly. Its `run()` reads nothing from the environment.\n- `foundry.toml` pins solc 0.8.26, sets `bytecode_hash = \"none\"`, keeps ffi off and grants no filesystem permissions.\n- `README.md` documents assumptions, the manifest values for the launch step, the \"after launch\" section (nothing to configure), and operational responsibilities.\n- `lib/` vendors forge-std and the ERC20 subset of OpenZeppelin as plain files with their licences. No submodules or git metadata remain.\n\n**Verification**\n\nA clean offline rebuild passed `forge build`, `forge test` with 26 of 26 passing, and `forge fmt --check`. The protected harness test imports its own v4-core and LaunchLiquidity sources, so it was not run locally, but my tests mirror its supply, decimals, privileged-call and bytecode checks.\n\n**Open items for the launch**\n\nThe manifest step fills `token.contract` as `SealToken`, `constructorArgs` as empty, and `totalSupply` as 1000000000000000000000000000. Explorer verification and the independent adversarial review belong to the launch and its reviewers.","treeHash":"9ef05b8476231cc3d895dd00a2f39fbb361f0807","usage":{"cachedInputTokens":490182,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":15738,"runtime":"claude","turns":20,"wallClockMs":191660}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fc87c05048aca47d","findings":[{"citation":"resolved","description":"SealToken inherits OpenZeppelin Contracts v5.4.0 ERC20 unchanged (the five vendored files under lib/openzeppelin-contracts/ are sha256-identical to the v5.4.0 tag) and adds no increaseAllowance/decreaseAllowance or permit. approve(spender, value) in lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol line 120 writes the allowance absolutely (`_allowances[owner][spender] = value;`, line 280) with no compare-and-set, so a spender who sees a pending approve that lowers their allowance can front-run it with transferFrom for the old amount and then spend the new one. This is the well-known ERC-20 design property, not a defect specific to this code: the brief asks for a plain fixed-supply token, the launch flows (factory -> distributor -> claimants, PoolManager seed, swaps each way) never change an allowance, and the vendored lib/ must not be edited. Two specialists (audit_economics, audit_flow) reported the same root cause at info; they are merged here. It is kept only as the trust assumption holders should know: to lower a non-zero allowance to an untrusted spender, set it to zero first and wait for inclusion. The README's Behaviour section says nothing about allowances; a sentence there is the only change worth considering. No launch floor check depends on it.","line":13,"path":"src/SealToken.sol","reproduction":"Reproduced with a Foundry test (test_approveRace, passes on the current code, showing the property). State: a factory contract deploys SealToken with CREATE2 and transfers 1000e18 SEAL to ALICE. 1) prank(ALICE) token.approve(BOB, 100e18). 2) prank(BOB) token.transferFrom(ALICE, BOB, 100e18) -> true, allowance(ALICE,BOB) == 0. 3) prank(ALICE) token.approve(BOB, 50e18) (the lowering tx, mined after BOB's front-run) -> allowance == 50e18. 4) prank(BOB) token.transferFrom(ALICE, BOB, 50e18) -> true. Expected by ALICE: BOB moves at most 100e18 (old) or 50e18 (new). Actual: balanceOf(BOB) == 150e18, balanceOf(ALICE) == 850e18. Standard-conformant behaviour; holder-level mitigation (approve 0 first) works.","severity":"info","snippet":"contract SealToken is ERC20 {","title":"approve() carries the standard ERC-20 allowance race: a spender can realise old + new allowance when a holder lowers it (merged from audit_economics and audit_flow; documentation only, no code change "}],"hash":"1f692d37e33a5da9be04bcf91988ca519a75c2d5d32731b9a253594a903c0029","nodeId":"2e5ceb98-b756-45a5-82f7-3f269c314660","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written. No tracked file was changed, and the scratch tests were removed.\n\n**Outcome:** the SEAL token has no defect. It is OpenZeppelin v5.4.0 ERC20 unchanged, with an argument-less constructor that mints the manifest supply to the deployer.\n\n**Specialist findings, settled**\n- **Allowance race (audit_economics and audit_flow, both info).** Same root cause, merged into one info finding. I reproduced it in a Foundry test: after approve 100e18, a front-run transferFrom, approve 50e18, and a second transferFrom, Bob holds 150e18. It is an inherent ERC-20 property, not a defect in this code, so the finding states that no code change is needed and only a README note is worth considering.\n- **DECIMALS not coupled to decimals() (audit_flow, info).** Dropped. The specialist admitted no failing input exists on the current source. Both values are 18 and match the manifest. Recorded as a passing invariant row instead.\n- **Aderyn large-numeric-literal lead.** Dropped. The literal is underscore-separated and its product is the verified supply.\n\n**My own checks, all holding**\n- The three entry points: traced revert paths, exact amount movement, infinite and finite allowance handling, zero-value and self transfers.\n- CREATE2 deployment from a factory contract mints the whole supply to the factory. Launch flows arrive whole.\n- Bytecode scan with the protected test's logic: no DELEGATECALL, CALLCODE or SELFDESTRUCT. Sizes are well under both limits.\n- The five vendored OpenZeppelin files are sha256-identical to the upstream v5.4.0 tag.\n- launch.json uses only schema keys, with constructor arguments, supply, decimals and address casing all consistent with the code.\n- The existing 53 project tests pass, including invariants.\n\nThe protected test itself could not run here because it imports the verifier's v4-core tree, so I read it and confirmed by reasoning and a scratch test that each of its assertions holds for this token.","treeHash":null,"usage":{"cachedInputTokens":545526,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":10223,"runtime":"claude","turns":11,"wallClockMs":194693}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"56e50117311155be","findings":[{"citation":"resolved","description":"SealToken inherits OpenZeppelin v5.4.0 ERC20 unchanged (vendored files are byte-identical to upstream v5.4.0, verified by sha256). Its approve(spender, value) overwrites the allowance with no compare-and-set and the contract adds no increaseAllowance/decreaseAllowance or permit. This is the well-known ERC-20 allowance race, inherent to the standard and consistent with the brief for a plain token with no transfer rules, so it is NOT a defect to fix. It is recorded here because it is the only path in this contract by which a holder can lose more SEAL than they intended, and the Economic Security guide asks that every ERC-compliance gap be stated with its concrete input. Trust assumption to document for holders: never lower a non-zero allowance to a spender you do not trust without first setting it to zero and waiting for inclusion.","line":13,"path":"src/SealToken.sol","reproduction":"State: factory sends 150e18 SEAL to ALICE. 1) ALICE calls approve(BOB, 100e18). 2) ALICE later submits approve(BOB, 50e18) intending BOB's total spend to be at most 100e18. 3) BOB sees the pending tx and front-runs with transferFrom(ALICE, BOB, 100e18) -> succeeds, allowance now 0. 4) ALICE's approve(BOB, 50e18) mines, allowance = 50e18. 5) BOB calls transferFrom(ALICE, BOB, 50e18) -> succeeds. Expected by ALICE: BOB spends at most 100e18 total. Actual: BOB received 150e18, ALICE balance 0. Mitigation at the holder level (approve 0 first) works; no contract change is required for a plain ERC-20.","severity":"info","snippet":"contract SealToken is ERC20 {","title":"approve() carries the standard ERC-20 allowance race: a spender can spend old + new allowance when a holder lowers it"}],"hash":"3919a3b454d36531e174ffc289d8390f541584b93c6423517e6ec97dd47d3ee2","nodeId":"a3f84af2-b97f-445e-b4ed-ad5106084361","outcome":"completed","summary":"The review is complete. The findings file is valid JSON, the quoted snippet matches line 13 of the source, and the working tree is clean apart from the gitignored scratch test.\n\n**Outcome: no defects in the economics, invariants or launch flows of SealToken.** The file `.imd-findings.json` holds one informational note and eleven coverage rows, all three listed entry points answered.\n\n**What I checked**\n\n- **Library integrity.** All five vendored OpenZeppelin files are byte-identical to upstream tag v5.4.0, verified by fetching and comparing hashes. The token overrides nothing, so every transfer, approval and revert path is stock ERC-20.\n- **Invariants.** A scratch Foundry invariant run of 128,000 calls across six actors, including the factory and a dead address, held both conservation laws: total supply fixed at 1e27, and sum of balances equal to supply. Allowance accounting was asserted exact on every call, with infinite allowance untouched.\n- **Flow gaps.** The launch flows were replayed with the job's economics: 10% to the distributor, 88% to the pool, 2% to the remainder address, then 1 wei claims and 1 wei swaps each way. Every hop moved exactly the requested amount. There is no tax, burn, exemption list, callback or external dependency that could make a flow arrive short.\n- **Supply growth.** The compiled ABI exposes only nine ERC-20 functions plus three constant getters. Every PUSH4 constant in the 2078-byte runtime maps to one of those selectors, the 1e9 literal, or the six custom-error selectors. No mint, owner, initializer, upgrade, DELEGATECALL, CALLCODE or SELFDESTRUCT exists.\n- **Economic surface.** No oracle, fee formula, share math, payable path or sentinel-address special case exists to manipulate. Zero-address sender, receiver, spender and approver all revert as the standard specifies.\n\n**The one note recorded** is the inherent ERC-20 allowance race on approve, severity info. It is a property of the standard the brief asked for, not a code defect, and is documented with a concrete sequence so holders know to zero an allowance before lowering it.\n\n**Not reached:** the protected harness test itself cannot run here because v4-core is not vendored, so the real PoolManager swap was simulated with plain transfers rather than executed. Given the token has no transfer hooks, that does not change the conclusion.","treeHash":null,"usage":{"cachedInputTokens":666445,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":15129,"runtime":"claude","turns":22,"wallClockMs":226498}},{"artifacts":[],"attempt":1,"bundleHash":"042a3fcedb89f84b4fa84b09e0853bfa399977db6cf675974b19bc186b8d5827","device":"163f8bc7d28274e2","findings":[],"hash":"3dc139943e0e655cbdf9e33103f53409f00041ef7affdc72a7c889847115f2bc","nodeId":"005c2b5c-7047-40fc-9363-6400b562a8a0","outcome":"completed","summary":"Created [launch.json](/home/seat19/.identitymd/work/8960e9c3-9bdc-4d25-b9d8-8bab43f494a8/005c2b5c-7047-40fc-9363-6400b562a8a0/launch.json) with the exact supply, economics, pool settings, and constructor arguments.\n\nOffline build and all 26 tests passed, including expanded fuzz testing. Slither found no high or medium issues. Only `launch.json` was added.","treeHash":"902f1c51d65f8d6c0a15dec8579184ead010aabe","usage":{"cachedInputTokens":242816,"inputTokens":28592,"model":"gpt-6-astra","outputTokens":3173,"runtime":"codex","turns":4,"wallClockMs":112714}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa2b7fcb5f53535a","findings":[],"hash":"7474894868b39fc88b8232d213963ec9f3dc9ff0a3955bc86793ba3445acded3","nodeId":"c3db1056-e569-4b1f-9fef-dd7e5dd01050","outcome":"completed","summary":"The review is complete. No defects were found in the Math Precision, Boundary or Numerical Gap areas, and the findings file records an empty list with nine coverage rows.\n\n**What was checked**\n\n- **Math.** The token contains one arithmetic expression, the compile-time constant for the supply. It evaluates to exactly 1e27 and matches the manifest string, with a widening cast and no overflow, division or rounding anywhere in the requester's code. OpenZeppelin's unchecked balance updates are bounded by that supply.\n- **Boundaries.** The runtime has no call-family opcodes, no payable, fallback or receive, and no bytes decoding. The only sentinel branches are the library's zero-address reverts. Scratch tests exercised max-uint transfers, self-transfer of the whole supply, transferFrom with sender equal to receiver, zero amounts with zero allowance, and allowance of max minus one versus max.\n- **Numerical seams.** A 256-run fuzz and a Foundry invariant run of about 128,000 handler calls across approve, transfer and transferFrom kept the sum of balances equal to a constant total supply with nothing at the zero address.\n- **Dependencies and tools.** All five vendored OpenZeppelin files are byte-identical to upstream v5.4.0. The compiled ABI exposes only the standard ERC-20 surface plus three view constants. Slither reported only pragma and solc-version informationals on library files, and Aderyn only the large-numeric-literal note, which is already written with underscores.\n\n**Commands run**\n\n```\nforge build                      # success\nforge test                       # 26 passed, 0 failed\nforge test --match-path test/scratch/Boundary.t.sol    # 10 passed\nforge test --match-path test/scratch/Invariant.t.sol   # 1 passed\nslither src/SealToken.sol        # 5 informational results, none at low or above\naderyn --src src                 # 1 low: large numeric literal\n```\n\n**Not reached or noted**\n\n- No launch.json exists in the tree, so manifest fields could not be reviewed. The README's stated deployment parameters are consistent with the constructor and supply.\n- The DECIMALS constant does not drive the inherited decimals function. Both are 18 today, so this is a maintenance note recorded in coverage, not a finding.\n\nScratch tests were removed and the working tree is clean apart from the ignored findings file. Passing tests and clean analyzer output are not proof that no defect exists.","treeHash":null,"usage":{"cachedInputTokens":641422,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":13260,"runtime":"claude","turns":25,"wallClockMs":210859}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fbcdfc017217af1f","findings":[{"citation":"resolved","description":"SealToken inherits OpenZeppelin v5.4.0 ERC20 unchanged (vendored copy verified byte-for-byte against the v5.4.0 tag) and adds no allowance helpers, so approve() overwrites the allowance absolutely. A spender who sees an owner's pending approve(spender, newValue) can spend the old allowance first and then the new one, realising old + new. This is the well-known ERC-20 design property, not a defect specific to this code, and the launch flows (factory -> distributor -> claimants, PoolManager seed and swaps) do not depend on allowance changes. It is reported at info level only so the author can decide whether to document it in the README's Behaviour section (which currently says nothing about allowances) or to add a Permit/increase-decrease pattern; no code change is required for the launch floor, and the vendored lib/ must not be edited.","line":280,"path":"lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol","reproduction":"State: factory sent Alice 1000e18 SEAL; Alice called approve(Bob, 100e18). Sequence: (1) Alice broadcasts approve(Bob, 50e18) intending to lower Bob's allowance. (2) Bob front-runs with transferFrom(Alice, Bob, 100e18): succeeds, allowance 0. (3) Alice's approve(Bob, 50e18) lands: allowance 50e18. (4) Bob calls transferFrom(Alice, Bob, 50e18): succeeds. Expected by Alice: Bob can move at most 100e18 (old) or 50e18 (new). Actual: Bob moved 150e18. Verified with a Foundry test (test_approveRace in a scratch file: balanceOf(Bob) == 150e18 after the sequence).","severity":"info","snippet":"        _allowances[owner][spender] = value;","title":"approve() carries the standard ERC-20 allowance front-running race (standard-conformant, undocumented)"},{"citation":"resolved","description":"SealToken declares a public constant DECIMALS = 18 and derives TOTAL_SUPPLY from it (line 27), but does not override decimals(); the inherited OpenZeppelin ERC20.decimals() returns the hard-coded literal 18 (ERC20.sol line 78). There is no coupling between the two values. Today they agree, and the manifest's token.decimals of 18 matches both, so no launch check fails. The latent defect is that a future edit to DECIMALS (for example to 6) would silently change TOTAL_SUPPLY while decimals() keeps returning 18, so the protected check test_decimalsMatchTheManifest and the minted supply would disagree with the manifest. A one-line override, `function decimals() public pure override returns (uint8) { return DECIMALS; }`, makes the constant the single source of truth. Informational: no concrete failing input exists in the current source.","line":21,"path":"src/SealToken.sol","reproduction":"Current state: token.decimals() == 18 and token.DECIMALS() == 18 (test_decimalsCoupling passes). Failing state is hypothetical: change line 21 to `uint8 public constant DECIMALS = 6;`, rebuild, deploy; then token.decimals() still returns 18 while TOTAL_SUPPLY() returns 1_000_000_000 * 10**6 = 1e15, so totalSupply() (1e15) disagrees with a manifest written from decimals() (expects 1e27). Expected: changing the declared decimals constant changes both consistently or fails to compile.","severity":"info","snippet":"    uint8 public constant DECIMALS = 18;","title":"DECIMALS constant is not what decimals() returns; the two agree only because both are the literal 18"}],"hash":"b2b229a00760017833bfd89afc621a71dbc91ce02cfb1b5bc708006bd89a6524","nodeId":"756ee208-c99e-4734-975b-b221c34c72d2","outcome":"completed","summary":"The review is complete and the findings file is written. The working tree is clean apart from the findings file itself, and the scratch tests are removed.\n\n**Outcome: no defects above informational.** The token is a plain OpenZeppelin v5.4.0 ERC20 with a single constructor mint of 1e27 units to the deployer, and every path I traced in the Execution Trace, Periphery and First Principles areas behaves as intended.\n\nWhat I verified:\n- **Entry points.** All three state-changing functions trace cleanly through the inherited code. Zero-address receiver and spender revert, balances are checked before writes, self-transfers conserve balance, infinite allowance is not decremented, and the factory cannot pull from a holder without approval.\n- **Periphery.** The vendored OpenZeppelin files and LICENSE are byte-identical to the upstream v5.4.0 tag. The compiled runtime contains no CALL, DELEGATECALL, CALLCODE, CREATE, CREATE2 or SELFDESTRUCT opcodes, and the ABI exposes no mint, burn, owner, pause or blacklist surface.\n- **Launch floor.** With no transfer override there is no fee, burn or exemption logic, so the distributor funding, claims, seed and swap flows move exact amounts. The protected harness itself could not be run here because its v4-core and LaunchLiquidity dependencies are not in the tree, so the swap path is reasoned rather than executed.\n- **Tests and leads.** The repository's 26 tests pass, plus 8 scratch edge-case tests I wrote and then deleted. The static-analysis large-literal lead at line 24 is benign.\n\nTwo informational notes are recorded in `.imd-findings.json`:\n1. The standard ERC-20 approve front-running race, reproduced concretely, reported so the author can decide whether to document it.\n2. The public `DECIMALS` constant is not wired to `decimals()`, so the two agree only because both are the literal 18. No current input fails.\n\nThe coverage record has 8 rows: all three entry points plus five invariant and periphery rows, none marked unreached.","treeHash":null,"usage":{"cachedInputTokens":632738,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":14763,"runtime":"claude","turns":29,"wallClockMs":211967}},{"artifacts":[],"attempt":1,"bundleHash":"bcb4b211cb248f7950ecfdc33d0fad0fce6b3a5dec25885261147819c0714f1f","device":"ba7dd2832066bc23","findings":[],"hash":"d334ec4e4b56b12f725e7d10ffccf92d570e9108e4a676591f5b42e8b18a8742","nodeId":"779bf763-d2a9-47eb-9a0e-b51281df92e7","outcome":"completed","summary":"Added failure-path, boundary, fuzz, and four-actor invariant tests under `test/`.\n\nOffline `forge build` and `forge test` pass: 53 tests, zero failures. Invariants exercised 32,768 calls; new fuzz properties ran 1,000 cases each.\n\nNo confirmed defects found. All changes are confined to `test/`.","treeHash":"bba15fc3f7116b37775f11e3998c69ee36ea118a","usage":{"cachedInputTokens":814080,"inputTokens":75894,"model":"gpt-6-astra","outputTokens":16072,"runtime":"codex","turns":5,"wallClockMs":507013}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"9812c5faf226f7c7","findings":[],"hash":"d94790387a8079936735a403f2b53fc0b3ea965176601f268fd286c5124cfebd","nodeId":"d8b9f751-dbdd-4d72-981a-4bd7d34ca67f","outcome":"completed","summary":"The review is complete. The findings file is written and the working tree has no other changes.\n\n**Result: no defects found.** The token is an unmodified OpenZeppelin v5.4.0 ERC-20 with a single constructor mint, and every failure mode in the Access Control, Trust Gap and Asymmetry guides was checked against it without a reachable failing input.\n\nWhat I verified:\n\n- **Access control.** The compiled ABI has exactly three state-changing entry points: approve, transfer and transferFrom. There is no owner, minter, pause, blacklist, initializer, receive or fallback. The internal mint and burn helpers have no caller after construction. The deployer cannot pull one wei from a holder without an allowance.\n- **Vendored library integrity.** All five vendored OpenZeppelin files hash-match upstream v5.4.0 byte for byte, so there is no hidden backdoor in the sender resolution or transfer path.\n- **Asymmetry.** Transfer and transferFrom share one transfer path. Allowance is decremented exactly and infinite allowance is preserved. A reverted pull leaves both allowance and balance intact. Self-transfer leaves the balance unchanged.\n- **Trust gap.** No privileged actor exists after deployment, so there is no access-times-economics seam. The factory holding the whole supply at construction is the launch design, documented as a trust assumption.\n- **Launch floor.** Supply is exactly one billion tokens at 18 decimals minted to msg.sender, confirmed through a CREATE2 deployer. The runtime bytecode contains no CALL, DELEGATECALL, CALLCODE, SELFDESTRUCT or CREATE opcodes.\n- **Invariant fuzzing.** A scratch Foundry invariant run of 128,000 calls across six actors kept total supply constant and equal to the sum of balances with zero reverts. The scratch test was removed afterwards.\n\nThe static-analysis lead about the large numeric literal is a compile-time constant equal to 1e27 and is a style note only.\n\nOne non-defect observation for the author: the contract declares a public DECIMALS constant used to compute the supply, while decimals() returns the inherited hardcoded 18. The two agree today, but they are two sources of truth and would silently diverge if someone changed one without the other.\n\nThe findings file at the repository root holds an empty findings list and ten coverage rows: one per listed entry point plus the constructor, the invariants I checked, the vendored-library check and the static-analysis lead. All existing project tests pass.","treeHash":null,"usage":{"cachedInputTokens":710123,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":13943,"runtime":"claude","turns":28,"wallClockMs":211928}}],"verification":[{"checks":[{"durationMs":2326,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.04s\nCompiler run successful!\n","passed":true},{"durationMs":235,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/SealToken.t.sol:SealTokenTest\n[PASS] testFuzz_cannotTransferMoreThanHeld(uint256,uint256) (runs: 256, μ: 91359, ~: 92417)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 93333, ~: 93489)\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 105895, ~: 87910)\n[PASS] test_RevertWhen_approveZeroSpender() (gas: 30794)\n[PASS] test_RevertWhen_transferExceedsBalance() (gas: 90682)\n[PASS] test_RevertWhen_transferFromEmptyAccount() (gas: 33243)\n[PASS] test_RevertWhen_transferFromExceedsAllowance() (gas: 138035)\n[PASS] test_RevertWhen_transferFromExceedsBalanceDespiteAllowance() (gas: 143677)\n[PASS] test_RevertWhen_transferFromWithoutApproval() (gas: 90789)\n[PASS] test_RevertWhen_transferToZeroAddress() (gas: 88192)\n[PASS] test_approveAndTransferFrom() (gas: 201256)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 87773)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 210432)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 35760)\n[PASS] test_deployScriptMintsToCaller() (gas: 1469828)\n[PASS] test_deployerCannotPullFromHolderWithoutApproval() (gas: 95393)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 165533)\n[PASS] test_launchStyleFlowsMoveExactAmounts() (gas: 215670)\n[PASS] test_nameSymbolDecimals() (gas: 34644)\n[PASS] test_noMintFunctionExists() (gas: 250210)\n[PASS] test_noPrivilegedControlsExist() (gas: 362315)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 874950)\n[PASS] test_transferMovesExactAmount() (gas: 87374)\n[PASS] test_transferOfZeroSucceeds() (gas: 39993)\n[PASS] test_transferToSelfKeepsBalance() (gas: 95369)\n[PASS] test_transferWholeBalanceLeavesZero() (gas: 122811)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 27.95ms (80.29ms CPU time)\n\nRan 1 test suite in 29.24ms (27.95ms CPU time): 26 tests passed, 0 failed, 0 skipped (26 total tests)\n","passed":true},{"durationMs":114,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SealToken.approve(address,uint256)\",\"SealToken.transfer(address,uint256)\",\"SealToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":99,\"foundry.toml\":22,\"remappings.txt\":2,\"script/DeploySealToken.s.sol\":24,\"src/SealToken.sol\":33,\"test/SealToken.t.sol\":329},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":1113,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":410,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/SealToken.sol:24: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"07729b34454a4c62441cdcbcc6b33dc5434b9a9fec5dfd334c35c1b35c2fbf99","verifiedTreeHash":"9ef05b8476231cc3d895dd00a2f39fbb361f0807","verifierVersion":"0.1.0+172610c0"},{"checks":[{"durationMs":2283,"exitCode":0,"name":"build","output":"Compiling 28 files with Solc 0.8.26\nSolc 0.8.26 finished in 2.00s\nCompiler run successful!\n","passed":true},{"durationMs":218,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 26 tests for test/SealToken.t.sol:SealTokenTest\n[PASS] testFuzz_cannotTransferMoreThanHeld(uint256,uint256) (runs: 256, μ: 91865, ~: 92511)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 93111, ~: 93489)\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 110075, ~: 131423)\n[PASS] test_RevertWhen_approveZeroSpender() (gas: 30794)\n[PASS] test_RevertWhen_transferExceedsBalance() (gas: 90682)\n[PASS] test_RevertWhen_transferFromEmptyAccount() (gas: 33243)\n[PASS] test_RevertWhen_transferFromExceedsAllowance() (gas: 138035)\n[PASS] test_RevertWhen_transferFromExceedsBalanceDespiteAllowance() (gas: 143677)\n[PASS] test_RevertWhen_transferFromWithoutApproval() (gas: 90789)\n[PASS] test_RevertWhen_transferToZeroAddress() (gas: 88192)\n[PASS] test_approveAndTransferFrom() (gas: 201256)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 87773)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 210432)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 35760)\n[PASS] test_deployScriptMintsToCaller() (gas: 1469828)\n[PASS] test_deployerCannotPullFromHolderWithoutApproval() (gas: 95393)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 165533)\n[PASS] test_launchStyleFlowsMoveExactAmounts() (gas: 215670)\n[PASS] test_nameSymbolDecimals() (gas: 34644)\n[PASS] test_noMintFunctionExists() (gas: 250210)\n[PASS] test_noPrivilegedControlsExist() (gas: 362315)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 874950)\n[PASS] test_transferMovesExactAmount() (gas: 87374)\n[PASS] test_transferOfZeroSucceeds() (gas: 39993)\n[PASS] test_transferToSelfKeepsBalance() (gas: 95369)\n[PASS] test_transferWholeBalanceLeavesZero() (gas: 122811)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 17.13ms (77.52ms CPU time)\n\nRan 1 test suite in 18.47ms (17.13ms CPU time): 26 tests passed, 0 failed, 0 skipped (26 total tests)\n","passed":true},{"durationMs":117,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SealToken.approve(address,uint256)\",\"SealToken.transfer(address,uint256)\",\"SealToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":99,\"foundry.toml\":22,\"launch.json\":24,\"remappings.txt\":2,\"script/DeploySealToken.s.sol\":24,\"src/SealToken.sol\":33,\"test/SealToken.t.sol\":329},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"3dc139943e0e655cbdf9e33103f53409f00041ef7affdc72a7c889847115f2bc","verifiedTreeHash":"902f1c51d65f8d6c0a15dec8579184ead010aabe","verifierVersion":"0.1.0+172610c0"},{"checks":[{"durationMs":1976,"exitCode":0,"name":"build","output":"Compiling 31 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.85s\nCompiler run successful!\n","passed":true},{"durationMs":13421,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 25 tests for test/SealToken.EdgeCases.t.sol:SealTokenEdgeCasesTest\n[PASS] testFuzz_approvalOfZeroSpenderIsAtomic(uint256) (runs: 1000, μ: 145932, ~: 145882)\n[PASS] testFuzz_approvalOverwritesAndIsIdempotent(uint256,uint256) (runs: 1000, μ: 186957, ~: 187038)\n[PASS] testFuzz_constructorMintsToItsImmediateDeployer(address) (runs: 1000, μ: 40289, ~: 40282)\n[PASS] testFuzz_failedTransferFromRestoresFiniteAllowance(uint256,uint256,uint256) (runs: 1000, μ: 187485, ~: 187615)\n[PASS] testFuzz_finiteAllowanceLimitsCumulativeSpending(uint256,uint256,uint256) (runs: 1000, μ: 284662, ~: 288419)\n[PASS] testFuzz_revocationStopsPreviouslyApprovedSpender(uint256,uint256) (runs: 1000, μ: 170351, ~: 170202)\n[PASS] testFuzz_transferFromToZeroRestoresAllowance(uint256,bool) (runs: 1000, μ: 141428, ~: 140708)\n[PASS] testFuzz_transferToZeroIsAtomic(uint256) (runs: 1000, μ: 79323, ~: 79053)\n[PASS] test_approvalBelongsToOneOwnerAndOneSpender() (gas: 221956)\n[PASS] test_create2MintsToFactoryNotOriginOrCaller() (gas: 223122)\n[PASS] test_delegatedSelfTransferConsumesAllowanceButPreservesBalance() (gas: 144061)\n[PASS] test_directTransfersLeaveApprovalsUntouched() (gas: 188178)\n[PASS] test_finiteAllowanceCannotBeReused() (gas: 195092)\n[PASS] test_infiniteAllowanceCanBeRevokedAfterUse() (gas: 203102)\n[PASS] test_largestFiniteAllowanceDecrements() (gas: 146113)\n[PASS] test_maximumDelegatedTransferRevertsAndKeepsInfiniteAllowance() (gas: 144729)\n[PASS] test_ownerUsingTransferFromStillNeedsApproval() (gas: 211900)\n[PASS] test_selfTransferStillRequiresEnoughBalance() (gas: 107467)\n[PASS] test_spenderCanBeTheRecipient() (gas: 134125)\n[PASS] test_transferBoundaryAmountsAndRoundTrips() (gas: 559439)\n[PASS] test_transferMaximumUintRevertsWithoutChangingBalances() (gas: 83862)\n[PASS] test_zeroApprovalOfZeroSpenderStillReverts() (gas: 86606)\n[PASS] test_zeroTransferFromNeedsNoAllowanceAndEmitsTransfer() (gas: 114557)\n[PASS] test_zeroTransferFromZeroOwnerIsRejected() (gas: 93832)\n[PASS] test_zeroTransferToZeroAddressStillReverts() (gas: 119545)\nSuite result: ok. 25 passed; 0 failed; 0 skipped; finished in 72.50ms (552.62ms CPU time)\n\nRan 26 tests for test/SealToken.t.sol:SealTokenTest\n[PASS] testFuzz_cannotTransferMoreThanHeld(uint256,uint256) (runs: 256, μ: 91848, ~: 92416)\n[PASS] testFuzz_transferConservesSupply(address,uint256) (runs: 256, μ: 93508, ~: 93507)\n[PASS] testFuzz_transferFromRespectsAllowance(uint256,uint256) (runs: 256, μ: 107554, ~: 87910)\n[PASS] test_RevertWhen_approveZeroSpender() (gas: 30794)\n[PASS] test_RevertWhen_transferExceedsBalance() (gas: 90682)\n[PASS] test_RevertWhen_transferFromEmptyAccount() (gas: 33243)\n[PASS] test_RevertWhen_transferFromExceedsAllowance() (gas: 138035)\n[PASS] test_RevertWhen_transferFromExceedsBalanceDespiteAllowance() (gas: 143677)\n[PASS] test_RevertWhen_transferFromWithoutApproval() (gas: 90789)\n[PASS] test_RevertWhen_transferToZeroAddress() (gas: 88192)\n[PASS] test_approveAndTransferFrom() (gas: 201256)\n[PASS] test_approveOverwritesPreviousAllowance() (gas: 87773)\n[PASS] test_constructorEmitsSingleMintTransfer() (gas: 210432)\n[PASS] test_constructorMintsWholeSupplyToDeployer() (gas: 35760)\n[PASS] test_deployScriptMintsToCaller() (gas: 1469828)\n[PASS] test_deployerCannotPullFromHolderWithoutApproval() (gas: 95393)\n[PASS] test_infiniteAllowanceIsNotDecremented() (gas: 165533)\n[PASS] test_launchStyleFlowsMoveExactAmounts() (gas: 215670)\n[PASS] test_nameSymbolDecimals() (gas: 34644)\n[PASS] test_noMintFunctionExists() (gas: 250210)\n[PASS] test_noPrivilegedControlsExist() (gas: 362315)\n[PASS] test_runtimeHasNoDelegatecallCallcodeOrSelfdestruct() (gas: 874950)\n[PASS] test_transferMovesExactAmount() (gas: 87374)\n[PASS] test_transferOfZeroSucceeds() (gas: 39993)\n[PASS] test_transferToSelfKeepsBalance() (gas: 95369)\n[PASS] test_transferWholeBalanceLeavesZero() (gas: 122811)\nSuite result: ok. 26 passed; 0 failed; 0 skipped; finished in 72.50ms (128.98ms CPU time)\n\nRan 2 tests for test/SealToken.Invariant.t.sol:SealTokenInvariantTest\n[PASS]\nSealTokenInvariantTest invariants:\n[PASS] invariant_allowancesMatchApprovalAndSpendingHistory\n[PASS] invariant_balancesMatchSuccessfulTransferHistory\n[PASS] invariant_supplyAndMetadataStayFixed\n SealTokenInvariantTest invariants (runs: 256, calls: 32768, reverts: 0)\n\n╭------------------+-----------------------+-------+---------+----------╮\n| Contract         | Selector              | Calls | Reverts | Discards |\n+=======================================================================+\n| SealTokenHandler | approveTokens         | 4076  | 0       | 0        |\n|------------------+-----------------------+-------+---------+----------|\n| SealTokenHandler | approveZeroSpender    | 4139  | 0       | 0        |\n|------------------+-----------------------+-------+---------+----------|\n| SealTokenHandler | spendAllowance        | 4132  | 0       | 0        |\n|------------------+-----------------------+-------+---------+----------|\n| SealTokenHandler | spendTooMuchAllowance | 3931  | 0       | 0        |\n|------------------+-----------------------+-------+---------+----------|\n| SealTokenHandler | spendTooMuchBalance   | 4048  | 0       | 0        |\n|------------------+-----------------------+-------+---------+----------|\n| SealTokenHandler | transferToZero        | 4219  | 0       | 0        |\n|------------------+-----------------------+-------+---------+----------|\n| SealTokenHandler | transferTokens        | 4132  | 0       | 0        |\n|------------------+-----------------------+-------+---------+----------|\n| SealTokenHandler | transferTooMuch       | 4091  | 0       | 0        |\n╰------------------+-----------------------+-------+---------+----------╯\n\n[PASS] test_handlerSequenceExercisesAccountingAndFailures() (gas: 1748060)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 13.33s (13.32s CPU time)\n\nRan 3 test suites in 13.33s (13.47s CPU time): 53 tests passed, 0 failed, 0 skipped (53 total tests)\n","passed":true},{"durationMs":38,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SealToken.approve(address,uint256)\",\"SealToken.transfer(address,uint256)\",\"SealToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":4,\"README.md\":99,\"foundry.toml\":22,\"remappings.txt\":2,\"script/DeploySealToken.s.sol\":24,\"src/SealToken.sol\":33,\"test/README.md\":39,\"test/SealToken.EdgeCases.t.sol\":389,\"test/SealToken.Invariant.t.sol\":98,\"test/SealToken.t.sol\":329,\"test/handlers/SealTokenHandler.sol\":185},\"excluded\":[\"lib/\",\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"d334ec4e4b56b12f725e7d10ffccf92d570e9108e4a676591f5b42e8b18a8742","verifiedTreeHash":"bba15fc3f7116b37775f11e3998c69ee36ea118a","verifierVersion":"0.1.0+172610c0"}]}