Overview

During periods of high transaction volume, transactions with lower fees might get stuck waiting for confirmation in the mempool. If this happens, you can accelerate the transaction by creating a new transaction with a higher fee. The new transaction replaces the original in the mempool and has a higher probability of miners confirming it more quickly, since economic incentives drive miners and validators.

Transaction acceleration differs between UTXO and account-based assets.

You can subscribe to the stuckTx wallet webhook to receive notifications when a transaction becomes stuck. For more information, see Create Wallet Webhooks.

Cookbooks

Need just the steps? Expand a cookbook below to get started:

Account-Based

Accelerate Account-BasedOpen Cookbook

UTXO

Accelerate - UTXO (CPFP)Open Cookbook Accelerate - UTXO (RBF)Open Cookbook

Ethereum, and other EVM blockchains, allow for only one transaction per nonce from a single address. A nonce is a sequential counter for transactions sent from an account. Therefore, you can accelerate a stuck transaction by rebroadcasting the same transaction with the same nonce but with a higher fee.

Prerequisites

Build Acceleration Transaction

Endpoints:

export COIN="<ASSET_ID>"
export WALLET_ID="<YOUR_WALLET_ID>"
export ACCESS_TOKEN="<YOUR_ACCESS_TOKEN>"
export NONCE="<NONCE_OF_STUCK_TRANSACTION>"
export MAX_FEE_PER_GAS="<HIGHER_MAX_FEE_PER_GAS>"
export MAX_PRIORITY_FEE_PER_GASE="<HIGHER_MAX_PRIORITY_FEE_PER_GAS>"

curl -X POST \
  https://app.bitgo-test.com/api/v2/$COIN/wallet/$WALLET_ID/tx/initiate \
  -H 'Content-Type: application/json' \
  -H "Authorization: Bearer $ACCESS_TOKEN" \
  -d '{
    "type": "acceleration",
    "nonce": "'"$NONCE"'",
    "eip1559": {
      "maxFeePerGas": "'"$MAX_FEE_PER_GAS"'",
      "maxPriorityFeePerGas": "'"$MAX_PRIORITY_FEE_PER_GASE"'"
  },
    "recipients": [...] # Use the exact recipients array from the original transaction
  }'

Step Result

{
  "txRequestId": "string",
  "version": 0,
  "latest": true,
  "walletId": "string",
  "walletType": "cold",
  "enterpriseId": "string",
  "state": "initialized",
  "date": {},
  "createdDate": {},
  "userId": "string",
  "initiatedBy": "string",
  "updatedBy": "string",
  "intent": {
    "feeOptions": {
      "unit": "baseUnit",
      "formula": "fixed",
      "feeType": "base",
      "gasLimit": 0,
      "gasPrice": 0
    },
    "intentType": "acceleration",
    "txid": "string",
    "sequenceId": "string",
    "comment": "string",
    "nonce": "string",
    "hopParams": {
      "gasPriceMax": 0,
      "paymentId": "string",
      "userReqSig": "string"
    },
    "receiveAddress": "string",
    "senderAddressIndex": 0
  },
  "intents": [
    {
      "intentType": "stake",
      "sequenceId": "abc123",
      "comment": "string",
      "nonce": "string",
      "memo": "string",
      "stakingRequestId": "string",
      "poolKeyHash": "string"
    }
  ],
  "pendingApprovalId": "string",
  "isCanceled": true,
  "unsignedTxs": [
    {
      "serializedTxHex": "string",
      "signableHex": "string",
      "derivationPath": "string",
      "feeInfo": {
        "feeString": "string",
        "fee": 0
      },
      "coinSpecific": {},
      "parsedTx": {
        "minerFee": "string",
        "spendAmount": "string",
        "spendAmounts": [
          {
            "coinName": "string",
            "amountString": "string"
          }
        ],
        "payGoFee": "string",
        "outputs": [
          {
            "address": "string",
            "isPayGo": true,
            "value": 0,
            "wallet": "string",
            "walletV1": "string",
            "baseAddress": "string",
            "enterprise": "string",
            "valueString": "string",
            "data": "string",
            "change": true,
            "coinName": "string"
          }
        ],
        "inputs": [
          {
            "derivationIndex": 0,
            "value": 0,
            "address": "string",
            "valueString": "string",
            "chain": 0,
            "index": 0
          }
        ],
        "type": "string",
        "memo": "string"
      }
    }
  ],
  "signatureShares": [
    {
      "from": "user",
      "to": "user",
      "share": "string"
    }
  ],
  "commitmentShares": [
    {
      "from": "user",
      "to": "user",
      "share": "string",
      "type": "commitment"
    }
  ],
  "txHashes": [
    "string"
  ]
}

Next

Acceleration transactions follow the transaction flow of their wallet type, and must receive all required signatures and approvals before before broadcasting to the blockchain. To learn more, see Withdraw Overview

After receiving all required signatures and approvals, BitGo broadcasts the transaction to the blockchain. You can view your completed transaction in BitGo or on a blockchain explorer. For UTXO assets, the blockchain explorer may also identify the transaction with an RBF or CPFP flag. Once the network confirms your accelerated transaction on chain, BitGo updates the status of the original transaction to Replaced.

See Also