Check a receipt

Check a receipt.

Paste a receipt, upload one, or try the example. Each step runs for real. You don't need an account, and you don't have to take our word for it.

Paste a receipt

A signed record checks here too. Nothing is marked passed unless that step actually passed.

What a check proves

That this receipt is the one that was written, and that it still matches. The four steps run on whatever you paste.

What it does not prove

It does not say the credit was a good idea, or that the customer was treated fairly. It says the record was not quietly changed.

  1. Leaf recomputed Not checked yet

    The receipt is hashed again and compared with the hash on the file.

  2. Chain link Not checked yet

    The previous hash has to match the receipt before this one.

  3. Merkle path Not checked yet

    The path of sibling hashes has to fold to the batch root.

  4. On-chain anchor Not checked yet

    The anchor memo has to equal that Merkle root.

Allowed Example

$500.00 USD

A support agent recommended a $500 customer credit, and a person approved it.

Request
Issue a $500 customer credit so this person stays
Decision
Approved by Example owner, on the phone
Action
Issued the $500 customer credit
Outcome
Customer stayed. Ticket not reopened. Estimated retained value $2,400.00.
Agent
support-agent · v1 · Example owner
Rule
A customer credit over $100 needs a person. Rule v3.
Amount
$500.00
Time
Hash
5034…2ea4
Anchor
9d94…605f

The latest anchor is read from the status check. Status

How it works under the hood
  1. Canonical JSON. Object keys are sorted, and empty values are dropped.
  2. SHA-256 leaf. The hash covers the receipt, not its id.
  3. Sorted-pair Merkle fold. Sibling hashes are ordered, then hashed, up to one root.
  4. Solana Memo anchor. That root is what the Memo program records.

The leaf and the Merkle fold are the two lines below.

sha256Hex(JSON.stringify(canonicalize(receipt without receipt_id, batch_id)))

sorted-pair fold: hashPair(a,b)=sha256Hex(a<=b?a+b:b+a); odd nodes duplicated; empty tree -> null

The latest anchor is read from the status check. Status

How the Bond works on-chain