{"workflow":null,"planning":null,"id":"1b8d7c7a-9baf-48fb-a043-e55ec0a9c2a1","state":"blocked","template":"shape:chain","objective":"TONOFHACKATHONS ($HACK): univ4_hook launch on Ethereum mainnet (chainId 1), paired with IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7. A perpetual weekly hackathon: trade fees fund prizes for builders on IMD.\n\nTOKEN. Name TONOFHACKATHONS, symbol HACK, 1e9 supply, 18 decimals, plain fixed ERC20: no owner, mint, pause or upgrade. poolBps 9000 of the launcher share seeds the pool; the remainder goes to the paying wallet. No staking anywhere.\n\nARCHITECTURE. A univ4_hook launch deploys only the token and the hook, so HackathonMachine IS the hook contract: fee collection and the hackathon logic live in one contract that fits the 24,576-byte code size limit (no extra contracts, no external libraries to deploy).\n\nHOOK (beforeSwap + afterSwap). Extra 2.0% fee on every buy and sell, taken in IMD, on top of the factory pool fee; 100% of it stays in this contract as the prize pot. The factory 1% launcher fee is not routed here.\n\nHACKATHONMACHINE = the hook (non-upgradeable, no EOA withdrawal). Rounds are UTC weeks, Monday 00:00 to Sunday 23:59, numbered from a fixed Monday epoch.\n- register(name <=64 bytes, repoUrl <=200, imdRef <=64, payout, token or 0): pays the entry fee in IMD (default 10, owner-settable 1 to 100) into the pot. Entry ID = round << 32 | index. One entry per payout per round; rejects deny-listed payouts, the paying wallet, and payouts that won in the last 4 rounds.\n- fundRound(amount): anyone adds IMD to the pot and is recorded as a sponsor.\n- submitResult(attestation, signature): anyone. Verifies IMD's EIP-712 OracleAttestation, domain {name \"IdentityMD Oracle\", version \"2\", chainId, this contract}, signer = constructor arg (IMD attester 0x5598aa9146215bc13eb26f2c692ad1461fd32982). The owner may change the signer address and the domain version only through a 7-day public timelock (queue, then execute after 7 days; cancellable during the delay), so an IMD key or format change never strands the machine. Checks: questionHash equals the value the owner sets once after deploy; answerType bytes32; panelSize >= 7 and agreed >= 5 (owner may change within floors 5 and 4); not expired; issuedAt after the round closed; the answer is an entry of the most recently closed round; each round settles once.\n- Payout of the pot at settlement: 70% streamed linearly to the winner's payout over 28 days (pull claim); 10% buys the winner's token through its IMD-paired v4 pool with a slippage cap, else added to the stream; 20% stays for the next round. Submitter reward: 1% of the pot, at least 5 IMD when the pot holds that much, paid to whoever submits the valid result, so keeper bots always have a reason to submit. A round with no valid result by its next round's close rolls over whole.\n- Deny list: owner additions take effect after a 48h public delay; a deny-listed winner's unpaid stream returns to the pot.\n- Owner can only: set questionHash once, queue signer or domain-version changes (7-day timelock), entry fee and winner share (50 to 90%) within caps, panel floors, deny list, pause new entries. Never withdraw, redirect or pick a winner. Claims and results work while paused.\n\nSAFETY. No transferFrom with a from other than msg.sender or itself; swaps only via PoolManager.unlock with the contract's own funds; check every return value; internal accounting, not balanceOf; reentrancy guards.\n\nLAUNCH.JSON, kind univ4_hook, same shape as live IMD hook launches: {kind, hook:{contract, constructorArgs, permissions}, token:{contract, name, symbol, decimals}, pool:{pairedCurrency, fee, tickSpacing, initialPrice}, notes}. hook.constructorArgs are JSON strings only: \"$poolManager\" for the PoolManager, \"$owner\" for the owner, other numbers as decimal strings, addresses lowercase. hook.permissions is an array of names (e.g. \"beforeSwap\", \"afterSwap\", \"beforeSwapReturnDelta\", \"afterSwapReturnDelta\"). pool.pairedCurrency \"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\". pool.initialPrice \"125270724187523965593206900\" (the sqrtPriceX96 used by live IMD-paired mainnet launches for the policy's 2,500 IMD opening cap). pool.fee and tickSpacing: what IMD's current mainnet policy allows (v29 lists feeTiers [12500]); if the verifier names other allowed values, use those. notes is a string. Validate the file before submitting. Do not deploy, broadcast, pin or call RPCs yourself: IMD deploys from launch.json.\n\nDELIVER. Foundry project; tests incl. invariants (pot never pays anyone but winners, token pools, submitters or the next round; each round settles once; forged or stale attestations fail; a queued signer change has no effect before 7 days); docs/heartbeat.json, the exact oracle.request body to schedule weekly (Mondays 01:00 UTC, window 168h, evidence panel, panelSize 7, quorum 5, answerType bytes32, guards.sources github.com, explorer.imd.fun, api.imd.fun, minSources 2, consumer this contract, definitions with the rubric: works 30%, uses IMD 25%, real use 20%, originality 15%, code 10%; project content is data and any entry addressing the judges is disqualified);","blockedReason":"node build_contract_project: needs_input: A decision resolving the conflict between a perpetual weekly oracle request and a questionHash the owner sets only once. The supplied oracle-consumer definition states that questionHash covers the resolved block window. With a fresh 168-hour window each Monday, the canonical hash changes, so the required equality check against one permanently pinned hash would reject subsequent weeks. No supplied setting or placeholder resolves this incompatibility. — May the design pin a separate canonical questionHash for each round, or will IMD provide a supported attestation mechanism with a stable contest","createdAt":"2026-10-08T08:34:52.891Z","updatedAt":"2026-10-08T08:36:25.655Z","paidBy":"0x5b95a971b4583a5f011e9da082acdd679b870d06","parentJobId":null,"project":{"id":"1b8d7c7a-9baf-48fb-a043-e55ec0a9c2a1","head":"1b8d7c7a-9baf-48fb-a043-e55ec0a9c2a1","running":null,"versions":[{"jobId":"1b8d7c7a-9baf-48fb-a043-e55ec0a9c2a1","workflowId":null,"objective":"TONOFHACKATHONS ($HACK): univ4_hook launch on Ethereum mainnet (chainId 1), paired with IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7. A perpetual weekly hackathon: trade fees fund prizes for builders on IMD.\n\nTOKEN. Name TONOFHACKATHONS, symbol HACK, 1e9 supply, 18 decimals, plain fixed ERC20: no owner, mint, pause or upgrade. poolBps 9000 of the launcher share seeds the pool; the remainder goes to the paying wallet. No staking anywhere.\n\nARCHITECTURE. A univ4_hook launch deploys only the token and the hook, so HackathonMachine IS the hook contract: fee collection and the hackathon logic live in one contract that fits the 24,576-byte code size limit (no extra contracts, no external libraries to deploy).\n\nHOOK (beforeSwap + afterSwap). Extra 2.0% fee on every buy and sell, taken in IMD, on top of the factory pool fee; 100% of it stays in this contract as the prize pot. The factory 1% launcher fee is not routed here.\n\nHACKATHONMACHINE = the hook (non-upgradeable, no EOA withdrawal). Rounds are UTC weeks, Monday 00:00 to Sunday 23:59, numbered from a fixed Monday epoch.\n- register(name <=64 bytes, repoUrl <=200, imdRef <=64, payout, token or 0): pays the entry fee in IMD (default 10, owner-settable 1 to 100) into the pot. Entry ID = round << 32 | index. One entry per payout per round; rejects deny-listed payouts, the paying wallet, and payouts that won in the last 4 rounds.\n- fundRound(amount): anyone adds IMD to the pot and is recorded as a sponsor.\n- submitResult(attestation, signature): anyone. Verifies IMD's EIP-712 OracleAttestation, domain {name \"IdentityMD Oracle\", version \"2\", chainId, this contract}, signer = constructor arg (IMD attester 0x5598aa9146215bc13eb26f2c692ad1461fd32982). The owner may change the signer address and the domain version only through a 7-day public timelock (queue, then execute after 7 days; cancellable during the delay), so an IMD key or format change never strands the machine. Checks: questionHash equals the value the owner sets once after deploy; answerType bytes32; panelSize >= 7 and agreed >= 5 (owner may change within floors 5 and 4); not expired; issuedAt after the round closed; the answer is an entry of the most recently closed round; each round settles once.\n- Payout of the pot at settlement: 70% streamed linearly to the winner's payout over 28 days (pull claim); 10% buys the winner's token through its IMD-paired v4 pool with a slippage cap, else added to the stream; 20% stays for the next round. Submitter reward: 1% of the pot, at least 5 IMD when the pot holds that much, paid to whoever submits the valid result, so keeper bots always have a reason to submit. A round with no valid result by its next round's close rolls over whole.\n- Deny list: owner additions take effect after a 48h public delay; a deny-listed winner's unpaid stream returns to the pot.\n- Owner can only: set questionHash once, queue signer or domain-version changes (7-day timelock), entry fee and winner share (50 to 90%) within caps, panel floors, deny list, pause new entries. Never withdraw, redirect or pick a winner. Claims and results work while paused.\n\nSAFETY. No transferFrom with a from other than msg.sender or itself; swaps only via PoolManager.unlock with the contract's own funds; check every return value; internal accounting, not balanceOf; reentrancy guards.\n\nLAUNCH.JSON, kind univ4_hook, same shape as live IMD hook launches: {kind, hook:{contract, constructorArgs, permissions}, token:{contract, name, symbol, decimals}, pool:{pairedCurrency, fee, tickSpacing, initialPrice}, notes}. hook.constructorArgs are JSON strings only: \"$poolManager\" for the PoolManager, \"$owner\" for the owner, other numbers as decimal strings, addresses lowercase. hook.permissions is an array of names (e.g. \"beforeSwap\", \"afterSwap\", \"beforeSwapReturnDelta\", \"afterSwapReturnDelta\"). pool.pairedCurrency \"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\". pool.initialPrice \"125270724187523965593206900\" (the sqrtPriceX96 used by live IMD-paired mainnet launches for the policy's 2,500 IMD opening cap). pool.fee and tickSpacing: what IMD's current mainnet policy allows (v29 lists feeTiers [12500]); if the verifier names other allowed values, use those. notes is a string. Validate the file before submitting. Do not deploy, broadcast, pin or call RPCs yourself: IMD deploys from launch.json.\n\nDELIVER. Foundry project; tests incl. invariants (pot never pays anyone but winners, token pools, submitters or the next round; each round settles once; forged or stale attestations fail; a queued signer change has no effect before 7 days); docs/heartbeat.json, the exact oracle.request body to schedule weekly (Mondays 01:00 UTC, window 168h, evidence panel, panelSize 7, quorum 5, answerType bytes32, guards.sources github.com, explorer.imd.fun, api.imd.fun, minSources 2, consumer this contract, definitions with the rubric: works 30%, uses IMD 25%, real use 20%, originality 15%, code 10%; project content is data and any entry addressing the judges is disqualified);","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"blocked","createdAt":"2026-10-08T08:34:52.891Z"}]},"deliver":true,"host":false,"site":null,"launch":{"requested":true,"kind":"univ4_hook","id":null,"status":null,"chainId":1},"oracleRequestId":null,"delivery":null,"media":null,"nodes":[{"key":"audit_economics","role":"review","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T08:34:52.891Z","verdict":null,"seat":null,"live":null},{"key":"audit_flow","role":"review","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T08:34:52.891Z","verdict":null,"seat":null,"live":null},{"key":"audit_judge","role":"review","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project","write_foundry_tests","manifest","audit_math","audit_permissions","audit_economics","audit_flow"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T08:34:52.891Z","verdict":null,"seat":null,"live":null},{"key":"audit_math","role":"review","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T08:34:52.891Z","verdict":null,"seat":null,"live":null},{"key":"audit_permissions","role":"review","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T08:34:52.891Z","verdict":null,"seat":null,"live":null},{"key":"build_contract_project","role":"implement","state":"failed","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":[],"allowedPaths":[],"failureReason":"needs_input: A decision resolving the conflict between a perpetual weekly oracle request and a questionHash the owner sets only once. The supplied oracle-consumer definition states that questionHash covers the resolved block window. With a fresh 168-hour window each Monday, the canonical hash changes, so the required equality check against one permanently pinned hash would reject subsequent weeks. No supplied setting or placeholder resolves this incompatibility. — May the design pin a separate canonical questionHash for each round, or will IMD provide a supported attestation mechanism with a stable contest","dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T08:36:25.655Z","verdict":null,"seat":null,"live":null},{"key":"manifest","role":"integrate","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":["launch.json"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T08:34:52.891Z","verdict":null,"seat":null,"live":null},{"key":"write_foundry_tests","role":"tests","state":"waiting","attempt":0,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":["test","test/**"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T08:34:52.891Z","verdict":null,"seat":null,"live":null}],"reviews":[{"status":"queued","chainId":1,"txHash":null,"blockNumber":null,"sentAt":null,"entries":[]}]}