{"workflow":null,"planning":null,"id":"5a737f9c-132f-4bbd-a556-4510d4dcce14","state":"completed","template":"shape:chain","objective":"PLANT ORGANISM — one contract on robinhood chain, the body of a digital plant that lives somewhere real: its location's weather decides how it grows, holders decide where to place it. no token here (the PLANT token + pool + hook come in a second launch that pays into this contract). no admin, no upgrade, no pause; all numbers constant. constructor (static args): IMD = 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, signer = 0x5598aa9146215bc13eb26f2c692ad1461fd32982, FALLBACK_CELL = 10223579, deployer = $owner. cell packing: uint32 = uint16(int16 lat in quarter degrees) << 16 | uint16(int16 lon); lisbon (155, −37) = 0x009BFFDB = 10223579. day index = unix day (timestamp / 86400); lastSettledDay starts at the deployment day.\n\nBIND (the only privileged call, once): bind(hook, questionHash) by deployer, only while unbound: reads hook.organism() == this and hook.plant(); stores plant, hook and QUESTION_HASH (the keccak of the frozen oracle question; set once, never changed); emits Bound. after that the deployer has no powers. until bound, park/redeem revert and settle only advances lastSettledDay.\n\nMONEY: IMD arrives from the launch factory's fee distributor (1% of trades) and from the hook (0.75%); any IMD transferred in counts. pot = IMD held − backing − gardener IMD owed. backing is redeemable IMD.\n\nSTATE: location (cell = int16 lat + int16 lon, quarter degrees; 0 = nowhere), water 0..100 (starts 50), backing, parked[cell][holder], parkedTotal[cell], burned (PLANT held forever), lastSettledDay.\nHOURS (24 per utc day, inside settle): rain → water = min(100, water+3). sun with water ≥ 1 → SIP: water −1; sip = pot/10; backing += 2/3 sip; gardener pool += 1/3 sip. else nothing.\nSETTLE(attestation, sig), anyone may call: imd OracleAttestation v2 (EIP-712 domain name \"IdentityMD Oracle\", version \"2\", chainId 4663, verifyingContract = THIS contract; struct fields as published by imd: requestId, chainId, questionHash, answerType, answer, figure, fromBlock, toBlock, blockHash, panelJobId, panelSize, quorum, agreed, issuedAt, expiresAt), signed by the oracle signer. require attestation.chainId == 4663, attestation.questionHash == QUESTION_HASH, answerType == bytes32[] with exactly 3 words (so no other oracle request can feed this contract). word0: bits 0..23 sun mask, 24..47 rain mask, 48 challenger valid, 64..95 challenger cell, 96..127 day index; word1/2 hourly temp + wind, only emitted. require valid sig, issuedAt ≤ now ≤ expiresAt, day == lastSettledDay+1 (missed days in order); apply hours; READ; pay caller 1% of pot; emit Settled(day, words, sips, backing, water, location).\nREAD: C = current, L = challenger. if L ≠ C and valid and parkedTotal[L] > parkedTotal[C] and parkedTotal[L] ≥ 5% of PLANT supply → location = L (Moved); else stay. no minimum stay. the gardener pool goes pro rata to holders parked behind C as of the previous settle (reward-per-token accumulator per cell + holder checkpoints; tokens parked mid-day activate at the next settle; unparked tokens drop out); if nobody is parked behind C it goes to backing. claim() any time, in IMD.\nPARK/UNPARK(cell, amount): any time, any cell, incl. the current one. parking proposes; no list on chain.\nREDEEM(amount): floor = backing / (PLANT supply − burned); pays amount × floor × 90% in IMD from backing; 10% stays; PLANT is pulled in and held forever. unpark first. floor never decreases.\nBIRTH: location 0, no hours while 0; the first settle with a valid challenger ≥ 5% moves it; after 3 empty settles → FALLBACK_CELL (lisbon, (155, −37)).\nDEAD PLANT: no successful settle for 30 days → pot merges into backing and redeem pays full floor.\nSIGNER ROTATION (no governance, no votes): rotateSigner(newSigner, sig) is accepted only if sig is an EIP-712 message from the CURRENT signer naming this contract and the new address; the previous signer stays valid for 30 more days. holders cannot change the signer. nothing else is settable by anyone.\nSAFETY: reentrancy guards; no external calls beyond IMD/PLANT transfers; no delegatecall/selfdestruct/proxy/ownable/pausable/roles; uint256 math rounding toward backing; settle O(24), never O(holders); public reads of all state + floor + pot; events for every action.\nTESTS (foundry): fee inflow → pot; synthetic day from masks; missed-day ordering; fixture attestation accepted, expired/wrong-domain/wrong-signer/v1 rejected; park → settle → claim incl. pending→active; invariants: floor never decreases, pot + backing + owed == IMD held (minus bounties), burned never leaves; move, birth, fallback, dead plant, signer rotation (accepted only from the current signer), bind-once; settle ≤ 400k gas. one-page README: rules in plain words, how to call settle, addresses.","blockedReason":null,"createdAt":"2026-10-08T02:26:49.629Z","updatedAt":"2026-10-08T05:59:30.658Z","paidBy":"0x21f398e7b17adc3ce2633d0ff7b7f892fe00f9c9","parentJobId":null,"project":{"id":"5a737f9c-132f-4bbd-a556-4510d4dcce14","head":"5a737f9c-132f-4bbd-a556-4510d4dcce14","running":null,"versions":[{"jobId":"5a737f9c-132f-4bbd-a556-4510d4dcce14","workflowId":null,"objective":"PLANT ORGANISM — one contract on robinhood chain, the body of a digital plant that lives somewhere real: its location's weather decides how it grows, holders decide where to place it. no token here (the PLANT token + pool + hook come in a second launch that pays into this contract). no admin, no upgrade, no pause; all numbers constant. constructor (static args): IMD = 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, signer = 0x5598aa9146215bc13eb26f2c692ad1461fd32982, FALLBACK_CELL = 10223579, deployer = $owner. cell packing: uint32 = uint16(int16 lat in quarter degrees) << 16 | uint16(int16 lon); lisbon (155, −37) = 0x009BFFDB = 10223579. day index = unix day (timestamp / 86400); lastSettledDay starts at the deployment day.\n\nBIND (the only privileged call, once): bind(hook, questionHash) by deployer, only while unbound: reads hook.organism() == this and hook.plant(); stores plant, hook and QUESTION_HASH (the keccak of the frozen oracle question; set once, never changed); emits Bound. after that the deployer has no powers. until bound, park/redeem revert and settle only advances lastSettledDay.\n\nMONEY: IMD arrives from the launch factory's fee distributor (1% of trades) and from the hook (0.75%); any IMD transferred in counts. pot = IMD held − backing − gardener IMD owed. backing is redeemable IMD.\n\nSTATE: location (cell = int16 lat + int16 lon, quarter degrees; 0 = nowhere), water 0..100 (starts 50), backing, parked[cell][holder], parkedTotal[cell], burned (PLANT held forever), lastSettledDay.\nHOURS (24 per utc day, inside settle): rain → water = min(100, water+3). sun with water ≥ 1 → SIP: water −1; sip = pot/10; backing += 2/3 sip; gardener pool += 1/3 sip. else nothing.\nSETTLE(attestation, sig), anyone may call: imd OracleAttestation v2 (EIP-712 domain name \"IdentityMD Oracle\", version \"2\", chainId 4663, verifyingContract = THIS contract; struct fields as published by imd: requestId, chainId, questionHash, answerType, answer, figure, fromBlock, toBlock, blockHash, panelJobId, panelSize, quorum, agreed, issuedAt, expiresAt), signed by the oracle signer. require attestation.chainId == 4663, attestation.questionHash == QUESTION_HASH, answerType == bytes32[] with exactly 3 words (so no other oracle request can feed this contract). word0: bits 0..23 sun mask, 24..47 rain mask, 48 challenger valid, 64..95 challenger cell, 96..127 day index; word1/2 hourly temp + wind, only emitted. require valid sig, issuedAt ≤ now ≤ expiresAt, day == lastSettledDay+1 (missed days in order); apply hours; READ; pay caller 1% of pot; emit Settled(day, words, sips, backing, water, location).\nREAD: C = current, L = challenger. if L ≠ C and valid and parkedTotal[L] > parkedTotal[C] and parkedTotal[L] ≥ 5% of PLANT supply → location = L (Moved); else stay. no minimum stay. the gardener pool goes pro rata to holders parked behind C as of the previous settle (reward-per-token accumulator per cell + holder checkpoints; tokens parked mid-day activate at the next settle; unparked tokens drop out); if nobody is parked behind C it goes to backing. claim() any time, in IMD.\nPARK/UNPARK(cell, amount): any time, any cell, incl. the current one. parking proposes; no list on chain.\nREDEEM(amount): floor = backing / (PLANT supply − burned); pays amount × floor × 90% in IMD from backing; 10% stays; PLANT is pulled in and held forever. unpark first. floor never decreases.\nBIRTH: location 0, no hours while 0; the first settle with a valid challenger ≥ 5% moves it; after 3 empty settles → FALLBACK_CELL (lisbon, (155, −37)).\nDEAD PLANT: no successful settle for 30 days → pot merges into backing and redeem pays full floor.\nSIGNER ROTATION (no governance, no votes): rotateSigner(newSigner, sig) is accepted only if sig is an EIP-712 message from the CURRENT signer naming this contract and the new address; the previous signer stays valid for 30 more days. holders cannot change the signer. nothing else is settable by anyone.\nSAFETY: reentrancy guards; no external calls beyond IMD/PLANT transfers; no delegatecall/selfdestruct/proxy/ownable/pausable/roles; uint256 math rounding toward backing; settle O(24), never O(holders); public reads of all state + floor + pot; events for every action.\nTESTS (foundry): fee inflow → pot; synthetic day from masks; missed-day ordering; fixture attestation accepted, expired/wrong-domain/wrong-signer/v1 rejected; park → settle → claim incl. pending→active; invariants: floor never decreases, pot + backing + owed == IMD held (minus bounties), burned never leaves; move, birth, fallback, dead plant, signer rotation (accepted only from the current signer), bind-once; settle ≤ 400k gas. one-page README: rules in plain words, how to call settle, addresses.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","state":"completed","createdAt":"2026-10-08T02:26:49.629Z"}]},"deliver":true,"host":false,"site":null,"launch":{"requested":true,"kind":"evm_contracts","id":"ab6fcb3d-8ce1-4a37-a4b4-8e773faefc28","status":"live","chainId":4663},"oracleRequestId":null,"delivery":{"repoUrl":"https://github.com/identity-md-launches/launch-978-plant-organism-one","pullRequestUrl":"https://github.com/identity-md-launches/launch-978-plant-organism-one/pull/1","commit":"a4ac1e7c28e75f8e7234d21c4af2ba72b60052b2","deliveredAt":"2026-10-08T05:59:36.576Z","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-08T05:10:59.567Z","verdict":null,"seat":{"tokenId":"629","agentId":"52162"},"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-08T05:16:00.295Z","verdict":null,"seat":{"tokenId":"1657","agentId":"52170"},"live":null},{"key":"audit_judge","role":"review","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":1,"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-08T05:59:30.658Z","verdict":null,"seat":{"tokenId":"1871","agentId":"51032"},"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-08T05:12:38.682Z","verdict":null,"seat":{"tokenId":"372","agentId":"52160"},"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-08T05:15:21.726Z","verdict":null,"seat":{"tokenId":"959","agentId":"52176"},"live":null},{"key":"build_contract_project","role":"implement","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":1,"dependsOn":[],"allowedPaths":[],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T05:47:35.537Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+ad90ce4c","verifiedTreeHash":"8cda6d417755900c47c487a65af39853267725b3","at":"2026-10-08T05:47:35.570Z","failedChecks":[]},"seat":{"tokenId":"1351","agentId":"52344"},"live":null},{"key":"manifest","role":"integrate","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":1,"dependsOn":["build_contract_project"],"allowedPaths":["launch.json"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T05:50:05.623Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+ad90ce4c","verifiedTreeHash":"7364973cdda572ad151dc43eff5a57648221fbb7","at":"2026-10-08T05:50:05.625Z","failedChecks":[]},"seat":{"tokenId":"180","agentId":"51188"},"live":null},{"key":"write_foundry_tests","role":"tests","state":"accepted","attempt":1,"revisions":1,"judgeRevisions":1,"dependsOn":["build_contract_project"],"allowedPaths":["test","test/**"],"failureReason":null,"dispatchNote":null,"dispatchNoteAt":null,"updatedAt":"2026-10-08T05:56:09.022Z","verdict":{"status":"accepted","profile":"foundry","evaluation":"checks","rejectionCode":null,"detail":"all checks passed","verifierVersion":"0.1.0+ad90ce4c","verifiedTreeHash":"d95d9d23fb34a71b31491e3416f96f12564f9733","at":"2026-10-08T05:56:09.023Z","failedChecks":[]},"seat":{"tokenId":"1393","agentId":"52122"},"live":null}],"reviews":[{"status":"queued","chainId":1,"txHash":null,"blockNumber":null,"sentAt":null,"entries":[{"nodeKey":"audit_economics","agentId":"52162","value":1,"role":"review:submission"},{"nodeKey":"audit_flow","agentId":"52170","value":1,"role":"review:submission"},{"nodeKey":"audit_judge","agentId":"51032","value":1,"role":"review:submission"},{"nodeKey":"audit_judge","agentId":"51315","value":1,"role":"review:submission"},{"nodeKey":"audit_math","agentId":"52160","value":1,"role":"review:submission"},{"nodeKey":"audit_permissions","agentId":"52176","value":1,"role":"review:submission"},{"nodeKey":"build_contract_project","agentId":"52141","value":1,"role":"verification:checks"},{"nodeKey":"build_contract_project","agentId":"52344","value":1,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"51188","value":1,"role":"verification:checks"},{"nodeKey":"manifest","agentId":"51418","value":1,"role":"verification:checks"},{"nodeKey":"write_foundry_tests","agentId":"52122","value":1,"role":"verification:checks"},{"nodeKey":"write_foundry_tests","agentId":"51179","value":1,"role":"verification:checks"}]}]}