Issuer Stablecoins

Overview

Issuer burns let you permanently remove your stablecoin from circulation without redeeming fiat or paying standard burn fees. Burning requires a token deposit before BitGo settles the on-chain burn.

Prerequisites

Cookbook

Need just the steps? Expand the cookbook for the burn flow:

Burn Issuer StablecoinsOpen Cookbook

1. Create Burn Order

Create an issuer-direct burn order.

Note

Creating the order does not move tokens. You must have the burn amount available in your wallet.

Endpoint: Create Issuer Stablecoin Order

export ENTERPRISE_ID="<YOUR_ENTERPRISE_ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"
export ASSET_ID="<YOUR_ASSET_ID>"
export WALLET_ID="<DESTINATION_WALLET_ID>"

curl -X POST \
  https://app.bitgo-test.com/api/stablecoin/v1/enterprise/$ENTERPRISE_ID/issuer/orders \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "type": "burn",
    "asset": "'"$ASSET_ID"'",
    "amount": "100000000000000000000",
    "destinationType": "go_account",
    "destinationWalletId": "'"$WALLET_ID"'"
  }'

Step Result

The response returns the created order, including the id you use as the sequenceId in the next step.

{
  "id": "95bdbd9c-9cdc-41a4-ae70-165387b7aa51",
  "type": "burn",
  "status": "created",
  "orderMethod": "issuer_direct",
  "asset": "eth:usd1",
  "fromAsset": "eth:usd1",
  "fromAmount": "100000000000000000000",
  "toAsset": "eth:usd1",
  "toAmount": "100000000000000000000",
  "destinationWalletId": "8iMXoeSpS1d1ziEJ",
  "destinationAddress": "d526909b2398a6d579c817dc07fc9d72",
  "enterpriseId": "67bc4ae090e8af8f9b412d3d67e85252",
  "transactions": [],
  "createdAt": "2025-04-04T09:25:48.216Z",
  "updatedAt": "2025-04-04T09:25:48.216Z"
}

2. Deposit Tokens to BitGo

Transfer the stablecoin to BitGo to fund the burn. Use the order id as the sequenceId so BitGo can match the deposit to this order.

Endpoint: Send Transaction

export BITGO_EXPRESS_HOST="<YOUR_LOCAL_HOST>"
export COIN="<ASSET_ID>"
export WALLET_ID="<YOUR_WALLET_ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"
export TREASURY_ADDRESS="<TREASURY_WALLET_ADDRESS>"
export AMOUNT="<BURN_AMOUNT_IN_BASE_UNITS>"
export WALLET_PASSPHRASE="<YOUR_WALLET_PASSPHRASE>"
export SEQUENCE_ID="<ORDER_ID>"

curl -X POST \
  http://$BITGO_EXPRESS_HOST/api/v2/$COIN/wallet/$WALLET_ID/sendcoins \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "address": "'"$TREASURY_ADDRESS"'",
    "amount": "'"$AMOUNT"'",
    "walletPassphrase": "'"$WALLET_PASSPHRASE"'",
    "sequenceId": "'"$SEQUENCE_ID"'"
  }'

Step Result

{
  "coin": "ofcteth:usd1",
  "transfers": [
    {
      "id": "6437d9f07d6a87000613e6c06e4218d3",
      "coin": "ofcteth:usd1",
      "wallet": "8iMXoeSpS1d1ziEJ",
      "value": -100000000000000000000,
      "baseValue": -100000000000000000000,
      "state": "unconfirmed",
      "type": "send"
    }
  ]
}

3. Check Burn Orders

Fetch burn orders across all assets your enterprise issues.

Endpoint: List Issuer Stablecoin Orders

export ENTERPRISE_ID="<YOUR_ENTERPRISE_ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"

curl -X GET \
  https://app.bitgo-test.com/api/stablecoin/v1/enterprise/$ENTERPRISE_ID/issuer/orders \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Step Result

{
  "orders": [
    {
      "asset": "eth:usd1",
      "destinationWalletId": "8iMXoeSpS1d1ziEJ",
      "destinationAddress": "d526909b2398a6d579c817dc07fc9d72",
      "userId": "test-user",
      "clientDepositTxHash": "string",
      "transactions": [
        {
          "type": "clientDeposit",
          "txHash": "512f64d10b5f358f6dbf3303f90013cfa46006b02a03282456d6bd6432cc5daf",
          "asset": "eth:usd1",
          "amount": "500",
          "status": "confirmed",
          "createdAt": "2025-04-04T09:26:21.600Z",
          "updatedAt": "2025-04-04T09:26:21.600Z"
        }
      ],
      "memo": "Payment for invoice #1234",
      "createdAt": "2025-04-04T09:25:48.216Z",
      "updatedAt": "2025-04-04T09:55:09.136Z",
      "fromAssetId": "08c1271e-b15d-4af8-8929-f75383903da4",
      "toAssetId": "49ff49ea-3355-4717-bbb0-5e8f5cae2202",
      "fromAsset": "eth:usd1",
      "fromAmount": "500",
      "toAsset": "eth:usd1",
      "toAmount": "5000000",
      "orderMethod": "issuer_direct",
      "id": "95bdbd9c-9cdc-41a4-ae70-165387b7aa51",
      "type": "burn",
      "status": "fulfilled",
      "enterpriseId": "67bc4ae090e8af8f9b412d3d67e85252"
    }
  ]
}
Burn Order Status Lifecycle
Status Description
created Order submitted; initial state.
confirmed_token_deposit Token deposit verified in the designated burn address.
initiated_burn_token_transfer Token transfer to the burn address is in flight.
completed_burn_token_transfer Token transfer to the burn address is complete.
triggering_burn On-chain burn transaction is being initiated.
completed_burn Tokens permanently removed from circulation on-chain.
fulfilled Tokens burned and supply permanently reduced.
failed_burn_transaction An error occurred while initiating the burn.
failed_burn_token_transfer An error occurred while initiating the token transfer.
failed_to_burn The blockchain burn transaction failed or was rejected.
rejected Order rejected.
expired Order expired before completion.

4. Get an Orders Summary (Optional)

Retrieve aggregated burn amounts and counts, broken out by asset.

Endpoint: Issuer Orders Summary

export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"

curl -X GET \
  https://app.bitgo-test.com/api/stablecoin/v1/issuer/orders-summary \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN"

Step Result

{
  "byAsset": {
    "key": {
      "chain": "hteth",
      "decimals": 18,
      "burn": {
        "amount": "110002428000000000000000000",
        "count": 12,
        "byStatus": {
          "created": {
            "amount": "45000000000000000000000000",
            "count": 5
          }
        }
      }
    }
  },
  "timeSeries": [
    {
      "period": "2024-01-01T00:00:00.000Z",
      "mintAmount": "1000000000000000000000",
      "mintCount": 5,
      "burnAmount": "500000000000000000000",
      "burnCount": 3
    }
  ]
}

See Also