1
0

buildSharedTx.ts 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /* Import modules. */
  2. import BCHJS from '@psf/bch-js'
  3. import { Transaction } from 'bitcoinjs-lib'
  4. import { mnemonicToSeed } from '@nexajs/hdnode'
  5. import { encodeNullData } from '@nexajs/script'
  6. import { utf8ToBin } from '@nexajs/utils'
  7. const bchjs = new BCHJS()
  8. /* Initialize constants. */
  9. const HUSH_PROTOCOL_ID = 0x48555348
  10. /**
  11. * Build Shared Transaction
  12. *
  13. * Combine all participating inputs and outputs into one (signed) transaction.
  14. */
  15. export default function (_sessionid, _inputs, _outputs) {
  16. console.log('BUILD SHARED TX', _sessionid, _inputs, _outputs)
  17. /* Initialize locals. */
  18. let accountIdx
  19. let addressIdx
  20. let changeIdx
  21. let childNode
  22. let data
  23. let ecPair
  24. // let ownedInputs
  25. let protocolId
  26. let msg
  27. let rawTx
  28. let redeemScript
  29. let script
  30. let wif
  31. /* Initialize transaction builde.r */
  32. const transactionBuilder = new bchjs.TransactionBuilder()
  33. console.log('DO WE HAVE FUSION INPUTS??', this.fusionInputs)
  34. /* Initialize our addresses. */
  35. const ourAddresses = []
  36. /* Handle fusion inputs. */
  37. Object.keys(this.fusionInputs).forEach(_outpoint => {
  38. const ourInput = this.fusionInputs[_outpoint]
  39. console.log('OUR INPUT', ourInput)
  40. ourAddresses.push(ourInput.address)
  41. })
  42. console.log('OUR ADDRESSES', ourAddresses)
  43. /* Initialize address index. */
  44. // addressIdx = 0
  45. /* Initialize owned inputs. */
  46. // ownedInputs = []
  47. /* Handle inputs. */
  48. _inputs.forEach(_input => {
  49. /* Add input. */
  50. transactionBuilder.addInput(_input.tx_hash, _input.tx_pos)
  51. // console.log('VALIDATING (SELF) INPUT', _input)
  52. // /* Validate (our) address. */
  53. // if (ourAddresses.includes(_input.address)) {
  54. // ownedInputs.push(addressIdx)
  55. // }
  56. // addressIdx++
  57. })
  58. // console.log('OUR INPUTS INDEX', ownedInputs)
  59. /* Set protocol ID. */
  60. protocolId = 'HUSH'
  61. /* Set protocol message. */
  62. msg = '4fa84224-be56-49ba-830a-fa3b6774eb01'
  63. script = [
  64. utf8ToBin(protocolId),
  65. utf8ToBin(msg),
  66. // utf8ToBin(_sessionid),
  67. ]
  68. // console.log('my SCRIPT', script)
  69. // console.log('encodeNullData', encodeNullData(script))
  70. // Compile the script array into a bitcoin-compliant hex encoded string.
  71. // const data = bchjs.Script.encode(script)
  72. data = Buffer.from(encodeNullData(script))
  73. // console.log('OP_RETURN (data)', data)
  74. // Add the OP_RETURN output.
  75. transactionBuilder.addOutput(data, 0)
  76. /* Handle outputs. */
  77. _outputs.forEach(_output => {
  78. /* Add output. */
  79. transactionBuilder.addOutput(_output.address, _output.value)
  80. })
  81. /* Generate (incomplete) transaction. */
  82. const transaction = transactionBuilder.transaction.buildIncomplete()
  83. console.log('TRANSACTION', transaction)
  84. /* Return raw (hex) transaction. */
  85. // return transaction
  86. return transactionBuilder
  87. }