Dev.to WebDev 🛠 Dev 👁 0 📖 4 min read

What Wrapped Bitcoin Actually Asks You to Trust

Bitcoin can't run on Ethereum. So when a lending market or a DEX pool on Ethereum says it accepts "BTC", it means something else: a token that promises a real bitcoin is sitting somewhere, waiting to be redeemed. That p

Bitcoin can't run on Ethereum. So when a lending market or a DEX pool on Ethereum says it accepts "BTC", it means something else: a token that promises a real bitcoin is sitting somewhere, waiting to be redeemed.

That promise has a structure. Someone holds the BTC, someone decides who can mint and burn, and someone charges for each step. In my last post on proof of reserves I looked at what an exchange's reserve report can and can't tell you. Wrapped bitcoin raises the same question, just with a token contract in the middle.

The token is a claim on a vault

WBTC, the oldest and best-known wrapper, works through two kinds of participants: merchants and a custodian.

Mint:  User → Merchant → Custodian receives BTC → WBTC minted on Ethereum
Burn:  User → Merchant → WBTC burned → Custodian releases BTC

The user never talks to the custodian directly. A merchant handles the request, usually after KYC, and the custodian mints or releases. Official minting waits for 6 Bitcoin confirmations, and burning waits for 25 Ethereum blocks.

Once WBTC exists, moving it between users costs only network fees. The trust question sits entirely at the edges: when the token is created and when it's turned back into bitcoin.

Three wrappers, three different promises

WBTC isn't the only way to hold BTC on Ethereum anymore. In a wallet, these tokens look almost identical. Underneath, they ask you to trust different parties:

WBTC:
  backing: BTC held by a custodian
  mint_and_redeem: through approved merchants, usually with KYC
  fees: custodian fee + merchant fee, rates not published

tBTC:
  backing: BTC deposits secured by Threshold network operators
  mint_and_redeem: 0.2% each way, minimum deposit 0.01 BTC

cbBTC:
  backing: BTC held by Coinbase
  mint_and_redeem: through a Coinbase account, no wrap or unwrap fee

They aren't interchangeable. A pool that accepts only WBTC won't take tBTC, so a cheaper mint on one wrapper can mean an extra swap, and another fee, later.

Custody can change while the token stays the same

This is the part that's easy to miss if you only look at the contract address.

In 2024, BitGo announced it would move WBTC custody into a new structure with a partner, BiT Global. The token kept its name, its contract and its 1:1 claim. What changed was who stood behind it. Coinbase later delisted WBTC, saying it no longer met its listing standards, and promoted its own cbBTC instead.

Nothing broke on-chain. Holders could still transfer and use their tokens. But the trust model they had originally accepted was different from the one they ended up with, and the change happened off-chain, in agreements most users never read.

For anyone building on top of wrapped BTC, that's the real risk surface. Your code checks a contract. The guarantee lives somewhere else.

The fee nobody publishes

Cost is where wrapping gets murky. A recent comparison of the cheapest ways to convert BTC to WBTC lines up four routes: official merchants, centralized exchanges, instant swap services and the tBTC bridge. One finding stood out to me. The custodian's fee for official WBTC minting isn't public. It's set in an off-chain agreement between merchant and custodian, and the third-party estimates the authors found disagreed with each other by a wide margin.

So the most "official" route is also the one you can't price in advance.

The routes with published numbers behave very differently depending on size. A percentage fee scales with the amount. The Bitcoin network fee doesn't. With a simple SegWit payment of about 140 vbytes:

function wrapCostShare(amountSats, percentFee, satPerVb, vbytes = 140) {
  const serviceFee = amountSats * percentFee;
  const networkFee = vbytes * satPerVb;
  return (serviceFee + networkFee) / amountSats;
}

wrapCostShare(1_000_000, 0.002, 20);   // 0.01 BTC → 0.0048   (~0.48%)
wrapCostShare(100_000_000, 0.002, 20); // 1 BTC    → 0.002028 (~0.20%)

At 0.01 BTC on a busy day, the Bitcoin fee (about 2,800 sats) is bigger than a 0.2% bridge fee (2,000 sats). At 1 BTC it barely registers. Ethereum gas, meanwhile, was the smallest line of all in mid-October 2026: about $0.04 for a swap, according to Etherscan's gas tracker.

The cheapest route for a $200 conversion and the cheapest route for a $200,000 one are often different routes.

What this means if you're building

If your app accepts BTC on Ethereum, the wrapper choice is a risk decision, and it deserves the same treatment as any other dependency:

  • Treat each wrapped asset as a separate asset with its own backing, custodian and redemption path. A shared ticker prefix doesn't make them equivalent.
  • Keep an explicit allowlist and review it. Custody arrangements can change without a contract upgrade.
  • Show users which wrapper they hold or receive. "BTC" in the UI hides the one detail that matters most.
  • Don't promise instant redemption. Burning WBTC goes through a merchant, and that's an off-chain process with its own timing.
  • When you quote a conversion, quote the amount that arrives after every fee. A good-looking rate with a separate fee can lose to a plain one.

Wrapped bitcoin made BTC usable across Ethereum, and that's been genuinely useful for years. The token, though, is only as reliable as the arrangement behind it. Read that arrangement before you build on it.

Drafted with AI assistance. Facts were checked against the linked sources, and the text was edited by me.

📰 Read the original article on Dev.to WebDev

Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.