completeFusion.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /* Import modules. */
  2. import { TransactionBuilder } from 'bitcoinjs-lib'
  3. import { hexToBin } from '@nexajs/utils'
  4. import buildSharedTx from '../../handlers/buildSharedTx.ts'
  5. const DUST_VAL = 546
  6. export default async function () {
  7. /* Initialize locals. */
  8. let inputs
  9. let keys
  10. let outputs
  11. let rawTx
  12. let response
  13. let session
  14. let sessionid
  15. // FIXME Where do we get the session ID from??
  16. sessionid = '4e9654f9-3de9-4f9a-8169-3834f40847f5'
  17. /* Request session details. */
  18. session = await $fetch(`http://localhost:39159/v1/fusion/${sessionid}`)
  19. .catch(err => console.error(err))
  20. console.log('SESSION', session)
  21. /* Set inputs. */
  22. inputs = session.inputs
  23. // console.log('INPUTS', inputs)
  24. /* Initialize keys. */
  25. keys = []
  26. /* Handle (input) keys. */
  27. Object.keys(inputs).forEach(_inputid => {
  28. keys.push(_inputid)
  29. })
  30. // console.log('KEYS', keys)
  31. /* Sort (input) keys. */
  32. keys.sort()
  33. // console.log('KEYS (sorted)', keys)
  34. /* Initialize sorted inputs. */
  35. const sortedInputs = []
  36. /* Handle (input) keys. */
  37. keys.forEach(_keyid => {
  38. /* Set input. */
  39. const input = inputs[_keyid]
  40. console.log('HANDLE INPUT', input)
  41. /* Find address index for input. */
  42. for (let i = 0; i < this.fusionInputs.length; i++) {
  43. if (this.fusionInputs[i].address === input.address) {
  44. input.address_idx = i
  45. console.log('ADDRESS INDEX', i)
  46. break
  47. }
  48. }
  49. /* Add input. */
  50. sortedInputs.push(input)
  51. })
  52. // console.log('INPUTS (sorted)', sortedInputs)
  53. outputs = session.outputs
  54. // console.log('OUTPUTS', outputs)
  55. /* Initialize (output) keys. */
  56. keys = []
  57. /* Handle keys. */
  58. Object.keys(outputs).forEach(_outputid => {
  59. keys.push(_outputid)
  60. })
  61. // console.log('KEYS', keys)
  62. /* Sort (output) keys. */
  63. keys.sort()
  64. // console.log('KEYS (sorted)', keys)
  65. /* Initialize sorted outputs. */
  66. const sortedOutputs = []
  67. /* Handle (output) keys. */
  68. keys.forEach(_keyid => {
  69. if (outputs[_keyid].value >= DUST_VAL) {
  70. /* Add input. */
  71. sortedOutputs.push(outputs[_keyid])
  72. }
  73. })
  74. // console.log('OUTPUTS (sorted)', sortedOutputs)
  75. /* Sign shared transaction. */
  76. const transactionBuilder = buildSharedTx.bind(this)(
  77. sessionid, sortedInputs, sortedOutputs)
  78. const script = Buffer.from(hexToBin(inputs['185ad6a10ea70d977d943a910f54dc446163a16771017c6df35c7893c1db0c35'].unlocking))
  79. console.log('SCRIPT', script)
  80. // transactionBuilder.transaction.tx.ins[0].script = script
  81. console.log('FINALIZED TRANSACTION', transactionBuilder)
  82. // console.log('UNLOCKING', inputs['185ad6a10ea70d977d943a910f54dc446163a16771017c6df35c7893c1db0c35'])
  83. const transaction = transactionBuilder.transaction.buildIncomplete()
  84. // const transaction = transactionBuilder.transaction
  85. console.log('TRANSACTION', transaction)
  86. transaction.ins[0].script = script
  87. console.log('TRANSACTION (hex)', transaction.toHex())
  88. // transaction.ins[0].script = Buffer.from(hexToBin(inputs['185ad6a10ea70d977d943a910f54dc446163a16771017c6df35c7893c1db0c35'].unlocking))
  89. // const transaction2 = transactionBuilder.transaction.build()
  90. // const transactionBuilder2 = TransactionBuilder.fromTransaction(
  91. // transaction,
  92. // 'mainnet'
  93. // )
  94. // console.log('TX BUILDER-2', transactionBuilder2)
  95. // build tx
  96. // const tx = transactionBuilder2.build()
  97. // const tx = transactionBuilder2.transaction.buildIncomplete()
  98. // console.log('TX BUILDER 2', tx)
  99. // // output rawhex
  100. // const txHex = tx.toHex()
  101. // console.log('TX HEX', txHex)
  102. /* Convert to (raw) hex. */
  103. // rawTx = tx.toHex()
  104. response = await this.broadcast('BCH', transaction.toHex())
  105. .catch(err => console.error(err))
  106. console.log('BROADCAST (response)', response)
  107. }
  108. // // Overwrite the tx inputs of the first partially-signed TX with the signed
  109. // // inputs from the other two transactions.
  110. // txObj.ins[1].script = txObj2.ins[1].script
  111. // txObj.ins[2].script = txObj3.ins[2].script
  112. // // console.log(`Fully-signed txObj.ins: ${JSON.stringify(txObj.ins, null, 2)}`)
  113. // // Port the transaction object into the TransactionBuilder.
  114. // const transactionBuilder = Bitcoin.TransactionBuilder.fromTransaction(
  115. // txObj,
  116. // 'mainnet'
  117. // )
  118. // // build tx
  119. // const tx = transactionBuilder.build()
  120. // // output rawhex
  121. // const txHex = tx.toHex()