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.

Money inTron logo

575,830 TRX

Proven on TRON

The exchange

Named, not proven

NEAR Intents, or the Private Shard after 27 October.

Money outEthereum logo

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.

  1. 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.

    DELIVERED

    Both 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

  2. 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 UNPROVEN

    Quittance 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

  3. 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.

    DELIVERED

    The 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

  4. 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 DOOR

    Names 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

  5. 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 OUT

    Quotes 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

  6. 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.

    STRANDED

    Only 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.

  7. 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 LOOKUP

    Lists 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.

  8. 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.

    DELIVERED

    A 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.

  9. 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 LABEL

    One 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. 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 + HMAC

    POST /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. 1

    Paste

    Open the checker and paste a hash, a deposit address or a wallet.

  2. 2

    Read

    Quittance resolves the swap and reads each end on its own chain. Usually 10 to 30 seconds.

  3. 3

    Keep

    You get a plain sentence, a label, the evidence and its limits, and a link that reproduces it.

What you can paste

InputLooks likeWhat happens
NEAR transaction8a33Dk…CgCbResolved through the Explorer. A confidential shield is decoded from the signed intent.
EVM transaction0x9be9…421aThe deposit or the payout, on any EVM chain the swap touched.
TRON transactiond603ec…076aBare hex, the id TRONSCAN shows.
Solana signaturebtNXAN…XPAThe 88-character signature your wallet shows.
Deposit addressTBy2io…2susThe address the quote issued, on any chain. Read straight from the status endpoint.
Wallet address0x632F…8badLists 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 --save

Searching 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.

/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 USDC

The 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-secret

Architecture

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

SourceRead forNeeds
1Click /v0/statusThe operator's record: status, quote, hashes, refundsnothing
1Click /v0/tokensEach asset's chain, contract and decimals, so nothing is guessed from an idnothing
Intents ExplorerResolving hashes and wallets to swapspartner JWT, 1 request per 5 s
NearBlocksNEAR transactions, credits, and transfers inside signed intentsnothing
EVM JSON-RPCReceipts, Transfer logs and native value on nine chainsnothing, several endpoints each
TronGridTRC20 Transfer logs and TRX transfersnothing, two endpoints
Solana JSON-RPCToken and lamport balance changes inside the transactionnothing, two endpoints
NEAR RPCThe Bitcoin connector's refund timers, read from the contractnothing

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.

  1. 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
  2. 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
  3. 03stranded/terminal-with-no-refundThe deposit landed, the swap is FAILED or REFUNDED, and no refund is recorded or observed.STRANDED
  4. 04refunded/returned-to-refund-addressREFUNDED with a refund amount or a refund transaction.REFUNDED OK
  5. 05shielded/success-not-provable-from-public-dataSUCCESS on a confidential route with no published destination transaction.SHIELDED UNPROVEN
  6. 06shielded/transfer-to-confidential-treasuryA signed intent moved funds to the Confidential Intents treasury, and no delivery was proven.SHIELDED UNPROVEN
  7. 07contradicted/destination-chain-disagreesSUCCESS, but the destination chain answered and does not show the money arriving.UNDETERMINED
  8. 08delivered/destination-transaction-observedSUCCESS with a published destination transaction. Proven when read on that chain.DELIVERED
  9. 09in-flight/not-yet-terminalPENDING_DEPOSIT, KNOWN_DEPOSIT_TX or PROCESSING.IN FLIGHT
  10. 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.

Ethereum logoEthereumERC20 and ETH
Base logoBaseERC20 and ETH
Arbitrum logoArbitrumERC20 and ETH
Optimism logoOptimismERC20 and ETH
Polygon logoPolygonERC20 and POL
BNB Chain logoBNB ChainBEP20 and BNB
Gnosis logoGnosisERC20 and xDAI
Avalanche logoAvalancheERC20 and AVAX
Robinhood Chain logoRobinhood ChainERC20 and ETH
Tron logoTRONTRC20 and TRX
Solana logoSolanaSPL and SOL
NEAR logoNEARsigned intents, credits

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 snapshots

Reference

The eight labels

DELIVERED

A destination transaction is published, and read from the destination chain where that chain can be read.

Next Nothing. Keep the receipt.

REFUNDED OK

The money went back to the refund address.

Next Confirm the amount, compare it with the quote.

STRANDED

The deposit arrived, the swap is terminal, nothing came back.

Next Request a manual refund with the receipt attached.

WRONG DOOR

The deposit does not match its quote: wrong chain or wrong asset.

Next Manual refund. Do not retry the swap.

LOCKED OUT

A refund exists on paper, but a connector timelock puts it out of reach.

Next Do not pay the refund fee expecting speed.

SHIELDED UNPROVEN

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.

IN FLIGHT

Not terminal yet.

Next Check again later.

UNDETERMINED

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.

Open the checker