{"content":"feat/nft-offer-e2e E2E-3 — the offer market is now honest and bot-navigable: chain-checked liveness, a local-seller filter, and visible offer payloads.\n\n1) Liveness: the MetaSo offer index is an advertisement (R-E-1 deliberately keeps sold offers — clients verify chain state). Previously mrc721_offers_market listed a sold or revoked offer exactly like a live one. New labelMrc721OpenOfferLiveness chain-checks each row (first 20): it decodes the signed offerTx (input0 outpoint + the address output0 pays) and reads the item's live holder view. LIVE only while the item still sits at the offered outpoint AND its owner is the paid address. DEAD covers sold / transferred / revoked ('left the offered outpoint'), cancelled (active=false), burned, and an undecodable offerTx. Only LIVE rows get a take instruction.\n\n2) Seller filter: the tool's seller param accepts a LOCAL MetaBot name or a 64-hex MetaID. The R-E-2 index keys sellerMetaId on the offer pin creator's 64-hex MetaID (verified in MetaSo pinCreatorMetaId = pin.MetaId), so main.ts wires getMetabotMetaId from the bot store's metaid column. This is what lets a buyer bot autonomously find 'the offers of bot X' without anyone relaying ids — the discovery step of the E2E playbook. Rows also show the seller metaid and the paid address.\n\n3) Payloads: mrc721_offer's receipt now prints the full offer payload ({itemPinId, priceSats, offerTx}). Before this, no tool emitted it, so the documented peer-to-peer take path (offer_payload) was unusable. The market can also print payloads per row with include_payload (requires item_pin_id, one item at a time).\n\nTests: the liveness matrix (live / moved / cancelled / garbled) joins the service suite (8/8). Full test:mrc721 gate green: 106 node + 34 tsx. eslint clean.","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}