{"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":"d55414ea-9b60-4ef6-ad28-c27a26fa038c","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"69145579484970e2164c7f4b4226d3e8ac02ef90d748394c45275434db96473c","dependsOn":["token_logo","build_website","build_contract_project","write_foundry_tests","manifest"],"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":"69ae893b85776075ebefe81df6da9e48a2093e7e3c0e9d30ac884ee8beda21c4","dependsOn":["token_logo","build_website","build_contract_project","write_foundry_tests","manifest"],"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":"42a74b3af3b9019fdff9ca0035689f9f4b1ea79a9b4125d1b56d3d1b1806f392","dependsOn":["token_logo","build_website","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":"e07bcc08c8835c4ffd1e0f4f586b9cfd5b9aa9b1cda30bd28971ca911a90a634","dependsOn":["token_logo","build_website","build_contract_project","write_foundry_tests","manifest"],"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":"e6dc7e2ce1bf4b477f474004768b3508706b401d0a60781d10f14de463e8307d","dependsOn":["token_logo","build_website","build_contract_project","write_foundry_tests","manifest"],"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":"388db0ca91a9c8f9fcff54568ca317c45509da71aa0f3bc5ddc8d4a318f89f2b","dependsOn":["build_website"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"6e3e328aa196f6965a2821b098b101e9ff09eef55cdaafaec1d6ea18007b96f6","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"6e3e328aa196f6965a2821b098b101e9ff09eef55cdaafaec1d6ea18007b96f6","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"53960d7f77a286203c3c9b935e084fa300e14bb646ed9f0fdf3739d94d9a9e8a","dependsOn":["token_logo"],"execution":{"mustProduce":["dist/index.html"],"network":true,"optionalTools":["browser"],"profile":"foundry","requires":["network"],"skillHash":"6715a761ae197330be56ba3ef74f7628c405aa1d94f0e62b3dcf3715e0135cbc","skillId":"build-website","tools":[]},"key":"build_website","kind":"code","role":"implement","skillHash":"6715a761ae197330be56ba3ef74f7628c405aa1d94f0e62b3dcf3715e0135cbc","skillId":"build-website","state":"accepted"},{"acceptedSubmissionHash":"8c58b1d2ddc045eadac7c3d3310a345c118f98c73fdb7f31c6871ebd42099bd4","dependsOn":["token_logo","build_website","build_contract_project","write_foundry_tests"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"},{"acceptedSubmissionHash":"642ccebccb6e6c82e5e0c63e82559a21adfe60429815c009e43d0b8f9e53606b","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":["tool:image"],"skillHash":"9fa92c5200aa48ce2c9551714aaa720e895a50b88afa3346815752b923cb8378","skillId":"token-logo","tools":["image"]},"key":"token_logo","kind":"code","role":"implement","skillHash":"9fa92c5200aa48ce2c9551714aaa720e895a50b88afa3346815752b923cb8378","skillId":"token-logo","state":"accepted"},{"acceptedSubmissionHash":"1244fde38064bcad4345b8f8e18b9aa36ea08fc0c25e51d991ce59dc59502d6b","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":"[SIMD-LAUNCH]\nA custom token: Swarm Palace (SPALACE).\nToken name: Swarm Palace\nToken symbol: SPALACE\nToken supply: 1,000,000,000 with 18 decimals, all minted once to the deployer in the constructor.\nMinting after launch: none, the supply is fixed forever.\nTransfer rules: plain ERC-20 transfers with no fee, tax or limit.\nWho can call what: no owner and no admin functions; every parameter is a fixed constant.\n\nBuild requirements (mandatory):\n- Context: an ordinary, legitimate token launch on Ethereum. The coin's name, story and theme are branding only; nothing here is real-world harm or offensive security work.\n- A complete Foundry project at the repository root: foundry.toml with solc 0.8.26, evm_version cancun, optimizer on and bytecode_hash = \"none\", so the build is reproducible and verifiable: deployed contracts live in src/ and every import resolves to a committed file.\n- Token contract: SPALACEToken. No selfdestruct and no delegatecall anywhere. No proxies, no owner, no upgradeability.\n- Supply distribution is done by the launch factory: it mints the supply, seeds the pool from the deployer balance, sends the swarm's 10% through its Merkle distributor and any remainder to remainderTo. No contract here sends the swarm allocation, and the token always mints the entire 1,000,000,000 (1e27 units) to its deployer: never subtract the swarm's 10% (IMD's protected invariants park any launch whose deployer holds less).\n- Chain: Ethereum mainnet (set by the order, not a launch.json field). Swaps happen in Uniswap v4, so the pool's tokens move to and from the PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90.\n- launch.json top-level keys, exactly: kind (\"custom_token\"), token {contract, name, symbol, decimals, constructorArgs, totalSupply}, contracts ([] if none), pool, economics, notes (one string). No chainId or other keys.\n- launch.json pool: pairedCurrency 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, fee 12500, tickSpacing 60, initialPrice \"125270724187523965593206900\" (paired-currency minor units per SPALACE minor unit with SPALACE as currency0, provenance only; the deployer derives the real opening price from the economics using the deployed currency order). launch.json also carries the economics block below.\n- launch.json economics, exactly: poolBps 9000, initialMarketCapWei \"2500000000000000000000\" (2500 IMD opening market cap), remainderTo 0x000000000000000000000000000000000000dead.","parentJobId":null,"planHash":"1976014d5b2c4ea52a0db6410e1e516d82b02835a57ea394530353d116505a6f","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"d55414ea-9b60-4ef6-ad28-c27a26fa038c","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1210-swarm-palace"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50974","feedbackHash":"a38cd4e3f5a0e7eabcebb4623833fe3ca328aedbbb12f184ee226bb66fc80341","nodeKey":"audit_economics","submissionHash":"69145579484970e2164c7f4b4226d3e8ac02ef90d748394c45275434db96473c","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52548","feedbackHash":"68f0ab5590b7fdcd2ed584179def2afbc804824a7b1db029417cd907e0776074","nodeKey":"audit_flow","submissionHash":"69ae893b85776075ebefe81df6da9e48a2093e7e3c0e9d30ac884ee8beda21c4","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52189","feedbackHash":"b6e78963ad07a79f2163eb2a2441285f77cafdc7e721044e6bc7691e51dcd6fc","nodeKey":"audit_judge","submissionHash":"42a74b3af3b9019fdff9ca0035689f9f4b1ea79a9b4125d1b56d3d1b1806f392","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52205","feedbackHash":"3776606486c80b5a9fb75ff5d73e8cb277495db61c80c8a97e8b43abc4a05234","nodeKey":"audit_math","submissionHash":"e07bcc08c8835c4ffd1e0f4f586b9cfd5b9aa9b1cda30bd28971ca911a90a634","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52170","feedbackHash":"12f2d6eef81b3253af1b738573fca409dba2b7647c3367213215b66ee54290a1","nodeKey":"audit_permissions","submissionHash":"e6dc7e2ce1bf4b477f474004768b3508706b401d0a60781d10f14de463e8307d","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51752","feedbackHash":"c208fe67c0a20b44c34e68a834534e375d3d1d215a9799b94b380eac73282519","nodeKey":"build_contract_project","submissionHash":"388db0ca91a9c8f9fcff54568ca317c45509da71aa0f3bc5ddc8d4a318f89f2b","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51040","feedbackHash":"ea3fafad7341398a72e7688b43f70cdfd8e225ddc9e4841c9a855e845ded834b","nodeKey":"build_website","submissionHash":"53960d7f77a286203c3c9b935e084fa300e14bb646ed9f0fdf3739d94d9a9e8a","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51225","feedbackHash":"5eca43a76f3b4dfc3dbd748752a02290477422d6f9685d837f924ad32c19adbf","nodeKey":"manifest","submissionHash":"8c58b1d2ddc045eadac7c3d3310a345c118f98c73fdb7f31c6871ebd42099bd4","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51151","feedbackHash":"83d6f799c18156c78b9367572e468df7bb1b80a56ca47e9772436d1cf2dc5c38","nodeKey":"token_logo","submissionHash":"642ccebccb6e6c82e5e0c63e82559a21adfe60429815c009e43d0b8f9e53606b","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51620","feedbackHash":"c4c9c5a6b063abf1febd00d8a9e7a9177616cac54c290b3b33ec0d3a74927218","nodeKey":"write_foundry_tests","submissionHash":"1244fde38064bcad4345b8f8e18b9aa36ea08fc0c25e51d991ce59dc59502d6b","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"6384dd5cc3521466e01b1a1fb4ade112fd12204a5e67fef80210bdd6ceebf551","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"23eaa5d28ed932e4ac9edeaee09e77823cfb1def37f47b5cf207b62c1abd6d30","device":"7df8c87bdf5d7822","findings":[],"hash":"1244fde38064bcad4345b8f8e18b9aa36ea08fc0c25e51d991ce59dc59502d6b","nodeId":"a2733927-e59d-46b3-93b6-2ec19ef4b552","outcome":"completed","summary":"Implemented entirely under `test/`:\n\n- ERC-20 edge cases and failure paths.\n- Balance and allowance invariants.\n- Offline PoolManager swaps with fees in both currency orderings.\n- Vendored dependencies for offline verification.\n\n`forge build`, `forge test`, and the manifest checker pass: **51 tests passed, none failed or skipped**.\n\nNo token defects found. Live mainnet integration was not tested.","treeHash":"4ceaf1a93cc1dcc9a52796d335f75321c9881ec2","usage":{"cachedInputTokens":1461888,"inputTokens":97155,"model":"gpt-6-astra","outputTokens":27719,"runtime":"codex","turns":7,"wallClockMs":629681}},{"artifacts":[],"attempt":1,"bundleHash":"21f433d751206feefe386695a66ab1e417d600cff03b9756f7ca5f2c1ab6670b","device":"7143d892ed24d728","findings":[],"hash":"388db0ca91a9c8f9fcff54568ca317c45509da71aa0f3bc5ddc8d4a318f89f2b","nodeId":"a5a82c3a-6bf2-48c2-a047-9cbd313120d0","outcome":"completed","summary":"Completed using the existing compliant token, Foundry configuration, and exact launch manifest. Added two event smoke tests and clarified deployment responsibilities.\n\nVerified: `forge build`, all 23 tests, `forge fmt --check`, and manifest/ABI checks pass.\n\nThe external protected Uniswap integration harness remains unexecuted locally.","treeHash":"895a1a3692f4b658d5fccc1ea53fb994234e192f","usage":{"cachedInputTokens":740992,"inputTokens":66317,"model":"gpt-6-astra","outputTokens":5426,"runtime":"codex","turns":5,"wallClockMs":133601}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fe5e46fb044c6af1","findings":[{"citation":"resolved","description":"approve() writes the new value unconditionally, without reference to what the spender has already consumed. A spender who sees a holder's reduction in the mempool can spend the old allowance first and the new one afterwards. This is exactly what EIP-20 specifies and what the brief asks for ('plain ERC-20 transfers'); OpenZeppelin v5 behaves identically and ships no increaseAllowance/decreaseAllowance. The holder can avoid it by approving 0 first, which the token supports. Both specialists reported the same root cause at the same line (audit_permissions and audit_flow); merged here as one informational note. Not a defect against the requested design and no change is required; recorded so launch documentation can say it.","line":38,"path":"src/SPALACEToken.sol","reproduction":"Reproduced with a scratch Foundry test against the current tree. State: holder H (deployer, holds 1e27), spender S, receiver A. 1) H.approve(S, 100). 2) S front-runs H's intended reduction: vm.prank(S); transferFrom(H, A, 100) succeeds, allowance 100 -> 0. 3) H.approve(S, 50) lands: allowance = 50. 4) vm.prank(S); transferFrom(H, A, 50) succeeds. Actual: balanceOf(A) == 150 and allowance(H, S) == 0. Expected under the holder's intent to cap spend at 50 after step 3: at most 50 spendable. Expected under EIP-20: exactly this result, so no code defect.","severity":"info","snippet":"        allowance[msg.sender][spender] = value;","title":"approve() replaces the stored allowance, so lowering a non-zero approval can be front-run by the spender (inherent EIP-20 behaviour; merged from audit_permissions and audit_flow)"},{"citation":"resolved","description":"The script is not part of the launch: the factory deploys SPALACEToken via CREATE2 with the manifest's empty constructorArgs, and the README documents the script as a simulation helper that reads no keys. The constructor credits the whole 1e27 supply to msg.sender, which is correct under the factory. The note is that the chain guard's default of 1 (Ethereum mainnet) means the only committed non-test helper would, if an operator ran it with --broadcast and a mainnet RPC, deploy a second SPALACEToken with its supply held by the broadcasting EOA, outside the factory, the distributor and the pool. Reported by audit_flow; reproduced below. Not a defect in the deliverable; removing the script or defaulting the guard to 0 (dry-run only) would close the note. No change is required if the script is kept as documented.","line":18,"path":"script/Deploy.s.sol","reproduction":"Offline, against the current tree: `EXPECTED_CHAIN_ID=0 forge script script/Deploy.s.sol:Deploy --offline` simulates and returns a SPALACEToken at 0x7FA9385bE102ac3EAc297483Dd6233D62b3e1496 whose balanceOf(default sender) == 1e27. `forge script script/Deploy.s.sol:Deploy --offline` with the variable unset runs on Foundry's local chain id 31337 and reverts with 'unexpected chain', confirming the default is 1: on a chain-1 RPC the same require(expectedChainId == 0 || block.chainid == expectedChainId) passes and, with --broadcast, a real deployment would be sent. Expected per the brief: the token is only deployed through ProjectFactory.launchCustom. Actual: the script permits a standalone mainnet deployment by default. No wallet key was read or transaction broadcast for this reproduction.","severity":"info","snippet":"        uint256 expectedChainId = vm.envOr(\"EXPECTED_CHAIN_ID\", uint256(1));\n        require(expectedChainId == 0 || block.chainid == expectedChainId, \"unexpected chain\");\n        vm.startBroadcast();\n        token = new SPALACEToken();","title":"script/Deploy.s.sol defaults EXPECTED_CHAIN_ID to 1, so a --broadcast against mainnet with any signer would create a standalone look-alike token whose supply goes to that signer, not the factory"}],"hash":"42a74b3af3b9019fdff9ca0035689f9f4b1ea79a9b4125d1b56d3d1b1806f392","nodeId":"f9a7f693-f3dd-450b-b1df-39481826c6c8","outcome":"completed","summary":"The review is complete and `.imd-findings.json` is written at the repository root. Only the findings file exists outside the committed tree; the scratch tests were removed and git status is clean.\n\n**Outcome: no defects.** The token is a minimal fixed-supply ERC-20 and behaves as the brief requires. The findings file holds two informational notes and a full coverage record.\n\n**What I verified against the code**\n\n- Build with solc 0.8.26 and all 51 project tests pass, including the in-place Uniswap v4 PoolManager suite at the mainnet address and the conservation invariants.\n- The constructor credits exactly 1e27 units to msg.sender. There is no mint, burn, pause, blacklist, owner, fallback or upgrade path.\n- An opcode scan of creation and runtime bytecode finds no DELEGATECALL, CALLCODE or SELFDESTRUCT. Runtime is 1,315 bytes, no link references, no submodules, and every import resolves to a committed file.\n- The transfer path checks balance before the unchecked subtraction, handles self-transfer correctly, and transferFrom treats max uint as unlimited and reverts atomically on failure. I confirmed the self-transfer and conservation cases in a scratch test.\n- launch.json has exactly the six required keys, an empty constructorArgs matching the parameterless constructor, and pool and economics copied verbatim from the order.\n\n**Specialist findings, settled**\n\n- The approve front-run note from audit_permissions and audit_flow is the same root cause at the same line. I merged it into one info finding and reproduced it in a scratch test. It is inherent EIP-20 behaviour and the brief asks for plain ERC-20, so it is not a defect.\n- The deploy script note from audit_flow reproduces. The chain guard defaults to mainnet, so a broadcast there would create a standalone look-alike token. The script is documented as a simulation helper and is not part of the factory launch, so it stays informational.\n\n**Coverage.** All three entry points are marked holds, plus four invariant rows for the constructor mint, bytecode limits, manifest shape and the protected launch flows. No proofs were attached because nothing reached high or critical severity.","treeHash":null,"usage":{"cachedInputTokens":531282,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":8956,"runtime":"claude","turns":10,"wallClockMs":157258}},{"artifacts":[],"attempt":1,"bundleHash":"61cc6dfc7167c2087c650664602171761df973282a70c4976d6d9ebd119e8984","device":"df74f6c887684f20","findings":[],"hash":"53960d7f77a286203c3c9b935e084fa300e14bb646ed9f0fdf3739d94d9a9e8a","nodeId":"87154cb9-a60e-4910-a6e4-36ab46b340bf","outcome":"completed","summary":"","treeHash":"1e8bc91ba490b3eec2b0959aaa68a231ab83c563","usage":{"cachedInputTokens":5909514,"inputTokens":1574,"model":"claude-fable-5-1","outputTokens":84973,"runtime":"claude","turns":53,"wallClockMs":1323253}},{"artifacts":[],"attempt":1,"bundleHash":"06f8eeb123e1502e3eca7ab2957d9c25f4690ea1cd0b74bd9d3bc597639b2c9b","device":"868f4d64276861c0","findings":[],"hash":"642ccebccb6e6c82e5e0c63e82559a21adfe60429815c009e43d0b8f9e53606b","nodeId":"9e7b49dd-a6cf-4585-9ed2-5a8e151d1ac2","outcome":"completed","summary":"Removed redundant original renders. Remaining source files total **7.26 MiB**, below the 8 MiB limit. All five logo options and `artifacts/logo.png` remain byte-for-byte unchanged.\n\nOffline build, 21 tests across two seeds, formatting, deployment simulation, manifest and asset checks passed.\n\nArtwork remains five image-generated drafts, all retained as exports; no new drafts or discarded designs.","treeHash":"3c8625b26b531a0456a1f5a8f1f47a32ca1aeded","usage":{"cachedInputTokens":1186432,"inputTokens":89772,"model":"gpt-6-astra","outputTokens":24156,"runtime":"codex","turns":10,"wallClockMs":688121}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"98b4506bef931d13","findings":[],"hash":"69145579484970e2164c7f4b4226d3e8ac02ef90d748394c45275434db96473c","nodeId":"78e3562d-c2ba-404a-914d-a2d7b4c05b95","outcome":"completed","summary":"The review is complete. `.imd-findings.json` is written at the repository root with an empty findings list and eight coverage rows, and the working tree has no stray files (the scratch probe was removed; only `out/` and `cache/` build output remain, both gitignored).\n\n**Result: no defects found in the economics area.** The SPALACE token is a 70-line, dependency-free ERC-20 with a constant 1e27 supply credited once to the constructor caller, no fee, limit, exemption, admin surface, external call or fallback. Every failure mode from the Economic Security, Invariant and Flow Gap guides that applies to a token of this shape was checked and holds.\n\nWhat I verified:\n\n- **Conservation.** The only balance writers are the constructor and `_transfer`. Transfers to the zero address revert, the subtraction is checked before the unchecked block, and the recipient is read after the subtraction, so self-transfers and full-balance transfers conserve the sum exactly. No burn or mint path exists.\n- **Allowances.** Finite approvals decrement exactly, max uint persists, a revert on insufficient balance or zero receiver rolls the allowance back, and from-equals-zero is rejected even at value zero. No residual accumulation path.\n- **Launch flows.** Factory to distributor, factory to PoolManager, distributor claims and trader round trips all arrive whole. The repository's tests run against the vendored Uniswap v4 PoolManager in both currency orderings, including single-sided seeding within the 90% budget, exact-output swaps, one-unit-short settlement reverting, and fee collection. I re-ran them from a clean environment with no network: 51 tests passed, plus four scratch probes of my own on allowance residuals, zero-sender paths and the full launch flow sum.\n- **Manifest.** Exactly the six required top-level keys, token fields match the compiled ABI, economics and pool copied verbatim, lowercase addresses, notes under the limit. The declared opening sqrt price equals the value derived from 2500 IMD over 1e27 units with SPALACE as currency0.\n- **Bytecode.** No DELEGATECALL, CALLCODE or SELFDESTRUCT, no receive or fallback, no linked libraries.\n\nStatic analysis leads: the single aderyn note about the large numeric literal is a compile-time constant expression for the supply and is not a defect.\n\nNot covered here, and owed to the network's own harness: live factory, hook and Merkle distributor integration on mainnet, and the actual CREATE2 address ordering of the token against IMD, which decides whether the provenance price or its inverse is used by the deployer.","treeHash":null,"usage":{"cachedInputTokens":724862,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":11419,"runtime":"claude","turns":22,"wallClockMs":222131}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"282ca58d047214da","findings":[{"citation":"resolved","description":"Execution Trace guide, 'approval residuals': approve() replaces the stored allowance with the new value without reference to what was already spent. A spender who sees a holder's allowance reduction in the mempool can spend the old allowance first and then the new one, so the holder's 'reduction' authorises more than either figure. This is exactly what EIP-20 specifies and what the brief asks for ('plain ERC-20'); OpenZeppelin v5 behaves identically and no longer ships increaseAllowance/decreaseAllowance. It is recorded so the judge can see it was traced, not as a defect to fix. The contract is otherwise free of the guide's other items: no fees, no sentinel paths other than the address(0) reverts, no external calls, no stale reads, no partial state updates (the allowance decrement and the balance move are in one transaction and revert together).","line":38,"path":"src/SPALACEToken.sol","reproduction":"State: ALICE holds 1000, ALICE.approve(BOB, 100). ALICE submits approve(BOB, 50) intending to reduce. BOB front-runs with transferFrom(ALICE, CAROL, 100) (succeeds, allowance 100->0), then after ALICE's approve(BOB, 50) lands BOB calls transferFrom(ALICE, CAROL, 50). Actual: CAROL holds 150 and ALICE's allowance to BOB is 0. A holder expecting the reduction to cap total spend at 100 (or 50) is wrong. Reproduced in a scratch Foundry test (test_ApproveRace) against the current tree; this is standard ERC-20 behaviour and the recommended mitigation is the usual approve(0) first, which the token supports and the suite tests (test_ApprovalOverwriteAndRevocation).","severity":"info","snippet":"        allowance[msg.sender][spender] = value;","title":"approve() overwrites the allowance, so lowering an approval is front-runnable (inherent ERC-20 behaviour, no fix required)"},{"citation":"resolved","description":"Periphery guide: the only non-test helper beside the token is this script. It wraps `new SPALACEToken()` in startBroadcast/stopBroadcast, and its chain guard defaults EXPECTED_CHAIN_ID to 1, so `forge script script/Deploy.s.sol:Deploy --rpc-url <mainnet> --broadcast` with any signer would deploy a second SPALACEToken whose constructor credits 1e27 units to that EOA, not to ProjectFactory, with no distributor share and no pool. The README documents the script as a simulation helper only and the repository reads no keys, so this is not a defect in the deliverable; it is a note that the script is unnecessary for the launch (the factory deploys the token) and is the one place in the tree where an operator mistake could create a look-alike token. The constructor itself behaves as required in both cases (whole supply to msg.sender).","line":20,"path":"script/Deploy.s.sol","reproduction":"Offline: `EXPECTED_CHAIN_ID=0 forge script script/Deploy.s.sol:Deploy --offline` simulates fine and reports a token whose balanceOf(default sender) == 1e27. With --broadcast on chain 1 and EXPECTED_CHAIN_ID unset, require(expectedChainId == 0 || block.chainid == expectedChainId) passes (default 1 == 1) and a real deployment would be sent. Expected per the brief: the token is only deployed through ProjectFactory.launchCustom. No change is required if the script is kept as documented; removing it or making the guard default to 0 (simulation-only) would close the note.","severity":"info","snippet":"        vm.startBroadcast();","title":"script/Deploy.s.sol can broadcast a standalone token whose supply goes to the broadcasting key, outside the factory launch"}],"hash":"69ae893b85776075ebefe81df6da9e48a2093e7e3c0e9d30ac884ee8beda21c4","nodeId":"48be1c76-4cee-4b07-9e4b-4e4448c20e30","outcome":"completed","summary":"The findings file is in place and excluded from git by the harness's own exclude rule, which is expected for a review deliverable. The working tree is otherwise unchanged. Nothing further is pending.\n\n**Outcome: no defect found in the token.** The review of SPALACEToken under the Execution Trace, Periphery and First Principles guides is complete, and `.imd-findings.json` holds two informational notes and a full coverage record.\n\n**What was checked**\n- **transfer and transferFrom**: every guard and state write traced. The zero-address reverts, the balance check before the unchecked subtraction, the self-transfer ordering, the finite-versus-unlimited allowance split and the rollback of a consumed allowance on a failed move all behave as a plain ERC-20 should. Scratch probes covered self-approval, self-transferFrom with unlimited allowance, and maximum values.\n- **approve**: overwrites the allowance as EIP-20 specifies. The classic reduce-approval front-run reproduces (holder lowers 100 to 50, spender takes 150). Recorded as info only, since it is inherent to the requested plain ERC-20 and OpenZeppelin v5 behaves the same.\n- **Constructor and supply**: whole 1e27 credited to msg.sender, including when a CREATE2 contract deploys it. balanceOf has exactly two writers, totalSupply is a constant, there is no receive or fallback, and neither runtime nor creation code contains DELEGATECALL, CALLCODE or SELFDESTRUCT.\n- **Launch flows and manifest**: the existing suite drives the real v4 PoolManager at the mainnet address in both currency orderings and passes (51 tests). launch.json has exactly the six keys, an empty constructorArgs matching the no-arg constructor, and an initialPrice that I recomputed from the economics and matched exactly.\n- **Periphery**: no linked libraries. The one note is that `script/Deploy.s.sol` wraps the deployment in a broadcast with a chain guard defaulting to mainnet, so a careless `--broadcast` run would mint a look-alike token to the signer outside the factory. The README documents it as simulation-only, so this is info, not a defect.\n\n**Coverage record**: eight rows, one per listed entry point plus the constructor, the fixed-supply invariant, the launch-flow invariant, the manifest and the periphery. Nothing was left unreached. Static-analysis lead (aderyn large numeric literal) is style only and was not promoted.","treeHash":null,"usage":{"cachedInputTokens":774527,"inputTokens":290,"model":"claude-fable-5-1","outputTokens":15140,"runtime":"claude","turns":27,"wallClockMs":212436}},{"artifacts":[],"attempt":1,"bundleHash":"c9f2e6653490c5f8fd19bc561a86f14f864408f99e4c0b11470acbe23868a765","device":"4dd74fd7c315da80","findings":[],"hash":"8c58b1d2ddc045eadac7c3d3310a345c118f98c73fdb7f31c6871ebd42099bd4","nodeId":"decb2b9e-c605-47b7-93b2-6ef919aa39a5","outcome":"completed","summary":"The manifest is complete and verified. Only launch.json is modified in the working tree.\n\n**What I found.** The accepted tree holds one contract, SPALACEToken, with a parameterless constructor that mints exactly 1e27 units to msg.sender, plus constant name, symbol and 18 decimals. It has no owner, no admin functions, no mint or burn, and no delegatecall or selfdestruct. A launch.json from an earlier contributor was already present and structurally correct.\n\n**What I changed.** I rewrote only the notes string. It previously described logo files in the repository, which are not contracts. It now describes the token's constructor, fixed supply, plain transfer semantics, the factory's role in distribution, and that no application contracts are deployed.\n\n**Verified manifest contents:**\n- Top-level keys are exactly kind, token, contracts, pool, economics, notes.\n- token.contract is SPALACEToken, constructorArgs is empty, totalSupply is \"1000000000000000000000000000\".\n- contracts is an empty array, matching the single-contract source tree.\n- pool is the IMD pair at the lowercase address, fee 12500, tickSpacing 60, initialPrice \"125270724187523965593206900\".\n- economics matches the job's object verbatim.\n- notes is one string under 4000 characters.\n\n**Checks run.** The build compiled cleanly with solc 0.8.26, and all 51 tests across 5 suites passed. No scratch files were created and `git status --porcelain` shows only launch.json modified.","treeHash":"0ab2a2c90f341fba75b472824f147365054e7159","usage":{"cachedInputTokens":327027,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":3759,"runtime":"claude","turns":9,"wallClockMs":63266}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa5c50e7abe46571","findings":[],"hash":"e07bcc08c8835c4ffd1e0f4f586b9cfd5b9aa9b1cda30bd28971ca911a90a634","nodeId":"2ea276e0-8aea-492c-9f0b-f516823adb80","outcome":"completed","summary":"The review is complete. No defects found in the Math Precision, Boundary or Numerical Gap areas, and the findings file records that with full coverage.\n\n**What I checked**\n\n- **Arithmetic in SPALACEToken.** The only operations are one checked constant, two guarded unchecked subtractions and one unchecked addition. Both subtractions sit behind a strict `<` guard. The addition cannot overflow because no mint or burn path exists, so all balances always sum to 1e27. Self-transfer re-reads storage after the debit, so a full-balance transfer to oneself preserves the balance.\n- **Sentinel and edge inputs.** Value 0, exact balance, balance plus one, max uint256, allowance of max minus one, allowance exactly equal to value, and a recipient already holding the whole supply all behave correctly. A balance revert after the allowance check rolls the allowance back.\n- **Boundary enumeration.** The token makes no external calls, has no payable, receive or fallback function, and decodes no bytes. The only sentinel branches are the three address-zero rejections, walked on both sides.\n- **Manifest math.** The declared sqrtPriceX96 equals the value derived from a 2500 IMD cap over 1e27 units with SPALACE as currency0, digit for digit. Keys, types, lowercase addresses, empty constructorArgs and totalSupply all match the schema and the constructor.\n- **Static analysis lead.** The aderyn large-literal note on line 12 is a style remark. The literal evaluates to exactly 1e27.\n\n**Verification run**\n\nI ran the repository's 51 existing tests, which all pass, plus a scratch suite of 7 corner-case tests including a 2000-run conservation fuzz, which also passed. The scratch directory has been removed and the tree is clean apart from the findings file.\n\n**Output**\n\n`.imd-findings.json` holds an empty findings list and six coverage rows: one `holds` row for each of the three entry points, plus rows for the supply-conservation invariant, the manifest price derivation and the boundary enumeration. Nothing in my area was left unreached.","treeHash":null,"usage":{"cachedInputTokens":877194,"inputTokens":450,"model":"claude-fable-5-1","outputTokens":10854,"runtime":"claude","turns":15,"wallClockMs":158820}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"fa99051b60a858d6","findings":[{"citation":"resolved","description":"Access x asymmetry note, not a permission bypass: approve() is the only writer of allowance besides transferFrom's decrement, and it replaces the value unconditionally regardless of what the spender already consumed. A holder who wants to lower an existing non-zero allowance can be front-run by the spender, who spends the old allowance and then the new one. This is the well-known ERC-20 approve ordering property that OpenZeppelin v5 and the EIP itself carry; the contract adds no increaseAllowance/decreaseAllowance or permit path to mitigate it. No funds beyond what the holder at some point authorised can move, and the holder can avoid it by approving 0 first. Reported as informational so the launch documentation can say it; nothing in the token's stated requirements asks for a different design.","line":38,"path":"src/SPALACEToken.sol","reproduction":"holder = deployer; spender S. 1) holder.approve(S, 100). 2) holder sends approve(S, 50) intending to reduce. 3) S sees the pending tx and front-runs transferFrom(holder, A, 100): allowance becomes 0, A gets 100. 4) holder's approve(S, 50) lands: allowance = 50. 5) S calls transferFrom(holder, A, 50). Actual: A holds 150 while the holder intended a 50 cap. Expected under the holder's intent: at most 50 spendable after step 2. Confirmed with a Foundry probe (approve 100, spend 100, approve 50, spend 50 => balanceOf(A) == 150).","severity":"info","snippet":"        allowance[msg.sender][spender] = value;","title":"approve() overwrites the allowance, so a spender can front-run a reduction and spend old plus new (standard ERC-20 approve race; no increase/decrease helpers offered)"}],"hash":"e6dc7e2ce1bf4b477f474004768b3508706b401d0a60781d10f14de463e8307d","nodeId":"941ed337-f710-4ae6-82d6-ae9a2ed61d6d","outcome":"completed","summary":"The review is complete and the findings file is written. The working tree has no changes to tracked files, and the scratch directory was removed.\n\n**Outcome:** no defects in the assigned area. The token has no permission model to break: no owner, no initializer, no fallback, and the only state writers are the constructor and the three ERC-20 entry points, each gated by the caller's own balance or allowance.\n\n**What I checked, per guide:**\n- **Access Control:** mapped every writer of `balanceOf` and `allowance`. The deployer and factory have no bypass. A transferFrom against a holder without approval reverts, and the runtime contains no delegatecall or selfdestruct.\n- **Asymmetry:** diffed transfer against transferFrom and approve against the allowance decrement. All mirror writes are present, self-transfer conserves balance at the full 1e27, and the zero-sender path is unreachable except through a reverting transferFrom.\n- **Trust Gap:** no privileged actor and no economic formula exist in the token, so no seam exists. Launch flows carry no address-dependent branch, and the manifest's pool, economics and provenance price match the order.\n\n**Reported:** one informational note on the standard ERC-20 approve overwrite race, with a concrete sequence that lets a spender move 150 after the holder meant to cap at 50. It is not a defect against the requested design.\n\n**Verification run:** the existing 51 tests pass, and a scratch probe confirmed the five edge behaviours I cite in the coverage rows. Coverage has seven rows covering all three listed entry points, the constructor and three invariants.\n\n**Not reached:** live pool initialization and swap settlement against the real PoolManager, which the protected harness runs later with network inputs.","treeHash":null,"usage":{"cachedInputTokens":575788,"inputTokens":258,"model":"claude-fable-5-1","outputTokens":8815,"runtime":"claude","turns":18,"wallClockMs":144080}}],"verification":[{"checks":[{"durationMs":1798,"exitCode":0,"name":"build","output":"Compiling 53 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.72s\nCompiler run successful!\n","passed":true},{"durationMs":506,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 22 tests for test/SPALACEToken.t.sol:SPALACETokenTest\n[PASS] testFuzz_FiniteAllowanceEnforcesCumulativeLimit(uint256,uint256) (runs: 256, μ: 196447, ~: 197297)\n[PASS] testFuzz_SelfTransferConservesBalance(uint256) (runs: 256, μ: 128878, ~: 129031)\n[PASS] testFuzz_TransferAboveBalanceNeverMutates(uint256,uint256) (runs: 256, μ: 102135, ~: 102351)\n[PASS] testFuzz_TransferRoundTripPreservesAllSupply(uint256) (runs: 256, μ: 160141, ~: 160474)\n[PASS] testFuzz_UnlimitedApprovalPersists(uint256) (runs: 256, μ: 212799, ~: 213169)\n[PASS] test_ApprovalOverwriteAndRevocation() (gas: 141804)\n[PASS] test_ConstructorEmitsWholeSupplyMintToFactory() (gas: 246352)\n[PASS] test_DeployerCannotTakeHolderFundsWithoutApproval() (gas: 146225)\n[PASS] test_FactoryReceivesFullSupplyAndControlsDistribution() (gas: 515674)\n[PASS] test_FailedTransferFromRestoresSpentAllowance() (gas: 97336)\n[PASS] test_ForbiddenOpcodesAbsent() (gas: 323918)\n[PASS] test_InsufficientBalanceRollsBack() (gas: 44469)\n[PASS] test_LaunchIdentityAndWholeSupplyToConstructorCaller() (gas: 44800)\n[PASS] test_NoMintBurnOrAdminInterface() (gas: 1458397)\n[PASS] test_TransferAndApprovalEvents() (gas: 166117)\n[PASS] test_TransferFromToZeroRestoresAllowance() (gas: 94893)\n[PASS] test_TransferToZeroCannotBurnSupply() (gas: 39463)\n[PASS] test_ZeroSenderRejected() (gas: 33143)\n[PASS] test_ZeroSpenderRejected() (gas: 30212)\n[PASS] test_ZeroTransfersAndEntireBalance() (gas: 181523)\n[PASS] test_ZeroValueToZeroAlsoReverts() (gas: 30356)\n[PASS] test_ZeroValueTransfersEmitEvents() (gas: 99840)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 18.14ms (79.42ms CPU time)\n\nRan 12 tests for test/TokenEdges.t.sol:TokenEdgesTest\n[PASS] testFuzz_AnyNonzeroRecipientReceivesExactAmount(address,uint256) (runs: 256, μ: 77812, ~: 77964)\n[PASS] testFuzz_InvalidSpenderCannotChangeExistingApprovals(uint256) (runs: 256, μ: 96496, ~: 96445)\n[PASS] testFuzz_ZeroTransferFromPreservesAnyAllowance(uint256) (runs: 256, μ: 107097, ~: 107202)\n[PASS] test_ApprovalsAreIsolatedByHolderAndSpender() (gas: 411930)\n[PASS] test_HolderAlsoNeedsApprovalToUseTransferFrom() (gas: 192027)\n[PASS] test_MaximumFiniteApprovalIsConsumedAndCanBeRevoked() (gas: 150869)\n[PASS] test_MaximumTransferRejectedEvenWithUnlimitedAllowance() (gas: 102422)\n[PASS] test_NativeValueAndMalformedCallsCannotChangeTokenState() (gas: 126559)\n[PASS] test_NoTimeBasedInflationCooldownOrTransactionLimit() (gas: 585365)\n[PASS] test_RecipientCodeCannotBlockPlainTransfers() (gas: 320372)\n[PASS] test_RevokedUnlimitedApprovalCannotBeReused() (gas: 233863)\n[PASS] test_SelfTransfersStillEnforceBalanceAndRollbackApproval() (gas: 176315)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 42.28ms (72.63ms CPU time)\n\nRan 8 tests for test/PoolManager.t.sol:PoolManagerToken1Test\n[PASS] invariant_SwapsAndFeeClaimsPreserveSupplyAndSettleAllDebt() (runs: 32, calls: 768, reverts: 0)\n\n╭---------------------+-------------+-------+---------+----------╮\n| Contract            | Selector    | Calls | Reverts | Discards |\n+================================================================+\n| PoolSequenceHandler | collectFees | 397   | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| PoolSequenceHandler | trade       | 371   | 0       | 0        |\n╰---------------------+-------------+-------+---------+----------╯\n\n[PASS] testFuzz_ExactInputBuySellConservesTokens(uint256) (runs: 256, μ: 790923, ~: 791063)\n[PASS] test_BuySellAndCollectFeesThroughPoolManager() (gas: 1174474)\n[PASS] test_ExactOutputBuyAndSellSettleWithoutTokenTax() (gas: 719150)\n[PASS] test_InsufficientTokenBalanceRevertsWholeSwap() (gas: 840658)\n[PASS] test_OneUnitShortPaymentRevertsEntireBuyAndSell() (gas: 1436906)\n[PASS] test_SingleSidedLaunchAndDistributorTransferArriveWhole() (gas: 221780)\n[PASS] test_ZeroSwapAndLockedTakeCannotMoveValue() (gas: 262901)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 171.61ms (224.91ms CPU time)\n\nRan 8 tests for test/PoolManager.t.sol:PoolManagerToken0Test\n[PASS] invariant_SwapsAndFeeClaimsPreserveSupplyAndSettleAllDebt() (runs: 32, calls: 768, reverts: 0)\n\n╭---------------------+-------------+-------+---------+----------╮\n| Contract            | Selector    | Calls | Reverts | Discards |\n+================================================================+\n| PoolSequenceHandler | collectFees | 397   | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| PoolSequenceHandler | trade       | 371   | 0       | 0        |\n╰---------------------+-------------+-------+---------+----------╯\n\n[PASS] testFuzz_ExactInputBuySellConservesTokens(uint256) (runs: 256, μ: 790366, ~: 790367)\n[PASS] test_BuySellAndCollectFeesThroughPoolManager() (gas: 1173778)\n[PASS] test_ExactOutputBuyAndSellSettleWithoutTokenTax() (gas: 718753)\n[PASS] test_InsufficientTokenBalanceRevertsWholeSwap() (gas: 823829)\n[PASS] test_OneUnitShortPaymentRevertsEntireBuyAndSell() (gas: 1435514)\n[PASS] test_SingleSidedLaunchAndDistributorTransferArriveWhole() (gas: 221783)\n[PASS] test_ZeroSwapAndLockedTakeCannotMoveValue() (gas: 262900)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 181.42ms (232.13ms CPU time)\n\nRan 1 test for test/Conservation.t.sol:ConservationTest\n[PASS] invariant_AllBalancesAndAllowancesMatchModel() (runs: 64, calls: 4096, reverts: 0)\n\n╭-----------------+--------------------+-------+---------+----------╮\n| Contract        | Selector           | Calls | Reverts | Discards |\n+===================================================================+\n| TransferHandler | approve            | 598   | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| TransferHandler | delegated          | 546   | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| TransferHandler | direct             | 618   | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| TransferHandler | rejectOverBalance  | 608   | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| TransferHandler | rejectOverspend    | 565   | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| TransferHandler | rejectZeroReceiver | 583   | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| TransferHandler | revoke             | 578   | 0       | 0        |\n╰-----------------+--------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 451.99ms (451.28ms CPU time)\n\nRan 5 test suites in 453.21ms (865.43ms CPU time): 51 tests passed, 0 failed, 0 skipped (51 total tests)\n","passed":true},{"durationMs":163,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SPALACEToken.approve(address,uint256)\",\"SPALACEToken.transfer(address,uint256)\",\"SPALACEToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":52,\"REVIEW.md\":37,\"artifacts/asset-check.json\":61,\"artifacts/logo.png\":4103,\"artifacts/previews/options-at-64.png\":323,\"artifacts/previews/selected-at-32.png\":15,\"dist/404.html\":53,\"dist/assets/favicon-64.png\":28,\"dist/assets/logo-192.png\":107,\"dist/assets/logo-512.png\":388,\"dist/assets/og-image.png\":542,\"dist/css/style.css\":791,\"dist/index.html\":448,\"dist/js/app.js\":690,\"docs/abi/SPALACEToken.json\":304,\"foundry.toml\":15,\"launch.json\":24,\"logos/README.md\":13,\"logos/logo-1.png\":4103,\"logos/logo-2.png\":2944,\"logos/logo-3.png\":3962,\"logos/logo-4.png\":7348,\"logos/logo-5.png\":5507,\"logos/preview.html\":23,\"script/Deploy.s.sol\":24,\"scripts/check_assets.py\":128,\"scripts/check_manifest.py\":42,\"site/404.html\":53,\"site/assets/favicon-64.png\":28,\"site/assets/logo-192.png\":107,\"site/assets/logo-512.png\":388,\"site/assets/og-image.png\":542,\"site/css/style.css\":792,\"site/index.html\":448,\"site/js/app.js\":690,\"site/package-lock.json\":16,\"site/package.json\":19,\"site/scripts/build.mjs\":41,\"site/scripts/check.mjs\":51,\"site/scripts/preview.mjs\":48,\"site/scripts/verify.cjs\":206,\"site/tsconfig.json\":15,\"src/SPALACEToken.sol\":69,\"test/Conservation.t.sol\":162,\"test/PoolManager.t.sol\":361,\"test/README.md\":49,\"test/SPALACEToken.t.sol\":320,\"test/TokenEdges.t.sol\":199,\"test/helpers/PoolHarness.sol\":138,\"test/vendor/README.md\":20,\"test/vendor/solmate/LICENSE\":661,\"test/vendor/solmate/src/auth/Owned.sol\":44,\"test/vendor/v4-core/licenses/BUSL_LICENSE\":63,\"test/vendor/v4-core/licenses/MIT_LICENSE\":7,\"test/vendor/v4-core/src/ERC6909.sol\":90,\"test/vendor/v4-core/src/ERC6909Claims.sol\":23,\"test/vendor/v4-core/src/Extsload.sol\":64,\"test/vendor/v4-core/src/Exttload.sol\":40,\"test/vendor/v4-core/src/NoDelegateCall.sol\":33,\"test/vendor/v4-core/src/PoolManager.sol\":392,\"test/vendor/v4-core/src/ProtocolFees.sol\":71,\"test/vendor/v4-core/src/interfaces/IExtsload.sol\":21,\"test/vendor/v4-core/src/interfaces/IExttload.sol\":15,\"test/vendor/v4-core/src/interfaces/IHooks.sol\":155,\"test/vendor/v4-core/src/interfaces/IPoolManager.sol\":235,\"test/vendor/v4-core/src/interfaces/IProtocolFees.sol\":52,\"test/vendor/v4-core/src/interfaces/callback/IUnlockCallback.sol\":10,\"test/vendor/v4-core/src/interfaces/external/IERC20Minimal.sol\":48,\"test/vendor/v4-core/src/interfaces/external/IERC6909Claims.sol\":66,\"test/vendor/v4-core/src/libraries/BitMath.sol\":49,\"test/vendor/v4-core/src/libraries/CurrencyDelta.sol\":42,\"test/vendor/v4-core/src/libraries/CurrencyReserves.sol\":39,\"test/vendor/v4-core/src/libraries/CustomRevert.sol\":120,\"test/vendor/v4-core/src/libraries/FixedPoint128.sol\":8,\"test/vendor/v4-core/src/libraries/FixedPoint96.sol\":10,\"test/vendor/v4-core/src/libraries/FullMath.sol\":117,\"test/vendor/v4-core/src/libraries/Hooks.sol\":343,\"test/vendor/v4-core/src/libraries/LPFeeLibrary.sol\":79,\"test/vendor/v4-core/src/libraries/LiquidityMath.sol\":20,\"test/vendor/v4-core/src/libraries/Lock.sol\":28,\"test/vendor/v4-core/src/libraries/NonzeroDeltaCount.sol\":35,\"test/vendor/v4-core/src/libraries/ParseBytes.sol\":29,\"test/vendor/v4-core/src/libraries/Pool.sol\":620,\"test/vendor/v4-core/src/libraries/Position.sol\":103,\"test/vendor/v4-core/src/libraries/ProtocolFeeLibrary.sol\":47,\"test/vendor/v4-core/src/libraries/SafeCast.sol\":60,\"test/vendor/v4-core/src/libraries/SqrtPriceMath.sol\":292,\"test/vendor/v4-core/src/libraries/StateLibrary.sol\":345,\"test/vendor/v4-core/src/libraries/SwapMath.sol\":108,\"test/vendor/v4-core/src/libraries/TickBitmap.sol\":121,\"test/vendor/v4-core/src/libraries/TickMath.sol\":238,\"test/vendor/v4-core/src/libraries/TransientStateLibrary.sol\":48,\"test/vendor/v4-core/src/libraries/UnsafeMath.sol\":29,\"test/vendor/v4-core/src/types/BalanceDelta.sol\":72,\"test/vendor/v4-core/src/types/BeforeSwapDelta.sol\":38,\"test/vendor/v4-core/src/types/Currency.sol\":118,\"test/vendor/v4-core/src/types/PoolId.sol\":17,\"test/vendor/v4-core/src/types/PoolKey.sol\":22,\"test/vendor/v4-core/src/types/Slot0.sol\":95},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"1244fde38064bcad4345b8f8e18b9aa36ea08fc0c25e51d991ce59dc59502d6b","verifiedTreeHash":"4ceaf1a93cc1dcc9a52796d335f75321c9881ec2","verifierVersion":"0.1.0+fdeb4d4a"},{"checks":[{"durationMs":412,"exitCode":0,"name":"build","output":"Compiling 4 files with Solc 0.8.26\nSolc 0.8.26 finished in 367.27ms\nCompiler run successful!\n","passed":true},{"durationMs":816,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 22 tests for test/SPALACEToken.t.sol:SPALACETokenTest\n[PASS] testFuzz_FiniteAllowanceEnforcesCumulativeLimit(uint256,uint256) (runs: 2000, μ: 195850, ~: 197201)\n[PASS] testFuzz_SelfTransferConservesBalance(uint256) (runs: 2000, μ: 128592, ~: 128997)\n[PASS] testFuzz_TransferAboveBalanceNeverMutates(uint256,uint256) (runs: 2000, μ: 101905, ~: 102351)\n[PASS] testFuzz_TransferRoundTripPreservesAllSupply(uint256) (runs: 2000, μ: 159567, ~: 160438)\n[PASS] testFuzz_UnlimitedApprovalPersists(uint256) (runs: 2000, μ: 212128, ~: 213133)\n[PASS] test_ApprovalOverwriteAndRevocation() (gas: 141804)\n[PASS] test_ConstructorEmitsWholeSupplyMintToFactory() (gas: 246352)\n[PASS] test_DeployerCannotTakeHolderFundsWithoutApproval() (gas: 146225)\n[PASS] test_FactoryReceivesFullSupplyAndControlsDistribution() (gas: 515674)\n[PASS] test_FailedTransferFromRestoresSpentAllowance() (gas: 97336)\n[PASS] test_ForbiddenOpcodesAbsent() (gas: 323918)\n[PASS] test_InsufficientBalanceRollsBack() (gas: 44469)\n[PASS] test_LaunchIdentityAndWholeSupplyToConstructorCaller() (gas: 44800)\n[PASS] test_NoMintBurnOrAdminInterface() (gas: 890388)\n[PASS] test_TransferAndApprovalEvents() (gas: 166117)\n[PASS] test_TransferFromToZeroRestoresAllowance() (gas: 94893)\n[PASS] test_TransferToZeroCannotBurnSupply() (gas: 39463)\n[PASS] test_ZeroSenderRejected() (gas: 33143)\n[PASS] test_ZeroSpenderRejected() (gas: 30212)\n[PASS] test_ZeroTransfersAndEntireBalance() (gas: 181523)\n[PASS] test_ZeroValueToZeroAlsoReverts() (gas: 30356)\n[PASS] test_ZeroValueTransfersEmitEvents() (gas: 99840)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 77.59ms (387.36ms CPU time)\n\nRan 1 test for test/Conservation.t.sol:ConservationTest\n[PASS] invariant_AllBalancesSumToFixedSupply() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+-----------+-------+---------+----------╮\n| Contract        | Selector  | Calls | Reverts | Discards |\n+==========================================================+\n| TransferHandler | delegated | 5469  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TransferHandler | direct    | 5379  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TransferHandler | revoke    | 5536  | 0       | 0        |\n╰-----------------+-----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 766.65ms (765.87ms CPU time)\n\nRan 2 test suites in 767.66ms (844.24ms CPU time): 23 tests passed, 0 failed, 0 skipped (23 total tests)\n","passed":true},{"durationMs":141,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SPALACEToken.approve(address,uint256)\",\"SPALACEToken.transfer(address,uint256)\",\"SPALACEToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":52,\"REVIEW.md\":37,\"artifacts/asset-check.json\":61,\"artifacts/logo.png\":4103,\"artifacts/previews/options-at-64.png\":323,\"artifacts/previews/selected-at-32.png\":15,\"dist/404.html\":53,\"dist/assets/favicon-64.png\":28,\"dist/assets/logo-192.png\":107,\"dist/assets/logo-512.png\":388,\"dist/assets/og-image.png\":542,\"dist/css/style.css\":791,\"dist/index.html\":448,\"dist/js/app.js\":690,\"docs/abi/SPALACEToken.json\":304,\"foundry.toml\":15,\"launch.json\":24,\"logos/README.md\":13,\"logos/logo-1.png\":4103,\"logos/logo-2.png\":2944,\"logos/logo-3.png\":3962,\"logos/logo-4.png\":7348,\"logos/logo-5.png\":5507,\"logos/preview.html\":23,\"script/Deploy.s.sol\":24,\"scripts/check_assets.py\":128,\"scripts/check_manifest.py\":42,\"site/404.html\":53,\"site/assets/favicon-64.png\":28,\"site/assets/logo-192.png\":107,\"site/assets/logo-512.png\":388,\"site/assets/og-image.png\":542,\"site/css/style.css\":792,\"site/index.html\":448,\"site/js/app.js\":690,\"site/package-lock.json\":16,\"site/package.json\":19,\"site/scripts/build.mjs\":41,\"site/scripts/check.mjs\":51,\"site/scripts/preview.mjs\":48,\"site/scripts/verify.cjs\":206,\"site/tsconfig.json\":15,\"src/SPALACEToken.sol\":69,\"test/Conservation.t.sol\":73,\"test/SPALACEToken.t.sol\":312},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"388db0ca91a9c8f9fcff54568ca317c45509da71aa0f3bc5ddc8d4a318f89f2b","verifiedTreeHash":"895a1a3692f4b658d5fccc1ea53fb994234e192f","verifierVersion":"0.1.0+fdeb4d4a"},{"checks":[{"durationMs":353,"exitCode":0,"name":"build","output":"Compiling 4 files with Solc 0.8.26\nSolc 0.8.26 finished in 303.98ms\nCompiler run successful!\n","passed":true},{"durationMs":821,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 20 tests for test/SPALACEToken.t.sol:SPALACETokenTest\n[PASS] testFuzz_FiniteAllowanceEnforcesCumulativeLimit(uint256,uint256) (runs: 2000, μ: 195773, ~: 197069)\n[PASS] testFuzz_SelfTransferConservesBalance(uint256) (runs: 2000, μ: 128607, ~: 128943)\n[PASS] testFuzz_TransferAboveBalanceNeverMutates(uint256,uint256) (runs: 2000, μ: 101880, ~: 102329)\n[PASS] testFuzz_TransferRoundTripPreservesAllSupply(uint256) (runs: 2000, μ: 159787, ~: 160452)\n[PASS] testFuzz_UnlimitedApprovalPersists(uint256) (runs: 2000, μ: 212303, ~: 213081)\n[PASS] test_ApprovalOverwriteAndRevocation() (gas: 141738)\n[PASS] test_DeployerCannotTakeHolderFundsWithoutApproval() (gas: 146203)\n[PASS] test_FactoryReceivesFullSupplyAndControlsDistribution() (gas: 515674)\n[PASS] test_FailedTransferFromRestoresSpentAllowance() (gas: 97248)\n[PASS] test_ForbiddenOpcodesAbsent() (gas: 323918)\n[PASS] test_InsufficientBalanceRollsBack() (gas: 44447)\n[PASS] test_LaunchIdentityAndWholeSupplyToConstructorCaller() (gas: 44888)\n[PASS] test_NoMintBurnOrAdminInterface() (gas: 890366)\n[PASS] test_TransferAndApprovalEvents() (gas: 166053)\n[PASS] test_TransferFromToZeroRestoresAllowance() (gas: 94783)\n[PASS] test_TransferToZeroCannotBurnSupply() (gas: 39463)\n[PASS] test_ZeroSenderRejected() (gas: 33232)\n[PASS] test_ZeroSpenderRejected() (gas: 30212)\n[PASS] test_ZeroTransfersAndEntireBalance() (gas: 181479)\n[PASS] test_ZeroValueToZeroAlsoReverts() (gas: 30356)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 81.25ms (407.40ms CPU time)\n\nRan 1 test for test/Conservation.t.sol:ConservationTest\n[PASS] invariant_AllBalancesSumToFixedSupply() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+-----------+-------+---------+----------╮\n| Contract        | Selector  | Calls | Reverts | Discards |\n+==========================================================+\n| TransferHandler | delegated | 5582  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TransferHandler | direct    | 5359  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TransferHandler | revoke    | 5443  | 0       | 0        |\n╰-----------------+-----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 779.16ms (777.62ms CPU time)\n\nRan 2 test suites in 781.28ms (860.41ms CPU time): 21 tests passed, 0 failed, 0 skipped (21 total tests)\n","passed":true},{"durationMs":130,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SPALACEToken.approve(address,uint256)\",\"SPALACEToken.transfer(address,uint256)\",\"SPALACEToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":42,\"REVIEW.md\":31,\"artifacts/asset-check.json\":61,\"artifacts/logo.png\":4103,\"artifacts/previews/options-at-64.png\":323,\"artifacts/previews/selected-at-32.png\":15,\"dist/404.html\":53,\"dist/assets/favicon-64.png\":28,\"dist/assets/logo-192.png\":107,\"dist/assets/logo-512.png\":388,\"dist/assets/og-image.png\":542,\"dist/css/style.css\":791,\"dist/index.html\":448,\"dist/js/app.js\":690,\"docs/abi/SPALACEToken.json\":304,\"foundry.toml\":15,\"launch.json\":24,\"logos/README.md\":13,\"logos/logo-1.png\":4103,\"logos/logo-2.png\":2944,\"logos/logo-3.png\":3962,\"logos/logo-4.png\":7348,\"logos/logo-5.png\":5507,\"logos/preview.html\":23,\"script/Deploy.s.sol\":24,\"scripts/check_assets.py\":128,\"scripts/check_manifest.py\":42,\"site/404.html\":53,\"site/assets/favicon-64.png\":28,\"site/assets/logo-192.png\":107,\"site/assets/logo-512.png\":388,\"site/assets/og-image.png\":542,\"site/css/style.css\":792,\"site/index.html\":448,\"site/js/app.js\":690,\"site/package-lock.json\":16,\"site/package.json\":19,\"site/scripts/build.mjs\":41,\"site/scripts/check.mjs\":51,\"site/scripts/preview.mjs\":48,\"site/scripts/verify.cjs\":206,\"site/tsconfig.json\":15,\"src/SPALACEToken.sol\":69,\"test/Conservation.t.sol\":73,\"test/SPALACEToken.t.sol\":286},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"53960d7f77a286203c3c9b935e084fa300e14bb646ed9f0fdf3739d94d9a9e8a","verifiedTreeHash":"1e8bc91ba490b3eec2b0959aaa68a231ab83c563","verifierVersion":"0.1.0+fdeb4d4a"},{"checks":[{"durationMs":343,"exitCode":0,"name":"build","output":"Compiling 4 files with Solc 0.8.26\nSolc 0.8.26 finished in 299.27ms\nCompiler run successful!\n","passed":true},{"durationMs":783,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 20 tests for test/SPALACEToken.t.sol:SPALACETokenTest\n[PASS] testFuzz_FiniteAllowanceEnforcesCumulativeLimit(uint256,uint256) (runs: 2000, μ: 195714, ~: 197045)\n[PASS] testFuzz_SelfTransferConservesBalance(uint256) (runs: 2000, μ: 128656, ~: 128943)\n[PASS] testFuzz_TransferAboveBalanceNeverMutates(uint256,uint256) (runs: 2000, μ: 101918, ~: 102329)\n[PASS] testFuzz_TransferRoundTripPreservesAllSupply(uint256) (runs: 2000, μ: 159864, ~: 160452)\n[PASS] testFuzz_UnlimitedApprovalPersists(uint256) (runs: 2000, μ: 212404, ~: 213081)\n[PASS] test_ApprovalOverwriteAndRevocation() (gas: 141738)\n[PASS] test_DeployerCannotTakeHolderFundsWithoutApproval() (gas: 146203)\n[PASS] test_FactoryReceivesFullSupplyAndControlsDistribution() (gas: 515674)\n[PASS] test_FailedTransferFromRestoresSpentAllowance() (gas: 97248)\n[PASS] test_ForbiddenOpcodesAbsent() (gas: 323918)\n[PASS] test_InsufficientBalanceRollsBack() (gas: 44447)\n[PASS] test_LaunchIdentityAndWholeSupplyToConstructorCaller() (gas: 44888)\n[PASS] test_NoMintBurnOrAdminInterface() (gas: 890366)\n[PASS] test_TransferAndApprovalEvents() (gas: 166053)\n[PASS] test_TransferFromToZeroRestoresAllowance() (gas: 94783)\n[PASS] test_TransferToZeroCannotBurnSupply() (gas: 39463)\n[PASS] test_ZeroSenderRejected() (gas: 33232)\n[PASS] test_ZeroSpenderRejected() (gas: 30212)\n[PASS] test_ZeroTransfersAndEntireBalance() (gas: 181479)\n[PASS] test_ZeroValueToZeroAlsoReverts() (gas: 30356)\nSuite result: ok. 20 passed; 0 failed; 0 skipped; finished in 78.46ms (390.11ms CPU time)\n\nRan 1 test for test/Conservation.t.sol:ConservationTest\n[PASS] invariant_AllBalancesSumToFixedSupply() (runs: 256, calls: 16384, reverts: 0)\n\n╭-----------------+-----------+-------+---------+----------╮\n| Contract        | Selector  | Calls | Reverts | Discards |\n+==========================================================+\n| TransferHandler | delegated | 5367  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TransferHandler | direct    | 5466  | 0       | 0        |\n|-----------------+-----------+-------+---------+----------|\n| TransferHandler | revoke    | 5551  | 0       | 0        |\n╰-----------------+-----------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 739.11ms (738.42ms CPU time)\n\nRan 2 test suites in 742.07ms (817.57ms CPU time): 21 tests passed, 0 failed, 0 skipped (21 total tests)\n","passed":true},{"durationMs":148,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SPALACEToken.approve(address,uint256)\",\"SPALACEToken.transfer(address,uint256)\",\"SPALACEToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":42,\"REVIEW.md\":31,\"artifacts/asset-check.json\":61,\"artifacts/logo.png\":4103,\"artifacts/previews/options-at-64.png\":323,\"artifacts/previews/selected-at-32.png\":15,\"docs/abi/SPALACEToken.json\":304,\"foundry.toml\":15,\"launch.json\":24,\"logos/README.md\":13,\"logos/logo-1.png\":4103,\"logos/logo-2.png\":2944,\"logos/logo-3.png\":3962,\"logos/logo-4.png\":7348,\"logos/logo-5.png\":5507,\"logos/preview.html\":23,\"script/Deploy.s.sol\":24,\"scripts/check_assets.py\":128,\"scripts/check_manifest.py\":42,\"src/SPALACEToken.sol\":69,\"test/Conservation.t.sol\":73,\"test/SPALACEToken.t.sol\":286},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":280,"exitCode":0,"name":"slither","output":"slither: no results at low impact or above","passed":true},{"durationMs":201,"exitCode":0,"name":"aderyn","output":"[low] large-numeric-literal at src/SPALACEToken.sol:12: Large Numeric Literal","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"642ccebccb6e6c82e5e0c63e82559a21adfe60429815c009e43d0b8f9e53606b","verifiedTreeHash":"3c8625b26b531a0456a1f5a8f1f47a32ca1aeded","verifierVersion":"0.1.0+fdeb4d4a"},{"checks":[{"durationMs":1779,"exitCode":0,"name":"build","output":"Compiling 53 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.70s\nCompiler run successful!\n","passed":true},{"durationMs":509,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 22 tests for test/SPALACEToken.t.sol:SPALACETokenTest\n[PASS] testFuzz_FiniteAllowanceEnforcesCumulativeLimit(uint256,uint256) (runs: 256, μ: 196195, ~: 197327)\n[PASS] testFuzz_SelfTransferConservesBalance(uint256) (runs: 256, μ: 128820, ~: 129098)\n[PASS] testFuzz_TransferAboveBalanceNeverMutates(uint256,uint256) (runs: 256, μ: 102152, ~: 102363)\n[PASS] testFuzz_TransferRoundTripPreservesAllSupply(uint256) (runs: 256, μ: 159994, ~: 160546)\n[PASS] testFuzz_UnlimitedApprovalPersists(uint256) (runs: 256, μ: 212633, ~: 213241)\n[PASS] test_ApprovalOverwriteAndRevocation() (gas: 141804)\n[PASS] test_ConstructorEmitsWholeSupplyMintToFactory() (gas: 246352)\n[PASS] test_DeployerCannotTakeHolderFundsWithoutApproval() (gas: 146225)\n[PASS] test_FactoryReceivesFullSupplyAndControlsDistribution() (gas: 515674)\n[PASS] test_FailedTransferFromRestoresSpentAllowance() (gas: 97336)\n[PASS] test_ForbiddenOpcodesAbsent() (gas: 323918)\n[PASS] test_InsufficientBalanceRollsBack() (gas: 44469)\n[PASS] test_LaunchIdentityAndWholeSupplyToConstructorCaller() (gas: 44800)\n[PASS] test_NoMintBurnOrAdminInterface() (gas: 1458397)\n[PASS] test_TransferAndApprovalEvents() (gas: 166117)\n[PASS] test_TransferFromToZeroRestoresAllowance() (gas: 94893)\n[PASS] test_TransferToZeroCannotBurnSupply() (gas: 39463)\n[PASS] test_ZeroSenderRejected() (gas: 33143)\n[PASS] test_ZeroSpenderRejected() (gas: 30212)\n[PASS] test_ZeroTransfersAndEntireBalance() (gas: 181523)\n[PASS] test_ZeroValueToZeroAlsoReverts() (gas: 30356)\n[PASS] test_ZeroValueTransfersEmitEvents() (gas: 99840)\nSuite result: ok. 22 passed; 0 failed; 0 skipped; finished in 40.13ms (97.33ms CPU time)\n\nRan 12 tests for test/TokenEdges.t.sol:TokenEdgesTest\n[PASS] testFuzz_AnyNonzeroRecipientReceivesExactAmount(address,uint256) (runs: 256, μ: 77267, ~: 77946)\n[PASS] testFuzz_InvalidSpenderCannotChangeExistingApprovals(uint256) (runs: 256, μ: 96507, ~: 96469)\n[PASS] testFuzz_ZeroTransferFromPreservesAnyAllowance(uint256) (runs: 256, μ: 107030, ~: 107226)\n[PASS] test_ApprovalsAreIsolatedByHolderAndSpender() (gas: 411930)\n[PASS] test_HolderAlsoNeedsApprovalToUseTransferFrom() (gas: 192027)\n[PASS] test_MaximumFiniteApprovalIsConsumedAndCanBeRevoked() (gas: 150869)\n[PASS] test_MaximumTransferRejectedEvenWithUnlimitedAllowance() (gas: 102422)\n[PASS] test_NativeValueAndMalformedCallsCannotChangeTokenState() (gas: 126559)\n[PASS] test_NoTimeBasedInflationCooldownOrTransactionLimit() (gas: 585365)\n[PASS] test_RecipientCodeCannotBlockPlainTransfers() (gas: 320372)\n[PASS] test_RevokedUnlimitedApprovalCannotBeReused() (gas: 233863)\n[PASS] test_SelfTransfersStillEnforceBalanceAndRollbackApproval() (gas: 176315)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 43.08ms (99.20ms CPU time)\n\nRan 8 tests for test/PoolManager.t.sol:PoolManagerToken1Test\n[PASS] invariant_SwapsAndFeeClaimsPreserveSupplyAndSettleAllDebt() (runs: 32, calls: 768, reverts: 0)\n\n╭---------------------+-------------+-------+---------+----------╮\n| Contract            | Selector    | Calls | Reverts | Discards |\n+================================================================+\n| PoolSequenceHandler | collectFees | 407   | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| PoolSequenceHandler | trade       | 361   | 0       | 0        |\n╰---------------------+-------------+-------+---------+----------╯\n\n[PASS] testFuzz_ExactInputBuySellConservesTokens(uint256) (runs: 256, μ: 790925, ~: 791057)\n[PASS] test_BuySellAndCollectFeesThroughPoolManager() (gas: 1174474)\n[PASS] test_ExactOutputBuyAndSellSettleWithoutTokenTax() (gas: 719150)\n[PASS] test_InsufficientTokenBalanceRevertsWholeSwap() (gas: 840658)\n[PASS] test_OneUnitShortPaymentRevertsEntireBuyAndSell() (gas: 1436906)\n[PASS] test_SingleSidedLaunchAndDistributorTransferArriveWhole() (gas: 221780)\n[PASS] test_ZeroSwapAndLockedTakeCannotMoveValue() (gas: 262901)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 177.35ms (228.42ms CPU time)\n\nRan 8 tests for test/PoolManager.t.sol:PoolManagerToken0Test\n[PASS] invariant_SwapsAndFeeClaimsPreserveSupplyAndSettleAllDebt() (runs: 32, calls: 768, reverts: 0)\n\n╭---------------------+-------------+-------+---------+----------╮\n| Contract            | Selector    | Calls | Reverts | Discards |\n+================================================================+\n| PoolSequenceHandler | collectFees | 407   | 0       | 0        |\n|---------------------+-------------+-------+---------+----------|\n| PoolSequenceHandler | trade       | 361   | 0       | 0        |\n╰---------------------+-------------+-------+---------+----------╯\n\n[PASS] testFuzz_ExactInputBuySellConservesTokens(uint256) (runs: 256, μ: 790365, ~: 790367)\n[PASS] test_BuySellAndCollectFeesThroughPoolManager() (gas: 1173778)\n[PASS] test_ExactOutputBuyAndSellSettleWithoutTokenTax() (gas: 718753)\n[PASS] test_InsufficientTokenBalanceRevertsWholeSwap() (gas: 823829)\n[PASS] test_OneUnitShortPaymentRevertsEntireBuyAndSell() (gas: 1435514)\n[PASS] test_SingleSidedLaunchAndDistributorTransferArriveWhole() (gas: 221783)\n[PASS] test_ZeroSwapAndLockedTakeCannotMoveValue() (gas: 262900)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 183.16ms (221.65ms CPU time)\n\nRan 1 test for test/Conservation.t.sol:ConservationTest\n[PASS] invariant_AllBalancesAndAllowancesMatchModel() (runs: 64, calls: 4096, reverts: 0)\n\n╭-----------------+--------------------+-------+---------+----------╮\n| Contract        | Selector           | Calls | Reverts | Discards |\n+===================================================================+\n| TransferHandler | approve            | 607   | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| TransferHandler | delegated          | 615   | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| TransferHandler | direct             | 561   | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| TransferHandler | rejectOverBalance  | 574   | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| TransferHandler | rejectOverspend    | 612   | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| TransferHandler | rejectZeroReceiver | 563   | 0       | 0        |\n|-----------------+--------------------+-------+---------+----------|\n| TransferHandler | revoke             | 564   | 0       | 0        |\n╰-----------------+--------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 455.84ms (454.98ms CPU time)\n\nRan 5 test suites in 457.19ms (899.56ms CPU time): 51 tests passed, 0 failed, 0 skipped (51 total tests)\n","passed":true},{"durationMs":151,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"SPALACEToken.approve(address,uint256)\",\"SPALACEToken.transfer(address,uint256)\",\"SPALACEToken.transferFrom(address,address,uint256)\"],\"files\":{\".gitignore\":6,\"README.md\":52,\"REVIEW.md\":37,\"artifacts/asset-check.json\":61,\"artifacts/logo.png\":4103,\"artifacts/previews/options-at-64.png\":323,\"artifacts/previews/selected-at-32.png\":15,\"dist/404.html\":53,\"dist/assets/favicon-64.png\":28,\"dist/assets/logo-192.png\":107,\"dist/assets/logo-512.png\":388,\"dist/assets/og-image.png\":542,\"dist/css/style.css\":791,\"dist/index.html\":448,\"dist/js/app.js\":690,\"docs/abi/SPALACEToken.json\":304,\"foundry.toml\":15,\"launch.json\":24,\"logos/README.md\":13,\"logos/logo-1.png\":4103,\"logos/logo-2.png\":2944,\"logos/logo-3.png\":3962,\"logos/logo-4.png\":7348,\"logos/logo-5.png\":5507,\"logos/preview.html\":23,\"script/Deploy.s.sol\":24,\"scripts/check_assets.py\":128,\"scripts/check_manifest.py\":42,\"site/404.html\":53,\"site/assets/favicon-64.png\":28,\"site/assets/logo-192.png\":107,\"site/assets/logo-512.png\":388,\"site/assets/og-image.png\":542,\"site/css/style.css\":792,\"site/index.html\":448,\"site/js/app.js\":690,\"site/package-lock.json\":16,\"site/package.json\":19,\"site/scripts/build.mjs\":41,\"site/scripts/check.mjs\":51,\"site/scripts/preview.mjs\":48,\"site/scripts/verify.cjs\":206,\"site/tsconfig.json\":15,\"src/SPALACEToken.sol\":69,\"test/Conservation.t.sol\":162,\"test/PoolManager.t.sol\":361,\"test/README.md\":49,\"test/SPALACEToken.t.sol\":320,\"test/TokenEdges.t.sol\":199,\"test/helpers/PoolHarness.sol\":138,\"test/vendor/README.md\":20,\"test/vendor/solmate/LICENSE\":661,\"test/vendor/solmate/src/auth/Owned.sol\":44,\"test/vendor/v4-core/licenses/BUSL_LICENSE\":63,\"test/vendor/v4-core/licenses/MIT_LICENSE\":7,\"test/vendor/v4-core/src/ERC6909.sol\":90,\"test/vendor/v4-core/src/ERC6909Claims.sol\":23,\"test/vendor/v4-core/src/Extsload.sol\":64,\"test/vendor/v4-core/src/Exttload.sol\":40,\"test/vendor/v4-core/src/NoDelegateCall.sol\":33,\"test/vendor/v4-core/src/PoolManager.sol\":392,\"test/vendor/v4-core/src/ProtocolFees.sol\":71,\"test/vendor/v4-core/src/interfaces/IExtsload.sol\":21,\"test/vendor/v4-core/src/interfaces/IExttload.sol\":15,\"test/vendor/v4-core/src/interfaces/IHooks.sol\":155,\"test/vendor/v4-core/src/interfaces/IPoolManager.sol\":235,\"test/vendor/v4-core/src/interfaces/IProtocolFees.sol\":52,\"test/vendor/v4-core/src/interfaces/callback/IUnlockCallback.sol\":10,\"test/vendor/v4-core/src/interfaces/external/IERC20Minimal.sol\":48,\"test/vendor/v4-core/src/interfaces/external/IERC6909Claims.sol\":66,\"test/vendor/v4-core/src/libraries/BitMath.sol\":49,\"test/vendor/v4-core/src/libraries/CurrencyDelta.sol\":42,\"test/vendor/v4-core/src/libraries/CurrencyReserves.sol\":39,\"test/vendor/v4-core/src/libraries/CustomRevert.sol\":120,\"test/vendor/v4-core/src/libraries/FixedPoint128.sol\":8,\"test/vendor/v4-core/src/libraries/FixedPoint96.sol\":10,\"test/vendor/v4-core/src/libraries/FullMath.sol\":117,\"test/vendor/v4-core/src/libraries/Hooks.sol\":343,\"test/vendor/v4-core/src/libraries/LPFeeLibrary.sol\":79,\"test/vendor/v4-core/src/libraries/LiquidityMath.sol\":20,\"test/vendor/v4-core/src/libraries/Lock.sol\":28,\"test/vendor/v4-core/src/libraries/NonzeroDeltaCount.sol\":35,\"test/vendor/v4-core/src/libraries/ParseBytes.sol\":29,\"test/vendor/v4-core/src/libraries/Pool.sol\":620,\"test/vendor/v4-core/src/libraries/Position.sol\":103,\"test/vendor/v4-core/src/libraries/ProtocolFeeLibrary.sol\":47,\"test/vendor/v4-core/src/libraries/SafeCast.sol\":60,\"test/vendor/v4-core/src/libraries/SqrtPriceMath.sol\":292,\"test/vendor/v4-core/src/libraries/StateLibrary.sol\":345,\"test/vendor/v4-core/src/libraries/SwapMath.sol\":108,\"test/vendor/v4-core/src/libraries/TickBitmap.sol\":121,\"test/vendor/v4-core/src/libraries/TickMath.sol\":238,\"test/vendor/v4-core/src/libraries/TransientStateLibrary.sol\":48,\"test/vendor/v4-core/src/libraries/UnsafeMath.sol\":29,\"test/vendor/v4-core/src/types/BalanceDelta.sol\":72,\"test/vendor/v4-core/src/types/BeforeSwapDelta.sol\":38,\"test/vendor/v4-core/src/types/Currency.sol\":118,\"test/vendor/v4-core/src/types/PoolId.sol\":17,\"test/vendor/v4-core/src/types/PoolKey.sol\":22,\"test/vendor/v4-core/src/types/Slot0.sol\":95},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"8c58b1d2ddc045eadac7c3d3310a345c118f98c73fdb7f31c6871ebd42099bd4","verifiedTreeHash":"0ab2a2c90f341fba75b472824f147365054e7159","verifierVersion":"0.1.0+fdeb4d4a"}]}