Blockstream Enterprise Custody SDK
Issuer Guide (SDK)

Reissue and burn

Reissue increases asset supply. Burn decreases asset supply. The page explains prerequisites, PSET handling, supply notes, and error scenarios.

Reissue increases asset supply. Burn decreases it. Both follow the standard PSET lifecycle: request -> sign -> cosign -> broadcast.

Reissue (increase supply)

Reissuance mints additional tokens of an existing asset. It requires the reissuance token that was created during the original issuance.

Prerequisites

  • The wallet holds the reissuance token for this asset.
  • The asset is not locked.
  • The reissuance token must be unlocked by tokenId (see Asset Unlock)
  • The wallet is not locked.
  • The wallet has LBTC for fees.

Request the reissue PSET

import {
  AmpReissueAssetRequestSchema,
  AmpActions,
} from '@blockstream/amp-registry';

const reissueReq = AmpReissueAssetRequestSchema.parse({
  action: 'add',
  resource: `/amp/assets/${assetId}/reissue`,
  details: {
    wid: walletHoldingReissuanceToken,
    satoshi_to_reissue: 500_000,
  },
});

const reissueResponse = await broadcastRequest<
  typeof AmpActions.reissue
>(reissueReq, broadcaster);

if (reissueResponse.status !== 'success') {
  throw new Error(
    `Reissue failed: ec=${reissueResponse.error_code} message=${reissueResponse.message}`
  );
}

const pset = reissueResponse.details.pset;

Complete the PSET flow

import {
  AmpSignPsetRequestSchema,
  AmpBroadcastRequestSchema,
} from '@blockstream/amp-registry';

// Sign locally
const signedPset = signWithLwk(pset);

// Cosign
const cosigned = await broadcastRequest<
  typeof AmpActions.sign
>(
  AmpSignPsetRequestSchema.parse({
    action: 'add',
    resource: '/amp/wallets/sign',
    details: { pset: signedPset.toString() },
  }),
  broadcaster,
);

// Broadcast
const broadcast = await broadcastRequest<
  typeof AmpActions.broadcast
>(
  AmpBroadcastRequestSchema.parse({
    action: 'add',
    resource: '/amp/wallets/broadcast',
    details: { pset: cosigned.details.pset },
  }),
  broadcaster,
);

const txid = broadcast.details.txid;

The newly minted tokens are deposited in the same wallet that holds the reissuance token.

Burn (decrease supply)

Burning permanently destroys tokens, reducing the total supply. The destroyed tokens are provably unspendable on chain.

Prerequisites

  • The wallet holds the tokens to burn.
  • The asset is not locked.
  • The wallet is not locked.
  • If restrictions are set, canBurn must be true for this wallet's restriction group.
  • The wallet has LBTC for fees.

Request the burn PSET

import {
  AmpBurnAssetRequestSchema,
} from '@blockstream/amp-registry';

const burnReq = AmpBurnAssetRequestSchema.parse({
  action: 'add',
  resource: `/amp/assets/${assetId}/burn`,
  details: {
    wid: walletHoldingTokens,
    satoshi: 10_000,
  },
});

const burnResponse = await broadcastRequest<
  typeof AmpActions.burn
>(burnReq, broadcaster);

if (burnResponse.status !== 'success') {
  throw new Error(
    `Burn failed: ec=${burnResponse.error_code} message=${burnResponse.message}`
  );
}

const pset = burnResponse.details.pset;

Complete the PSET flow

Same as reissue: sign, cosign, broadcast:

const signedPset = signWithLwk(pset);

const cosigned = await broadcastRequest<
  typeof AmpActions.sign
>(
  AmpSignPsetRequestSchema.parse({
    action: 'add',
    resource: '/amp/wallets/sign',
    details: { pset: signedPset.toString() },
  }),
  broadcaster,
);

const broadcast = await broadcastRequest<
  typeof AmpActions.broadcast
>(
  AmpBroadcastRequestSchema.parse({
    action: 'add',
    resource: '/amp/wallets/broadcast',
    details: { pset: cosigned.details.pset },
  }),
  broadcaster,
);

const txid = broadcast.details.txid;

Supply management notes

  • Reissue is only possible if a reissuance token exists. If you created the asset with satoshi_token: 0, the supply is permanently fixed.
  • Burns are irreversible. Once broadcast and confirmed, the tokens cannot be recovered.
  • Track supply changes. Use the balance and UTXO endpoints to verify supply after each operation.
  • Reissuance tokens can be transferred. If you move the reissuance token to a different wallet, reissue operations must be initiated from that wallet.

Error scenarios

ErrorCauseResolution
No reissuance tokenWallet doesn't hold the reissuance tokenCheck which wallet holds it
Asset lockedAsset is in locked stateUnlock the asset first
Wallet lockedWallet is in locked stateUnlock the wallet first
canBurn is falseRestriction group prohibits burningUpdate restriction to allow burn
Insufficient balanceNot enough tokens to burn or LBTC for feesCheck balances

Next steps

On this page