123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- /* Import modules. */
- import BCHJS from '@psf/bch-js'
- import { Transaction } from 'bitcoinjs-lib'
- import { mnemonicToSeed } from '@nexajs/hdnode'
- import { encodeNullData } from '@nexajs/script'
- import { utf8ToBin } from '@nexajs/utils'
- const bchjs = new BCHJS()
- /**
- * Build Shared Transaction
- *
- * Combine all participating inputs and outputs into one (signed) transaction.
- *
- * NOTE: ALL inputs are ALREADY signed by their respective participants.
- */
- export default function (_inputs, _outputs) {
- /* Initialize locals. */
- let rawTx
- let safeBalance
- let utxo
- const transactionBuilder = new bchjs.TransactionBuilder()
- let inputIdx
- this.fusionInputs.forEach((_utxo) => {
- /* Set UTXO. */
- utxo = _utxo
- console.log('UTXO', utxo)
- inputIdx = 0//utxo.tx_pos
- transactionBuilder.addInput(utxo.tx_hash, utxo.tx_pos)
- const originalAmount = utxo.value
- const remainder = originalAmount - satsNeeded
- console.log('REMAINDER', remainder);
- if (remainder < 0) {
- throw new Error('Selected UTXO does not have enough satoshis')
- }
- const protocolId = '1337'
- const msg = 'building...'
- const script = [
- utf8ToBin(protocolId),
- utf8ToBin(msg),
- ]
- console.log('my SCRIPT', script)
- console.log('encodeNullData', encodeNullData(script))
- // Compile the script array into a bitcoin-compliant hex encoded string.
- // const data = bchjs.Script.encode(script)
- const data = Buffer.from(encodeNullData(script))
- console.log('OP_RETURN (data)', data)
- // Add the OP_RETURN output.
- // transactionBuilder.addOutput(data, 0)
- transactionBuilder.addOutput(data, 0)
- // Send payment
- // transactionBuilder.addOutput(receiver, satsNeeded)
- transactionBuilder.addOutput(receiver, paymentAmount)
- // Send the BCH change back to the payment part
- // transactionBuilder.addOutput(account.address, remainder - 300)
- })
- /* Initialize redeem script. */
- // FIXME Why do we need this??
- let redeemScript
- /* Convert mnemonic to seed. */
- const seed = mnemonicToSeed(this.mnemonic)
- /* Conver to seed buffer. */
- // FIXME Migrate to TypedArrays.
- const seedBuffer = Buffer.from(seed, 'hex')
- /* Generate master node. */
- const masterNode = bchjs.HDNode.fromSeed(seedBuffer)
- /* Set account index. */
- const accountIdx = 0
- /* Set change index. */
- const changeIdx = 0
- /* Set address index. */
- const addressIdx = 0
- /* Generate child node. */
- const chidleNode = masterNode
- .derivePath(`m/44'/145'/${accountIdx}'/${changeIdx}/${addressIdx}`)
- /* Generate wallet import format (WIF). */
- const wif = bchjs.HDNode.toWIF(chidleNode)
- // console.log('BCH WIF', wif)
- /* Generate elliptic pair. */
- const ecPair = bchjs.ECPair.fromWIF(wif)
- /* Sign transaction. */
- transactionBuilder.sign(
- inputIdx,
- ecPair,
- redeemScript,
- Transaction.SIGHASH_ALL,
- utxo.value,
- )
- /* Generate (incomplete) transaction. */
- const tx = transactionBuilder.transaction.buildIncomplete()
- // console.log('TRANSACTION', tx)
- /* Convert to (raw) hex. */
- rawTx = tx.toHex()
- /* Return raw (hex) transaction. */
- return rawTx
- }
|