Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
bitcoin.opcodes.OP_ELSE,
bQ.publicKey,
bitcoin.opcodes.OP_CHECKSIGVERIFY,
bitcoin.opcodes.OP_ENDIF,
aQ.publicKey,
bitcoin.opcodes.OP_CHECKSIG,
])
}
// Signers
const keyPairAlice1 = bitcoin.ECPair.fromWIF(alice[1].wif, network)
const keyPairBob1 = bitcoin.ECPair.fromWIF(bob[1].wif, network)
// Recipient
const p2wpkhAlice1 = bitcoin.payments.p2wpkh({pubkey: keyPairAlice1.publicKey, network})
// Timelock
const timelock = bip68.encode({blocks: 5})
console.log('Timelock in blocks:')
console.log(timelock)
// Generate witness script
const witnessScript = csvCheckSigOutput(keyPairAlice1, keyPairBob1, timelock)
console.log('Witness script:')
console.log(witnessScript.toString('hex'))
// Generate P2WSH address
// Send 1 bitcoin
const p2wsh = bitcoin.payments.p2wsh({redeem: {output: witnessScript, network}, network})
console.log('P2WSH address:')
console.log(p2wsh.address)
if (privateKey) {
const hash = bitcoin.crypto.sha256(privateKey)
const d = BigInteger.fromBuffer(hash)
keyPair = bitcoin.ECPair.fromWIF(privateKey, btc.network)
}
else {
console.info('Created account Bitcoin ...')
keyPair = bitcoin.ECPair.makeRandom({ network: btc.network })
privateKey = keyPair.toWIF()
}
localStorage.setItem(constants.privateKeyNames.btc, privateKey)
const account = bitcoin.ECPair.fromWIF(privateKey, btc.network) // eslint-disable-line
const { address } = bitcoin.payments.p2pkh({ pubkey: account.publicKey, network: btc.network })
const { publicKey } = account
const data = {
account,
keyPair,
address,
privateKey,
publicKey,
}
window.getBtcAddress = () => data.address
window.getBtcData = () => data
console.info('Logged in with Bitcoin', data)
reducers.user.setAuthData({ name: 'btcData', data })
return privateKey
const signatureHash = tx.hashForWitnessV0(0, witnessScript, 1e8, hashType)
const witnessStackFirstBranch = bitcoin.payments.p2wsh({
redeem: {
input: bitcoin.script.compile([
bitcoin.script.signature.encode(keyPairAlice1.sign(signatureHash), hashType),
bitcoin.opcodes.OP_TRUE,
]),
output: witnessScript
}
}).witness
console.log('First branch witness stack:')
console.log(witnessStackFirstBranch.map(x => x.toString('hex')))
const witnessStackSecondBranch = bitcoin.payments.p2wsh({
redeem: {
input: bitcoin.script.compile([
bitcoin.script.signature.encode(keyPairAlice1.sign(signatureHash), hashType),
bitcoin.script.signature.encode(keyPairBob1.sign(signatureHash), hashType),
bitcoin.opcodes.OP_FALSE
]),
output: witnessScript
}
}).witness
console.log('Second branch witness stack:')
console.log(witnessStackSecondBranch.map(x => x.toString('hex')))
// Choose a branch
tx.setWitness(0, witnessStackFirstBranch)
//tx.setWitness(0, witnessStackSecondBranch)
const bitcoin = require('bitcoinjs-lib')
const { alice } = require('./wallets.json')
const network = bitcoin.networks.regtest
// Signer
const keyPairAlice1 = bitcoin.ECPair.fromWIF(alice[1].wif, network)
const p2wpkhAlice1 = bitcoin.payments.p2wpkh({pubkey: keyPairAlice1.publicKey, network})
// Build
const txb = new bitcoin.TransactionBuilder(network)
// txb.addInput(prevTx, vout, sequence, prevTxScript)
txb.addInput('TX_ID', TX_VOUT, null, p2wpkhAlice1.output)
const data = Buffer.from('Programmable money FTW!', 'utf8')
const embed = bitcoin.payments.embed({data: [data]})
txb.addOutput(embed.output, 0)
txb.addOutput(p2wpkhAlice1.address, 99900000)
// txb.sign(index, keyPair, redeemScript, sign.hashType, value, witnessScript)
txb.sign(0, keyPairAlice1, null, null, 1e8, null)
const tx = txb.build()
console.log('Transaction hexadecimal:')
console.log(tx.toHex())
// Happy case: swap provider redeems the funds to his address.
txb.addOutput(p2wpkhSwapProvider.address, 1e3)
}
// Prepare transaction
const tx = txb.buildIncomplete()
// Prepare signature hash
const sigHash = bitcoin.Transaction.SIGHASH_ALL
signatureHash = tx.hashForWitnessV0(0, Buffer.from(WITNESS_SCRIPT, 'hex'), 12e2, sigHash)
console.log('Signature hash:')
console.log(signatureHash.toString('hex'))
console.log()
// Happy case: Swap Provider is able to spend the P2WSH
const witnessStackClaimBranch = bitcoin.payments.p2wsh({
redeem: {
input: bitcoin.script.compile([
bitcoin.script.signature.encode(keyPairSwapProvider.sign(signatureHash), sigHash),
Buffer.from(PREIMAGE, 'hex')
]),
output: Buffer.from(WITNESS_SCRIPT, 'hex')
}
}).witness
console.log('Happy case witness stack:')
console.log(witnessStackClaimBranch.map(x => x.toString('hex')))
console.log()
// Failure case: User ask a refund after the timelock has expired
const witnessStackRefundBranch = bitcoin.payments.p2wsh({
redeem: {
input: bitcoin.script.compile([
const sig = await this.getMethod('signP2SHTransaction')(
initiationTxRaw, // TODO: Why raw? can't it be a bitcoinjs-lib TX like the next one?
tx,
address,
swapVout,
isSegwit ? swapPaymentVariants.p2wsh.redeem.output : swapPaymentVariants.p2sh.redeem.output,
isRedeem ? 0 : expiration,
isSegwit
)
const walletAddress = await this.getMethod('getWalletAddress')(address)
const swapInput = this.getSwapInput(sig, walletAddress.publicKey, isRedeem, secret)
const paymentParams = { redeem: { output: swapOutput, input: swapInput, network }, network }
const paymentWithInput = isSegwit
? bitcoin.payments.p2wsh(paymentParams)
: bitcoin.payments.p2sh(paymentParams)
if (isSegwit) {
tx.setWitness(0, paymentWithInput.witness)
}
if (paymentVariantName === 'p2shSegwit') {
// Adds the necessary push OP (PUSH34 (00 + witness script hash))
const inputScript = bitcoin.script.compile([swapPaymentVariants.p2shSegwit.redeem.output])
tx.setInputScript(0, inputScript)
} else if (paymentVariantName === 'p2sh') {
tx.setInputScript(0, paymentWithInput.input)
}
return this.getMethod('sendRawTransaction')(tx.toHex())
}
// Recipients
const keyPairBob1 = bitcoin.ECPair.fromWIF(bob[1].wif, network)
const p2pkhBob1 = bitcoin.payments.p2pkh({pubkey: keyPairBob1.publicKey, network})
const keyPairDave1 = bitcoin.ECPair.fromWIF(dave[1].wif, network)
const p2pkhDave1 = bitcoin.payments.p2pkh({pubkey: keyPairDave1.publicKey, network})
const keyPairMallory2 = bitcoin.ECPair.fromWIF(mallory[2].wif, network)
const p2pkhMallory2 = bitcoin.payments.p2pkh({pubkey: keyPairMallory2.publicKey, network})
const keyPairAlice2 = bitcoin.ECPair.fromWIF(alice[2].wif, network)
const p2pkhAlice2 = bitcoin.payments.p2pkh({pubkey: keyPairAlice2.publicKey, network})
// Signer's change
const p2pkhEve1 = bitcoin.payments.p2pkh({pubkey: keyPairEve1.publicKey, network})
const p2pkhMallory1 = bitcoin.payments.p2pkh({pubkey: keyPairMallory1.publicKey, network})
//
const txb = new bitcoin.TransactionBuilder(network)
// Add inputs
txb.addInput('TX_ID', TX_VOUT)
txb.addInput('TX_ID', TX_VOUT)
txb.addInput('TX_ID', TX_VOUT)
txb.addInput('TX_ID', TX_VOUT)
// Add outputs
txb.addOutput(p2pkhBob1.address, 2e7)
txb.addOutput(p2pkhDave1.address, 2e7)
txb.addOutput(p2pkhMallory2.address, 2e7)
txb.addOutput(p2pkhAlice2.address, 2e7)
txb.addOutput(p2pkhEve1.address, 5e6 - 5e4)
getPaymentVariantFromPublicKey (publicKey) {
if (this._addressType === 'legacy') {
return bitcoin.payments.p2pkh({ pubkey: publicKey, network: this._network })
} else if (this._addressType === 'p2sh') {
return bitcoin.payments.p2sh({
redeem: bitcoin.payments.p2wpkh({ pubkey: publicKey, network: this._network }),
network: this._network })
} else if (this._addressType === 'bech32') {
return bitcoin.payments.p2wpkh({ pubkey: publicKey, network: this._network })
}
}
function isRealWIF (publicAddress, WIF) {
try {
const keyPair = bitcoin.ECPair.fromWIF(WIF)
const { address } = bitcoin.payments.p2pkh({ pubkey: keyPair.publicKey })
return address === publicAddress
} catch (e) {
return false
}
}
getAddress() {
if (this._address) return this._address;
let address;
try {
let keyPair = bitcoin.ECPair.fromWIF(this.secret);
address = bitcoin.payments.p2pkh({
pubkey: keyPair.publicKey,
}).address;
} catch (err) {
return false;
}
this._address = address;
return this._address;
}