Learn-skills.dev runes
Bitcoin rune operations — check rune balances, list rune-bearing UTXOs, and transfer runes between addresses with Runestone OP_RETURN encoding. Uses the Unisat API for indexing.
git clone https://github.com/NeverSight/learn-skills.dev
T=$(mktemp -d) && git clone --depth=1 https://github.com/NeverSight/learn-skills.dev "$T" && mkdir -p ~/.claude/skills && cp -r "$T/data/skills-md/aibtcdev/skills/runes" ~/.claude/skills/neversight-learn-skills-dev-runes && rm -rf "$T"
data/skills-md/aibtcdev/skills/runes/SKILL.mdRunes Skill
Provides Bitcoin rune operations using the Unisat API for rune indexing and mempool.space for fee estimation and broadcasting. Rune transfers use Runestone OP_RETURN encoding with explicit change pointers to prevent accidental rune burning.
Requires
UNISAT_API_KEY environment variable. Works on both mainnet and testnet.
Usage
bun run runes/runes.ts <subcommand> [options]
Subcommands
balance
Get rune balances for a Bitcoin address. Returns all rune token balances held by the address.
bun run runes/runes.ts balance [--address <addr>]
Options:
(optional) — Bitcoin address to check (uses active wallet's Taproot address if omitted)--address
Output:
{ "address": "bc1p...", "network": "mainnet", "balances": [ { "rune": "UNCOMMONGOODS", "runeId": "1:0", "spacedRune": "UNCOMMON•GOODS", "amount": "1000000", "formatted": "1000000 ⧫", "symbol": "⧫", "divisibility": 0 } ], "summary": { "runeCount": 1 }, "explorerUrl": "https://mempool.space/address/bc1p..." }
utxos
List rune-bearing UTXOs for a specific rune on a Bitcoin address.
bun run runes/runes.ts utxos --rune-id <id> [--address <addr>]
Options:
(required) — Rune ID (e.g.,--rune-id
)840000:1
(optional) — Bitcoin address to check (uses active wallet's Taproot address if omitted)--address
Output:
{ "address": "bc1p...", "network": "mainnet", "runeId": "840000:1", "utxos": [ { "txid": "abc123...", "vout": 0, "satoshis": 546, "runes": [ { "runeId": "840000:1", "spacedRune": "UNCOMMON•GOODS", "amount": "1000000", "formatted": "1000000 ⧫", "symbol": "⧫" } ] } ], "summary": { "utxoCount": 1, "totalSatoshis": 546 } }
transfer
Transfer runes to a recipient address. Builds a transaction with a Runestone OP_RETURN that directs runes to the recipient and returns remaining runes to the sender via an explicit change pointer.
bun run runes/runes.ts transfer --rune-id <id> --amount <amount> --recipient <addr> [--fee-rate fast|medium|slow|<number>]
Options:
(required) — Rune ID (e.g.,--rune-id
)840000:1
(required) — Amount of runes to transfer (in smallest unit)--amount
(required) — Recipient address--recipient
(optional) — Fee rate (default:--fee-rate
)medium
Output:
{ "success": true, "txid": "def456...", "explorerUrl": "https://mempool.space/tx/def456...", "rune": { "runeId": "840000:1", "amount": "500000" }, "recipient": "bc1p...", "fee": { "satoshis": 1800, "rateUsed": "10 sat/vB" }, "btcChange": { "satoshis": 5000 }, "network": "mainnet" }
Safety
- Rune transfers always include an explicit change pointer in the Runestone to avoid burning remaining rune balances
- Cardinal UTXOs from the SegWit address pay fees — rune-bearing UTXOs are never used for fee payment
- The transfer command validates rune balance before building the transaction
Notes
- Runes are typically held at Taproot (bc1p) addresses
- Fee payment comes from the SegWit (bc1q) address
- Requires an unlocked wallet (use
first)bun run wallet/wallet.ts unlock - Set
environment variable for Unisat API accessUNISAT_API_KEY