1Sat Ordinals Basket Profile for BRC-46 / BRC-100
Wallets and applications both need to agree on where collectible items live and how they are described. This reserves the group name and pins down what may go in it and how it is labelled.
Summary
- Why
- Wallets need a common, interoperable way to store, label, and move 1-satoshi ordinal coins so they are not confused with ordinary spendable money or mishandled by other wallets.
- What
- BRC-147 defines a standard basket named "1sat" and a metadata format for holding, listing, transferring, and importing 1Sat Ordinals inscriptions in BRC-46/BRC-100 wallets.
- How
- A wallet stores each 1-satoshi inscription output in a basket called "1sat" with optional tags like ordinal and origin, plus a customInstructions JSON string carrying origin, name, app, and provenance fields, then uses listOutputs, createAction, and internalizeAction to list, send, and import these tips while treating…
What this lets you do
- Hold 1-satoshi inscription outputs in a shared basket named 1sat
- List and filter held ordinals using tags and custom instructions
- Transfer an ordinal tip while carrying origin and provenance claims
- Import an existing ordinal into a wallet via internalizeAction
- Require separate authorization so ordinals are not spent as ordinary payments
Written by claude-sonnet-5 from the specification text. Where the two differ, the original is correct.
Reference for an AI
Everything an assistant needs to answer questions about BRC-147 accurately, including what it depends on.
The specification
Abstract
This BRC defines the application basket profile for 1Sat Ordinals under BRC-46 / BRC-100. It reserves the basket name 1sat, specifies eligibility of outputs placed in that basket, documents the tag vocabulary and BRC-37 customInstructions schema used for display and remittance, and describes normative hold / list / transfer / import flows via existing wallet interface methods.
It does not redefine 1Sat Ordinals origin theory. Offline tip→origin proof is specified in the companion BRC-150.
Motivation
BRC-37 deliberately leaves customInstructions semantics to the named basket. BRC-46 enables token-like tracking in baskets but does not define a 1Sat profile. Without a shared basket name and metadata contract, wallets cannot reliably:
- Hold the same inscription UTXOs in a common basket.
- List and filter collectables for apps and UI.
- Transfer a 1-sat tip while preserving origin claims for the receiver.
- Import historical ordinals via
internalizeActionwith interoperable remittance.
Existing deployments (including HandCash Desktop) already use basket 1sat with overlapping tags and JSON instructions. This BRC records that convention so independent wallets can interoperate without trusting a single vendor.
Specification
Basket identifier
- The basket name is the UTF-8 string
1sat. - Per BRC-46, wallet implementations normalize basket identifiers by trimming whitespace and lowercasing. After normalization, conforming use of this profile MUST use exactly
1sat. - This identifier does not use the BRC-99 reserved
pprefix. It is a standard application basket under BRC-46 permissioning (grant / deny access to the basket as a whole, unless a futurep-scheme supersedes that for assets).
Eligibility
An output SHOULD be placed in basket 1sat only when all of the following hold:
satoshis === 1.- The output is intended as a 1Sat Ordinals tip (a 1-satoshi UTXO in an inscription ownership chain), per 1Sat Ordinals.
- The sender or importer reasonably believes the tip belongs to a 1Sat origin (the first 1-sat outpoint carrying a valid first
ordenvelope on that sat).
Wallets MUST NOT place ordinary payment change or multi-sat outputs into 1sat merely to attach ordinal-looking tags.
Outputs that fail eligibility MAY still appear if a buggy sender used the basket; receivers SHOULD treat such outputs as malformed for this profile and MUST NOT present them as verified inscriptions solely because of basket membership.
Outpoint encoding
- BRC-100 wire
outpointfields use dot form:txid.vout(see BRC-100 / BRC-36 practice). - 1Sat Ordinals / OrdFS commonly use underscore form:
txid_vout. - Conforming implementations MUST treat
txid.voutandtxid_voutas the same outpoint whentxidis 64 hex chars andvoutis a non-negative decimal integer. - Inside this profile’s
customInstructionsobject,originSHOULD use underscore form for consistency with 1Sat indexers. Tags MAY use either form after theorigin:prefix; readers MUST normalize before comparison.
Tags
Tags are optional BRC-46 / BRC-100 output tags used for filtering and display hints. They are non-authoritative for asset identity.
| Tag | Requirement | Meaning |
|---|---|---|
ordinal | SHOULD on conforming transfers and imports | Marks the output as an ordinal/inscription tip under this profile. |
origin:<outpoint> | SHOULD when origin is known | Claimed inscription origin (dot or underscore form). |
name:<string> | MAY | Short display name (implementations SHOULD truncate to ≤ 80 UTF-8 code units when writing). |
app:<string> | MAY | Creator / application id for filtering (SHOULD truncate to ≤ 40). |
collection:<id> / collectionId:<id> | MAY | Collection filter keys (synonyms). |
creator:<id> / author:<id> | MAY | Creator filter keys (synonyms of / complements to app:). |
Unknown tags MUST be preserved when transporting the output (BRC-37 / BRC-46 spirit). Tag query via listOutputs uses existing tags / tagQueryMode fields.
Custom instructions (BRC-37)
When present for basket 1sat, customInstructions MUST be a UTF-8 JSON object serialized as a string (matching BRC-37 examples). Conforming writers SHOULD emit:
{
"origin": "<txid_vout>",
"name": "<display name>",
"app": "<optional creator/app id>",
"provenance": { }
}
| Field | Type | Requirement | Meaning |
|---|---|---|---|
origin | string | SHOULD | Claimed origin outpoint (underscore form preferred). |
name | string | MAY | Display name. |
app | string | MAY | Creator / application id. |
provenance | object | SHOULD on transfer when available | Provenance remittance; schema and verification rules are defined only in BRC-150. |
Additional JSON keys are permitted and MUST be ignored by readers that do not understand them. Readers that do not understand provenance MUST still store and forward the entire string unchanged (BRC-37).
Claims vs proof
origin,name,app, and all tags are claims.- A wallet MUST NOT treat a claimed
originas proven solely because it appears in tags orcustomInstructions. - Proven tip→origin binding is defined by BRC-150. When that remittance is absent or fails verification, the wallet MUST treat identity as unproven and SHOULD avoid presenting sender-supplied
name/appas authoritative for that tip.
Hold and list
Applications list held tips with BRC-100 listOutputs:
{
"basket": "1sat",
"includeTags": true,
"includeCustomInstructions": true
}
Optional tags / tagQueryMode filters apply as in BRC-46. Wallets MAY require basket permission per BRC-46 / BRC-100 before returning outputs.
Transfer (send)
A conforming transfer of a held 1sat tip SHOULD use BRC-100 createAction with:
- An input spending the current tip outpoint (
satoshis === 1). - An output with
satoshis: 1,basket: "1sat", tags per this profile, andcustomInstructionsas above. - Prefer supplying
inputBEEF/ AtomicBEEF for the spent tip when available (BRC-62, BRC-95) so the new owner can validate the spend graph. - Action
labelsMAY include1satfor activity filtering; labels are non-normative for asset identity.
Example (non-normative shape):
{
"description": "Send Collectable",
"labels": ["1sat"],
"inputs": [{ "outpoint": "<tip txid.vout>", "inputDescription": "1sat collectable" }],
"outputs": [{
"lockingScript": "<recipient P2PKH or other 1-sat lock>",
"satoshis": 1,
"outputDescription": "Collectable transfer",
"basket": "1sat",
"tags": ["ordinal", "origin:<txid.vout>", "name:Example"],
"customInstructions": "{\"origin\":\"<txid_vout>\",\"name\":\"Example\",\"provenance\":{}}"
}]
}
Senders SHOULD attach BRC-150 provenance remittance when they can build a valid package. Senders that cannot prove origin MUST NOT present the transfer as a verified inscription transfer; they MAY still move the 1-sat UTXO, but receivers will treat identity as unproven.
Import / receive (internalizeAction)
To place an existing tip into basket 1sat, use BRC-100 internalizeAction with protocol basket insertion (BRC-46):
{
"tx": "<AtomicBEEF bytes for the tip transaction>",
"description": "Import 1Sat ordinal",
"labels": ["1sat"],
"outputs": [{
"outputIndex": 0,
"protocol": "basket insertion",
"insertionRemittance": {
"basket": "1sat",
"tags": ["ordinal", "origin:<txid.vout>"],
"customInstructions": "{\"origin\":\"<txid_vout>\",\"name\":\"Example\"}"
}
}]
}
insertionRemittance.customInstructions follows the same schema as transfer. Provenance MAY be omitted on import when the importer verifies origin by other means before insertion; once transferred onward, senders SHOULD attach provenance for the new tip.
Payment separation (wallet policy guidance)
Spending or revealing 1sat basket outputs is not a BRC-29 / default-basket payment. Conforming wallets SHOULD:
- Require distinct user authorization (or a dedicated item/basket grant) before
createAction/relinquishOutputthat spends1satoutputs. - Not treat a general “pay” or auto-pay grant as authorization to spend
1sattips. - Not fund ordinary payment outputs from
1satbasket UTXOs.
Normative fine-grained asset permission schemes remain BRC-99 territory and are out of scope for this profile.
Compatibility
- Wallets that do not implement this profile MUST still store and forward unknown baskets’
customInstructionsand tags unchanged (BRC-37). - This profile does not conflict with BRC-99
pbaskets; future permission-wrapped variants MAY wrap1satsemantics under ap <scheme> …name without invalidating this profile for the plain1satbasket. - Marketplaces (e.g. OrdLock), BSV-20/21, and mint APIs are out of scope.
Security considerations
- Tag / metadata spoofing — Without provenance verification, a sender can attach another inscription’s
originandname. See BRC-150. - Basket pollution — Placing non-1-sat or non-ordinal outputs in
1satconfuses list UIs; receivers should re-checksatoshisand inscription rules. - Burn — Per 1Sat Ordinals, packing a sat into a multi-sat output ends that origin trail. Do not continue
origin:claims across a burn. - Indexer trust — Display media URLs and collection metadata often come from indexers; this profile does not make indexers authoritative for tip→origin binding.
Implementations
- HandCash Desktop (reference): basket
1satlist / send / import; tags andcustomInstructionsas above; payment grants never cover item spends.
Source:src/wallet/collectables.ts,src/wallet/oneSatImport.ts,src/wallet/itemAccess.tsin HandCash/HANDCASH-DESKTOP.
References
- 1Sat Ordinals — https://docs.1satordinals.com
- BRC-37 — Basket and Custom Instructions Extension for Bitcoin Outpoints
- BRC-45 — Outputs are Tokens
- BRC-46 — Wallet Transaction Output Tracking (Output Baskets)
- BRC-62 — BEEF Transactions
- BRC-95 — Atomic BEEF Transactions
- BRC-99 — P Baskets (reserved permission schemes)
- BRC-100 — Unified Open BSV Wallet-to-Application Interface
- BRC-150 — 1Sat Provenance Remittance for Basket
1sat