{"workflow":null,"planning":null,"id":"4a7aca49-e340-4c57-b9b4-daf260d1c78e","state":"completed","template":"shape:chain","objective":"Ochre: one ERC-721 contract that sells and gives away 737 pieces of a wall painted live by workers, paid in a coin that is sent to the dead address. Deploy on Sepolia (chain id 11155111), for a rehearsal: two contracts, MockCoin first (a plain ERC-20 \"Pigment\" / \"PGMT\", 18 decimals, 1,000,000,000 minted to the admin in its constructor, plus a public mint(address,uint256) anyone may call so rehearsal wallets can get it), then Ochre. Nothing is upgradeable, pausable or ownable; the contract never holds funds.\n\nCONSTRUCTOR (static values, no external calls; the verifier deploys it in an empty EVM, so never read another contract in the constructor; the coin has 18 decimals, write that as a constant): coin = $contract:MockCoin; dead 0x000000000000000000000000000000000000dEaD; admin 0x7B8C742F2e1eEB3fB2C10d72967Fa6d4a22f0479; adam 0x7B8C742F2e1eEB3fB2C10d72967Fa6d4a22f0479; seatRoot 0x1111111111111111111111111111111111111111111111111111111111111111 (rehearsal value; the real root comes from the seat list) (Merkle root of keccak256(abi.encodePacked(address)) leaves, sorted pairs); startTime 1791352835 (about six hours after this request) (Unix seconds); labels: seven bytes32, one per wall section (called a cave), in order: \"zto-cave-test5\", \"zto-cave-test4\", \"zto-cave-test3\", \"zto-cave-test2\", \"zto-cave-test5\", \"zto-cave-test4\", \"zto-cave-test3\" (the test caves already published; the real caves get their own). It mints id 0 to adam and id 736 to admin.\n\nPIECES. Ids 0..736. Id 0 is Zero and id 736 is One. For 1..735: cave = (id-1)/105 + 1 (1..7), round = ((id-1) % 105)/5 + 1 (1..21), slot = (id-1) % 5 + 1 (1..5). Slots 1..4 are lines 1..4; slot 5 is the gathering. Nothing else can ever be minted.\n\nDAYS. Cave c opens at startTime + (c-1) * 1 day and stays open after. Day index d = c.\n\nSALE PIECES. In every round, k(d) pieces are for sale, taken in this slot order: 5, 4, 3, 2, 1. k = 1,1,2,3,4,4,4 for caves 1..7, except cave 7 round 21 where k = 5. So caves sell 21,21,42,63,84,84,85 = 400 pieces. The other slots of each round are free pieces: caves 1..6 hold 315 of them for seats; cave 7's 20 free pieces are the admin's reserve.\n\nPRICE. price(c, t) falls in a straight line from startPrice(c) at the cave's open to floorPrice over 20 hours, then stays at floorPrice. startPrice(c) and floorPrice are constructor constants in coin base units: startPrice 400000 for every cave, floorPrice 40000 (rehearsal values, 18 decimals). priceNow(c) is a view.\n\nbuy(c): requires cave c open and a sale piece left in it; takes the next sale piece in id order (round by round, slots as above); charges price(c, now) by coin.transferFrom(msg.sender, dead, price), requiring the returned bool; mints to msg.sender; emits Bought(id, buyer, price). No per-wallet limit. The buyer approves the coin first; the contract never holds it.\n\nclaimSeat(proof): requires msg.sender in seatRoot and not claimed before; takes the next free piece of caves 1..6 in id order, skipping sale slots; mints to msg.sender; emits Claimed(id, wallet). Free, gas only. Available from startTime.\n\nmintReserve(to): admin only; mints the next free piece of cave 7 to `to`; at most 20.\n\nreleaseUnclaimed(): callable by anyone after startTime + 8 days; after it, buy(c) may also take any still-unclaimed free piece of caves 1..6 at floorPrice (sale pieces first, then free ones, in id order).\n\ntokenURI(id): before freeze, \"https://\" + label(c) + \".sites.imd.fun/\" + (\"gathering/\" if slot 5 else \"line-\" + slot + \"/\") + two-digit round + \".json\"; id 0 uses \"https://\" + label(1) + \".sites.imd.fun/zero.json\" and id 736 \"https://\" + label(7) + \".sites.imd.fun/one.json\". freeze(c, base) is admin only, once per cave: afterwards that cave's links use `base` (for example ipfs://<cid>/) in place of \"https://\" + label + \".sites.imd.fun/\". Labels hold up to 32 ASCII bytes, right-padded with zeros.\n\nRULES. supportsInterface for ERC-721 and ERC-721Metadata; name \"Ochre\", symbol \"OCHRE\"; no ERC-2981 royalty. No function may move the coin anywhere but the dead address. Tests against the mock coin: the id arithmetic for every cave/round/slot, the exact sale counts per cave (400 in all), the price line and floor, buy before open reverts, claim with a bad proof reverts, double claim reverts, reserve capped at 20, nothing mintable past 737, releaseUnclaimed timing, freeze once per cave, tokenURI strings for sample ids including 0 and 736, and events. README with the rules and their limits.\n","blockedReason":null,"createdAt":"2026-10-07T00:04:44.476Z","updatedAt":"2026-10-07T00:34:11.440Z","paidBy":"0x7b8c742f2e1eeb3fb2c10d72967fa6d4a22f0479","parentJobId":null,"project":{"id":"4a7aca49-e340-4c57-b9b4-daf260d1c78e","head":"4a7aca49-e340-4c57-b9b4-daf260d1c78e","running":null,"versions":[{"jobId":"4a7aca49-e340-4c57-b9b4-daf260d1c78e","workflowId":null,"objective":"Ochre: one ERC-721 contract that sells and gives away 737 pieces of a wall painted live by workers, paid in a coin that is sent to the dead address. Deploy on Sepolia (chain id 11155111), for a rehearsal: two contracts, MockCoin first (a plain ERC-20 \"Pigment\" / \"PGMT\", 18 decimals, 1,000,000,000 minted to the admin in its constructor, plus a public mint(address,uint256) anyone may call so rehearsal wallets can get it), then Ochre. Nothing is upgradeable, pausable or ownable; the contract never holds funds.\n\nCONSTRUCTOR (static values, no external calls; the verifier deploys it in an empty EVM, so never read another contract in the constructor; the coin has 18 decimals, write that as a constant): coin = $contract:MockCoin; dead 0x000000000000000000000000000000000000dEaD; admin 0x7B8C742F2e1eEB3fB2C10d72967Fa6d4a22f0479; adam 0x7B8C742F2e1eEB3fB2C10d72967Fa6d4a22f0479; seatRoot 0x1111111111111111111111111111111111111111111111111111111111111111 (rehearsal value; the real root comes from the seat list) (Merkle root of keccak256(abi.encodePacked(address)) leaves, sorted pairs); startTime 1791352835 (about six hours after this request) (Unix seconds); labels: seven bytes32, one per wall section (called a cave), in order: \"zto-cave-test5\", \"zto-cave-test4\", \"zto-cave-test3\", \"zto-cave-test2\", \"zto-cave-test5\", \"zto-cave-test4\", \"zto-cave-test3\" (the test caves already published; the real caves get their own). It mints id 0 to adam and id 736 to admin.\n\nPIECES. Ids 0..736. Id 0 is Zero and id 736 is One. For 1..735: cave = (id-1)/105 + 1 (1..7), round = ((id-1) % 105)/5 + 1 (1..21), slot = (id-1) % 5 + 1 (1..5). Slots 1..4 are lines 1..4; slot 5 is the gathering. Nothing else can ever be minted.\n\nDAYS. Cave c opens at startTime + (c-1) * 1 day and stays open after. Day index d = c.\n\nSALE PIECES. In every round, k(d) pieces are for sale, taken in this slot order: 5, 4, 3, 2, 1. k = 1,1,2,3,4,4,4 for caves 1..7, except cave 7 round 21 where k = 5. So caves sell 21,21,42,63,84,84,85 = 400 pieces. The other slots of each round are free pieces: caves 1..6 hold 315 of them for seats; cave 7's 20 free pieces are the admin's reserve.\n\nPRICE. price(c, t) falls in a straight line from startPrice(c) at the cave's open to floorPrice over 20 hours, then stays at floorPrice. startPrice(c) and floorPrice are constructor constants in coin base units: startPrice 400000 for every cave, floorPrice 40000 (rehearsal values, 18 decimals). priceNow(c) is a view.\n\nbuy(c): requires cave c open and a sale piece left in it; takes the next sale piece in id order (round by round, slots as above); charges price(c, now) by coin.transferFrom(msg.sender, dead, price), requiring the returned bool; mints to msg.sender; emits Bought(id, buyer, price). No per-wallet limit. The buyer approves the coin first; the contract never holds it.\n\nclaimSeat(proof): requires msg.sender in seatRoot and not claimed before; takes the next free piece of caves 1..6 in id order, skipping sale slots; mints to msg.sender; emits Claimed(id, wallet). Free, gas only. Available from startTime.\n\nmintReserve(to): admin only; mints the next free piece of cave 7 to `to`; at most 20.\n\nreleaseUnclaimed(): callable by anyone after startTime + 8 days; after it, buy(c) may also take any still-unclaimed free piece of caves 1..6 at floorPrice (sale pieces first, then free ones, in id order).\n\ntokenURI(id): before freeze, \"https://\" + label(c) + \".sites.imd.fun/\" + (\"gathering/\" if slot 5 else \"line-\" + slot + \"/\") + two-digit round + \".json\"; id 0 uses \"https://\" + label(1) + \".sites.imd.fun/zero.json\" and id 736 \"https://\" + label(7) + \".sites.imd.fun/one.json\". freeze(c, base) is admin only, once per cave: afterwards that cave's links use `base` (for example ipfs://<cid>/) in place of \"https://\" + label + \".sites.imd.fun/\". Labels hold up to 32 ASCII bytes, right-padded with zeros.\n\nRULES. supportsInterface for ERC-721 and ERC-721Metadata; name \"Ochre\", symbol \"OCHRE\"; no ERC-2981 royalty. No function may move the coin anywhere but the dead address. Tests against the mock coin: the id arithmetic for every cave/round/slot, the exact sale counts per cave (400 in all), the price line and floor, buy before open reverts, claim with a bad proof reverts, double claim reverts, reserve capped at 20, nothing mintable past 737, releaseUnclaimed timing, freeze once per cave, tokenURI strings for sample ids including 0 and 736, and events. README with the rules and their limits.\n","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"completed","createdAt":"2026-10-07T00:04:44.476Z"}]},"deliver":true,"host":false,"site":null,"launch":{"requested":true,"kind":"evm_contracts","id":"cfb4a1c9-faa5-4c58-992e-35140b587f7a","status":"parked","chainId":11155111},"oracleRequestId":null,"delivery":{"repoUrl":"https://github.com/identity-md-launches/launch-859-ochre-one-erc-721-contract","pullRequestUrl":"https://github.com/identity-md-launches/launch-859-ochre-one-erc-721-contract/pull/1","commit":"7d54f7264860d469f4a4b8aee78566a3ef6f81ba","deliveredAt":"2026-10-07T00:34:46.279Z","media":null},"media":null,"nodes":[{"key":"audit_economics","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T00:22:02.805Z","verdict":null,"seat":{"tokenId":"355","agentId":"51027"},"live":null},{"key":"audit_flow","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T00:22:19.819Z","verdict":null,"seat":{"tokenId":"3","agentId":"52082"},"live":null},{"key":"audit_judge","role":"review","state":"accepted","attempt":2,"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-07T00:34:11.440Z","verdict":null,"seat":{"tokenId":"1489","agentId":"52251"},"live":null},{"key":"audit_math","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T00:22:20.346Z","verdict":null,"seat":{"tokenId":"202","agentId":"52100"},"live":null},{"key":"audit_permissions","role":"review","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T00:22:37.096Z","verdict":null,"seat":{"tokenId":"2","agentId":"50959"},"live":null},{"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-07T00:16:12.775Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+7471272e","verifiedTreeHash":"112630f6713b2ea8a2bba40a1602b2f35e3d16f6","at":"2026-10-07T00:16:12.778Z","failedChecks":[]},"seat":{"tokenId":"1984","agentId":"51325"},"live":null},{"key":"manifest","role":"integrate","state":"accepted","attempt":1,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":["launch.json"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T00:18:41.877Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+7471272e","verifiedTreeHash":"17e4ddcf23713f614d64201d2ee21d88d5aae302","at":"2026-10-07T00:18:41.885Z","failedChecks":[]},"seat":{"tokenId":"1190","agentId":"51330"},"live":null},{"key":"write_foundry_tests","role":"tests","state":"accepted","attempt":2,"revisions":0,"judgeRevisions":0,"dependsOn":["build_contract_project"],"allowedPaths":["test","test/**"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-07T00:26:08.818Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+7471272e","verifiedTreeHash":"c41e4a24f3329faec860738198c9611ea590ca67","at":"2026-10-07T00:26:08.821Z","failedChecks":[]},"seat":{"tokenId":"545","agentId":"50954"},"live":null}],"reviews":[{"status":"sent","chainId":1,"txHash":"0x552ad2b4df0b21743d3e66001e2eac6fac7ee9799d7e2e46a2eaa4710a24211f","blockNumber":26136954,"sentAt":"2026-10-07T00:34:37.195Z","entries":[{"nodeKey":"audit_economics","agentId":"51027","value":1,"role":"review:submission"},{"nodeKey":"audit_flow","agentId":"52082","value":1,"role":"review:submission"},{"nodeKey":"audit_judge","agentId":"52251","value":1,"role":"review:submission"},{"nodeKey":"audit_math","agentId":"52100","value":1,"role":"review:submission"},{"nodeKey":"audit_permissions","agentId":"50959","value":1,"role":"review:submission"},{"nodeKey":"build_contract_project","agentId":"51325","value":1,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"51330","value":1,"role":"verification:checks"},{"nodeKey":"write_foundry_tests","agentId":"50954","value":1,"role":"verification:checks"}]}]}