Proof of Reserves Methodology
Verifiable evidence that assets cover liabilities.

Service overview
Both sides of the balance sheet, and a way for every user to check.
Reserves alone prove little. A wallet balance says nothing about what is owed to customers. A proof of reserves therefore has two halves: an attestation of assets, tied to addresses the entity can prove it controls, and a commitment to liabilities, usually a Merkle tree over every customer balance whose root is published.
Each customer receives an inclusion proof: the handful of hashes needed to recompute the root from their own leaf. If their balance, or anyone else’s, were changed after publication, the root would no longer match. Coverage is then the ratio of verified reserves to committed liabilities, per asset.
Quantix designs the methodology and reviews implementations: the encoding, the tree, the ownership proofs, the reconciliation and the user-facing verification tool.
- Commitment
- SHA-256 Merkle tree with domain-separated leaves
- User check
- Inclusion proof verified in the browser
- Result
- Coverage per asset, with stated limits
Applies to
- Centralised exchanges
- Custodians and wallet providers
- Stablecoin and tokenised-asset issuers
- Lending desks
BTC
11 of 16 accounts hold BTC
- Liabilities
- 30.077
- On-chain
- 31.9
- Attested
- 0
- Reserves
- 31.9
106.1%
106.1% on-chain only
ETH
13 of 16 accounts hold ETH
- Liabilities
- 785.9636
- On-chain
- 742
- Attested
- 70
- Reserves
- 812
103.3%
94.4% on-chain only
USDC
16 of 16 accounts hold USDC
- Liabilities
- 8,341,886.67
- On-chain
- 6,200,000
- Attested
- 1,850,000
- Reserves
- 8,050,000
96.5%
74.3% on-chain only
Threats addressed
How a reserve report can mislead.
- Liability omission
Accounts left out of the tree
Large or dormant accounts excluded so that liabilities look smaller than they are.
- Negative balances
Entries that offset others
Negative or fabricated accounts included to reduce the total without removing anyone.
- Window dressing
Borrowed for the snapshot
Assets borrowed shortly before the snapshot and returned afterwards.
- Ownership
Addresses the entity does not control
Third-party or exchange-adjacent wallets presented as reserves without a signature from their keys.
- Double counting
One wallet, two reports
The same reserves claimed by two entities, or counted twice through a custodian and directly.
- Encumbrance
Assets that are already owed
Reserves pledged as collateral or lent out, still visible on-chain but not available to customers.
- Cryptography
Weak tree construction
Unprefixed leaves, duplicated last nodes or guessable leaves that leak balances or allow forged proofs.
- Custodian risk
Unverifiable custodian balances
Holdings at a custodian reported without an independent statement or reconciliation.
- Verification tooling
A verifier that cannot fail
User-facing tools that fetch the root from the same server as the proof, or never check it at all.
Technical capabilities
Six parts of a proof of reserves, reviewed together.
Asset attestation
Reserves enumerated per asset and chain, with balances read at the snapshot from independent nodes.
- Snapshot height per chain
- Before and after checks
Liability verification
The customer ledger reconciled with the tree: every account included once, no negative entries.
- Leaf count and totals
- Duplicate and negative checks
Merkle verification
Encoding, prefixes, ordering and proof format reviewed, and the root recomputed independently.
- Domain-separated hashing
- Per-user nonces
Reserve coverage
Coverage computed per asset, separating balances verified on-chain from balances attested off-chain.
- Per-asset ratios
- No cross-asset netting
Custodian verification
Custodian statements reconciled with the entity’s records and, where possible, with on-chain balances.
- Statement at the snapshot
- Scope of the attestation
On-chain balance analysis
Flows around the snapshot reviewed for borrowed or circular funds, and for assets that are encumbered.
- Inflows before the snapshot
- Outflows after it
Assessment methodology
From snapshot to a proof every user can check.
- 01
Define scope and snapshot
Assets, chains, account types and the exact snapshot time and block height per chain.
- 02
Prove address control
Signed messages over a fresh challenge from every reserve address, or a custodian statement.
- 03
Reconcile on-chain balances
Balances read from independent nodes at the snapshot heights and compared with the entity’s records.
- 04
Build the liability tree
One leaf per account with hashed ID, nonce and balances; negative and duplicate entries rejected.
- 05
Compute coverage
Reserves divided by liabilities per asset, with on-chain and attested holdings shown separately.
- 06
Publish and enable verification
Root, method and coverage published; each user receives a proof and an independent way to check it.
How the liability tree is built.
Each customer account becomes one leaf: a hashed account ID, a per-account nonce and the balance of every asset, encoded as a fixed string. The nonce stops anyone from guessing a balance by hashing candidate values. Leaves and interior nodes use different one-byte prefixes, as in RFC 6962, so an interior node can never be presented as a leaf.
- BTC
- satoshi, 10−8 BTC · 11 accounts
- ETH
- gwei, 10−9 ETH · 13 accounts
- USDC
- micro-USDC, 10−6 USDC · 16 accounts
encoding = "qx-por-v1|" idHash "|" nonce "|BTC=" sats "|ETH=" gwei "|USDC=" microleaf = SHA-256( 0x00 || UTF-8(encoding) )node = SHA-256( 0x01 || left || right ) # index-orderedroot = node at the top of the tree # unpaired node at the end of a level: carried up unchanged# amounts: base-10 integers in the smallest unit, never negative| Index-ordered (used here) | Sorted pairs | |
|---|---|---|
| Parent hash | left ‖ right by position | smaller ‖ larger by byte value |
| Proof contains | sibling hash and side, per level | sibling hashes only |
| Binds leaf position | Yes: two users cannot be handed the same leaf without noticing | No: needs a separate check for duplicate leaves |
| Typical use | Published liability trees, transparency logs | On-chain allowlists and claims |
Verify an inclusion proof yourself.
The tree below commits to the 16 accounts of a modelled custodial exchange. Pick an account: your browser rebuilds its leaf from the balances, hashes it with Web Crypto, folds in one sibling hash per level and compares the result with the published root. Change any balance, even by one satoshi, and the proof fails.
Published root · 30 September 2026, 00:00 UTC
55a34133c5e21532dcce82d3d0f5919edc402cf665ad636e52ea369c9a830684
16 leaves · depth 4 · SHA-256
1. Pick an account
- Hashed account ID
- 8d325064dcf582e6a0e338e82df6c9e9250abb4be90d9e2811b02ca06d760fb3
- Nonce
- 783d46aec8826c7b812abefab77c1e95
2. Check, or change, the balances
3. Follow the proof to the root
path recomputed in your browsersibling hash from the proofdiffers from the published tree
Leaf encoding
qx-por-v1|8d325064dcf582e6a0e338e82df6c9e9250abb4be90d9e2811b02ca06d760fb3|783d46aec8826c7b812abefab77c1e95|BTC=286114767|ETH=89066543329|USDC=16321830000
- 00Leaf hashSHA-256( 0x00 ‖ UTF-8(encoding) )—
- 01Level 1SHA-256( 0x01 ‖ previous ‖ sibling ), sibling 21d9782a…1a2070—
- 02Level 2SHA-256( 0x01 ‖ previous ‖ sibling ), sibling 7b76789b…6470ed—
- 03Level 3SHA-256( 0x01 ‖ sibling ‖ previous ), sibling c2783c56…765072—
- 04Level 4SHA-256( 0x01 ‖ previous ‖ sibling ), sibling cd2b259f…ebf9d0—
Tools & techniques
Standard cryptography, independent data.
| Tool or technique | Category | What it is used for |
|---|---|---|
| SHA-256 (FIPS 180-4) | Hashing | Leaf and node hashes of the liability tree. |
| RFC 6962 domain separation | Tree construction | Distinct leaf and node prefixes, borrowed from Certificate Transparency, to rule out second-preimage forgeries. |
| Web Crypto SubtleCrypto.digest | User verification | Recomputes the user’s leaf and path in the browser, with no data sent anywhere. |
| BIP-322 signed messages | Address control | Proves control of Bitcoin reserve addresses, including SegWit and Taproot. |
| EIP-191 and EIP-1271 signatures | Address control | Proves control of EVM addresses and smart-contract wallets such as multisigs. |
| Independent full nodes | Balance data | Balances read at the snapshot height from nodes not operated by the entity. |
| Merkle sum trees | Alternative design | Each node also commits to the sum below it, so totals and non-negativity can be checked from the proof. |
| Zero-knowledge proofs of liabilities | Alternative design | Proves totals and non-negativity without revealing individual balances; reviewed when proposed. |
Ecosystem coverage
Technical depth per execution environment.
Ethereum
Layer 1, proof of stake EVM
- Programming languages
- SolidityVyperYul
- Supported standards
- ERC-20
- ERC-721
- ERC-1155
- ERC-4626
- EIP-2612
- EIP-712
- ERC-1967
- ERC-4337
- Typical vulnerabilities
- Reentrancy, including read-only reentrancy
- Oracle and spot-price manipulation
- Access control on privileged functions
- Proxy storage collisions and initializer misuse
- Signature replay across chains and contracts
- Front-running and MEV exposure
- Assessment methodologies
- Line-by-line manual review
- Invariant fuzzing (Foundry, Echidna)
- Symbolic execution and formal verification
- Economic attack modelling
- Monitoring capabilities
- Proxy admin and implementation changes
- Governance proposals and timelock queues
- Large transfers and treasury outflows
- Oracle deviation against reference feeds
Ecosystems indicate technical specialisation only, not partnerships or endorsements.
Deliverables
A method others can repeat, and a result they can recompute.
Methodology document
Scope, snapshot, encoding, tree construction, ownership proofs and limits.Tree and proof specification
Exact leaf encoding, hashing, ordering and proof format, with test vectors.Independent recomputation
Root and coverage recomputed by Quantix from the entity’s data.Ownership evidence review
Every signature and custodian statement checked against the snapshot challenge.Verification tool review
The user-facing verifier reviewed for correctness and for where it gets the root.Limitations statement
What the result does not prove, in language customers can understand.
Reserve holdings and the evidence behind each
| Holding | Amount | Evidence of control |
|---|---|---|
| R-01Cold wallet ASelf-custody | 24.5 BTC | BIP-322 signed message over the snapshot challenge |
| R-02Cold wallet BSelf-custody | 6 BTC | BIP-322 signed message over the snapshot challenge |
| R-03Hot walletSelf-custody | 1.4 BTC | BIP-322 signed message over the snapshot challenge |
| R-04Cold multisigSelf-custody | 640 ETH | EIP-1271 signature from the multisig over the snapshot challenge |
| R-05Hot walletSelf-custody | 102 ETH | EIP-191 signed message over the snapshot challenge |
| R-06Custodian accountThird-party custodian | 70 ETH | Custodian balance statement at the snapshot |
| R-07Cold multisigSelf-custody | 6,200,000 USDC | EIP-1271 signature from the multisig over the snapshot challenge |
| R-08Custodian accountThird-party custodian | 1,850,000 USDC | Custodian balance statement at the snapshot |
Worked example: holdings are labelled by role; no address belongs to a real entity.
What a proof of reserves does not prove
- It is a snapshot
- Coverage holds at one moment. Assets borrowed for the snapshot and returned afterwards look identical to owned assets unless the review looks before and after.
- Liabilities can be omitted
- A user can check that their own account is included, not that every account is. The more users verify, the stronger the assurance.
- Encumbrance is invisible on-chain
- A wallet’s balance does not show whether the assets are pledged, lent or owed to someone else.
- Attested balances rely on the custodian
- Holdings at a third-party custodian are only as reliable as the custodian’s statement and its own controls.
- It is not an audit of solvency
- Other liabilities, operating costs and off-platform obligations are outside the tree. A proof of reserves is evidence, not a financial audit.
Key assessment areas
- Asset attestation and address ownership
- Liability tree construction
- Merkle inclusion proofs
- Reserve coverage computation
- Custodian verification
- On-chain balance analysis
Typical deliverables
- Verification methodology document
- Liability tree and proof specification
- Independent recomputation of reserve coverage
- User-facing verification tool review
Relevant research
Read the work behind the service.
FAQ
Questions teams ask before an engagement
Publish a proof your customers can check.
Tell us which assets and chains are in scope, how customer balances are held and who your custodians are. We will propose a methodology and say plainly what it will and will not prove.
