Proof of agefor private money.
Every shielded Ironwood spend names an earlier state of the note tree, and consensus checks it. Vintage turns that into a claim anyone can verify from one txid: these coins were already here before a hack, a tax cutoff, a bug window, or any block you name. Their amount, sender and history stay shielded.
Covers coins received before the event you pick. Fresh coins have their own path, further down.
A real mainnet transaction, da9017e0…7095e3a7: the deposit into a NEAR Intents swap. Its coins were already in the tree 13 blocks before the event block (a staged demo event, not a real hack). That is the whole proof.
Open on explorerPaste a txid. Pick the event.
The verifier reads the anchor from the transaction and walks the tree back to the event. It needs nothing but the txid.
Your txid goes to our verifier and to a public lightwalletd server. We keep no logs of either. To involve nobody, run vintage verify on your own machine.
> Paste a Zcash txid, pick the event, get a verdict from public chain data in seconds. The verifier lives in the app.
Checks run since launch
We count checks per day, by verdict and event. Nothing else: no txids, no IPs, no times of day. See the raw numbers
Proving you're clean shouldn't mean unshielding.
After the Bitget hacker moved 2,746 ZEC into Ironwood on 30 September, every large shielded deposit became suspect. Exit rails hold them, and the only proof on offer is giving up your privacy.
The chain already dates every shielded spend.
A fingerprint per block
Every block ends with a root: one fingerprint of every shielded coin that exists at that moment.
Every spend names one
A spend must point at one of those roots and prove its coins are inside it. Consensus rejects it otherwise.
Older root, older coins
If the named root is older than the event, the coins were already there. Nothing else about them is revealed.
No blocklist. No new cryptography. A rule Zcash already enforces on every spend.
One proof, any dated event.
One deposit proves it predates every event after its anchor, all at once. The registry labels block heights and nothing else: no addresses, no people, and anyone can check against any height they choose.
Exploit inflows
Prove a deposit can't contain funds that entered the pool after a hack, like the Bitget inflow on 30 September.
31 December 2026
A German finance ministry draft, not yet law, would end the one-year tax exemption for coins bought from 2027 and keep it for earlier ones. If it passes, prove the date without handing a platform your keys.
Pre-bug coins
If a counterfeiting bug is ever found, coins older than its window provably weren't minted through it.
Held a year
Prove the exact coins you sell are over a year old. Ironwood launched in July 2026, so full-year proofs start in July 2027.
Your own date
Before a contract, a job, a dispute. Any block height you name, checked the same way.
Airdrops and votes
Works, but ZAIR and coinholder voting already prove "unspent at the snapshot", which is what a snapshot needs. Use them.
Ask your payer to send with Vintage
Coins you received after an event can't be dated by age. But if the person paying you uses an older anchor, the payment itself is provably clean, and you know it the moment it lands.
$ vintage request --to <your address> \
--amount 0.5 --before bitget-2026-09
A single-use receipt account
Receive the Vintage payment into a fresh account with its own seed, deposit from it, and let the exit rail check the link with that account's viewing key. It is optional, and the only Vintage feature that discloses anything. What it discloses:
The receipt account's viewing key, therefore the funding payments, the amounts received, the receipt address, and the deposit. Nothing from the user's other accounts. The viewing key cannot spend. Rotate to a fresh receipt account for every use.
The rail can run the check itself with vintage link verify, so the key goes to nobody else. A zero-knowledge version that discloses no key is on the roadmap.
Stay shielded all the way to the exit.
Guides today tell you to unshield before depositing, because shielded deposits get frozen. Vintage lets the deposit stay shielded and still clear.
Age proofs need no key of any kind, not even a viewing key.
Amounts, senders and history stay encrypted on chain.
No logs, no analytics, no cookies, no third-party requests. Fonts are served from this site.
The verifier is open source. Your machine, a public lightwalletd, nobody else.
Don't trust this page. Check the chain.
| Txid | da9017e0…e3a7 |
| What it is | Vintage payment = NEAR Intents deposit |
| Mined at | 3,527,813 |
| Anchor root | 855ccc99…81d98502 |
| Anchor located | 3,525,693 to 3,525,696 |
| Event height | 3,525,709 (staged demo) |
| Roots checked | 1,303 · 0.06 s |
| Swap | 3.668896 USDC |
| Verdict | PASS |
| Deposit | df151ee2…9402 |
| What it is | Receipt account → NEAR Intents |
| Mined at | 3,527,827 |
| Inputs | 2 of 2 from da9017e0…, outputs 1 and 2 |
| Funding check | PASS before 3,525,709 |
| Disclosed | one retired receipt account's viewing key |
| Swap | 5.52164 USDC |
| Verdict | LINK PASS |
| Txid | 18f733e2…9a73 |
| Mined at | 4,524,646 |
| Anchor root | 69ee8500…05fce0b |
| Anchor located | 4,524,636 to 4,524,641 |
| Event height | 4,523,439 |
| Roots checked | 1,918 · 32.0 s |
| Verdict | NOT PROVABLE |
What it proves, and what it doesn't.
- Every Ironwood coin the deposit spends was already in the pool before the event block.
- It holds by consensus. Nobody can fake an older anchor.
- It covers every event after the anchor at once.
- Date coins received after the event. They need the payer-side path.
- Cover transparent, Sapling or Orchard inputs.
- Say who sent the coins or how much. It only rules out known events.
- Hide that you chose to prove it. An old anchor is visible on chain, so use it only when you deposit somewhere that already knows you.
- Make it mandatory. It's yours to offer, never a rail's to demand from everyone.
One request before you hold a deposit.
An exit rail calls the verifier with the deposit txid and the event. A pass means every coin in the deposit predates that event. It does not identify anyone and it is not a source-of-funds report.
Run the verifier yourself, or call ours. Either way the answer comes from public chain data, so you can check it independently.
GET /verify/da9017e0…7095e3a7?before=vintage-demo-2026-10
{
"verdict": "PASS",
"network": "main",
"provisional": false,
"mined_height": 3527813,
"before": { "height": 3525709, "event_type": "custom" },
"anchor": "855ccc99…81d98502",
"evidence": { "distinct_roots": 1303 }
}