Sign and Broadcast Transaction

To sign and broadcast a transaction to the Polkadot network, follow these steps:

  1. Prepare unsigned transaction in Base64 encrypted format.

  2. Sign the transaction using the following code:

import { readFileSync } from "fs";
import { ApiPromise, WsProvider, Keyring } from "@polkadot/api";
import '@polkadot/api-augment';

async function sign () {
  // Polkadot websocket url
  const provider = process.env.PROVIDER;
  // sr25519 secret key filename
  const secretFileName = process.env.SECRET_FILE_NAME;
  // password of secret key
  const password = process.env.PASSWORD;
  // transaction in base64
  const rawTransaction = process.env.RAW_TRANSACTION;

  // connect to polkadot node
  const wsProvider = new WsProvider(provider);
  const api = await ApiPromise.create({ provider: wsProvider });
  await api.isReady;

  // load keyring file
  const keyring = new Keyring({ type: "sr25519" });
  const fileContent = readFileSync(
    secretFileName,
    "utf8"
  );
  const keyInfo = JSON.parse(fileContent);
  const sender = keyring.addFromJson(keyInfo);
  // decode secret key
  sender.decodePkcs8(password);

  const unsigned = api.tx(rawTransaction);

  // sing transaction
  const signedExtrinsic = await unsigned.signAsync(sender);
  console.log('signedExtrinsic', signedExtrinsic.toHuman());

  // print signed transaction
  const hexEx = signedExtrinsic.toHex()
  console.log('signedExtrinsic toHex', hexEx);

  await api.disconnect()
}

// run sing function
sign().catch((error) => {
  console.error(error);
  process.exit(1);
});
  1. Broadcast the transaction to the Polkadot network by sending a POST request to /api/v1/polkadot/{network}/tx/send.

Example request (for westend network):

curl --request POST \
     --url https://api.p2p.org/api/v1/polkadot/westend/tx/send \
     --header 'accept: application/json' \
     --header 'authorization: Bearer <token>' \
     --header 'content-type: application/json' \
     --data '
     {
       "signedTransaction": "0x450284002c6eca5cdaa3e87d7f8e06d10015bf0508b52d301c8991af113d5cf49a53553f01befdb7fa39c5a995a8d58676a0513d082be"
     }'
  • signedTransactionsigned transaction in hex format.

Example response:

{
  "result": {
    "status": "success",
    "blockHash": "0x0628743b05ffb4c9d5ea2144b359af38910f0ae439a685f57d85b50b9481ba3f",
    "blockId": "17168395",
    "extrinsicId": "0xb838911d5a5f965f33b8ee134e1115b5b9902abfc567f0c3050073faf9d3c3e0",
    "transactionHash": "0x450284002c6eca5cdaa3e87d7f8e06d10015bf0508b52d301c8991af113d5cf49a53553f01befdb7fa39c5a995a8d58676a0513d082be",
    "signerAccount": "5H6ryBWChC5w7eaQ4GZjo329sEnhvjetSr6MBEt42mZ5tPw5",
    "createdAt": "2023-08-15T15:07:54.795Z"
  }
}
  • staus — transaction status.
  • blockHash — block hash in which the transaction was included.
  • blockId — unique block identifier.
  • extrinsicId — unique extrinsic identifier.
  • transactionHash — signed transaction in hex format.
  • signerAccount — account that signed the transaction.
  • createdAt — timestamp of the transaction in the ISO 8601 format.

What's Next?