Cancel stuck transactions on the Filecoin network
npm install cancel-stuck-transactionsCancel stuck transactions on the Filecoin network.
``js
import { StuckTransactionsCanceller } from 'cancel-stuck-transactions'
import timers from 'node:timers/promises'
import fs from 'node:fs/promises'
const stuckTransactionsCanceller = new StuckTransactionsCanceller({
// Pass a storage adapter, so that pending cancellations are persisted across
// process restarts
store: {
async set ({ hash, timestamp, from, maxPriorityFeePerGas, gasLimit, nonce }) {
await fs.writeFile(
transactions/${hash},transactions/${cid}
JSON.stringify({
hash,
timestamp,
from,
maxPriorityFeePerGas,
gasLimit,
nonce
})
)
},
async list () {
const cids = await fs.readdir('transactions')
return Promise.all(cids.map(async cid => {
return JSON.parse(await fs.readFile())transactions/${hash}
}))
},
async remove (hash) {
await fs.unlink()
},
},
log (str) {
console.log(str)
},
// Pass to an ethers signer for sending replacement transactions
sendTransaction (tx) {
return signer.sendTransaction(tx)
}
})
// Start the cancel transactions loop
;(async () => {
while (true) {
await stuckTransactionsCanceller.cancelOlderThan(TEN_MINUTES)
await timers.setTimeout(ONE_MINUTE)
}
})()
// Create a transaction somehow
const tx = await ethers.createTransaction(/ ... /)
// After you create a transactions, add it as pending
stuckTransactionsCanceller.addPending(tx)
// Start waiting for confirmations
await tx.wait()
// Once confirmed, remove it
await stuckTransactionsCanceller.removeConfirmed(tx)
`
`console`
npm install cancel-stuck-transactions
`js`
import { StuckTransactionsCanceller } from 'cancel-stuck-transactions'
Options:
- store:store.set
- : ({ hash: string, timestamp: string, from: string, maxPriorityFeePerGas: bigint, gasLimit: bigint, nonce: number }) -> Promisestore.list
- : () -> Promise<{ hash: string, timestamp: string, from: string, maxPriorityFeePerGas: bigint, nonce: number }[]>store.remove
- : (hash: string) -> Promiselog
- : (string) -> nullsendTransaction
- : (Transaction) -> Promise
Add tx as pending.
tx should be a
Transaction object
from ethers.js.
Remove tx because it is successful.
Cancel transactions older than ms. Returns the return value ofPromise.allSettled()
for all performed cancellations.
Throws:
- _See cancelTx()_getRecentSendMessage()
- _See _
- _potentially more_
`js`
import { cancelTx } from 'cancel-stuck-transactions'
Helper method that manually cancels transaction tx.
Options:
- tx: ethers.TransactionrecentGasLimit
- : numberrecentGasFeeCap
- : bigintlog
- : (str: string) -> nullsendTransaction
- : (Transaction) -> Promise
Throws:
- err.code === 'NONCE_EXPIRED': The transaction can't be replaced because
it has already been confirmed
- _potentially more_
`js`
import { getRecentSendMessage } from 'cancel-stuck-transactions'
Helper method that fetches a recent SendMessage.
SendMessage has keys (and more):cid
- : stringtimestamp
- : numberreceipt
- : objectgasUsed
- : numbergasFeeCap
- : stringgasLimit
- : number
Throws:
- err.code === 'FILFOX_REQUEST_FAILED': This method relies on filfox.info`.
Requests may fail at any point
- _potentially more_