completeFusion.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  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 input
  9. let inputs
  10. let keys
  11. let outputs
  12. let rawTx
  13. let response
  14. let script
  15. let session
  16. let sessionid
  17. let sortedInputs
  18. let sortedOutputs
  19. let transaction
  20. let transactionBuilder
  21. // FIXME Where do we get the session ID from??
  22. sessionid = '4fa84224-be56-49ba-830a-fa3b6774eb01'
  23. /* Request session details. */
  24. session = await $fetch(`/v1/fusion/${sessionid}`)
  25. .catch(err => console.error(err))
  26. console.log('SESSION', session)
  27. /* Set inputs. */
  28. inputs = session.inputs
  29. console.log('INPUTS', inputs)
  30. /* Initialize keys. */
  31. keys = []
  32. /* Handle (input) keys. */
  33. Object.keys(inputs).forEach(_outpoint => {
  34. keys.push(_outpoint)
  35. })
  36. // console.log('KEYS', keys)
  37. /* Sort (input) keys. */
  38. keys.sort()
  39. // console.log('KEYS (sorted)', keys)
  40. /* Initialize sorted inputs. */
  41. sortedInputs = []
  42. /* Handle (input) keys. */
  43. keys.forEach(_keyid => {
  44. /* Set input. */
  45. const input = inputs[_keyid]
  46. console.log('HANDLE INPUT', input)
  47. /* Find address index for input. */
  48. // for (let i = 0; i < this.fusionInputs.length; i++) {
  49. // if (this.fusionInputs[i].address === input.address) {
  50. // input.address_idx = i
  51. // console.log('ADDRESS INDEX', i)
  52. // break
  53. // }
  54. // }
  55. /* Add input. */
  56. sortedInputs.push(input)
  57. })
  58. // console.log('INPUTS (sorted)', sortedInputs)
  59. outputs = session.outputs
  60. // console.log('OUTPUTS', outputs)
  61. /* Initialize (output) keys. */
  62. keys = []
  63. /* Handle keys. */
  64. Object.keys(outputs).forEach(_outputid => {
  65. keys.push(_outputid)
  66. })
  67. // console.log('KEYS', keys)
  68. /* Sort (output) keys. */
  69. keys.sort()
  70. // console.log('KEYS (sorted)', keys)
  71. /* Initialize sorted outputs. */
  72. sortedOutputs = []
  73. /* Handle (output) keys. */
  74. keys.forEach(_keyid => {
  75. if (outputs[_keyid].value >= DUST_VAL) {
  76. /* Add input. */
  77. sortedOutputs.push(outputs[_keyid])
  78. }
  79. })
  80. // console.log('OUTPUTS (sorted)', sortedOutputs)
  81. /* Sign shared transaction. */
  82. transactionBuilder = buildSharedTx.bind(this)(
  83. sessionid, sortedInputs, sortedOutputs)
  84. // transactionBuilder.transaction.tx.ins[0].script = script
  85. console.log('FINALIZED TRANSACTION', transactionBuilder)
  86. // console.log('UNLOCKING', inputs['185ad6a10ea70d977d943a910f54dc446163a16771017c6df35c7893c1db0c35'])
  87. transaction = transactionBuilder.transaction.buildIncomplete()
  88. // const transaction = transactionBuilder.transaction
  89. console.log('TRANSACTION', transaction)
  90. // const scripts = []
  91. /* Handle (sorted) inputs. */
  92. for (let i = 0; i < sortedInputs.length; i++) {
  93. /* Set input. */
  94. input = sortedInputs[i]
  95. console.log('UNLOCKING SCRIPT INPUT', input)
  96. /* Set script. */
  97. script = Buffer.from(input.unlocking, 'hex')
  98. /* Add unlocking script to input. */
  99. transaction.ins[i].script = script
  100. }
  101. console.log('TRANSACTION (hex)', transaction.toHex())
  102. // Object.keys(inputs).forEach(_outpoint => {
  103. // // scripts.push({
  104. // // id: _outpoint,
  105. // // script: Buffer.from(input.unlocking, 'hex')
  106. // // })
  107. // })
  108. // console.log('SCRIPTS', scripts)
  109. // const script = Buffer.from(hexToBin(inputs['185ad6a10ea70d977d943a910f54dc446163a16771017c6df35c7893c1db0c35'].unlocking))
  110. // console.log('SCRIPT', script)
  111. // transaction.ins[0].script = script
  112. // transaction.ins[0].script = Buffer.from(hexToBin(inputs['185ad6a10ea70d977d943a910f54dc446163a16771017c6df35c7893c1db0c35'].unlocking))
  113. // const transaction2 = transactionBuilder.transaction.build()
  114. // const transactionBuilder2 = TransactionBuilder.fromTransaction(
  115. // transaction,
  116. // 'mainnet'
  117. // )
  118. // console.log('TX BUILDER-2', transactionBuilder2)
  119. // build tx
  120. // const tx = transactionBuilder2.build()
  121. // const tx = transactionBuilder2.transaction.buildIncomplete()
  122. // console.log('TX BUILDER 2', tx)
  123. // // output rawhex
  124. // const txHex = tx.toHex()
  125. // console.log('TX HEX', txHex)
  126. /* Convert to (raw) hex. */
  127. // rawTx = tx.toHex()
  128. response = await this.broadcast('BCH', transaction.toHex())
  129. .catch(err => console.error(err))
  130. console.log('BROADCAST (response)', response)
  131. }