{"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":"4ad1a4d9-3aab-4e94-b151-e8f609414a4e","kind":"shape:chain","nodes":[{"acceptedSubmissionHash":null,"dependsOn":["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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["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":"waiting"},{"acceptedSubmissionHash":"964631e5ac9a57ac1fec073c510c32a3a630502f856b2605c8869aa3070d9f78","dependsOn":[],"execution":{"network":false,"profile":"foundry","requires":[],"skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","tools":[]},"key":"audit_imported_code","kind":"code","role":"review","skillHash":"9897597976b0e72440db7ca402d225aea20f3d37205ba53e7df2400ff80f29cc","skillId":"audit-imported-code","state":"accepted"},{"acceptedSubmissionHash":null,"dependsOn":["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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["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":"waiting"},{"acceptedSubmissionHash":null,"dependsOn":["audit_imported_code"],"execution":{"network":false,"profile":"foundry","requires":[],"tools":[]},"key":"manifest","kind":"code","role":"integrate","skillHash":null,"skillId":null,"state":"failed"}],"objective":"Token name: IMD Offsets. Token symbol: IMDO. Total supply 1,000,000,000 with 18 decimals. Chain id 11155111, paired with ETH, poolBps 8900. Ethereum mainnet (1) is the real target, deployed manually from this repo's script after this launch.\n\nWHAT THIS IS. The workspace is github.com/ToknWrks/imdo at the given commit: the COMPLETE IMDO flywheel repository (Foundry; solc 0.8.26, cancun, via_ir, bytecode_hash \"none\"; vendored lib/). A fork of the MIT-licensed ADAM repository (IMD launch 713), credited in the README. Lineage: swarm job 948f8b1b-a4bd-4689-a346-2536b218e486 built it (build, tests, manifest, four reviews accepted; judge findings applied), review job 37ac5d94-da10-4a27-84d9-246c17a2c3f7 applied, and the Base retirement rail under src/regen reviewed by jobs 9091d583, e9b9f179 and b5fa7968 (all findings applied; docs/REGEN_RAIL.md). This launch is the IdentityMD hackathon entry: launch through the IMD protocol on Sepolia with admission passed before 19 Oct 2026 00:00 UTC.\n\nCONTRACTS (src/, written and tested; do not rewrite). IMDOToken = LaunchToken, constructor(), no owner, mint or tax. ImdoHook: v4 hook for one ETH/IMDO pool (LP fee 0, spacing 60); ETH-side fee 20% flat until the owner calls open() once, then decays over 30 minutes to 1.5%; owner can only lower; fee paid to the immutable treasury inside the swap, or as ERC-6909 claims redeemable only to the treasury; NOT in the manifest. ImdoStaking: FLAT constructor(address imdo, address imd, address manager, address claim, address regenSafe); 24-hour lock reset by every stake, stakeFor only by claim, pro-rata IMD rewards, notifyRegen() payable lifetime ETH credit, withdrawRegen only by regenSafe and never beyond what was notified. ImdoTreasury: FLAT constructor(address staking, address opsWallet, address offsetsSafe, address regenSafe, address manager, address imd, uint24 imdFee, uint24 imdTickSpacing, address imdHooks, uint256 maxEthPerBuy, uint16 slippageBps, uint32 cooldown, uint256 regenCap, uint256 regenCapMin, uint256 regenCapMax); no owner or withdrawal; anyone calls process() every 600 s for a 50 bps bounty; net split 1000/2500/2500/4000 bps to opsWallet, offsetsSafe, REGEN (capped per 7-day epoch, overflow to IMD) and an IMD buy on the ETH/IMD v4 pool fee 10000 spacing 200 pushed to staking; setRegenCap by regenSafe within bounds is the ONLY setter. ImdoClaim: constructor(address imdo, address staking, address seatNFT, uint256 seatSize, bytes32 holderRoot, uint256 launch); 100,000,000 IMDO to identity.md seats [0,2000) via claimSeat (ownerOf), 10,000,000 to a Merkle holder list; ten daily tranches, closes at launch + 39 days, unclaimed burns. src/RegenDrop.sol and src/regen/* are Base-chain contracts deployed by script/DeployRegenRail.s.sol: NOT part of this launch. script/DeployImdo.s.sol is the manual mainnet deployment (docs/DEPLOYMENT.md).\n\nMANIFEST. launch.json is in the repo and is the manifest: kind evm_project; token LaunchToken (IMDOToken inherits it, no constructor arguments); contracts in order ImdoStaking (5 FLAT constructorArgs) then ImdoTreasury (15 FLAT constructorArgs), values $token, $owner, $contract:ImdoStaking or literals (manager 0x000000000004444c5dc75cB358380D2e3dE08A90, IMD 0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7, 10000, 200, hooks zero, 1 ETH, 300, 600, 0.5 ETH, 0.05 ETH, 5 ETH); later contracts cannot be referenced, so claim, regenSafe, offsetsSafe and opsWallet are $owner and the notes say what that address can do. Pool fee 3000, spacing 60. Known and intended: the manager and IMD literals have no code on Sepolia, so process() reverts PoolUnavailable there; the Sepolia deployment is the admission artefact and must not be funded. Verify the manifest encodes exactly these constructors (flat, 5 and 15 values) and that every admission check (provenance, findings, independent review, bytecode, manifest, invariants, economics) can pass from this tree; if the factory needs a manifest change, change ONLY launch.json and say why.\n\nRULES. Do not modify src/, script/, foundry.toml, remappings.txt, lib/, snapshot/ or test/; scratch tests only under test/scratch/. Build with foundry.toml as committed (README quotes it; never suggest --no-metadata). Run the default profile suite and forge fmt --check and report the counts you observe (test/fork needs an RPC and is excluded by design). Findings need severity, file:line, a reproduction and where possible a failing Foundry proof. Known and documented: a sell into the fully emptied single-sided pool fills 1 wei for 0 ETH and moves slot0's tick to the seller's limit until the next buy (cosmetic; a deploy test covers it). Do not claim an audit was performed; the README says the swarm's reviews are checks. Any copy uses \"regenerative contribution\", never yield, APY, returns, investment, carbon offset or net zero.\n\nDELIVERY. The launch record, the Sepolia deployment of the manifest contracts and factory pool, and the review findings. The code is complete; nothing else is expected.","parentJobId":null,"planHash":"f4820fc7269b28124ff4a6eda4d952dd0ba0730371945a5a19e50f25bfa3fd06","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"4ad1a4d9-3aab-4e94-b151-e8f609414a4e","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-1568-imd-offsets-token-symbol-imdo-total-supp"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52159","feedbackHash":"7cf926aa13e5ba73710257051df3f9699bda5c26364258225217923eb8443fef","nodeKey":"audit_imported_code","submissionHash":"964631e5ac9a57ac1fec073c510c32a3a630502f856b2605c8869aa3070d9f78","tag1":"review:submission","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"fff6d7d85e16bbe445e59cde611e8fc495ea08aea140c19d2a8dbf4cb18b88ec","state":"blocked","submissions":[{"artifacts":[],"attempt":1,"bundleHash":null,"device":"1369de7c9398881a","findings":[],"hash":"649efb8ee985ac10fda16b48068726434d3d809c041f613887c579002d25a72e","nodeId":"567d8fb9-d41f-44f0-bcd5-7e90e26ca35f","outcome":"failed","summary":"needs input: A policy or scope decision is required for ImdoTreasury.imdHooks. The brief requires the existing 15-argument constructor and the no-hook ETH/IMD pool. launch.json:31 therefore supplies address(0) at argument index 8, which src/ImdoTreasury.sol:148 includes in the pool key. The reported launch_manifest check rejects this required value. It is the no-hook selector, not a missing party address; replacing it with $owner or another nonzero address changes the pool, and changing its encoding does not resolve the policy conflict. Only launch.json may be changed, so deriving zero inside the constructor is outside this assignment. Existing notes-length and lowercase-address fixes are preserved. forge build and forge fmt --check passed; the default forge test run passed 211 tests (207 existing and 4 scratch reproductions), with no failures or skips; fork tests were excluded by the committed profile. No manifest or source changes were made, and no admission or deployment success is asserted. — W","treeHash":null,"usage":{"cachedInputTokens":3065088,"inputTokens":199242,"model":"gpt-6-astra","outputTokens":24308,"runtime":"codex","turns":12,"wallClockMs":1295127}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"6b37e4ab65246705","findings":[{"citation":"resolved","description":"The manifest schema accepts notes as one string of at most 4,000 characters and refuses the whole file otherwise. The committed notes string is 4,358 characters (python3: len(json.load(open('launch.json'))['notes']) == 4358). The manifest step therefore cannot pass admission from this tree until the notes are shortened; nothing in the deployed contracts is affected. Suggested cut: the per-finding 'Imported finding checks' sentences at the end (about 900 characters) belong in the README or review record, not the manifest.","line":47,"path":"launch.json","reproduction":"State: launch.json as committed. Input: parse the file and measure notes. Expected: at most 4000 characters so the manifest validates. Actual: 4358 characters; the manifest check refuses the file and the launch cannot be admitted.","severity":"medium","snippet":"  \"notes\": \"IMD Offsets is derived from the MIT-licensed ADAM repository. LaunchToken in src/LaunchToken.sol has no cons","title":"launch.json notes are 4,358 characters; the schema caps notes at 4,000 so the whole manifest is refused"},{"citation":"resolved","description":"The manifest rules require every address string in launch.json to be lowercase. The IMD literal (lines 14 and 28) and the PoolManager literal (lines 15 and 27) are written checksummed (0xD34a99Bc..., 0x000000000004444c5dc75cB358380D2e3dE08A90). A strict schema rejects them and the manifest step fails before deployment. Fix: rewrite the four literals as 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7 and 0x000000000004444c5dc75cb358380d2e3de08a90; the ABI words are unchanged.","line":14,"path":"launch.json","reproduction":"State: launch.json as committed. Input: for each constructorArgs entry starting with 0x, compare it to its lowercase form. Expected: identical. Actual: four entries differ (lines 14, 15, 27, 28), so the schema's lowercase-address rule fails.","severity":"medium","snippet":"\"0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7\",","title":"Manifest address literals are EIP-55 mixed case; the manifest schema requires lowercase addresses"},{"citation":"resolved","description":"The ninth ImdoTreasury argument (imdHooks, an address wrapped into IHooks at src/ImdoTreasury.sol:148) is 0x0000000000000000000000000000000000000000. The manifest rules allow a zero word only for a native-ETH Currency field; every other address argument must be non-zero or the manifest check refuses it. The ETH/IMD v4 pool genuinely has no hook, so the value is semantically right, but the contract exposes it as a plain address parameter rather than deriving it. The adapter has two options: keep the parameter and obtain an explicit allowance from the manifest check (needs evidence), or make the no-hook pool key a constant in ImdoTreasury (drop the parameter, 14 arguments) so launch.json carries no zero address. The constructor accepts the zero value today, so no on-chain behaviour changes either way.","line":31,"path":"launch.json","reproduction":"State: launch.json as committed. Input: scan ImdoTreasury.constructorArgs for 0x followed by forty zeros. Expected: none, because imdHooks is typed address (IHooks), not Currency. Actual: entry 9 (line 31) is the zero address and the manifest check's non-zero-address rule fails.","severity":"medium","snippet":"\"0x0000000000000000000000000000000000000000\",","title":"ImdoTreasury imdHooks constructor argument is the zero address, which the manifest check refuses for non-Currency address arguments"},{"citation":"resolved","description":"stakeFor is restricted to the immutable claimContract (line 162) but it resets the beneficiary's 24-hour lock unconditionally. launch.json passes $owner as claim_, so on the Sepolia admission deployment a single wallet can, for 1 wei of IMDO per day, prevent every other staker from ever withdrawing principal. The notes disclose this as a trust assumption and the manual mainnet deployment avoids it by making ImdoClaim (which only stakes for msg.sender) the caller, so this is a documented privileged power rather than a bypass. It is listed so the adapter and the final review see the actor and preconditions; a minimal hardening that preserves the design would be to extend the lock only when the beneficiary's own balance was zero, or to extend it only to max(existing unlock, now + LOCK_DURATION) for self-stakes while leaving stakeFor from the claim contract unable to lengthen an existing lock.","line":168,"path":"src/ImdoStaking.sol","reproduction":"State: ImdoStaking deployed with manifest args (claim_ = regenSafe_ = owner). Victim stakes 1000e18 IMDO. Every 23 hours the owner calls stakeFor(victim, 1). Expected: the victim can unstake 24 hours after their own last stake. Actual: unlockTime[victim] is pushed forward each day and unstake(1000e18) reverts StakeLocked indefinitely; a Foundry replay (victim stakes, owner calls stakeFor(victim,1) at +23h three times, victim's unstake reverts) was run under test/scratch and passes on this code, so no fail-then-pass proof is attached.","severity":"low","snippet":"        unlockTime[beneficiary] = block.timestamp + LOCK_DURATION;","title":"With claim = $owner, the launch owner can keep any staker's IMDO locked forever by staking 1 wei for them each day"}],"hash":"964631e5ac9a57ac1fec073c510c32a3a630502f856b2605c8869aa3070d9f78","nodeId":"945aa8e9-121d-4c67-b1d0-809bd7fdf394","outcome":"completed","summary":"The review is complete. The findings file holds four substantiated findings; no change was made outside `.imd-findings.json` and my scratch test.\n\n**Checks run on the committed tree**\n\n| Check | Result |\n|---|---|\n| `forge test` (default profile, fork tests excluded by design) | 207 passed, 0 failed, 0 skipped, 30 suites |\n| `forge fmt --check` | clean |\n| Runtime opcode scan (DELEGATECALL, CALLCODE, SELFDESTRUCT) on LaunchToken, ImdoStaking, ImdoTreasury | none found |\n| Runtime sizes | 2,469 / 8,727 / 14,041 bytes, all under EIP-170 |\n| Manifest constructors replayed on an empty chain with the exact launch.json values | both deploy, supply stays with the deployer, `process()` reverts `PoolUnavailable` |\n\n**Contracts read in full:** LaunchToken, ImdoStaking, ImdoTreasury, ImdoHook, ImdoClaim, the IImdoStaking interface, launch.json, and the wiring lines of script/DeployImdo.s.sol. **Not reached:** src/RegenDrop.sol and src/regen/* (Base-chain, outside this launch per the brief), the rest of the deploy script, and the test suites beyond running them. Mainnet facts I could not verify offline: that the IMD literal is the real token and that an ETH/IMD v4 pool with fee 10000, spacing 200 and no hook exists.\n\n**Findings written**\n\n- **Medium, launch.json:47.** The notes string is 4,358 characters against a 4,000 cap, so the manifest is refused as a whole. Trimming the trailing \"imported finding checks\" sentences fixes it.\n- **Medium, launch.json:14.** The IMD and PoolManager literals are checksummed mixed case in four places; the schema requires lowercase addresses.\n- **Medium, launch.json:31.** The ImdoTreasury `imdHooks` argument is the zero address, which the manifest check refuses for any non-Currency address. The adapter either gets an explicit allowance or makes the no-hook key a constant in the contract (14 arguments).\n- **Low, src/ImdoStaking.sol:168.** With `claim` resolving to `$owner`, that wallet can keep any staker locked forever at 1 wei a day. This is the documented trust assumption; I reproduced it in a scratch test so the actor and preconditions are concrete. Mainnet avoids it because ImdoClaim only stakes for its caller.\n\n**What I checked and did not find defective:** constructor argument order and count (5 and 15, flat) match the two constructors exactly; the token mints the whole 10^27 supply to its deployer with no mint, pause, blocklist or fee paths; both project constructors are nonpayable and make no external calls on an empty chain; hook delta accounting sums to zero on all four swap shapes and the partial-fill guard matches the PoolManager's raw delta; the treasury's keeper, ops, offsets, regen and IMD accounting keeps `unsplitEth` non-negative on every success and failure path; the staking backlog stream releases before every stake change; claim tranches cannot double-pay duplicate ids. No critical or high finding was found, so no fail-then-pass proof is attached.","treeHash":null,"usage":{"cachedInputTokens":1228859,"inputTokens":418,"model":"claude-fable-5-1","outputTokens":34030,"runtime":"claude","turns":21,"wallClockMs":833898}}],"verification":[]}