{"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":"bf1fbc45-d388-4ae1-ad7d-5022c6453c45","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":null,"dependsOn":["build_contract_project","manifest"],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","tools":[]},"key":"adversarial_review","kind":"code","role":"review","skillHash":"c26edc76dc7a76e09a42c3634054429c1679c6e247747d647a03f77e5b332d7e","skillId":"adversarial-review","state":"failed"},{"acceptedSubmissionHash":"af643d2b15e06d9129aaa3b353b8017e698f52b3195076a55cee66ed5071f738","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"fb6887b34514bcb194265fa403f0195c6a83eaef269da1e6189e1e9c4b372a7d","skillId":"build-contract-project","tools":[]},"key":"build_contract_project","kind":"code","role":"implement","skillHash":"fb6887b34514bcb194265fa403f0195c6a83eaef269da1e6189e1e9c4b372a7d","skillId":"build-contract-project","state":"accepted"},{"acceptedSubmissionHash":"437c4c447e2847698118ad50d78542da4852658d9a5c61b8bacbf1305294bc9d","dependsOn":["build_contract_project"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"accepted"}],"objective":"Build a Foundry project for $UP on Robinhood Chain, chainId 4663.\n\nFour contracts.\n\n1. UpToken: ERC-20, 18 decimals, symbol UP, name \"Uptime\".\n   Fixed total supply of 1_000_000_000e18 minted once in the\n   constructor: 700_000_000e18 to the EmissionVault address and\n   300_000_000e18 to the deployer for seeding liquidity.\n   No mint function after construction, no owner, no pause,\n   no blacklist, no upgradeability.\n\n2. EmissionVault: holds the 700M and releases it on a fixed schedule.\n   - immutable startTime set at construction\n   - EPOCH = 1 days, HALVING_PERIOD = 90 days\n   - epochBudget(uint256 epoch) returns 3_800_000e18 >> (epoch / 90)\n   - release(address to, uint256 amount): callable only by the\n     immutable distributor address. Reverts if it would exceed the\n     cumulative budget for all epochs elapsed so far minus everything\n     already released. There is NO other withdrawal path, no owner,\n     no sweep, no rescue function, no setter for the distributor.\n   - It also accepts UP sent to it by the hook; those tokens are added\n     to the releasable pool on the same schedule, never outside it.\n\n3. BatchPay: pay(address token, address[] to, uint256[] amount) pulls\n   the total from msg.sender and transfers to each recipient. Reverts\n   on length mismatch. Must handle 400 recipients in one call within\n   the chain's block gas limit. No owner, holds no funds.\n\n4. UpHook: a Uniswap v4 hook for the UP/ETH pool, static 1% LP fee,\n   PoolManager 0x8366a39CC670B4001A1121B8F6A443A643e40951.\n   Fees it accrues are split 6000/3500/500 bps:\n   6000 burned by transferring UP to address(0),\n   3500 forwarded to the EmissionVault,\n   500 forwarded to the immutable creator address.\n   All three bps values are immutable constants. Vault and creator\n   addresses are immutable constructor args. NO setters, no admin\n   functions, no owner, at all.\n\nDeploy script must:\n- mine a CREATE2 salt so the hook address carries the correct v4\n  permission flags for the hooks it implements\n- initialize the UP/ETH pool with the hook attached at a starting\n  sqrtPriceX96 passed as a parameter\n- mint a SINGLE-SIDED liquidity position through PositionManager\n  0x58daec3116aae6D93017bAAea7749052E8a04fA7 consisting of UP only\n  and zero ETH, in a tick range entirely above the starting price,\n  with tickLower and tickUpper as parameters\n- be parameterised for chainId 4663 and revert if run on any other\n\nFoundry tests must cover:\n- total supply is exactly 1e27 and the two initial balances sum to it\n- no code path mints after construction\n- release() reverts when asked for more than the elapsed schedule\n  allows, at t=0, mid-epoch, and after several halvings\n- release() reverts when called by anyone other than the distributor\n- there is no path by which the distributor drains the vault early\n- the three hook bps values sum to exactly 10000\n- a fuzz test that no caller can move value out of the hook except\n  through the fixed split\n- BatchPay with 400 recipients succeeds, mismatched lengths revert\n- the single-sided mint requires zero ETH from the deployer\n\nREADME must state plainly, in its first section: no premine, no team\nallocation, the deployer receives 5% of the 1% swap fee and nothing\nelse, and the 700M emissions are locked to a schedule that no one can\naccelerate.","parentJobId":null,"planHash":"a167c0ffe35266b2f0a22897936bb93da71f707616b6d830e1e928a736e09a8b","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"bf1fbc45-d388-4ae1-ad7d-5022c6453c45","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-157-build-foundry-project-up"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"50971","feedbackHash":"f422cd80366bcb73e59700b1e5148e88ddbe97dc8357d83f972fa23d89d8eb4b","nodeKey":"build_contract_project","submissionHash":"af643d2b15e06d9129aaa3b353b8017e698f52b3195076a55cee66ed5071f738","tag1":"verification:checks","tag2":"acceptance-v2","value":1},{"agentId":"50904","feedbackHash":"2289c7f2a91745103d1f7d20570c9e938a644539fdd63fb3d0cca76917c7938a","nodeKey":"manifest","submissionHash":"437c4c447e2847698118ad50d78542da4852658d9a5c61b8bacbf1305294bc9d","tag1":"verification:checks","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"165248e76c1b5f88de8a111d33cc14c4d8a87cd767d92d5929ae0d0612cd0847","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"bb0a3bf63233e5e5","findings":[],"hash":"0a2c7b179fb1130b2352fb1025dda5240f330b29850331144ef02959ef697c7d","nodeId":"f154f50f-8eb3-4c90-9d5b-1db77a4553c6","outcome":"failed","summary":"This content was flagged for possible cybersecurity risk. If this seems wrong, try rephrasing your request. If you’re doing authorized security work that requires more cyber permissive safeguards, apply for Daybreak access via https://platform.openai.com/settings/organization/status-and-access before retrying.","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":2,"wallClockMs":154994}},{"artifacts":[],"attempt":1,"bundleHash":"64602bb16a3971c715e32e6b22bd4e4a51d63e53e088d21eb06747547f292b9f","device":"c4f696e22e7a36f7","findings":[],"hash":"437c4c447e2847698118ad50d78542da4852658d9a5c61b8bacbf1305294bc9d","nodeId":"8dc0b377-ff0d-4332-aef7-dc4db7ecb20c","outcome":"completed","summary":"Created [launch.json](/root/.identitymd/work/bf1fbc45-d388-4ae1-ad7d-5022c6453c45/8dc0b377-ff0d-4332-aef7-dc4db7ecb20c/launch.json), the only changed deliverable.\n\n- Supplied JSON Schema and actual hook permissions validated.\n- Notes: 2,879/4,000 characters.\n- `forge build` succeeded; all 34 tests passed, including 1,000-run fuzz checks.\n\nThree deployment addresses remain explicitly unresolved. Notes identify the reference price/ticks and existing integration conflicts; this is not deployment-ready.","treeHash":"5cbfac63c93e9ce37c842327369d78f72c84a0af","usage":{"cachedInputTokens":463872,"inputTokens":49297,"model":"gpt-6-astra","outputTokens":6383,"runtime":"codex","turns":6,"wallClockMs":222408}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"c4f696e22e7a36f7","findings":[],"hash":"6453cb03dc90dbd2d64a4e73e9f482db4f4c5eca37b4501e8574b458110331ba","nodeId":"d2bd2123-6785-40ed-a7b3-0302b6381e4e","outcome":"failed","summary":"refused to run the build on what the agent produced, so this was not submitted: solc: solc is pinned to a path (vendor/solc/solc-0.8.26) rather than a version","treeHash":null,"usage":{"cachedInputTokens":4040064,"inputTokens":182443,"model":"gpt-6-astra","outputTokens":42519,"runtime":"codex","turns":10,"wallClockMs":1626218}},{"artifacts":[],"attempt":2,"bundleHash":null,"device":"377843575071cdb1","findings":[],"hash":"6fc067489d1ccb9fbdd5bfc9ee9c4ae81b0ed7ea59bec247adb5f8c8496602af","nodeId":"f154f50f-8eb3-4c90-9d5b-1db77a4553c6","outcome":"failed","summary":"This content was flagged for possible cybersecurity risk. If this seems wrong, try rephrasing your request. If you’re doing authorized security work that requires more cyber permissive safeguards, apply for Daybreak access via https://platform.openai.com/settings/organization/status-and-access before retrying.","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":2,"wallClockMs":162885}},{"artifacts":[],"attempt":2,"bundleHash":"1bd4969ba2e44b6493a7f570dda6eaec548fac50d8e4f875585f9e981e204859","device":"35c52a5b502e847c","findings":[],"hash":"af643d2b15e06d9129aaa3b353b8017e698f52b3195076a55cee66ed5071f738","nodeId":"d2bd2123-6785-40ed-a7b3-0302b6381e4e","outcome":"completed","summary":"Implemented four contracts, deployment script, vendored dependencies, and documentation. Solidity is pinned by version to **0.8.30**.\n\nOffline build, **34 tests**, and formatting checks pass.\n\nTwo acceptance conflicts remain:\n\n- Above-price UP-only liquidity uses WETH rather than native ETH.\n- The protected whole-supply-at-deployer assertion contradicts the required 70/30 split; its scratch replay fails.\n\nDetails are in [README.md](/home/identitymd5/.identitymd/work/bf1fbc45-d388-4ae1-ad7d-5022c6453c45/d2bd2123-6785-40ed-a7b3-0302b6381e4e/README.md). No transactions were broadcast.","treeHash":"c6905d9a51d9a996e6bc13dbd92cd2025581cd94","usage":{"cachedInputTokens":1807616,"inputTokens":104410,"model":"gpt-6-astra","outputTokens":34823,"runtime":"codex","turns":8,"wallClockMs":1136298}},{"artifacts":[],"attempt":3,"bundleHash":null,"device":"3f6a9bdd601cb99f","findings":[],"hash":"f802a9788e5c7dee59bae8cc66c19d7dd53a95217274de87171d063ad7c622ed","nodeId":"f154f50f-8eb3-4c90-9d5b-1db77a4553c6","outcome":"failed","summary":"This content was flagged for possible cybersecurity risk. If this seems wrong, try rephrasing your request. If you’re doing authorized security work that requires more cyber permissive safeguards, apply for Daybreak access via https://platform.openai.com/settings/organization/status-and-access before retrying.","treeHash":null,"usage":{"cachedInputTokens":0,"inputTokens":0,"model":null,"outputTokens":0,"runtime":"codex","turns":4,"wallClockMs":443220}}],"verification":[{"checks":[{"durationMs":15566,"exitCode":0,"name":"build","output":"Compiling 144 files with Solc 0.8.30\nSolc 0.8.30 finished in 15.45s\nCompiler run successful!\nwarning[incorrect-shift]: the order of args in a shift operation is incorrect\n   ╭▸ src/EmissionVault.sol:29:16\n   │\n29 │         return 3_800_000e18 >> (epoch / 90);\n   │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#incorrect-shift\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/SwapDriver.sol:38:60\n   │\n38 │                     .transferFrom(payer, address(manager), uint256(-int256(delta)))\n   │                                                            ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/SwapDriver.sol:42:43\n   │\n42 │             manager.take(currency, payer, uint256(int256(delta)));\n   │                                           ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/BatchPay.t.sol:22:29\n   │\n22 │             to[i] = address(uint160(0x10000 + i));\n   │                             ━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint160' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/BatchPay.t.sol:62:9\n   │\n62 │         token.transfer(address(batch), 100);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Hook.t.sol:70:9\n   │\n70 │         quote.transfer(TRADER, quote.balanceOf(address(this)));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/EmissionVault.sol:35:13\n   │\n35 │         if (block.timestamp <= startTime) return 0;\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ script/LaunchPlan.sol:52:52\n   │\n52 │             key, lower, upper, uint256(liquidity), uint128(SEED), uint128(0), recipient, bytes(\"\")\n   │                                                    ━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:150:44\n    │\n150 │         router.swap(key, SwapParams(true, -int256(bought / 2), TickMath.getSqrtPriceAtTick(LOWER)));\n    │                                            ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ script/Deploy.s.sol:58:68\n   │\n58 │             deployer == address(0) || distributor == address(0) || startTime < block.timestamp\n   │                                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/UpHook.sol:202:54\n    │\n202 │             poolManager.swap(key, SwapParams(false, -int256(amount), buybackSqrtPriceLimitX96), \"\");\n    │                                                      ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/Hook.t.sol:179:9\n    │\n179 │         quote.transfer(address(hook), 1e27);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[incorrect-shift]: the order of args in a shift operation is incorrect\n    ╭▸ test/TokenVault.t.sol:127:25\n    │\n127 │             expected += 3_800_000e18 >> (day / 90);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#incorrect-shift\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/Hook.t.sol:250:13\n    │\n250 │             up.transfer(address(hook), 1);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[incorrect-shift]: the order of args in a shift operation is incorrect\n    ╭▸ test/TokenVault.t.sol:178:31\n    │\n178 │             expected += 90 * (3_800_000e18 >> group);\n    │                               ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#incorrect-shift\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:273:45\n    │\n273 │         router.swap(key, SwapParams(false, -int256(amount), TickMath.getSqrtPriceAtTick(UPPER)));\n    │                                             ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVault.t.sol:64:9\n   │\n64 │         token.transferFrom(address(this), RECIPIENT, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVault.t.sol:67:9\n   │\n67 │         token.transfer(address(0), amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVault.t.sol:78:9\n   │\n78 │         token.transfer(RECIPIENT, 300_000_000e18 + 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVault.t.sol:81:9\n   │\n81 │         token.transferFrom(address(vault), RECIPIENT, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVault.t.sol:82:9\n   │\n82 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVault.t.sol:85:9\n   │\n85 │         token.transfer(RECIPIENT, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/TokenVault.t.sol:164:9\n    │\n164 │         token.transfer(address(vault), 100e18);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\n","passed":true},{"durationMs":152,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_insideRangeAndUnalignedTicksRejected() (gas: 22880)\n[PASS] test_mintEncodesSinglePositionZeroQuoteAndFixedOwner() (gas: 25056)\n[PASS] test_missingInfrastructureRejected() (gas: 12748)\n[PASS] test_nativeEthAboveCannotBeUpOnly() (gas: 11997)\n[PASS] test_wrongChainRejectedBeforeAnyDeployment() (gas: 13524)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 1.06ms (918.77µs CPU time)\n\nRan 4 tests for test/BatchPay.t.sol:BatchPayTest\n[PASS] test_400RecipientsUnder15MillionGasAndNoCustody() (gas: 11411476)\nLogs:\n  400 recipient execution gas: 10624487\n\n[PASS] test_failedPullRevertsEntireBatch() (gas: 39915)\n[PASS] test_mismatchedLengthsRevertWithoutMovingFunds() (gas: 26269)\n[PASS] test_selfRecipientRejectedAndAccidentalDepositsCannotBeStolen() (gas: 92750)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 7.79ms (7.99ms CPU time)\n\nRan 13 tests for test/TokenVault.t.sol:TokenVaultTest\n[PASS] testFuzz_onlyDistributor(address) (runs: 256, μ: 10298, ~: 10298)\n[PASS] testFuzz_scheduleMatchesDailyReference(uint16) (runs: 256, μ: 88180, ~: 48711)\nLogs:\n  Bound result 1763\n\n[PASS] testFuzz_transfersConserveFixedSupply(uint128) (runs: 256, μ: 79360, ~: 80031)\nLogs:\n  Bound result 263057292054820748109209124\n\n[PASS] test_beforeFutureStart() (gas: 13667)\n[PASS] test_distributorCannotDrainByRepeatedCallsOrOtherSelectors() (gas: 148071)\n[PASS] test_donationsDoNotAccelerateAndSelfReleaseRejected() (gas: 84931)\n[PASS] test_lifetimeBudgetIsFiniteEvenAtExtremeTimestamp() (gas: 172882)\n[PASS] test_noForbiddenRuntimeOpcodes() (gas: 413225)\n[PASS] test_noMintOrAdministrativeEntryPoints() (gas: 142017)\n[PASS] test_scheduleAfterSeveralHalvings() (gas: 87312)\n[PASS] test_supplyAndMetadata() (gas: 26133)\n[PASS] test_transfersCannotCreateValueOrSpendWithoutApproval() (gas: 49958)\n[PASS] test_zeroAndMidEpochDoNotVest() (gas: 96640)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 17.35ms (38.84ms CPU time)\n\nRan 12 tests for test/Hook.t.sol:HookTest\n[PASS] testFuzz_noCallerCanWithdrawOutsideFixedSplit(address,uint128,uint8) (runs: 256, μ: 284367, ~: 278254)\nLogs:\n  Bound result 2424\n\n[PASS] test_collectCannotAddressUnownedOrNonexistentNft() (gas: 30521)\n[PASS] test_directCallbacksRejected() (gas: 38501)\n[PASS] test_flagsAndStaticFee() (gas: 18499)\n[PASS] test_noEscapeOpcodes() (gas: 2547398)\n[PASS] test_principalCannotBeRemovedEvenByImpersonatedHook() (gas: 68722)\n[PASS] test_quoteConversionStopsAtImmutableLimitAndKeepsUnspentQuote() (gas: 408624)\n[PASS] test_realSwapsBothWaysCollectOnlyFeesAndConvertQuote() (gas: 637157)\n[PASS] test_singleSidedPositionHasZeroEthAndZeroWrappedEthCost() (gas: 63683)\n[PASS] test_splitDustCannotBeUsedToChangeRatios() (gas: 8965980)\n[PASS] test_wrongFeeTokenPriceAndRecipientRefused() (gas: 135910)\n[PASS] test_wrongHookAddressFlagsRefuseConstruction() (gas: 76799)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 33.86ms (49.04ms CPU time)\n\nRan 4 test suites in 34.69ms (60.05ms CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"437c4c447e2847698118ad50d78542da4852658d9a5c61b8bacbf1305294bc9d","verifiedTreeHash":"5cbfac63c93e9ce37c842327369d78f72c84a0af","verifierVersion":"0.1.0+1b3bcb5e"},{"checks":[{"durationMs":13493,"exitCode":0,"name":"build","output":"Compiling 144 files with Solc 0.8.30\nSolc 0.8.30 finished in 13.38s\nCompiler run successful!\nwarning[incorrect-shift]: the order of args in a shift operation is incorrect\n   ╭▸ src/EmissionVault.sol:29:16\n   │\n29 │         return 3_800_000e18 >> (epoch / 90);\n   │                ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#incorrect-shift\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ script/LaunchPlan.sol:52:52\n   │\n52 │             key, lower, upper, uint256(liquidity), uint128(SEED), uint128(0), recipient, bytes(\"\")\n   │                                                    ━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint128' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/SwapDriver.sol:38:60\n   │\n38 │                     .transferFrom(payer, address(manager), uint256(-int256(delta)))\n   │                                                            ━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/mocks/SwapDriver.sol:42:43\n   │\n42 │             manager.take(currency, payer, uint256(int256(delta)));\n   │                                           ━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint256' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/Hook.t.sol:70:9\n   │\n70 │         quote.transfer(TRADER, quote.balanceOf(address(this)));\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[incorrect-shift]: the order of args in a shift operation is incorrect\n    ╭▸ test/TokenVault.t.sol:127:25\n    │\n127 │             expected += 3_800_000e18 >> (day / 90);\n    │                         ━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#incorrect-shift\n\nwarning[incorrect-shift]: the order of args in a shift operation is incorrect\n    ╭▸ test/TokenVault.t.sol:178:31\n    │\n178 │             expected += 90 * (3_800_000e18 >> group);\n    │                               ━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#incorrect-shift\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ script/Deploy.s.sol:58:68\n   │\n58 │             deployer == address(0) || distributor == address(0) || startTime < block.timestamp\n   │                                                                    ━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ src/UpHook.sol:202:54\n    │\n202 │             poolManager.swap(key, SwapParams(false, -int256(amount), buybackSqrtPriceLimitX96), \"\");\n    │                                                      ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n   ╭▸ test/BatchPay.t.sol:22:29\n   │\n22 │             to[i] = address(uint160(0x10000 + i));\n   │                             ━━━━━━━━━━━━━━━━━━━━\n   │\n   ├ note: consider disabling this lint if you're certain the cast is safe\n   │       \n   │       // casting to 'uint160' is safe because [explain why]\n   │       // forge-lint: disable-next-line(unsafe-typecast)\n   │       \n   │       \n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:150:44\n    │\n150 │         router.swap(key, SwapParams(true, -int256(bought / 2), TickMath.getSqrtPriceAtTick(LOWER)));\n    │                                            ━━━━━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[block-timestamp]: usage of `block.timestamp` in a comparison may be manipulated by validators\n   ╭▸ src/EmissionVault.sol:35:13\n   │\n35 │         if (block.timestamp <= startTime) return 0;\n   │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#block-timestamp\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/Hook.t.sol:179:9\n    │\n179 │         quote.transfer(address(hook), 1e27);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/BatchPay.t.sol:62:9\n   │\n62 │         token.transfer(address(batch), 100);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/Hook.t.sol:250:13\n    │\n250 │             up.transfer(address(hook), 1);\n    │             ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVault.t.sol:64:9\n   │\n64 │         token.transferFrom(address(this), RECIPIENT, amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[unsafe-typecast]: typecasts that can truncate values should be checked\n    ╭▸ test/Hook.t.sol:273:45\n    │\n273 │         router.swap(key, SwapParams(false, -int256(amount), TickMath.getSqrtPriceAtTick(UPPER)));\n    │                                             ━━━━━━━━━━━━━━\n    │\n    ├ note: consider disabling this lint if you're certain the cast is safe\n    │       \n    │       // casting to 'int256' is safe because [explain why]\n    │       // forge-lint: disable-next-line(unsafe-typecast)\n    │       \n    │       \n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#unsafe-typecast\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVault.t.sol:67:9\n   │\n67 │         token.transfer(address(0), amount);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVault.t.sol:78:9\n   │\n78 │         token.transfer(RECIPIENT, 300_000_000e18 + 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVault.t.sol:81:9\n   │\n81 │         token.transferFrom(address(vault), RECIPIENT, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVault.t.sol:82:9\n   │\n82 │         token.transfer(address(0), 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n   ╭▸ test/TokenVault.t.sol:85:9\n   │\n85 │         token.transfer(RECIPIENT, 1);\n   │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n   │\n   ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\nwarning[erc20-unchecked-transfer]: ERC20 'transfer' and 'transferFrom' calls should check the return value\n    ╭▸ test/TokenVault.t.sol:164:9\n    │\n164 │         token.transfer(address(vault), 100e18);\n    │         ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n    │\n    ╰ help: https://book.getfoundry.sh/reference/forge/forge-lint#erc20-unchecked-transfer\n\n","passed":true},{"durationMs":135,"exitCode":0,"name":"test","output":"No files changed, compilation skipped\n\nRan 5 tests for test/Deploy.t.sol:DeployTest\n[PASS] test_insideRangeAndUnalignedTicksRejected() (gas: 22880)\n[PASS] test_mintEncodesSinglePositionZeroQuoteAndFixedOwner() (gas: 25056)\n[PASS] test_missingInfrastructureRejected() (gas: 12748)\n[PASS] test_nativeEthAboveCannotBeUpOnly() (gas: 11997)\n[PASS] test_wrongChainRejectedBeforeAnyDeployment() (gas: 13524)\nSuite result: ok. 5 passed; 0 failed; 0 skipped; finished in 818.22µs (683.72µs CPU time)\n\nRan 4 tests for test/BatchPay.t.sol:BatchPayTest\n[PASS] test_400RecipientsUnder15MillionGasAndNoCustody() (gas: 11411476)\nLogs:\n  400 recipient execution gas: 10624487\n\n[PASS] test_failedPullRevertsEntireBatch() (gas: 39915)\n[PASS] test_mismatchedLengthsRevertWithoutMovingFunds() (gas: 26269)\n[PASS] test_selfRecipientRejectedAndAccidentalDepositsCannotBeStolen() (gas: 92750)\nSuite result: ok. 4 passed; 0 failed; 0 skipped; finished in 4.27ms (4.37ms CPU time)\n\nRan 13 tests for test/TokenVault.t.sol:TokenVaultTest\n[PASS] testFuzz_onlyDistributor(address) (runs: 256, μ: 10298, ~: 10298)\n[PASS] testFuzz_scheduleMatchesDailyReference(uint16) (runs: 256, μ: 98208, ~: 49046)\nLogs:\n  Bound result 1018\n\n[PASS] testFuzz_transfersConserveFixedSupply(uint128) (runs: 256, μ: 79081, ~: 80031)\nLogs:\n  Bound result 153982940290271974758858147\n\n[PASS] test_beforeFutureStart() (gas: 13667)\n[PASS] test_distributorCannotDrainByRepeatedCallsOrOtherSelectors() (gas: 148071)\n[PASS] test_donationsDoNotAccelerateAndSelfReleaseRejected() (gas: 84931)\n[PASS] test_lifetimeBudgetIsFiniteEvenAtExtremeTimestamp() (gas: 172882)\n[PASS] test_noForbiddenRuntimeOpcodes() (gas: 413225)\n[PASS] test_noMintOrAdministrativeEntryPoints() (gas: 142017)\n[PASS] test_scheduleAfterSeveralHalvings() (gas: 87312)\n[PASS] test_supplyAndMetadata() (gas: 26133)\n[PASS] test_transfersCannotCreateValueOrSpendWithoutApproval() (gas: 49958)\n[PASS] test_zeroAndMidEpochDoNotVest() (gas: 96640)\nSuite result: ok. 13 passed; 0 failed; 0 skipped; finished in 19.41ms (34.18ms CPU time)\n\nRan 12 tests for test/Hook.t.sol:HookTest\n[PASS] testFuzz_noCallerCanWithdrawOutsideFixedSplit(address,uint128,uint8) (runs: 256, μ: 281530, ~: 278254)\nLogs:\n  Bound result 5182\n\n[PASS] test_collectCannotAddressUnownedOrNonexistentNft() (gas: 30521)\n[PASS] test_directCallbacksRejected() (gas: 38501)\n[PASS] test_flagsAndStaticFee() (gas: 18499)\n[PASS] test_noEscapeOpcodes() (gas: 2547398)\n[PASS] test_principalCannotBeRemovedEvenByImpersonatedHook() (gas: 68722)\n[PASS] test_quoteConversionStopsAtImmutableLimitAndKeepsUnspentQuote() (gas: 408624)\n[PASS] test_realSwapsBothWaysCollectOnlyFeesAndConvertQuote() (gas: 637157)\n[PASS] test_singleSidedPositionHasZeroEthAndZeroWrappedEthCost() (gas: 63683)\n[PASS] test_splitDustCannotBeUsedToChangeRatios() (gas: 8965980)\n[PASS] test_wrongFeeTokenPriceAndRecipientRefused() (gas: 135910)\n[PASS] test_wrongHookAddressFlagsRefuseConstruction() (gas: 76799)\nSuite result: ok. 12 passed; 0 failed; 0 skipped; finished in 34.35ms (49.39ms CPU time)\n\nRan 4 test suites in 35.08ms (58.85ms CPU time): 34 tests passed, 0 failed, 0 skipped (34 total tests)\n","passed":true}],"detail":"all checks passed","evaluation":"checks","profile":"foundry","status":"accepted","submissionHash":"af643d2b15e06d9129aaa3b353b8017e698f52b3195076a55cee66ed5071f738","verifiedTreeHash":"c6905d9a51d9a996e6bc13dbd92cd2025581cd94","verifierVersion":"0.1.0+1b3bcb5e"}]}