Introduction
DUST-20 is an experiment in improving fungibility directly on Bitcoin. Instead of inscribing a new transfer event for every move, token state lives in ordinary UTXOs whose satoshi values are “dyed” with a deploy/mint inscription.
The goal: make Bitcoin-native transfers of fungibles practical by linking the dust limit (546 sats) to a token unit — so moving tokens is just moving sats in a transaction, with balance state derived from colored UTXOs.
Core concept
Three ideas define the protocol:
Unit = dust sats
One token unit defaults to 546 sats — Bitcoin’s standard dust threshold.
Colored UTXOs
Mint inscriptions lock amt × unit_sats into an output. Those sats carry the token.
Transfer = split UTXO
Send dyed sats to a receiver and change back to yourself. No new inscription required.
A DUST-20 indexer or compatible wallet aggregates all UTXOs colored for a given
tick and computes balances — similar in spirit to rune or BRC-20 indexing,
but the transfer layer is pure Bitcoin.
Operations
deploy
Define ticker, max supply, sats per unit, and optional per-mint cap.
mint
Inscribe JSON with amt and matching sats padding on the output.
transfer
Spend a dyed UTXO; pay network fees from a separate, non-colored UTXO.
Deploy
Deploy inscribes token metadata. The demo ticker dust has likely reached max supply —
use a new tick for new experiments.
{
"p": "dust-20",
"op": "deploy",
"tick": "dust",
"supply": "1000000",
"unit_sats": "546",
"max_sats": "546000000"
}
| Key | Required | Description |
|---|---|---|
p | yes | Protocol identifier — always dust-20 |
op | yes | Operation: deploy |
tick | yes | Token ticker (not limited to 4 bytes) |
supply | yes | Maximum token supply |
unit_sats | yes | Satoshis representing 1 token unit (typically 546) |
max_sats | yes | supply × unit_sats — total satoshis for the token |
lim_sats | no | Max sats per mint inscription (e.g. UniSat’s ~50,000 sat cap → 546 × 91 = 49,686) |
Mint
Mint inscribes an amount of tokens and locks the corresponding satoshis into the inscription UTXO.
The inscription output value must equal the sats field.
{
"p": "dust-20",
"op": "mint",
"tick": "dust",
"amt": "91",
"sats": "49686"
}
sats in the JSON.
When inscribing, set the inscription output to exactly amt × unit_sats
(here: 91 × 546 = 49,686 sats). Wallets that enforce a per-inscription cap
require amt × unit_sats ≤ lim_sats from deploy.
| Key | Required | Description |
|---|---|---|
p | yes | dust-20 |
op | yes | mint |
tick | yes | Token ticker from deploy |
amt | yes | Token amount to mint; must respect lim_sats if set |
sats | yes | Output padding: amt × unit_sats |
Transfer
A mint inscription creates a UTXO with dyed sats. To move tokens, spend that UTXO in a normal Bitcoin transaction — split the colored value between receiver and change. Pay miner fees from a non-colored UTXO.
Worked example
You hold a mint UTXO of 91 tokens with 49,686 sats padding. Transfer 10 tokens:
transfer_amt = 10
receiver_output = 10 × 546 = 5,460 sats → receiver wallet
change_output = 49,686 − 5,460 = 44,226 sats → your wallet
fees = paid from a separate cardinal UTXO
Indexers detect the split, update balances, and wallets can offer merge/split helpers to consolidate dyed UTXOs — all without new inscriptions.
Balance & indexing
DUST-20 balance state is not stored in a single inscription chain. Indexers and wallets:
- Parse deploy and mint inscriptions for a
tick - Track UTXOs whose value matches dyed sat rules for that token
- Update balances when those UTXOs are spent (transfers, merges, splits)
- Expose aggregate balances per address — similar to a UTXO-based token ledger
Universe Inscribe classifies dust-20 inscriptions in portfolio and search;
full merge/split and marketplace flows are integrated via the Tap Wallet stack.
Tools & links
Bitcoin Universe is adopting DUST-20 with indexer support, deploy/mint/transfer, merge/split, marketplace, and wallet integration.
-
Universe InscribeInscribe, explore, and manage Bitcoin assets
-
DUST-20 IndexerBalances, ticks, and colored UTXO state
-
Deploy & Mint UIGuided deploy and mint with padding validation
-
OG Pass LaunchpadZero-fee DUST-20 operations for pass holders
-
@pinkbtcuniverseProtocol updates and development
Quick reference
| Rule | Detail |
|---|---|
| Protocol field | "p": "dust-20" |
| Default unit | 546 sats per token |
| Mint output value | Must equal sats in JSON |
| Transfer mechanism | Bitcoin TX splitting dyed UTXO; fees from cardinal UTXO |
| Balance source | Sum of dyed UTXOs per address (indexer) |
| LLM docs | llms.txt |