The model
A fungible holding is a set of one-satoshi tips, each carrying an integer amount in base units. The wallet keeps them in storage basketbsv21, and a balance is the sum of the tips it holds for one token id.
The fungible-token path is BSV-21 with BRC-162 binary value locks. It provides the scaling model for token balances and transfers; there is no separate 1Sat fungible-token product surface.
Token calls always prompt, and token view is a separate grant from item view.
Read balances
all later never widens it — the user must approve each new token. listOutputs({ basket: 'bsv21' }) returns 400 USE_PBSV21_SCOPE.
Token vocabulary
Tags
customInstructions
A JSON mirror of the protocol operation, which the wallet uses to index and display the tip:
p must be bsv-20 for the mirror to parse. amt is required for any balance-bearing operation, dec may be 0–18, and maxSupply is accepted as local remittance metadata only — it is not part of the on-chain BRC-162 output. Authority-only operations (deploy+auth, auth) carry no holdings and are not counted as balance.
Symbol and decimals are display metadata carried by the deploy and the remittance. They are not a consensus rule, so never trust a ticker as a unique identifier — the token id is the identity.
Mint a token
An identity-backed mint is acreateAction with an output in basket bsv21 whose operation is deploy+mint, deploy+auth, or mint:
- It writes the wallet’s identity key into the
issuer:tag andcustomInstructions. - It appends a Sigma signature to the deploy locking script when the action’s first input is an output the wallet can attest to. Wallets that later see that signature show the token as issuer-attested.
- It reuses an existing icon for the same issuer and symbol when you did not supply one.
inputBEEF fails rather than proceeding blind. The prompt is titled Mint token and shows the symbol, the supply, and that Pay and auto-pay do not cover it.
Transfer tokens
- Conservation per token id — base units out never exceed base units in. Never round.
- Change is mandatory when the selected tips exceed the amount you are sending. Dropping it destroys value.
- Every tip is one satoshi.
- The payee output carries no sender basket; only your change output goes back into
bsv21. - Parent bodies must be provable. Supply
inputBEEFcovering the spent tips, or verification fails closed. - Cosigned tips do not spend with a plain unlock, and covenant-locked tips are refused outright.
BRC-176 prove failed all surface as errors instead of a downgraded transaction.
Burn tokens
A burn destroys base units: it spends tips, emits no payee token output, and optionally returns change to the holder. The satoshis behind the burned tips are recovered to the wallet. Burn amounts must be positive integers.Receive tokens
Verification
Token provenance is a BRC-176 walk: from a tip back to a fixed-supply deploy, checking that inputs cover outputs for that token id in every transaction along the way. It fails closed on a missing parent body, an over-transfer, a cycle, or an authority output. What that means for your app:- A tip the wallet produced on a send carries a proven subject BEEF.
- Listing a holding does not prove it. Treat
issuerAttestedas an attestation that a signature matches the claimed issuer’s address, not as a full supply audit. - A token with no symbol is displayed by a truncated token id, so ship a
sym:tag if you want a readable name.