Buying crypto takes about four minutes. If you show up unprepared, getting a large sum back into a bank account without a compliance hold can take months.
I spent 25 years in traditional banking before I started writing about protocols, wallets, and Web3. A good share of those years was spent close to onboarding files, payment exceptions, and the committees that decide whether a client relationship continues. So here’s what happens on the other side of the counter when a six-figure wire lands from a crypto exchange. Nobody in the back office is impressed by your returns. An analyst is looking at an alert and asking three questions: who sent this, why, and does it fit what we know about this customer?
If you can’t answer those questions on paper, the default answer is a hold. The bank hasn’t decided you’re a criminal. The analyst simply has to justify their decision to a supervisor, and possibly to an examiner years later. “The customer seemed credible” doesn’t count as a justification. A documented paper trail does.
Almost everything written about crypto covers buying. Very little covers the practical work of selling, and most people learn what a compliance team expects only after their money is stuck. This guide covers:
- the documents you should keep for years
- how to export exchange history before it disappears
- how to prove where your very first dollar came from
- how to prove you control a wallet without exposing your keys
- how to explain a Uniswap liquidity position to someone who has never heard of one
- a proof of funds letter template you can adapt for your own bank
A quick disclaimer from someone who has sat on the bank side of the desk: this is education, not legal or tax advice. Requirements differ by country, by bank, and sometimes by the analyst who picks up your file.
The Short Answer: How to Cash Out Crypto Without Your Bank Blocking Your Account
To cash out crypto without a frozen account, prove two things before the money arrives: where this specific money came from, and how you built the wealth behind it. Then sell through a regulated venue that pays into an account in your own name.
Here is the short checklist. The rest of this article explains each step, and the proof of funds letter template is further down.
- Export the full transaction history, in CSV and PDF form, from every exchange you have ever used. Do it before you close any account.
- Keep the bank statements that show your original fiat deposits to those exchanges. Also keep the payslips, savings history, or sale contracts that funded them.
- Prove control of every self-custody wallet involved, using a signed message or a small test transfer.
- Record the transaction hash (TXID) of every major on-chain movement between purchase and sale.
- Make sure every earlier disposal is on your tax returns, and plan how this sale will be reported.
- Write a one- or two-page summary that ties it all together, and send it to your bank before the wire, not after.
- Sell on a regulated venue, withdraw to an account in your own name, and never split the withdrawal to stay under reporting thresholds.
Why Banks Freeze Crypto Off-Ramp Transfers
Banks freeze crypto off-ramp transfers when they can’t verify where the money came from. A freeze is usually a pause until the file makes sense, not a verdict on you.
GE Crypto’s breakdown of what banks check on exchange payouts puts it the way I would. The bank doesn’t “dislike crypto.” It needs to understand who sent the funds, why the transfer happened, and whether it matches your profile. Those three questions drive everything below.
The missing link in the KYC chain
When an ordinary wire hits your account, it comes with a built-in assumption: the sending bank already ran know-your-customer (KYC) checks on its own client. That’s the backbone of correspondent banking. As a Cyprus-based guide to proving crypto trading profits puts it, a bank receiving a normal transfer can see the money came from another regulated institution that already did its own checks. With crypto, that automatic check doesn’t exist.
I think of it as a chain of custody. A wire from your employer’s bank has every link certified. A payout from a regulated exchange has the last link certified, because the exchange knows who you are. But everything that happened before your coins reached the exchange is, from the bank’s point of view, an uncertified gap. Your paper trail exists to certify that gap.
There’s a second, less comfortable reason for the scrutiny. Every anti-money laundering course teaches three stages: placement, layering, and integration. An off-ramp sits exactly where integration happens in a laundering scheme: the moment value re-enters the regulated banking system. BlindPay’s guide to source of funds for off-ramps describes the off-ramp as the point where a blockchain balance becomes a bank deposit and someone has to vouch for it. That isn’t personal. It’s how the system is built.
Your coins carry their history with them
In traditional banking, a dollar bill doesn’t inherit the history of the people who held it before you. On a public blockchain, your coins do. Hoptrail’s crypto onboarding checklist explains that every Bitcoin transaction is public, but the names behind addresses are not. Analysts need outside data to work out who controls what.
That outside data is exactly what blockchain analytics firms sell to banks and exchanges. BlindPay notes that these tools can show whether a deposit passed through a mixer, a sanctioned address, or a hacked exchange before it reached you. That’s why an off-ramp may ask about money you received from a perfectly legitimate counterparty: their wallet history travels with the payment.
What actually triggers a review
Most crypto-related reviews come down to size, novelty, and mismatch: a large, first-time inflow from a crypto source that doesn’t fit your known profile.
When you opened your bank account, the bank recorded an expected activity profile: salary in, mortgage out, a few hundred card payments. Transaction monitoring systems compare every inflow against that profile. A USD 180,000 credit from a crypto exchange into an account that normally sees USD 6,000 a month will trip that system no matter how clean the money is.
Typical triggers include:
- Size. The Cyprus guide lists deposits above EUR 10,000 as a common trigger, while noting that thresholds vary.
- Novelty. Your first inflow from an exchange gets more attention than your tenth.
- Profile mismatch. GE Crypto points out that unknown senders, foreign entities that don’t match your usual activity, and empty or vague payment references all add friction.
- Counterparty risk. Sumsub’s crypto AML red-flag guide lists cross-border flows with exchanges that lack proper licensing, regions with weak AML enforcement, and business accounts used in ways that don’t match their declared activity.
- On-chain exposure. Elliptic’s primer on crypto AML compliance notes that mixers, tumblers, and privacy coins are designed to obscure transaction details, and that FATF has flagged these anonymity-enhancing tools as a risk.
The exchange itself may ask before your bank does. BlindPay lists high volumes, unusual transactions, high-risk countries, and limit increases as typical moments when an off-ramp requests source of funds.
US rules attach hard numbers to the analyst’s decision. Money services businesses, a category that covers most US crypto exchanges, must file suspicious activity reports (SARs) on suspicious transactions of USD 2,000 or more. For banks, the threshold is generally USD 5,000. Your six-figure wire is far above both. A good file makes “no report needed, close the alert” an easy decision to defend.
Here’s the part most people miss. UNGVRN’s guide to building a crypto source-of-wealth file argues that most blocked cash-outs aren’t rejected because the wealth is illegitimate. They get stuck because the story arrives in a form the institution can’t defend internally. In my experience, that’s exactly right. The problem is rarely the money. It’s how the story is packaged.
Source of Funds vs. Source of Wealth: The Two Questions Every Bank Asks
Source of funds explains where this particular money came from. Source of wealth explains how you came to have money of this size at all.
FATF, the global standard-setter for anti-money laundering rules, draws this line explicitly in its guidance on politically exposed persons. alt.co’s explainer on what a bank needs to accept large crypto funds calls this distinction, with evidence for both sides, the central requirement. BlindPay adds a point that matters a lot for crypto: knowing which institution the money came from isn’t enough. You have to know the activity behind it.
| Aspect | Source of funds | Source of wealth |
|---|---|---|
| Question it answers | Where did this transfer come from? | How did you build your overall net worth? |
| Scope | One transaction or one flow of money | Your financial life over time |
| Crypto example | Exchange sale confirmation for 3 BTC plus the withdrawal record | Purchase history funded from salary since 2019, plus tax returns |
| Typical evidence | Exchange statements, TXIDs, sale confirmations | Payslips, tax returns, business sale, inheritance, mining records |
| When banks ask | Most large or unusual transfers | Larger amounts, private banking, higher-risk profiles |
How much you need depends on the amount and the relationship. Cryptotax’s Belgian guide to proof of funds says a one-off payout usually needs only proof of funds. Larger amounts (from around EUR 50,000) or private banking relationships add source of wealth on top. At the high end, alt.co’s comparison of source of wealth and source of funds explains how it works in Switzerland. Under the Swiss Anti-Money Laundering Act and FATF recommendations, regulated intermediaries verify both, before any transaction, for clients above set risk and volume thresholds.
In banking we put it simply: source of funds is about the transaction, source of wealth is about the person. You can document a sale perfectly and still fail the second test. If a 26-year-old with a modest salary history wires in USD 2 million, the exchange statement explains the wire but not the fortune. The bank needs to see the original stake, when it was bought, and how it grew.
The good news is that crypto gains count as legitimate wealth. azakaw’s overview of source of wealth requirements notes that most regulated institutions accept them, provided you show how you acquired the assets and how long you held them. Gegidze’s explainer on documenting the source of crypto funds sums up what banks and exchanges are testing:
- a transparent transaction history
- no link to illegal activity
- an origin in legitimate income or investments
- consistency with your declared earnings
Every document in the next section serves at least one of those four tests.
The Crypto Proof of Funds Checklist: Documents to Keep for Years
A complete crypto proof of funds file has about a dozen document types. The most valuable ones are exactly the records that exchanges, bank portals, and time tend to erase.
alt.co’s list of the seven documents banks request at cash-out groups them as:
- government ID and proof of address
- exchange transaction records
- a source of wealth report
- a blockchain analytics report on the wallets involved
- cryptographic proof that you own the wallet
- tax declarations or a CPA letter
- a beneficial ownership declaration
Compliance Navi’s step-by-step SoF and SoW checklists add two items for crypto investors that people forget all the time: platform verification records (proof the exchange completed KYC on you) and fiat off-ramp statements.
Here is the master checklist I’d build, whether you’re cashing out USD 50,000 or USD 5 million. The exhibit letters match the folder structure and the letter template later in this guide.
| Exhibit | Document | What it proves | Where it comes from | How long to keep |
|---|---|---|---|---|
| A | Government ID and proof of address | Identity | You | Keep current |
| B | Payslips, W-2s, sale contracts, estate papers | The fiat itself was legitimate | Employer, lawyer, you | Hold period plus 7 years after the final sale |
| C | Bank statements showing your original fiat deposits to exchanges | Your first dollar came from a regulated account in your name | Your bank | Same as above |
| D | Exchange trade history (CSV), statements (PDF), deposit and withdrawal records, KYC confirmation | How you bought and sold, and that the venue knew it was you | Every exchange you used | Same as above |
| E | Key-events ledger and explorer printouts for each TXID | How funds moved from purchase to sale | You, block explorers | Same as above |
| F | Wallet inventory and ownership proofs | Which addresses are yours, and that you control them | You, your wallet software | Same as above; re-sign on request |
| G | DeFi position records | What happened inside protocols | Explorers, protocol interfaces | Same as above |
| H | Tax returns, gain and loss reports, CPA letter | The gains were declared | You, your CPA | At least as long as tax rules require |
| I | Blockchain analytics report | Exposure to illicit sources is low or explained | Analytics firm or intermediary | Fresh for each major sale |
| J | Beneficial ownership declaration (entities only) | Who ultimately owns the money | Corporate records | Life of the entity |
| Cover | Proof of funds letter and exhibit index | How everything fits together | You | Each sale |
Not every bank asks for every item. But I’ve never seen a file rejected because it was too complete.
How long should you keep crypto transaction records?
Keep every crypto record for as long as you hold the asset, plus at least seven years after you sell it. The retention clock starts at the sale, not at the purchase.
The IRS guidance on how long to keep records says to keep records about property until the period of limitations expires for the year you sell it. That window is generally three years, or six if you leave out more than 25 percent of your gross income. Here’s a real example. Bitcoin bought in 2015 and sold in 2026 goes on a return filed in 2027. The basic window closes in 2030, the extended one in 2033. Your 2015 purchase records have to survive until then.
Banks run their own clocks. US banks keep records for five years under the Bank Secrecy Act, and periodic KYC reviews can bring an old inflow back up for questions. I’ve watched a three-year-old deposit resurface in a routine review. If the customer still had the file, it took a day to clear. If not, it took a month.
Two storage rules I follow:
- Use the 3-2-1 rule: three copies, on two different kinds of storage, one kept off-site, all encrypted.
- Never put seed phrases or private keys in your proof-of-funds archive. It should hold public information about your wallets and private information about you. Mix the two and a compliance folder becomes a target for thieves.
A folder structure that maps one-to-one to the exhibit letters:
crypto-records/
A_identity/
B_income-evidence/
C_bank-statements/
D_exchanges/
exchange-a/
2026-10-19_trades.csv
2026-10-19_deposits-withdrawals.csv
2026-10-19_annual-statements.pdf
exchange-b/
E_onchain/
key-events-ledger.csv
explorer-exports/
F_wallets/
wallet-inventory.csv
ownership-proofs/
G_defi/
H_tax/
I_analytics/
J_entity-docs/
Z_cover-letter/
manifest.sha256
manifest.sha256.ots
Exchange Transaction History: Export Your CSV Files Before They Disappear
Export your complete exchange history now, as both CSV and PDF. Closed accounts, acquisitions, and bankruptcies can make that history impossible to get later.
alt.co names partial exports, missing pages, and records from defunct exchanges such as Mt.Gox, BTC-e, and Cryptsy as common sticking points. Where exchange records can’t be produced, other evidence has to fill the gap: on-chain data, old emails, historical screenshots. Filling gaps is possible. It’s also slow, expensive, and less convincing than the original record.
Self-service export tools are a convenience, not a guarantee. Some platforms limit how far back an export goes, some cut off access once you close the account, and some simply cease to exist. Capture every export while you still can. I re-export once a year and again right before any large sale.
What to export from every exchange
- Full trade history across all pairs and all years
- Fiat deposit and withdrawal history, including bank account identifiers
- Crypto deposit and withdrawal history, including TXIDs and destination addresses
- Staking, earn, lending, rewards, and airdrop history (often a separate report)
- “Convert” or “instant buy” transactions, which some platforms log separately from regular trades
- Official account statements in PDF, monthly or annual
- Tax documents the exchange issues (in the US, Form 1099-DA for sales from 2025 onward)
- Your KYC verification confirmation
- Account closure confirmation, if you closed the account
One distinction from my banking years matters here. A CSV you downloaded is evidence you produced yourself. It’s easy to edit, and compliance officers know it. A PDF statement issued by the exchange is closer to independent evidence. Analysts weigh the two differently, so keep both. The CSV feeds your reconciliation and tax software; the PDF is what you hand the human reviewer. The Cyprus guide also recommends dated screenshots of current balances. They’re fine as backup, but never as the main exhibit.
Automating exports with read-only API keys
If you’ve used several exchanges or traded heavily, the open-source CCXT library can pull trades, deposits, and withdrawals through each exchange’s API in one common format. Create a read-only key with no trading or withdrawal permissions. Restrict it to your IP address if the exchange allows it, and delete it when you’re done.
import csv
import os
import ccxt
# READ-ONLY key: no trading, no withdrawal permissions.
# Keys come from environment variables so they never sit in a file.
exchange = ccxt.kraken({
"apiKey": os.environ["KRAKEN_KEY"],
"secret": os.environ["KRAKEN_SECRET"],
})
def save(rows, filename, fields):
with open(filename, "w", newline="") as f:
writer = csv.DictWriter(f, fieldnames=fields, extrasaction="ignore")
writer.writeheader()
writer.writerows(rows)
# Most exchanges cap results per call, so loop with "since"
# (a timestamp in milliseconds) for long histories. Some exchanges
# require a symbol for trades or a currency code for transfers.
trades = exchange.fetch_my_trades()
deposits, withdrawals = [], []
for code in ["USD", "BTC", "ETH"]: # every asset you ever moved
deposits += exchange.fetch_deposits(code)
withdrawals += exchange.fetch_withdrawals(code)
save(trades, "kraken_trades.csv",
["id", "datetime", "symbol", "side", "amount", "price", "cost"])
save(deposits, "kraken_deposits.csv",
["id", "txid", "datetime", "currency", "amount", "address", "status"])
save(withdrawals, "kraken_withdrawals.csv",
["id", "txid", "datetime", "currency", "amount", "address", "status"])
Use API output for reconciliation only. It doesn’t replace official statements, because a reviewer has no way to know your script didn’t change anything.
Make your exports tamper-evident with SHA-256 and OpenTimestamps
If you hash your exports and anchor the hash in the Bitcoin blockchain, you can prove the files existed in exactly that form on a given date. That answers “did you edit this?” before anyone asks.
In banking, we handled this with certified copies and date stamps. The crypto version costs nothing:
# macOS / Linux: hash every file in the archive into one manifest
cd crypto-records
find . -type f ! -name 'manifest*' -exec shasum -a 256 {} + \
| sort -k 2 > manifest.sha256
# Anchor the manifest in Bitcoin with the OpenTimestamps client
ots stamp manifest.sha256 # creates manifest.sha256.ots
# A few hours later, once the attestation is confirmed in a block
ots upgrade manifest.sha256.ots
# Years later: confirm no file changed, then verify the timestamp
shasum -a 256 -c manifest.sha256
ots verify manifest.sha256.ots
On Windows, PowerShell does the hashing:
Get-ChildItem -Recurse -File -Exclude manifest* |
Get-FileHash -Algorithm SHA256 |
Select-Object Hash, Path |
Export-Csv manifest.csv -NoTypeInformation
Be clear about what this proves. The OpenTimestamps project shows a file existed no later than a certain Bitcoin block. It doesn’t prove the content is true. It proves you didn’t edit it afterward, which is a different claim but still a valuable one. Verifying usually requires access to Bitcoin block data, either through your own node or the project’s web verifier.
When the exchange is closed, acquired, or gone
If an exchange account is closed, request your records through support or a formal data access request. If the exchange is gone, rebuild the trail from email, bankruptcy records, and on-chain data.
- Open a support ticket asking for a full statement of the closed account. AML rules usually require exchanges to keep customer and transaction records for years after the relationship ends (five years under EU rules), even if the export button is gone.
- If the exchange is covered by GDPR (EU or UK), file a data access request under Article 15. The company generally has one month to respond, extendable for complex requests.
- Search your email archive. Exchanges send confirmations for deposits, withdrawals, and trades (sample search below).
- If the exchange went through bankruptcy, your claim filing and any payout notices are independent evidence of your balance on that date.
- Rebuild withdrawals on-chain. A withdrawal to your own wallet shows up as a transaction from an address that analytics firms attribute to that exchange, landing in an address you can still sign for.
For step 3, a Gmail search like this surfaces most old confirmations:
from:(coinbase.com OR kraken.com OR bitstamp.net OR gemini.com)
subject:(deposit OR withdrawal OR "trade confirmation" OR receipt)
before:2021/01/01
Some holdings never touched an exchange. For an early miner, alt.co describes rebuilding the history from hardware invoices, electricity bills from the mining period, forum posts, and blockchain analytics showing the same wallets were used over time.
Proof of the Initial Deposit: Closing the Loop Back to Your Paycheck
The single most convincing document in a crypto proof of funds file is a boring old bank statement showing money leaving your account for an exchange years ago.
When I look at a file, the first thing I check is whether the loop closes. Money left a bank account in your name, went to a regulated exchange account in your name, and came back to a bank account in your name. The same person and regulated institutions sit at both ends. When the loop closes, most of the anxiety in the room disappears. The bank is no longer being asked to trust an unknown origin. It’s being asked to accept that an investment it watched go out came back larger.
This is double-entry bookkeeping applied to your life. Every debit on your bank statement (“ACH to Exchange X, USD 4,000”) should have a matching credit on the exchange’s fiat deposit report. Compliance officers are trained to look for exactly that match.
What to collect:
- Bank statements showing each transfer to an exchange, with the relevant lines highlighted
- The exchange’s matching fiat deposit records (the other side of each entry)
- Evidence of where that money came from: payslips, W-2s, savings account history, a property or business sale contract, inheritance papers, or a gift letter
The Cyprus guide recommends organizing the bank statements that show deposits to crypto platforms. Add employment contracts if your trading was funded by salary, or company documents if it was funded by business profits. Cryptotax’s checklist calls this identifying earlier fiat deposits: showing that what you first put into crypto came from a salary, a bonus, an inheritance, or a property sale.
Don’t wait on this. Many online banking portals only show a limited window of history, and ordering archived statements can take weeks. Request them now, while you still have the account.
azakaw adds a warning. Bank statements that only show wallet balances you reported yourself, without detailed transaction records, can’t stand alone as source of wealth evidence. The statement has to show money moving, not just a number you reported.
When your first purchase wasn’t funded by a bank transfer
If your crypto didn’t start with a bank transfer, you need substitute evidence that comes from someone other than you wherever possible.
| How you acquired it | Substitute evidence that works |
|---|---|
| Cash purchase or crypto ATM | ATM or vendor receipts, operator KYC records, bank cash withdrawals just before the purchase |
| Peer-to-peer marketplace | Platform trade history, chat logs, bank transfers to sellers, escrow records |
| Mining | Hardware invoices, electricity bills, pool payout records, block reward (coinbase) transactions to your addresses |
| Salary or freelance pay in crypto | Employment contract or invoices linked to the TXIDs that paid them |
| Gift or inheritance | Gift letter or estate documents, plus the giver’s own source evidence |
| Token sale or airdrop | Purchase receipts, whitelist emails, claim transactions |
| Business revenue in crypto | Invoices, contracts, accounting records matched to TXIDs |
BlindPay sums up the gold standard well: good evidence links a document, like an invoice, to the on-chain transfer that paid it.
Mining deserves a technical note. A block reward shows up on-chain as a “coinbase” transaction (named that by Bitcoin, unrelated to the exchange). It’s a special transaction with no real inputs that creates new coins. If a reward went to an address you can still sign for, you have a cryptographic link between yourself and that block. Pool miners should look for pool payout histories and account emails.
alt.co’s explainer on why private banks freeze crypto wealth observes that coins mined in the early years came with no receipt. To an officer used to salary statements and property deeds, that looks like risk the bank can’t manage. Your job is to replace the missing receipt with several pieces of evidence that back each other up.
Proving You Own the Wallet: Message Signatures and the Satoshi Test
You prove wallet ownership in one of two ways: sign a message from the bank with the wallet’s private key, or send a specific small amount from that wallet. Both prove control without revealing your keys.
alt.co’s walk-through of a crypto source-of-funds audit lists wallet ownership verification as the first stage. The result is either a Satoshi test or a message signature, recorded with its TXID. Hoptrail lists the full menu:
- documentation from the exchange tied to the address
- sending a specific amount to a designated wallet
- a signature check, which proves control without moving funds
You may already have done this without knowing why. In the EU, the Transfer of Funds Regulation requires exchanges to check whether a self-custody wallet belongs to their customer for transfers above EUR 1,000. That’s why many exchanges ask you to sign a message or make a test transfer before you can withdraw to your own wallet.
The banking parallel is the specimen signature card. We used to compare the signature on a check with the card the customer signed when opening the account. A cryptographic signature works the same way, except nobody can forge it by practicing, and anyone can verify it with free software.
| Method | What it proves | Cost | Privacy trade-off | Best use |
|---|---|---|---|---|
| Message signature | You held the private key when you signed | Free | Reveals only that you control the address | Default choice, works for many addresses at once |
| Satoshi test | You can move funds from the address | Network fee | Creates a permanent public link between your address and the verifier’s | When the verifier can’t check signatures for your address type |
| Exchange statement | The exchange ties the deposit address to your account | Free | Nothing beyond what the exchange already holds | Coins held on an exchange |
| Wallet screenshot | Almost nothing on its own | Free | Low | Supporting material only |
Bitcoin: legacy signmessage vs. BIP-322
Bitcoin’s original message-signing format only works with legacy addresses (the ones starting with “1”). Bitcoin Core’s signmessage RPC reference documents the command:
# Legacy P2PKH address only (starts with "1")
bitcoin-cli signmessage "1YourLegacyAddressHere" \
"I, Jane A. Doe, control this address. Ref FNB-KYC-20261019-4471"
# Verification: address, signature, message (in that order)
bitcoin-cli verifymessage "1YourLegacyAddressHere" \
"H1b2c3...base64signature..." \
"I, Jane A. Doe, control this address. Ref FNB-KYC-20261019-4471"
Most modern wallets use native SegWit (bc1q) or Taproot (bc1p) addresses, and the old format doesn’t cover them. The BIP-322 generic signed message format solves this with a clever trick. It builds a pretend “to_spend” transaction that commits to a hash of your message, plus a pretend “to_sign” transaction that spends it. Your signature is the data that would make that spend valid. Because the proof is just a transaction the network could check, it works for SegWit, Taproot, and even multisig addresses. BIP-322 defines three formats (legacy, simple, and full). The “simple” format is the signature data encoded in base64.
The catch is support. Not every wallet or verifier implements BIP-322, and some hardware wallets and Electrum-style software use older conventions (such as BIP-137) that stretch the legacy format to SegWit addresses. Verifiers don’t always agree on those. Before you send anything to a bank, ask which format their verifier accepts. Then sign a throwaway test message and confirm it checks out on their side.
Two practical tips that save days of back-and-forth:
- Keep the message on a single line. A trailing space or a Windows line ending changes the hash and breaks verification.
- Include your full name, the address, the date, and the bank’s reference number, so nobody can reuse the signature for another purpose.
Ethereum and EVM chains: EIP-191 personal_sign
On Ethereum and compatible chains, ownership proofs follow the EIP-191 signed data standard, usually through the “personal_sign” method. Your wallet adds the bytes \x19Ethereum Signed Message:\n plus the message length before hashing. That guarantees a signed message can never double as a valid transaction.
With Foundry’s command-line tool, you can sign from a hardware wallet and let anyone verify:
# Sign on a Ledger (the device shows the message for confirmation)
cast wallet sign --ledger \
"I, Jane A. Doe, control 0xAbC0000000000000000000000000000000000123. Ref FNB-KYC-20261019-4471"
# Anyone can verify the signature against the address
cast wallet verify \
--address 0xAbC0000000000000000000000000000000000123 \
"I, Jane A. Doe, control 0xAbC0000000000000000000000000000000000123. Ref FNB-KYC-20261019-4471" \
0xSIGNATURE_HEX
Cryptotax’s guide notes that tools such as Etherscan support message signing, so a reviewer without a command line can still check your proof.
If your funds sit in a smart contract wallet such as a Safe multisig, ownership works differently. Contract wallets check signatures through a standard called ERC-1271, and the bank will also want to know who the signers are and how many must approve. That’s the crypto version of a corporate signing rule like “any two of three directors may sign.” Present it the same way.
Save each proof as a structured record:
{
"chain": "ethereum",
"address": "0xAbC0000000000000000000000000000000000123",
"standard": "EIP-191 personal_sign",
"message": "I, Jane A. Doe, control 0xAbC...0123. Ref FNB-KYC-20261019-4471",
"signature": "0x...",
"signed_at_utc": "2026-10-19T14:02:00Z",
"signer_device": "Hardware wallet",
"verified_with": "cast wallet verify, Foundry",
"exhibit": "F2"
}
The Satoshi test
The Satoshi test is the low-tech alternative. The verifier gives you a destination address, an exact odd amount (say 0.00012345 BTC), and a deadline. You send that amount from the address being checked, then share the TXID.
Two technical traps:
- Use coin control. In Bitcoin wallets that support it (Bitcoin Core, Sparrow, Electrum), choose coins held at the exact address being checked. Otherwise your wallet may spend coins from a different address, and the test proves nothing.
- Watch the change output. The transaction usually sends change to a new address of yours, which publicly links that address to the verification too.
Signing safely: what a legitimate request never looks like
A genuine ownership proof is always a plain-text message you can read. Anything else is a red flag.
- No bank, auditor, or intermediary ever needs your seed phrase or private key. Anyone who asks for one is trying to steal from you.
- Only sign plain text you can read in full on your hardware wallet’s screen.
- Some “verification” sites ask you to connect a wallet and sign structured data using EIP-712 typed structured data. If you see fields such as “spender,” “value,” “deadline,” or “Permit,” stop. Permit-style signatures can let someone else move your tokens without a separate on-chain approval, and wallet-draining scams love them.
- Confirm the request came through a channel you already trust, such as your bank’s secure portal, not a link in an unexpected email.
Mapping Your On-Chain History: TXIDs, Wallet Inventories, and Risk Scores
Banks don’t need every transaction you ever made. They need the key movements that connect your purchase to your sale, each tied to a transaction hash.
UNGVRN recommends building the timeline around major events rather than every minor wallet movement. Keep supporting evidence in layers so a reviewer can dig deeper without getting a chaotic document dump. Hoptrail starts every crypto review by asking for all relevant wallet addresses, including self-custody wallets and exchange deposit and withdrawal addresses. Then it asks what happened when the funds were cashed out.
For a banker, a TXID works like the unique reference number (the UETR) that SWIFT attaches to every cross-border payment. It identifies one payment, permanently. The difference is that anyone can look it up.
Building a wallet inventory
Your wallet inventory (Exhibit F1) is the account list of your crypto life. One row per address that appears anywhere in the trail:
label,chain,address,type,first_used_utc,custody,ownership_proof,exhibit
Cold storage,bitcoin,bc1q...a7k,P2WPKH single-sig,2019-04-10,hardware wallet,BIP-322 simple,F2
DeFi wallet,ethereum,0xAbC...0123,EOA,2021-06-02,hardware wallet,EIP-191 personal_sign,F2
Exchange B deposit,bitcoin,bc1q...x9d,exchange-controlled,2026-09-28,custodial,exchange statement,D4
Some reviewers ask for an extended public key (xpub) so they can scan a whole wallet at once. Think before you hand it over. An xpub reveals every address in that wallet, past and future, along with their balances. Offer specific addresses with signatures first, and share an xpub only if the bank insists and you accept that loss of privacy.
Building a key-events ledger
Here is the format I like for the key-events ledger (Schedule 1 of the letter), with an example:
date_utc,event,asset,amount,from,to,tx_hash,venue,evidence_ref,note
2019-03-04,fiat deposit,USD,12000.00,First National ****1234,Exchange A account,,Exchange A,C1 p.2 / D1 row 3,Savings from salary
2019-03-05,buy,BTC,3.0,,Exchange A account,,Exchange A,D1 row 4,Market buy
2019-04-10,withdrawal to self-custody,BTC,2.9995,Exchange A account,bc1q...a7k,<txid>,Bitcoin,D1 row 9 / E1,Moved to hardware wallet
2026-09-28,deposit for sale,BTC,2.9990,bc1q...a7k,Exchange B deposit address,<txid>,Bitcoin,E2 / D3 row 1,Direct from long-held wallet
2026-09-29,sell,BTC,2.9990,,,,Exchange B,D3 row 2,Limit sell
2026-09-30,fiat withdrawal,USD,<per statement>,Exchange B,First National ****1234,,Exchange B,D4 p.1,Wire to own account
Look at what the ledger shows. The money entered a regulated venue from a named bank account, sat untouched in one wallet for seven years, and returned to the same bank. The small differences in amounts are withdrawal and network fees, and the ledger should account for them.
Pulling on-chain history yourself
For Ethereum and similar chains, Etherscan’s API documentation describes a single V2 endpoint that takes a chain ID. These two calls export an address’s normal transactions and its ERC-20 token transfers:
# Normal transactions on Ethereum mainnet (chainid=1)
curl -s "https://api.etherscan.io/v2/api?chainid=1&module=account&action=txlist&address=0xYOUR_ADDRESS&startblock=0&endblock=99999999&sort=asc&apikey=YOUR_API_KEY" \
| jq -r '.result[] | [.hash, .timeStamp, .from, .to, .value, .isError] | @csv' \
> eth_normal_txs.csv
# ERC-20 token transfers (USDC, WETH, LP tokens, and so on)
curl -s "https://api.etherscan.io/v2/api?chainid=1&module=account&action=tokentx&address=0xYOUR_ADDRESS&sort=asc&apikey=YOUR_API_KEY" \
| jq -r '.result[] | [.hash, .timeStamp, .tokenSymbol, .from, .to, .value, .tokenDecimal] | @csv' \
> eth_token_txs.csv
Amounts come back in the token’s smallest unit (wei for ETH), and timestamps are Unix seconds. Convert both before anything goes in front of a human. Swap the chain ID for other networks (42161 for Arbitrum One, 8453 for Base, 10 for OP Mainnet, 137 for Polygon), and check which chains your API plan covers. Long histories come back in pages, so you’ll need several calls.
For Bitcoin, the public mempool.space API returns an address’s transactions in pages:
# First page: unconfirmed transactions plus the 25 most recent confirmed
curl -s "https://mempool.space/api/address/bc1qYOURADDRESS/txs"
# Older confirmed history: pass the last TXID from the previous page
curl -s "https://mempool.space/api/address/bc1qYOURADDRESS/txs/chain/LAST_SEEN_TXID"
There’s a privacy trade-off. Every address you look up on a public API gets linked to your IP address in someone’s server logs. If that bothers you, import your extended public key as a watch-only wallet in your own node, or in Sparrow connected to your own server, and rebuild the history locally.
Blockchain analytics reports and “taint”
Assume your bank or its intermediary will run your addresses through a blockchain analytics tool, and get the same screening done before they do.
alt.co’s audit walk-through names Chainalysis, Elliptic, TRM Labs, and Lukka as the usual tools. Each counterparty gets tagged as an exchange, OTC desk, mining pool, or peer-to-peer source. Reports usually separate direct exposure from indirect exposure:
- Direct exposure: you transacted with a flagged entity yourself.
- Indirect exposure: flagged funds passed through other wallets before reaching you.
Indirect, small, and old exposure can usually be explained. Direct exposure to a sanctioned entity usually can’t.
Elliptic adds that tracing has to follow funds across chains, because bridges and swaps are where trails get harder to follow. If your history crosses chains, document both sides of every bridge.
One specific case is dusting. If a tiny amount arrives at your address from an unknown or flagged source, don’t spend it. Freeze those coins with coin control, leave them alone, and mention them in your summary. Spending them mixes them with your clean coins.
alt.co’s description of bank-ready KYC/AML reports identifies a common failure. Technical proofs are produced by people who understand blockchain but not banking. Wallet flows arrive without any story to explain them, and there’s no plan for dealing with high risk scores. That leads straight to the hardest part of this guide.
How to Explain DeFi Gains to a Bank Compliance Officer
To explain DeFi to a compliance officer, translate each action into its closest traditional-finance equivalent and attach the transaction hash. Then show that the money entered and left DeFi through documented, regulated doors.
Most compliance officers I’ve worked with are smart, skeptical, and overloaded. They aren’t hostile to decentralized finance. They’re hostile to anything they can’t write down in a memo for their supervisor. Your job is to hand them that memo.
The DeFi-to-banking translation table
| DeFi action | Plain-English description | Closest banking analogy | Evidence to attach |
|---|---|---|---|
| Token swap on Uniswap | Exchanging one asset for another at a price set by a formula, not an order book | Currency exchange at an automated FX kiosk | Swap TXID, amounts in and out |
| Providing liquidity | Depositing two assets into a shared pool that traders use, and earning a share of every trading fee | Acting as a market maker that earns the dealer spread | Deposit and withdrawal TXIDs, fees earned, LP token or position ID |
| Lending on Aave | Depositing assets that others borrow against collateral, earning variable interest | Money market deposit account | Supply and withdrawal TXIDs, balance history of the interest-bearing token |
| Borrowing against crypto | A loan secured by deposited crypto, automatically sold off if the collateral falls too far in value | Securities-based line of credit (a Lombard loan in Europe) | Borrow, repay, and any liquidation TXIDs |
| Staking ETH | Locking ETH as collateral to help run the network, earning rewards, with penalties for misbehavior | A clearing member posting collateral to earn settlement fees | Deposit TXID, validator or staking-token reward history |
| Liquid staking token (stETH) | A receipt token for staked ETH that grows with staking rewards | Accumulating fund units | Mint and redeem TXIDs, staking provider name |
| Liquidity mining rewards | Bonus tokens a protocol pays to attract deposits | Promotional rebate paid in the company’s own shares | Claim TXIDs, value when received |
| Bridging | Moving an asset to another blockchain by locking it on one and receiving an equivalent on the other | Moving securities between Euroclear and Clearstream over the link the industry literally calls the Bridge | TXIDs on both chains, bridge name |
| Wrapped tokens (WETH, WBTC) | A token version of an asset, backed one-for-one, that works inside apps | Depositary receipt, such as an ADR backed by shares held at a custodian | Wrap and unwrap TXIDs; for WBTC, the custodian’s name |
| Stablecoins (USDC, USDT) | Tokens issued by a company and designed to hold a one-to-one value with the US dollar | Electronic money issued by a non-bank | Issuer name, chain, exchange or mint and redeem records |
| Airdrop | Free tokens sent to past users of a protocol | Unsolicited share distribution or loyalty reward | Claim TXID, value on the day received |
A word on analogies: they help a reviewer follow you, but they aren’t a legal description of what you did. A Uniswap position is not a market-making license, and an Aave deposit carries smart contract risk that an FDIC-insured money market deposit account doesn’t. Say so in your memo. Analysts trust people who state the limits of their own comparisons.
The two-door rule: show where money entered and left DeFi
A compliance officer doesn’t need to understand every smart contract you touched. They need a documented entry door, a documented exit door, and a public record of everything in between.
In banking terms, DeFi is a room with glass walls. Anyone can watch what happens inside, because every swap, deposit, and withdrawal sits on a public ledger. What nobody can see from outside is who you are and where your money came from before you walked in. The doors answer that question.
- Entry door: a withdrawal from a regulated exchange account in your name to your own wallet, documented by the exchange’s withdrawal record and the TXID.
- Your wallet: an address you control, with a signature proof on file.
- Inside DeFi: swaps, pools, loans, and staking, every step public and every step with its own TXID.
- Back to your wallet: the same address, or another address you’ve proven you control.
- Exit door: a deposit to a regulated exchange, a sale, and a wire to a bank account in your name.
If both doors are documented, the middle becomes a question of arithmetic rather than trust. If one door is missing (say, the funds entered DeFi from a peer-to-peer purchase), fix that door first using the substitute evidence table earlier in this guide. No amount of DeFi explanation makes up for an undocumented entrance.
How to explain a Uniswap liquidity pool in plain English
A Uniswap liquidity pool is a shared pot of two tokens that traders swap against. The people who fund the pot earn a share of the trading fees, much like a market maker earns the spread.
Here’s the paragraph I’d hand to a compliance officer, almost word for word:
A liquidity pool is a shared fund holding two assets, for example ETH and a US dollar stablecoin. When someone wants to exchange one for the other, they trade against the fund instead of against another person, and they pay a small fee on every trade. The people who supplied the fund receive those fees in proportion to their share. I was one of those suppliers. My share was recorded on the blockchain as a token (a numbered certificate in later versions), and every deposit, fee payment, and withdrawal has a public transaction reference, which I’ve attached.
For your own understanding, and for the analyst who wants more, the original Uniswap design prices assets with a constant-product formula:
x * y = k
x = units of token A in the pool (for example, ETH)
y = units of token B in the pool (for example, USDC)
k = a constant that changes only when liquidity is added or removed
(in Uniswap v2 it also creeps upward as trading fees accumulate)
Pool price of token A, in units of token B = y / x
When a trader buys ETH from the pool, the ETH balance falls and the USDC balance rises, so the price moves. That’s the whole engine: no order book, no dealer, just a formula enforced by a smart contract. In banking terms, it’s a dealer that quotes continuously from inventory, except the inventory belongs to the liquidity providers and the quoting rule is public. In v2, every swap pays a 0.30 percent fee that has historically gone to liquidity providers.
The version matters, because each Uniswap generation records your position differently:
| Uniswap version | Launched | Your receipt | How fees reach you | What to save |
|---|---|---|---|---|
| v2 | May 2020 | ERC-20 LP token (fungible) | Added to pool reserves automatically; realized when you withdraw | LP token amount, add and remove TXIDs |
| v3 | May 2021 | ERC-721 NFT with a chosen price range | Accrue separately; claimed with a “collect” transaction | NFT token ID, price range, fee tier, collect TXIDs |
| v4 | January 2025 | ERC-721 NFT issued by the PositionManager contract | Credited when the position is modified; pools may use hooks and dynamic fees | NFT token ID, pool ID, hook address if any |
v3 introduced concentrated liquidity: you choose the price range your capital serves, with fee tiers of 0.01, 0.05, 0.30, and 1 percent. Concentration magnifies both fee income and rebalancing losses. If the price leaves your range, your position ends up holding only one of the two assets. Write that down in the memo if it happened to you. It explains why you went in with two assets and came out with mostly one.
Breaking down an LP gain: market movement, impermanent loss, and fees
Every liquidity pool result can be split into three parts a banker understands: market movement on the assets, a rebalancing cost called impermanent loss, and fee income.
Impermanent loss is the gap between keeping your two assets in the pool and simply holding them. Because the pool automatically sells the asset that’s rising and buys the one that’s falling, you end up with less of the winner. For a standard 50/50 constant-product pool, before fees:
IL = 2 * sqrt(r) / (1 + r) - 1
r = price of token A at withdrawal / price of token A at deposit
r = 0.5 -> IL = -5.72%
r = 1.5 -> IL = -2.02%
r = 2 -> IL = -5.72%
r = 3 -> IL = -13.40%
r = 4 -> IL = -20.00%
Here’s an illustrative example in round numbers: a v2-style ETH/USDC pool, entered when ETH was USD 1,600 and exited about a year later at USD 3,200.
| Step | Assets | Value in USD | How to explain it to the bank |
|---|---|---|---|
| Deposit | 10 ETH + 16,000 USDC | 32,000 | Assets withdrawn from Exchange A and placed in the pool |
| If simply held | 10 ETH + 16,000 USDC | 48,000 | Market movement: ETH doubled |
| Pool position before fees | 7.07 ETH + 22,627 USDC | 45,255 | The pool sold some ETH as the price rose (impermanent loss of 2,745, or 5.72 percent) |
| Fees earned | Both balances grew about 4.8 percent | 2,172 | My share of trading fees |
| Withdrawal | 7.41 ETH + 23,714 USDC | 47,427 | What came out of the pool |
| Gain over deposit value | Not applicable | 15,427 | Price appreciation plus fees, minus the rebalancing cost |
That table answers the analyst’s real question (“why did 10 ETH come back as 7.41 ETH and a pile of dollars?”) in a format they can paste into their case notes. The math, for anyone checking: with ETH up 2x, a constant-product position holds 10 / sqrt(2) = 7.07 ETH and 16,000 * sqrt(2) = 22,627 USDC before fees. Fee accrual then grows both balances by the same factor, here 1.048.
How this is taxed is a separate question. To my knowledge, the IRS hasn’t issued guidance specifically on liquidity pool deposits, so some practitioners treat the deposit as a taxable exchange for LP tokens and others don’t. Pick a defensible method with your CPA, apply it consistently, and make sure the bank memo and the tax return tell the same story.
Pulling LP evidence straight from the chain
For Uniswap v3 on Ethereum, the NonfungiblePositionManager contract emits IncreaseLiquidity, DecreaseLiquidity, and Collect events for every add, remove, and fee claim, each tagged with your position’s token ID. Foundry’s cast tool reads them directly:
# Read a live Uniswap v3 position by its NFT token ID (Ethereum mainnet).
# Returns: nonce, operator, token0, token1, fee, tickLower, tickUpper,
# liquidity, feeGrowthInside0LastX128, feeGrowthInside1LastX128,
# tokensOwed0, tokensOwed1
cast call 0xC36442b4a4522E871399CD717aBDD847Ab11FE88 \
"positions(uint256)(uint96,address,address,address,uint24,int24,int24,uint128,uint256,uint256,uint128,uint128)" \
123456 --rpc-url https://YOUR_RPC_ENDPOINT
# Show the event logs for a specific add, remove, or collect transaction
cast receipt 0xYOUR_TX_HASH --rpc-url https://YOUR_RPC_ENDPOINT
Once a position is closed and its NFT burned, the positions call fails, so archive the transaction receipts while the position is still open. For the human reviewer, print the explorer page for each transaction showing the tokens transferred. Raw logs belong in your archive, not the cover letter.
A plain-English DeFi annex you can adapt
ANNEX G: DECENTRALIZED FINANCE ACTIVITY
Wallet used: 0xAbC...0123 (Ethereum), controlled by me
(signed message, Exhibit F2)
Entry: On [date], I withdrew [amount] ETH from my account at
[Exchange A] to this wallet (TXID [...], Exhibit E3).
Activity:
1. [date] Deposited [amount] ETH and [amount] USDC into the Uniswap v3
ETH/USDC 0.05% pool, position #[token ID] (TXID [...]).
Plain English: I supplied both sides of a trading pool and
earned a share of the fee on every trade.
2. [date] Collected fees of [amount] ETH and [amount] USDC (TXID [...]).
3. [date] Closed the position and received [amount] ETH and [amount]
USDC (TXID [...]).
Exit: On [date], I sent [amount] ETH and [amount] USDC from
this wallet to my account at [Exchange B]
(TXIDs [...], Exhibit E4), where I sold them (Exhibit D3).
Result: Net gain of about USD [x]: USD [y] from price movement,
USD [z] from fee income, less USD [w] rebalancing cost.
Reported on my [year] tax return (Exhibit H2).
Screening: [Only if true] The analytics report (Exhibit I1) shows no
exposure to mixers, sanctioned addresses, or other
high-risk sources for this wallet.
Words that sink a DeFi explanation (and what to write instead)
Write your DeFi memo the way you’d describe a securities account to an auditor: dates, amounts, counterparties, references. Crypto slang reads as risk.
| Instead of | Write |
|---|---|
| “I farmed yield on Curve” | “I supplied USDC and USDT to a Curve stablecoin pool and earned trading fees and CRV token rewards (Annex G, rows 4 to 9)” |
| “I aped into a new token” | “On [date] I bought [amount] of [token] for [amount] ETH (TXID attached)” |
| “Got an airdrop” | “Received [amount] [token] as a distribution to past users of [protocol]; value on receipt USD [x], reported as income” |
| “Bridged to Arbitrum” | “Moved [amount] ETH to the Arbitrum network using the official Arbitrum bridge; TXIDs on both networks attached” |
| “It’s all on-chain, you can check” | Attach the specific TXIDs and explorer printouts; never ask the analyst to go hunting |
| “My wallet is anonymous” | “My wallet address is [address]; a signed message proving my control is attached” |
Special cases: bridges, airdrops, stablecoins, and mixers
- Bridges. Document both legs: the lock or burn on the source chain and the mint or release on the destination chain, with the bridge’s name. Elliptic points out that cross-chain movements are where tracing gets harder, so save the reviewer the work.
- Staking rewards and airdrops. In the US, they’re generally taxed as ordinary income at fair market value when you gain control of them, so they should already appear on your returns. Record the claim TXID and the value on the day received.
- Stablecoins. Name the issuer and the chain. Circle and Tether can both freeze tokens at specific addresses, and banks know it, which is why they check where stablecoins came from just as closely as they check bitcoin.
- Mixers and privacy coins. If you used one, disclose it up front with the reason and the amounts. Tornado Cash came off the US sanctions list in March 2025, but analytics tools still flag mixer exposure, and many banks treat it as high risk regardless of sanctions status. An analyst who discovers it on their own will assume you hid it.
Your Tax Return Is Part of Your Proof of Funds
Banks compare your story with your tax filings. A gain that never appeared on a tax return is a problem no paper trail can fix.
When I reviewed wealth files, nothing lost an analyst’s goodwill faster than a mismatch between declared income and the money in front of us. If you tell the bank you made USD 400,000 trading bitcoin since 2017 and your returns show no capital gains, you’ve handed them a tax evasion question on top of a money laundering one. That’s why alt.co’s list of required documents includes tax declarations or a CPA letter.
What to have ready if you’re a US taxpayer:
- Form 8949 and Schedule D for every year with disposals, plus your answer to the digital asset question on page one of Form 1040.
- Forms 1099-DA. Brokers report gross proceeds for sales from January 1, 2025, but cost basis generally only for assets acquired in that account from January 1, 2026 onward. For coins you bought years ago, the form will often show the sale price with no basis. Your purchase records are what stop you from being taxed on the full proceeds, and they’re the same records the bank wants.
- Wallet-by-wallet basis records. Since January 1, 2025, US taxpayers have had to track cost basis separately for each wallet or account rather than across all holdings, so your wallet inventory does double duty.
Outside the US, the information gap is closing fast. The OECD’s Crypto-Asset Reporting Framework, which the EU applies through its DAC8 directive and which the UK has also adopted, required crypto platforms to start collecting customer transaction data on January 1, 2026. Tax authorities will increasingly hold the same exchange data your bank is asking you about, so your bank file and your tax filings have to tell the same story.
A CPA or tax adviser letter is often the most efficient single exhibit. It should:
- identify the adviser, their license or registration, and the client
- list the tax years prepared and confirm that digital asset disposals were reported
- state the total proceeds and gains reported for the relevant years
- stick to what the adviser can support; it confirms reporting and is not an audit opinion
Crypto Proof of Funds Letter: A Bank Template You Can Copy
A proof of funds letter is a one- or two-page cover memo that tells the bank what is arriving, where it came from, and where each claim is evidenced. It turns a pile of documents into a file an analyst can close.
UNGVRN frames a strong file around four questions: where the wealth came from, how it moved, who controlled it, and why the current transaction makes sense. The template below follows that order. Write it in plain English, keep each claim to a sentence or two, and point every claim to an exhibit. If a sentence has no exhibit behind it, either find one or cut it.
[Your full legal name]
[Street address, city, state, ZIP]
[Phone] | [Email]
[Date]
To: [Bank name], attention [Relationship manager or Compliance team]
Re: Advance notice and source of funds, incoming transfer
Account holder: [Full name] Account ending: [****1234]
1. PURPOSE
I am writing to notify you in advance of an incoming transfer of
approximately USD [amount] from [Exchange legal name], expected on or
about [date]. The funds are the proceeds of a sale of [asset and
quantity] that I have held since [year]. This letter and the enclosed
exhibits document the origin of these funds.
2. TRANSACTION SUMMARY
Sending institution: [Exchange legal name, country, registration]
Account at sender: In my name, identity verified [date] (Exhibit D5)
Asset sold: [e.g., 3.0 BTC]
Sale date(s): [date]
Expected amount: USD [amount], one transfer
Payment reference: [as the exchange will label it]
3. SOURCE OF FUNDS (THIS TRANSFER)
The transfer is the proceeds of the sale above (Exhibits D3, D4).
The coins sold were deposited to [Exchange B] on [date] directly from
my self-custody wallet [address] (Exhibit E2), which I control
(signed message, Exhibit F2).
4. SOURCE OF WEALTH (HOW I ACQUIRED THE ASSETS)
I bought [asset] between [year] and [year] with savings from my
employment income at [employer] (Exhibit B1), transferred from my
account at [bank] (Exhibit C1). Total cost: USD [amount]. A
chronology of key events with transaction references is enclosed
as Schedule 1.
5. DECENTRALIZED FINANCE ACTIVITY [delete if not applicable]
[One plain-English paragraph; details in Annex G.]
6. TAX REPORTING
All disposals were reported on my tax returns for [years]
(Exhibits H1, H2). [Letter from my tax adviser: Exhibit H3.]
7. SCREENING
An independent blockchain analytics report dated [date], covering all
addresses listed in Exhibit F1, is enclosed (Exhibit I1). [Explain
any flagged exposure here, with amounts and reasons.]
8. DECLARATION
I confirm that the information in this letter and its exhibits is
true and complete to the best of my knowledge, that I am the sole
beneficial owner of these funds, and that I will provide original
records or further information on request.
Signature: ______________________
[Full name]
Enclosures: Schedule 1 (key-events ledger), Schedule 2 (exhibit index)
Schedule 2, the exhibit index, for a typical bitcoin holder:
| Exhibit | Document | Source folder |
|---|---|---|
| A1, A2 | Passport copy, proof of address | A_identity |
| B1 | W-2s and payslips for the funding years | B_income-evidence |
| C1 | Bank statements showing transfers to Exchange A | C_bank-statements |
| D1 | Exchange A full transaction history (CSV) | D_exchanges |
| D2 | Exchange A annual statements (PDF) | D_exchanges |
| D3 | Exchange B trade history (CSV) | D_exchanges |
| D4 | Exchange B account statement and withdrawal confirmation (PDF) | D_exchanges |
| D5 | Exchange B identity verification confirmation | D_exchanges |
| E1 to E4 | Explorer printouts for each TXID in Schedule 1 and Annex G | E_onchain |
| F1 | Wallet inventory | F_wallets |
| F2 | Signed-message ownership proofs | F_wallets |
| G1 | DeFi annex and position records (if any) | G_defi |
| H1 to H3 | Tax returns, Form 8949, adviser letter | H_tax |
| I1 | Blockchain analytics report | I_analytics |
How to deliver it:
- Send one combined PDF, bookmarked by exhibit, with page numbers. Keep the original CSV files ready for anyone who asks.
- Send it through the bank’s secure channel and ask that it be attached to your customer file, not just left in your banker’s inbox.
- Send it before the sale, and ask your relationship manager to note on your profile that the transfer is expected.
- Keep the SHA-256 manifest and OpenTimestamps proof of exactly what you sent.
- Don’t redact anything relevant. Blacked-out lines on a bank statement read as concealment. If unrelated personal data worries you, ask whether statement pages showing only the relevant entries are acceptable.
Choosing Your Off-Ramp: Exchange, OTC Desk, or Bank
The cleanest off-ramp is a regulated exchange or OTC desk paying one transfer into a bank account in your own name, ideally the same account that funded your original purchase.
alt.co’s extensive guide to cashing out crypto into private banks says two things decide the outcome: how well the origin of the wealth is documented, and how the cash-out itself is handled. Everything above covers the first. This section covers the second.
| Off-ramp route | Typical size | Paper trail quality | Freeze risk at your bank | Notes |
|---|---|---|---|---|
| Regulated exchange, bank withdrawal (ACH, wire, SEPA) | Small to large | High: statements, KYC, matching names | Low to moderate | Withdrawal limits may apply; whitelist your bank account in advance |
| OTC desk of a regulated firm | Large, often six figures and up | High: trade confirmation, settlement instructions | Low if pre-notified | Better pricing on size; desks run their own source-of-funds checks |
| Crypto-friendly bank or private bank | Large | Very high, but demanding up front | Low once onboarded | Expect a full source-of-wealth review before the first transfer |
| Peer-to-peer marketplace | Small | Weak: payments from strangers | High | Third-party payments and fraud recalls |
| Crypto debit card | Small | Moderate | Low per transaction | Spending, not cashing out; each purchase may be a taxable disposal |
| Bitcoin ATM (sell side) | Small | Weak | Moderate, once you deposit the cash | High fees; the cash deposit creates a new question for your bank |
Why peer-to-peer cash-outs get accounts frozen
The fastest way I know to get a clean account frozen is to sell crypto peer to peer to a stranger. In what’s often called triangulation fraud, a criminal “buys” your crypto but has the money paid into your account by a third party: a victim who thinks they’re paying for something else. When the victim reports the fraud, their bank recalls the payment and your bank freezes your account. Now you’re the person who received stolen funds. Your crypto is gone, and you’re explaining yourself to a fraud team. For anything beyond small amounts, use a regulated venue.
Execution rules that keep the transfer boring
- Withdraw to an account in your own name. A personal exchange account paying a company bank account (or the reverse) is a mismatch the analyst has to resolve.
- Close the loop. Where possible, withdraw to the same bank account that funded your purchases.
- Whitelist the bank account on the exchange days in advance. Some platforms impose a waiting period on new withdrawal destinations.
- Send a small test withdrawal first to confirm the account details and see how the payout is labeled. GE Crypto notes that vague or empty payment references add friction.
- Pre-notify your bank with the letter above, and ask whether it has a dedicated process for crypto-related inflows. Some banks, particularly in the UK, cap or block payments to and from exchanges, so check your bank’s published policy before you sell.
- Then send one transfer, or a small number of pre-announced transfers.
Never Split Your Withdrawals: Why Structuring Turns Clean Money Into a Crime
Splitting a withdrawal into smaller amounts to stay under a reporting threshold is called structuring. In the US it’s a federal crime even when the money is perfectly legal, and it’s the quickest way to turn a routine review into a suspicious activity report.
The US currency transaction report covers cash transactions of more than USD 10,000. Federal law (31 U.S.C. 5324) makes it a crime to break up transactions to evade that reporting requirement, regardless of where the money came from. Wires and ACH payouts don’t trigger currency transaction reports. But monitoring systems are built to catch patterns that look like avoidance: repeated transfers just under round numbers, several payouts on consecutive days, deposits spread across accounts.
From the analyst’s chair, nine transfers of USD 9,500 tell a worse story than one transfer of USD 85,500, because the pattern suggests intent. One large, pre-announced, documented transfer is the safest thing you can send a bank.
Inside the Bank: What Happens After Your Exchange Wire Lands
When a crypto-related wire arrives, it passes through sanctions screening and transaction monitoring and, if an alert fires, a human review. Your documentation determines how fast that review closes.
Here’s the lifecycle as I knew it, simplified:
- Payment arrives. The exchange’s bank sends the funds through ACH, Fedwire, SWIFT, or SEPA, with the sender’s name, your name, the amount, and a reference.
- Sanctions screening. Before or as the payment posts, the names are screened against sanctions lists such as OFAC’s SDN list in the US. A false-positive name match alone can hold a wire for a day or two.
- Posting. In most cases the money reaches your account. Monitoring largely happens afterward, which is why people are surprised by a freeze days after the funds “cleared.”
- Monitoring. Rules and models compare the inflow with your profile: amount against history, counterparty type (an exchange is a virtual asset service provider), velocity, and geography.
- Alert. If a rule fires, a case lands in a queue. A first-level analyst reviews your KYC file, your account history, and any notes from your banker.
- Request for information. If the file can’t explain the inflow, the bank asks you, usually through your relationship manager or a secure message. This is where your prepared file pays off.
- Escalation. Unresolved cases move to a senior investigator or the bank’s financial intelligence unit, and the account may be restricted while they work.
- Decision. The case is closed with no action, closed with an updated customer profile, reported in a SAR, or ends with the bank exiting the relationship.
- Outcome. Your funds stay available or, in the worst case, the account is closed and the balance returned to you by check or transfer.
Banks run on the four-eyes principle: someone senior reviews every decision. The analyst isn’t just deciding about you; they’re writing a justification a second reviewer, and possibly an examiner, will read. That’s why evidence beats charm.
Two things customers never see. First, a note from your relationship manager saying “customer pre-notified, documents on file” is visible to the analyst at step 5, and it changes the tone of the review completely. Second, if your banker suddenly becomes vague, it may not be rudeness. US law prohibits banks from disclosing whether a SAR was filed, and most countries have similar “tipping off” rules. Don’t push your banker to break that rule. Push the paperwork instead.
What to Do If Your Bank Freezes Your Account Anyway
If your account is frozen, respond quickly, in writing, with organized evidence, and ask exactly what’s missing. Arguing, moving money around, or opening accounts elsewhere makes things worse.
- Ask for the request in writing, with a case reference and a list of the specific documents needed.
- Send your prepared file, or the relevant exhibits, through the secure channel within days, not weeks.
- Answer exactly what was asked. Include the cover letter, but don’t bury the analyst in thousands of unexplained CSV rows.
- Don’t try to move remaining funds out, open accounts elsewhere to route around the problem, or push the same funds through another exchange. Each of those looks like layering.
- If you get no response, escalate through the bank’s formal complaints process. In the US, you can also file a complaint with the Consumer Financial Protection Bureau. In the UK, the Financial Ombudsman Service handles unresolved complaints. If the bank decides to end the relationship, it usually has broad contractual rights to do so, and your goal becomes the orderly return of your funds.
- If large sums are involved or the bank alleges wrongdoing, hire a lawyer with AML experience.
Common weak spots and how to fix them before you sell
| Weak spot | What the analyst thinks | How to fix it |
|---|---|---|
| Records from a defunct exchange are missing | “We can’t verify the origin.” | Bankruptcy claim records, old emails, on-chain withdrawals to addresses you can sign for |
| First purchases were cash or peer to peer | “Unknown funding source.” | Receipts, platform history, bank withdrawals that match the timing |
| Wealth far exceeds your income history | “Is this really their money?” | Purchase dates and costs, holding period, tax returns showing the gains |
| Mixer, gambling, or high-risk exchange exposure | “Is this laundering?” | Disclose it, quantify it, explain the reason, attach the analytics report |
| Many wallets, chains, and bridges | “We can’t follow this.” | Key-events ledger, wallet inventory, both legs of every bridge |
| A salary account suddenly receives six figures | “This doesn’t fit the profile.” | Update your KYC profile with the bank before the transfer |
Your Pre-Sale Timeline: 90 Days to Payout
Start building your file about three months before a large sale. Most of the delays are on the bank’s and the exchanges’ side, not yours.
T-90 days Export every exchange history (CSV + PDF), closed accounts too
Order archived bank statements for your original deposits
Build the wallet inventory and key-events ledger
Review prior tax years with your CPA; amend if needed
T-30 days Confirm the bank's accepted signature format; sign proofs
Order a blockchain analytics report
Write the proof of funds letter; assemble the exhibit PDF
Hash and timestamp the archive
T-7 days Send the file to your bank; ask for a note on your profile
Whitelist the bank account at the exchange; test withdrawal
For large amounts, request an OTC quote
T-0 Sell; withdraw in one transfer (or pre-announced tranches)
Save every confirmation and TXID
T+30 days Add sale records to the archive; re-hash and re-timestamp
Calendar the tax filing; set a retention date at least
seven years after the sale
Frequently Asked Questions About Crypto Proof of Funds
What is crypto proof of funds?
Crypto proof of funds is documentation showing where the money from a crypto sale came from: exchange records, transaction hashes, wallet ownership proofs, and evidence of the original fiat used to buy. The Cyprus guide describes it as demonstrating the legal origin of your holdings and proving you own the wallets in question.
How much crypto can I cash out before my bank asks questions?
There’s no universal number. Monitoring compares each inflow with your own profile, so USD 20,000 can trigger a review for one customer and pass unnoticed for another. Large, first-time inflows from an exchange are the most likely to be reviewed.
Will my bank close my account if I deposit money from a crypto exchange?
Usually not, if the exchange is regulated, the account names match, and you can document the source. Closures tend to follow unanswered information requests, unexplained high-risk exposure, or patterns that look like structuring.
Are wallet screenshots enough proof of funds?
No. Screenshots are easy to fake and show balances, not origin. As Lightspark’s glossary entry on source of wealth puts it, the job isn’t just showing your crypto; it’s documenting its legitimate origin. Use exchange-issued statements, TXIDs, and signed messages, and keep screenshots as supporting material.
What if the exchange I bought on no longer exists?
Rebuild the trail from email confirmations, bankruptcy claim records, old bank statements showing transfers to the exchange, and on-chain withdrawals from the exchange to addresses you can still sign for. Explain the gap in your cover letter rather than leaving the analyst to find it.
Do I need a blockchain analytics report?
For large amounts, it helps. Your bank or the exchange will likely screen your addresses anyway. Your own report lets you see and explain any flags before they do.
Should I tell my bank before I cash out?
Yes, for any amount that’s large relative to your normal activity. Advance notice with documentation is the single most effective thing you can do, because it puts the explanation in your file before the alert fires.
Will a bank ever ask for my seed phrase or private key?
Never. Legitimate ownership checks use signed messages or small test transfers. Anyone requesting a seed phrase is attempting theft.
How long should I keep crypto records?
For as long as you hold the asset, plus at least seven years after you sell it. Tax limitation periods run from the return that reports the sale, and banks can revisit old transfers during periodic reviews.
My Bottom Line After 25 Years on the Bank Side
Cashing out crypto smoothly is a documentation problem, not a crypto problem. Build the file before you sell, and the bank’s review becomes a formality.
In banking, we used to say a clean file is one a stranger could audit five years from now without calling the client. That’s the standard I’d hold your crypto records to. Every exchange export, early bank statement, signed message, and TXID is a link in a chain of custody. The blockchain started that chain. Your paperwork has to finish it.
The blockchain gives you something few bank customers ever had: a public, timestamped, tamper-evident record of every movement of your money. Most people never use it, because nobody told them the bank would ask. Now you know. Start your folder today, long before the day you need it.
Sponsored Partner: Volet.com
Looking for a simple, everyday way to buy, hold, and sell cryptocurrencies alongside your traditional currencies and payment cards?
- Read my full breakdown: Complete Volet Review on DoraMilen.com
- Get started right away: Open your free Volet account using my referral link



