Your Pod, Your Token

Mint, buy, and withdraw — anchored to Bitcoin
April 2026 · melvin.me · Part 7 of Solid Articles

1. A Pod That Mints

Your pod has a webledger (Part 5). It accepts deposits (Part 3). State is anchored to Bitcoin (Part 6). The next step is obvious: your pod can issue its own token.

Start JSS with a token name and enable multi-chain:

jss start --pay --pay-cost 1 --pay-token PODS --pay-rate 10 --pay-chains "tbtc3,tbtc4"

--pay-token PODS names the token. --pay-rate 10 sets the exchange rate: 10 sats buys 1 PODS token. The first time, the pod mints the token genesis on Bitcoin — a real on-chain transaction that anchors the token's existence.

2. Buy a Token

You have sats in your balance from earlier. Convert them to tokens:

curl -X POST http://localhost:4443/pay/.buy \
  -H "Authorization: Nostr $NIP98_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"amount": 5, "currency": "tbtc4"}'
200 OK
{
  "bought": 5,
  "ticker": "PODS",
  "cost": 50,
  "rate": 10,
  "balance": 416537,
  "unit": "tbtc4"
}

Five PODS tokens. Cost 50 tbtc4 sats (5 × 10 sat rate). The response includes a Bitcoin transaction ID and a full MRC20 state proof — the token transfer is anchored to Bitcoin via blocktrails.

3. Withdraw as MRC20

Tokens on the pod are useful, but they're pod-local. To make them portable — transferable to other pods, verifiable by anyone — withdraw them as an MRC20 proof:

curl -X POST http://localhost:4443/pay/.withdraw \
  -H "Authorization: Nostr $NIP98_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"all": true}'
200 OK
{
  "withdrawn": 5,
  "token": "PODS",
  "state": {
    "to": "did:nostr:5e7617...45af",
    "amount": 5,
    "ticker": "PODS"
  },
  "prevState": { ... },
  "anchor": {
    "pubkey": "...",
    "stateStrings": ["..."]
  }
}

That response is a portable token. The state and prevState form a blocktrail chain. The anchor ties it to Bitcoin. Anyone can verify this proof without trusting your pod.

4. The Token Lifecycle

ActionEndpointWhat Happens
Deposit satsPOST /pay/.depositTXO verified on chain → sat balance credited
Buy tokensPOST /pay/.buySats deducted → tokens minted at pod rate
Use tokensRead paid resourcesPaymentCondition deducts from balance
WithdrawPOST /pay/.withdrawTokens burned → MRC20 proof issued
Deposit tokensPOST /pay/.depositMRC20 proof verified → tokens credited

The MRC20 proof is the bridge. It carries tokens between pods. Deposit it on another pod and the tokens are credited there — verified via the blocktrail anchor, not via trust.

Your pod is a mint

Every pod can issue its own token. Every token is anchored to Bitcoin. Every transfer is a state chain advance. The pod operator sets the name, the rate, and the rules. No permission needed. No listing on an exchange. Just --pay-token and a name.