Could someone point me to how to use get_action_traces
to get notification when certain transaction is created and when it's irreversible?
How should I structure the code?
EOS.IO Stack Exchange is a question and answer site for users and developers of distributed applications built on top of the blockchain operating system, EOS.IO. It only takes a minute to sign up.
Sign up to join this communityThere is currently no direct way to get notified when a certain transaction is created. You will need to use both get_action_traces and get_transaction_lifecycle to achieve what you want.
The overall idea is the following:
execution_irreversible
is true
(meaning the transaction is now irreversible).Here a quick example using eosws-js that does that:
import { socketFactory, runMain, waitFor } from "./config"
import {
EoswsClient,
InboundMessage,
InboundMessageType,
createEoswsSocket,
ActionTraceData,
ErrorData,
TransactionData
} from "@dfuse/eosws-js"
const CONTRACTS = ["eosmechanics", "eosknightsio", "eosiotokener"]
const client = new EoswsClient(createEoswsSocket(socketFactory))
let actionStream: any
let transactionStream: any
let terminate = false
let transactionListening = false
const onMessage = (message: InboundMessage<any>) => {
switch (message.type) {
case InboundMessageType.ERROR:
const error = message.data as ErrorData
console.log(`Received error: ${error.message} (${error.code})`, error.details)
break
case InboundMessageType.ACTION_TRACE:
onActionMessage(message)
break
case InboundMessageType.TRANSACTION_LIFECYCLE:
onTransactionMessage(message)
break
}
}
const onActionMessage = (message: InboundMessage<any>) => {
const data = message.data as ActionTraceData<any>
const action = data.trace.act
if (!transactionListening) {
transactionListening = true
console.log(`Action "${action.name}" received for account "${action.account}".`)
console.log(`About to listening for transaction "${data.trx_id}" to become irreversible`)
actionStream.unlisten()
transactionStream = client.getTransactionLifecycle(data.trx_id, { req_id: "transaction" })
transactionStream.onMessage(onMessage)
}
}
const onTransactionMessage = (message: InboundMessage<any>) => {
const data = message.data as TransactionData
const lifecycle = data.lifecycle
if (lifecycle.execution_irreversible === true && terminate !== true) {
console.log("Transaction passed irreveribility.")
terminate = true
transactionStream.unlisten()
} else {
console.log("Transaction progressing through irreveribility ...")
}
}
async function main() {
await client.connect()
actionStream = client.getActionTraces({
accounts: CONTRACTS.join("|"),
action_names: "transfer|issue"
})
console.log("Waiting for filtered action to appear...")
actionStream.onMessage(onMessage)
while (!terminate) {
await waitFor(2500)
}
}
runMain(main)