1Sat Provenance Remittance for Basket 1sat
Brandon Cryderman / HandCash (brandongcryderman@gmail.com)
Abstract
This BRC defines the provenance remittance carried in BRC-37 customInstructions for outputs in the companion basket profile 1sat (BRC-147). It specifies an offline-verifiable package that binds a current 1-sat outpoint (tip) to a 1Sat Ordinals origin (BRC-159), using BEEF (or AtomicBEEF when it still covers the hop), BRC-159 sat ordering on every path hop, and a valid first ord envelope on the origin (BRC-160).
Together with BRC-147, this enables interoperable 1Sat hold/transfer while preventing forgeable origin: tags from being treated as proof. Verification does not require a global ordinals indexer.
Motivation
BRC-147 documents how wallets hold and transfer 1Sat tips and how they attach display metadata. Those metadata fields remain claims: a malicious or buggy sender can attach another inscription’s origin to an unrelated 1-sat UTXO. Indexer-only checks help UX but introduce a trust dependency when the indexer is wrong, lagging, or unavailable.
BRC-62 / BRC-95 already provide SPV transaction ancestry packages. This BRC applies those formats to the 1Sat tip→origin path (BRC-159) and adds the local script rule that the origin locking script contains a valid first ord envelope (BRC-160, aligned with BRC-67 SPV principles).
Specification
Scope
This remittance applies when:
The output is associated with basket
1satas defined in BRC-147 (after BRC-46 name normalization), andThe tip being transferred or internalized is a 1-satoshi output.
Out of scope: OrdLock marketplace contracts, BSV-20/21, minting APIs, redefinition of 1Sat origin theory (BRC-159), inscription envelope format (BRC-160), and basket naming/tags (see BRC-147).
Transport
Provenance is embedded as the provenance field of the basket profile’s customInstructions JSON object (BRC-37). Display fields (origin, name, app) remain as defined by BRC-147 and MUST NOT be treated as proven unless this remittance verifies.
Wallets that do not implement this BRC MUST still store and forward unknown customInstructions unchanged (BRC-37).
Provenance object (v2)
v
number
MUST
Schema version. This BRC defines 2.
origin
string
MUST
Inscription origin outpoint in underscore form txid_vout.
tip
string
MUST
Current outpoint being proven, underscore form. MUST equal path[0].
path
string[]
MUST
Ordered outpoints tip → … → origin, inclusive. Length ≥ 1.
beefB64
string
MUST
contentType
string
OPTIONAL
Hint from the origin ord envelope content-type field when known.
Outpoint normalization (dot ↔ underscore) follows BRC-147.
Non-conforming versions
Provenance objects with v !== 2, or path-only packages without beefB64, are not defined by this BRC and MUST NOT be considered conforming remittances. Implementations MAY use private fallbacks for local UX; they MUST NOT advertise those fallbacks as this BRC.
Sender requirements
A conforming sender transferring a 1sat tip under BRC-147 SHOULD:
Determine the true
originof the tip (indexer-assisted discovery is allowed for building the package).Prefer extending a prior remittance when the tip (or its immediate parent tip) already carries a verified v2 package: prepend the tip being proven to
pathand merge that tip’s transaction plus preceding input sources needed for BRC-159 sat ordering intobeefB64. Do not re-walk full tip→origin lineage when an inductive extension verifies.Otherwise construct
pathtip→origin such that each consecutive pair with different transaction ids is a BRC-159 1→1 transfer hop: the parent 1-sat outpoint is the child inputvinwhose satoshis land on the childvoutunder sat ordering (sum(input sats before vin) === sum(output sats before vout), and that input is exactly 1 satoshi). A mere spend of the parent as some input is not sufficient — funding inputs that precede the ordinalvincan assign a different sat to the claimed vout.Assemble
beefB64covering every transaction id appearing inpath, and the source transaction of every input that precedes (and including) the ordinal-mappingvinon each hop, so a verifier can calculate the ordinal. Canonical transfers (i01-sat →o01-sat) add nothing beyond the path transactions. Complex hops (funding before the ordinal input, ordinal paid too1+, etc.) MUST include those preceding input sources. Missing sats → the hop cannot be proven; omit provenance rather than guessing.Prefer a full BEEF serialization (BRC-62) for remittance ancestry. AtomicBEEF (BRC-95) keeps only the subject and its recursive SPV dependencies; mined path parents and non-ancestor preceding input sources (funding spent alongside the ordinal) are dropped. AtomicBEEF remains allowed only when it still covers the full
pathand every preceding input source required for sat ordering.Self-verify using the Receiver rules below before broadcast.
If a valid v2 package cannot be produced, the sender MUST NOT claim a verified origin via tags alone. The sender MAY omit
provenance; receivers MUST then treat identity as unverified per BRC-147.
Receiver requirements
Given a candidate tip outpoint T and customInstructions.provenance with v === 2, a conforming receiver MUST verify as follows. On any failure, the receiver MUST treat origin identity as unproven and MUST NOT adopt sender name / app / origin: tags as authoritative for that tip (BRC-147 claims rule).
Structure — The BEEF MUST pass structural validation (e.g.
Beef.verifyValid). Use of txid-only entries (BRC-96) is allowed only when the receiver already trusts those transactions by other means.Atomic subject (when AtomicBEEF) — If the bytes are AtomicBEEF, the subject txid MUST equal the tip’s transaction id (the tip named by
provenance.tipafter normalization).Tip binding (direct) — If
provenance.tipandpath[0]equal tip outpointTafter normalization, continue with steps 5–9 for that package.Tip binding (parent remittance — settle-style) — If step 4 fails, receivers SHOULD accept the package when all of the following hold (soft-latch / pre-broadcast remittance that inherits origin onto held tip
T):provenance.tipandpath[0]name a parent outpointP(notT);the package verifies under steps 5–9 with held outpoint
P(direct tip binding toP);transaction
TspendsPas an inputvin;output
Tis 1 satoshi;BRC-159 sat ordering maps that
vinontoT’s vout. Preceding input source sats forTMUST be known (inbeefB64, linked onT, or otherwise available withT) — fail closed if missing. This inductive hop exists because settle-style transfers often embed remittance for the spent tip before the new tip’s txid is known. Receivers that omit this step remain conforming for direct tip-bound packages but will treat settle-style remittances as unproven unless they rebuild lineage themselves. Receivers that only check “TspendsP” without sat ordering MUST NOT treat origin as proven forT.
Origin binding —
path[path.length - 1]MUST equalprovenance.origin.Ordinal continuity — For each consecutive pair
(child, parent)inpathwith different transaction ids:the child transaction in the BEEF MUST spend
parentas some inputvin;that
vinMUST be the BRC-159 ordinal input for the child vout (sum(input sats before vin) === sum(output sats before vout), input satoshis === 1). If any preceding input’s satoshi value is unknown (source tx missing from the BEEF and not otherwise known), verification MUST fail. For parent-remittance acceptance (step 5), the spend and sat-ordering checkT → Pare applied to transactionT(which MAY be obtained outsidebeefB64, but preceding input sources forTstill MUST be available). An informative outpoint→origin walk is in BRC-159 (Finding origin from an outpoint).
One-sat — For each outpoint in
pathpresent in the BEEF with a known satoshi value, that value MUST be1.Headers (RECOMMENDED) — Receivers SHOULD confirm BEEF merkle roots against a header source / ChainTracker per BRC-67 when available.
On success, the receiver MAY treat provenance.origin as the proven origin for tip T and MAY use indexer metadata keyed by that origin for display.
Hop examples (informative)
These examples show why spend-as-input ≠ sat continuity, and why AtomicBEEF / SPV ancestry ≠ ordinality. Full sat-ordering walks are in BRC-159 (Examples).
Pass (canonical — no extra input sources): token input first, tip at o0.
Sats before i0 = 0, sats before o0 = 0, and i0 is 1 sat → P lands on T. Path edge T → P needs only the path txs in beefB64.
Fail (funding-first — spend alone is not enough):
The tx still spends P as i1, so a spend-only check passes. Sat ordering does not: funding fills o0 first; P’s sat is #5001 and lands in o1 (or as fee), not in o0. A remittance that claims path o0 → P MUST fail — o0 is a funding sat wearing the wrong origin.
If the real tip is the output that received P, beefB64 MUST include the funding source so the verifier can compute the map. AtomicBEEF often drops that funding tx (it is not a tip ancestor); the bag can still look SPV-valid and still cannot prove ordinality → fail closed.
Settle inherit: soft-latch often proves parent P, then the receiver holds new tip T. Checking only “T spends P” accepts the bad o0 above. Step 5 therefore also requires sat ordering of that vin onto T’s vout (preceding sats known).
Relationship to companion BRCs
Origin, sat ordering, transfer, tip→origin walk
ord inscription envelopes
Basket name 1sat, tags, display customInstructions, createAction / internalizeAction flows
provenance object schema + verify/build rules
This BRC
Whether unproven tips may be shown with sender name/app
BRC-147 (claims); this BRC (when proof fails)
Compatibility
This BRC does not alter BRC-62/95 encodings; it only constrains how they are used inside
customInstructions.provenance. BEEF/AtomicBEEF prove SPV ancestry, not BRC-159 sat ordering by themselves.Deep histories may produce large remittances. Implementations SHOULD prefer full BEEF when AtomicBEEF would drop path parents or preceding input sources, and MAY refuse to embed packages above an implementation-defined size, falling back to “unproven” rather than truncated proofs.
Partial BEEF (structurally valid but missing a path transaction or a preceding input source needed for sat ordering) MUST fail verification.
BRC-158 Outpoint BEEF is a binary wire format for the same tip→origin proof (outpoint-subject BEEF envelope). It is an alternative to this JSON remittance, not a
beefB64encoding option inside it. An Outpoint BEEF used for this remittance MUST still carry the preceding input sources required by BRC-159.
Scalability (informative)
Remittance correctness needs path txs plus preceding input sources for sat ordering (BRC-159). Bundle size therefore grows with tip depth. The hot path is one new hop, not a full tip→origin rebuild.
Prefer
Extend a prior verified remittance (sender step 2) — prepend the new tip, merge that tip’s tx and any preceding input sources needed for that hop. Cost stays roughly O(1) per send.
Remember a verified package for the held tip and reuse it on the next send.
Omit provenance when the package would exceed an implementation size budget (see Compatibility). Unproven is better than a truncated proof.
Pin a local verdict after a successful cold verify / genesis hydrate, then discard the large assembled BEEF if it will not travel on the wire.
Avoid
Re-walking tip→origin and re-fetching every hop on every send or every inventory refresh when a prior remittance already verifies.
Preferring AtomicBEEF (or nesting BRC-158 inside
beefB64) to “save bytes” when that drops funding sources needed for sat ordering — the bag looks smaller and still cannot prove the hop.Blocking the UI on an unbounded genesis hydrate — cap hops, allow cancellation, and treat hydrate as cold-start only.
Settle / soft-latch: when the remittance still names spent tip P and the receiver holds new tip T, include (or link) the preceding input sources for T with the package or with T so inherit does not force an extra network hunt to run sat ordering on T → P.
BRC-159 / BRC-160 are not the bottleneck — sat math and envelope parse are cheap. Depth × full BEEF is. Offline proof packaging and size policy live in this BRC (and optionally BRC-158 as a parallel wire format).
Security considerations
Tag spoofing — Without this remittance,
origin:tags are forgeable. Receivers that skip verification reintroduce the attack.Sat ordering vs spend-only — Spending a 1-sat parent does not prove that output received that sat. Verifiers that skip BRC-159 sat ordering can be convinced an unrelated 1-sat output (e.g. a funding slice paid as 1 sat before the ordinal lands) carries the origin — including on settle-style inherit from parent remittance to tip
T.AtomicBEEF omission — AtomicBEEF is an SPV package, not an ordinality package. Do not treat a valid AtomicBEEF as proof that preceding input sources were unnecessary.
Indexer divergence — Indexers may lag or err. A verified remittance is authoritative for tip↔origin binding; indexers remain useful for discovery and media URLs.
Burn / re-origin — If a sat is packed into a multi-sat output, 1Sat origin tracking ends. Remittances MUST NOT invent a continuous path across a burn.
Oversized remittance — Truncating
pathorbeefB64to fit a size budget invalidates the proof; omit provenance instead.Unspent status — This remittance proves tip→origin identity. Proving the tip remains unspent requires the same network / UTXO checks as accepting any BSV payment.
Implementations
HandCash Desktop (reference): builds and verifies provenance v2 on collectable send / list. Source:
src/wallet/oneSatProvenance.ts,src/wallet/oneSatInscription.tsin HandCash/HANDCASH-DESKTOP. ≥ 1.2.130 enforces the rules in this revision: BRC-159 sat ordering on every path hop and on settle-style inherit (Tfrom parent remittanceP), preceding input sources in full BEEF, fail closed when sats are missing. Hot path extends or reuses a prior remittance; full lineage hydrate is cold-start only, with a size budget that omits oversized packages rather than truncating.
References
BRC-159 — 1Sat Ordinals — Single-Satoshi Tokens and Origin Tracking
BRC-160 — 1Sat Ordinals — Inscription Envelopes
BRC-147 — 1Sat Ordinals Basket Profile for BRC-46 / BRC-100
1Sat Ordinals protocol — https://docs.1satordinals.com
BRC-37 — Basket and Custom Instructions Extension for Bitcoin Outpoints
BRC-46 — Wallet Transaction Output Tracking (Output Baskets)
BRC-62 — Background Evaluation Extended Format (BEEF) Transactions
BRC-67 — Simplified Payment Verification
BRC-95 — Atomic BEEF Transactions
BRC-96 — BEEF V2 Txid Only Extension
BRC-158 — Outpoint BEEF
BRC-100 — Unified Open BSV Wallet-to-Application Interface
Last updated
Was this helpful?

