TAPProtocol documentation

Reference

TAP reference

Terminology, the exact behaviour of Bitcoin Universe's TAP indexer around confirmation, mempool and reorgs, the concrete differences from BRC-20, and a checklist for anyone building against TAP.

Terminology

Available balanceThe part of an address's holding that can be spent by inscribing a new transfer.
Transferable balanceThe part parked in live transfer inscriptions. It counts toward the holder's total but cannot be transferred again until the inscription is sent.
Transfer inscriptionAn inscription whose content is a valid token-transfer. Live until sent, consumed afterwards.
ConsumedA transfer inscription that has been sent and credited. It is spent for protocol purposes even though the ordinal still exists.
Privilege authorityThe inscription named by a deployment's prv field, holding the key that authorises privileged operations on that ticker.
Authority bearingAn operation that only takes effect with a valid authorisation from the ticker's privilege authority.
Atomic amountAn amount as an integer at the deployment's decimal scale, with no decimal point. Always produced by string padding.
Cursed inscriptionAn inscription with a negative inscription number. Its ticker sits in a namespace prefixed with -.
QuarantineAn indexer state for a source row that cannot be interpreted safely yet, held rather than guessed at.
CheckpointA height and block hash that a read is pinned to. Reads are bracketed by checkpoint agreement so that two observations can never be mixed.
DMTDigital Matter Theory. A distinct asset family carried on the tap protocol tag, indexed separately.

Indexer semantics

Bitcoin Universe reads confirmed TAP state from an authenticated writer it operates itself, and publishes normalised batches. The behaviour below is that indexer's, not a property of TAP.

Identity pinning

The service pins its protocol, chain, network, writer identity, writer version and writer revision. It refuses to start if the configured identity differs from the code, and it stores an identity hash in its database so that a database built for another source, network, writer revision or writer version cannot be opened. Every read is bracketed by authenticated block digest checks, so a height advance or a same height block replacement aborts the operation instead of mixing two states.

Ordering and replay

Each source list has a durable offset. The raw row fingerprint, the normalised event and the output journal sequence are all stored, so replaying the same source row does not create a second event. Output cursors bind the journal sequence to the source identity, and new journal rows never change the content of an older page.

Holding back rather than guessing

Addresses

The source contract is Bitcoin mainnet only. A mixed case Bech32 string is rejected. Where a legacy holder row uses another valid Bitcoin network encoding, the indexer derives the identical output script and re-encodes that script as a mainnet address rather than guessing. Invalid checksums and malformed addresses fail closed. Addresses supplied by users on marketplace paths are strictly mainnet and are never rewritten.

Confirmation states

How a source row becomes a confirmation state.
EvidenceState
A status of pending, unconfirmed or mempoolpending
A confirmed flag that is false or zeropending
No block heightpending
A block height presentconfirmed
A status of reverted, invalid, orphaned or reorgedreverted
A status of failed, rejected or errorfailed

Pending does not mean seen in the mempool. Source coverage is recorded as partial with this reason: The Universe-operated TAP writer provides confirmed indexed state and authenticated block digests but no pending mempool feed. Tail checks detect confirmed replacements visible in writer lists. A consumer must not present TAP pending state as mempool visibility.

Confirmation state transitions for an indexed TAP event An observed row without block evidence is pending. With a block height it becomes confirmed. Replacement evidence from a tail check moves a confirmed event to reverted, and an explicit failure status marks it failed. A reverted event that reappears keeps its source event id and is reactivated with a new journal entry. pending no block evidence block height confirmed in a block replacement evidence from a tail check reverted invalidated the same event returns, keeps its id, gains a new journal entry failed explicit
Confirmed to reverted requires evidence, not silence. An event is never invalidated just because it stopped being visible.

Reorg behaviour

Reorg coverage is recorded as tail replacement only. The indexer rechecks a bounded tail of each source list and emits invalidations only when replacement evidence exists, meaning a list that got shorter or a row that changed. When deployment metadata changes, affected activity is invalidated and rewound before the new decimal scale is applied. An identical event that returns after invalidation keeps its source event id and receives a new journal entry, so a downstream projection can reactivate it rather than duplicate it.

On the marketplace side, reorg reconciliation is automatic. The authority appends reorg observations, reopens or invalidates affected orders deterministically, and preserves the funding, broadcast, settlement and replacement lineage.

Marketplace policy for TAP, as recorded in the protocol registry.
AvailabilityFeature gated behind tapMarketplaceV1
Execution modeIn app execution
Listing minimum confirmationsNo numeric policy is enforced
Settlement minimum confirmations1
Settlement policySettlement requires the exact confirmed Bitcoin transaction, the consumed TAP transfer inscription, and the buyer indexed balance at stable checkpoints.
Freshness policyEvery mutation is bound to stable TAP, Ord, Bitcoin Core, and complete-inventory checkpoints; deployment readiness must enforce the configured checkpoint age and lag limits.
Reorg policyThe authority appends reorg observations, reopens or invalidates affected orders deterministically, and preserves funding, broadcast, settlement, and replacement lineage.
Mutation gateExecution requires distinct read and execution credentials, a fresh TAP readiness checkpoint, exact complete inventory, clean funding, immutable economics, and protocol-native post-sign validation.
Unsupported actionsell: TAP has no executable offer workflow on this marketplace surface.

How TAP differs from BRC-20

TAP inherits BRC-20's shape: a JSON payload in an inscription, a deploy, a mint and a two step transfer. The differences are concrete rather than philosophical.

PointBRC-20TAP
Protocol tagbrc-20tap
Operation namesdeploy, mint, transfertoken-deploy, token-mint, token-transfer
Ticker sizeFour bytesUp to 32 UTF-16 code units and 128 UTF-8 bytes
Ticker character setEffectively four ASCII charactersAny Unicode outside the control, format and separator categories, including emoji
Four character tickersThe whole namespaceNot offered by the Bitcoin Universe inscribe surface, which accepts 3 characters or 5 to 32, keeping the two namespaces apart in practice
Extra data on a transferNoneOptional dta, up to 512 UTF-8 bytes, with no protocol meaning
Delegated authorityNoneA deployment may name a privilege authority in prv, and privileged operations then require its authorisation
Batch movementOne transfer inscription per movementtoken-send moves a list of items in one authorised payload
Related asset familiesNone on the same tagThe dmt- family shares the tap tag and is indexed separately
Cursed inscriptionsIgnored by most indexersPlaced in a separate ticker namespace with a leading -
Transfer modelInscribe then sendInscribe then send, identical in shape

The two step transfer is the same in both, which is why a wallet that handles BRC-20 transfer inscriptions safely usually handles TAP ones safely too. The failure mode is also the same: an unsent transfer inscription spent as change loses the parked balance.

Fees and size

Limitations

Security considerations

For holders

For implementers

For marketplace operators

A listing built on a TAP transfer inscription is only as sound as the agreement between the indexer, the ordinals view and Bitcoin Core at one checkpoint. Bitcoin Universe's authority fails closed on a consumed transfer inscription, stale reader state, source or schema disagreement, a tip or reorg race, incomplete inventory, a co-located inscription, runes or special sats on the output, a spent output, and insufficient confirmations. Any of those conditions treated as a warning rather than a refusal is a way to sell something twice.

Implementation checklist

Payload layer

  • Reject a byte order mark rather than stripping it.
  • Decode UTF-8 strictly, with no replacement characters.
  • Require a single JSON object with string keys and string values only.
  • Reject duplicate keys, unknown keys, trailing commas and trailing data.
  • Compare p and op exactly and case sensitively.
  • Cap dta at 512 UTF-8 bytes.

Ticker and amount layer

  • Normalise to NFC lower case, and in transfer content require the written form to already match.
  • Enforce 32 UTF-16 code units and 128 UTF-8 bytes.
  • Reject Unicode control, format and separator characters.
  • Apply the leading - namespace for negative inscription numbers.
  • Enforce the amount grammar and the decimal scale, and cap the atomic value at 78 digits.
  • Reject a declared decimal scale outside 0 to 18.

State layer

  • Track available and transferable balances separately.
  • Ignore a transfer that exceeds the available balance, without partial application.
  • Consume a transfer inscription on its first credited send.
  • Settle a self send back to available.
  • Deduplicate by source row fingerprint so replay is harmless.

Operational layer

  • Pin protocol, chain, network and source identity, and refuse to open a database built for another.
  • Bracket reads with a checkpoint before and after.
  • Quarantine rather than guess, and rewind when the missing evidence arrives.
  • Emit invalidations only on positive replacement evidence.
  • State your coverage honestly, including the absence of a mempool feed.

Test your implementation against the test vectors, and check individual payloads with the validator.