{"workflow":null,"planning":null,"id":"ac8cb4ce-56d5-44d4-9566-469530c2c338","state":"completed","template":"skill:build-contract-project","objective":"$ADAM — official X: https://x.com/IaMaDamIMD — continue the ADAM project from the parent job (single job, do NOT ask clarifying questions — pick sane defaults and document them). Keep everything already built and accepted (plain ERC-20 \"ADAM\", staking Distributor, hook, Treasury, anti-snipe, 90/10 split). Token name and symbol stay \"ADAM\". All distributions are pull-based: users claim themselves, nobody pushes tokens.\n\n## 1. NFT holder claims with daily unlock\n- New contract NFTClaim holding 11% of ADAM supply, funded in the deploy script:\n  - IMD NFT 0x0000ec93127baa929e58e97dd0095a2bfb38ec1d: 10% of supply (100,000,000 ADAM).\n  - Swarm Pepe 0x999ce0ce8c5f7661e0c74a568ffe27ceb9177bdb: 1% of supply (10,000,000 ADAM).\n- Per NFT, not per wallet: each tokenId gets an equal share (collection allocation / collection size, read onchain at build, fixed immutably at deploy). The current ownerOf(tokenId) claims its unlocked share; claimed amounts tracked per tokenId. Batch claim for many tokenIds in one tx.\n- Unlock: 10 equal daily tranches per tokenId — 10% of its share at launch, +10% every 24h, full after day 9 (= 1% of supply/day for IMD NFTs, 0.1%/day for Swarm Pepe).\n- claimAndStake(tokenIds) claims and stakes into the Distributor in one tx; plain claim too.\n- burnUnclaimed() after full unlock + 30 days → dead address (covers burned/never-claimed tokenIds).\n- No owner withdraw, no parameter changes, reentrancy guard. NFTClaim earns no rewards.\n\n## 2. Three reward assets, split by the IMD swarm oracle (\"buy what's down\")\n- Reward assets for stakers:\n  - $IMD 0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7 (existing ETH/IMD v4 pool)\n  - $PNKSTR 0xc50673edb3a7b94e8cad8a7d4e0cd68864e33edf (existing ETH/PNKSTR v4 pool, 10% hook tax already measured)\n  - $IMDSTR 0x80271ce20184e38f4afe90d4ca134304d197aca2 (TokenWorks NFTStrategy proxy, impl 0x7fb856425f164929f023055e8bc40e980b362f61, v4 hook 0x66b05c8eeca9329f7a2332c02ce3855cfab72444; find PoolKey onchain, measure hook tax on fork)\n- Holder share (90%) split across the three by a daily signed IMD oracle report (imd.fun/docs/#oracle) from a heartbeat job: imdBps, pnkstrBps, imdstrBps (sum 10000) + short reason. Policy: favor what is down over 24h, unless liquidity/risk signals say otherwise.\n- Contract: verify signature + freshness (≤ 26h), clamp each to 1500–7000 bps, missing/stale/invalid → equal thirds. Bounds immutable, owner cannot override. Emit SplitUpdated(imdBps, pnkstrBps, imdstrBps, reportId, reasonHash, source).\n- If verifying the IMD oracle report onchain is not feasible, say so and fall back to onchain daily snapshots of the three pool prices with the same rule.\n- Deliver the heartbeat job spec/prompt (inputs + output format).\n- Keep existing per-leg limits, slippage floors, failure rerouting — extend to three legs.\n\n## 3. IMDSTR transfer lock\n- VERIFIED: IMDSTR wallet→wallet transfer() reverts InvalidTransfer() (0x2f352531); PoolManager is NOT a distributor.\n- Implement buy-on-claim: IMDSTR share accrues per staker in ETH; on claim the Distributor swaps that ETH → IMDSTR via its v4 pool with take() directly to the claimer (claimer-supplied slippage).\n- Support a one-time switch to direct distribution if the IMDSTR owner whitelists our Distributor via setDistributor.\n- Fork test: buy-on-claim delivers IMDSTR to an EOA; direct transfer reverts without whitelist.\n\n## 4. Keeper bounty\n- process() pays the caller 0.5% of the ETH processed in that call (constant max), so bots call it hourly.\n\n## 5. X / discoverability\n- https://x.com/IaMaDamIMD in NatSpec header of every contract (@custom:x), ERC-7572 contractURI() on Distributor/Treasury (token stays plain), README top.\n\n## Deliverables\n1. Updated Foundry repo + deploy script (11% to NFTClaim; NOT broadcast — deployer signs manually).\n2. Unit + fuzz + fork tests for everything above.\n3. Short self-audit with fixes applied.\n4. Updated README (claim flows, unlock schedule, oracle split, links).\nOut of scope: website.","blockedReason":null,"createdAt":"2026-10-05T15:51:53.420Z","updatedAt":"2026-10-05T16:36:57.083Z","paidBy":"0x087bada60bb18d1667f03a8ba6b2ae5394e0e2c5","parentJobId":"e497ebcf-33bb-4548-bfd7-fa95843dc898","project":{"id":"e497ebcf-33bb-4548-bfd7-fa95843dc898","head":"0fef589e-73d1-4e04-9e86-aca1ccb04180","running":null,"versions":[{"jobId":"e497ebcf-33bb-4548-bfd7-fa95843dc898","workflowId":null,"objective":"Task (single job, do NOT ask clarifying questions — pick sane defaults and document them): write deploy-ready smart contracts for \"$ADAM\", an Ethereum mainnet memecoin on Uniswap v4. Swap fees buy $IMD and $PNKSTR and distribute them to ADAM holders.\n\n## Token + hook\n- ADAM ERC-20, fixed supply 1,000,000,000, no mint. Owner can only LOWER fees, never raise.\n- Uniswap v4 ETH/ADAM pool, PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90. Launch without ETH: single-sided ADAM-only position above current price.\n- Hook: 1.5% fee on every buy and sell, taken in ETH, sent to Treasury. No heavy logic inside swaps.\n- Anti-snipe: fee starts at 20% and decays linearly to 1.5% over the first 30 minutes (same split applies).\n\n## Fee split (fixed in code)\n- 10% → teamWallet (constructor param).\n- 90% → holders:\n  - 50% buys $IMD (0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7) via its existing v4 ETH/IMD pool (find the PoolKey onchain).\n  - 50% buys $PNKSTR (0xc50673edb3a7b94e8cad8a7d4e0cd68864e33edf) via its v4 pool:\n    PoolKey { currency0: ETH (address(0)), currency1: PNKSTR, fee: 0, tickSpacing: 60, hooks: 0xfaaad5b731f52cdc9746f2414c823eca9b06e844 }.\n    The PNKSTR hook is unverified and charges a buy tax — measure the real tax on a mainnet fork and account for it in minOut.\n- Both buys: slippage cap + max size per call to limit MEV.\n\n## Distribution\n- IMD + PNKSTR distributed to ADAM holders pro-rata to balance, pull-based claim (dividend-per-share pattern), updated on transfer, multiple reward tokens.\n- Exclude pool, PoolManager, hook, Treasury, Distributor, zero/dead addresses.\n- Treasury.process(): public, anyone can call — executes split, buys, pushes rewards to Distributor.\n- Reentrancy guards, no upgradeability, no blacklist, no owner access to holder funds.\n\n## Deliverables (all in this job)\n1. Foundry repo: ADAM token, hook (mined hook-address flags), Treasury, Distributor, mainnet deploy script (NOT executed — deployer signs manually) with exact constructor params and step list.\n2. Tests: unit + fuzz + mainnet-fork (real IMD and PNKSTR pools): buy/sell tax, 90/10 split, 50/50 IMD/PNKSTR, anti-snipe decay, process(), claims, exclusions, reentrancy, slippage limits.\n3. Short self-audit: findings by severity, all fixes applied.\n4. Short README: deploy, add single-sided liquidity, call process() on a schedule (hourly is enough), claim.\nOut of scope: website, heartbeat, Sepolia deploy.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"completed","createdAt":"2026-10-05T11:39:33.176Z"},{"jobId":"ac8cb4ce-56d5-44d4-9566-469530c2c338","workflowId":null,"objective":"$ADAM — official X: https://x.com/IaMaDamIMD — continue the ADAM project from the parent job (single job, do NOT ask clarifying questions — pick sane defaults and document them). Keep everything already built and accepted (plain ERC-20 \"ADAM\", staking Distributor, hook, Treasury, anti-snipe, 90/10 split). Token name and symbol stay \"ADAM\". All distributions are pull-based: users claim themselves, nobody pushes tokens.\n\n## 1. NFT holder claims with daily unlock\n- New contract NFTClaim holding 11% of ADAM supply, funded in the deploy script:\n  - IMD NFT 0x0000ec93127baa929e58e97dd0095a2bfb38ec1d: 10% of supply (100,000,000 ADAM).\n  - Swarm Pepe 0x999ce0ce8c5f7661e0c74a568ffe27ceb9177bdb: 1% of supply (10,000,000 ADAM).\n- Per NFT, not per wallet: each tokenId gets an equal share (collection allocation / collection size, read onchain at build, fixed immutably at deploy). The current ownerOf(tokenId) claims its unlocked share; claimed amounts tracked per tokenId. Batch claim for many tokenIds in one tx.\n- Unlock: 10 equal daily tranches per tokenId — 10% of its share at launch, +10% every 24h, full after day 9 (= 1% of supply/day for IMD NFTs, 0.1%/day for Swarm Pepe).\n- claimAndStake(tokenIds) claims and stakes into the Distributor in one tx; plain claim too.\n- burnUnclaimed() after full unlock + 30 days → dead address (covers burned/never-claimed tokenIds).\n- No owner withdraw, no parameter changes, reentrancy guard. NFTClaim earns no rewards.\n\n## 2. Three reward assets, split by the IMD swarm oracle (\"buy what's down\")\n- Reward assets for stakers:\n  - $IMD 0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7 (existing ETH/IMD v4 pool)\n  - $PNKSTR 0xc50673edb3a7b94e8cad8a7d4e0cd68864e33edf (existing ETH/PNKSTR v4 pool, 10% hook tax already measured)\n  - $IMDSTR 0x80271ce20184e38f4afe90d4ca134304d197aca2 (TokenWorks NFTStrategy proxy, impl 0x7fb856425f164929f023055e8bc40e980b362f61, v4 hook 0x66b05c8eeca9329f7a2332c02ce3855cfab72444; find PoolKey onchain, measure hook tax on fork)\n- Holder share (90%) split across the three by a daily signed IMD oracle report (imd.fun/docs/#oracle) from a heartbeat job: imdBps, pnkstrBps, imdstrBps (sum 10000) + short reason. Policy: favor what is down over 24h, unless liquidity/risk signals say otherwise.\n- Contract: verify signature + freshness (≤ 26h), clamp each to 1500–7000 bps, missing/stale/invalid → equal thirds. Bounds immutable, owner cannot override. Emit SplitUpdated(imdBps, pnkstrBps, imdstrBps, reportId, reasonHash, source).\n- If verifying the IMD oracle report onchain is not feasible, say so and fall back to onchain daily snapshots of the three pool prices with the same rule.\n- Deliver the heartbeat job spec/prompt (inputs + output format).\n- Keep existing per-leg limits, slippage floors, failure rerouting — extend to three legs.\n\n## 3. IMDSTR transfer lock\n- VERIFIED: IMDSTR wallet→wallet transfer() reverts InvalidTransfer() (0x2f352531); PoolManager is NOT a distributor.\n- Implement buy-on-claim: IMDSTR share accrues per staker in ETH; on claim the Distributor swaps that ETH → IMDSTR via its v4 pool with take() directly to the claimer (claimer-supplied slippage).\n- Support a one-time switch to direct distribution if the IMDSTR owner whitelists our Distributor via setDistributor.\n- Fork test: buy-on-claim delivers IMDSTR to an EOA; direct transfer reverts without whitelist.\n\n## 4. Keeper bounty\n- process() pays the caller 0.5% of the ETH processed in that call (constant max), so bots call it hourly.\n\n## 5. X / discoverability\n- https://x.com/IaMaDamIMD in NatSpec header of every contract (@custom:x), ERC-7572 contractURI() on Distributor/Treasury (token stays plain), README top.\n\n## Deliverables\n1. Updated Foundry repo + deploy script (11% to NFTClaim; NOT broadcast — deployer signs manually).\n2. Unit + fuzz + fork tests for everything above.\n3. Short self-audit with fixes applied.\n4. Updated README (claim flows, unlock schedule, oracle split, links).\nOut of scope: website.","baseCommit":"d70a40eebef107357660c49e8eeb44659ec35a0f","state":"completed","createdAt":"2026-10-05T15:51:53.420Z"},{"jobId":"efe10e08-c8c8-486a-8f07-609470388a39","workflowId":null,"objective":"$ADAM — official X: https://x.com/IaMaDamIMD — independent security audit of the ADAM project (continue from parent job). Single job, do NOT ask clarifying questions.\n\n## Scope\n- All first-party contracts at the current head (PR #2): LaunchToken, AdamHook, AdamTreasuryV2, AdamDistributorV2, AdamSplitOracle, NFTClaim, plus script/DeployAdam.s.sol (hook-only mode) and script/DeployAdamExtension.s.sol.\n- Intended mainnet setup: fresh ADAM token → DeployAdamExtension (oracle, DistributorV2, NFTClaim funded with 110,000,000 ADAM, TreasuryV2) → DeployAdam hook-only with TreasuryV2 → single-sided ETH/ADAM v4 pool. Legacy V1 Distributor/Treasury will NOT be deployed on mainnet.\n\n## Process\n- Independent reviewers (not the original author), each focused on: math/accounting, access control & immutability, economic/MEV attacks (process(), keeper bounty, reward legs, price floors, reroute), oracle verification (IMD Oracle v2 EIP-712 attestation, signer, questionHash, quorum, freshness, replay, clamps, fallback), NFTClaim (per-tokenId unlock, ownership checks, transfers mid-vesting, batch, claimAndStake, burnUnclaimed), IMDSTR buy-on-claim + one-time direct switch, deploy scripts (ordering, funding, hook mining, pool init, LP ticks).\n- A judge consolidates findings.\n- Fix every Critical / High / Medium finding with a regression test. Do NOT add features or change economics (fees, splits, allocations, unlock schedule, bounds).\n\n## Deliverables\n1. AUDIT.md: findings by severity with status (fixed / acknowledged + reasoning), and a mainnet deployment checklist with exact constructor parameters to verify.\n2. Fixes + regression tests (unit, fuzz, mainnet fork). All tests green.\n3. README updated only where behavior changed.\nNothing is broadcast; deployer signs manually.","baseCommit":"785edda603f9ed41364e08d46ecea440bcc0d6e2","state":"completed","createdAt":"2026-10-05T16:46:15.136Z"},{"jobId":"fcd37662-83bf-4c94-9dce-c8b516eaa9e3","workflowId":null,"objective":"$ADAM — official X: https://x.com/IaMaDamIMD — apply two changes from the independent audit (continue from parent job). Single job, do NOT ask clarifying questions. Keep everything else exactly as is: token, hook, fees, splits, oracle, NFTClaim, IMDSTR logic, bounds, keeper bounty.\n\n## 1. Fix audit finding A-01 (just-in-time staking)\n- AdamDistributorV2: unstake (and exit/withdraw of principal) is allowed only 24 hours after the wallet's most recent stake. Every new stake or stakeFor (incl. NFTClaim.claimAndStake) resets that wallet's 24h lock.\n- Reward claims (claimReward, claimIMDSTR, any per-asset claim) stay available at any time; reward accounting unchanged.\n- Expose unlockTime(wallet) view; revert with a clear custom error before the lock ends.\n- Tests: stake → unstake before 24h reverts, after 24h succeeds; top-up resets lock; claimAndStake sets lock for the claimant; rewards claimable during lock; JIT scenario (stake right before process(), try to exit) now blocked; invariants/fuzz still green.\n\n## 2. Permanent LP lock\n- DeployAdam hook-only path: mint the single-sided ETH/ADAM LP position NFT directly to 0x000000000000000000000000000000000000dEaD (recipient constant, not configurable). Nothing goes to the deployer.\n- LIQUIDITY_ADAM default = 890,000,000 ADAM when used after DeployAdamExtension (still overridable downward only by explicit env).\n- Fork test: after deploy, PositionManager ownerOf(lpId) == dead address, deployer holds no LP NFT, swaps work in both directions, liquidity cannot be decreased by deployer.\n\n## Deliverables\n1. Code changes + tests (unit, fuzz, fork). All green.\n2. README + deployment checklist updated (lock, 24h unstake rule, LP burned).\n3. Short changelog entry.\nNothing is broadcast; deployer signs manually.","baseCommit":"785edda603f9ed41364e08d46ecea440bcc0d6e2","state":"completed","createdAt":"2026-10-05T17:15:28.170Z"},{"jobId":"88060684-81ad-4627-a2bf-26f2877f826f","workflowId":null,"objective":"$ADAM — official X: https://x.com/IaMaDamIMD — fix one griefing issue and review all changes since the audit (continue from parent job). Single job, do NOT ask clarifying questions. Change nothing else.\n\n## 1. Fix\n- Problem: AdamDistributorV2.stakeFor is permissionless and every stakeFor resets the recipient's 24h unlockTime, so anyone can stake 1 wei for a victim every <24h and lock the victim's principal forever.\n- Fix: stakeFor may only be called by the immutable NFTClaim contract (used by claimAndStake). All other users stake for themselves via stake(). Revert with a clear custom error otherwise. No other path may let a third party reset someone's lock.\n- Tests: third-party stakeFor reverts; claimAndStake still works and sets the claimant's lock; repeated 1-wei griefing impossible; JIT still blocked; all existing unit, fuzz, invariant and fork tests green.\n\n## 2. Adversarial review of everything changed since audited commit 785edda\n- Re-read with an attacker mindset: 24h lock (unlockTime, _lockStake, unstake/exit), stakeFor restriction, claimAndStake path, reward claims during lock, LP NFT minted to dead address, 890M default liquidity and downward-only override.\n- Look for: griefing/DoS on unstake, JIT bypasses (second wallet, NFTClaim path), lock bypass, accounting drift, any way to withdraw the LP.\n- Fix anything Critical/High/Medium with a regression test.\n\n## Deliverables\nCode + tests, REVIEW.md (findings by severity or explicit \"no issues found\" per item), CHANGELOG entry. Nothing broadcast.","baseCommit":"da3f7ca13eb874dc0e6210ebcab1eaaa77788bba","state":"completed","createdAt":"2026-10-05T18:36:50.203Z"},{"jobId":"0c639c09-9121-4851-93d2-eaaa763ecaa4","workflowId":null,"objective":"$ADAM — official X: https://x.com/IaMaDamIMD — fix AdamSplitOracle so it works with daily IMD oracle runs (continue from parent job). Single job, do NOT ask clarifying questions. Change nothing else.\n\n## Problem (verified against the live IMD API)\nIMD's questionHash changes on every run because it includes the pinned block window (two quotes 30 s apart returned different hashes). The immutable questionHash check therefore rejects every daily report. Also, requests created on the IMD website are signed with a default EIP-712 domain verifyingContract (observed 0x37bfb8ac7c960e558657871d41ca70e07e7dbfff), not with our oracle's address.\n\n## Fix\n- Remove the immutable questionHash check.\n- Add immutable `relayer` (constructor param). Only `relayer` may call submit(); others revert with a custom error. Mainnet value: 0x087Bada60BB18d1667F03a8BA6b2aE5394E0E2C5.\n- Add immutable `domainVerifyingContract` (constructor param) used in the EIP-712 domain {name \"IdentityMD Oracle\", version \"2\", chainId, verifyingContract = domainVerifyingContract}. If zero is passed, use address(this). Do NOT use OZ EIP712's implicit address(this) when a value is set.\n- Keep everything else: immutable signer, answerType 5, exactly four bytes32 words, bps sum 10000, reason hash check, panelSize >= 5, quorum >= 4, agreed >= quorum, freshness <= 26h, expiry, strictly increasing issuedAt, replay protection, clamps 1500–7000, equal-thirds fallback.\n- Update DeployAdamExtension Config + mainnetConfig (relayer, domainVerifyingContract; drop questionHash), deploy-script checks, README, HEARTBEAT.md and checklist.\n\n## Tests\nValid report from relayer accepted with both domain modes; non-relayer reverts; wrong domain / wrong signer / stale / replay / bad sum / low quorum rejected; different questionHash values across runs all accepted; all existing tests green.\n\n## Deliverables\nCode + tests, REVIEW.md section for this change, CHANGELOG. Nothing broadcast.","baseCommit":"0b867063b3a2135e9488cb16b529e80bcad61162","state":"completed","createdAt":"2026-10-05T19:22:36.493Z"},{"jobId":"0fef589e-73d1-4e04-9e86-aca1ccb04180","workflowId":null,"objective":"$ADAM — official X: https://x.com/IaMaDamIMD — build the official ADAM website and host it on IPFS (continue from parent job). Single job, do NOT ask clarifying questions. Do NOT modify or redeploy any contract. No swap widget.\n\n## Live mainnet contracts (chain 1) — the ONLY source of truth\n- ADAM token: 0x0eB84279EFF71548Ac5212Ce17760B1E54692825\n- AdamSplitOracle: 0x15D85339aaC34C44d12a7df5Bbeb43BAdA1ddf6b\n- AdamDistributorV2 (staking): 0x2DE7e18F40fbf46aF66c8Bc34aF14faD5f77180A\n- NFTClaim: 0xB8A3376F2b6A95418074Ac5669A2A5a6f028BD4C\n- AdamTreasuryV2: 0x322706a008Dd02cb17BB28604e7fC6B14d5a501F\n- AdamHook: 0x8E406c6C6cf6cfb859Ca7de009C66b18560A20cc\n- Pool: PoolKey(currency0 ETH 0x0, currency1 ADAM, fee 0, tickSpacing 60, hooks AdamHook), poolId 0x3bae96a49d241bb4035056e713afdaba06294b72e8124ad7bdc693b16f7d35dc; LP NFT #436936 owned by 0x000000000000000000000000000000000000dEaD (burned).\n- IMPORTANT: the deployed AdamSplitOracle differs from the repo head. All contracts are verified on Etherscan and Sourcify — take every ABI from the verified sources (e.g. https://sourcify.dev/server/v2/contract/1/<address>?fields=abi), never from repo files. Deployed oracle: submit(Attestation a, bytes signature) (2 args), answerType 3 (uint256) rank code (valid 123,132,213,231,312,321; digits = IMD, PNKSTR, IMDSTR rank, 1 = fell most → 5000/3000/2000 bps), currentSplit() returns (uint16[3] weights, bytes32 id, bytes32 code, uint8 source), relayer = 0x087Bada60BB18d1667F03a8BA6b2aE5394E0E2C5.\n\n## Sections (single-page app, hash routing, works on IPFS)\n1. Hero: \"IaMaDam\" (I, M, D highlighted = hidden $IMD), mascot, copyable CA, buttons: X, DexScreener (https://dexscreener.com/ethereum/0x3bae96a49d241bb4035056e713afdaba06294b72e8124ad7bdc693b16f7d35dc), Etherscan, Buy on Uniswap (https://app.uniswap.org/swap?chain=mainnet&outputCurrency=0x0eB84279EFF71548Ac5212Ce17760B1E54692825) with a note to trade in the hooked pool above.\n2. Token overview: plain-language explainer — 1B fixed supply; 11% to NFT holders (10% IMD NFT, 1% Swarm Pepe, 10% unlocks daily over 10 days); 89% single-sided liquidity, LP burned forever; 1.5% fee on every buy/sell (20%→1.5% anti-snipe in first 30 min), 90% to stakers / 10% team; stakers earn $IMD, $PNKSTR, $IMDSTR; the IMD swarm oracle picks the daily split (\"buy what's down\": 50/30/20, equal thirds if no fresh report); 24h stake lock; anyone can call process() for a 0.5% bounty. Table of all contract addresses with Etherscan links.\n3. Live stats: price in ETH/USD, market cap, liquidity, total fees received by Treasury, rewards distributed per asset, today's oracle split + source (signed/fallback) + rank code, LP burned proof, NFT claim progress.\n4. NFT claim: detect the connected wallet's IMD NFTs (0x0000ec93127baa929e58e97dd0095a2bfb38ec1d, ids 0–1999) and Swarm Pepe (0x999ce0ce8c5f7661e0c74a568ffe27ceb9177bdb, ids 1–1178) via ownerOf through Multicall3; per-NFT share, claimable, claimed, next unlock; Claim and Claim & Stake (batched). Warn that Claim & Stake resets the 24h stake lock.\n5. Staking: stake / unstake / exit, balance, unlockTime countdown, earned per asset; claimReward(token) for IMD and PNKSTR; IMDSTR accrues as an ETH budget bought on claim via claimIMDSTR(ethAmount, minOut, deadline) with quote + slippage.\n6. Keepers: Treasury.process() button (0.5% bounty) and claimKeeper.\n7. Relayer (visible only when 0x087Bada60BB18d1667F03a8BA6b2aE5394E0E2C5 is connected): paste an IMD oracle request id → fetch https://api.imd.fun/oracle/requests/<id>/attestation → map to the Attestation struct (answerType \"uint256\" → 3) → preview code, weights, validity → oracle.submit(a, signature). Show the daily question text with a copy button:\n   \"Using public market data for Ethereum mainnet tokens IMD (0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7), PNKSTR (0xc50673edb3a7b94e8cad8a7d4e0cd68864e33edf) and IMDSTR (0x80271ce20184e38f4afe90d4ca134304d197aca2), compare each token's price change in ETH over the 24 hours ending at the end of the window. Rank them by that change from lowest (rank 1) to highest (rank 3), breaking ties in the order IMD, PNKSTR, IMDSTR. Answer with one three-digit integer made of IMD's rank, then PNKSTR's rank, then IMDSTR's rank; for example 213 means PNKSTR fell the most, IMD was in the middle and IMDSTR did best.\"\n\n## Design — from these X profiles (download and bundle the images, do not hotlink)\n- ADAM (@IaMaDamIMD): banner https://pbs.twimg.com/profile_banners/2107086493709725696/1791204071/1500x500, mascot https://pbs.twimg.com/profile_images/2107086910636081152/eDjAea_P_400x400.jpg\n- \"Parents of ADAM\" section, credited with links, no implied endorsement: @surfcoderepeat (https://x.com/surfcoderepeat) avatar https://pbs.twimg.com/profile_images/1707558009776242688/Mu8g3JM2_400x400.jpg, banner https://pbs.twimg.com/profile_banners/408488225/1396053228/1500x500; @Rhynotic (https://x.com/Rhynotic) avatar https://pbs.twimg.com/profile_images/2092640062202613760/N7xPXAmD_400x400.jpg, banner https://pbs.twimg.com/profile_banners/730133482245111809/1771704027/1500x500\n- Palette from the ADAM banner/avatar: deep teal #105070, ocean #307090, sky #70B0D0, bright blue #1090D0, foam white #F0F0F0, near-black #101010. Surf/ocean mood, playful, bold display type, mobile-first, dark and light.\n\n## Tech\nStatic build, wallet connect (injected; WalletConnect optional), viem/wagmi or equivalent, public mainnet RPC with fallback, no keys or secrets, user-signed txs only, clear tx states and errors. All addresses in one config file. README.\n\n## Deliverables\nWebsite source + IPFS CID/URL, README. Nothing broadcast.","baseCommit":"f9b1e4509678c6703da3ca647f742cd457329f5f","state":"completed","createdAt":"2026-10-05T21:02:01.394Z"}]},"deliver":true,"host":false,"site":null,"launch":{"requested":false,"kind":null,"id":null,"status":null,"chainId":null},"oracleRequestId":null,"delivery":{"repoUrl":"https://github.com/identity-md-launches/launch-713-task-single-job-do","pullRequestUrl":"https://github.com/identity-md-launches/launch-713-task-single-job-do/pull/2","commit":"785edda603f9ed41364e08d46ecea440bcc0d6e2","deliveredAt":"2026-10-05T16:37:07.728Z","media":null},"media":null,"nodes":[{"key":"build_contract_project","role":"implement","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":[],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-05T16:36:57.083Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+b4c7ae3a","verifiedTreeHash":"b9bc68227a11456c7029629103d5047c9105ee7e","at":"2026-10-05T16:36:57.139Z","failedChecks":[]},"seat":{"tokenId":"1277","agentId":"52141"},"live":null}],"reviews":[{"status":"sent","chainId":1,"txHash":"0x235ae0dbf638473a0f2861a6a7c99dccb9400c3188d5f77bd8d3e0a0faa623dd","blockNumber":26128450,"sentAt":"2026-10-05T20:06:52.471Z","entries":[{"nodeKey":"build_contract_project","agentId":"52141","value":1,"role":"verification:checks"}]}]}