OP_DROPProtocol

Guide

Using OP_DROP

You do not need to read the specification to use OP_DROP, but you do need to understand one idea: nothing counts until a transaction confirms and the rules accept it. A wallet preview is a proposal, not a balance.

Three operations

What each operation does
OperationIn plain languageFields you choose
DeployDefine a new token: pick a four-character ticker, a maximum supply, and how much one mint may request. The first valid deploy for a ticker wins, permanently.tick, max, lim
MintAsk for units of a token that already exists, under the rules its deploy set.tick, amt
TransferMove units you already hold. This happens in two confirmed steps, not one.tick, amt

Tickers are not reserved. Anyone can attempt a deploy for any four-character ticker at any time, and only chain order decides who gets it. Check the explorer before you plan a launch around a name.

The path an action takes

The path from choosing an action to a confirmed result Five steps in a row. First, choose deploy, mint, or transfer. Second, review the exact JSON that will be carried. Third, sign the commit and reveal transactions. Fourth, wait for confirmation to the deployment's configured depth. Fifth, check the explorer or portfolio for the confirmed result. A note underneath says that between steps three and five the action is pending and is not a balance. Choose the operation Read the exact JSON Sign commit and reveal Wait for confirmation Check the result Between signing and the confirmed result the action is pending. Pending is not a balance. Step 2 is the only step where a mistake is still free. Read the JSON there. A confirmed Bitcoin transaction cannot be taken back.
Every OP_DROP action follows this path, whichever tool creates it.

Worked example: a mint, end to end

Minting 1000 drop. Every value here is real, and comes from vector V2 on the test vectors page.

Step 1: the event

{"p":"op-drop","op":"mint","tick":"drop","amt":"1000"}

54 bytes, exactly as written. No spaces, no reordering, values as strings.

Step 2: the leaf

The event is hashed, and the digest and the event are both pushed into a leaf script along with the marker, the content type, and your public key. That script is 158 bytes:

PUSH "bip110-op-drop"   OP_DROP
PUSH "application/json" OP_DROP
PUSH 3c0153…12e1        OP_DROP
PUSH {"p":"op-drop",…}  OP_DROP
PUSH 8836f3…bf3b        OP_CHECKSIG

Step 3: the commit transaction

The leaf is committed into a Taproot address. For this leaf and this key that address is:

bc1pjx22xhtzlyxn2fef89l9t2z3qrsfypyuufau6uszequgcc64n5kqtlwnap

You pay that address. On chain this looks like any other Taproot payment. Nobody can tell what it commits to.

Step 4: the reveal transaction

You spend that output along the script path. The witness carries exactly three items: your signature, the leaf script, and the 33-byte control block c18836f3…bf3b. Output 0 of this transaction is the anchor, and its address is credited with the minted units. The reveal is about 160 vB, so at 5 sat/vB it costs roughly 800 sat plus whatever the commit cost.

Step 5: the result

Once the reveal reaches the deployment's confirmation depth, an indexer applies the rules. If drop is deployed and supply remains, output 0's address gains 1000 available units and the event id {revealTxid}:i0:w1 appears in the event ledger with status valid. If supply had run out, the same transaction would appear with status invalid and reason supply_exhausted, and you would have paid the fee for nothing.

That last sentence is not a bug. Bitcoin has no way to tell you in advance that a mint will lose a race. Check remaining supply immediately before you sign, and expect the last mints of a popular token to fail.

Worked example: a transfer

A transfer is two confirmed steps, and the units are visible in a third state in between. This is the part of OP_DROP that surprises people.

Moving 250 units from A to B
StepWhat you doWhat the ledger shows
1Create a transfer event at address A for amt 250. Commit and reveal.Nothing. Pending.
2The reveal confirms.A: 750 available, 250 reserved. Event status transfer_pending. B has nothing.
3Spend the anchor, output 0 of the reveal, in a new transaction that pays B at its output 0.Still 250 reserved until this confirms.
4That transaction confirms.A: 750 available, 0 reserved. B: 250 available. A settlement event appears with status settled.

Three details decide whether step 4 works:

A transfer also cannot share a transaction with another transfer. Two valid transfer leaves in one transaction would both claim the same anchor, so both are rejected with ambiguous_transfer_anchor. A transfer alongside a mint is fine.

Reading a result

What you will see and what it means
You seeIt meansWhat to do
Pending orderA transaction step has not confirmed. It is not a balance.Wait. Check the transaction on any Bitcoin explorer.
Indexer warming upThe confirmed view is still catching up to the chain tip.Recheck later before relying on totals.
Status validA deploy or mint passed every rule and changed state.Nothing.
Status transfer_pendingUnits are reserved. The anchor has not been spent yet.Spend the anchor to complete the transfer.
Status settledA transfer credited its destination.Nothing.
Status invalid with a reasonThe transaction was seen but a rule failed. No balance changed.Read the reason. The full list is in the specification.
No token foundNo valid confirmed deploy for that ticker on this network.It does not mean a pending deploy will fail, and it does not mean the ticker is free.

The $DROP token

$DROP is a display label. The wire ticker is drop, four lowercase characters like every OP_DROP ticker.

$DROP terms
Wire tickerdrop
Maximum supply21,000,000 whole units
Limit per mint event1,000
Full-limit mint count21,000
Decimal placesnone
Deploy payload{"p":"op-drop","op":"deploy","tick":"drop","max":"21000000","lim":"1000"}

21,000 is the number of full-limit mints needed to exhaust the supply. Smaller mints are valid, so the actual number of mint events can differ. These are protocol terms only. They are not a price, an availability promise, or a claim that the deployment exists on any particular network: a deployment exists only after its exact deploy event confirms and is accepted.

Support matrix

This table lists only what can be verified in Bitcoin Universe's own source. Nothing outside this organisation reads OP_DROP, and no claim is made about any third-party wallet, marketplace, miner, or indexer.

Verified Bitcoin Universe support
SurfaceActionsStatusDetail
Inscribe workspace deploy, mint, transfer wired A dedicated op-drop route that builds the strict construction. Ordinary BRC-20 routes cannot produce an OP_DROP payload. Mint batches are capped at five independent inscriptions, which does not change the per-event limit.
Core explorer view, discover, view collection, view activity, view transaction feature-gated Deployments, supply, holders, and confirmed event history, read only. Behind the opDropIndex gate, which defaults to off: the protocol is staged independently so index reads, portfolio balances, and the trade desk can be enabled one at a time.
Core portfolio view wired Available, reserved, and total balances per address, in a card separate from Ordinals and BRC-20. This surface is not gated.
Core wallet view, send, receive declared Declared in the ecosystem registry as a wallet surface for the protocol.
Core marketplace list, update listing, unlist, buy, make offer, accept offer, cancel offer, settle, reconcile feature-gated Behind the opDropTrading gate, which also defaults to off, in external-execution mode against a configured OP_DROP marketplace authority. Settlement is recorded only when a finalized-block scanner verifies the exact intent transaction and the custody transition.
Core marketplace: sell sell unsupported Recorded in the registry as unsupported: OP_DROP has no executable offer workflow on that surface.
Third-party wallets, explorers, marketplaces any none Not currently supported. No external tool recognises an OP_DROP event.

"Wired" means the surface exists in the organisation's source and is not behind a gate. "Declared" means the ecosystem registry lists the capability. "Feature-gated" means the code exists but the gate defaults to off, so the surface is absent unless a deployment explicitly enables it. None of these are a promise that a given deployment has it switched on today, and the safest assumption for a gated surface is that it is off.

Staying in control