Phantom Drop — haunted claim links for stealth TARI
Code (MIT): Hyc Orange / phantom-drop · GitLab
Tari payment address: 12AkA1PP1qJUYK48GnfnmjsRcMqkou8XTVjSxF3vjBtf8BbLmLQsAkKzYyCMMPEq4Hp4dQuEMHDTGGvwHMLE2L6QeWB
Announcement: @hycorange.bsky.social on Bluesky
What it is
Phantom Drop turns TARI into a secret link. Whoever holds the link can open it and receive the funds as a stealth UTXO — even with no wallet and zero balance. If nobody opens it before an expiry epoch, the link dies and only the sender can take the money back. Optional riddle locks make the link useless without the answer, so you can post a link publicly: first to solve it wins.
How it uses Ootle’s privacy primitives (no custom template)
- The envelope is a stealth output: Pedersen commitment + Bulletproof, encrypted value/memo, sent to a “ghost” stealth address derived from the link.
- It is locked by a 2-leaf MAST spend-condition tree, and only the 32-byte root is on chain:
- claim leaf: one-time claim key signature ∧
BeforeEpoch(E) - refund leaf: sender’s one-time refund key ∧
AfterEpoch(E)— stays hidden unless the sender actually reclaims.
- claim leaf: one-time claim key signature ∧
- Riddle mode derives the claim key from Argon2id(answer).
- The claim pays its fee out of the envelope itself, signed only by a one-time key, so the recipient needs no funds and isn’t linked to the claim.
- Up to 64 envelopes per seal transaction; funding from stealth UTXOs keeps the sender private.
On chain, a sealed envelope is just a commitment, a nonce, ciphertext and a Merkle root: no amount, no owner, no keys, no expiry.
What’s included
phantomCLI for Esmeralda:init / address / status / balance / seal / peek / open / reclaim / list- Rust library on top of
ootle-rs - End-to-end tests against the real Ootle engine in-process (zero-balance claim, replay rejection, riddle AccessDenied, expiry/refund)
cargo run --example haunted_demo --features sim— narrated 5-act story- README with threat model and what still leaks (tx graph, timing/fees, which leaf gets used, riddle guessability)
- GitHub mirror + CI badge live on the repo page (link limit as a new forum user; full proof write-up is in the README)
Live testnet proof (Esmeralda, 2026-10-12)
- Seal 2 × 5 TARI: Veil — Tari Ootle Explorer
- Open #0 into a fresh zero-balance key (got 4.95): Veil — Tari Ootle Explorer
- Reclaim #1 after expiry: Veil — Tari Ootle Explorer
- Also verified on-testnet: L1 burn → Ootle ClaimBurn → stealth funding → double-open rejected. Full tx list + terminal capture in the repo README / docs/live-run-output.txt.
Feedback welcome. Happy Halloween ![]()