WARNING:

Playing with gas fees and "nonce" values can have serious consequences. We would strongly advise all customers to select "FAST" transaction speed from API, iOS or TrustVault Web or you run the risk of transactions getting stuck.

Introduction

Ethereum transactions can get "stuck" if the fee is too low. This is because it is not economical for a miner to select the transaction when there are others paying more.

The more you pay per unit of gas (gasPrice) for your transaction the more quickly a miner is incentivised to add it to a block.

What happens if I have a stuck transaction?

No other transaction from that ethereum address (or TrustVault sub-wallet) can be mined. Further transactions are technically possible (although TrustVault prevents queuing transaction for this reason) and they would simply queue behind the stuck one. All ethereum transactions MUST be mined in ascending order so a transaction with a lower nonce MUST be mined before a later one.

This video offers a nice high-level overview of Gas.

Can I delete it the transaction if it gets stuck?

No. There is no mechanism to allow this in Ethereum.

What can I do?

Two real options:

  1. Wait

    1. And hope it gets mined

    2. or hope it drops out of the mempool

  2. Replace the transaction with another transaction

Whats the mempool?

The mempool is where all transactions that haven't been mined yet are kept. Each miner can decide how they share these transactions with each other but most will drop/ignore a transaction if the fee is too low. This could happen in a matter of minutes or it could take weeks.

How can I replace the transaction?

Yes, with the TrustVault API.

You can use the TrustVault API to send a new transaction.

This is an advanced feature that we only recommend experienced users to attempt.

Running the code below via the API will generate a transaction that will be sent for signing as normal (either by API or iOS device). Please ensure you check the values before signing.

mutation replaceTransaction(
$from: String!
$to: String!
$value: String!
$assetSymbol: String!
$nonce: Int!
$gasPrice: String!
) {
createEthereumTransaction(
createTransactionInput: {
ethereumTransaction: {
to: $to
assetSymbol: $assetSymbol
value: $value
gasLimit: "21000"
gasPrice: $gasPrice
fromAddress: $from
nonce: $nonce
}
source: "API"
sendToNetworkWhenSigned: true
sendToDevicesForSigning: true
}
) {
... on CreateEthereumTransactionResponse {
requestId
}
signData {
transaction {
to
fromAddress
value
gasPrice
gasLimit
nonce
chainId
data
}
}
}
}

Query Variables

{
"from": "0xef6df41239a116722c3c03030168418cae4d98e1",
"to":"0xef6df41239a116722c3c03030168418cae4d98e1",
"assetSymbol": "ETH",
"value": "0",
"nonce": 79,
"gasPrice": "120000000000"
}

Notes:

  • The from MUST be the same account sending the transaction

  • The to can be any address, but it is safe to use the same as the from address

  • The assetSymbol. Set this to “ETH"

  • The value. This can be anything but it is safer to set this to zero

  • The nonce MUST be the same nonce as the stuck transaction. This is in integer decimal value. e.g. 10 not 0xA

  • The gasPrice. This is the key attribute it MUST be greater than the stuck transactions. Use a gasTracker to confirm a good high / fast price and add a bit

Please contact Trustology if you need help with understanding stuck transactions

Did this answer your question?