Basket and Custom Instructions Extension for Bitcoin Outpoints
An output on its own says nothing about which application it belongs to or what it is for. This adds a way to tag one with the group it belongs to, and with instructions whose meaning that group defines.
Summary
- Why
- Wallets need a common way to say which named group an output belongs to and to carry extra notes about it, without forcing every wallet to agree on what those notes mean.
- What
- BRC-37 is a small extension to the BRC-36 output object that adds a required basket name and an optional field for basket-defined custom instructions.
- How
- A developer adds a basket field naming the collection an outpoint belongs to, and, if that basket defines a convention for it, a customInstructions field whose contents only software that understands that basket needs to parse.
What this lets you do
- Tag an outpoint with the basket it belongs to
- Attach basket-specific custom instructions to an outpoint
- Pass unrecognized customInstructions through unchanged instead of dropping them
- Build basket-specific conventions, like a BRC-29 payment context, on top of a shared field
- Interoperate across wallets without agreeing on a universal instruction schema
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-37 accurately, including what it depends on.
The specification
Abstract
This document defines a minimal extension to BRC-36 for associating a Bitcoin outpoint with a wallet basket and, optionally, with custom instructions whose meaning is defined by that basket. The purpose of this extension is to support interoperable wallet-managed output organization without standardizing wallet-internal classification systems or forcing a universal instruction schema.
Motivation
Modern wallets do more than merely store outputs. They organize outputs into permissioned collections, often called baskets, and attach application-relevant metadata needed to later interpret or spend those outputs. This pattern is reflected in BRC-46, BRC-100, and current Wallet Toolbox implementations.
The original version of BRC-37 used a broad spendingInstructions
concept whose structure was left entirely to wallet software. That
approach was too vague to provide meaningful interoperability. This
revision keeps the extension intentionally small and precise: it
standardizes basket association and optional custom instructions, while
leaving basket-specific semantics to the basket itself and the
higher-layer protocols that use it.
Specification
Extended Object
A BRC-37 object is a BRC-36 object extended with the following fields:
basket(required): The basket with which the outpoint is associated.customInstructions(optional): Basket-defined custom instructions associated with the outpoint.
Semantics
- The
basketfield identifies the basket context in which the output is to be interpreted. - The meaning of
customInstructions, when present, is determined by the basket named inbasket. - BRC-37 does not define a universal schema for
customInstructions. - BRC-37 does not require every basket to use
customInstructions. - Software that understands a basket's semantics may interpret the
corresponding
customInstructionsvalue. Software that does not understand that basket may still transport or store the value unchanged.
Scope Boundaries
BRC-37 does not standardize:
- wallet-internal state such as
spendableorchange - wallet-specific classification fields such as
purposeortype - storage relations such as spending links, sequence bookkeeping, or script offsets
- a general schema for all possible spending metadata
Those concerns remain outside the scope of this specification unless separately standardized by another BRC.
Example Guidance
The following examples are non-normative and illustrative only.
Basket-Defined Meaning
A wallet may define a basket whose outputs all use the same
customInstructions convention. Software that requests outputs from
that basket can then interpret customInstructions according to the
basket's documented semantics.
BRC-29 Example
In one possible implementation, outputs placed in the default basket
may represent BRC-29 payments. In that context,
customInstructions could contain a JSON-serialized object carrying
payment-related context such as a sender identity key, derivation
prefix, derivation suffix, or other information useful to the
receiving wallet or application.
This example is illustrative only. BRC-37 does not require the
default basket to behave this way, nor does it impose a universal
JSON schema for such instructions.
Relationship to Other Standards
- BRC-36 defines the portable base output object.
- BRC-46 defines basket-oriented wallet behavior.
- BRC-100 defines the current interoperable wallet interface through which basket-associated outputs are commonly exchanged.
Example
{
"outpoint": "7001295a287fee8e7ad5de58ed30bd61923977ddc9b7a44830ebb9a68b12dc39.0",
"satoshis": 500,
"lockingScript": "76a9148055582669432149141abcf887fced6881f7404288ac",
"tx": "01010101...",
"basket": "default",
"customInstructions": "{\"senderIdentityKey\":\"03...\",\"derivationPrefix\":\"...\",\"derivationSuffix\":\"...\"}"
}
Implementation
Implementations of BRC-37 should adhere to the following guidelines:
- Preserve unknown
customInstructionsvalues unchanged when transporting or storing BRC-37 objects. - Define basket-specific semantics in the protocol or implementation documentation for that basket.
- Avoid treating BRC-37 as a general container for arbitrary wallet-internal state.