OP_DROPProtocol

Normative specification, version 1.0.0

OP_DROP specification

This document defines the OP_DROP carrier and the token ledger carried on it. Rules are numbered OD-x.y and are normative. Everything else on this page is explanation.

Status. Experimental. Bitcoin, on mainnet, testnet, signet, and regtest. The rules below match the reference implementation operated by Bitcoin Universe as of 2026-09-01. Where the carrier layer and the ledger layer disagree, both outcomes are stated, because a leaf can parse correctly and still change no balance.

1. Scope and layering

OP_DROP is specified in two layers. Implementations may adopt the carrier without the ledger, but the ledger is meaningless without the carrier.

2. Notation and terminology

Terms used normatively
TermMeaning
Leaf scriptThe tapscript revealed in a script-path spend, tapleaf version 0xc0.
Commit transactionAny transaction creating the P2TR output that commits to the leaf.
Reveal transactionThe transaction that spends that output along the script path, exposing the leaf in its witness.
AnchorOutput index 0 of the reveal transaction, written {txid}:0. Its address owns the event.
EventOne accepted or rejected protocol action derived from one reveal input, or one transfer settlement.
PayloadThe compact UTF-8 JSON object carried in script element 7.
AvailableConfirmed units an address may spend into a new transfer.
ReservedConfirmed units held by an unsettled transfer. The API field name is transferable.

Byte values are hexadecimal. Sizes are in bytes unless a unit is given. "Must" and "must not" are requirements; a violation makes the described thing invalid.

3. Transaction anatomy

OP_DROP uses the commit and reveal pattern that Taproot script paths require. The commitment is created first as an ordinary payment, and the payload becomes visible only when that output is spent.

Commit and reveal transaction anatomy for OP_DROP On the left, a commit transaction pays to a Taproot output whose output key commits to the OP_DROP leaf. In the middle, a reveal transaction spends that output. Its witness holds exactly three items: a Schnorr signature, the leaf script, and a 33-byte control block. Its output 0 is the anchor, and the address of that output owns the event. On the right, for a transfer only, a later transaction spends the anchor, and the address of that later transaction's output 0 becomes the settlement destination. Commit transaction inputs: any vout 0: P2TR output key commits to the leaf vout 1: change spent by Reveal transaction vin i: script path witness item 0: signature witness item 1: leaf script witness item 2: control block exactly three items vout 0: the anchor its address owns the event vout 1+: ignored by the protocol A transfer only Settlement transaction vin: spends anchor A vout 0: destination reserved units credited to this address no address here means the transfer returns The payload is invisible until the reveal confirms. Watching only the commit transaction shows an ordinary Taproot payment. Several inputs of one reveal transaction may each carry a leaf. Each is a separate event, ordered by input index. A settlement transaction needs no OP_DROP leaf of its own. Spending the anchor is the entire signal.
Commit, reveal, and (for a transfer only) settlement. Output index 0 is load bearing in both the reveal and the settlement.

4. Leaf script grammar

The leaf script is a fixed sequence of ten elements. Nothing is optional, nothing may be reordered, and no alternate encoding is accepted.

PUSH "bip110-op-drop"      <- 14 bytes, ASCII
OP_DROP
PUSH "application/json"    <- 16 bytes, ASCII
OP_DROP
PUSH <sha256(payload)>     <- exactly 32 bytes
OP_DROP
PUSH <payload>             <- 1 to 256 bytes, UTF-8 JSON
OP_DROP
PUSH <x-only public key>   <- exactly 32 bytes
OP_CHECKSIG

OD-4.8 is what makes look-alike scripts worthless. Re-encoding the same 14-byte marker with OP_PUSHDATA1 instead of a direct push produces a different script that fails the rebuild check, even though every field decodes identically.

5. Taproot commitment proof

A witness item that merely looks like an OP_DROP leaf proves nothing. The leaf counts only when the control block proves the spent output committed to it.

6. Payload encoding

The payload is a compact JSON object. Its exact bytes are the event: any change to spacing, key order, or value type produces a different, and almost always invalid, event.

The three shapes, exactly as they appear on chain:

{"p":"op-drop","op":"deploy","tick":"drop","max":"21000000","lim":"1000"}
{"p":"op-drop","op":"mint","tick":"drop","amt":"1000"}
{"p":"op-drop","op":"transfer","tick":"drop","amt":"250"}

The largest possible deploy payload is 101 bytes and the largest possible transfer payload is 93 bytes, so a token payload never approaches the 256-byte push ceiling. That ceiling binds only on the media attachment in section 12.

7. Identifiers

8. Operations

9. Deterministic ordering

Two implementations must agree on which deploy wins, which mint takes the last of the supply, and which transfer settles first. Ordering is therefore total and fully determined by chain data.

10. State transitions

Each address holds a per-ticker balance with two parts. total is always available + reserved and is never stored independently.

Transfer state machine Units start as available at the sender. A confirmed valid transfer moves them to reserved and the event status becomes transfer pending. When the anchor is spent, one of two things happens: if the spending transaction's output 0 yields an address, the units leave the sender and become available at that destination and the event status becomes settled; if it does not, the units return to the sender's available balance and the event status becomes invalid with reason invalid transfer destination. available sender transfer confirmed and valid reserved transfer_pending anchor spent, output 0 has an address available destination, settled anchor spent, output 0 yields no address: units return, event invalid A return is not a burn. Nothing is ever destroyed by an invalid settlement. Reserved units are already deducted from available, so total does not change when a transfer is confirmed.
The transfer state machine. The only two exits from reserved are settlement to a destination or return to the sender.

Event statuses

The four event statuses
StatusApplies toMeaning
validdeploy, mintEvery applicable rule passed and state changed.
transfer_pendingtransferUnits are reserved and the anchor is waiting to be spent.
settledtransfer_settleReserved units were credited to a destination.
invalidanyA required rule failed. A reason accompanies it.

11. Invalid conditions

Every rejection carries exactly one reason code. These are the complete set.

Reason codes and the condition that produces each
ReasonLayerExact condition
invalid_taproot_commitmentCarrierThe control block does not prove the leaf belongs to the spent P2TR output: wrong leaf version, parity mismatch, or an output key that does not match the previous output.
invalid_anchorCarrierA transfer whose reveal transaction has no usable output 0, or whose output 0 yields no address.
ambiguous_transfer_anchorCarrierMore than one otherwise-valid transfer leaf appears in the same transaction. They would all claim the same single anchor, so every one of them is rejected. Deploys and mints in the same transaction are unaffected.
missing_transfer_source_authorizationCarrierAt or above the configured activation height, a transfer whose transaction does not also spend another input whose previous output script equals the anchor output script. This proves the sender controls the address the units are debited from.
invalid_transfer_destinationLedgerThe anchor was spent, but output 0 of the settling transaction yields no address. Reserved units return to the sender.
unsupported_profileLedgerA payload that parses as a carrier payload but breaks the ledger profile: a ticker that is not exactly four characters, or a value outside the ranges in OD-6.9, or lim greater than max.
unsupported_self_mintLedgerA deploy carrying self_mint.
duplicate_deployLedgerA deploy for a ticker that already has a valid deployment on this network.
unknown_tickLedgerA mint or transfer for a ticker with no valid deployment.
mint_limit_exceededLedgeramt greater than the deployment's lim.
supply_exhaustedLedgerRemaining supply is zero or less when the mint is applied.
insufficient_available_balanceLedgerThe anchor address does not hold amt in available balance when the transfer is applied.
invalid_bip110_transactionConstructionThe transaction breaks the reduced-data construction rules while a node reports those rules as enforced. Every event in that transaction, including any settlement, is invalidated. This reason is unreachable while the reduced-data deployment is inactive, which is its state on Bitcoin mainnet today.

A script that fails section 4 or section 5 before any of the above is not recorded at all. It is not an OP_DROP event, it is an unrelated Taproot spend.

12. Optional media attachment

A deploy, and only a deploy, may append an image to the same leaf. The attachment uses the same push-then-drop pattern and is appended after OP_CHECKSIG.

PUSH "drops-media"           OP_DROP
PUSH "op-drop-token-image"   OP_DROP
PUSH <mime type, ASCII>      OP_DROP
PUSH <sha256(image), 32 B>   OP_DROP
PUSH <uint32 big-endian size, 4 B>  OP_DROP
PUSH <chunk>                 OP_DROP     (repeated)

A 256 KiB image needs at least 1024 chunks, each with its own push header and OP_DROP. At 256 bytes per chunk the attachment carries roughly 1.2 percent overhead in script bytes, and it makes the reveal transaction large. Attach a small image or none at all.

13. BIP-110 construction profile

BIP-110 is a published proposal for a temporary set of reduced-data consensus limits. It is marked complete as a document. It is not active on Bitcoin. OP_DROP is built to stay inside its limits so that the carrier would keep working if those limits ever applied. That is a design constraint, not a claim.

The seven reduced-data limits, and how OP_DROP stays inside each
#LimitOP_DROP construction
1An output script is at most 34 bytes, or 83 bytes for an OP_RETURN output.Every OP_DROP output is a 34-byte P2TR script.
2Every witness argument and data push is at most 256 bytes.OD-4.7 enforces exactly this bound.
3Undefined witness versions and undefined tapleaf versions cannot be spent.Witness version 1 and tapleaf version 0xc0 only.
4No Taproot annex.OD-3.1 requires exactly three witness items, which leaves no room for an annex.
5A control block is at most 257 bytes.OD-3.2 requires exactly 33 bytes, the minimum possible.
6No OP_SUCCESS opcode.The grammar admits only OP_DROP, OP_CHECKSIG, and data pushes.
7No executed OP_IF or OP_NOTIF.The grammar contains no conditional opcode at all, which is the difference from a witness envelope.

A "BIP-110 ready" label in a Bitcoin Universe interface means the application is enforcing this construction profile before it shows activity. It does not mean BIP-110 is active, that a transaction will relay or be mined, or that another wallet or indexer recognises OP_DROP.

14. Conformance

An implementation conforms when it produces the same accept or reject decision, the same reason code, and the same resulting balances as the rules above, for every case on the test vectors page.

Relationship to BRC-20

The ledger deliberately borrows accounting ideas that BRC-20 popularised: four-character tickers, first valid deploy wins, a per-mint limit, a partial final mint that receives the remainder, and a two-stage transfer. BRC-20 originated outside Bitcoin Universe. OP_DROP is not BRC-20, produces no Ordinals inscription number, and has no automatic interoperability with either system. The carrier, the identifiers, and the transfer settlement mechanism are OP_DROP's own.