{"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":"d1c52bff-eeb4-45d9-b18f-a415e48851ec","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":"b9dab3ab42e1b55bb03ea901e5c2df043888eb69a39b37c582ee5808cd200cfa","dependsOn":["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":"385222991e0934dbc06ce8e102939de62cadb88423c1b9873e750d59e31920ec","dependsOn":["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":"147944144de1b7f47fd6d943e196252f2157c694ff8a79177652a3e1a300182b","dependsOn":["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":"4a825a3f212e2b34ca24328290ce7dba093e97cdce9d7a8767bc632811df32ba","dependsOn":["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":"f46dad0b0dd52e3e63df33e07502182f4e99c64e085c04f672f8f744b674efa3","dependsOn":["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":"0ae6ff87b4479f745b7bd3a1646437a68213678006d7ac4a85159f90ae046391","dependsOn":["build_website"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"d59561da3b378461b7c749f6bd5084477d44993aa94972ddea90f542535751df","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"897b908f0fba768aca1eebb27575eed88519a79d39aa6646af26dc7f53aa68c3","dependsOn":[],"execution":{"mustProduce":["dist/index.html"],"network":true,"optionalTools":["browser"],"profile":"foundry","requires":["network"],"skillHash":"a60bc8b42446c13d993341179fe13c712a5addb118fc532fb2d15e71f912efc8","skillId":"build-website","tools":[]},"key":"build_website","kind":"code","role":"implement","skillHash":"a60bc8b42446c13d993341179fe13c712a5addb118fc532fb2d15e71f912efc8","skillId":"build-website","state":"accepted"},{"acceptedSubmissionHash":"c18bc701c53186b69c3162098447c15284c7fe299c43250932f1ef0402e22206","dependsOn":["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":"596f0964e13c0a6f694ef2491a8c8ae9f6cde80fe1d7a865ad9a3cc973a4e66b","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","tools":[]},"key":"write_foundry_tests","kind":"code","role":"tests","skillHash":"4c76766b00591dfe982fe85d3de589fdb2f810e5137c301155d1c5e36a1d3b23","skillId":"write-foundry-tests","state":"accepted"}],"objective":"[SIMD-LAUNCH]\nA custom token: Sunflower Garden (SUN).\nToken name: Sunflower Garden\nToken symbol: SUN\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.\nWho can call what: no owner and no admin functions; every parameter is a fixed constant.\n\nWhat it does:\n1. Sunflower Garden Token (SUNToken) is an ERC-20 token with 1,000,000,000 total supply and 18 decimals.\n2. Entire supply minted once to the deployer for the launch factory's distribution, with 90% destined for the Uniswap v4 pool; no remainder tokens left.\n3. A fixed 0.5% creator tax on all transfers FROM the Uniswap v4 PoolManager (address 0x8366a39cc670b4001a1121b8f6a443a643e40951) is sent directly to the immutable wallet 0xEeaF04a41aC45A605E30dc6a41A44E6F75Ddf8b6.\n4. Buyers receive tokens net of the 0.5% tax.\n5. Transfers TO the PoolManager, including sells and the launch factory pool seed, are exempt from any tax to ensure proper Uniswap v4 settlement.\n6. Plain wallet-to-wallet transfers carry no fee or tax.\n7. No ownership or admin functions exist; all parameters including fee rate and recipient address are compile-time constants.\n8. The token pairs with IMD on Uniswap v4 with a fixed 1.25% pool fee.\n9. The 10% swarm allocation (100,000,000 tokens) is managed externally and not minted or distributed by the token contract.\n\nWho can call what:\n- No owner, no admin powers, immutable parameters.\n- Anyone may transfer tokens subject to the fixed fee rules.\n\nTests:\n1. Transferring tokens FROM the PoolManager address results in a 0.5% deduction sent to the creator wallet.\n2. Transfers TO the PoolManager succeed with no tax deducted.\n3. Transfers between regular wallets occur with zero fees.\n4. Total supply is exactly 1,000,000,000 tokens with 18 decimals.\n5. Deployer holds full supply initially, factory distributes supply including 90% to pool and 10% reserved for swarm.\n6. No function allows changing fee rate or recipient after deployment.\n7. Verify Uniswap v4 pool interaction works correctly given tax on buys but not sells.\n8. Confirm no owner powers exist and contract parameters are immutable.\n9.\n\nMechanics specification (authoritative: where anything above differs, follow these exactly):\nM1. Creator tax (same idea as live launches #1000, #747 and #843): 0.5% of every buy (transfers FROM the Uniswap v4 PoolManager 0x8366a39cc670b4001a1121b8f6a443a643e40951) is sent to the fixed wallet 0xEeaF04a41aC45A605E30dc6a41A44E6F75Ddf8b6, an immutable constant; the buyer receives the amount minus the tax. Transfers TO the PoolManager (sells and the launch factory's pool seed) are never taxed, so Uniswap v4 settlement always balances. Plain wallet-to-wallet transfers pay no tax. No owner can change the rate or the wallet.\n\nBuild requirements (mandatory):\n- Context: an ordinary, legitimate token launch on Robinhood Chain. 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: SUNToken. 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: Robinhood Chain (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 0x8366a39cc670b4001a1121b8f6a443a643e40951.\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 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, fee 12500, tickSpacing 60, initialPrice \"125270724187523965593206900\" (paired-currency minor units per SUN minor unit with SUN 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.\nLogo: a bold, clean logo for Sunflower Garden ($SUN), A community-driven token for the Sunflower Garden ecosystem.; readable at 64 px, no real brands, people or copyrighted characters","parentJobId":null,"planHash":"cf29eb4381d003355c70237064f8f792e8acc920e8787c21f2f6480dc93bcf4d","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"d1c52bff-eeb4-45d9-b18f-a415e48851ec","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1905-sunflower-garden"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"51081","feedbackHash":"225efe84c71b0b3c4c70be73243eab19f526dcc50884a7aba6b75ffa4b36cb5c","nodeKey":"audit_economics","submissionHash":"b9dab3ab42e1b55bb03ea901e5c2df043888eb69a39b37c582ee5808cd200cfa","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51885","feedbackHash":"68409abe5c6828f5f85adfcf8ce57eb483cf465d3846e18226bc73b1c4c452df","nodeKey":"audit_flow","submissionHash":"385222991e0934dbc06ce8e102939de62cadb88423c1b9873e750d59e31920ec","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51225","feedbackHash":"e2b205a8bd586dd01c3ccb05b6e9e449371f07a6f13a35fbf5def7963cf6a7b8","nodeKey":"audit_judge","submissionHash":"147944144de1b7f47fd6d943e196252f2157c694ff8a79177652a3e1a300182b","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51886","feedbackHash":"f086d3bf1bfe5f3ddb267d7ea90d63388a386bdf2dea425b71b8ba070bb13ca6","nodeKey":"audit_math","submissionHash":"4a825a3f212e2b34ca24328290ce7dba093e97cdce9d7a8767bc632811df32ba","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52681","feedbackHash":"b005d894e3ea76d8d3984ad851fc4f9ab31a7156ed56368016315779f857fa15","nodeKey":"audit_permissions","submissionHash":"f46dad0b0dd52e3e63df33e07502182f4e99c64e085c04f672f8f744b674efa3","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"52641","feedbackHash":"16dd706622247842bcd4d6c354db452d829d7c8fe1813e9476fd29e98c1dcfa7","nodeKey":"build_contract_project","submissionHash":"0ae6ff87b4479f745b7bd3a1646437a68213678006d7ac4a85159f90ae046391","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52550","feedbackHash":"5a3cb2b15b470c07136acee991de66ad42c02812004b30d94f0525a91592b457","nodeKey":"build_website","submissionHash":"897b908f0fba768aca1eebb27575eed88519a79d39aa6646af26dc7f53aa68c3","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"52144","feedbackHash":"ddf6815ad933919650a67f326780d8e7e5920c780a5bc95ed86ebc2d26ceaab5","nodeKey":"manifest","submissionHash":"c18bc701c53186b69c3162098447c15284c7fe299c43250932f1ef0402e22206","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"51746","feedbackHash":"4ad07142414624cafe6359782c5a66deef2c25c1d7a4c98307cf111876938b89","nodeKey":"write_foundry_tests","submissionHash":"596f0964e13c0a6f694ef2491a8c8ae9f6cde80fe1d7a865ad9a3cc973a4e66b","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"3c0173ecb5f8d4629d0865ca80049417e7a02d3cbeac8b5f506c0061e774fa4d","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"cf93ae8d1f8c20f7b07001d5d7404e49d0f10f7d46b41034dd08dd8e74a6056a","device":"803eeae3d8b63de3","findings":[],"hash":"0ae6ff87b4479f745b7bd3a1646437a68213678006d7ac4a85159f90ae046391","nodeId":"8b10cdd9-bfee-452c-a7fc-45095cacb9a9","outcome":"completed","summary":"The deliverable is complete and verified locally.\n\n**What was already in place** from earlier accepted work and left as is: `src/SUNToken.sol` with the fixed 1e27 mint to the deployer, the 0.5% creator tax on transfers out of the PoolManager, untaxed transfers into it, free wallet transfers, no owner or setters, no delegatecall or selfdestruct. The pinned foundry.toml and launch.json match the brief exactly (solc 0.8.26, cancun, optimizer, bytecode_hash none; kind, token, contracts, pool, economics and notes with the specified values).\n\n**What I added**\n\n- `test/SUNTokenSmoke.t.sol`: twelve short scenarios, one per numbered check in the brief, plus three revert paths (insufficient balance, missing allowance, zero receiver) and a transferFrom-out-of-PoolManager case showing the tax cannot be bypassed. Deployment is done from a distinct factory address so the mint-to-msg.sender rule is visible. No fuzz or invariant tests, as instructed.\n- README: a paragraph describing the three suites and an updated validation line.\n\n**Verification** with Foundry 1.5.1 and solc 0.8.26, using the verifier's fuzz seed:\n\n| Check | Result |\n| --- | --- |\n| forge build | success, lint hints only on test files |\n| forge test | 27 passed, 0 failed across 4 suites |\n| forge fmt --check | clean |\n\nForge was installed under `test/scratch/`, which is discarded before submission, so nothing outside the allowed paths changed. The token has no constructor arguments and taxes only outflows from the PoolManager, so the pinned protected floor test's seed, swarm transfer, claim, buy and sell flows all move whole amounts. One documented design consequence remains: liquidity withdrawals from the PoolManager are taxed like buys, which the README states.","treeHash":"edaa732c4ac443f027efbdccaebfe526247e48ed","usage":{"cachedInputTokens":1170982,"inputTokens":546,"model":"claude-fable-5-1","outputTokens":15908,"runtime":"claude","turns":31,"wallClockMs":225356}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"4dd74fd7c315da80","findings":[{"citation":"resolved","description":"Merged from four specialist reports (audit_permissions, audit_flow, audit_math, audit_economics), all the same root cause. The creator tax exists only in SUNToken._transfer and fires only on an ERC-20 transfer whose `from` is the PoolManager. Uniswap v4 flash accounting gives a swapper a second standard way to realise a positive SUN delta: PoolManager.mint(to, uint256(uint160(SUN)), amount) credits an ERC-6909 claim and performs no ERC-20 transfer (lib/v4-core/src/PoolManager.sol mint/burn settle the delta through _accountDelta only). Claims are transferable with PoolManager.transfer/transferFrom/approve/setOperator and can later pay a sell through PoolManager.burn. A trader, arbitrage bot or claims-based router can therefore buy, hold, hand off and sell SUN inside the PoolManager while SUNToken.balanceOf(CREATOR_WALLET) never changes; tax is collected only if and when someone finally calls take() for SUN. I reproduced this by running the audit_flow proof (.imd/reads/proofs/Proof_3331bf898a02.t.sol, copied under test/scratch/ and run with forge test --match-path): it fails on the current code with 'creator tax not charged on claims buy', as its finding states. Calibration: the code implements mechanics spec M1 to the letter (M1 defines a buy as a transfer FROM the PoolManager, the same mechanism as live launches #1000, #747 and #843), no holder loses funds and no funds go to a wrong party; the creator simply receives nothing on claims-settled volume. The brief's business statements 'Buyers receive tokens net of the 0.5% tax' and 'a 0.5% creator tax on all buys', the site copy 'Buys receive 0.5% less SUN due to the creator tax' and the launch.json notes do not mention this limitation. A plain ERC-20 cannot observe claim minting, so closing the gap would need a v4 hook charging on the swap delta, which changes the agreed design and is the requester's scope decision. The in-scope remedy is to disclose the limitation in launch.json notes, README and the site, or for the requester to accept the M1 definition explicitly. Severity low, as all four specialists rated it: avoidable creator revenue, no loss or misdirection of holder funds.","line":65,"path":"src/SUNToken.sol","reproduction":"State: SUNToken deployed; the vendored PoolManager (lib/v4-core) constructed in place at 0x8366a39CC670B4001A1121B8F6A443A643e40951; an ERC-20 stand-in at 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127; pool SUN/IMD fee 12500 tickSpacing 60 initialised at the launch price and seeded single-sided with 1e24 liquidity by the deployer (exactly as test/UniswapV4.t.sol does). A trader contract holds 1e18 IMD. Inside one PoolManager.unlock the trader calls: (1) swap(key, {zeroForOne: IMD->SUN, amountSpecified: -1e18, limit}) -> SUN delta +G with G > 200 (G = 390099142556557378834645 in the SUN-first ordering); (2) sync(IMD); IMD.transfer(PoolManager, 1e18); settle(); (3) PoolManager.mint(trader, uint256(uint160(address(SUN))), G) instead of take(). Expected per the brief ('0.5% of every buy is sent to the creator wallet', 'buyers receive net'): SUNToken.balanceOf(0xEeaF04a41aC45A605E30dc6a41A44E6F75Ddf8b6) == G/200 == 1950495712782786894173. Actual: 0; PoolManager.balanceOf(trader, sunId) == G (gross, untaxed); SUNToken.balanceOf(PoolManager) unchanged. Second unlock: swap(key, SUN->IMD, -G); PoolManager.burn(trader, sunId, G); take(IMD, trader, out). Actual after the full cycle: creator wallet still 0, trader received IMD, claims 0, SUNToken.balanceOf(PoolManager) equals its pre-buy value; a complete buy and sell occurred with zero creator tax. Control: the same G redeemed with take(SUN, trader, G) pays exactly G/200 to the creator (test/UniswapV4.t.sol test_ActualV4SingleSidedSeedBuyAndSell). Run: copy .imd/reads/proofs/Proof_3331bf898a02.t.sol to test/scratch/ClaimsBypass.t.sol and run `forge test --match-path test/scratch/ClaimsBypass.t.sol` -> [FAIL: creator tax not charged on claims buy] test_BuyAndSellThroughClaimsPaysNoCreatorTax (verified on this tree).","severity":"low","snippet":"        uint256 tax = from == POOL_MANAGER && to != POOL_MANAGER ? (value * CREATOR_TAX_BPS) / BPS_DENOMINATOR : 0;","title":"Buys settled as Uniswap v4 ERC-6909 claims (PoolManager.mint/burn/transfer) never pay the 0.5% creator tax; the 'every buy' and 'buyers receive net' statements hold only for buys taken out as ERC-20"},{"citation":"resolved","description":"Merged from audit_permissions and audit_economics. Because the predicate is purely `from == POOL_MANAGER && to != POOL_MANAGER`, the tax also fires on PoolManager.take() issued to settle a negative-liquidity modifyLiquidity (an LP withdrawing its own SUN, including the launch seed position if it is ever withdrawn or migrated), on fee collection by a zero-liquidity modifyLiquidity, and on ProtocolFees.collectProtocolFees(recipient, SUN, amount) by the PoolManager's protocol fee controller (lib/v4-core/src/ProtocolFees.sol, currency.transfer from the PoolManager). The PoolManager stays solvent (its SUN balance and the settled delta both fall by the gross amount), so nothing breaks; the LP or protocol receives 0.5% less than its position says and the creator receives it. This follows mechanics spec M1 exactly and is disclosed in the source comment, README.md ('This also taxes liquidity withdrawals and any other PoolManager outflow'), launch.json notes ('including buys and liquidity withdrawals') and the site ('applies to every transfer out of PoolManager, including liquidity withdrawals'). Not a defect; recorded as the trust assumption LPs and the v4 protocol-fee controller accept. The token cannot distinguish a withdrawal from a buy without a hook, so no change is proposed.","line":5,"path":"src/SUNToken.sol","reproduction":"State: pool seeded with 1e24 liquidity by the test contract as LP (test/UniswapV4.t.sol setUp + unlock(abi.encode(uint8(0), int256(1e24)))). Call: unlock -> modifyLiquidity(key, {lower, upper, -1e24, 0}) then take(SUN, lp, gross) for the positive SUN delta. Expected if only buys were taxed: lp SUN +gross, creator +0. Actual: lp receives gross - gross/200 and CREATOR_WALLET receives gross/200. Reproduced by the existing passing tests test_ActualV4WithdrawalIsAlsoTaxedOnPoolOutflow and test_AccruedLPFeesSettleWithTaxOnlyOnSunOutflow in test/UniswapV4.t.sol (both currency orderings), run with `forge test --match-path test/UniswapV4.t.sol`.","severity":"info","snippet":"/// @dev Any transfer out of PoolManager is taxed, including withdrawals, not just swaps.","title":"Trust assumption: the 0.5% is charged on every SUN outflow from the PoolManager, not only buys (LP withdrawals, LP fee collection, protocol-fee collection all pay the creator)"},{"citation":"resolved","description":"README.md line 99 and DESIGN.md lines 28 and 57 point the reader to artifacts/validation.md, artifacts/browser-validation.json, artifacts/mobile.jpg and artifacts/desktop.jpg for measured contrast, browser and screenshot evidence. No artifacts/ directory exists in the repository (ls artifacts -> No such file or directory; git ls-files shows none; the repository's git exclude rules list artifacts/, so anything scripts/browser-check.mjs wrote there was never committed), so the claims about browser checks, axe scans and screenshots cannot be verified from the deliverable. Documentation accuracy only; no code or manifest impact. Fix: either commit the evidence files or reword the README/DESIGN.md to say the evidence is generated locally by scripts/browser-check.mjs and not shipped.","line":99,"path":"README.md","reproduction":"Run `ls artifacts` or `git ls-files artifacts` at the repository root. Expected (per README.md:99 and DESIGN.md:28,57): the four named files exist. Actual: the directory does not exist and no file under artifacts/ is tracked.","severity":"info","snippet":"Actual results are in `artifacts/validation.md` and `artifacts/browser-validation.json`. Screenshots are `artifacts/mobile.jpg` and `artifacts/desktop.jpg`. The design system is documented in `DESIGN.md`.","title":"README and DESIGN.md cite validation evidence under artifacts/ that is not in the tree"}],"hash":"147944144de1b7f47fd6d943e196252f2157c694ff8a79177652a3e1a300182b","nodeId":"6628be48-041f-48ed-b792-9a0d0e870407","outcome":"completed","summary":"Review complete. `.imd-findings.json` is written, valid, and the working tree is clean apart from the ignored findings file.\n\n**Outcome:** no critical, high or medium defects. The SUNToken code matches the authoritative mechanics spec M1 exactly, the full suite passes, and the manifest validates against the schema rules.\n\nWhat I kept, after reproducing each specialist finding against the tree:\n\n- **Low, merged from all four specialists:** buys settled as Uniswap v4 ERC-6909 claims pay no creator tax. PoolManager.mint, burn, transfer and transferFrom move SUN inside the PoolManager without an ERC-20 transfer, so the predicate at `src/SUNToken.sol:65` never fires. I ran the audit_flow proof from `test/scratch/` and it fails on this code as stated. This is in spec per M1 and cannot be fixed inside the token without a hook, so the in-scope remedy is disclosure in the notes, README and site, or an explicit requester decision.\n- **Info, merged from two specialists:** every SUN outflow from the PoolManager is taxed, including LP withdrawals, fee collection and protocol-fee collection. In spec, disclosed in source, README, notes and site, and reproduced by existing passing tests. Recorded as a trust assumption.\n- **Info, my own:** README.md and DESIGN.md point to validation evidence under artifacts/ that is not in the tree, because the repo's exclude rules drop that directory.\n\nDropped: the rounding-down note, which is documented and standard, and nothing else from the specialists failed to reproduce. The static-analysis lead about large numeric literals is cosmetic.\n\nCoverage answers all 24 entry points plus four invariants. My own pass found no missed defect: no constructor arguments, no owner, no forbidden opcodes, overflow impossible at a 1e27 supply, inflows to the PoolManager exact so settle balances, and the protected floor's seed, buy and sell flows all hold.","treeHash":null,"usage":{"cachedInputTokens":979967,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":18925,"runtime":"claude","turns":23,"wallClockMs":296692}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"aca5d7170d77c721","findings":[{"citation":"resolved","description":"The creator tax is charged only inside SUNToken._transfer when from == POOL_MANAGER. In Uniswap v4 a swap's output does not have to leave the PoolManager as an ERC-20: the taker may call PoolManager.mint(to, currency.toId(), amount) and hold the SUN as ERC-6909 claim tokens, later pay a sell with PoolManager.burn(from, id, amount), and move claims between wallets with PoolManager.transfer/transferFrom (ERC-6909). None of those calls invoke SUNToken, so a trader can buy SUN, hold it, transfer it and sell it back into the pool while SUNToken.balanceOf(CREATOR_WALLET) never changes. The tax is only collected when someone finally calls PoolManager.take for SUN. The mechanics spec M1 literally defines a buy as a transfer FROM the PoolManager, so the code matches the letter of M1; the business statement 'a 0.5% creator tax on all buys' and test 1 are not met for claims-settled buys. A plain ERC-20 cannot observe claim minting, so closing this gap requires a v4 hook (e.g. afterSwap taking the fee) or accepting and documenting the limitation; either is a scope decision for the requester, not a one-line fix. Severity low: no funds are lost or misdirected; the creator's revenue is avoidable by any trader who uses claim-based settlement (routers that keep ERC-6909 balances, or a custom unlock callback as in the reproduction).","line":65,"path":"src/SUNToken.sol","proof":"// SPDX-License-Identifier: MIT\npragma solidity 0.8.26;\n\nimport {SUNToken} from \"src/SUNToken.sol\";\nimport {PoolManager} from \"v4-core/src/PoolManager.sol\";\nimport {IPoolManager} from \"v4-core/src/interfaces/IPoolManager.sol\";\nimport {IUnlockCallback} from \"v4-core/src/interfaces/callback/IUnlockCallback.sol\";\nimport {IHooks} from \"v4-core/src/interfaces/IHooks.sol\";\nimport {PoolKey} from \"v4-core/src/types/PoolKey.sol\";\nimport {Currency, CurrencyLibrary} from \"v4-core/src/types/Currency.sol\";\nimport {BalanceDelta} from \"v4-core/src/types/BalanceDelta.sol\";\nimport {ModifyLiquidityParams, SwapParams} from \"v4-core/src/types/PoolOperation.sol\";\nimport {TickMath} from \"v4-core/src/libraries/TickMath.sol\";\n\ninterface Vm {\n    function etch(address, bytes calldata) external;\n    function prank(address) external;\n}\n\ncontract PairForTest {\n    mapping(address => uint256) public balanceOf;\n    function mint(address to, uint256 amount) external { balanceOf[to] += amount; }\n    function transfer(address to, uint256 amount) external returns (bool) {\n        balanceOf[msg.sender] -= amount; balanceOf[to] += amount; return true;\n    }\n}\n\n/// @dev A trader that settles SUN output as ERC-6909 claims (PoolManager.mint) and pays SUN input by\n/// burning claims (PoolManager.burn). SUN never leaves PoolManager as an ERC-20, so SUNToken._transfer\n/// with from == POOL_MANAGER never runs and the creator tax is never charged.\ncontract ClaimsTrader is IUnlockCallback {\n    IPoolManager immutable manager;\n    SUNToken immutable sun;\n    address immutable pair;\n    PoolKey key;\n    constructor(IPoolManager m, SUNToken s, address p, PoolKey memory k) { manager = m; sun = s; pair = p; key = k; }\n\n    function buyWithClaims(uint256 pairIn) external { manager.unlock(abi.encode(uint8(1), pairIn)); }\n    function sellWithClaims(uint256 sunIn) external { manager.unlock(abi.encode(uint8(2), sunIn)); }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        require(msg.sender == address(manager));\n        (uint8 op, uint256 amount) = abi.decode(data, (uint8, uint256));\n        bool sunFirst = address(sun) < pair;\n        bool zeroForOne = op == 1 ? !sunFirst : sunFirst; // buy: pair in; sell: sun in\n        BalanceDelta d = manager.swap(key, SwapParams(zeroForOne, -int256(amount), zeroForOne ? TickMath.MIN_SQRT_PRICE + 1 : TickMath.MAX_SQRT_PRICE - 1), \"\");\n        int128 sunDelta = sunFirst ? d.amount0() : d.amount1();\n        int128 pairDelta = sunFirst ? d.amount1() : d.amount0();\n        Currency sunC = Currency.wrap(address(sun));\n        Currency pairC = Currency.wrap(pair);\n        if (op == 1) {\n            // pay pair token (ERC-20), keep SUN as claims inside PoolManager\n            manager.sync(pairC);\n            PairForTest(pair).transfer(address(manager), uint256(-int256(pairDelta)));\n            manager.settle();\n            manager.mint(address(this), sunC.toId(), uint256(int256(sunDelta)));\n        } else {\n            // pay SUN by burning claims, take pair token out\n            manager.burn(address(this), sunC.toId(), uint256(-int256(sunDelta)));\n            manager.take(pairC, address(this), uint256(int256(pairDelta)));\n        }\n        return \"\";\n    }\n}\n\ncontract ClaimsBypassTest is IUnlockCallback {\n    Vm constant vm = Vm(address(uint160(uint256(keccak256(\"hevm cheat code\")))));\n    address constant POOL = 0x8366a39CC670B4001A1121B8F6A443A643e40951;\n    address constant PAIR = 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127;\n    SUNToken token;\n    IPoolManager manager;\n    PoolKey key;\n    int24 lower; int24 upper;\n\n    function setUp() public {\n        token = new SUNToken();\n        vm.etch(POOL, abi.encodePacked(type(PoolManager).creationCode, abi.encode(address(this))));\n        (bool ok, bytes memory runtime) = POOL.call(\"\");\n        require(ok && runtime.length > 0);\n        vm.etch(POOL, runtime);\n        manager = IPoolManager(POOL);\n        vm.etch(PAIR, address(new PairForTest()).code);\n        bool sunFirst = address(token) < PAIR;\n        key = PoolKey(Currency.wrap(sunFirst ? address(token) : PAIR), Currency.wrap(sunFirst ? PAIR : address(token)), 12500, 60, IHooks(address(0)));\n        uint160 price = sunFirst ? uint160(125270724187523965593206900) : uint160(50108289675009586237282760313921);\n        int24 tick = manager.initialize(key, price);\n        int24 aligned = (tick / 60) * 60;\n        if (sunFirst) { lower = aligned + 60; upper = lower + 1200; } else { upper = aligned - 60; lower = upper - 1200; }\n        manager.unlock(abi.encode(int256(1e24)));\n    }\n\n    function unlockCallback(bytes calldata data) external returns (bytes memory) {\n        int256 liq = abi.decode(data, (int256));\n        (BalanceDelta d,) = manager.modifyLiquidity(key, ModifyLiquidityParams(lower, upper, liq, bytes32(0)), \"\");\n        _settle(key.currency0, d.amount0());\n        _settle(key.currency1, d.amount1());\n        return \"\";\n    }\n\n    function _settle(Currency c, int128 d) private {\n        if (d < 0) {\n            manager.sync(c);\n            SUNToken(Currency.unwrap(c)).transfer(POOL, uint256(-int256(d)));\n            manager.settle();\n        }\n    }\n\n    function test_BuyAndSellThroughClaimsPaysNoCreatorTax() public {\n        ClaimsTrader trader = new ClaimsTrader(manager, token, PAIR, key);\n        PairForTest(PAIR).mint(address(trader), 1 ether);\n        uint256 poolBefore = token.balanceOf(POOL);\n        trader.buyWithClaims(1 ether);\n        uint256 claims = manager.balanceOf(address(trader), Currency.wrap(address(token)).toId());\n        require(claims > 200, \"no SUN bought\");\n        // Expected per spec M1: 0.5% of the buy reaches the creator. Actual: nothing.\n        require(token.balanceOf(token.CREATOR_WALLET()) == claims / 200, \"creator tax not charged on claims buy\");\n        // Sell everything back; still no ERC-20 movement out of the PoolManager.\n        trader.sellWithClaims(claims);\n        require(manager.balanceOf(address(trader), Currency.wrap(address(token)).toId()) == 0, \"claims not burned\");\n        require(PairForTest(PAIR).balanceOf(address(trader)) > 0, \"no pair out\");\n        require(token.balanceOf(POOL) == poolBefore, \"pool ERC-20 balance moved\");\n    }\n}","reproduction":"State: SUNToken deployed; PoolManager at 0x8366a39CC670B4001A1121B8F6A443A643e40951 (vendored v4-core built in place); SUN/IMD pool (fee 12500, tickSpacing 60) initialized at the launch price and seeded single-sided with 1e24 liquidity. Trader contract holds 1 IMD (test pair token at 0x5F7Bb59365ce557C26dbcAa4EE9d39A4b95B7127). Calls (one unlock): PoolManager.swap(key, {zeroForOne: IMD->SUN, amountSpecified: -1e18, limit}, '') ; sync(IMD); IMD.transfer(PoolManager, 1e18); settle(); PoolManager.mint(trader, SUN.toId(), sunDelta). Expected (spec M1 / test 1): SUNToken.balanceOf(0xEeaF04a41aC45A605E30dc6a41A44E6F75Ddf8b6) == sunDelta/200. Actual: 0; the trader holds sunDelta ERC-6909 claims (PoolManager.balanceOf(trader, id) == sunDelta), and SUNToken.balanceOf(PoolManager) is unchanged. Second unlock: swap(SUN->IMD, -sunDelta); PoolManager.burn(trader, SUN.toId(), sunDelta); take(IMD, trader, out). Creator balance still 0; the pool's SUN ERC-20 balance equals the value before the first swap. Run: forge test --match-path test/scratch/ClaimsBypass.t.sol -> [FAIL: creator tax not charged on claims buy]. The same holds for PoolManager.transfer(to, id, amount) of SUN claims between wallets (an untaxed hand-off of bought SUN).","severity":"low","snippet":"        uint256 tax = from == POOL_MANAGER && to != POOL_MANAGER ? (value * CREATOR_TAX_BPS) / BPS_DENOMINATOR : 0;","title":"Buys settled as Uniswap v4 ERC-6909 claims (PoolManager.mint/burn) never pay the 0.5% creator tax"}],"hash":"385222991e0934dbc06ce8e102939de62cadb88423c1b9873e750d59e31920ec","nodeId":"60e3b0a3-3295-4f93-828e-86521b5811c6","outcome":"completed","summary":"Review complete. The findings file is written and the working tree has no tracked changes.\n\n**Outcome:** The token contract `src/SUNToken.sol` behaves as the mechanics spec M1 requires on every ERC-20 path I traced. I found one substantiated low-severity gap and no critical, high or medium defects.\n\n**Finding 1 (low), src/SUNToken.sol:65.** The creator tax is only charged when SUNToken's own transfer runs with the PoolManager as sender. In Uniswap v4 a buyer can instead settle swap output as ERC-6909 claims with PoolManager.mint, hold and hand off those claims with the manager's ERC-6909 transfer functions, and later pay a sell by burning them. No SUNToken call happens, so the creator wallet receives nothing for that round trip. I reproduced this against the vendored PoolManager built at the real address with a seeded pool. The scratch test fails on the current code with \"creator tax not charged on claims buy\", and its source is attached as the finding's proof. The code matches the letter of M1, which defines a buy as a transfer from the PoolManager, so I rated it low and noted that closing it would need a v4 hook or an accepted, documented limitation rather than a token-only fix.\n\n**What held:**\n- Transfer, transferFrom and approve: zero-address checks, balance check before the unchecked debit, tax arithmetic cannot overflow, credits always sum to the debit, supply fixed at 1e27 with no mint or burn after the constructor.\n- Launch flows: factory to distributor, seed into the PoolManager, distributor claims and the zero remainder to the dead address are all untaxed because none originates from the PoolManager.\n- PoolManager integration: take is the only SUN outflow and is taxed consistently; sync and settle see exact inflows; swaps, liquidity changes, donations, protocol fee collection and the static 1.25 percent fee all behave as intended.\n- launch.json: exact key set, empty constructorArgs matching the parameterless constructor, correct supply, lowercase addresses, economics copied verbatim, notes about 1,000 characters, initialPrice consistent with the 2500 IMD opening cap.\n- The existing 51-test suite, including both currency orderings against the real PoolManager, passes.\n\n**Coverage:** all 24 listed entry points have a row, plus three invariant rows. Four PoolManager ERC-6909 functions point to finding 1; the rest are marked holds with a one-line reason. Not covered: live Robinhood Chain bytecode of the PoolManager and IMD, the external launch factory and Merkle distributor, and the protected floor tests, which import files that are not in this tree.","treeHash":null,"usage":{"cachedInputTokens":886885,"inputTokens":322,"model":"claude-fable-5-1","outputTokens":22247,"runtime":"claude","turns":23,"wallClockMs":355702}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"dd3018ab6b18e7bc","findings":[{"citation":"resolved","description":"Seam: boundary x invariant (Numerical Gap guide, seam 3). The invariant the brief states is '0.5% of every buy is sent to the creator wallet'. The only place that invariant is enforced is the branch at src/SUNToken.sol:65, which fires solely when the PoolManager is msg.sender/from of an ERC-20 transfer. Uniswap v4 flash accounting offers a second, fully standard way to receive swap output that never performs an ERC-20 transfer: PoolManager.mint(to, currencyId, amount) credits ERC-6909 claim tokens for the positive SUN delta, and PoolManager.burn(from, currencyId, amount) later pays a negative SUN delta by burning those claims. Both are reachable through v4-periphery's MINT_6909 / BURN_6909 router actions. A trader who buys with mint() and sells with burn() completes a full buy and sell against the pool while the token contract sees no transfer from POOL_MANAGER, so tax == 0 on both legs and the creator wallet receives nothing. The claims are also freely transferable with PoolManager.transfer / transferFrom (ERC-6909), so SUN can change hands between claim holders untaxed indefinitely; tax is only ever paid by whoever finally calls take() to leave the PoolManager. This is a limitation of the mechanics spec M1 as written (the taxable event is defined as 'transfers FROM the PoolManager', which the code implements exactly), not an arithmetic error, and no holder loses funds; the creator simply does not receive the 0.5% on claim-settled volume. Reported because it is a reachable path on which a stated guarantee does not hold. Closing it is a design decision for the requester (for example a v4 hook that charges the fee on the swap delta instead of on the ERC-20 transfer); it cannot be fixed inside SUNToken alone without changing the agreed mechanics, so no fix is proposed here.","line":65,"path":"src/SUNToken.sol","reproduction":"State: SUNToken deployed, real PoolManager (lib/v4-core) constructed at 0x8366a39cc670b4001a1121b8f6a443a643e40951, IMD stand-in at 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, pool initialised with fee 12500 / tickSpacing 60 at the launch price, single-sided SUN liquidity of 1e24 added by the deployer (exactly as test/UniswapV4.t.sol does). Trader T holds 10 IMD. Inside one PoolManager.unlock callback T does: (1) swap(key, {zeroForOne: IMD->SUN, amountSpecified: -1e18, limit}) -> delta: SUN +G (G > 200), IMD -1e18; (2) sync(IMD); IMD.transfer(PoolManager, 1e18); settle(); (3) PoolManager.mint(T, uint256(uint160(address(SUN))), G). Observed: PoolManager.balanceOf(T, sunId) == G; SUN.balanceOf(PoolManager) unchanged; SUN.balanceOf(CREATOR_WALLET) == 0. Expected per brief: creator receives G/200. Then in a second unlock T does: (4) swap(key, {zeroForOne: SUN->IMD, amountSpecified: -G, limit}) -> delta: SUN -G, IMD +I; (5) PoolManager.burn(T, sunId, G); (6) take(IMD, T, I). Observed: claims are 0, T's ERC-20 SUN balance never changed, SUN.balanceOf(PoolManager) is back to its pre-buy value, T received I IMD (1e18 minus pool fee and price impact), and SUN.balanceOf(CREATOR_WALLET) is still 0. A complete buy and sell occurred and the creator received no tax. Verified with a scratch Foundry test (test/scratch/ClaimsBypass.t.sol, 1 passed) against the committed PoolManager; ERC-6909 mint/burn are at lib/v4-core/src/PoolManager.sol lines 321-337 and settle the delta via _accountDelta without any token transfer.","severity":"low","snippet":"        uint256 tax = from == POOL_MANAGER && to != POOL_MANAGER ? (value * CREATOR_TAX_BPS) / BPS_DENOMINATOR : 0;","title":"Creator tax is keyed to ERC-20 outflow from the PoolManager, so a buy-and-sell round trip held as ERC-6909 claims inside the PoolManager pays no tax at all"},{"citation":"resolved","description":"Seam: boundary x precision. tax = floor(value * 50 / 10000) = floor(value / 200). For value in [1, 199] the tax is 0, so the 'Fees round UP' rule of the Math Precision guide is not followed and the creator's 0.5% share is 0 for such buys; for every value the shortfall is (value mod 200) / 200 of one minor unit, strictly below 1 wei of SUN per transfer. At the launch price (2500 IMD per 1e9 SUN) 199 minor units of SUN are worth about 5e-22 IMD, far below any gas cost, so splitting a buy into sub-200-unit swaps to avoid tax is not economic and no party is materially harmed. The behaviour is documented in README.md ('Integer rounding keeps amounts below 200 minor units untaxed') and in launch.json notes ('rounded down to whole minor units'), and is already exercised by test/SUNToken.t.sol test_RoundingAtSmallestTaxUnit and test/SUNTokenEdges.t.sol test_ZeroAndDustBuysEmitOnlyActualCredit. Recorded for completeness of the math audit; no change is required. If the requester prefers the fee to round up, the formula would become (value * 50 + 9999) / 10000 with the recipient receiving value - tax, which still conserves supply.","line":65,"path":"src/SUNToken.sol","reproduction":"State: PoolManager address holds SUN. vm.prank(POOL_MANAGER); SUN.transfer(buyer, 199) -> buyer +199, creator +0 (expected 0.995 -> 0). SUN.transfer(buyer, 200) -> buyer +199, creator +1. SUN.transfer(buyer, 399) -> buyer +398, creator +1 (1.995 -> 1). SUN.transfer(buyer, 400) -> buyer +398, creator +2. Full-supply transfer of 1e27 from the PoolManager: creator +5e24, buyer +9.95e26, no overflow (1e27 * 50 = 5e28 << 2^256), sum of balances still 1e27. A fuzz over value in [0, 1e27] (2000 runs) confirms net + tax == value, tax * 10000 <= value * 50 and value * 50 - tax * 10000 < 10000 on every run.","severity":"info","snippet":"        uint256 tax = from == POOL_MANAGER && to != POOL_MANAGER ? (value * CREATOR_TAX_BPS) / BPS_DENOMINATOR : 0;","title":"Tax rounds down: buys of 1 to 199 minor units pay zero tax and every taxed transfer under-collects by up to one minor unit"}],"hash":"4a825a3f212e2b34ca24328290ce7dba093e97cdce9d7a8767bc632811df32ba","nodeId":"e6013c6e-4905-4ecf-8891-1fb47f012104","outcome":"completed","summary":"The review is complete. The findings file is at `.imd-findings.json` with 2 findings and 28 coverage rows (all 24 listed entry points plus 4 invariants). The working tree has no tracked changes.\n\n**Outcome: the token's arithmetic holds.** The single tax formula at `src/SUNToken.sol:65` was checked against the Math Precision, Boundary and Numerical Gap guides and the Senior Auditor's Mindset. The balance check runs before the multiplication, balances are bounded by the fixed 1e27 supply, so `value * 50` cannot overflow and a max-value input reverts with the custom balance error rather than a panic. Conservation (from, creator, recipient) holds on every path including PoolManager self-transfer, creator-as-recipient and wallet self-transfer. Transfers into the PoolManager are untaxed, so v4's reserve-difference settlement closes exactly. I confirmed this with a scratch probe at 0, 1, 199, 200, 399, 400, 1e27 and max plus a 2000-run fuzz, and the project's 51 existing tests pass.\n\n**Findings reported:**\n\n- **Low, claims bypass.** v4's ERC-6909 path (PoolManager `mint` and `burn`, reachable through standard periphery router actions) settles swap deltas without any ERC-20 transfer. A trader who buys into claims and sells by burning them completes a full round trip with zero creator tax, and claims trade between holders untaxed until someone finally calls `take`. Reproduced against the committed PoolManager in a scratch test. The code implements the mechanics spec literally, so this is a design limitation flagged for the requester, not an arithmetic error, and no fix is proposed inside the token.\n- **Info, round-down.** Buys of 1 to 199 minor units pay zero tax and every taxed transfer under-collects by under one wei. Documented in the README and manifest notes and already tested, with a value of roughly 5e-22 IMD at the launch price, so no change is needed.\n\n**Also verified:** launch.json has exactly the six required keys, the supply string matches the constructor, constructor arguments are empty to match, addresses are lowercase, and the provenance sqrtPriceX96 matches the launch economics to within one unit.\n\n**Not covered:** no live-chain fork of the real Robinhood Chain PoolManager, factory or Merkle distributor was possible offline; the integration evidence is against the vendored v4-core at the specified address.","treeHash":null,"usage":{"cachedInputTokens":1119871,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":27188,"runtime":"claude","turns":25,"wallClockMs":377787}},{"artifacts":[],"attempt":1,"bundleHash":"56b1b04a5c8e923072855085403514db263f417ffa9e220c01e33935b407ff92","device":"1c0fa8d0cf677236","findings":[],"hash":"596f0964e13c0a6f694ef2491a8c8ae9f6cde80fe1d7a865ad9a3cc973a4e66b","nodeId":"acc827a8-ca1d-4138-a08b-07d55c90f117","outcome":"completed","summary":"Implemented only under `test/`: edge cases, failure rollback checks, handler invariants, and PoolManager swaps in both currency orderings.\n\nValidation passed:\n- `forge build`\n- Seeded `forge test --offline`: **51 passed**, none failed or skipped.\n- **3,072 invariant calls**, with default fuzz runs preserved.\n\nNo reproducible implementation defects found. Live-chain fork validation remains unrun; integration uses the vendored PoolManager offline.","treeHash":"d48fa82c91166e51ed621c3ef0004564bc31925f","usage":{"cachedInputTokens":885760,"inputTokens":86108,"model":"gpt-6-astra","outputTokens":21143,"runtime":"codex","turns":6,"wallClockMs":488463}},{"artifacts":[],"attempt":1,"bundleHash":"b1eaddd59a96b20150b04a00b5ceb68886afe19faa10df46c9060a177f26b95c","device":"35eaae2310a66c78","findings":[],"hash":"897b908f0fba768aca1eebb27575eed88519a79d39aa6646af26dc7f53aa68c3","nodeId":"7e2c484e-9ccb-4a94-8822-003cb2ba4fda","outcome":"completed","summary":"Implemented the website, `dist/` export, SUNToken, launch manifest and documentation.\n\n- 15 Foundry tests passed.\n- Typecheck, 6 JavaScript tests and Chromium interaction checks passed.\n- All 16 design checks passed.\n- Deliverable: approximately 2.43 MB.\n\nWebKit could not launch; Safari and live-chain verification remain unperformed.\n\nDetails: [README](README.md) · [Validation report](artifacts/validation.md) · [Design system](DESIGN.md).\n\nNot delivered: artifacts/browser-validation.json, artifacts/desktop.jpg, artifacts/mobile.jpg, artifacts/size-budget.json, artifacts/taste-summary.json, artifacts/validation.md. Under artifacts/, only this step's named outputs leave the machine.","treeHash":"3c3e7c05c56e24746bb8f1194f39c755b4e5490f","usage":{"cachedInputTokens":4349440,"inputTokens":164788,"model":"gpt-6-astra","outputTokens":64779,"runtime":"codex","turns":10,"wallClockMs":1507479}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"2c968e88904ec22b","findings":[{"citation":"resolved","description":"The tax keys on an ERC-20 transfer whose `from` is the PoolManager. Uniswap v4 lets a swapper keep the SUN it bought inside the PoolManager by calling PoolManager.mint(to, id, amount) instead of take(): the positive SUN delta becomes an ERC-6909 claim and no ERC-20 transfer happens, so line 65 is never reached. A later sell is settled with PoolManager.burn(), again with no ERC-20 transfer (sells are untaxed anyway). ERC-6909 claims can also be moved between wallets with PoolManager.transfer / transferFrom with no tax. So any trader, arbitrage bot or router that lives on claims buys and sells SUN repeatedly and the fixed creator wallet 0xEeaF04a4...f8b6 receives nothing from those buys, although the brief says 0.5% of every buy goes to it and buyers receive net. Economics: at the opening price with the vendored PoolManager, 1 IMD buys 390,099.142556557378834645 SUN; under the tax the creator should get 1,950.495712782786894173 SUN; it gets 0. The leak is proportional to all volume that stays in claims. Nothing in the token can see a claim mint, so this is a limit of the specified mechanism (M1 defines a buy as a transfer FROM the PoolManager, and the referenced live launches share it), not a coding error; reported so the requester knows the 'every buy' guarantee holds only for buys that are taken out as ERC-20 tokens. A fix would need a pool hook (afterSwap taking the fee from the delta), which is outside the agreed design; the minimal in-scope change is to document the gap in the manifest notes and site.","line":65,"path":"src/SUNToken.sol","reproduction":"State: SUNToken deployed; the vendored PoolManager constructed at 0x8366a39CC670B4001A1121B8F6A443A643e40951; pool SUN/IMD fee 12500 tickSpacing 60 initialised at the 2500 IMD cap price and seeded single-sided with 1e24 liquidity. Calls by an ordinary trader inside one unlock: (1) swap(key, IMD->SUN, exactIn 1e18) -> SUN delta +390099142556557378834645; (2) sync(IMD), transfer 1e18 IMD to PoolManager, settle(); (3) PoolManager.mint(trader, uint160(SUN), 390099142556557378834645). Expected per brief: creator wallet balance +1950495712782786894173 SUN, buyer net 388148646843774591940472. Actual: creator wallet balance 0, PoolManager SUN balance unchanged, trader holds 390099142556557378834645 ERC-6909 claims (gross). Then in a second unlock: swap(key, SUN->IMD, exactIn all claims), burn(trader, uint160(SUN), amount), take(IMD, trader, out). Actual after the full cycle: creator wallet still 0, trader received IMD back, never held ERC-20 SUN. Reproduced by test/scratch/ClaimsBypass.t.sol (test_ClaimsRoundTripPaysNoCreatorTax passes on this code, showing the untaxed cycle).","severity":"low","snippet":"        uint256 tax = from == POOL_MANAGER && to != POOL_MANAGER ? (value * CREATOR_TAX_BPS) / BPS_DENOMINATOR : 0;","title":"Buys settled as ERC-6909 claims never trigger the 0.5% creator tax; a claims-only buy/sell cycle pays the creator nothing"},{"citation":"resolved","description":"Because the tax is keyed on the sender address, any take() of SUN pays 0.5% to the creator wallet: removing liquidity (including the launch factory's own seed position if it is ever withdrawn or migrated), collecting accrued LP fees with a zero-liquidity modifyLiquidity, collectProtocolFees() by the PoolManager's fee controller, and SUN leaving through any other pool that lists SUN. The PoolManager's accounting stays solvent (its balance and its deltas both drop by the gross amount) so this is not an insolvency, but a liquidity provider or the protocol receives 0.5% less than its position says, and the loss goes to the creator rather than to the pool. The brief's authoritative M1 defines the tax by transfer direction, so this is in spec and the author documents it in the source comment, the README and the manifest notes; it is recorded so the judge and the requester see that 'buy' in the brief means every PoolManager outflow. No change is proposed unless the requester wants withdrawals exempt, which the token cannot distinguish without a hook.","line":5,"path":"src/SUNToken.sol","reproduction":"State: pool seeded with 1e24 liquidity by the test contract (author's test test_ActualV4WithdrawalIsAlsoTaxedOnPoolOutflow in test/UniswapV4.t.sol). Call: modifyLiquidity(key, {lower, upper, -1e24}) then take(SUN, lp, gross). Expected if only buys were taxed: lp SUN balance +gross, creator +0. Actual: lp receives gross - gross/200 and creator wallet receives gross/200. Same for a zero-liquidity modifyLiquidity that collects fees (test_AccruedLPFeesSettleWithTaxOnlyOnSunOutflow) and for ProtocolFees.collectProtocolFees(recipient, SUN, amount), whose currency.transfer at lib/v4-core/src/ProtocolFees.sol:56 is a transfer FROM the PoolManager.","severity":"info","snippet":"/// @dev Any transfer out of PoolManager is taxed, including withdrawals, not just swaps.","title":"The 0.5% is charged on every SUN outflow from the PoolManager, not only on buys: LP withdrawals, LP fee collection and protocol-fee collection all pay the creator"}],"hash":"b9dab3ab42e1b55bb03ea901e5c2df043888eb69a39b37c582ee5808cd200cfa","nodeId":"0d5c6c07-79ae-4e21-a224-136dc4f898d0","outcome":"completed","summary":"The review is complete and `.imd-findings.json` holds the result. No tracked file was changed; only the findings file and `test/scratch/` were written, both ignored by git.\n\n**Outcome:** SUNToken's economics hold against the Economic Security, Invariant and Flow Gap checklists. I found no loss-of-funds defect. The transfer logic conserves the 1e27 supply on every branch, the tax is carved out of the gross the PoolManager already debits so the pool can never become insolvent, and every launch flow (factory to distributor, claims, pool seed, remainder to the dead address) arrives whole because none of them is a transfer out of the PoolManager. The author's 51 tests pass, and I traced each entry point against the vendored v4 PoolManager.\n\n**Findings recorded (2):**\n\n- **Low: ERC-6909 claims bypass the creator tax.** A trader who settles a buy with `PoolManager.mint` instead of `take` keeps SUN as a claim inside the PoolManager, so the tax branch at `src/SUNToken.sol:65` never runs. Selling from claims and moving claims between wallets are also untaxed. Reproduced with the real PoolManager in `test/scratch/ClaimsBypass.t.sol`: 1 IMD bought 390,099 SUN as claims, the creator wallet received 0 instead of 1,950 SUN, and the full buy/sell cycle paid nothing. This is a limit of the specified mechanism (M1 defines a buy as a transfer from the PoolManager), not a coding error, so it is ranked low and no in-token fix is proposed beyond documenting it.\n- **Info: the tax applies to every PoolManager outflow, not only buys.** Liquidity withdrawals (including the factory's seed position), LP fee collection and protocol-fee collection all pay 0.5% to the creator. The author documents this in the source comment, README and manifest notes, and it matches M1 by mechanism. Recorded so the judge sees what \"buy\" means in practice.\n\n**Coverage:** all 24 listed entry points have a row, 19 hold, 5 point at a finding, plus rows for the supply, launch-flow and solvency invariants and the manifest. One row is marked unreached: the live Robinhood Chain PoolManager bytecode, the launch factory sources and the Universal Router, which are not in the tree and could not be checked without a network.","treeHash":null,"usage":{"cachedInputTokens":1043263,"inputTokens":354,"model":"claude-fable-5-1","outputTokens":26126,"runtime":"claude","turns":27,"wallClockMs":393130}},{"artifacts":[],"attempt":1,"bundleHash":"1d9846364c4c50a06eb97da0cd29f0d2db0a37637a1bfcfda2306e396d223a02","device":"5f419f6fdfb42f37","findings":[],"hash":"c18bc701c53186b69c3162098447c15284c7fe299c43250932f1ef0402e22206","nodeId":"ea0d1261-8320-476c-aac3-3e576d68caa5","outcome":"completed","summary":"Updated [launch.json](/root/.identitymd/work/d1c52bff-eeb4-45d9-b18f-a415e48851ec/ea0d1261-8320-476c-aac3-3e576d68caa5/launch.json) with precise tax and deployment notes. Verified supply, constructor arguments, pool settings and economics against the accepted implementation.\n\n`forge build` succeeded. All 51 tests passed with the required fuzz seed.\n\nOnly `launch.json` changed.","treeHash":"31f3ae20f1223bb2cd739c40797fe293ea17757a","usage":{"cachedInputTokens":282752,"inputTokens":38047,"model":"gpt-6-astra","outputTokens":3561,"runtime":"codex","turns":3,"wallClockMs":94499}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1a7606be97f168d4","findings":[{"citation":"resolved","description":"The 0.5% creator tax exists only in SUNToken._transfer and fires only on an ERC-20 transfer whose `from` is POOL_MANAGER. Uniswap v4 gives a swapper a second, equally valid way to realise a positive SUN delta: PoolManager.mint(to, uint256(uint160(sun)), amount) credits an ERC-6909 claim instead of calling take(), and no ERC-20 transfer happens. Those claims are transferable with PoolManager.transfer / transferFrom and can later pay a sell by PoolManager.burn, so a trader (or any arbitrage bot, which routinely use claims for gas) can buy, hold, trade and sell SUN inside the PoolManager without the creator wallet ever receiving the 0.5%. The tax is only collected if and when someone finally calls take(). Two exit paths for the same economic position are priced asymmetrically and the caller picks the free one; the victim is the fixed CREATOR_WALLET. Severity is low rather than medium because the mechanics spec M1 literally defines a buy as a transfer FROM the PoolManager, the claim holder never receives ERC-20 SUN, and no change inside the token can see ERC-6909 movements: enforcing the tax on claims would need a v4 hook on the pool, which is a design decision for the requester, not a token fix. Reported so the author and judge can decide whether the documented guarantee ('0.5% of every buy') is meant to include v4-native claim positions.","line":65,"path":"src/SUNToken.sol","reproduction":"State: SUNToken deployed, PoolManager built at 0x8366a39CC670B4001A1121B8F6A443A643e40951, SUN/IMD pool initialised at the launch price and seeded single-sided with 1e24 liquidity (as test/UniswapV4.t.sol does). Trader contract holds 1 IMD. Call sequence inside one PoolManager.unlock: (1) swap(key, exact input 1 IMD for SUN) -> positive SUN delta of 390099142556557378834645 units; (2) sync(IMD), transfer 1 IMD to PoolManager, settle(); (3) PoolManager.mint(trader, uint256(uint160(address(sun))), 390099142556557378834645) instead of take(). Then from the trader: PoolManager.transfer(0xB0B, id, 1) succeeds. Then in a second unlock: swap(key, exact input 390099142556557378834644 SUN for IMD), PoolManager.burn(trader, id, amount) to pay the SUN debt, take(IMD, trader, out). Expected per the requirement '0.5% of every buy is sent to the creator wallet': balanceOf(CREATOR_WALLET) == 1950495712782786894173 after the buy. Actual: balanceOf(CREATOR_WALLET) == 0 after the buy, after the claim transfer and after the sell; balanceOf(PoolManager) in SUN never changed on the buy. Control: the same claim redeemed with take() pays exactly claims/200 to the creator. Verified with test/scratch/ClaimsBypass.t.sol (both tests pass on the current code: test_claimsRoundTripPaysNoCreatorTax and test_takingClaimsIsTaxed).","severity":"low","snippet":"        uint256 tax = from == POOL_MANAGER && to != POOL_MANAGER ? (value * CREATOR_TAX_BPS) / BPS_DENOMINATOR : 0;","title":"Creator tax is bypassed when a buyer keeps SUN as an ERC-6909 claim inside the PoolManager (economics x asymmetry seam)"},{"citation":"resolved","description":"Because the tax predicate is purely `from == POOL_MANAGER && to != POOL_MANAGER`, it also fires on PoolManager.take() issued for modifyLiquidity with negative liquidity (an LP withdrawing its own SUN), on fee collection by a zero-liquidity modifyLiquidity, and on collectProtocolFees by the PoolManager's protocol fee controller. 0.5% of each of those flows is paid to CREATOR_WALLET although nobody bought anything. This follows mechanics spec M1 to the letter and is disclosed in README.md:80 and launch.json notes, and the launch seed is not expected to be withdrawn, so it is not a defect; it is recorded as the trust assumption an LP and the v4 protocol-fee controller accept. No access gap: only the PoolManager itself can originate such a transfer, and only with a matching negative delta.","line":5,"path":"src/SUNToken.sol","reproduction":"State: pool seeded with 1e24 liquidity by the test harness. Call modifyLiquidity(key, {lower, upper, -1e24}) then take(SUN, lp, delta). Expected by an LP: full withdrawn amount `gross` arrives. Actual: lp receives gross - gross/200 and CREATOR_WALLET receives gross/200. Reproduced by the existing test test_ActualV4WithdrawalIsAlsoTaxedOnPoolOutflow and test_AccruedLPFeesSettleWithTaxOnlyOnSunOutflow in test/UniswapV4.t.sol, which pass on the current code.","severity":"info","snippet":"/// @dev Any transfer out of PoolManager is taxed, including withdrawals, not just swaps.","title":"Trust assumption: every SUN outflow from the PoolManager pays the creator, including LP withdrawals and protocol-fee collection, not only buys"}],"hash":"f46dad0b0dd52e3e63df33e07502182f4e99c64e085c04f672f8f744b674efa3","nodeId":"179c15b7-90d9-45b8-93c7-56abbd944009","outcome":"completed","summary":"The review is complete. No tracked files were changed; only the findings file and the scratch test directory were written.\n\n**Outcome:** The token's permission model holds. SUNToken has no owner, no roles, no initializer, no setters, no external calls, and no delegatecall or selfdestruct. Its only state writers are the constructor, approve, transfer and transferFrom, and both transfer paths reach the same private function with identical guards. The constructor mints exactly 1e27 units to the deployer. The constants match the order, and launch.json has exactly the required keys. All 51 existing tests pass, including both currency orderings against the real vendored PoolManager.\n\n**Findings recorded in .imd-findings.json:**\n\n- **Low, Trust Gap seam (economics × asymmetry).** The 0.5% creator tax only fires on an ERC-20 transfer out of the PoolManager. A buyer who realises a swap as an ERC-6909 claim through PoolManager.mint, trades the claim with the manager's own transfer function, and later pays a sell by burning the claim never triggers the tax. I reproduced this with a scratch test: a 1 IMD buy yields about 390,000 SUN of claims, and the creator wallet stays at zero through the buy, the claim transfer and the sell, while taking the same claim as ERC-20 pays exactly claims/200. Severity is low because mechanics spec M1 defines a buy as a transfer from the PoolManager, and the token cannot see claim movements. Enforcing it would require a v4 hook, which is a design decision for the requester.\n- **Info, trust assumption.** Every SUN outflow from the PoolManager pays the creator, including LP withdrawals, LP fee collection and protocol fee collection. This follows M1 literally and is disclosed in the README and manifest notes, so it is documented rather than reported as a defect.\n\n**Coverage:** all 24 listed entry points have a row, plus five invariant rows. Six rows point at the findings above, the rest hold. Nothing in the assigned area was left unreached.\n\n**Not covered:** no fork run against live Robinhood Chain state was possible, and third-party routers were not exercised beyond the local v4 PoolManager harness.","treeHash":null,"usage":{"cachedInputTokens":959926,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":20990,"runtime":"claude","turns":21,"wallClockMs":303986}}],"verification":[{"checks":[{"durationMs":1128,"exitCode":0,"name":"build","output":"Compiling 49 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.08s\nCompiler run successful!\n","passed":true},{"durationMs":358,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/UniswapV4.t.sol:SUNAsCurrencyOneTest\n[PASS] test_ActualV4SingleSidedSeedBuyAndSell() (gas: 676041)\n[PASS] test_ActualV4WithdrawalIsAlsoTaxedOnPoolOutflow() (gas: 358900)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.06ms (685.85µs CPU time)\n\nRan 2 tests for test/UniswapV4.t.sol:SUNAsCurrencyZeroTest\n[PASS] test_ActualV4SingleSidedSeedBuyAndSell() (gas: 670362)\n[PASS] test_ActualV4WithdrawalIsAlsoTaxedOnPoolOutflow() (gas: 354333)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.27ms (826.96µs CPU time)\n\nRan 12 tests for test/SUNTokenSmoke.t.sol:SUNTokenSmokeTest\n[PASS] test_BuyFromPoolManagerPaysHalfPercentToCreator() (gas: 155388)\n[PASS] test_DeployerHoldsFullSupplyAndFactorySplitsIt() (gas: 148514)\n[PASS] test_FeeRateAndRecipientAreCompileTimeConstants() (gas: 172456)\n[PASS] test_NoOwnerOrAdminPowers() (gas: 199630)\n[PASS] test_PoolRoundTripBalances() (gas: 236468)\n[PASS] test_RevertsOnInsufficientAllowance() (gas: 85941)\n[PASS] test_RevertsOnInsufficientBalance() (gas: 89560)\n[PASS] test_RevertsOnZeroAddressReceiver() (gas: 30782)\n[PASS] test_SellToPoolManagerIsUntaxed() (gas: 125866)\n[PASS] test_SupplyIsOneBillionWithEighteenDecimals() (gas: 27649)\n[PASS] test_TransferFromOutOfPoolManagerIsAlsoTaxed() (gas: 198383)\n[PASS] test_WalletToWalletTransferIsFree() (gas: 130391)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 34.21ms (2.03ms CPU time)\n\nRan 11 tests for test/SUNToken.t.sol:SUNTokenTest\n[PASS] testFuzz_BuySellAndWalletConservation(uint256) (runs: 1000, μ: 297614, ~: 301590)\n[PASS] testFuzz_StatefulSupplyConservation(bytes32) (runs: 1000, μ: 3909375, ~: 3917716)\n[PASS] test_BuyEventsDescribeActualCredits() (gas: 146827)\n[PASS] test_FactoryReceivesEverythingAndDistributesExactly() (gas: 206149)\n[PASS] test_InvalidCallsRevertAtomically() (gas: 285236)\n[PASS] test_NoAdminMintBurnUpgradeOrFeeMutation() (gas: 817518)\n[PASS] test_RoundingAtSmallestTaxUnit() (gas: 209547)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 435169)\n[PASS] test_SelfTransfersZeroTransfersAndCreatorAsBuyer() (gas: 288497)\n[PASS] test_TransferFromChargesGrossAllowanceAndCannotBypassTax() (gas: 303999)\n[PASS] test_UnlimitedAllowanceAndOverwrite() (gas: 222786)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 294.87ms (336.84ms CPU time)\n\nRan 4 test suites in 295.45ms (331.41ms CPU time): 27 tests passed, 0 failed, 0 skipped (27 total tests)\n","passed":true},{"durationMs":107,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PoolManager.approve(address,uint256,uint256)\",\"PoolManager.burn(address,uint256,uint256)\",\"PoolManager.clear(address,uint256)\",\"PoolManager.collectProtocolFees(address,address,uint256)\",\"PoolManager.donate((address,address,uint24,int24,address),uint256,uint256,bytes)\",\"PoolManager.initialize((address,address,uint24,int24,address),uint160)\",\"PoolManager.mint(address,uint256,uint256)\",\"PoolManager.modifyLiquidity((address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"PoolManager.setOperator(address,bool)\",\"PoolManager.setProtocolFee((address,address,uint24,int24,address),uint24)\",\"PoolManager.setProtocolFeeController(address)\",\"PoolManager.settle()\",\"PoolManager.settleFor(address)\",\"PoolManager.swap((address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"PoolManager.sync(address)\",\"PoolManager.take(address,address,uint256)\",\"PoolManager.transfer(address,uint256,uint256)\",\"PoolManager.transferFrom(address,address,uint256,uint256)\",\"PoolManager.transferOwnership(address)\",\"PoolManager.unlock(bytes)\",\"PoolManager.updateDynamicLPFee((address,address,uint24,int24,address),uint24)\",\"SUNToken.approve(address,uint256)\",\"SUNToken.transfer(address,uint256)\",\"SUNToken.transferFrom(address,address,uint256)\"],\"files\":{\"DESIGN.md\":89,\"README.md\":114,\"dist/404.html\":1,\"dist/assets/SUNToken.sol\":76,\"dist/assets/app.js\":194,\"dist/assets/bee.svg\":1,\"dist/assets/favicon.png\":17,\"dist/assets/fonts/fonts.css\":75,\"dist/assets/fonts/fredoka-400.woff2\":121,\"dist/assets/fonts/fredoka-500.woff2\":121,\"dist/assets/fonts/fredoka-600.woff2\":121,\"dist/assets/fonts/ibm-plex-mono-400.woff2\":58,\"dist/assets/fonts/ibm-plex-mono-500.woff2\":62,\"dist/assets/fonts/ibm-plex-mono-600.woff2\":78,\"dist/assets/fonts/montserrat-400.woff2\":151,\"dist/assets/fonts/montserrat-500.woff2\":151,\"dist/assets/fonts/montserrat-600.woff2\":151,\"dist/assets/logo-1.png\":107,\"dist/assets/logo.svg\":1,\"dist/assets/memes/garden-1.png\":131,\"dist/assets/memes/garden-1.svg\":1,\"dist/assets/memes/garden-2.png\":144,\"dist/assets/memes/garden-2.svg\":1,\"dist/assets/memes/garden-3.png\":256,\"dist/assets/memes/garden-3.svg\":1,\"dist/assets/memes/garden-4.png\":240,\"dist/assets/memes/garden-4.svg\":1,\"dist/assets/memes/garden-5.png\":97,\"dist/assets/memes/garden-5.svg\":1,\"dist/assets/memes/garden-6.png\":80,\"dist/assets/memes/garden-6.svg\":1,\"dist/assets/model.js\":52,\"dist/assets/style.css\":12,\"dist/assets/wallet-garden.svg\":1,\"dist/index.html\":129,\"dist/simd-coin.json\":1,\"foundry.toml\":12,\"launch.json\":24,\"lib/solmate/LICENSE\":1,\"lib/solmate/PROVENANCE.md\":1,\"lib/solmate/src/auth/Owned.sol\":44,\"lib/v4-core/PROVENANCE.md\":1,\"lib/v4-core/licenses/BUSL_LICENSE\":63,\"lib/v4-core/licenses/MIT_LICENSE\":7,\"lib/v4-core/src/ERC6909.sol\":90,\"lib/v4-core/src/ERC6909Claims.sol\":23,\"lib/v4-core/src/Extsload.sol\":64,\"lib/v4-core/src/Exttload.sol\":40,\"lib/v4-core/src/NoDelegateCall.sol\":33,\"lib/v4-core/src/PoolManager.sol\":394,\"lib/v4-core/src/ProtocolFees.sol\":71,\"lib/v4-core/src/interfaces/IExtsload.sol\":21,\"lib/v4-core/src/interfaces/IExttload.sol\":15,\"lib/v4-core/src/interfaces/IHooks.sol\":152,\"lib/v4-core/src/interfaces/IPoolManager.sol\":217,\"lib/v4-core/src/interfaces/IProtocolFees.sol\":52,\"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol\":10,\"lib/v4-core/src/interfaces/external/IERC20Minimal.sol\":48,\"lib/v4-core/src/interfaces/external/IERC6909Claims.sol\":66,\"lib/v4-core/src/libraries/BitMath.sol\":49,\"lib/v4-core/src/libraries/CurrencyDelta.sol\":42,\"lib/v4-core/src/libraries/CurrencyReserves.sol\":39,\"lib/v4-core/src/libraries/CustomRevert.sol\":120,\"lib/v4-core/src/libraries/FixedPoint128.sol\":8,\"lib/v4-core/src/libraries/FixedPoint96.sol\":10,\"lib/v4-core/src/libraries/FullMath.sol\":117,\"lib/v4-core/src/libraries/Hooks.sol\":344,\"lib/v4-core/src/libraries/LPFeeLibrary.sol\":79,\"lib/v4-core/src/libraries/LiquidityMath.sol\":20,\"lib/v4-core/src/libraries/Lock.sol\":28,\"lib/v4-core/src/libraries/NonzeroDeltaCount.sol\":35,\"lib/v4-core/src/libraries/ParseBytes.sol\":29,\"lib/v4-core/src/libraries/Pool.sol\":620,\"lib/v4-core/src/libraries/Position.sol\":103,\"lib/v4-core/src/libraries/ProtocolFeeLibrary.sol\":47,\"lib/v4-core/src/libraries/SafeCast.sol\":60,\"lib/v4-core/src/libraries/SqrtPriceMath.sol\":292,\"lib/v4-core/src/libraries/SwapMath.sol\":108,\"lib/v4-core/src/libraries/TickBitmap.sol\":121,\"lib/v4-core/src/libraries/TickMath.sol\":238,\"lib/v4-core/src/libraries/UnsafeMath.sol\":29,\"lib/v4-core/src/types/BalanceDelta.sol\":72,\"lib/v4-core/src/types/BeforeSwapDelta.sol\":38,\"lib/v4-core/src/types/Currency.sol\":118,\"lib/v4-core/src/types/PoolId.sol\":17,\"lib/v4-core/src/types/PoolKey.sol\":22,\"lib/v4-core/src/types/PoolOperation.sol\":26,\"lib/v4-core/src/types/Slot0.sol\":95,\"licenses/Better-Interface-LICENSE.txt\":220,\"licenses/Fredoka-OFL.txt\":93,\"licenses/IBM-Plex-Mono-OFL.txt\":93,\"licenses/Montserrat-OFL.txt\":93,\"licenses/eth-testing-LICENSE.txt\":30,\"logos/logo-1.png\":107,\"package-lock.json\":115,\"package.json\":19,\"remappings.txt\":2,\"scripts/browser-check.mjs\":126,\"scripts/budget.mjs\":24,\"scripts/build.mjs\":14,\"scripts/preview.mjs\":23,\"site/404.html\":1,\"site/assets/SUNToken.sol\":76,\"site/assets/app.js\":194,\"site/assets/bee.svg\":1,\"site/assets/favicon.png\":17,\"site/assets/fonts/fonts.css\":75,\"site/assets/fonts/fredoka-400.woff2\":121,\"site/assets/fonts/fredoka-500.woff2\":121,\"site/assets/fonts/fredoka-600.woff2\":121,\"site/assets/fonts/ibm-plex-mono-400.woff2\":58,\"site/assets/fonts/ibm-plex-mono-500.woff2\":62,\"site/assets/fonts/ibm-plex-mono-600.woff2\":78,\"site/assets/fonts/montserrat-400.woff2\":151,\"site/assets/fonts/montserrat-500.woff2\":151,\"site/assets/fonts/montserrat-600.woff2\":151,\"site/assets/logo-1.png\":107,\"site/assets/logo.svg\":1,\"site/assets/memes/garden-1.png\":131,\"site/assets/memes/garden-1.svg\":1,\"site/assets/memes/garden-2.png\":144,\"site/assets/memes/garden-2.svg\":1,\"site/assets/memes/garden-3.png\":256,\"site/assets/memes/garden-3.svg\":1,\"site/assets/memes/garden-4.png\":240,\"site/assets/memes/garden-4.svg\":1,\"site/assets/memes/garden-5.png\":97,\"site/assets/memes/garden-5.svg\":1,\"site/assets/memes/garden-6.png\":80,\"site/assets/memes/garden-6.svg\":1,\"site/assets/model.js\":52,\"site/assets/style.css\":12,\"site/assets/wallet-garden.svg\":1,\"site/index.html\":129,\"site/simd-coin.json\":1,\"src/SUNToken.sol\":76,\"test/SUNToken.t.sol\":224,\"test/SUNTokenSmoke.t.sol\":209,\"test/UniswapV4.t.sol\":171,\"test/site-model.test.mjs\":46,\"tsconfig.json\":13},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"0ae6ff87b4479f745b7bd3a1646437a68213678006d7ac4a85159f90ae046391","verifiedTreeHash":"edaa732c4ac443f027efbdccaebfe526247e48ed","verifierVersion":"0.1.0+63e0a393"},{"checks":[{"durationMs":1940,"exitCode":0,"name":"build","output":"Compiling 52 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.87s\nCompiler run successful!\n","passed":true},{"durationMs":1164,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 11 tests for test/SUNTokenEdges.t.sol:SUNTokenEdgesTest\n[PASS] testFuzz_DelegatedSelfTransfersConsumeAllowanceWithoutMovingBalances(uint256) (runs: 256, μ: 452440, ~: 454483)\n[PASS] testFuzz_NetAllowanceCannotAuthorizeGrossBuy(uint256) (runs: 256, μ: 301629, ~: 301683)\n[PASS] testFuzz_NetBalanceCannotFundGrossBuyAndAllowanceRollsBack(uint256) (runs: 256, μ: 251440, ~: 251483)\n[PASS] testFuzz_TaxUsesTokenSenderNotApprovedSpender(uint256) (runs: 256, μ: 351357, ~: 356851)\n[PASS] test_ContractDeployerGetsSingleMintAndLaunchCallerGetsNothing() (gas: 207432)\n[PASS] test_CreatorAsBuyRecipientHasBothCreditsInEvents() (gas: 126255)\n[PASS] test_CreatorCanSpendAllCollectedFeesWithoutAnotherTax() (gas: 250302)\n[PASS] test_InvalidBuyRecipientRollsBackFiniteAndInfiniteAllowance() (gas: 279647)\n[PASS] test_MaximumAmountRevertsWithBalanceErrorBeforeTaxArithmetic() (gas: 198179)\n[PASS] test_ZeroAmountsStillRejectZeroAddresses() (gas: 120168)\n[PASS] test_ZeroAndDustBuysEmitOnlyActualCredit() (gas: 194336)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 29.79ms (97.47ms CPU time)\n\nRan 8 tests for test/UniswapV4.t.sol:SUNAsCurrencyZeroTest\n[PASS] testFuzz_IndependentTraderBuySellAndOptionalForwarding(uint256,bool) (runs: 256, μ: 1876847, ~: 1883397)\n[PASS] test_AccruedLPFeesSettleWithTaxOnlyOnSunOutflow() (gas: 1972767)\n[PASS] test_ActualV4SingleSidedSeedBuyAndSell() (gas: 671087)\n[PASS] test_ActualV4WithdrawalIsAlsoTaxedOnPoolOutflow() (gas: 354612)\n[PASS] test_ExactOutputBuyReportsGrossButDeliversNet() (gas: 1606255)\n[PASS] test_NetOutputSlippageFailureRollsBackSwapAndCreatorFee() (gas: 1817089)\n[PASS] test_StaticPoolFeeRejectsDynamicUpdates() (gas: 38592)\n[PASS] test_UnderpaidSellRevertsAtomicallyThenFullyPaidSellSucceeds() (gas: 1981592)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 52.21ms (55.87ms CPU time)\n\nRan 8 tests for test/UniswapV4.t.sol:SUNAsCurrencyOneTest\n[PASS] testFuzz_IndependentTraderBuySellAndOptionalForwarding(uint256,bool) (runs: 256, μ: 1882439, ~: 1888830)\n[PASS] test_AccruedLPFeesSettleWithTaxOnlyOnSunOutflow() (gas: 1978446)\n[PASS] test_ActualV4SingleSidedSeedBuyAndSell() (gas: 676766)\n[PASS] test_ActualV4WithdrawalIsAlsoTaxedOnPoolOutflow() (gas: 359179)\n[PASS] test_ExactOutputBuyReportsGrossButDeliversNet() (gas: 1610823)\n[PASS] test_NetOutputSlippageFailureRollsBackSwapAndCreatorFee() (gas: 1821305)\n[PASS] test_StaticPoolFeeRejectsDynamicUpdates() (gas: 38592)\n[PASS] test_UnderpaidSellRevertsAtomicallyThenFullyPaidSellSucceeds() (gas: 1986965)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 59.29ms (58.09ms CPU time)\n\nRan 12 tests for test/SUNTokenSmoke.t.sol:SUNTokenSmokeTest\n[PASS] test_BuyFromPoolManagerPaysHalfPercentToCreator() (gas: 155388)\n[PASS] test_DeployerHoldsFullSupplyAndFactorySplitsIt() (gas: 148514)\n[PASS] test_FeeRateAndRecipientAreCompileTimeConstants() (gas: 172456)\n[PASS] test_NoOwnerOrAdminPowers() (gas: 199630)\n[PASS] test_PoolRoundTripBalances() (gas: 236468)\n[PASS] test_RevertsOnInsufficientAllowance() (gas: 85941)\n[PASS] test_RevertsOnInsufficientBalance() (gas: 89560)\n[PASS] test_RevertsOnZeroAddressReceiver() (gas: 30782)\n[PASS] test_SellToPoolManagerIsUntaxed() (gas: 125866)\n[PASS] test_SupplyIsOneBillionWithEighteenDecimals() (gas: 27649)\n[PASS] test_TransferFromOutOfPoolManagerIsAlsoTaxed() (gas: 198383)\n[PASS] test_WalletToWalletTransferIsFree() (gas: 130391)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 117.35ms (3.16ms CPU time)\n\nRan 11 tests for test/SUNToken.t.sol:SUNTokenTest\n[PASS] testFuzz_BuySellAndWalletConservation(uint256) (runs: 256, μ: 296795, ~: 301638)\n[PASS] testFuzz_StatefulSupplyConservation(bytes32) (runs: 256, μ: 3911535, ~: 3920168)\n[PASS] test_BuyEventsDescribeActualCredits() (gas: 146827)\n[PASS] test_FactoryReceivesEverythingAndDistributesExactly() (gas: 206149)\n[PASS] test_InvalidCallsRevertAtomically() (gas: 285236)\n[PASS] test_NoAdminMintBurnUpgradeOrFeeMutation() (gas: 2838313)\n[PASS] test_RoundingAtSmallestTaxUnit() (gas: 209547)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 435169)\n[PASS] test_SelfTransfersZeroTransfersAndCreatorAsBuyer() (gas: 288497)\n[PASS] test_TransferFromChargesGrossAllowanceAndCannotBypassTax() (gas: 303999)\n[PASS] test_UnlimitedAllowanceAndOverwrite() (gas: 222786)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 127.68ms (177.52ms CPU time)\n\nRan 1 test for test/SUNTokenInvariant.t.sol:SUNTokenInvariantTest\n[PASS] invariant_SupplyBalancesAllowancesAndParameters() (runs: 64, calls: 3072, reverts: 0)\n\n╭-----------------+-----------------------+-------+---------+----------╮\n| Contract        | Selector              | Calls | Reverts | Discards |\n+======================================================================+\n| SUNTokenHandler | approve               | 391   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | buy                   | 387   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | rejectOverdraw        | 382   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | rejectUnapprovedSpend | 374   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | rejectZeroRecipient   | 393   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | sell                  | 382   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | transfer              | 385   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | transferFrom          | 378   | 0       | 0        |\n╰-----------------+-----------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.11s (1.10s CPU time)\n\nRan 6 test suites in 1.11s (1.49s CPU time): 51 tests passed, 0 failed, 0 skipped (51 total tests)\n","passed":true},{"durationMs":64,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PoolManager.approve(address,uint256,uint256)\",\"PoolManager.burn(address,uint256,uint256)\",\"PoolManager.clear(address,uint256)\",\"PoolManager.collectProtocolFees(address,address,uint256)\",\"PoolManager.donate((address,address,uint24,int24,address),uint256,uint256,bytes)\",\"PoolManager.initialize((address,address,uint24,int24,address),uint160)\",\"PoolManager.mint(address,uint256,uint256)\",\"PoolManager.modifyLiquidity((address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"PoolManager.setOperator(address,bool)\",\"PoolManager.setProtocolFee((address,address,uint24,int24,address),uint24)\",\"PoolManager.setProtocolFeeController(address)\",\"PoolManager.settle()\",\"PoolManager.settleFor(address)\",\"PoolManager.swap((address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"PoolManager.sync(address)\",\"PoolManager.take(address,address,uint256)\",\"PoolManager.transfer(address,uint256,uint256)\",\"PoolManager.transferFrom(address,address,uint256,uint256)\",\"PoolManager.transferOwnership(address)\",\"PoolManager.unlock(bytes)\",\"PoolManager.updateDynamicLPFee((address,address,uint24,int24,address),uint24)\",\"SUNToken.approve(address,uint256)\",\"SUNToken.transfer(address,uint256)\",\"SUNToken.transferFrom(address,address,uint256)\"],\"files\":{\"DESIGN.md\":89,\"README.md\":114,\"dist/404.html\":1,\"dist/assets/SUNToken.sol\":76,\"dist/assets/app.js\":194,\"dist/assets/bee.svg\":1,\"dist/assets/favicon.png\":17,\"dist/assets/fonts/fonts.css\":75,\"dist/assets/fonts/fredoka-400.woff2\":121,\"dist/assets/fonts/fredoka-500.woff2\":121,\"dist/assets/fonts/fredoka-600.woff2\":121,\"dist/assets/fonts/ibm-plex-mono-400.woff2\":58,\"dist/assets/fonts/ibm-plex-mono-500.woff2\":62,\"dist/assets/fonts/ibm-plex-mono-600.woff2\":78,\"dist/assets/fonts/montserrat-400.woff2\":151,\"dist/assets/fonts/montserrat-500.woff2\":151,\"dist/assets/fonts/montserrat-600.woff2\":151,\"dist/assets/logo-1.png\":107,\"dist/assets/logo.svg\":1,\"dist/assets/memes/garden-1.png\":131,\"dist/assets/memes/garden-1.svg\":1,\"dist/assets/memes/garden-2.png\":144,\"dist/assets/memes/garden-2.svg\":1,\"dist/assets/memes/garden-3.png\":256,\"dist/assets/memes/garden-3.svg\":1,\"dist/assets/memes/garden-4.png\":240,\"dist/assets/memes/garden-4.svg\":1,\"dist/assets/memes/garden-5.png\":97,\"dist/assets/memes/garden-5.svg\":1,\"dist/assets/memes/garden-6.png\":80,\"dist/assets/memes/garden-6.svg\":1,\"dist/assets/model.js\":52,\"dist/assets/style.css\":12,\"dist/assets/wallet-garden.svg\":1,\"dist/index.html\":129,\"dist/simd-coin.json\":1,\"foundry.toml\":12,\"launch.json\":24,\"lib/solmate/LICENSE\":1,\"lib/solmate/PROVENANCE.md\":1,\"lib/solmate/src/auth/Owned.sol\":44,\"lib/v4-core/PROVENANCE.md\":1,\"lib/v4-core/licenses/BUSL_LICENSE\":63,\"lib/v4-core/licenses/MIT_LICENSE\":7,\"lib/v4-core/src/ERC6909.sol\":90,\"lib/v4-core/src/ERC6909Claims.sol\":23,\"lib/v4-core/src/Extsload.sol\":64,\"lib/v4-core/src/Exttload.sol\":40,\"lib/v4-core/src/NoDelegateCall.sol\":33,\"lib/v4-core/src/PoolManager.sol\":394,\"lib/v4-core/src/ProtocolFees.sol\":71,\"lib/v4-core/src/interfaces/IExtsload.sol\":21,\"lib/v4-core/src/interfaces/IExttload.sol\":15,\"lib/v4-core/src/interfaces/IHooks.sol\":152,\"lib/v4-core/src/interfaces/IPoolManager.sol\":217,\"lib/v4-core/src/interfaces/IProtocolFees.sol\":52,\"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol\":10,\"lib/v4-core/src/interfaces/external/IERC20Minimal.sol\":48,\"lib/v4-core/src/interfaces/external/IERC6909Claims.sol\":66,\"lib/v4-core/src/libraries/BitMath.sol\":49,\"lib/v4-core/src/libraries/CurrencyDelta.sol\":42,\"lib/v4-core/src/libraries/CurrencyReserves.sol\":39,\"lib/v4-core/src/libraries/CustomRevert.sol\":120,\"lib/v4-core/src/libraries/FixedPoint128.sol\":8,\"lib/v4-core/src/libraries/FixedPoint96.sol\":10,\"lib/v4-core/src/libraries/FullMath.sol\":117,\"lib/v4-core/src/libraries/Hooks.sol\":344,\"lib/v4-core/src/libraries/LPFeeLibrary.sol\":79,\"lib/v4-core/src/libraries/LiquidityMath.sol\":20,\"lib/v4-core/src/libraries/Lock.sol\":28,\"lib/v4-core/src/libraries/NonzeroDeltaCount.sol\":35,\"lib/v4-core/src/libraries/ParseBytes.sol\":29,\"lib/v4-core/src/libraries/Pool.sol\":620,\"lib/v4-core/src/libraries/Position.sol\":103,\"lib/v4-core/src/libraries/ProtocolFeeLibrary.sol\":47,\"lib/v4-core/src/libraries/SafeCast.sol\":60,\"lib/v4-core/src/libraries/SqrtPriceMath.sol\":292,\"lib/v4-core/src/libraries/SwapMath.sol\":108,\"lib/v4-core/src/libraries/TickBitmap.sol\":121,\"lib/v4-core/src/libraries/TickMath.sol\":238,\"lib/v4-core/src/libraries/UnsafeMath.sol\":29,\"lib/v4-core/src/types/BalanceDelta.sol\":72,\"lib/v4-core/src/types/BeforeSwapDelta.sol\":38,\"lib/v4-core/src/types/Currency.sol\":118,\"lib/v4-core/src/types/PoolId.sol\":17,\"lib/v4-core/src/types/PoolKey.sol\":22,\"lib/v4-core/src/types/PoolOperation.sol\":26,\"lib/v4-core/src/types/Slot0.sol\":95,\"licenses/Better-Interface-LICENSE.txt\":220,\"licenses/Fredoka-OFL.txt\":93,\"licenses/IBM-Plex-Mono-OFL.txt\":93,\"licenses/Montserrat-OFL.txt\":93,\"licenses/eth-testing-LICENSE.txt\":30,\"logos/logo-1.png\":107,\"package-lock.json\":115,\"package.json\":19,\"remappings.txt\":2,\"scripts/browser-check.mjs\":126,\"scripts/budget.mjs\":24,\"scripts/build.mjs\":14,\"scripts/preview.mjs\":23,\"site/404.html\":1,\"site/assets/SUNToken.sol\":76,\"site/assets/app.js\":194,\"site/assets/bee.svg\":1,\"site/assets/favicon.png\":17,\"site/assets/fonts/fonts.css\":75,\"site/assets/fonts/fredoka-400.woff2\":121,\"site/assets/fonts/fredoka-500.woff2\":121,\"site/assets/fonts/fredoka-600.woff2\":121,\"site/assets/fonts/ibm-plex-mono-400.woff2\":58,\"site/assets/fonts/ibm-plex-mono-500.woff2\":62,\"site/assets/fonts/ibm-plex-mono-600.woff2\":78,\"site/assets/fonts/montserrat-400.woff2\":151,\"site/assets/fonts/montserrat-500.woff2\":151,\"site/assets/fonts/montserrat-600.woff2\":151,\"site/assets/logo-1.png\":107,\"site/assets/logo.svg\":1,\"site/assets/memes/garden-1.png\":131,\"site/assets/memes/garden-1.svg\":1,\"site/assets/memes/garden-2.png\":144,\"site/assets/memes/garden-2.svg\":1,\"site/assets/memes/garden-3.png\":256,\"site/assets/memes/garden-3.svg\":1,\"site/assets/memes/garden-4.png\":240,\"site/assets/memes/garden-4.svg\":1,\"site/assets/memes/garden-5.png\":97,\"site/assets/memes/garden-5.svg\":1,\"site/assets/memes/garden-6.png\":80,\"site/assets/memes/garden-6.svg\":1,\"site/assets/model.js\":52,\"site/assets/style.css\":12,\"site/assets/wallet-garden.svg\":1,\"site/index.html\":129,\"site/simd-coin.json\":1,\"src/SUNToken.sol\":76,\"test/SUNToken.t.sol\":235,\"test/SUNTokenEdges.t.sol\":228,\"test/SUNTokenInvariant.t.sol\":238,\"test/SUNTokenSmoke.t.sol\":209,\"test/TESTING.md\":40,\"test/UniswapV4.t.sol\":342,\"test/helpers/SUNV4Trader.sol\":98,\"test/site-model.test.mjs\":46,\"tsconfig.json\":13},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"596f0964e13c0a6f694ef2491a8c8ae9f6cde80fe1d7a865ad9a3cc973a4e66b","verifiedTreeHash":"d48fa82c91166e51ed621c3ef0004564bc31925f","verifierVersion":"0.1.0+63e0a393"},{"checks":[{"durationMs":888,"exitCode":0,"name":"build","output":"Compiling 48 files with Solc 0.8.26\nSolc 0.8.26 finished in 837.59ms\nCompiler run successful!\n","passed":true},{"durationMs":359,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 2 tests for test/UniswapV4.t.sol:SUNAsCurrencyZeroTest\n[PASS] test_ActualV4SingleSidedSeedBuyAndSell() (gas: 670362)\n[PASS] test_ActualV4WithdrawalIsAlsoTaxedOnPoolOutflow() (gas: 354333)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.10ms (737.67µs CPU time)\n\nRan 2 tests for test/UniswapV4.t.sol:SUNAsCurrencyOneTest\n[PASS] test_ActualV4SingleSidedSeedBuyAndSell() (gas: 676041)\n[PASS] test_ActualV4WithdrawalIsAlsoTaxedOnPoolOutflow() (gas: 358900)\nSuite result: ok. 2 passed; 0 failed; 0 skipped; finished in 1.14ms (750.92µs CPU time)\n\nRan 11 tests for test/SUNToken.t.sol:SUNTokenTest\n[PASS] testFuzz_BuySellAndWalletConservation(uint256) (runs: 1000, μ: 297072, ~: 301590)\n[PASS] testFuzz_StatefulSupplyConservation(bytes32) (runs: 1000, μ: 3909418, ~: 3916670)\n[PASS] test_BuyEventsDescribeActualCredits() (gas: 146827)\n[PASS] test_FactoryReceivesEverythingAndDistributesExactly() (gas: 206149)\n[PASS] test_InvalidCallsRevertAtomically() (gas: 285236)\n[PASS] test_NoAdminMintBurnUpgradeOrFeeMutation() (gas: 817518)\n[PASS] test_RoundingAtSmallestTaxUnit() (gas: 209547)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 435169)\n[PASS] test_SelfTransfersZeroTransfersAndCreatorAsBuyer() (gas: 288497)\n[PASS] test_TransferFromChargesGrossAllowanceAndCannotBypassTax() (gas: 303999)\n[PASS] test_UnlimitedAllowanceAndOverwrite() (gas: 222786)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 295.24ms (330.15ms CPU time)\n\nRan 3 test suites in 295.70ms (297.48ms CPU time): 15 tests passed, 0 failed, 0 skipped (15 total tests)\n","passed":true},{"durationMs":79,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PoolManager.approve(address,uint256,uint256)\",\"PoolManager.burn(address,uint256,uint256)\",\"PoolManager.clear(address,uint256)\",\"PoolManager.collectProtocolFees(address,address,uint256)\",\"PoolManager.donate((address,address,uint24,int24,address),uint256,uint256,bytes)\",\"PoolManager.initialize((address,address,uint24,int24,address),uint160)\",\"PoolManager.mint(address,uint256,uint256)\",\"PoolManager.modifyLiquidity((address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"PoolManager.setOperator(address,bool)\",\"PoolManager.setProtocolFee((address,address,uint24,int24,address),uint24)\",\"PoolManager.setProtocolFeeController(address)\",\"PoolManager.settle()\",\"PoolManager.settleFor(address)\",\"PoolManager.swap((address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"PoolManager.sync(address)\",\"PoolManager.take(address,address,uint256)\",\"PoolManager.transfer(address,uint256,uint256)\",\"PoolManager.transferFrom(address,address,uint256,uint256)\",\"PoolManager.transferOwnership(address)\",\"PoolManager.unlock(bytes)\",\"PoolManager.updateDynamicLPFee((address,address,uint24,int24,address),uint24)\",\"SUNToken.approve(address,uint256)\",\"SUNToken.transfer(address,uint256)\",\"SUNToken.transferFrom(address,address,uint256)\"],\"files\":{\"DESIGN.md\":89,\"README.md\":112,\"dist/404.html\":1,\"dist/assets/SUNToken.sol\":76,\"dist/assets/app.js\":194,\"dist/assets/bee.svg\":1,\"dist/assets/favicon.png\":17,\"dist/assets/fonts/fonts.css\":75,\"dist/assets/fonts/fredoka-400.woff2\":121,\"dist/assets/fonts/fredoka-500.woff2\":121,\"dist/assets/fonts/fredoka-600.woff2\":121,\"dist/assets/fonts/ibm-plex-mono-400.woff2\":58,\"dist/assets/fonts/ibm-plex-mono-500.woff2\":62,\"dist/assets/fonts/ibm-plex-mono-600.woff2\":78,\"dist/assets/fonts/montserrat-400.woff2\":151,\"dist/assets/fonts/montserrat-500.woff2\":151,\"dist/assets/fonts/montserrat-600.woff2\":151,\"dist/assets/logo-1.png\":107,\"dist/assets/logo.svg\":1,\"dist/assets/memes/garden-1.png\":131,\"dist/assets/memes/garden-1.svg\":1,\"dist/assets/memes/garden-2.png\":144,\"dist/assets/memes/garden-2.svg\":1,\"dist/assets/memes/garden-3.png\":256,\"dist/assets/memes/garden-3.svg\":1,\"dist/assets/memes/garden-4.png\":240,\"dist/assets/memes/garden-4.svg\":1,\"dist/assets/memes/garden-5.png\":97,\"dist/assets/memes/garden-5.svg\":1,\"dist/assets/memes/garden-6.png\":80,\"dist/assets/memes/garden-6.svg\":1,\"dist/assets/model.js\":52,\"dist/assets/style.css\":12,\"dist/assets/wallet-garden.svg\":1,\"dist/index.html\":129,\"dist/simd-coin.json\":1,\"foundry.toml\":12,\"launch.json\":24,\"lib/solmate/LICENSE\":1,\"lib/solmate/PROVENANCE.md\":1,\"lib/solmate/src/auth/Owned.sol\":44,\"lib/v4-core/PROVENANCE.md\":1,\"lib/v4-core/licenses/BUSL_LICENSE\":63,\"lib/v4-core/licenses/MIT_LICENSE\":7,\"lib/v4-core/src/ERC6909.sol\":90,\"lib/v4-core/src/ERC6909Claims.sol\":23,\"lib/v4-core/src/Extsload.sol\":64,\"lib/v4-core/src/Exttload.sol\":40,\"lib/v4-core/src/NoDelegateCall.sol\":33,\"lib/v4-core/src/PoolManager.sol\":394,\"lib/v4-core/src/ProtocolFees.sol\":71,\"lib/v4-core/src/interfaces/IExtsload.sol\":21,\"lib/v4-core/src/interfaces/IExttload.sol\":15,\"lib/v4-core/src/interfaces/IHooks.sol\":152,\"lib/v4-core/src/interfaces/IPoolManager.sol\":217,\"lib/v4-core/src/interfaces/IProtocolFees.sol\":52,\"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol\":10,\"lib/v4-core/src/interfaces/external/IERC20Minimal.sol\":48,\"lib/v4-core/src/interfaces/external/IERC6909Claims.sol\":66,\"lib/v4-core/src/libraries/BitMath.sol\":49,\"lib/v4-core/src/libraries/CurrencyDelta.sol\":42,\"lib/v4-core/src/libraries/CurrencyReserves.sol\":39,\"lib/v4-core/src/libraries/CustomRevert.sol\":120,\"lib/v4-core/src/libraries/FixedPoint128.sol\":8,\"lib/v4-core/src/libraries/FixedPoint96.sol\":10,\"lib/v4-core/src/libraries/FullMath.sol\":117,\"lib/v4-core/src/libraries/Hooks.sol\":344,\"lib/v4-core/src/libraries/LPFeeLibrary.sol\":79,\"lib/v4-core/src/libraries/LiquidityMath.sol\":20,\"lib/v4-core/src/libraries/Lock.sol\":28,\"lib/v4-core/src/libraries/NonzeroDeltaCount.sol\":35,\"lib/v4-core/src/libraries/ParseBytes.sol\":29,\"lib/v4-core/src/libraries/Pool.sol\":620,\"lib/v4-core/src/libraries/Position.sol\":103,\"lib/v4-core/src/libraries/ProtocolFeeLibrary.sol\":47,\"lib/v4-core/src/libraries/SafeCast.sol\":60,\"lib/v4-core/src/libraries/SqrtPriceMath.sol\":292,\"lib/v4-core/src/libraries/SwapMath.sol\":108,\"lib/v4-core/src/libraries/TickBitmap.sol\":121,\"lib/v4-core/src/libraries/TickMath.sol\":238,\"lib/v4-core/src/libraries/UnsafeMath.sol\":29,\"lib/v4-core/src/types/BalanceDelta.sol\":72,\"lib/v4-core/src/types/BeforeSwapDelta.sol\":38,\"lib/v4-core/src/types/Currency.sol\":118,\"lib/v4-core/src/types/PoolId.sol\":17,\"lib/v4-core/src/types/PoolKey.sol\":22,\"lib/v4-core/src/types/PoolOperation.sol\":26,\"lib/v4-core/src/types/Slot0.sol\":95,\"licenses/Better-Interface-LICENSE.txt\":220,\"licenses/Fredoka-OFL.txt\":93,\"licenses/IBM-Plex-Mono-OFL.txt\":93,\"licenses/Montserrat-OFL.txt\":93,\"licenses/eth-testing-LICENSE.txt\":30,\"logos/logo-1.png\":107,\"package-lock.json\":115,\"package.json\":19,\"remappings.txt\":2,\"scripts/browser-check.mjs\":126,\"scripts/budget.mjs\":24,\"scripts/build.mjs\":14,\"scripts/preview.mjs\":23,\"site/404.html\":1,\"site/assets/SUNToken.sol\":76,\"site/assets/app.js\":194,\"site/assets/bee.svg\":1,\"site/assets/favicon.png\":17,\"site/assets/fonts/fonts.css\":75,\"site/assets/fonts/fredoka-400.woff2\":121,\"site/assets/fonts/fredoka-500.woff2\":121,\"site/assets/fonts/fredoka-600.woff2\":121,\"site/assets/fonts/ibm-plex-mono-400.woff2\":58,\"site/assets/fonts/ibm-plex-mono-500.woff2\":62,\"site/assets/fonts/ibm-plex-mono-600.woff2\":78,\"site/assets/fonts/montserrat-400.woff2\":151,\"site/assets/fonts/montserrat-500.woff2\":151,\"site/assets/fonts/montserrat-600.woff2\":151,\"site/assets/logo-1.png\":107,\"site/assets/logo.svg\":1,\"site/assets/memes/garden-1.png\":131,\"site/assets/memes/garden-1.svg\":1,\"site/assets/memes/garden-2.png\":144,\"site/assets/memes/garden-2.svg\":1,\"site/assets/memes/garden-3.png\":256,\"site/assets/memes/garden-3.svg\":1,\"site/assets/memes/garden-4.png\":240,\"site/assets/memes/garden-4.svg\":1,\"site/assets/memes/garden-5.png\":97,\"site/assets/memes/garden-5.svg\":1,\"site/assets/memes/garden-6.png\":80,\"site/assets/memes/garden-6.svg\":1,\"site/assets/model.js\":52,\"site/assets/style.css\":12,\"site/assets/wallet-garden.svg\":1,\"site/index.html\":129,\"site/simd-coin.json\":1,\"src/SUNToken.sol\":76,\"test/SUNToken.t.sol\":224,\"test/UniswapV4.t.sol\":171,\"test/site-model.test.mjs\":46,\"tsconfig.json\":13},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true},{"durationMs":347,"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/SUNToken.sol:11: Large Numeric Literal (2 places)","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"897b908f0fba768aca1eebb27575eed88519a79d39aa6646af26dc7f53aa68c3","verifiedTreeHash":"3c3e7c05c56e24746bb8f1194f39c755b4e5490f","verifierVersion":"0.1.0+63e0a393"},{"checks":[{"durationMs":1964,"exitCode":0,"name":"build","output":"Compiling 52 files with Solc 0.8.26\nSolc 0.8.26 finished in 1.91s\nCompiler run successful!\n","passed":true},{"durationMs":1220,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 12 tests for test/SUNTokenSmoke.t.sol:SUNTokenSmokeTest\n[PASS] test_BuyFromPoolManagerPaysHalfPercentToCreator() (gas: 155388)\n[PASS] test_DeployerHoldsFullSupplyAndFactorySplitsIt() (gas: 148514)\n[PASS] test_FeeRateAndRecipientAreCompileTimeConstants() (gas: 172456)\n[PASS] test_NoOwnerOrAdminPowers() (gas: 199630)\n[PASS] test_PoolRoundTripBalances() (gas: 236468)\n[PASS] test_RevertsOnInsufficientAllowance() (gas: 85941)\n[PASS] test_RevertsOnInsufficientBalance() (gas: 89560)\n[PASS] test_RevertsOnZeroAddressReceiver() (gas: 30782)\n[PASS] test_SellToPoolManagerIsUntaxed() (gas: 125866)\n[PASS] test_SupplyIsOneBillionWithEighteenDecimals() (gas: 27649)\n[PASS] test_TransferFromOutOfPoolManagerIsAlsoTaxed() (gas: 198383)\n[PASS] test_WalletToWalletTransferIsFree() (gas: 130391)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 55.61ms (2.62ms CPU time)\n\nRan 8 tests for test/UniswapV4.t.sol:SUNAsCurrencyOneTest\n[PASS] testFuzz_IndependentTraderBuySellAndOptionalForwarding(uint256,bool) (runs: 256, μ: 1882439, ~: 1888830)\n[PASS] test_AccruedLPFeesSettleWithTaxOnlyOnSunOutflow() (gas: 1978446)\n[PASS] test_ActualV4SingleSidedSeedBuyAndSell() (gas: 676766)\n[PASS] test_ActualV4WithdrawalIsAlsoTaxedOnPoolOutflow() (gas: 359179)\n[PASS] test_ExactOutputBuyReportsGrossButDeliversNet() (gas: 1610823)\n[PASS] test_NetOutputSlippageFailureRollsBackSwapAndCreatorFee() (gas: 1821305)\n[PASS] test_StaticPoolFeeRejectsDynamicUpdates() (gas: 38592)\n[PASS] test_UnderpaidSellRevertsAtomicallyThenFullyPaidSellSucceeds() (gas: 1986965)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 55.59ms (59.58ms CPU time)\n\nRan 8 tests for test/UniswapV4.t.sol:SUNAsCurrencyZeroTest\n[PASS] testFuzz_IndependentTraderBuySellAndOptionalForwarding(uint256,bool) (runs: 256, μ: 1876847, ~: 1883397)\n[PASS] test_AccruedLPFeesSettleWithTaxOnlyOnSunOutflow() (gas: 1972767)\n[PASS] test_ActualV4SingleSidedSeedBuyAndSell() (gas: 671087)\n[PASS] test_ActualV4WithdrawalIsAlsoTaxedOnPoolOutflow() (gas: 354612)\n[PASS] test_ExactOutputBuyReportsGrossButDeliversNet() (gas: 1606255)\n[PASS] test_NetOutputSlippageFailureRollsBackSwapAndCreatorFee() (gas: 1817089)\n[PASS] test_StaticPoolFeeRejectsDynamicUpdates() (gas: 38592)\n[PASS] test_UnderpaidSellRevertsAtomicallyThenFullyPaidSellSucceeds() (gas: 1981592)\nSuite result: ok. 8 passed; 0 failed; 0 skipped; finished in 66.39ms (70.65ms CPU time)\n\nRan 11 tests for test/SUNTokenEdges.t.sol:SUNTokenEdgesTest\n[PASS] testFuzz_DelegatedSelfTransfersConsumeAllowanceWithoutMovingBalances(uint256) (runs: 256, μ: 452440, ~: 454483)\n[PASS] testFuzz_NetAllowanceCannotAuthorizeGrossBuy(uint256) (runs: 256, μ: 301629, ~: 301683)\n[PASS] testFuzz_NetBalanceCannotFundGrossBuyAndAllowanceRollsBack(uint256) (runs: 256, μ: 251440, ~: 251483)\n[PASS] testFuzz_TaxUsesTokenSenderNotApprovedSpender(uint256) (runs: 256, μ: 351357, ~: 356851)\n[PASS] test_ContractDeployerGetsSingleMintAndLaunchCallerGetsNothing() (gas: 207432)\n[PASS] test_CreatorAsBuyRecipientHasBothCreditsInEvents() (gas: 126255)\n[PASS] test_CreatorCanSpendAllCollectedFeesWithoutAnotherTax() (gas: 250302)\n[PASS] test_InvalidBuyRecipientRollsBackFiniteAndInfiniteAllowance() (gas: 279647)\n[PASS] test_MaximumAmountRevertsWithBalanceErrorBeforeTaxArithmetic() (gas: 198179)\n[PASS] test_ZeroAmountsStillRejectZeroAddresses() (gas: 120168)\n[PASS] test_ZeroAndDustBuysEmitOnlyActualCredit() (gas: 194336)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 110.24ms (93.68ms CPU time)\n\nRan 11 tests for test/SUNToken.t.sol:SUNTokenTest\n[PASS] testFuzz_BuySellAndWalletConservation(uint256) (runs: 256, μ: 296795, ~: 301638)\n[PASS] testFuzz_StatefulSupplyConservation(bytes32) (runs: 256, μ: 3911535, ~: 3920168)\n[PASS] test_BuyEventsDescribeActualCredits() (gas: 146827)\n[PASS] test_FactoryReceivesEverythingAndDistributesExactly() (gas: 206149)\n[PASS] test_InvalidCallsRevertAtomically() (gas: 285236)\n[PASS] test_NoAdminMintBurnUpgradeOrFeeMutation() (gas: 2838313)\n[PASS] test_RoundingAtSmallestTaxUnit() (gas: 209547)\n[PASS] test_RuntimeHasNoForbiddenOpcodes() (gas: 435169)\n[PASS] test_SelfTransfersZeroTransfersAndCreatorAsBuyer() (gas: 288497)\n[PASS] test_TransferFromChargesGrossAllowanceAndCannotBypassTax() (gas: 303999)\n[PASS] test_UnlimitedAllowanceAndOverwrite() (gas: 222786)\nSuite result: ok. 11 passed; 0 failed; 0 skipped; finished in 135.76ms (157.83ms CPU time)\n\nRan 1 test for test/SUNTokenInvariant.t.sol:SUNTokenInvariantTest\n[PASS] invariant_SupplyBalancesAllowancesAndParameters() (runs: 64, calls: 3072, reverts: 0)\n\n╭-----------------+-----------------------+-------+---------+----------╮\n| Contract        | Selector              | Calls | Reverts | Discards |\n+======================================================================+\n| SUNTokenHandler | approve               | 391   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | buy                   | 387   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | rejectOverdraw        | 382   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | rejectUnapprovedSpend | 374   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | rejectZeroRecipient   | 393   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | sell                  | 382   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | transfer              | 385   | 0       | 0        |\n|-----------------+-----------------------+-------+---------+----------|\n| SUNTokenHandler | transferFrom          | 378   | 0       | 0        |\n╰-----------------+-----------------------+-------+---------+----------╯\n\nSuite result: ok. 1 passed; 0 failed; 0 skipped; finished in 1.13s (1.13s CPU time)\n\nRan 6 test suites in 1.13s (1.56s CPU time): 51 tests passed, 0 failed, 0 skipped (51 total tests)\n","passed":true},{"durationMs":54,"exitCode":0,"name":"source-index","output":"{\"v\":1,\"entryPoints\":[\"PoolManager.approve(address,uint256,uint256)\",\"PoolManager.burn(address,uint256,uint256)\",\"PoolManager.clear(address,uint256)\",\"PoolManager.collectProtocolFees(address,address,uint256)\",\"PoolManager.donate((address,address,uint24,int24,address),uint256,uint256,bytes)\",\"PoolManager.initialize((address,address,uint24,int24,address),uint160)\",\"PoolManager.mint(address,uint256,uint256)\",\"PoolManager.modifyLiquidity((address,address,uint24,int24,address),(int24,int24,int256,bytes32),bytes)\",\"PoolManager.setOperator(address,bool)\",\"PoolManager.setProtocolFee((address,address,uint24,int24,address),uint24)\",\"PoolManager.setProtocolFeeController(address)\",\"PoolManager.settle()\",\"PoolManager.settleFor(address)\",\"PoolManager.swap((address,address,uint24,int24,address),(bool,int256,uint160),bytes)\",\"PoolManager.sync(address)\",\"PoolManager.take(address,address,uint256)\",\"PoolManager.transfer(address,uint256,uint256)\",\"PoolManager.transferFrom(address,address,uint256,uint256)\",\"PoolManager.transferOwnership(address)\",\"PoolManager.unlock(bytes)\",\"PoolManager.updateDynamicLPFee((address,address,uint24,int24,address),uint24)\",\"SUNToken.approve(address,uint256)\",\"SUNToken.transfer(address,uint256)\",\"SUNToken.transferFrom(address,address,uint256)\"],\"files\":{\"DESIGN.md\":89,\"README.md\":114,\"dist/404.html\":1,\"dist/assets/SUNToken.sol\":76,\"dist/assets/app.js\":194,\"dist/assets/bee.svg\":1,\"dist/assets/favicon.png\":17,\"dist/assets/fonts/fonts.css\":75,\"dist/assets/fonts/fredoka-400.woff2\":121,\"dist/assets/fonts/fredoka-500.woff2\":121,\"dist/assets/fonts/fredoka-600.woff2\":121,\"dist/assets/fonts/ibm-plex-mono-400.woff2\":58,\"dist/assets/fonts/ibm-plex-mono-500.woff2\":62,\"dist/assets/fonts/ibm-plex-mono-600.woff2\":78,\"dist/assets/fonts/montserrat-400.woff2\":151,\"dist/assets/fonts/montserrat-500.woff2\":151,\"dist/assets/fonts/montserrat-600.woff2\":151,\"dist/assets/logo-1.png\":107,\"dist/assets/logo.svg\":1,\"dist/assets/memes/garden-1.png\":131,\"dist/assets/memes/garden-1.svg\":1,\"dist/assets/memes/garden-2.png\":144,\"dist/assets/memes/garden-2.svg\":1,\"dist/assets/memes/garden-3.png\":256,\"dist/assets/memes/garden-3.svg\":1,\"dist/assets/memes/garden-4.png\":240,\"dist/assets/memes/garden-4.svg\":1,\"dist/assets/memes/garden-5.png\":97,\"dist/assets/memes/garden-5.svg\":1,\"dist/assets/memes/garden-6.png\":80,\"dist/assets/memes/garden-6.svg\":1,\"dist/assets/model.js\":52,\"dist/assets/style.css\":12,\"dist/assets/wallet-garden.svg\":1,\"dist/index.html\":129,\"dist/simd-coin.json\":1,\"foundry.toml\":12,\"launch.json\":24,\"lib/solmate/LICENSE\":1,\"lib/solmate/PROVENANCE.md\":1,\"lib/solmate/src/auth/Owned.sol\":44,\"lib/v4-core/PROVENANCE.md\":1,\"lib/v4-core/licenses/BUSL_LICENSE\":63,\"lib/v4-core/licenses/MIT_LICENSE\":7,\"lib/v4-core/src/ERC6909.sol\":90,\"lib/v4-core/src/ERC6909Claims.sol\":23,\"lib/v4-core/src/Extsload.sol\":64,\"lib/v4-core/src/Exttload.sol\":40,\"lib/v4-core/src/NoDelegateCall.sol\":33,\"lib/v4-core/src/PoolManager.sol\":394,\"lib/v4-core/src/ProtocolFees.sol\":71,\"lib/v4-core/src/interfaces/IExtsload.sol\":21,\"lib/v4-core/src/interfaces/IExttload.sol\":15,\"lib/v4-core/src/interfaces/IHooks.sol\":152,\"lib/v4-core/src/interfaces/IPoolManager.sol\":217,\"lib/v4-core/src/interfaces/IProtocolFees.sol\":52,\"lib/v4-core/src/interfaces/callback/IUnlockCallback.sol\":10,\"lib/v4-core/src/interfaces/external/IERC20Minimal.sol\":48,\"lib/v4-core/src/interfaces/external/IERC6909Claims.sol\":66,\"lib/v4-core/src/libraries/BitMath.sol\":49,\"lib/v4-core/src/libraries/CurrencyDelta.sol\":42,\"lib/v4-core/src/libraries/CurrencyReserves.sol\":39,\"lib/v4-core/src/libraries/CustomRevert.sol\":120,\"lib/v4-core/src/libraries/FixedPoint128.sol\":8,\"lib/v4-core/src/libraries/FixedPoint96.sol\":10,\"lib/v4-core/src/libraries/FullMath.sol\":117,\"lib/v4-core/src/libraries/Hooks.sol\":344,\"lib/v4-core/src/libraries/LPFeeLibrary.sol\":79,\"lib/v4-core/src/libraries/LiquidityMath.sol\":20,\"lib/v4-core/src/libraries/Lock.sol\":28,\"lib/v4-core/src/libraries/NonzeroDeltaCount.sol\":35,\"lib/v4-core/src/libraries/ParseBytes.sol\":29,\"lib/v4-core/src/libraries/Pool.sol\":620,\"lib/v4-core/src/libraries/Position.sol\":103,\"lib/v4-core/src/libraries/ProtocolFeeLibrary.sol\":47,\"lib/v4-core/src/libraries/SafeCast.sol\":60,\"lib/v4-core/src/libraries/SqrtPriceMath.sol\":292,\"lib/v4-core/src/libraries/SwapMath.sol\":108,\"lib/v4-core/src/libraries/TickBitmap.sol\":121,\"lib/v4-core/src/libraries/TickMath.sol\":238,\"lib/v4-core/src/libraries/UnsafeMath.sol\":29,\"lib/v4-core/src/types/BalanceDelta.sol\":72,\"lib/v4-core/src/types/BeforeSwapDelta.sol\":38,\"lib/v4-core/src/types/Currency.sol\":118,\"lib/v4-core/src/types/PoolId.sol\":17,\"lib/v4-core/src/types/PoolKey.sol\":22,\"lib/v4-core/src/types/PoolOperation.sol\":26,\"lib/v4-core/src/types/Slot0.sol\":95,\"licenses/Better-Interface-LICENSE.txt\":220,\"licenses/Fredoka-OFL.txt\":93,\"licenses/IBM-Plex-Mono-OFL.txt\":93,\"licenses/Montserrat-OFL.txt\":93,\"licenses/eth-testing-LICENSE.txt\":30,\"logos/logo-1.png\":107,\"package-lock.json\":115,\"package.json\":19,\"remappings.txt\":2,\"scripts/browser-check.mjs\":126,\"scripts/budget.mjs\":24,\"scripts/build.mjs\":14,\"scripts/preview.mjs\":23,\"site/404.html\":1,\"site/assets/SUNToken.sol\":76,\"site/assets/app.js\":194,\"site/assets/bee.svg\":1,\"site/assets/favicon.png\":17,\"site/assets/fonts/fonts.css\":75,\"site/assets/fonts/fredoka-400.woff2\":121,\"site/assets/fonts/fredoka-500.woff2\":121,\"site/assets/fonts/fredoka-600.woff2\":121,\"site/assets/fonts/ibm-plex-mono-400.woff2\":58,\"site/assets/fonts/ibm-plex-mono-500.woff2\":62,\"site/assets/fonts/ibm-plex-mono-600.woff2\":78,\"site/assets/fonts/montserrat-400.woff2\":151,\"site/assets/fonts/montserrat-500.woff2\":151,\"site/assets/fonts/montserrat-600.woff2\":151,\"site/assets/logo-1.png\":107,\"site/assets/logo.svg\":1,\"site/assets/memes/garden-1.png\":131,\"site/assets/memes/garden-1.svg\":1,\"site/assets/memes/garden-2.png\":144,\"site/assets/memes/garden-2.svg\":1,\"site/assets/memes/garden-3.png\":256,\"site/assets/memes/garden-3.svg\":1,\"site/assets/memes/garden-4.png\":240,\"site/assets/memes/garden-4.svg\":1,\"site/assets/memes/garden-5.png\":97,\"site/assets/memes/garden-5.svg\":1,\"site/assets/memes/garden-6.png\":80,\"site/assets/memes/garden-6.svg\":1,\"site/assets/model.js\":52,\"site/assets/style.css\":12,\"site/assets/wallet-garden.svg\":1,\"site/index.html\":129,\"site/simd-coin.json\":1,\"src/SUNToken.sol\":76,\"test/SUNToken.t.sol\":235,\"test/SUNTokenEdges.t.sol\":228,\"test/SUNTokenInvariant.t.sol\":238,\"test/SUNTokenSmoke.t.sol\":209,\"test/TESTING.md\":40,\"test/UniswapV4.t.sol\":342,\"test/helpers/SUNV4Trader.sol\":98,\"test/site-model.test.mjs\":46,\"tsconfig.json\":13},\"excluded\":[\"node_modules/\"],\"truncated\":false}","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"c18bc701c53186b69c3162098447c15284c7fe299c43250932f1ef0402e22206","verifiedTreeHash":"31f3ae20f1223bb2cd739c40797fe293ea17757a","verifierVersion":"0.1.0+63e0a393"}]}