342 days ago·u/ChristinaHepburn·r/Bitcoin·for_eu_users_how_to_prove_wallet_ownership_to_okx·B
# How to Beat OKX’s Broken Satoshi Test Using Sparrow + a Hardware Wallet
# 1. How you end up in this mess (realistic example)
Typical situation:
* You use a hardware wallet (Ledger, BitBox, etc.).
* You send BTC from your hardware wallet to OKX.
* Because of EU “Travel Rule” / ToFR, OKX flags the deposit as coming from a **self-hosted wallet**.
* OKX now demands a **proof of ownership** of that wallet.
OKX then tells you to:
1. Do a **Satoshi test** from the **same address** that funded the original deposit, or
2. **Sign a message** from that same address via the OKX Wallet browser extension.
Why this blows up:
* Your hardware wallet is an **HD wallet**:
* It uses **UTXOs** (unspent transaction outputs).
* It uses many addresses (receive + change).
* When you sent BTC to OKX, the UTXO on that deposit address was **fully spent** → that address now has **no UTXO**.
* Ledger Live doesn’t let you choose a specific UTXO/address.
* The OKX extension:
* Only scans certain standard paths.
* Doesn’t see all your real Ledger addresses (especially change addresses).
* Doesn’t let you freely pick “sign with this exact BTC address”.
Result:
* You cannot send again from that address (no UTXO).
* You cannot sign properly for that address via the OKX extension.
* Support keeps repeating “send from the same address” as if Bitcoin were a simple bank account.
This guide shows a **working workaround**:
* Re-fund that old address.
* Use **Sparrow + your hardware wallet** to spend from exactly that address.
* Pass OKX’s “same address Satoshi test”.
This only works if that address is really yours (derived from your seed), **not** an exchange deposit address.
# 2. When this guide applies (and when it does not)
Use this guide if:
* You funded OKX from **your own hardware wallet** (e.g. Ledger Nano X).
* The address OKX wants the Satoshi test from is a Bitcoin address belonging to your wallet (e.g. a `bc1q...` address from your seed).
* You can connect your hardware wallet to **Sparrow Wallet** on a desktop machine.
Do **not** use this guide if:
* The “sending address” is actually an exchange deposit address (Kraken, Binance, etc.).
* You do not control the private keys for that address.
# 3. What you need
You will need:
* A hardware wallet (e.g. Ledger Nano X) with the **same seed** you used for the OKX deposit.
* **Sparrow Wallet** installed on your computer.
* Some BTC somewhere (exchange or another wallet) to re-fund that address (must cover OKX test amount + network fees).
* Access to your **OKX BTC deposit history** (so you can get the TXID and input address).
# 4. Step 1 – Find the exact address OKX cares about
1. Log in to OKX.
2. Go to your BTC **Deposit history**.
3. Find the deposit that came from your hardware wallet.
4. Click the TXID / “View in explorer” / “Details” to open that transaction in a block explorer.
5. In the block explorer, look at the **Inputs (Vin)**. These are the addresses that sent BTC to OKX.
You will see one or more input addresses.
* If there is exactly one input (e.g. `bc1q...`), that’s most likely the address OKX wants.
* If there are multiple, OKX usually shows somewhere which one they consider “the source” address.
Copy that address exactly and call it `OLD_ADDRESS`.
If `OLD_ADDRESS` is clearly an exchange address (for example a 3-address you recognize as Kraken’s deposit address), this method will **never** work. You cannot send from an address you don’t control.
# 5. Step 2 – Check if OLD_ADDRESS belongs to your wallet in Sparrow
Now confirm that `OLD_ADDRESS` is really part of your own wallet.
1. Connect your hardware wallet via USB.
2. Unlock it (PIN).
3. On the device, open the **Bitcoin** app.
4. Open **Sparrow Wallet** on your computer.
If you haven’t created a hardware-wallet wallet in Sparrow yet:
5. In Sparrow:
* `File → New Wallet`
* Name: e.g. `Ledger BTC`
* Wallet type: **Connected Hardware Wallet**
* Select your device (Ledger, etc.)
* Script type: **Native SegWit (P2WPKH, bc1q)**
* Derivation: `m/84'/0'/0'` (BTC mainnet, first account)
* Finish setup.
Then:
6. Go to the **Addresses** tab in Sparrow. 7. Use the search field and paste `OLD_ADDRESS`.
* If Sparrow shows `OLD_ADDRESS` in the list ⇒ good, this address belongs to your wallet.
* If Sparrow finds nothing ⇒ this address is not from this wallet ⇒ stop here, this guide will not work.
# 6. Step 3 – Why OKX’s Satoshi test was impossible before
At this point you will usually see:
* `OLD_ADDRESS` exists as one of your addresses, **but**
* there is **no unspent output (UTXO)** on it anymore, because the deposit to OKX spent that UTXO completely.
That’s why:
* You couldn’t send a new transaction from that address in Ledger Live.
* OKX’s “send from the same address” requirement was impossible.
We fix this by creating a **new UTXO** on `OLD_ADDRESS`.
# 7. Step 4 – Send fresh BTC to OLD_ADDRESS (create a new UTXO)
1. Copy `OLD_ADDRESS` carefully.
2. From any wallet or exchange where you currently hold BTC (another Ledger account, Kraken, etc.):
* Start a normal BTC send.
* Recipient: `OLD_ADDRESS`.
* Amount: enough to cover:
* The OKX test amount, **plus**
* The miner fee for the upcoming test transaction.
Example:
* If OKX wants `0.00001000 BTC` as the Satoshi test, send e.g. `0.00005000–0.00010000 BTC` to be safe.
1. Broadcast that transaction and wait for at least 1–3 confirmations.
Result:
* `OLD_ADDRESS` now holds a **new** UTXO with some BTC.
# 8. Step 5 – Confirm the new UTXO in Sparrow
1. In Sparrow, open your hardware-wallet BTC wallet.
2. Go to the **UTXOs** tab.
3. Use the search field and paste `OLD_ADDRESS`.
You should see a UTXO:
* Address = `OLD_ADDRESS`
* Value = the amount you just sent
* Status: unspent / available
If you don’t see it:
* Click **“Synchronize”** in Sparrow.
* Check in the explorer that the funding transaction has confirmations.
* Confirm you are using the correct wallet (same device, same derivation path).
If it still doesn’t show up, something is wrong. Do not continue.
# 9. Step 6 – Note OKX’s Satoshi test parameters
From the OKX Satoshi test / ownership screen, note:
* `TEST_AMOUNT` = the exact BTC amount OKX wants you to send
* `TEST_DEST` = the BTC address OKX wants the test sent to
Example:
* `TEST_AMOUNT = 0.00001000 BTC`
* `TEST_DEST = bc1q...` (OKX’s test address)
Make sure:
`UTXO on OLD_ADDRESS ≥ TEST_AMOUNT + miner fee`
If not, fund `OLD_ADDRESS` with a bit more BTC.
# 10. Step 7 – Spend the UTXO from OLD_ADDRESS using Sparrow (coin control)
Now we send OKX’s test amount **from exactly that address** using Sparrow’s UTXO control.
1. In Sparrow, go to the **UTXOs** tab.
2. Find the UTXO whose address is `OLD_ADDRESS`.
3. Tick the checkbox next to that UTXO.
4. Right-click that UTXO → choose **“Spend Selected”**.
Sparrow switches to the **Send** tab with that UTXO locked as the input.
Fill out the test transaction:
5. In the “Recipients” table:
* Label: `OKX Satoshi Test` (optional, for yourself)
* Address: paste `TEST_DEST` (OKX’s test address)
* Amount: enter exactly `TEST_AMOUNT`.
1. Set the fee:
* Choose a reasonable target (e.g. 1–3 blocks).
* Ensure the **total** (amount + fee) does not exceed the UTXO amount on `OLD_ADDRESS`.
Critical check:
7. Look at the **Inputs** section at the bottom of the Send tab and confirm:
* There is **only one input**.
* That input’s address is `OLD_ADDRESS`.
If you see more than one input:
* Go back to the UTXO tab, uncheck everything.
* Check **only** the UTXO on `OLD_ADDRESS`.
* Click **“Spend Selected”** again.
If there is only one input from `OLD_ADDRESS`:
8. Click **“Create Transaction”**. 9. Click **“Finalize Transaction for Signing”**. 10. Your hardware wallet will show the transaction on its screen:
- Verify the destination (TEST_DEST) and approximate amounts.
- Confirm on the device.
11. Back in Sparrow, click **“Broadcast Transaction”**.
Result:
* The Satoshi test amount is now sent **from the exact same address** that funded your original OKX deposit.
# 11. Step 8 – Let OKX pick it up
1. Wait until the Satoshi test transaction has at least 1 network confirmation.
2. Go back to OKX’s Satoshi test / ownership screen and refresh or just wait.
If OKX’s system is functioning correctly, it will now see:
* Original deposit input = `OLD_ADDRESS`
* Satoshi test input = `OLD_ADDRESS`
and should mark your self-hosted wallet as verified.
If OKX still refuses:
* Double-check in the block explorer:
* The **input** of the Satoshi test transaction is `OLD_ADDRESS`.
* The **output** is `TEST_DEST`.
* The amount equals `TEST_AMOUNT`.
* If all that is correct, the bug is on OKX’s side, not yours.
* At that point: push support with TXIDs + screenshots – or stop using them.
# 12. Warnings, privacy, and reality
* This **only** works if `OLD_ADDRESS` is truly from your own wallet seed (Sparrow shows it as one of your addresses).
* It will **never** work for addresses that belong to another exchange.
* This method costs extra on-chain fees:
* 1 transaction to re-fund the address
* 1 Satoshi test transaction to OKX
* Address reuse is bad for privacy. You do it here only as an emergency workaround for a broken compliance implementation.
* This workaround fixes **only** the Satoshi test issue. OKX’s message-signing flow is still tied to their own extension and is not friendly to serious self-custody users.
If you regularly need to sell BTC from a hardware wallet and want to avoid this UTXO circus, look for exchanges/brokers that support proper **“Sign message” ownership proofs** (classic `signmessage`\-style) instead of “same address Satoshi tests” bolted onto HD wallets.