EOS Transactions Stuck in 'Signed' or Failed State
EOS Transactions Stuck in "Signed" or Failed State
Problem
Customers report EOS (and occasionally Vaulta/tEOS) withdrawal transactions that remain stuck in a "signed" state for extended periods (hours) without being broadcast to the EOS blockchain, or transactions that fail outright. The transfer appears in the BitGo UI as "signed" but never confirms on-chain. In some cases, incoming EOS deposits also fail to appear in BitGo wallets due to indexer issues. This is a recurring pattern affecting the EOS coin on BitGo's platform, typically caused by node connectivity problems, transaction expiry, or insufficient balance at broadcast time.
Diagnostics
- Open the internal send-queue diagnostic tool and look up the transaction hash. Check the
statefield — common values areattempted(still retrying) orfailed(permanently failed). - Inspect the
errorfield in the send queue entry. Key error messages to distinguish root causes:Failed to connect to full node -- java.net.SocketTimeoutException: Read timed out→ node connectivity/timeout issueUnsupported response code. Got 400 for POSTwithbody/compression must be boolean→ EOS node configuration issueexpired_tx_exception→ transaction validity window (1 hour for EOS) elapsed before broadcast succeededeosio_assert_message_exceptionwithassertion failure with message: overdrawn balance→ insufficient funds at time of broadcastassert_exceptionwithis_canonical( c ): signature is not canonical→ signing/canonicalization bug (requires engineering)
- Check the
attemptscount — a high number (hundreds/thousands) with a timeout error indicates persistent node unreachability. - Verify the wallet transfer record status:
signedmeans still in queue;failedmeans permanently failed and safe to retry. - Check https://status.bitgo.com/ for any active EOS incidents or recent resolved incidents.
- For missing incoming deposits, check whether the EOS indexer is operational by reviewing recent Slack threads in the relevant DevOps/ETH channels or the status page.
Resolution
Scenario: eos-transaction-signed-failed#node-connectivity-timeout
Trigger: The send queue shows state=attempted with error containing "Failed to connect to full node -- java.net.SocketTimeoutException: Read timed out" and a high attempt count.
Signals: SocketTimeoutException, Read timed out, Failed to connect to full node, state=attempted, EOS signed stuck, pending
Steps:
- Confirm the transaction is stuck in
state=attemptedin the send queue with the timeout error. - Escalate to the DevOps/Engineering team to investigate EOS node connectivity. Reference the relevant internal Slack channels (e.g., DevOps channel).
- Once the node issue is resolved by engineering, check whether the transaction has expired (EOS transactions have a validity window of approximately 1 hour).
- If the transaction has expired, request engineering to move the transaction to a
failedstate so the customer can retry. - Inform the customer that the transaction failed due to node connectivity issues and that they should reinitiate the transaction.
Notes: EOS transfers have a rather short validity window of 1 hour and will fail if they do not get confirmed within that window. Once the node issue is fixed, expired transactions cannot be recovered — they must be retried.
"The transaction fail to hit the node so I have raised this transaction to engineering to get the transaction put into a failed state so you can try create the transaction again." (ticket #206913)
"This was caused by an issue with our EOS nodes which we have since fixed. However, the transaction in question had expired and failed. Please reinitiate the transaction as required and it should go through." (ticket #274550)
"EOS transfers have a rather short validity window of 1 hour and will fail if it does not get confirmed." (ticket #274550)
Scenario: eos-transaction-signed-failed#expired-tx-exception
Trigger: The send queue shows state=failed with error "expired_tx_exception" indicating the transaction exceeded its validity window.
Signals: expired_tx_exception, Operation failed after multiple attempts and will never succeed, EOS failed, expiry
Steps:
- Confirm the transaction shows
state=failedwithexpired_tx_exceptionin the error field. - Verify on the EOS blockchain explorer (e.g., bloks.io) that the transaction hash is not in the block chain.
- Confirm that the transaction has already been moved to
failedstate (no further action needed on the backend). - Inform the customer that the transaction failed due to expiry time being reached, that it will not confirm, and that it can be re-triggered as needed.
- If there is a pattern of repeated expiry failures, escalate to engineering to investigate whether there is an underlying node issue causing broadcast delays.
Notes: This is the expected EOS behavior when a transaction cannot be broadcast within its ~1 hour validity window. No funds are lost — the transaction simply never executed on-chain.
"We are reporting this transaction has failed due to expiry time being reached. This transaction will not confirm and can be re-triggered as needed." (ticket #221474)
Scenario: eos-transaction-signed-failed#overdrawn-balance
Trigger: The send queue shows state=failed with error "eosio_assert_message_exception" and message "assertion failure with message: overdrawn balance".
Signals: overdrawn balance, eosio_assert_message_exception, cf_system.cpp, insufficient funds, EOS failed
Steps:
- Confirm the error message in the send queue contains
assertion failure with message: overdrawn balance. - Review the wallet's transaction history around the time of the failed transaction. Look for multiple concurrent outgoing transactions that collectively exceeded the available balance.
- Explain to the customer that the transaction failed because, at the moment of broadcast, the wallet did not have sufficient EOS balance (likely due to multiple concurrent sends before incoming deposits settled).
- Confirm that the transaction is in
failedstate and the customer can safely retry now that the balance has been replenished or other transactions have settled.
Notes: This commonly occurs when multiple large withdrawals are initiated simultaneously before pending incoming deposits are credited. The on-chain balance at broadcast time was insufficient even though the wallet may show adequate balance afterward.
"The failed transaction happened at 2023-06-19T02:54:12Z which seems there wasn't enough balance to do this transaction at that time, as it was right before the two deposits to the wallets." (ticket #228173)
Scenario: eos-transaction-signed-failed#signature-not-canonical
Trigger: The send queue shows state=failed with error "assert_exception" and message "is_canonical( c ): signature is not canonical".
Signals: is_canonical, signature is not canonical, assert_exception, elliptic_secp256k1.cpp, EOS failed
Steps:
- Confirm the error in the send queue references
elliptic_secp256k1.cppwith messageis_canonical( c ): signature is not canonical. - This is a platform-level signing bug that the customer cannot resolve themselves. Escalate immediately to the Engineering team.
- Reference any existing JIRA tickets or code-red incidents related to EOS canonical signature issues.
- Inform the customer that the Engineering team is investigating and that the failed transaction can be retried once a fix is deployed.
Notes: This issue was associated with a code-red incident (cr-1124) and required an engineering fix. Multiple customers were affected simultaneously.
"We have fixed the cause of these failed EOS transactions and you should no longer see them going forward." (ticket #263434)
Scenario: eos-transaction-signed-failed#indexer-delay-deposits-missing
Trigger: Customer reports incoming EOS deposits are not appearing in their BitGo wallet despite being confirmed on the EOS blockchain explorer.
Signals: EOS deposits missing, indexer, receives not appearing, bloks.io confirmed, EOS receive not found
Steps:
- Ask the customer for the transaction hash and verify it is confirmed on the EOS blockchain explorer (e.g., bloks.io).
- Check https://status.bitgo.com/ for any active or recently resolved EOS indexer incidents.
- If an incident is active, inform the customer that there are delays in EOS sends and receives and direct them to follow the status page for updates.
- If no incident is posted but the issue is confirmed, escalate to engineering/DevOps as a potential EOS indexer issue.
- Once the indexer issue is resolved, deposits should appear automatically. Follow up with the customer to confirm.
Notes: This affected both sends and receives during indexer outages. The resolution is server-side and does not require customer action beyond waiting and retrying.
"We are currently experiencing delays in EOS sends and receives. Meanwhile, please follow our status page for updates https://status.bitgo.com/" (ticket #255098)
"This was caused by an issue with our EOS indexer which is now fixed and all transactions should be confirmed now." (ticket #226791)
Scenario: eos-transaction-signed-failed#node-400-compression-error
Trigger: The send queue shows error with HTTP 400 response containing "body/compression must be boolean" from the EOS node push_transaction endpoint.
Signals: Unsupported response code, Got 400, body/compression must be boolean, push_transaction, FST_ERR_VALIDATION, EOS node
Steps:
- Confirm the send queue error references a 400 response from the
/v1/chain/push_transactionendpoint with messagebody/compression must be boolean. - Escalate to DevOps/Engineering — this indicates a configuration issue with the EOS full node (likely a node software version incompatibility or proxy configuration error).
- Once DevOps resolves the node configuration, check whether the transaction has expired.
- If expired, inform the customer the transaction failed and they should reinitiate.
Notes: This is distinct from a simple timeout — it indicates the node is reachable but rejecting the request format. Requires node-side configuration fix.
Related
- non-bitgo-recoveries — EOS is listed as a supported coin for non-BitGo disaster recovery if wallet access is needed outside the platform
- building-unsigned-wallet-sweep-transactions — EOS wallet sweep procedures for disaster recovery scenarios