Litecoin (and UTXO Coin) Withdrawal Failures — Server Errors and Transaction Build Issues

Litecoin (and UTXO Coin) Withdrawal Failures — Server Errors and Transaction Build Issues

Problem

Customers attempting to send Litecoin (LTC) — and in some cases other UTXO-based coins such as BCH, BTG, DASH, and ZEC — encounter server errors when building or sending transactions via both the BitGo UI and API. The errors prevent all withdrawals from the affected wallet. Symptoms include generic "server error" responses with a requestId, HTTP 500 errors on the transaction build endpoint, or keyserver 404 errors referencing PayGo attestation. The issue may affect a single wallet (due to corrupted unspents) or be platform-wide (due to a service incident).

Diagnostics

  • Confirm the coin and wallet affected. Ask for the Wallet ID and coin ticker (ltc, bch, btg, dash, zec).
  • Check the BitGo status page at https://status.bitgo.com/ for any active incidents affecting the coin in question. Look specifically for incidents mentioning "Withdrawal Disruptions" for UTXO coins or PayGo users.
  • Look up the requestId in Grafana/Loki. Search {app="wallet-platform"} |= "<requestId>" to pull the server-side error trace.
  • Identify the specific error message:
    • "Cannot read slice out of bounds" in the stack trace → indicates corrupted/unparseable unspents on the wallet (JIRA: BG-70980).
    • "The keyserver service returned an error status of 404: \"Not Found\", requestId=getPayGoAttestation-..." → indicates a PayGo attestation service outage.
    • Generic "server error requestId=..." with no further detail → check Grafana for the underlying cause.
  • Check unspent count on the wallet using bga wallet unspents. A wallet with many small unspents (hundreds+) is more likely to encounter the "Cannot read slice out of bounds" parsing error.
  • Verify address format. If the customer is sending to an address that starts with "L" or "3" (legacy Litecoin format), they may need to canonicalize it. BitGo requires the M-prefixed address format for LTC.
  • Check if the issue is recurring. This specific "Cannot read slice out of bounds" bug has been observed to recur on wallets that accumulate many small unspents over time.

Resolution


Scenario: litecoin-bitcoin-global-bullish#bad-unspents-cannot-read-slice

Trigger: The Grafana/Loki logs for the requestId show the error "Cannot read slice out of bounds" in the bitcoinjs-lib/utxo-lib stack trace during transaction build.

Signals: Cannot read slice out of bounds, v2.wallet.tx.build 500 error, server error, ltc withdrawal failure, recurring LTC send failure, BG-70980

Steps:

  1. Confirm the error by searching the requestId in Grafana Loki: {app="wallet-platform"} |= "<requestId>".
  2. Verify the wallet has a high unspent count (e.g., hundreds of unspents) using admin tooling (bga wallet unspents).
  3. Escalate to Engineering referencing JIRA ticket BG-70980 ("Cannot Read Slice Out of Bounds"). Provide the wallet ID, coin (LTC), and the requestId.
  4. Engineering will identify and remediate the unparseable/bad unspents residing on the wallet. In prior incidents, over 100 transactions were found that the platform was unable to parse.
  5. Once Engineering confirms the fix, notify the customer that withdrawals should now be operational via both UI and API.
  6. Advise the customer to monitor for recurrence — this issue has been observed to return on wallets that continue to accumulate many small unspents.

Notes: This issue has been observed to recur on the same wallet. It affects LTC specifically and is caused by bad unspents that the UTXO transaction parser cannot deserialize. Resolution timeframes in past incidents ranged from same-day to approximately one week.

"In reviewing this issue, our engineering team found over 100 transactions our platform is unable to parse. They believe this may be a result of bad unspents residing on the wallet." "v2.wallet.tx.build 500 error: Cannot read slice out of bounds" — error trace: "Error: Cannot read slice out of bounds\n at BufferReader.readSlice (/home/node/srv/node_modules/bitcoinjs-lib/src/bufferutils.js:151:13)"


Scenario: litecoin-bitcoin-global-bullish#paygo-keyserver-404

Trigger: The error message contains "The keyserver service returned an error status of 404: "Not Found", requestId=getPayGoAttestation-..." and affects PayGo users on BCH, BTG, DASH, LTC, or ZEC.

Signals: keyserver service, 404 Not Found, getPayGoAttestation, PayGo, BCH, BTG, DASH, LTC, ZEC, BaseRequestError

Steps:

  1. Check https://status.bitgo.com/ for an active or recently resolved incident titled "Withdrawal Disruptions for BCH, BTG, DASH, LTC, and ZEC for PayGo Users" or similar.
  2. If an active incident exists, inform the customer that a known platform issue is affecting PayGo withdrawals and that engineering is working on resolution.
  3. If the incident is marked resolved on the status page, ask the customer to retry their transaction.
  4. If the status page shows resolved but the customer still encounters the error, escalate to Engineering with the requestId and confirm whether the PayGo attestation service is fully restored.

Notes: This is a platform-wide issue affecting all PayGo users on the listed coins, not specific to a single wallet. Resolution is handled by Engineering via the code red process.

"We confirm that this was due an issue (Withdrawal Disruptions for BCH, BTG, DASH, LTC, and ZEC for PayGo Users) at our end today which has been resolved:- https://status.bitgo.com/incidents/f6x0lcht02ts"

Scenario: litecoin-bitcoin-global-bullish#platform-wide-wallet-loading-outage

Trigger: The customer reports that Bitcoin and/or Litecoin wallets fail to load entirely (balances not visible, transactions impossible) in both UI and API, and multiple customers are reporting the same symptom simultaneously.

Signals: wallet loading, wallets not visible, balance not showing, platform outage, UI and API, btc, ltc

Steps:

  1. Check https://status.bitgo.com/ for a current platform-wide incident affecting wallet loading.
  2. Inform the customer: "We are aware of issues with loading wallets with the UI and API. We are working diligently to fix the issue."
  3. Monitor the internal incident channel for Engineering's resolution update (in past incidents, a rollback of changes was performed).
  4. Once resolved, follow up with the customer: "We have completed the roll back of changes and are now seeing wallets and balances available again. Transactions should be possible once more via both API and UI."
  5. Ask the customer to confirm functionality is restored.

Notes: This is a platform-wide outage, not wallet-specific. Resolution is entirely on the Engineering side.

"We have completed the roll back of changes and are now seeing wallets and balances available again. We continue to monitor this issue carefully. This should also be resolved in the API as well. Transactions should be possible once more via both API and UI."

Scenario: litecoin-bitcoin-global-bullish#ltc-address-format

Trigger: The customer is attempting to send LTC to an address that does not use the M-prefix format expected by BitGo, and the transaction fails or returns an address validation error.

Signals: LTC address format, canonicalize, M-address, L-address, invalid address, litecoin address

Steps:

  1. Ask the customer for the destination address they are attempting to send to.
  2. If the address starts with "L" or "3" (legacy Litecoin P2SH format), instruct them to canonicalize it using the BitGo Express endpoint: https://developers.bitgo.com/api/express.canonicaladdress
  3. This will convert the address format to one that starts with "M" so it can be used on the BitGo platform.
  4. Have the customer retry the send using the canonicalized M-prefixed address.

Notes: BitGo's LTC implementation requires the M-prefix address format. This is not a server-side error but a client-side address format issue. If the customer already uses an M-address and still gets errors, investigate for the "Cannot read slice out of bounds" scenario instead.

"You will need to Canonicalize the LTC address to use on our platform. https://developers.bitgo.com/api/express.canonicaladdress This will convert the address format to an address that starts with an 'M' so it can be sent from your wallet."

Related