Overview
A receipt for money that crossed chains
Quittance answers one question: what actually happened to a NEAR Intents swap. Paste a transaction hash, a deposit address or a wallet. It reads public records only, proves the deposit and the payout on the chains they happened on, and returns one of eight labels with the facts it observed, the limits of what it can see, and the next step.
A quittance is an old legal word for a written receipt proving an obligation has been discharged.
The problem
A status word is not an answer
FAILED, PROCESSING and SUCCESS are the operator's record. A $193K swap reported on the NEAR forum as lost had been delivered.
The handle people quote resolves nothing
The correlation id in every support thread is a per-request trace. Three calls for one swap return three different ids.
Since 27 October the middle is private
1Click swaps now settle on the NEAR Private Shard. Only the deposit and the payout remain public, so those are what must be proven.
What it does
Every swap is three steps. Quittance reads the two public ones on their own chains and names the third for what it is.
575,830 TRX
Proven on TRON
Named, not proven
NEAR Intents, or the Private Shard after 27 October.
190,995.29 USDT
Proven on Ethereum
It also reconciles the amount. On that swap the quote promised 191,757.901149 USDT with a guaranteed minimum of 189,840.322137, and 190,995.293894 arrived: 0.40% under the quote, inside its guarantee.
Measured, not claimed
81.8%
of external payouts are on a chain Quittance reads
up from 27.0% for an ERC20-only reader. 1,000 swaps, 28 Oct
99 / 100
sampled payouts proven on their own chain
one inconclusive, none contradicted. 28 Oct
44
swaps took a deposit and returned nothing
median age 255 days, $334K quoted. 26 Oct
17
frozen cases re-classified on every test run
each with provenance: what was read on chain, and what was only reported
Each figure is reproducible from the repository. quittance coverage --save and quittance study --save write dated snapshots to studies/, keeping counts only: no addresses, no amounts per person.
How the coverage was measured
- SampleThe 1,000 most recent SUCCESS swaps the Explorer returned, 11:15 to 12:45 UTC on 28 October.
- DenominatorThe 978 whose payout left NEAR for another chain. Payouts that stay inside NEAR Intents are excluded.
- ReadableThe destination asset's chain, from the public 1Click token list, is one Quittance reads. NEAR account payouts are not yet counted.
- Proven100 readable payouts, spread evenly across the window by position, not chosen. Proven means read on its own chain, receipt successful, the quoted asset to the quoted recipient.
- Not provenInconclusive, contradicted and unread are each counted apart, and never as proven.
- LimitsOne window at one moment, and quoted USD rather than realised value. A sample shows the readers work on real traffic; it does not prove every payout.
What it will not do
- Never holds keys or funds. Every read is read-only.
- Never asks you to connect a wallet or sign anything.
- Never claims a loss the evidence does not prove.
- Never paints the private middle of a swap as proven.
- Never files tickets for strangers. It produces the attachment.
- Never claims recovered money. No such figure appears anywhere.
Use cases
Ten situations Quittance is for
Most are real cases, open in public when they were recorded. Each names what you paste and what you get back.
- 01
A swapper
My swap says it failed, but the money left my wallet
575,830 TRX, about $193K, was reported on the NEAR forum as failed with a zero refund. The thread is still unanswered.
Paste The NEAR transaction, the TRON deposit address, or the Ethereum payout hash.
DELIVEREDBoth ends proven on their own chains: 575,830 TRX reached the deposit address on TRON, and 190,995.293894 USDT reached the recipient on Ethereum, 12 days before the complaint was filed.
Source: Forum thread 42664
- 02
A swapper
The Explorer says Success, and my balance is zero
Two deposits on Robinhood Chain showed a green Success, "Transfer to Confidential Intents", while the recipient's public balance read zero. Neither the status endpoint nor the Explorer can find them.
Paste The NEAR transaction from the wallet.
SHIELDED UNPROVENQuittance decodes the signed intent inside the transaction: 0.038 ETH moved to the documented Confidential Intents treasury. The shield is proven. It says plainly that public records can prove neither delivery nor loss from there.
Source: near/intents#384
- 03
Anyone swapping after 27 October
My swap went through a private shard. Did it actually complete?
From 27 October 2026, NEAR's changelog says 1Click swaps roll out as confidential only. The exchange settles on the NEAR Private Shard, so the status word describes a step nobody can see.
Paste Any transaction from the swap, or the deposit address.
DELIVEREDThe two public ends, read on their own chains: for example 150 USDC in on Base and 149.829629 USDT out on Solana, with the quote reconciled against what arrived. The private middle is named, never painted as proven.
Source: NEAR Intents changelog
- 04
A swapper or a partner
I sent on the wrong chain
0.17 ETH was sent on Base to an address issued for an Ethereum quote. The route is documented as a manual refund, and a support ticket was already open.
Paste The deposit address.
WRONG DOORNames the mismatch, says the funds are a manual refund, and tells you not to retry the swap. The receipt is the attachment the ticket needs.
Source: near/intents#382
- 05
A Bitcoin depositor
My Bitcoin refund is stuck behind a timer
The recovery guide says 14 days. Read directly from btc-connector.bridge.near, the timer for a deposit with no refund address is 3,153,600,000 seconds, about 100 years, and requesting the refund costs 2 NEAR.
Paste The deposit address.
LOCKED OUTQuotes the contract's own values, notes that the long timer only binds deposits without a refund address, and warns against paying the fee expecting a quick return.
Source: near/intents#385
- 06
A swapper
The swap took my deposit and nothing came back
On 26 October, 44 swaps had taken a deposit, produced no destination transaction and charged no refund, at a median age of 255 days, holding about $334,000 of quoted notional.
Paste The deposit address or any transaction.
STRANDEDOnly when the deposit really landed and the swap is terminal with nothing returned. It asks for a manual refund and packages the evidence for the request.
- 07
A swapper
I only know my wallet address
Most people never see a deposit address or a NEAR hash. They know the wallet that sent or received the money.
Paste Your wallet address, on any chain.
WALLET LOOKUPLists every swap the wallet sent, received or was refunded in, with its chains, amounts and status. One tap opens the receipt for that swap. The wallet that supposedly lost $193K finds its swap this way.
- 08
A business or a payer
I need to prove I paid someone
An invoice, a payroll run, an OTC settlement. The other side says it never arrived, and a screenshot of a status page proves nothing.
Paste The payment's transaction.
DELIVEREDA link anyone can open, showing the payout read on the recipient's own chain, with the block, time and amount. The sha256 fingerprint lets both sides confirm they are looking at the same evidence.
- 09
A support desk
I triage tickets for a wallet or an app
Support threads quote correlation ids, which identify one HTTP request rather than the swap, so nobody can resolve them.
Paste Whatever the user sent: a hash, an address or a wallet.
ANY LABELOne click copies the receipt as markdown for the ticket: the plain sentence, what was observed, what it cannot see, the next step, the rule and the fingerprint. Two tickets about one swap share a fingerprint.
- 10
An integrator
I build on 1Click and want receipts in my own system
A wallet or exchange wants every questionable swap classified and filed where its own team works, not on a third-party page.
Paste Nothing by hand. Call the API, or post receipts to your webhook.
JSON + HMACPOST /api/check returns the full receipt as JSON. The CLI posts receipts to an endpoint you control, signed with HMAC SHA256, and a reference receiver is included.
How to use
Check a swap in under a minute
Check a swap
- 1
Paste
Open the checker and paste a hash, a deposit address or a wallet.
- 2
Read
Quittance resolves the swap and reads each end on its own chain. Usually 10 to 30 seconds.
- 3
Keep
You get a plain sentence, a label, the evidence and its limits, and a link that reproduces it.
What you can paste
| Input | Looks like | What happens |
|---|---|---|
| NEAR transaction | 8a33Dk…CgCb | Resolved through the Explorer. A confidential shield is decoded from the signed intent. |
| EVM transaction | 0x9be9…421a | The deposit or the payout, on any EVM chain the swap touched. |
| TRON transaction | d603ec…076a | Bare hex, the id TRONSCAN shows. |
| Solana signature | btNXAN…XPA | The 88-character signature your wallet shows. |
| Deposit address | TBy2io…2sus | The address the quote issued, on any chain. Read straight from the status endpoint. |
| Wallet address | 0x632F…8bad | Lists every swap that wallet sent, received or was refunded in. |
Reading a receipt
Label and sentence
One of eight labels, then one plain sentence built only from the evidence. It can never say more than the basis supports.
Money in, money out
Each end in mint when it was proven on its own chain, with the amount, block and time. Grey when it rests on the operator's record.
Observed and cannot see
Every fact that was checked, and every limit of what could be checked. No verdict is produced without limits.
Rule and fingerprint
The rule that fired, and a sha256 over the canonical evidence. Same evidence, same fingerprint. Any change, a new one.
Sharing a receipt
Copy link gives a URL that re-runs the check for whoever opens it, so they see the chains answer for themselves. Copy for a ticket gives markdown that pastes cleanly into a support ticket, a GitHub issue or a chat, with the fingerprint and explorer links. Download JSON saves the whole receipt, and every proven transfer carries a link to check it on the chain's own explorer.
quittance receipt receipt.json --expect <fingerprint> recomputes a saved receipt's fingerprint and compares it with one you obtained separately, such as the one on this page or in a ticket. Without --expect it only shows the file is self-consistent, because whoever edits a receipt can recompute its fingerprint too. Neither proves the claims are true: the explorer links are how those are checked.
Command line
No install. The core has zero runtime dependencies and Node 24 or newer runs the TypeScript directly.
git clone https://github.com/AustinChris1/quittance
cd quittance
# classify the seventeen frozen cases and check every label
node apps/cli/src/main.ts verify
# check any swap live, by any identifier
node apps/cli/src/main.ts check --search 8a33DkKfZMWRKbK2pXuQAWVLXSy4AyZF6PfcENvCJgCb
node apps/cli/src/main.ts check --deposit TBy2io3Q3Jt4UM4ejDhkkUQJZgZuXw2sus --json
# measure the rails yourself
node apps/cli/src/main.ts coverage --save
node apps/cli/src/main.ts study --saveSearching by transaction hash or wallet needs a partner JWT in QUITTANCE_PARTNER_JWT, from the NEAR Intents Partner Dashboard. Reading a deposit address needs nothing.
HTTP API
The hosted checker exposes the same pipeline. Credentials stay on the server.
curl -s https://quittance-five.vercel.app/api/check \
-H 'content-type: application/json' \
-d '{"query":"TBy2io3Q3Jt4UM4ejDhkkUQJZgZuXw2sus"}'{
"inputKind": "deposit address",
"receipt": {
"verdict": {
"label": "DELIVERED",
"summary": "Delivered on Ethereum about 16 days after the deposit. Both ends proven ...",
"rule": "delivered/destination-transaction-observed",
"basis": ["..."], "limits": ["..."], "next": "..."
},
"evidence": { "origin": { "verified": true, "chain": "TRON", ... },
"delivery": { "verified": true, "chain": "Ethereum", ... } },
"sources": [ { "name": "1click.status (unauthenticated)", "ok": true, ... } ],
"fingerprint": "ced90d..."
},
"swaps": null,
"text": "QUITTANCE RECEIPT ..."
}When the input is a wallet, swaps lists the swaps it appears in, each with its deposit address to check next.
The free checker allows 30 lookups per visitor every 10 minutes, because the Explorer allows one lookup every five seconds for the whole deployment. A person never meets the limit. Agents that need more use the paid door below.
Pay per receipt (x402)
/api/receipt returns the same JSON for one x402 payment of $0.01, with no account and no API key. Without payment it answers 402 and says what to pay: Circle USDC on NEAR mainnet first, and USDC on Base second, so any standard x402 agent can pay.
curl -i "https://quittance-five.vercel.app/api/receipt?q=TBy2io3Q3Jt4UM4ejDhkkUQJZgZuXw2sus"
# HTTP/1.1 402 Payment Required
# PAYMENT-REQUIRED: <base64> accepts near:mainnet 0.01 USDC, eip155:8453 0.01 USDCThe agent signs the payment and repeats the request with a PAYMENT-SIGNATURE header. On NEAR that is a NEP-366 signed delegate for exactly one USDC transfer, so the payer needs no NEAR for gas. The payment is verified before the lookup runs and settled only if the receipt is built: a failed lookup is never charged. The settlement comes back in PAYMENT-RESPONSE, and fees move straight from the payer to the payee.
The first paid receipt settled on NEAR mainnet on 2 November 2026, in transaction 7gNyhiJp…. The repository includes the agent script that made it, apps/web/scripts/pay.ts.
Watch a swap
A swap that is still moving, or shielded, can be watched from its receipt. Press Watch, allow notifications, and Quittance alerts you once when the evidence changes, such as IN FLIGHT is now DELIVERED, with a link back to the receipt. No account and no email: the browser's push subscription is the only identity.
The server rechecks
On a schedule, Quittance runs the same check the page runs. A phone cannot poll chains in the background, so the browser only displays the alert.
One alert per change
It keys on the evidence and the verdict, not on read times, so a recheck that finds nothing new stays silent.
It stops
A proven delivery or a refund ends the watch. Otherwise it ends after the 3 to 30 days you chose. Dropped subscriptions are pruned.
It installs
Quittance is an installable app. On iPhone and iPad, alerts reach Home Screen apps only, so the panel tells you to add it there first.
Webhook
The one write Quittance makes is posting a receipt to an endpoint you control, signed with HMAC SHA256 so the receiver can reject anything it did not send. A reference receiver ships in apps/sink.
# terminal 1: the receiver
QUITTANCE_WEBHOOK_SECRET=demo-secret node apps/sink/src/main.ts
# terminal 2: post a receipt to it
node apps/cli/src/main.ts replay 10-stranded-synthetic \
--webhook http://localhost:8787/receipts --secret demo-secretArchitecture
How it is built
A small core with no runtime dependencies, and three thin shells over it: the web app, the command line, and the webhook receiver. Every outbound read returns a citation, so the receipt can name everything it looked at.
The pipeline
01
Resolve
Turn any identifier into one swap, or a wallet into its swaps.
- Intents Explorer search
- 1Click status
- exact-match check
02
Read
Gather evidence, each end on its own chain.
- origin deposit
- NEAR transaction
- destination payout
- token list
03
Classify
Ordered rules, first match wins.
- 10 rules
- 8 labels
- basis, limits, next
04
Receipt
Canonical JSON, fingerprinted.
- web and API
- CLI text and JSON
- signed webhook
Resolve
The 1Click status endpoint is keyed by deposit address only. Anything else resolves through the Explorer search first, and only a record the term actually identifies is taken as the swap: its deposit address, one of its transactions, or one of its intents. A wallet matches many records, so picking one would be a guess, and Quittance lists them instead. An address is always tried as a deposit address first, because that read needs no token and has no rate limit.
Read
| Source | Read for | Needs |
|---|---|---|
| 1Click /v0/status | The operator's record: status, quote, hashes, refunds | nothing |
| 1Click /v0/tokens | Each asset's chain, contract and decimals, so nothing is guessed from an id | nothing |
| Intents Explorer | Resolving hashes and wallets to swaps | partner JWT, 1 request per 5 s |
| NearBlocks | NEAR transactions, credits, and transfers inside signed intents | nothing |
| EVM JSON-RPC | Receipts, Transfer logs and native value on nine chains | nothing, several endpoints each |
| TronGrid | TRC20 Transfer logs and TRX transfers | nothing, two endpoints |
| Solana JSON-RPC | Token and lamport balance changes inside the transaction | nothing, two endpoints |
| NEAR RPC | The Bitcoin connector's refund timers, read from the contract | nothing |
Public endpoints fail in two different ways, and Quittance keeps them apart. A chain that answers and does not show the transfer is a contradiction. A read that fails everywhere is unread. A native coin paid inside a contract call is inconclusive, because public endpoints cannot show internal transfers without a trace. Only the first can change a verdict.
Classify
Rules run in this order and the first match wins, so narrow cases are declared before broad ones.
- 01locked-out/refund-timelock-exceeds-docsNo refund address was set, and the connector's timer is more than ten times the documented one.LOCKED OUT
- 02wrong-door/asset-or-chain-mismatchThe deposit landed as a different asset or on a different chain than the quote, or the status reads INCOMPLETE_DEPOSIT.WRONG DOOR
- 03stranded/terminal-with-no-refundThe deposit landed, the swap is FAILED or REFUNDED, and no refund is recorded or observed.STRANDED
- 04refunded/returned-to-refund-addressREFUNDED with a refund amount or a refund transaction.REFUNDED OK
- 05shielded/success-not-provable-from-public-dataSUCCESS on a confidential route with no published destination transaction.SHIELDED UNPROVEN
- 06shielded/transfer-to-confidential-treasuryA signed intent moved funds to the Confidential Intents treasury, and no delivery was proven.SHIELDED UNPROVEN
- 07contradicted/destination-chain-disagreesSUCCESS, but the destination chain answered and does not show the money arriving.UNDETERMINED
- 08delivered/destination-transaction-observedSUCCESS with a published destination transaction. Proven when read on that chain.DELIVERED
- 09in-flight/not-yet-terminalPENDING_DEPOSIT, KNOWN_DEPOSIT_TX or PROCESSING.IN FLIGHT
- 10fallback/no-rule-appliedNothing matched. A gap in the rules, never a clean bill of health.UNDETERMINED
The receipt
A receipt is the verdict, the evidence it rests on, and every source read, serialised as canonical JSON with sorted keys and hashed with sha256. Two runs over the same evidence give the same fingerprint, and any change to the evidence gives a new one. The text form wraps to a fixed width, keeps hashes whole so they can be copied, and lists the rule that fired.
Chains
Where Quittance proves a deposit or a payout on the chain itself.
Payouts to shielded Zcash addresses are unprovable by anyone, and the receipt says so. Bitcoin, TON, XRP and the other chains in the coverage snapshot are not yet read independently; for those, delivery rests on the operator's record and the receipt says that.
Code layout
packages/core/src/classify.ts ordered rules, first match wins
packages/core/src/gather.ts resolves the swap and assembles evidence
packages/core/src/receipt.ts canonical JSON, sha256 fingerprint, text form
packages/core/src/sources/ 1Click, Explorer, NearBlocks, NEAR RPC,
EVM, TRON, Solana, token list
packages/core/src/coverage.ts how many real payouts can be proven
packages/core/src/watch.ts what a watcher compares between two checks
packages/core/src/study.ts the stuck tail, aggregates only
apps/web the site, the checker, these docs, the API
apps/cli check, replay, verify, rules, study, coverage, receipt
apps/sink reference webhook receiver
fixtures/ seventeen frozen cases with provenance
studies/ dated measurement snapshotsReference
The eight labels
A destination transaction is published, and read from the destination chain where that chain can be read.
Next Nothing. Keep the receipt.
The money went back to the refund address.
Next Confirm the amount, compare it with the quote.
The deposit arrived, the swap is terminal, nothing came back.
Next Request a manual refund with the receipt attached.
The deposit does not match its quote: wrong chain or wrong asset.
Next Manual refund. Do not retry the swap.
A refund exists on paper, but a connector timelock puts it out of reach.
Next Do not pay the refund fee expecting speed.
The money took a private route. Public records cannot prove delivery either way.
Next Not a loss. Ask for an internal trace if you expected a public payout.
Not terminal yet.
Next Check again later.
Not enough evidence, or the evidence disagrees with itself.
Next Supply another identifier, or ask for a trace.
Questions
Asked and answered
Can an agent use it without an account?+
Yes. /api/receipt sells the same receipt for one x402 payment of $0.01, in USDC on NEAR mainnet or on Base. Without payment it answers 402 with what to pay; the agent signs and retries. The payment is checked before the lookup runs and settled only if the receipt is built, so a failed lookup costs nothing. This site and its free checker stay free; the paid door exists because the Explorer allows one lookup every five seconds for everyone, so the free checker allows 30 lookups per visitor every 10 minutes.
Is Quittance the first place a swap can be looked up?+
No, and it does not claim to be. The Intents Explorer and the 1Click status endpoint already show the operator's record and its status word. Quittance is not a new data source. What it adds is reading the deposit and the payout on the chains they happened on, separating a shield from a delivery, and attaching the limits of what can be seen. I did not find another public tool that does that.
Why not just use the Explorer?+
Because the Explorer shows what the operator recorded, and the record is easy to misread. In #384 a green Success hid a shield to a private treasury. In the $193K case a refund field of zero, correct for a settled swap, was read as proof of loss. Quittance checks the record against the chains themselves, and since 27 October it is the way to see that both public ends of a confidential swap really happened.
Which chains' hashes and addresses can I paste?+
Any transaction hash from a chain the swap touched: NEAR, any EVM chain listed above, TRON or Solana. The deposit address the quote issued, on any chain. Or a wallet address that sent, received or was refunded. An Ethereum address is first tried as a deposit address, then as a wallet.
Can it prove a confidential swap arrived?+
It proves the two public ends: the deposit and, when the payout lands on a public chain, the payout. The exchange between them settles on the NEAR Private Shard, which NEAR documents as a permissioned chain with a private RPC, so no public record can prove that step, and the receipt says so.
What does proven mean, exactly?+
Quittance read the transaction from that chain's public RPC endpoints, several per chain, and checked that its receipt succeeded and that the quoted asset moved to the quoted address. That is independent evidence, read from the chain rather than from the operator. It is not a trustless cryptographic proof: nothing is checked against chain state with a light client. That is why every proof carries an explorer link, so you can check it yourself.
Do I need a key, a wallet connection or a signature?+
No. Nothing is signed and nothing moves. The status endpoint answers without a key. A partner token, held on the server and never sent to the browser, is used only to search the Explorer by transaction hash or wallet.
Which chains can it not read yet?+
In the coverage snapshot of 28 October, payouts to NEAR accounts, TON, XRP, Bitcoin, Litecoin and a handful of smaller chains were not yet read independently. For those the receipt says delivery rests on the operator's record. Payouts to shielded Zcash addresses cannot be proven by anyone, by design, and the receipt says that too.
Could it be wrong?+
Every verdict carries the facts it observed, the limits of what it can see, and the rule that fired, so a wrong one can be checked and argued with. Seventeen frozen cases, with provenance, are re-classified on every test run. A failed lookup is reported as unread, never as the chain disagreeing.
Check a swap now
Paste a hash, a deposit address or a wallet. Nothing is signed.