I have placed together a raw tx hex but when it's unable to be broadcasted as I keep getting an error below

sendrawtransaction RPC error: {"code":-25,"message":"bad-txns-inputs-missingorspent"}

I then decoded the tx hex using https://live.blockcypher.com/btc/decodetx/ to see that I seem to be missing the Witness field as I am using native segwit addresses:

    "addresses": [
    "block_height": -1,
    "block_index": -1,
    "confirmations": 0,
    "double_spend": false,
    "fees": 200,
    "hash": "88420211f5ea53174fc6a708c00ca2e840d687591573d0ecd2464fae20d139a7",
    "inputs": [
            "addresses": [
            "age": 696993,
            "output_index": 0,
            "output_value": 60200,
            "prev_hash": "74e24a2d50ba64abc099126c1c208b5f7156e3ad515b86f3edcca3f3d4291f66",
            "script": "4730440220516e15b6354f17e3f02711107624005e6ccd26cf61ef21b35e91315dfbd33e9f022049dadb73ca3e814de9da0b35ff20a8ca82147dda138ede948ccac5621a5bc1bb01210384485d43e938f8c68c4ac903d4d5a97fe842f66c12b860d8d2e1242d2b01fc1f",
            "script_type": "pay-to-witness-pubkey-hash",
            "sequence": 4294967295
    "outputs": [
            "addresses": [
            "script": "001490638c5df76b1a37dc852e21ed5be5b66dbe1991",
            "script_type": "pay-to-witness-pubkey-hash",
            "value": 60000
    "preference": "low",
    "received": "2021-09-05T10:17:14.395062568Z",
    "relayed_by": "",
    "size": 188,
    "total": 60000,
    "ver": 2,
    "vin_sz": 1,
    "vout_sz": 1,
    "vsize": 188

I then thought perhaps I didn't add a scriptPubKey into the addInput but this code didn't seem to work for me:

const fetch = require("node-fetch")
const bitcoin = require("bitcoinjs-lib")
const url = "https://blockchain.info/rawaddr/"
let MAINNET = bitcoin.networks.bitcoin
pubAdd = "bc1qj3rjxzhlqm6fqesd5fwphjnf457zkww3s5qrv5"

let txb = new bitcoin.TransactionBuilder(MAINNET)
var txid = null
var outn = 0
var transactionhex = ""

async function getPubAddInfo() {
  const response = await fetch(url + pubAdd)
  const data = await response.json()

  txid = data["txs"][0]["hash"]
  outn = data["txs"][0]["out"][0]["n"]

async function getTXHash() {
  await getPubAddInfo()

  let WIF = "xxxxxxxxxxxx"
  let keypairSpend = bitcoin.ECPair.fromWIF(WIF, MAINNET)

  var scriptPubkey = bitcoin.script.witnessPubKeyHash.output.encode(bitcoin.crypto.hash160(keypairSpend.getPublicKeyBuffer()))

  txb.addInput(txid, outn, null, scriptPubkey)

  txb.addOutput("bc1qjp3cch0hdvdr0hy99cs76kl9kekmuxv3k9nr6l", 60000)

  txb.sign(0, keypairSpend, null, null, 60200)

  let tx = txb.build()
  transactionhex = tx.toHex()


At the moment I get the error TypeError: Cannot read property 'output' of undefined on the line where i create var scriptPubKey.

Any suggestions as to how I can add the Witness field into the tx? Is it because I am improperly adding the scriptPubKey? I am using bitcoinjs 5.2.0

  • Are you actually signing the transaction? Sep 5, 2021 at 16:08
  • @PieterWuille Yes, I have it like this: let WIF = "xxxxxxxxx" , let keypairSpend = bitcoin.ECPair.fromWIF(WIF, MAINNET) , txb.sign(0, keypairSpend, null, null, 60200)
    – jiamijiang
    Sep 7, 2021 at 0:15
  • @PieterWuille I have updated my original question above to show you the full code I am using.
    – jiamijiang
    Sep 7, 2021 at 0:24

1 Answer 1


How are you signing it? Also what version of bitcoinjs are you using? Looks like an older one (v3.3?)prior to PSBTs. It might be a little different depending on version. Spending from segwit addresses (p2sh or native) you must specify inputvalue, this is the full value of the unspent output being spent.

txb.sign(0, keypairSpend, null, null, inputvalue);

As of v.4.03 for an example spending from p2wpkh with the latest transaction builder see their github reference docs at https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/transactions.spec.ts#L11

  • I have updated my original question to show you the full code I am using. I am also using bitcoinjs v5.2.0
    – jiamijiang
    Sep 7, 2021 at 0:24

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.