{"rewardSnapshot":null,"merkleRoot":null,"claims":null,"id":"ab6fcb3d-8ce1-4a37-a4b4-8e773faefc28","launchNumber":978,"kind":"evm_contracts","status":"live","chainId":4663,"sourceRepoUrl":"https://github.com/identity-md-launches/launch-978-plant-organism-one","sourceCommit":"a4ac1e7c28e75f8e7234d21c4af2ba72b60052b2","parkedReason":null,"artifactCount":1,"manifestHash":"3cc7087628c5737e8665078651f8c4ab4f61103f1b709239fea34968e8eb16a1","attestationHash":"0347222bd01326e197430597837a05bd55c173b2a7ec3f1ebec7b90b55d0c7b7","attestation":{"treeHash":"17691a3469cc81e6729d4283cf1faf0bfb9cc7e5","verifierVersion":"0.1.0+ad90ce4c","verifierKey":"68249df1f422fa72f61ca7f0ddaf9b62043959c5c134498441d5e552a9921782","toolchain":{"solc":"0.8.26","forge":"forge Version: 1.8.3","viaIR":false,"optimizer":true,"evmVersion":"cancun","bytecodeHash":"none","optimizerRuns":200},"contracts":[{"name":"OracleAttestation","path":"src/OracleAttestation.sol","abiHash":"518674ab2b227e5f11e9084f615d57663cde47bce1ba168b4c19c7ee22a73d70","opcodes":{"callcode":false,"delegatecall":false,"selfdestruct":false},"metadataHash":"b210ad4b12d717d369c10304f7c6c03ef8461ba1235a7e9e3be1d73b16f8579b","creationCodeHash":"03f00af6a2c1e216c5142290f5a7c5a73b7dca9ff4182f298fb7a6b46fc82bef","deployedCodeHash":"324d2f77e170e519647f21af4dd0b9d0c4677a0d6fe8cd1d41c195a62780eeba","creationCodeBytes":94,"deployedCodeBytes":44},{"name":"PlantOrganism","path":"src/PlantOrganism.sol","abiHash":"625fc5fe0f82ce8e30174b8c2f6a748f19979e12c42795f7bc31921e9b28fbc7","opcodes":{"callcode":false,"delegatecall":false,"selfdestruct":false},"metadataHash":"73409a2466c62b66a9ace992c5a11c287e6e51f01a4d848e5a27b956b77d3cb8","creationCodeHash":"a278501d54c1658f9518cf6801e403453155f7cd4c8dcec63a66eb1c42d6f988","deployedCodeHash":"aa75e504f7ad98563ee16eb9e6b50bc1cf9ac898fa883f49ac392791192f317d","creationCodeBytes":14228,"deployedCodeBytes":13626}],"manifest":{"kind":"evm_contracts","notes":"Deploy only PlantOrganism on Robinhood Chain 4663. Constructor order is IMD, initial oracle signer, uint32 FALLBACK_CELL, deployer; the two addresses are fixed by the brief, 10223579 is Lisbon (0x009BFFDB; quarter-degrees 155, -37), and $owner receives the sole one-time binding authority. Location starts at 0, water at 50, and lastSettledDay at the deployment Unix day. This manifest creates no PLANT token, pool or hook and schedules no initialization calls. The separate second launch supplies PLANT and its hook. Once available, the explicit deployer alone may call bind(hook, questionHash): the hook must identify this organism and its PLANT token; binding permanently stores both and the nonzero frozen canonical oracle question hash, with no remaining deployer powers. Until bound, settle only advances the day cursor; park and redeem revert. No administrator, upgrade, pause or mutable economic parameters exist. Any received IMD enters pot after backing and gardener obligations. Anyone may submit consecutive days to settle using IdentityMD Oracle EIP-712 v2, chain 4663 and this deployed contract as verifyingContract; QUESTION_HASH must match, answerType is 5, and answer is canonical abi.encode(bytes32[]) containing exactly three words, with agreed >= quorum. Word 0 carries sun, rain, challenger validity/cell and Unix day; words 1 and 2 are emitted unchanged. Rain takes precedence over sun. Settlement rewards the old location's active gardeners before movement and pending activation, then pays the caller 1% of remaining pot. Support counts immediately toward movement; newly parked tokens earn only after the next settlement. At birth, a valid nonzero challenger with at least 5% of the binding supply snapshot can move the plant regardless of support parked at cell 0; three empty birth settles select FALLBACK_CELL. claim() handles the current cell and checkpointed credits; claim(cell) also realizes rewards at a former cell. floor() is a ratio scaled by 1e18; live redemption pays 90% of proportional backing and retains redeemed PLANT forever. After 30 days without a successful bound settle, pot joins backing and redemption pays 100%; the clock starts at binding, so an unbound body cannot die while waiting for the second launch. Binding preserves lastSettledDay; an unbound settle before binding can advance that cursor to today. Death is reflected immediately in views; anyone may call syncDeath() to record it, including later deposits, while claims and unparking remain available. Anyone may relay rotateSigner(newSigner, sig), but authorization must come from the current signer over RotateSigner(address organism,address newSigner,uint256 nonce) in the same v2 domain using rotationNonce. Retired signers retain attestation authority for 30 days, never rotation authority. Integration requires exact-transfer, nonrebasing tokens and no post-bind PLANT minting; bind snapshots PLANT supply. Holder burns leave the snapshot unchanged and do not block exits; park, redeem and bound settle reject supply above that snapshot. README.md, docs/ORACLE.md and docs/ACCOUNTING.md describe the accepted interfaces and integration assumptions.","contracts":[{"contract":"PlantOrganism","constructorArgs":["0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127","0x5598aa9146215bc13eb26f2c692ad1461fd32982","10223579","$owner"]}]},"manifestError":null},"attestationFailure":null,"deployFailure":null,"policyVersion":28,"economics":null,"poolFee":null,"requester":"0x21f398e7b17adc3ce2633d0ff7b7f892fe00f9c9","admissionChecks":[{"name":"provenance","detail":"8 node(s) accepted at a4ac1e7c","status":"passed"},{"name":"findings","detail":"8 accepted submission(s), no unresolved blocking findings","status":"passed"},{"name":"independent_review","detail":"1 independent review(s)","status":"passed"},{"name":"bytecode","detail":"2 contract(s) clean and reproducible","status":"passed"},{"name":"manifest","detail":"1 application contracts; no protocol token or pool","status":"passed"},{"name":"protected_invariants","detail":"invariants-11aebc2aca1e: Suite result: ok. 1 passed; 0 failed; 0 skipped; finished in 5.73ms (5.32ms CPU time)","status":"passed"},{"name":"economics","detail":"policy explicitly selects no on-chain contributor rewards","status":"passed"}],"assurances":[],"logo":null,"seeded":null,"createdAt":"2026-10-08T05:59:36.576Z","updatedAt":"2026-10-08T06:00:14.921Z","jobs":[{"id":"5a737f9c-132f-4bbd-a556-4510d4dcce14","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.","state":"completed","attachedAt":"2026-10-08T05:59:36.576Z"}],"artifacts":[{"role":"other","name":"PlantOrganism","address":"0xcc4b500c046c10ecdb59523195b4f3e392615131","creationCodeHash":"a278501d54c1658f9518cf6801e403453155f7cd4c8dcec63a66eb1c42d6f988","txHash":"0x659bb9d371f8e17202954966c3dcf013de92450c6a421bbc62290b8b037a037c","blockNumber":83087279,"verifiedAt":null,"verifyFailure":null}],"allocations":[]}