Issuer Stablecoins
Burn 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
- Get Started
- Accept Issuer Minting Terms
- To enable issuer burn capabilities, contact your BitGo Customer Success Manager (CSM).
Cookbook
Need just the steps? Expand the cookbook for the burn flow:
Burn Issuer StablecoinsOpen Cookbook1. 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"'"
}'
const wallet = await bitgo.coin('ofcteth:usd1').wallets().get({ id: walletId });
await wallet.sendMany({
recipients: [{ address: treasuryWalletAddress, amount: burnAmount }],
sequenceId: order.id,
walletPassphrase,
});
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
}
]
}