Money movement and financial logic
Crypto exchange and wallet testing
Crypto exchange and wallet testing checks how custodial exchanges and wallets credit deposits across confirmations and chain reorganisations, approve and sign withdrawals, estimate network fees, validate addresses, send travel rule data, and account for staking rewards. FintechAssuranceLabs delivers per-chain deposit and withdrawal suites, reorganisation scenarios, a custody and signing workflow test report, and staking reward accrual checks.
What crypto exchange and wallet testing covers
Deposit detection and confirmations
For crypto exchanges and custodial wallets, a deposit becomes client money when the ledger credits it. A credit that a client withdraws before a reorganisation removes it is paid from the exchange's own holdings. Tests per chain and token:
- Detection. Native transfers, token transfers from contract event logs, value sent by a contract call, and one Bitcoin transaction paying several deposit addresses each credit once, to the right client.
- Credit state by depth. A deposit stays pending until the configured threshold. On Ethereum, tests compare crediting at the
latest,safe, andfinalizedblock tags of the JSON-RPC API. - Memo or tag deposits. A deposit with a missing tag on a shared address goes to suspense and credits no client.
Reorganisation handling
On Bitcoin regtest, invalidateblock removes the block holding a credited deposit. Tests check that a dropped transaction reverses through an entry linked to the original, that a transaction mined again in another block keeps one credit (the deduplication key is transaction ID and output index), and that a double spend after the client traded the credit shows as a negative balance in the break report. On Ethereum, when the chain has not finalized for more than four epochs, the inactivity leak starts (rewards and penalties), so tests also run while the finalized tag stops advancing. The crypto deposit reorg testing guide lists the node calls.
Withdrawal approval and signing
A broadcast withdrawal cannot be reversed, so tests stop defects before the signer:
- Approval quorum. The requester cannot approve their own request, an approval bound to a payload hash fails when the amount or destination changes, and a policy change needs the quorum.
- MPC threshold signing. With key share nodes offline below the threshold, the withdrawal stays retriable, and a retry after a signer timeout with the same idempotency key broadcasts one transaction.
- Multisig. For Bitcoin multisig built on BIP 174 partially signed transactions, an output altered between two signers is refused by the second signer's policy check.
- Nonces. Two Ethereum withdrawals with one nonce let one replace the other, and a nonce gap holds every later withdrawal from that wallet.
MiCA Article 75(8) makes a custodian liable to clients for the loss of crypto-assets or of the means of access from an incident attributable to it, capped at market value when the loss occurred (Regulation (EU) 2023/1114). The MiCA testing requirements page maps Article 75 to evidence.
Fee estimation and stuck transactions
The fee charged to the client and the network fee paid are separate ledger entries. Under EIP-1559, the base fee moves by at most one eighth per block, and a transaction with a max fee per gas below the base fee cannot be included. Tests raise the base fee between quote and broadcast and check one replacement with the same nonce and one payout booked with the fee paid. Bitcoin Core 28.0 (2 October 2024) set -mempoolfullrbf to 1 by default; tests bump a stuck withdrawal and check that the dropped original triggers no second payout.
Address validation and travel rule data
BIP 350 requires Bech32 for witness version 0 and Bech32m for versions 1 to 16. EIP-55 adds a mixed-case checksum that an all-lowercase address lacks. Tests submit a Taproot address with a Bech32 checksum, a testnet address, and a mistyped EIP-55 address.
Under Regulation (EU) 2023/1113, the originator's provider submits the Article 14(1) and 14(2) data in advance of, or simultaneously with, the transfer (14(4)), and neither allows initiation of nor executes a transfer until every Article 14 obligation is met (14(8)). For a transfer exceeding EUR 1,000 to or from a self-hosted address, the provider takes adequate measures to assess whether its client owns or controls the address (14(5), 16(2)). In Canada, an entity keeping records of virtual currency transfers includes both parties' name, address, and any account or reference number (Regulations s. 124.1(1)); see FINTRAC testing requirements. Tests block signing when a field is missing and capture IVMS 101 payloads.
Staking reward accounting
Ethereum validators with 0x01 credentials have balance above 32 ETH swept to the withdrawal address, while 0x02 validators compound rewards up to 2048 ETH (staking withdrawals), so a reward job counting only withdrawals credits nothing for 0x02 validators. Tests check that commission is deducted once, that allocation uses each epoch's balance snapshot, that balances stay locked through exit, and that each reward reaches the register of positions, where Article 75(4) records any event likely to modify a client's rights immediately. Reward exports carry UTC timestamp, amount, and commission for crypto tax software.
Related
Standards
Deliverables
Deposit and withdrawal test suite per supported chain
Automated tests for each chain and token that check deposit detection, crediting at the confirmation threshold, withdrawal limits, fee charging, address validation, and travel rule blocking, run in CI by the engineering lead.
Chain reorganisation and confirmation threshold scenarios
Scripted reorganisations on local test networks with the expected credit, reversal, or single re-credit for each deposit, used by the engineering lead to set and defend confirmation thresholds.
Custody and signing workflow test report
Results of approval quorum, MPC threshold signing, multisig, nonce, and retry tests with request IDs, approvers, and transaction IDs, in the form a competent authority or partner bank reviews.
Staking reward accrual checks
A per-epoch recomputation of validator rewards, commission, and client allocations compared with credited balances, listing each difference with its amount and source records for the finance team.
How crypto wallet tests fit your release process
- On every merge. Address validation, fee calculation, approval policy, and nonce tests run in CI against Bitcoin regtest and a local Ethereum development chain. A credit without the threshold, or a withdrawal signed without quorum, fails the build.
- Nightly on public testnets. The deposit and withdrawal suite runs per chain through your node providers. Ethereum's networks page names Sepolia the default testnet for application development and Hoodi the testnet for validating and staking, and marks Holesky deprecated as of September 2025. Bitcoin runs on signet and on testnet4 (BIP 94, genesis block mined 3 May 2024). Reorganisation scenarios stay on regtest, where blocks are invalidated on demand.
- Before a change that moves assets. A new chain or token, a signer or MPC provider change, a new approval policy, a new travel rule provider, or a confirmation threshold change triggers the full per-chain suite and a new custody and signing workflow test report. When a chain schedules a network upgrade, the suite reruns on a testnet where the upgrade is already active.
- After release. Your operations team sends a small deposit and withdrawal per changed chain from company wallets. We hand over the checklist and the queries that compare ledger entries with on-chain transaction IDs.
Test wallets, identities, and travel rule counterparties are synthetic. Test key shares never touch production signers, and no production account data enters test environments.
Suites live in your repository and run in your CI. Each release leaves an evidence set with the change ticket: per-chain results with transaction IDs and block heights, reorganisation outcomes, approval logs, travel rule payload captures, and the staking reward recomputation. The same set supports the technical documentation of ICT systems in a MiCA authorisation application (Article 62(2)(j)) and the transaction records FINTRAC examiners sample. Ledger breaks outside the chain layer go to ledger and reconciliation testing.
Your team owns confirmation thresholds, the approval policy, key ceremonies, production signing access, and decisions on transfers the travel rule holds.
Sample deliverable
Sample, synthetic data
| ID | Source pair and instrument or asset | Internal quantity or amount | External quantity or amount | Difference (internal minus external) | Break classification and cause |
|---|---|---|---|---|---|
| POS-01 | Internal position ledger vs custodian settled position file: Equity A shares | 1,200 shares | 1,000 shares | +200 shares | Timing break, expected: a 200-share buy executed on trade date settles on T+1 and is absent from the settled position file until the next file |
| POS-02 | Internal position ledger vs clearing position file: Equity B shares | 500 shares | 1,000 shares | -500 shares | Corporate action break, open: the clearing file applies a 2-for-1 split on the effective date and the internal ledger has no split entry |
| POS-03 | Portfolio ledger vs custodian holdings file: Fund A units | 1,250.457362 units | 1,250.457 units | +0.000362 units | Rounding break inside the 0.001-unit tolerance: the portfolio ledger stores units to 6 decimal places and the custodian file to 3 |
| POS-04 | Hot wallet ledger vs blockchain node balance: Testnet coin A on a public testnet | 2.500000 coin A | 2.000000 coin A | +0.500000 coin A | True break, defect: deposit DEP-7713 was credited after 1 confirmation against a configured threshold of 12, and a chain reorganisation removed the transaction from the canonical chain |
| POS-05 | Hot wallet ledger vs blockchain node balance: Testnet coin A on a public testnet | 50.000000 coin A | 49.999580 coin A | +0.000420 coin A | True break, defect: the network fee for withdrawal WD-2291 was paid from the hot wallet and has no ledger entry |
| POS-06 | Tracker holdings from imported exchange history vs self-custody wallet node balance: Testnet coin B | 1.0000 coin B | 0.9995 coin B | +0.0005 coin B | True break, defect: the import records the exchange withdrawal at the gross amount and drops the 0.0005 coin B withdrawal fee, so the lot quantity is overstated by 0.0005 coin B and later disposals consume units the wallet does not hold |
| POS-07 | EWA advance ledger vs employer payroll deduction file: employee EMP-0042, pay period PP-18 | 350.00 XTS | 300.00 XTS | +50.00 XTS | Timing break, expected: advance ADV-5520 was requested after the payroll cut-off and the employer file deducts it in pay period PP-19 |
| POS-08 | Revenue-share remittance ledger vs expected remittance recalculated from processor revenue feed: agreement RBF-0310, month M-06 | 1,200.00 XTS | 1,160.00 XTS | +40.00 XTS | Calculation break, defect: the remittance applies the 8% share to 15,000.00 XTS gross revenue, while the agreement defines the share on 14,500.00 XTS revenue net of refunds |
Amounts use XTS, the ISO 4217 code reserved for testing; Equity A, Equity B, Fund A, and testnet coins A and B are generic test instruments with no market value, and all employee, agreement, deposit, and withdrawal IDs are invented.
Questions
What is crypto custody?
What is crypto staking?
Scope your crypto exchange and wallet testing
Send your supported chains, custody model, approval policy, and travel rule provider, and we return a test scope with the scenarios and evidence each chain needs.
Scope your testing