electrum-cash: broadcasting transactions
Introduction
Electrum-cash is a javascript/typescript library for communicating with electrum servers.
This example demonstrates how to broadcast a raw transaction and how to get notified of when the transaction gets included in a block, using v1.4.3
of the electrum protocol.
To keep the example simple and clear, the code to set up and close a connection is omitted.
Broadcasting a transaction
To broadcast a raw transaction, send a blockchain.transaction.broadcast
request with the raw transaction hex as the first parameter:
// The raw transaction we want to broadcast.
const transactionHex = '01000000017616e3106ca8e7a92eed190319fea34327edfb0991714444a5cc757000cde21a000000006a473044022007b6e2e864f9807602b9937d25b7df7ffdcd1ff559dad0cc130e9174bfea5cd8022070ae24a132f9420090d878defb17b78db7f15ced5ea4090c2f423d65f0d70d6c412102c94e85aa74899fb9378079e42c0e225c7481689c7fd7b3accd567ddafb53c6acfeffffff026db40600000000001976a914ebdeb6430f3d16a9c6758d6c0d7a400c8e6bbee488acdc120b00000000001976a9142c805fc822ea73b954040d787a8ea69e8d8caf5c88acf5d30900';
// Broadcast the transaction.
const transactionHash = await electrum.request('blockchain.transaction.broadcast', transactionHex);
// Log the transaction hash.
console.log(transactionHash);
Example output:
6df81e9abee5702d9c8b0ad941e0c0d663855d2186162fb5e86136d99904c48c
Checking transaction confirmations
To look up transaction confirmations, send a blockchain.transaction.get
request with the transaction hash as the first parameter and set verbose flag as the second parameter to true.
// The transaction we want to look up.
const transactionHash = '6df81e9abee5702d9c8b0ad941e0c0d663855d2186162fb5e86136d99904c48c';
// Request verbose transaction details which includes the number of confirmations.
const { confirmations } = await electrum.request('blockchain.transaction.get', transactionHash, true);
// Log the transaction confirmations.
console.log(confirmations);
Example output when the transaction is still in the mempool:
undefined
Example output when the transaction has 4 confirmations:
4
Listening for transaction block inclusion
To get notification when your transaction is included in a block, subscribe to new block notifications with blockchain.headers.subscribe
, then request the transaction status. Remember to unsubscribe when you no longer need the information.
Disclaimer: the unsubscribe feature will be included in the v1.2.0 release of electrum-cash
// Create a function that will handle confirmation updates.
const handleConfirmationUpdates = async function(callbackFunction, transactionHash)
{
// Request verbose transaction details which includes the number of confirmations.
const { confirmations } = await electrum.request('blockchain.transaction.get', transactionHash, true);
// If the transaction now have confirmations..
if(confirmations)
{
// Log that the transaction was confirmed.
console.log(`Transaction '${transactionHash}' now have ${confirmations} confirmations.`);
// Unsubscribe from further updates.
// NOTE: we bind the transaction to ensure that it uses the same name as when we subscribed.
electrum.unsubscribe(callbackFunction.bind(this), `blockchain.headers.subscribe`);
}
}
// The transaction we want to look up.
const transactionHash = '6df81e9abee5702d9c8b0ad941e0c0d663855d2186162fb5e86136d99904c48c';
// Subscribe to notifications for new blocks
// NOTE: we bind the transaction to provide the transaction hash to it.
await electrum.subscribe(handleConfirmationUpdates.bind(this, handleConfirmationUpdates, transactionHash), `blockchain.headers.subscribe`);
Example output when the transaction gets included in a block:
Transaction '6df81e9abee5702d9c8b0ad941e0c0d663855d2186162fb5e86136d99904c48c' now have 1 confirmations.
Conclusion
Broadcasting a transaction with electrum-cash
is easy, but tracking when the transaction gets confirmed involves tracking different related data which can cause problems if you naively unsubscribe while having multiple active subscriptions.
I have reached out to the backend developers to try and coordinate an update of the protocol to provide blockchain.transaction.subscribe
, a subscription call that sends notifications when the status of a transaction changes which would simplify this process.
Issues requesting the new feature:
This stuff seems hard...