Skip to the swap

What is a PSBT, and what we check in one

The container, and the three records that matter

The settlement page calls a PSBT a container. What is inside it is one unsigned transaction and then a map of extra records for each input and each output, a shape fixed by a Bitcoin improvement proposal called BIP-174.

We wrote the decoder for this site from the specification, with no library, because a dependency that turns raw scripts into readable addresses is a dependency that could show you the wrong address. Three of the records it reads carry all the weight:

Bitcoin has no fee field

This is the single mechanic the rest of the page rests on, and it surprises almost everyone. There is no line in a Bitcoin transaction that says what the miner is paid. The fee is simply everything that goes in, minus everything that comes out. Whatever an input carries that no output claims is the fee.

Now add the second fact: a coin cannot be partly spent. If 330 sats of your wallet happen to be carrying 30,510 $DOG and that coin is used, the whole 30,510 goes in. Something has to send the remainder back to you, or by the arithmetic above it belongs to the miner. On Bitcoin, runes are moved by an instruction written into the transaction itself, a runestone, in an output that holds no value and exists only to be read. Get that instruction wrong and the rune does not bounce; it is gone.

That is the whole risk, in two sentences, and it is why this site was built the way it was.

What we read out of the bytes

The review screen is that decode, rendered in the order the transaction reads. The settlement page lists its four sections, so three details belong here instead. A coin of yours reads Your $DOG with an amount wherever an indexer has told us what it is carrying. The makers' inputs appear only as a count, marked as not yours to sign, because what leaves your wallet is the only part you are signing for. And the miner fee is labelled implied, which is exactly what it is.

Everything there comes from the transaction we are about to hand your wallet. If our own parser cannot read some part of the venue's answer, we say so and the sign button stays dead, rather than render a confident screen over bytes we did not understand.

The four checks that decide whether the button works

  1. The signature has to cover what you just read. Only one sighash type, SIGHASH_ALL, binds your signature to the exact outputs on screen. Under the others, the amounts and destinations can still be changed after you sign, which would make every proof above describe a transaction that never settles. A build declaring anything else is refused, not passed along to your wallet.
  2. The runestone has to add up. We decode that instruction to its individual transfers and prove the totals from the bytes. On a sell, exactly the amount you agreed leaves and the rest comes home. On a buy, what arrives may fall short of your quote by no more than your own slippage limit, set in whole percent, and a build under that floor is refused. A runestone that is malformed does not fail gently: it burns every rune in the transaction, so anything that does not add up is treated as danger rather than as a curiosity.
  3. We ask what each of your coins is carrying. The PSBT bytes cannot know, so we ask a runes indexer and cross-check the answer against the transaction's own record. If the indexer times out, or has not indexed a coin, or disagrees, that coin becomes unknown, and unknown is rendered as "We cannot promise this one is safe." It is never rounded up to safe.
  4. The button stays dead until all of it passes. The signature button is live only when the build succeeded, the runestone verified exactly, the safety verdict is safe, the build is inside your slippage limit, and a wallet is connected. There is no override. The venue also allows about 30 seconds from build to payment, so a countdown runs on the button and disarms it at zero rather than spend your signature on a build the venue has already given up on.

A settled example, from 2026-09-01: a sell of 15,000 $DOG where the coin carrying them held 30,510. The review said exactly 15,000 would move and 15,510 would come home, and put the build 2.83 percent under the quote against a 5 percent limit. After it confirmed, we pulled the transaction from a public block explorer and decoded its runestone by hand: two transfers, 1,500,000,000 base units to the maker and 1,551,000,000 back. $DOG has five decimal places, so that is 15,000.00000 out and 15,510.00000 home, matching the review to the base unit, and the fee was 301 sats exactly as implied.

Three wallets, and what actually differs

UniSat, OKX and Xverse. The list is short because it is the list of wallets that have signed real swaps here, and between them both directions, not the list of wallets that exist. What differs between them is smaller than it looks, and none of it changes what you are shown:

Whichever you use, the site never sees a private key or a seed phrase, cannot sign anything, and holds no funds at any point. Its whole job is to tell you what you are about to sign.

What we cannot promise

The check on what your coins are carrying depends on an indexer we do not run. When it cannot answer, we say the input is unverified and the button does not arm. That is the honest failure and it is the one we chose: a refusal you can retry is recoverable, and a rune paid to a miner is not.

Ready to read one for yourself: start a swap, and open the decode before you touch your wallet. Every sentence above is a row on that screen.

Questions

Can signing a PSBT let someone take my other coins?

Not from a build this site will show you a button over. You sign only the inputs that are yours, your signature commits to the outputs you were shown, and a signature cannot add an input. The risk with a PSBT is never that it steals a coin you did not offer, it is that a coin you did offer was carrying something you did not know about. That is the check above.

Why does the fee sometimes say it cannot be computed?

Because one of the inputs arrived without its value record, and the fee is inputs minus outputs. We would rather print that sentence than an estimate that looks like a measurement. It also blocks the sign button, since a fee we cannot derive is a fee we cannot check.

What is a runestone?

An instruction written into the transaction saying which rune moves, how much of it, and to which output. It sits in an output carrying zero sats, so it costs almost nothing and every indexer reading Bitcoin executes it the same way when the block confirms. More on the rune itself in what is $DOG.

Do I have to understand any of this to swap?

No. The checks run whether or not you read them, and the button will not arm if one fails. This page is here because a check you cannot inspect is a promise, and we would rather it was a proof.