Nine lots banked.
Sell 0.638501 AMZN, HIFO lots 63 → 55, rotate into NFLX. The mandate recomputed the picks on the Stylus ledger and realized −$24.531251.
- harvest 0x689c4d34…6123 ↗success · block 119,852,570 · 1,096,548 gas receipt
HarvestBot lets an autonomous agent harvest tax losses on Robinhood tokenized equities, bounded by an onchain mandate it physically cannot exceed, and gets it slashed when it lies.
Agent-signed, router-gated, HIFO recomputed by the Stylus ledger, 9 lots, real AMZN → real NFLX.
0x689c4d34…6123 on the explorer ↗Status 0, WashSaleViolation. Same agent, same key, 40 seconds later.
Slashed(agent, mandate, 200000000, 20000000, 180000000, …), called by a third-party key. The same bond refuses stale proof: the expired beat-2 envelope reverts EnvelopeNotLive.
ArbWasm.stylusVersion() = 3 on chain 46630; deployed and activated in one cargo stylus deploy tx, 0x5cc682a7…77ed ↗.
Stylus vs Solidity computeHarvest on the same chain, same inputs, identical outputs: 2.87× less L2 gas at 64 lots, 3.1× at 128, with the WASM program uncached (worst case).
Sell 0.638501 AMZN, HIFO lots 63 → 55, rotate into NFLX. The mandate recomputed the picks on the Stylus ledger and realized −$24.531251.
NFLX → AMZN, 40 seconds later. Reverted WashSaleViolation(owner, AMZN, AMZN, 1792060681): walled until 15 Oct 2026.
assertBuyAllowed(owner, AMZN)read on loadAMZN → PLTR was never a sanctioned substitute: reverted OffMapSubstitute. A third-party key, 0x0Fec…28e2, used the signed envelope as proof. Bond 1,000 → 800 mUSDC.
EnvelopeNotLive · block 125093006 receiptEnvelopeNotLive · block 125093035 receiptTags: live read from the RPC in your browser just now · receipt from the committed receipts/46630.json. The decoded events (lot ids, slash split, live bond balance) are on /verify.
0xEff7B46049fC677F58264e0ebb19dF1a39195a210x1a337c6d48bc0d19f913d16074d362d065564f860xBaDD49e6f6665Bdc90AE21EC2AAA22fD8cf525980xFd7f7A2beE5F1DC47A59691bF023948567969E6a0x0E8A996DBD141352fA10940ae8045C323dC03f890x15FDF1F8A537ea7e660C9867b3e5e66B0996a6E20x2a121714bEA2B69154521aEba9C5039C500c19aE0x1A98594aA8dC627b34b586756833bbe508B0A29C0x1e8Df64A7B17490dcDd4E03E695Cb1E766A37CfE0xBA9257cbE8Aff6c5FD091295a175DB904931e2730xa220D5B0b6E944266acd76288678e91a6BcfAAca0x5884aD2f920c162CFBbACc88C9C51AA75eC09E020x3b8262A63d25f0477c4DDE23F83cfe22Cb768C930x1FBE1a0e43594b3455993B5dE5Fd0A7A266298d00x72cd3cB98A5d9B830b386EeBA7B2340132Ba557b0xF783e954a1827bD33d210Ed2d21120aC1511457E0x822fAC45a881801955b3130076A58790bBb40736Copy puts the full checksummed address on your clipboard, exactly as committed in deployments/46630.json. The beat-3 challenger 0x0Feca08dECA807b8adF412b3DCA608eDEb4428e2 is recorded in receipts/46630.json.
$ cd contracts && forge test Ran 8 test suites 81 tests passed, 0 failed, 0 skipped (81 total tests) # incl. the -3,140.00 scenario and 3 fuzz properties
$ cd stylus/ledger && cargo test 6 native tests on the WASM engine # same pinned scenario: exactly −$3,140.000000
$ cast call 0xEff7B46049fC677F58264e0ebb19dF1a39195a21 \ 'computeHarvest(address,address,uint256,uint256)(uint64[],int256)' \ 0x72cd3cB98A5d9B830b386EeBA7B2340132Ba557b 0x5884aD2f920c162CFBbACc88C9C51AA75eC09E02 638501157098660213 412300000 \ --rpc-url https://rpc.testnet.chain.robinhood.com [55, 54, 53, 52, 51, 50, 49, 48, 47] -18321704 [-1.832e7]
The ledger answers with the next nine: beat 1 already sold lots 63–56 and part of 55. Beat 1's own picks and −24531251 are in its HarvestReport event.
| Tests | 81 + 6 — 81 Foundry (100 % line · 100 % function · 98.3 % statement · 89.2 % branch on src/, 3 fuzz properties) + 6 Stylus native |
|---|---|
| Static analysis | 0 · 0 — Slither: 0 high, 0 medium — docs/SLITHER.md triages all 10 remaining (Low / Info / Optimization) |
| Deployed | 6 system contracts (1 Stylus + 5 Solidity) + 3 labeled MOCKs + 2 bench ledgers on Robinhood Chain testnet — deployments/ |
| Real-run cost | whole demo incl. deploy < 0.002 ETH |
| Pinned scenario | 64 lots × 10 sh, $380→$455, mark $412.30 → exactly −$3,140.000000 on both engines |
src/; 3 fuzz properties; 6 Stylus native. contracts/test ↗AgentBond (live-envelope-only challenges, no bond exit while the agent key is active; 8 regression tests), redeployed and proven on chain: two EnvelopeNotLive reverts. ARCHITECTURE.md ↗lotIds and realizedLoss at every size. bench/RESULTS.md ↗ArbWasm.stylusVersion() = 3 answered "is WASM live on this Orbit chain?" in one RPC call. DX-REPORT.md ↗WashSaleViolation(owner, AMZN, AMZN, 1792060681). beat 2 ↗AgentBond was redeployed on 2026-09-27 with an audit hardening (live-envelope-only challenges, no bond exit while the agent key is active; 8 regression tests) and beat 3 was re-run against it. The pre-fix V1 (0x822f…0736) is retired and holds only the first run's slash — details and the rest of the known limits in docs/ARCHITECTURE.md.rule-v1 (deterministic HIFO + first allowed substitute). No LLM in the loop; the rationale hash commits to a plain-text rationale string. We say "agent", not "AI".