-
Notifications
You must be signed in to change notification settings - Fork 2.2k
Closed
Labels
Description
Version: Bitcoinjs-0.3.2 and also bitcoinjs/bitcoinjs-lib#fixes
I'm trying to integrate segwit in my walleting software, but I'm stuck in one problem. The flow is the following:
- I create a segwit address from 2of3 p2sh keys
- I send some testnet coin to this address
- I get the unspent tx
- I create the tx with this unspent as input
- I generate the incomplete hex, passing it to another software
- I then try to sign the transaction with the following code:
var signTxSegwit = function (txhex, pubkeys, privkey, utxos, n) {
var txb = new bitcoinjs.TransactionBuilder.fromTransaction (
bitcoinjs.Transaction.fromHex (txhex), bitcoinjs.networks.testnet);
var upair = bitcoinjs.ECPair.fromWIF(privkey, bitcoinjs.networks.testnet);
var pubkeys_raw = pubkeys.map(function (hex) { return new Buffer(hex, 'hex'); });
var witnessScript = bitcoinjs.script.multisig.output.encode (n, pubkeys_raw);
var redeemScript = bitcoinjs.script.witnessScriptHash.output.encode (bitcoinjs.crypto.sha256(witnessScript));
var scriptPubKey = bitcoinjs.script.scriptHash.output.encode (bitcoinjs.crypto.hash160(redeemScript));
var address = bitcoinjs.address.fromOutputScript(scriptPubKey, bitcoinjs.networks.testnet);
for (var j = 0; j < txb.tx.ins.length; j++) {
txb.sign (j, upair, redeemScript, null, parseInt (utxos[j].value * 100000000), witnessScript);
}
var tx = txb.build ();
return tx.toHex ();
}
The program fail at txb.sign, with this error:
Message:
Error: Expected property "2" of type Satoshi, got undefined
Stacktrace:
Error
at TfTypeError.Error (native)
at new TfTypeError (/home/dakk/Repositories/MyRepos/backend/node_modules/typeforce/errors.js:43:24)
at typeforce (/home/dakk/Repositories/MyRepos/backend/node_modules/typeforce/index.js:193:11)
at /home/dakk/Repositories/MyRepos/backend/node_modules/typeforce/index.js:152:18
at Array.every (native)
at _tuple (/home/dakk/Repositories/MyRepos/backend/node_modules/typeforce/index.js:150:20)
at typeforce (/home/dakk/Repositories/MyRepos/backend/node_modules/typeforce/index.js:191:9)
at Transaction.hashForWitnessV0 (/home/dakk/Repositories/MyRepos/backend/node_modules/bitcoinjs-lib/src/transaction.js:320:3)
at TransactionBuilder.sign (/home/dakk/Repositories/MyRepos/backend/node_modules/bitcoinjs-lib/src/transaction_builder.js:692:29)
at signTxSegwit (/home/dakk/Repositories/MyRepos/backend/tests/api/middlewares/wallet.js:79:7)
Then I jumped to bitcoinjs-lib/src/transaction_builder:692 and I found this:
signatureHash = this.tx.hashForWitnessV0(vin, input.signScript, input.value, hashType)
Which is using input.value; so I guessed prepareInput should inject this field, and I've found that it injects input.value if witnessScript and reedemScript are not undefined; but they are defined in my example, right? I can't figure out what's the problem here