@bitgo-beta/abstract-utxo 1.1.1-beta.20 → 1.1.1-beta.2000

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (835) hide show
  1. package/README.md +76 -0
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts +473 -0
  3. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
  4. package/dist/cjs/src/abstractUtxoCoin.js +713 -0
  5. package/dist/cjs/src/address/fixedScript.d.ts +44 -0
  6. package/dist/cjs/src/address/fixedScript.d.ts.map +1 -0
  7. package/dist/cjs/src/address/fixedScript.js +108 -0
  8. package/dist/cjs/src/address/index.d.ts +2 -0
  9. package/dist/cjs/src/address/index.d.ts.map +1 -0
  10. package/dist/cjs/src/address/index.js +8 -0
  11. package/dist/{src → cjs/src}/config.d.ts +1 -0
  12. package/dist/cjs/src/config.d.ts.map +1 -0
  13. package/dist/cjs/src/config.js +14 -0
  14. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts +19 -0
  15. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
  16. package/dist/cjs/src/descriptor/NamedDescriptor.js +77 -0
  17. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  18. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  19. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +33 -0
  20. package/dist/cjs/src/descriptor/builder/builder.d.ts +12 -0
  21. package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
  22. package/dist/cjs/src/descriptor/builder/builder.js +37 -0
  23. package/dist/cjs/src/descriptor/builder/index.d.ts +3 -0
  24. package/dist/cjs/src/descriptor/builder/index.d.ts.map +1 -0
  25. package/dist/cjs/src/descriptor/builder/index.js +8 -0
  26. package/dist/cjs/src/descriptor/builder/parse.d.ts +5 -0
  27. package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -0
  28. package/dist/cjs/src/descriptor/builder/parse.js +116 -0
  29. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  30. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  31. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.js +41 -0
  32. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts +12 -0
  33. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  34. package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +33 -0
  35. package/dist/cjs/src/descriptor/createWallet/index.d.ts +3 -0
  36. package/dist/cjs/src/descriptor/createWallet/index.d.ts.map +1 -0
  37. package/dist/cjs/src/descriptor/createWallet/index.js +19 -0
  38. package/dist/cjs/src/descriptor/descriptorWallet.d.ts +19 -0
  39. package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -0
  40. package/dist/cjs/src/descriptor/descriptorWallet.js +54 -0
  41. package/dist/cjs/src/descriptor/index.d.ts +8 -0
  42. package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
  43. package/dist/cjs/src/descriptor/index.js +53 -0
  44. package/dist/cjs/src/descriptor/validatePolicy.d.ts +22 -0
  45. package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -0
  46. package/dist/cjs/src/descriptor/validatePolicy.js +92 -0
  47. package/dist/cjs/src/impl/bch/bch.d.ts +22 -0
  48. package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -0
  49. package/dist/cjs/src/impl/bch/bch.js +43 -0
  50. package/dist/cjs/src/impl/bch/index.d.ts +3 -0
  51. package/dist/cjs/src/impl/bch/index.d.ts.map +1 -0
  52. package/dist/cjs/src/impl/bch/index.js +19 -0
  53. package/dist/cjs/src/impl/bch/tbch.d.ts +12 -0
  54. package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -0
  55. package/dist/cjs/src/impl/bch/tbch.js +15 -0
  56. package/dist/cjs/src/impl/bcha/bcha.d.ts +9 -0
  57. package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -0
  58. package/dist/cjs/src/impl/bcha/bcha.js +15 -0
  59. package/dist/cjs/src/impl/bcha/index.d.ts +3 -0
  60. package/dist/cjs/src/impl/bcha/index.d.ts.map +1 -0
  61. package/dist/cjs/src/impl/bcha/index.js +19 -0
  62. package/dist/cjs/src/impl/bcha/tbcha.d.ts +12 -0
  63. package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -0
  64. package/dist/cjs/src/impl/bcha/tbcha.js +15 -0
  65. package/dist/cjs/src/impl/bsv/bsv.d.ts +9 -0
  66. package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -0
  67. package/dist/cjs/src/impl/bsv/bsv.js +15 -0
  68. package/dist/cjs/src/impl/bsv/index.d.ts +3 -0
  69. package/dist/cjs/src/impl/bsv/index.d.ts.map +1 -0
  70. package/dist/cjs/src/impl/bsv/index.js +19 -0
  71. package/dist/cjs/src/impl/bsv/tbsv.d.ts +12 -0
  72. package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -0
  73. package/dist/cjs/src/impl/bsv/tbsv.js +15 -0
  74. package/dist/cjs/src/impl/btc/btc.d.ts +15 -0
  75. package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -0
  76. package/dist/cjs/src/impl/btc/btc.js +22 -0
  77. package/dist/cjs/src/impl/btc/index.d.ts +7 -0
  78. package/dist/cjs/src/impl/btc/index.d.ts.map +1 -0
  79. package/dist/cjs/src/impl/btc/index.js +23 -0
  80. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts +61 -0
  81. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  82. package/dist/cjs/src/impl/btc/inscriptionBuilder.js +171 -0
  83. package/dist/cjs/src/impl/btc/tbtc.d.ts +12 -0
  84. package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -0
  85. package/dist/cjs/src/impl/btc/tbtc.js +15 -0
  86. package/dist/cjs/src/impl/btc/tbtc4.d.ts +12 -0
  87. package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -0
  88. package/dist/cjs/src/impl/btc/tbtc4.js +15 -0
  89. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts +12 -0
  90. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -0
  91. package/dist/cjs/src/impl/btc/tbtcbgsig.js +15 -0
  92. package/dist/cjs/src/impl/btc/tbtcsig.d.ts +12 -0
  93. package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -0
  94. package/dist/cjs/src/impl/btc/tbtcsig.js +15 -0
  95. package/dist/cjs/src/impl/btg/btg.d.ts +9 -0
  96. package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -0
  97. package/dist/cjs/src/impl/btg/btg.js +15 -0
  98. package/dist/cjs/src/impl/btg/index.d.ts +2 -0
  99. package/dist/cjs/src/impl/btg/index.d.ts.map +1 -0
  100. package/dist/cjs/src/impl/btg/index.js +18 -0
  101. package/dist/cjs/src/impl/dash/dash.d.ts +9 -0
  102. package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -0
  103. package/dist/cjs/src/impl/dash/dash.js +15 -0
  104. package/dist/cjs/src/impl/dash/index.d.ts +3 -0
  105. package/dist/cjs/src/impl/dash/index.d.ts.map +1 -0
  106. package/dist/cjs/src/impl/dash/index.js +19 -0
  107. package/dist/cjs/src/impl/dash/tdash.d.ts +12 -0
  108. package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -0
  109. package/dist/cjs/src/impl/dash/tdash.js +15 -0
  110. package/dist/cjs/src/impl/doge/doge.d.ts +35 -0
  111. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
  112. package/dist/cjs/src/impl/doge/doge.js +79 -0
  113. package/dist/cjs/src/impl/doge/index.d.ts +3 -0
  114. package/dist/cjs/src/impl/doge/index.d.ts.map +1 -0
  115. package/dist/cjs/src/impl/doge/index.js +19 -0
  116. package/dist/cjs/src/impl/doge/tdoge.d.ts +12 -0
  117. package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -0
  118. package/dist/cjs/src/impl/doge/tdoge.js +15 -0
  119. package/dist/cjs/src/impl/index.d.ts +10 -0
  120. package/dist/cjs/src/impl/index.d.ts.map +1 -0
  121. package/dist/cjs/src/impl/index.js +46 -0
  122. package/dist/cjs/src/impl/ltc/index.d.ts +3 -0
  123. package/dist/cjs/src/impl/ltc/index.d.ts.map +1 -0
  124. package/dist/cjs/src/impl/ltc/index.js +19 -0
  125. package/dist/cjs/src/impl/ltc/ltc.d.ts +8 -0
  126. package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
  127. package/dist/cjs/src/impl/ltc/ltc.js +15 -0
  128. package/dist/cjs/src/impl/ltc/tltc.d.ts +8 -0
  129. package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
  130. package/dist/cjs/src/impl/ltc/tltc.js +15 -0
  131. package/dist/cjs/src/impl/zec/index.d.ts +3 -0
  132. package/dist/cjs/src/impl/zec/index.d.ts.map +1 -0
  133. package/dist/cjs/src/impl/zec/index.js +19 -0
  134. package/dist/cjs/src/impl/zec/tzec.d.ts +9 -0
  135. package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -0
  136. package/dist/cjs/src/impl/zec/tzec.js +15 -0
  137. package/dist/cjs/src/impl/zec/zec.d.ts +12 -0
  138. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -0
  139. package/dist/cjs/src/impl/zec/zec.js +15 -0
  140. package/dist/cjs/src/index.d.ts +23 -0
  141. package/dist/cjs/src/index.d.ts.map +1 -0
  142. package/dist/cjs/src/index.js +62 -0
  143. package/dist/cjs/src/keychains.d.ts +56 -0
  144. package/dist/cjs/src/keychains.d.ts.map +1 -0
  145. package/dist/cjs/src/keychains.js +144 -0
  146. package/dist/cjs/src/names.d.ts +36 -0
  147. package/dist/cjs/src/names.d.ts.map +1 -0
  148. package/dist/cjs/src/names.js +231 -0
  149. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts +9 -0
  150. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  151. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +23 -0
  152. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts +46 -0
  153. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  154. package/dist/cjs/src/offlineVault/OfflineVaultSignable.js +55 -0
  155. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts +16 -0
  156. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
  157. package/dist/cjs/src/offlineVault/TransactionExplanation.js +15 -0
  158. package/dist/cjs/src/offlineVault/descriptor/index.d.ts +2 -0
  159. package/dist/cjs/src/offlineVault/descriptor/index.d.ts.map +1 -0
  160. package/dist/cjs/src/offlineVault/descriptor/index.js +18 -0
  161. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts +39 -0
  162. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
  163. package/dist/cjs/src/offlineVault/descriptor/transaction.js +80 -0
  164. package/dist/cjs/src/offlineVault/index.d.ts +6 -0
  165. package/dist/cjs/src/offlineVault/index.d.ts.map +1 -0
  166. package/dist/cjs/src/offlineVault/index.js +44 -0
  167. package/dist/{src → cjs/src}/recovery/RecoveryProvider.d.ts +6 -7
  168. package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -0
  169. package/dist/cjs/src/recovery/RecoveryProvider.js +22 -0
  170. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts +158 -0
  171. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
  172. package/dist/cjs/src/recovery/backupKeyRecovery.js +411 -0
  173. package/dist/{src → cjs/src}/recovery/baseApi.d.ts +3 -6
  174. package/dist/cjs/src/recovery/baseApi.d.ts.map +1 -0
  175. package/dist/cjs/src/recovery/baseApi.js +73 -0
  176. package/dist/{src → cjs/src}/recovery/coingeckoApi.d.ts +0 -3
  177. package/dist/cjs/src/recovery/coingeckoApi.d.ts.map +1 -0
  178. package/dist/cjs/src/recovery/coingeckoApi.js +44 -0
  179. package/dist/{src → cjs/src}/recovery/crossChainRecovery.d.ts +30 -30
  180. package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
  181. package/dist/cjs/src/recovery/crossChainRecovery.js +299 -0
  182. package/dist/{src → cjs/src}/recovery/index.d.ts +0 -1
  183. package/dist/cjs/src/recovery/index.d.ts.map +1 -0
  184. package/dist/{src → cjs/src}/recovery/index.js +6 -3
  185. package/dist/cjs/src/recovery/mempoolApi.d.ts.map +1 -0
  186. package/dist/cjs/src/recovery/mempoolApi.js +36 -0
  187. package/dist/cjs/src/recovery/psbt.d.ts +62 -0
  188. package/dist/cjs/src/recovery/psbt.d.ts.map +1 -0
  189. package/dist/cjs/src/recovery/psbt.js +153 -0
  190. package/dist/cjs/src/tnumber.d.ts +4 -0
  191. package/dist/cjs/src/tnumber.d.ts.map +1 -0
  192. package/dist/cjs/src/tnumber.js +12 -0
  193. package/dist/cjs/src/transaction/bip322.d.ts +27 -0
  194. package/dist/cjs/src/transaction/bip322.d.ts.map +1 -0
  195. package/dist/cjs/src/transaction/bip322.js +139 -0
  196. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts +2 -0
  197. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  198. package/dist/cjs/src/transaction/common/verifyPayGoAmount.js +3 -0
  199. package/dist/cjs/src/transaction/decode.d.ts +13 -0
  200. package/dist/cjs/src/transaction/decode.d.ts.map +1 -0
  201. package/dist/cjs/src/transaction/decode.js +88 -0
  202. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts +5 -0
  203. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  204. package/dist/cjs/src/transaction/descriptor/explainPsbt.js +45 -0
  205. package/dist/cjs/src/transaction/descriptor/index.d.ts +7 -0
  206. package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -0
  207. package/dist/cjs/src/transaction/descriptor/index.js +14 -0
  208. package/dist/cjs/src/transaction/descriptor/parse.d.ts +19 -0
  209. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
  210. package/dist/cjs/src/transaction/descriptor/parse.js +90 -0
  211. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts +14 -0
  212. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  213. package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +60 -0
  214. package/dist/cjs/src/transaction/descriptor/recipient.d.ts +5 -0
  215. package/dist/cjs/src/transaction/descriptor/recipient.d.ts.map +1 -0
  216. package/dist/cjs/src/transaction/descriptor/recipient.js +3 -0
  217. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts +24 -0
  218. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
  219. package/dist/cjs/src/transaction/descriptor/signPsbt.js +44 -0
  220. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts +37 -0
  221. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  222. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +81 -0
  223. package/dist/cjs/src/transaction/explainTransaction.d.ts +21 -0
  224. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
  225. package/dist/cjs/src/transaction/explainTransaction.js +90 -0
  226. package/dist/cjs/src/transaction/fetchInputs.d.ts +27 -0
  227. package/dist/cjs/src/transaction/fetchInputs.d.ts.map +1 -0
  228. package/dist/cjs/src/transaction/fetchInputs.js +111 -0
  229. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts +24 -0
  230. package/dist/cjs/src/transaction/fixedScript/SigningError.d.ts.map +1 -0
  231. package/dist/cjs/src/transaction/fixedScript/SigningError.js +32 -0
  232. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +45 -0
  233. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  234. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +149 -0
  235. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +83 -0
  236. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  237. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +346 -0
  238. package/dist/cjs/src/transaction/fixedScript/index.d.ts +10 -0
  239. package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
  240. package/dist/cjs/src/transaction/fixedScript/index.js +34 -0
  241. package/dist/cjs/src/transaction/fixedScript/musig2.d.ts +4 -0
  242. package/dist/cjs/src/transaction/fixedScript/musig2.d.ts.map +1 -0
  243. package/dist/cjs/src/transaction/fixedScript/musig2.js +3 -0
  244. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts +28 -0
  245. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  246. package/dist/cjs/src/transaction/fixedScript/parseOutput.js +216 -0
  247. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts +8 -0
  248. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  249. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +228 -0
  250. package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts +10 -0
  251. package/dist/cjs/src/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  252. package/dist/cjs/src/transaction/fixedScript/replayProtection.js +44 -0
  253. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts +32 -0
  254. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -0
  255. package/dist/cjs/src/transaction/fixedScript/signLegacyTransaction.js +163 -0
  256. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts +20 -0
  257. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -0
  258. package/dist/cjs/src/transaction/fixedScript/signPsbtUtxolib.js +157 -0
  259. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts +20 -0
  260. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
  261. package/dist/cjs/src/transaction/fixedScript/signPsbtWasm.js +116 -0
  262. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts +34 -0
  263. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  264. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +78 -0
  265. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  266. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  267. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +203 -0
  268. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  269. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  270. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.js +20 -0
  271. package/dist/cjs/src/transaction/index.d.ts +10 -0
  272. package/dist/cjs/src/transaction/index.d.ts.map +1 -0
  273. package/dist/cjs/src/transaction/index.js +54 -0
  274. package/dist/cjs/src/transaction/outputDifference.d.ts +44 -0
  275. package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -0
  276. package/dist/cjs/src/transaction/outputDifference.js +51 -0
  277. package/dist/cjs/src/transaction/parseTransaction.d.ts +4 -0
  278. package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -0
  279. package/dist/cjs/src/transaction/parseTransaction.js +48 -0
  280. package/dist/cjs/src/transaction/recipient.d.ts +34 -0
  281. package/dist/cjs/src/transaction/recipient.d.ts.map +1 -0
  282. package/dist/cjs/src/transaction/recipient.js +69 -0
  283. package/dist/cjs/src/transaction/signTransaction.d.ts +6 -0
  284. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -0
  285. package/dist/cjs/src/transaction/signTransaction.js +115 -0
  286. package/dist/cjs/src/transaction/types.d.ts +50 -0
  287. package/dist/cjs/src/transaction/types.d.ts.map +1 -0
  288. package/dist/cjs/src/transaction/types.js +7 -0
  289. package/dist/cjs/src/transaction/verifyTransaction.d.ts +4 -0
  290. package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -0
  291. package/dist/cjs/src/transaction/verifyTransaction.js +50 -0
  292. package/dist/cjs/src/unspent.d.ts +59 -0
  293. package/dist/cjs/src/unspent.d.ts.map +1 -0
  294. package/dist/cjs/src/unspent.js +20 -0
  295. package/dist/cjs/src/verifyKey.d.ts +21 -0
  296. package/dist/cjs/src/verifyKey.d.ts.map +1 -0
  297. package/dist/cjs/src/verifyKey.js +108 -0
  298. package/dist/cjs/src/wallet.d.ts +15 -0
  299. package/dist/cjs/src/wallet.d.ts.map +1 -0
  300. package/dist/cjs/src/wallet.js +8 -0
  301. package/dist/cjs/src/wasmUtil.d.ts +34 -0
  302. package/dist/cjs/src/wasmUtil.d.ts.map +1 -0
  303. package/dist/cjs/src/wasmUtil.js +95 -0
  304. package/dist/cjs/test/integration/impl/bch/bch.d.ts +2 -0
  305. package/dist/cjs/test/integration/impl/bch/bch.d.ts.map +1 -0
  306. package/dist/cjs/test/integration/impl/bch/bch.js +76 -0
  307. package/dist/cjs/test/unit/address.d.ts +2 -0
  308. package/dist/cjs/test/unit/address.d.ts.map +1 -0
  309. package/dist/cjs/test/unit/address.js +178 -0
  310. package/dist/cjs/test/unit/bip322.d.ts +2 -0
  311. package/dist/cjs/test/unit/bip322.d.ts.map +1 -0
  312. package/dist/cjs/test/unit/bip322.js +481 -0
  313. package/dist/cjs/test/unit/buildSignSendLegacyFormat.d.ts +2 -0
  314. package/dist/cjs/test/unit/buildSignSendLegacyFormat.d.ts.map +1 -0
  315. package/dist/cjs/test/unit/buildSignSendLegacyFormat.js +99 -0
  316. package/dist/cjs/test/unit/coins.d.ts +2 -0
  317. package/dist/cjs/test/unit/coins.d.ts.map +1 -0
  318. package/dist/cjs/test/unit/coins.js +161 -0
  319. package/dist/cjs/test/unit/customChangeWallet.d.ts +2 -0
  320. package/dist/cjs/test/unit/customChangeWallet.d.ts.map +1 -0
  321. package/dist/cjs/test/unit/customChangeWallet.js +204 -0
  322. package/dist/cjs/test/unit/customChangeWalletFixtures.d.ts +2 -0
  323. package/dist/cjs/test/unit/customChangeWalletFixtures.d.ts.map +1 -0
  324. package/dist/cjs/test/unit/customChangeWalletFixtures.js +53 -0
  325. package/dist/cjs/test/unit/customSigner.d.ts +2 -0
  326. package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
  327. package/dist/cjs/test/unit/customSigner.js +99 -0
  328. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts +2 -0
  329. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts.map +1 -0
  330. package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +51 -0
  331. package/dist/cjs/test/unit/descriptor/builder.d.ts +2 -0
  332. package/dist/cjs/test/unit/descriptor/builder.d.ts.map +1 -0
  333. package/dist/cjs/test/unit/descriptor/builder.js +78 -0
  334. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts +2 -0
  335. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  336. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +53 -0
  337. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts +2 -0
  338. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts.map +1 -0
  339. package/dist/cjs/test/unit/descriptor/descriptorWallet.js +62 -0
  340. package/dist/cjs/test/unit/descriptorAddress.d.ts +3 -0
  341. package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -0
  342. package/dist/cjs/test/unit/descriptorAddress.js +103 -0
  343. package/dist/cjs/test/unit/explainTransaction.d.ts +2 -0
  344. package/dist/cjs/test/unit/explainTransaction.d.ts.map +1 -0
  345. package/dist/cjs/test/unit/explainTransaction.js +37 -0
  346. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts +4 -0
  347. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts.map +1 -0
  348. package/dist/cjs/test/unit/fixtures/psbtHexProof.js +9 -0
  349. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts +2 -0
  350. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts.map +1 -0
  351. package/dist/cjs/test/unit/impl/bch/unit/bch.js +71 -0
  352. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts +2 -0
  353. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts.map +1 -0
  354. package/dist/cjs/test/unit/impl/bcha/unit/index.js +41 -0
  355. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts +2 -0
  356. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts.map +1 -0
  357. package/dist/cjs/test/unit/impl/bsv/unit/index.js +34 -0
  358. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts +2 -0
  359. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts.map +1 -0
  360. package/dist/cjs/test/unit/impl/btg/unit/index.js +33 -0
  361. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts +2 -0
  362. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts.map +1 -0
  363. package/dist/cjs/test/unit/impl/dash/unit/index.js +34 -0
  364. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts +2 -0
  365. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts.map +1 -0
  366. package/dist/cjs/test/unit/impl/doge/unit/index.js +34 -0
  367. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts +2 -0
  368. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts.map +1 -0
  369. package/dist/cjs/test/unit/impl/zec/unit/index.js +30 -0
  370. package/dist/cjs/test/unit/keySignatures.d.ts +2 -0
  371. package/dist/cjs/test/unit/keySignatures.d.ts.map +1 -0
  372. package/dist/cjs/test/unit/keySignatures.js +54 -0
  373. package/dist/cjs/test/unit/keychains.d.ts +2 -0
  374. package/dist/cjs/test/unit/keychains.d.ts.map +1 -0
  375. package/dist/cjs/test/unit/keychains.js +87 -0
  376. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts +2 -0
  377. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts.map +1 -0
  378. package/dist/cjs/test/unit/offlineVault/halfSigned.js +124 -0
  379. package/dist/cjs/test/unit/parseTransaction.d.ts +2 -0
  380. package/dist/cjs/test/unit/parseTransaction.d.ts.map +1 -0
  381. package/dist/cjs/test/unit/parseTransaction.js +155 -0
  382. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts +2 -0
  383. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.d.ts.map +1 -0
  384. package/dist/cjs/test/unit/pendingApprovalTxHexPsbt.js +99 -0
  385. package/dist/cjs/test/unit/postProcessPrebuild.d.ts +2 -0
  386. package/dist/cjs/test/unit/postProcessPrebuild.d.ts.map +1 -0
  387. package/dist/cjs/test/unit/postProcessPrebuild.js +65 -0
  388. package/dist/cjs/test/unit/prebuildAndSign.d.ts +2 -0
  389. package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -0
  390. package/dist/cjs/test/unit/prebuildAndSign.js +218 -0
  391. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts +2 -0
  392. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts.map +1 -0
  393. package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +136 -0
  394. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts +2 -0
  395. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.d.ts.map +1 -0
  396. package/dist/cjs/test/unit/recovery/backupKeyRecoveryUnspentGathering.js +144 -0
  397. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts +2 -0
  398. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts.map +1 -0
  399. package/dist/cjs/test/unit/recovery/crossChainRecovery.js +297 -0
  400. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts +2 -0
  401. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.d.ts.map +1 -0
  402. package/dist/cjs/test/unit/recovery/formatBackupKeyRecoveryResult.js +189 -0
  403. package/dist/cjs/test/unit/recovery/mock.d.ts +37 -0
  404. package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
  405. package/dist/cjs/test/unit/recovery/mock.js +111 -0
  406. package/dist/cjs/test/unit/signTransaction.d.ts +2 -0
  407. package/dist/cjs/test/unit/signTransaction.d.ts.map +1 -0
  408. package/dist/cjs/test/unit/signTransaction.js +223 -0
  409. package/dist/cjs/test/unit/testSpoofTransaction.d.ts +2 -0
  410. package/dist/cjs/test/unit/testSpoofTransaction.d.ts.map +1 -0
  411. package/dist/cjs/test/unit/testSpoofTransaction.js +114 -0
  412. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts +2 -0
  413. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  414. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +64 -0
  415. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts +6 -0
  416. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
  417. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +51 -0
  418. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts +2 -0
  419. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts.map +1 -0
  420. package/dist/cjs/test/unit/transaction/descriptor/parse.js +138 -0
  421. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts +2 -0
  422. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts.map +1 -0
  423. package/dist/cjs/test/unit/transaction/descriptor/sign.js +76 -0
  424. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts +2 -0
  425. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts.map +1 -0
  426. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +81 -0
  427. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts +2 -0
  428. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts.map +1 -0
  429. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +193 -0
  430. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts +2 -0
  431. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts.map +1 -0
  432. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +287 -0
  433. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.d.ts +2 -0
  434. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  435. package/dist/cjs/test/unit/transaction/fixedScript/replayProtection.js +60 -0
  436. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.d.ts +2 -0
  437. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.d.ts.map +1 -0
  438. package/dist/cjs/test/unit/transaction/fixedScript/signPsbt.js +98 -0
  439. package/dist/cjs/test/unit/transaction/outputDifference.d.ts +2 -0
  440. package/dist/cjs/test/unit/transaction/outputDifference.d.ts.map +1 -0
  441. package/dist/cjs/test/unit/transaction/outputDifference.js +117 -0
  442. package/dist/cjs/test/unit/transaction/recipient.d.ts +2 -0
  443. package/dist/cjs/test/unit/transaction/recipient.d.ts.map +1 -0
  444. package/dist/cjs/test/unit/transaction/recipient.js +52 -0
  445. package/dist/cjs/test/unit/transaction.d.ts +2 -0
  446. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  447. package/dist/cjs/test/unit/transaction.js +301 -0
  448. package/dist/cjs/test/unit/txFormat.d.ts +30 -0
  449. package/dist/cjs/test/unit/txFormat.d.ts.map +1 -0
  450. package/dist/cjs/test/unit/txFormat.js +161 -0
  451. package/dist/cjs/test/unit/util/address.d.ts +13 -0
  452. package/dist/cjs/test/unit/util/address.d.ts.map +1 -0
  453. package/dist/cjs/test/unit/util/address.js +15 -0
  454. package/dist/cjs/test/unit/util/assert.d.ts +3 -0
  455. package/dist/cjs/test/unit/util/assert.d.ts.map +1 -0
  456. package/dist/cjs/test/unit/util/assert.js +24 -0
  457. package/dist/cjs/test/unit/util/fixtures.d.ts +13 -0
  458. package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
  459. package/dist/cjs/test/unit/util/fixtures.js +105 -0
  460. package/dist/cjs/test/unit/util/index.d.ts +11 -0
  461. package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
  462. package/dist/cjs/test/unit/util/index.js +27 -0
  463. package/dist/cjs/test/unit/util/keychains.d.ts +55 -0
  464. package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
  465. package/dist/cjs/test/unit/util/keychains.js +122 -0
  466. package/dist/cjs/test/unit/util/nockBitGo.d.ts +10 -0
  467. package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
  468. package/dist/cjs/test/unit/util/nockBitGo.js +27 -0
  469. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts +8 -0
  470. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts.map +1 -0
  471. package/dist/cjs/test/unit/util/nockIndexerAPI.js +23 -0
  472. package/dist/cjs/test/unit/util/psbt.d.ts +19 -0
  473. package/dist/cjs/test/unit/util/psbt.d.ts.map +1 -0
  474. package/dist/cjs/test/unit/util/psbt.js +21 -0
  475. package/dist/cjs/test/unit/util/transaction.d.ts +28 -0
  476. package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
  477. package/dist/cjs/test/unit/util/transaction.js +131 -0
  478. package/dist/cjs/test/unit/util/unspents.d.ts +71 -0
  479. package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
  480. package/dist/cjs/test/unit/util/unspents.js +224 -0
  481. package/dist/cjs/test/unit/util/utxoCoins.d.ts +30 -0
  482. package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
  483. package/dist/cjs/test/unit/util/utxoCoins.js +175 -0
  484. package/dist/cjs/test/unit/util/wallet.d.ts +4 -0
  485. package/dist/cjs/test/unit/util/wallet.d.ts.map +1 -0
  486. package/dist/cjs/test/unit/util/wallet.js +9 -0
  487. package/dist/cjs/test/unit/verifyTransaction.d.ts +2 -0
  488. package/dist/cjs/test/unit/verifyTransaction.d.ts.map +1 -0
  489. package/dist/cjs/test/unit/verifyTransaction.js +327 -0
  490. package/dist/cjs/test/unit/wallet.d.ts +2 -0
  491. package/dist/cjs/test/unit/wallet.d.ts.map +1 -0
  492. package/dist/cjs/test/unit/wallet.js +251 -0
  493. package/dist/cjs/test/unit/webauthn.d.ts +2 -0
  494. package/dist/cjs/test/unit/webauthn.d.ts.map +1 -0
  495. package/dist/cjs/test/unit/webauthn.js +73 -0
  496. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  497. package/dist/esm/abstractUtxoCoin.d.ts +473 -0
  498. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
  499. package/dist/esm/abstractUtxoCoin.js +672 -0
  500. package/dist/esm/address/fixedScript.d.ts +44 -0
  501. package/dist/esm/address/fixedScript.d.ts.map +1 -0
  502. package/dist/esm/address/fixedScript.js +100 -0
  503. package/dist/esm/address/index.d.ts +2 -0
  504. package/dist/esm/address/index.d.ts.map +1 -0
  505. package/dist/esm/address/index.js +2 -0
  506. package/dist/esm/config.d.ts +9 -0
  507. package/dist/{src → esm}/config.d.ts.map +1 -1
  508. package/dist/esm/config.js +11 -0
  509. package/dist/esm/descriptor/NamedDescriptor.d.ts +19 -0
  510. package/dist/esm/descriptor/NamedDescriptor.d.ts.map +1 -0
  511. package/dist/esm/descriptor/NamedDescriptor.js +37 -0
  512. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  513. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  514. package/dist/esm/descriptor/assertDescriptorWalletAddress.js +27 -0
  515. package/dist/esm/descriptor/builder/builder.d.ts +12 -0
  516. package/dist/esm/descriptor/builder/builder.d.ts.map +1 -0
  517. package/dist/esm/descriptor/builder/builder.js +34 -0
  518. package/dist/esm/descriptor/builder/index.d.ts +3 -0
  519. package/dist/esm/descriptor/builder/index.d.ts.map +1 -0
  520. package/dist/esm/descriptor/builder/index.js +3 -0
  521. package/dist/esm/descriptor/builder/parse.d.ts +5 -0
  522. package/dist/esm/descriptor/builder/parse.d.ts.map +1 -0
  523. package/dist/esm/descriptor/builder/parse.js +112 -0
  524. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  525. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  526. package/dist/esm/descriptor/createWallet/createDescriptorWallet.js +37 -0
  527. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +12 -0
  528. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  529. package/dist/esm/descriptor/createWallet/createDescriptors.js +29 -0
  530. package/dist/esm/descriptor/createWallet/index.d.ts +3 -0
  531. package/dist/esm/descriptor/createWallet/index.d.ts.map +1 -0
  532. package/dist/esm/descriptor/createWallet/index.js +3 -0
  533. package/dist/esm/descriptor/descriptorWallet.d.ts +19 -0
  534. package/dist/esm/descriptor/descriptorWallet.d.ts.map +1 -0
  535. package/dist/esm/descriptor/descriptorWallet.js +16 -0
  536. package/dist/esm/descriptor/index.d.ts +8 -0
  537. package/dist/esm/descriptor/index.d.ts.map +1 -0
  538. package/dist/esm/descriptor/index.js +7 -0
  539. package/dist/esm/descriptor/validatePolicy.d.ts +22 -0
  540. package/dist/esm/descriptor/validatePolicy.d.ts.map +1 -0
  541. package/dist/esm/descriptor/validatePolicy.js +80 -0
  542. package/dist/esm/impl/bch/bch.d.ts +22 -0
  543. package/dist/esm/impl/bch/bch.d.ts.map +1 -0
  544. package/dist/esm/impl/bch/bch.js +39 -0
  545. package/dist/esm/impl/bch/index.d.ts +3 -0
  546. package/dist/esm/impl/bch/index.d.ts.map +1 -0
  547. package/dist/esm/impl/bch/index.js +3 -0
  548. package/dist/esm/impl/bch/tbch.d.ts +12 -0
  549. package/dist/esm/impl/bch/tbch.d.ts.map +1 -0
  550. package/dist/esm/impl/bch/tbch.js +11 -0
  551. package/dist/esm/impl/bcha/bcha.d.ts +9 -0
  552. package/dist/esm/impl/bcha/bcha.d.ts.map +1 -0
  553. package/dist/esm/impl/bcha/bcha.js +11 -0
  554. package/dist/esm/impl/bcha/index.d.ts +3 -0
  555. package/dist/esm/impl/bcha/index.d.ts.map +1 -0
  556. package/dist/esm/impl/bcha/index.js +3 -0
  557. package/dist/esm/impl/bcha/tbcha.d.ts +12 -0
  558. package/dist/esm/impl/bcha/tbcha.d.ts.map +1 -0
  559. package/dist/esm/impl/bcha/tbcha.js +11 -0
  560. package/dist/esm/impl/bsv/bsv.d.ts +9 -0
  561. package/dist/esm/impl/bsv/bsv.d.ts.map +1 -0
  562. package/dist/esm/impl/bsv/bsv.js +11 -0
  563. package/dist/esm/impl/bsv/index.d.ts +3 -0
  564. package/dist/esm/impl/bsv/index.d.ts.map +1 -0
  565. package/dist/esm/impl/bsv/index.js +3 -0
  566. package/dist/esm/impl/bsv/tbsv.d.ts +12 -0
  567. package/dist/esm/impl/bsv/tbsv.d.ts.map +1 -0
  568. package/dist/esm/impl/bsv/tbsv.js +11 -0
  569. package/dist/esm/impl/btc/btc.d.ts +15 -0
  570. package/dist/esm/impl/btc/btc.d.ts.map +1 -0
  571. package/dist/esm/impl/btc/btc.js +18 -0
  572. package/dist/esm/impl/btc/index.d.ts +7 -0
  573. package/dist/esm/impl/btc/index.d.ts.map +1 -0
  574. package/dist/esm/impl/btc/index.js +7 -0
  575. package/dist/esm/impl/btc/inscriptionBuilder.d.ts +61 -0
  576. package/dist/esm/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  577. package/dist/esm/impl/btc/inscriptionBuilder.js +164 -0
  578. package/dist/esm/impl/btc/tbtc.d.ts +12 -0
  579. package/dist/esm/impl/btc/tbtc.d.ts.map +1 -0
  580. package/dist/esm/impl/btc/tbtc.js +11 -0
  581. package/dist/esm/impl/btc/tbtc4.d.ts +12 -0
  582. package/dist/esm/impl/btc/tbtc4.d.ts.map +1 -0
  583. package/dist/esm/impl/btc/tbtc4.js +11 -0
  584. package/dist/esm/impl/btc/tbtcbgsig.d.ts +12 -0
  585. package/dist/esm/impl/btc/tbtcbgsig.d.ts.map +1 -0
  586. package/dist/esm/impl/btc/tbtcbgsig.js +11 -0
  587. package/dist/esm/impl/btc/tbtcsig.d.ts +12 -0
  588. package/dist/esm/impl/btc/tbtcsig.d.ts.map +1 -0
  589. package/dist/esm/impl/btc/tbtcsig.js +11 -0
  590. package/dist/esm/impl/btg/btg.d.ts +9 -0
  591. package/dist/esm/impl/btg/btg.d.ts.map +1 -0
  592. package/dist/esm/impl/btg/btg.js +11 -0
  593. package/dist/esm/impl/btg/index.d.ts +2 -0
  594. package/dist/esm/impl/btg/index.d.ts.map +1 -0
  595. package/dist/esm/impl/btg/index.js +2 -0
  596. package/dist/esm/impl/dash/dash.d.ts +9 -0
  597. package/dist/esm/impl/dash/dash.d.ts.map +1 -0
  598. package/dist/esm/impl/dash/dash.js +11 -0
  599. package/dist/esm/impl/dash/index.d.ts +3 -0
  600. package/dist/esm/impl/dash/index.d.ts.map +1 -0
  601. package/dist/esm/impl/dash/index.js +3 -0
  602. package/dist/esm/impl/dash/tdash.d.ts +12 -0
  603. package/dist/esm/impl/dash/tdash.d.ts.map +1 -0
  604. package/dist/esm/impl/dash/tdash.js +11 -0
  605. package/dist/esm/impl/doge/doge.d.ts +35 -0
  606. package/dist/esm/impl/doge/doge.d.ts.map +1 -0
  607. package/dist/esm/impl/doge/doge.js +75 -0
  608. package/dist/esm/impl/doge/index.d.ts +3 -0
  609. package/dist/esm/impl/doge/index.d.ts.map +1 -0
  610. package/dist/esm/impl/doge/index.js +3 -0
  611. package/dist/esm/impl/doge/tdoge.d.ts +12 -0
  612. package/dist/esm/impl/doge/tdoge.d.ts.map +1 -0
  613. package/dist/esm/impl/doge/tdoge.js +11 -0
  614. package/dist/esm/impl/index.d.ts +10 -0
  615. package/dist/esm/impl/index.d.ts.map +1 -0
  616. package/dist/esm/impl/index.js +10 -0
  617. package/dist/esm/impl/ltc/index.d.ts +3 -0
  618. package/dist/esm/impl/ltc/index.d.ts.map +1 -0
  619. package/dist/esm/impl/ltc/index.js +3 -0
  620. package/dist/esm/impl/ltc/ltc.d.ts +8 -0
  621. package/dist/esm/impl/ltc/ltc.d.ts.map +1 -0
  622. package/dist/esm/impl/ltc/ltc.js +11 -0
  623. package/dist/esm/impl/ltc/tltc.d.ts +8 -0
  624. package/dist/esm/impl/ltc/tltc.d.ts.map +1 -0
  625. package/dist/esm/impl/ltc/tltc.js +11 -0
  626. package/dist/esm/impl/zec/index.d.ts +3 -0
  627. package/dist/esm/impl/zec/index.d.ts.map +1 -0
  628. package/dist/esm/impl/zec/index.js +3 -0
  629. package/dist/esm/impl/zec/tzec.d.ts +9 -0
  630. package/dist/esm/impl/zec/tzec.d.ts.map +1 -0
  631. package/dist/esm/impl/zec/tzec.js +11 -0
  632. package/dist/esm/impl/zec/zec.d.ts +12 -0
  633. package/dist/esm/impl/zec/zec.d.ts.map +1 -0
  634. package/dist/esm/impl/zec/zec.js +11 -0
  635. package/dist/esm/index.d.ts +23 -0
  636. package/dist/esm/index.d.ts.map +1 -0
  637. package/dist/esm/index.js +23 -0
  638. package/dist/esm/keychains.d.ts +56 -0
  639. package/dist/esm/keychains.d.ts.map +1 -0
  640. package/dist/esm/keychains.js +99 -0
  641. package/dist/esm/names.d.ts +36 -0
  642. package/dist/esm/names.d.ts.map +1 -0
  643. package/dist/esm/names.js +184 -0
  644. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts +9 -0
  645. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  646. package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +20 -0
  647. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts +46 -0
  648. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  649. package/dist/esm/offlineVault/OfflineVaultSignable.js +18 -0
  650. package/dist/esm/offlineVault/TransactionExplanation.d.ts +16 -0
  651. package/dist/esm/offlineVault/TransactionExplanation.d.ts.map +1 -0
  652. package/dist/esm/offlineVault/TransactionExplanation.js +12 -0
  653. package/dist/esm/offlineVault/descriptor/index.d.ts +2 -0
  654. package/dist/esm/offlineVault/descriptor/index.d.ts.map +1 -0
  655. package/dist/esm/offlineVault/descriptor/index.js +2 -0
  656. package/dist/esm/offlineVault/descriptor/transaction.d.ts +39 -0
  657. package/dist/esm/offlineVault/descriptor/transaction.d.ts.map +1 -0
  658. package/dist/esm/offlineVault/descriptor/transaction.js +41 -0
  659. package/dist/esm/offlineVault/index.d.ts +6 -0
  660. package/dist/esm/offlineVault/index.d.ts.map +1 -0
  661. package/dist/esm/offlineVault/index.js +4 -0
  662. package/dist/esm/recovery/RecoveryProvider.d.ts +20 -0
  663. package/dist/esm/recovery/RecoveryProvider.d.ts.map +1 -0
  664. package/dist/esm/recovery/RecoveryProvider.js +19 -0
  665. package/dist/esm/recovery/backupKeyRecovery.d.ts +158 -0
  666. package/dist/esm/recovery/backupKeyRecovery.d.ts.map +1 -0
  667. package/dist/esm/recovery/backupKeyRecovery.js +400 -0
  668. package/dist/esm/recovery/baseApi.d.ts +24 -0
  669. package/dist/esm/recovery/baseApi.d.ts.map +1 -0
  670. package/dist/esm/recovery/baseApi.js +64 -0
  671. package/dist/esm/recovery/coingeckoApi.d.ts +6 -0
  672. package/dist/esm/recovery/coingeckoApi.d.ts.map +1 -0
  673. package/dist/esm/recovery/coingeckoApi.js +40 -0
  674. package/dist/esm/recovery/crossChainRecovery.d.ts +97 -0
  675. package/dist/esm/recovery/crossChainRecovery.d.ts.map +1 -0
  676. package/dist/esm/recovery/crossChainRecovery.js +292 -0
  677. package/dist/esm/recovery/index.d.ts +7 -0
  678. package/dist/{src → esm}/recovery/index.d.ts.map +1 -1
  679. package/dist/esm/recovery/index.js +7 -0
  680. package/dist/esm/recovery/mempoolApi.d.ts +7 -0
  681. package/dist/{src → esm}/recovery/mempoolApi.d.ts.map +1 -1
  682. package/dist/esm/recovery/mempoolApi.js +29 -0
  683. package/dist/esm/recovery/psbt.d.ts +62 -0
  684. package/dist/esm/recovery/psbt.d.ts.map +1 -0
  685. package/dist/esm/recovery/psbt.js +145 -0
  686. package/dist/esm/tnumber.d.ts +4 -0
  687. package/dist/esm/tnumber.d.ts.map +1 -0
  688. package/dist/esm/tnumber.js +9 -0
  689. package/dist/esm/transaction/bip322.d.ts +27 -0
  690. package/dist/esm/transaction/bip322.d.ts.map +1 -0
  691. package/dist/esm/transaction/bip322.js +100 -0
  692. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts +1 -0
  693. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  694. package/dist/esm/transaction/common/verifyPayGoAmount.js +1 -0
  695. package/dist/esm/transaction/decode.d.ts +13 -0
  696. package/dist/esm/transaction/decode.d.ts.map +1 -0
  697. package/dist/esm/transaction/decode.js +49 -0
  698. package/dist/esm/transaction/descriptor/explainPsbt.d.ts +5 -0
  699. package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  700. package/dist/esm/transaction/descriptor/explainPsbt.js +42 -0
  701. package/dist/esm/transaction/descriptor/index.d.ts +7 -0
  702. package/dist/esm/transaction/descriptor/index.d.ts.map +1 -0
  703. package/dist/esm/transaction/descriptor/index.js +6 -0
  704. package/dist/esm/transaction/descriptor/parse.d.ts +19 -0
  705. package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -0
  706. package/dist/esm/transaction/descriptor/parse.js +86 -0
  707. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +14 -0
  708. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  709. package/dist/esm/transaction/descriptor/parseToAmountType.js +55 -0
  710. package/dist/esm/transaction/descriptor/recipient.d.ts +5 -0
  711. package/dist/esm/transaction/descriptor/recipient.d.ts.map +1 -0
  712. package/dist/esm/transaction/descriptor/recipient.js +2 -0
  713. package/dist/esm/transaction/descriptor/signPsbt.d.ts +24 -0
  714. package/dist/esm/transaction/descriptor/signPsbt.d.ts.map +1 -0
  715. package/dist/esm/transaction/descriptor/signPsbt.js +39 -0
  716. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +37 -0
  717. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  718. package/dist/esm/transaction/descriptor/verifyTransaction.js +71 -0
  719. package/dist/esm/transaction/explainTransaction.d.ts +21 -0
  720. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
  721. package/dist/esm/transaction/explainTransaction.js +54 -0
  722. package/dist/esm/transaction/fetchInputs.d.ts +27 -0
  723. package/dist/esm/transaction/fetchInputs.d.ts.map +1 -0
  724. package/dist/esm/transaction/fetchInputs.js +74 -0
  725. package/dist/esm/transaction/fixedScript/SigningError.d.ts +24 -0
  726. package/dist/esm/transaction/fixedScript/SigningError.d.ts.map +1 -0
  727. package/dist/esm/transaction/fixedScript/SigningError.js +26 -0
  728. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +45 -0
  729. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  730. package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +144 -0
  731. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +83 -0
  732. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  733. package/dist/esm/transaction/fixedScript/explainTransaction.js +309 -0
  734. package/dist/esm/transaction/fixedScript/index.d.ts +10 -0
  735. package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
  736. package/dist/esm/transaction/fixedScript/index.js +9 -0
  737. package/dist/esm/transaction/fixedScript/musig2.d.ts +4 -0
  738. package/dist/esm/transaction/fixedScript/musig2.d.ts.map +1 -0
  739. package/dist/esm/transaction/fixedScript/musig2.js +2 -0
  740. package/dist/esm/transaction/fixedScript/parseOutput.d.ts +28 -0
  741. package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  742. package/dist/esm/transaction/fixedScript/parseOutput.js +209 -0
  743. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +8 -0
  744. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  745. package/dist/esm/transaction/fixedScript/parseTransaction.js +222 -0
  746. package/dist/esm/transaction/fixedScript/replayProtection.d.ts +10 -0
  747. package/dist/esm/transaction/fixedScript/replayProtection.d.ts.map +1 -0
  748. package/dist/esm/transaction/fixedScript/replayProtection.js +38 -0
  749. package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts +32 -0
  750. package/dist/esm/transaction/fixedScript/signLegacyTransaction.d.ts.map +1 -0
  751. package/dist/esm/transaction/fixedScript/signLegacyTransaction.js +123 -0
  752. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts +20 -0
  753. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.d.ts.map +1 -0
  754. package/dist/esm/transaction/fixedScript/signPsbtUtxolib.js +117 -0
  755. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts +20 -0
  756. package/dist/esm/transaction/fixedScript/signPsbtWasm.d.ts.map +1 -0
  757. package/dist/esm/transaction/fixedScript/signPsbtWasm.js +109 -0
  758. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +34 -0
  759. package/dist/esm/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  760. package/dist/esm/transaction/fixedScript/signTransaction.js +71 -0
  761. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  762. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  763. package/dist/esm/transaction/fixedScript/verifyTransaction.js +164 -0
  764. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  765. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  766. package/dist/esm/transaction/getPayGoVerificationPubkey.js +17 -0
  767. package/dist/esm/transaction/index.d.ts +10 -0
  768. package/dist/esm/transaction/index.d.ts.map +1 -0
  769. package/dist/esm/transaction/index.js +10 -0
  770. package/dist/esm/transaction/outputDifference.d.ts +44 -0
  771. package/dist/esm/transaction/outputDifference.d.ts.map +1 -0
  772. package/dist/esm/transaction/outputDifference.js +45 -0
  773. package/dist/esm/transaction/parseTransaction.d.ts +4 -0
  774. package/dist/esm/transaction/parseTransaction.d.ts.map +1 -0
  775. package/dist/esm/transaction/parseTransaction.js +12 -0
  776. package/dist/esm/transaction/recipient.d.ts +34 -0
  777. package/dist/esm/transaction/recipient.d.ts.map +1 -0
  778. package/dist/esm/transaction/recipient.js +61 -0
  779. package/dist/esm/transaction/signTransaction.d.ts +6 -0
  780. package/dist/esm/transaction/signTransaction.d.ts.map +1 -0
  781. package/dist/esm/transaction/signTransaction.js +76 -0
  782. package/dist/esm/transaction/types.d.ts +50 -0
  783. package/dist/esm/transaction/types.d.ts.map +1 -0
  784. package/dist/esm/transaction/types.js +4 -0
  785. package/dist/esm/transaction/verifyTransaction.d.ts +4 -0
  786. package/dist/esm/transaction/verifyTransaction.d.ts.map +1 -0
  787. package/dist/esm/transaction/verifyTransaction.js +14 -0
  788. package/dist/esm/unspent.d.ts +59 -0
  789. package/dist/esm/unspent.d.ts.map +1 -0
  790. package/dist/esm/unspent.js +15 -0
  791. package/dist/esm/verifyKey.d.ts +21 -0
  792. package/dist/esm/verifyKey.d.ts.map +1 -0
  793. package/dist/esm/verifyKey.js +100 -0
  794. package/dist/esm/wallet.d.ts +15 -0
  795. package/dist/esm/wallet.d.ts.map +1 -0
  796. package/dist/esm/wallet.js +5 -0
  797. package/dist/esm/wasmUtil.d.ts +34 -0
  798. package/dist/esm/wasmUtil.d.ts.map +1 -0
  799. package/dist/esm/wasmUtil.js +54 -0
  800. package/package.json +48 -20
  801. package/.eslintignore +0 -5
  802. package/CHANGELOG.md +0 -106
  803. package/dist/src/abstractUtxoCoin.d.ts +0 -383
  804. package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
  805. package/dist/src/abstractUtxoCoin.js +0 -960
  806. package/dist/src/config.js +0 -13
  807. package/dist/src/index.d.ts +0 -6
  808. package/dist/src/index.d.ts.map +0 -1
  809. package/dist/src/index.js +0 -18
  810. package/dist/src/parseOutput.d.ts +0 -22
  811. package/dist/src/parseOutput.d.ts.map +0 -1
  812. package/dist/src/parseOutput.js +0 -169
  813. package/dist/src/recovery/RecoveryProvider.d.ts.map +0 -1
  814. package/dist/src/recovery/RecoveryProvider.js +0 -24
  815. package/dist/src/recovery/backupKeyRecovery.d.ts +0 -59
  816. package/dist/src/recovery/backupKeyRecovery.d.ts.map +0 -1
  817. package/dist/src/recovery/backupKeyRecovery.js +0 -290
  818. package/dist/src/recovery/baseApi.d.ts.map +0 -1
  819. package/dist/src/recovery/baseApi.js +0 -73
  820. package/dist/src/recovery/coingeckoApi.d.ts.map +0 -1
  821. package/dist/src/recovery/coingeckoApi.js +0 -47
  822. package/dist/src/recovery/crossChainRecovery.d.ts.map +0 -1
  823. package/dist/src/recovery/crossChainRecovery.js +0 -338
  824. package/dist/src/recovery/mempoolApi.js +0 -33
  825. package/dist/src/recovery/smartbitApi.d.ts +0 -11
  826. package/dist/src/recovery/smartbitApi.d.ts.map +0 -1
  827. package/dist/src/recovery/smartbitApi.js +0 -36
  828. package/dist/src/replayProtection.d.ts +0 -4
  829. package/dist/src/replayProtection.d.ts.map +0 -1
  830. package/dist/src/replayProtection.js +0 -21
  831. package/dist/src/sign.d.ts +0 -31
  832. package/dist/src/sign.d.ts.map +0 -1
  833. package/dist/src/sign.js +0 -104
  834. package/dist/tsconfig.tsbuildinfo +0 -7600
  835. /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
@@ -0,0 +1,209 @@
1
+ import debugLib from 'debug';
2
+ import _ from 'lodash';
3
+ import { InvalidAddressDerivationPropertyError, UnexpectedAddressError, } from '@bitgo-beta/sdk-core';
4
+ import { fromExtendedAddressFormatToScript } from '../recipient';
5
+ const debug = debugLib('bitgo:v2:parseoutput');
6
+ export function isWalletOutput(output) {
7
+ return (output.chain !== undefined && output.index !== undefined);
8
+ }
9
+ /**
10
+ * Check an address which failed initial validation to see if it's the base address of a migrated v1 bch wallet.
11
+ *
12
+ * The wallet in question could be a migrated SafeHD BCH wallet, and the transaction we
13
+ * are currently parsing is trying to spend change back to the v1 wallet base address.
14
+ *
15
+ * It does this since we don't allow new address creation for these wallets,
16
+ * and instead return the base address from the v1 wallet when a new address is requested.
17
+ * If this new address is requested for the purposes of spending change back to the wallet,
18
+ * the change will go to the v1 wallet base address. This address *is* on the wallet,
19
+ * but it will still cause an error to be thrown by verifyAddress, since the derivation path
20
+ * used for this address is non-standard. (I have seen these addresses derived using paths m/0/0 and m/101,
21
+ * whereas the v2 addresses are derived using path m/0/0/${chain}/${index}).
22
+ *
23
+ * This means we need to check for this case explicitly in this catch block, and classify
24
+ * these types of outputs as internal instead of external. Failing to do so would cause the
25
+ * transaction's implicit external outputs (ie, outputs which go to addresses not specified in
26
+ * the recipients array) to add up to more than the 150 basis point limit which we enforce on
27
+ * pay-as-you-go outputs (which should be the only implicit external outputs on our transactions).
28
+ *
29
+ * The 150 basis point limit for implicit external sends is enforced in verifyTransaction,
30
+ * which calls this function to get information on the total external/internal spend amounts
31
+ * for a transaction. The idea here is to protect from the transaction being maliciously modified
32
+ * to add more implicit external spends (eg, to an attacker-controlled wallet).
33
+ *
34
+ * See verifyTransaction for more information on how transaction prebuilds are verified before signing.
35
+ *
36
+ * @param wallet {Wallet} wallet which is making the transaction
37
+ * @param currentAddress {string} address to check for externality relative to v1 wallet base address
38
+ */
39
+ function isMigratedAddress(wallet, currentAddress) {
40
+ if (_.isString(wallet.migratedFrom()) && wallet.migratedFrom() === currentAddress) {
41
+ debug('found address %s which was migrated from v1 wallet, address is not external', currentAddress);
42
+ return true;
43
+ }
44
+ return false;
45
+ }
46
+ /**
47
+ * Check to see if an address is derived from the given custom change keys
48
+ * @param {VerifyCustomChangeAddressOptions} params
49
+ * @return {boolean}
50
+ */
51
+ async function verifyCustomChangeAddress(params) {
52
+ const { coin, customChangeKeys, addressDetails, currentAddress } = params;
53
+ try {
54
+ return await coin.verifyAddress(_.extend({}, addressDetails, {
55
+ keychains: customChangeKeys,
56
+ address: currentAddress,
57
+ }));
58
+ }
59
+ catch (e) {
60
+ debug('failed to verify custom change address %s', currentAddress);
61
+ return false;
62
+ }
63
+ }
64
+ async function handleVerifyAddressError({ e, currentAddress, wallet, txParams, customChangeKeys, coin, addressDetails, considerMigratedFromAddressInternal, }) {
65
+ // Todo: name server-side errors to avoid message-based checking [BG-5124]
66
+ const walletAddressNotFound = e.message.includes('wallet address not found');
67
+ const unexpectedAddress = e instanceof UnexpectedAddressError;
68
+ if (walletAddressNotFound || unexpectedAddress) {
69
+ if (unexpectedAddress && !walletAddressNotFound) {
70
+ // check to see if this is a migrated v1 bch address - it could be internal
71
+ const isMigrated = isMigratedAddress(wallet, currentAddress);
72
+ if (isMigrated) {
73
+ return { external: considerMigratedFromAddressInternal === false };
74
+ }
75
+ debug('Address %s was found on wallet but could not be reconstructed', currentAddress);
76
+ // attempt to verify address using custom change address keys if the wallet has that feature enabled
77
+ if (customChangeKeys &&
78
+ (await verifyCustomChangeAddress({ coin, addressDetails, currentAddress, customChangeKeys }))) {
79
+ // address is valid against the custom change keys. Mark address as not external
80
+ // and request signature verification for the custom change keys
81
+ debug('Address %s verified as derived from the custom change keys', currentAddress);
82
+ return { external: false, needsCustomChangeKeySignatureVerification: true };
83
+ }
84
+ }
85
+ // the address was found, but not on the wallet, which simply means it's external
86
+ debug('Address %s presumed external', currentAddress);
87
+ return { external: true };
88
+ }
89
+ else if (e instanceof InvalidAddressDerivationPropertyError && currentAddress === txParams.changeAddress) {
90
+ // expect to see this error when passing in a custom changeAddress with no chain or index
91
+ return { external: false };
92
+ }
93
+ console.error('Address classification failed for address', currentAddress);
94
+ console.trace(e);
95
+ /**
96
+ * It might be a completely invalid address or a bad validation attempt or something else completely, in
97
+ * which case we do not proceed and rather rethrow the error, which is safer than assuming that the address
98
+ * validation failed simply because it's external to the wallet.
99
+ */
100
+ throw e;
101
+ }
102
+ async function fetchAddressDetails({ reqId, disableNetworking, addressDetailsPrebuild, addressDetailsVerification, currentAddress, wallet, }) {
103
+ let addressDetails = _.extend({}, addressDetailsPrebuild, addressDetailsVerification);
104
+ debug('Locally available address %s details: %O', currentAddress, addressDetails);
105
+ if (_.isEmpty(addressDetails) && !disableNetworking) {
106
+ addressDetails = await wallet.getAddress({ address: currentAddress, reqId });
107
+ debug('Downloaded address %s details: %O', currentAddress, addressDetails);
108
+ }
109
+ return addressDetails;
110
+ }
111
+ export async function parseOutput({ currentOutput, coin, txPrebuild, verification, keychainArray, wallet, txParams, customChange, reqId, }) {
112
+ const disableNetworking = !!verification.disableNetworking;
113
+ const currentAddress = currentOutput.address;
114
+ if (currentAddress === undefined) {
115
+ // In the case that the address is undefined, it means that the output has a non-encodeable scriptPubkey
116
+ // If this is the case, then we need to check that the amount is 0 and we can skip the rest.
117
+ if (currentOutput.amount.toString() !== '0') {
118
+ throw new Error('output with undefined address must have amount of 0');
119
+ }
120
+ return currentOutput;
121
+ }
122
+ // attempt to grab the address details from either the prebuilt tx, or the verification params.
123
+ // If both of these are empty, then we will try to get the address details from bitgo instead
124
+ const addressDetailsPrebuild = _.get(txPrebuild, `txInfo.walletAddressDetails.${currentAddress}`, {});
125
+ const addressDetailsVerification = verification?.addresses?.[currentAddress] ?? {};
126
+ debug('Parsing address details for %s', currentAddress);
127
+ let currentAddressDetails = undefined;
128
+ const RECIPIENT_THRESHOLD = 1000;
129
+ try {
130
+ // In the case of PSBTs, we can already determine the internal/external status of the output addresses
131
+ // based on the derivation information being included in the PSBT. We can short circuit GET v2.wallet.address
132
+ // and save on network requests. Since we have the derivation information already, we can still verify the address
133
+ if (currentOutput.external !== undefined) {
134
+ // In the case that we have a custom change wallet, we need to verify the address against the custom change keys
135
+ // and not the wallet keys. This check is done in the handleVerifyAddressError function if this error is thrown.
136
+ if (customChange !== undefined) {
137
+ throw new UnexpectedAddressError('`address validation failure');
138
+ }
139
+ // If it is an internal address, we can skip the network request and just verify the address locally with the
140
+ // derivation information we have. Otherwise, if the address is external, which is the only remaining case, we
141
+ // can just return the current output as is without contacting the server.
142
+ if (isWalletOutput(currentOutput)) {
143
+ const res = await coin.isWalletAddress({
144
+ keychains: keychainArray,
145
+ address: currentAddress,
146
+ chain: currentOutput.chain,
147
+ index: currentOutput.index,
148
+ });
149
+ if (!res) {
150
+ throw new UnexpectedAddressError();
151
+ }
152
+ }
153
+ return currentOutput;
154
+ }
155
+ /**
156
+ * For transaction with the legacy transaction format, the only way to
157
+ * determine whether an address is known on the wallet is to initiate a
158
+ * network request and fetch it. Should the request fail and return a 404,
159
+ * it will throw and therefore has to be caught. For that reason, address
160
+ * wallet ownership detection is wrapped in a try/catch. Additionally, once
161
+ * the address details are fetched on the wallet, a local address validation
162
+ * is run, whose errors however are generated client-side and can therefore
163
+ * be analyzed with more granularity and type checking.
164
+ */
165
+ /**
166
+ * In order to minimize API requests, we assume that explicit recipients are always external when the
167
+ * recipient list is > 1000 This is not always a valid assumption and could lead greater apparent spend (but never lower)
168
+ */
169
+ if (txParams.recipients !== undefined && txParams.recipients.length > RECIPIENT_THRESHOLD) {
170
+ const isCurrentAddressInRecipients = txParams.recipients.some((recipient) => fromExtendedAddressFormatToScript(recipient.address, coin.name).equals(fromExtendedAddressFormatToScript(currentAddress, coin.name)));
171
+ if (isCurrentAddressInRecipients) {
172
+ return { ...currentOutput };
173
+ }
174
+ }
175
+ const addressDetails = await fetchAddressDetails({
176
+ reqId,
177
+ addressDetailsVerification,
178
+ addressDetailsPrebuild,
179
+ currentAddress,
180
+ disableNetworking,
181
+ wallet,
182
+ });
183
+ // verify that the address is on the wallet. verifyAddress throws if
184
+ // it fails to correctly rederive the address, meaning it's external
185
+ currentAddressDetails = addressDetails;
186
+ await coin.verifyAddress(_.extend({}, addressDetails, {
187
+ keychains: keychainArray,
188
+ address: currentAddress,
189
+ }));
190
+ debug('Address %s verification passed', currentAddress);
191
+ // verify address succeeded without throwing, so the address was
192
+ // correctly rederived from the wallet keychains, making it not external
193
+ return _.extend({}, currentOutput, addressDetails, { external: false });
194
+ }
195
+ catch (e) {
196
+ debug('Address %s verification threw an error:', currentAddress, e);
197
+ return _.extend({}, currentOutput, await handleVerifyAddressError({
198
+ e,
199
+ coin,
200
+ currentAddress,
201
+ wallet,
202
+ txParams,
203
+ customChangeKeys: customChange && customChange.keys,
204
+ addressDetails: currentAddressDetails,
205
+ considerMigratedFromAddressInternal: verification.considerMigratedFromAddressInternal,
206
+ }));
207
+ }
208
+ }
209
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VPdXRwdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvdHJhbnNhY3Rpb24vZml4ZWRTY3JpcHQvcGFyc2VPdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxRQUFRLE1BQU0sT0FBTyxDQUFDO0FBQzdCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEVBR0wscUNBQXFDLEVBR3JDLHNCQUFzQixHQUl2QixNQUFNLHNCQUFzQixDQUFDO0FBSTlCLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUVqRSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUUvQyxNQUFNLFVBQVUsY0FBYyxDQUFDLE1BQWM7SUFDM0MsT0FBTyxDQUNKLE1BQWtDLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSyxNQUFrQyxDQUFDLEtBQUssS0FBSyxTQUFTLENBQ25ILENBQUM7QUFDSixDQUFDO0FBT0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxNQUFlLEVBQUUsY0FBc0I7SUFDaEUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsS0FBSyxjQUFjLEVBQUUsQ0FBQztRQUNsRixLQUFLLENBQUMsNkVBQTZFLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDckcsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBU0Q7Ozs7R0FJRztBQUNILEtBQUssVUFBVSx5QkFBeUIsQ0FBQyxNQUF3QztJQUMvRSxNQUFNLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFDMUUsSUFBSSxDQUFDO1FB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bnQiOlsiaW1wb3J0IGRlYnVnTGliIGZyb20gJ2RlYnVnJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBBZGRyZXNzVmVyaWZpY2F0aW9uRGF0YSxcbiAgSVJlcXVlc3RUcmFjZXIsXG4gIEludmFsaWRBZGRyZXNzRGVyaXZhdGlvblByb3BlcnR5RXJyb3IsXG4gIElXYWxsZXQsXG4gIFRyYW5zYWN0aW9uUHJlYnVpbGQsXG4gIFVuZXhwZWN0ZWRBZGRyZXNzRXJyb3IsXG4gIFZlcmlmaWNhdGlvbk9wdGlvbnMsXG4gIElUcmFuc2FjdGlvblJlY2lwaWVudCxcbiAgVHJpcGxlLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0VXR4b0NvaW4gfSBmcm9tICcuLi8uLi9hYnN0cmFjdFV0eG9Db2luJztcbmltcG9ydCB7IE91dHB1dCwgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBmcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0VG9TY3JpcHQgfSBmcm9tICcuLi9yZWNpcGllbnQnO1xuXG5jb25zdCBkZWJ1ZyA9IGRlYnVnTGliKCdiaXRnbzp2MjpwYXJzZW91dHB1dCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNXYWxsZXRPdXRwdXQob3V0cHV0OiBPdXRwdXQpOiBvdXRwdXQgaXMgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQge1xuICByZXR1cm4gKFxuICAgIChvdXRwdXQgYXMgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQpLmNoYWluICE9PSB1bmRlZmluZWQgJiYgKG91dHB1dCBhcyBGaXhlZFNjcmlwdFdhbGxldE91dHB1dCkuaW5kZXggIT09IHVuZGVmaW5lZFxuICApO1xufVxuXG5pbnRlcmZhY2UgSGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yUmVzcG9uc2Uge1xuICBleHRlcm5hbDogYm9vbGVhbjtcbiAgbmVlZHNDdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVWZXJpZmljYXRpb24/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIENoZWNrIGFuIGFkZHJlc3Mgd2hpY2ggZmFpbGVkIGluaXRpYWwgdmFsaWRhdGlvbiB0byBzZWUgaWYgaXQncyB0aGUgYmFzZSBhZGRyZXNzIG9mIGEgbWlncmF0ZWQgdjEgYmNoIHdhbGxldC5cbiAqXG4gKiBUaGUgd2FsbGV0IGluIHF1ZXN0aW9uIGNvdWxkIGJlIGEgbWlncmF0ZWQgU2FmZUhEIEJDSCB3YWxsZXQsIGFuZCB0aGUgdHJhbnNhY3Rpb24gd2VcbiAqIGFyZSBjdXJyZW50bHkgcGFyc2luZyBpcyB0cnlpbmcgdG8gc3BlbmQgY2hhbmdlIGJhY2sgdG8gdGhlIHYxIHdhbGxldCBiYXNlIGFkZHJlc3MuXG4gKlxuICogSXQgZG9lcyB0aGlzIHNpbmNlIHdlIGRvbid0IGFsbG93IG5ldyBhZGRyZXNzIGNyZWF0aW9uIGZvciB0aGVzZSB3YWxsZXRzLFxuICogYW5kIGluc3RlYWQgcmV0dXJuIHRoZSBiYXNlIGFkZHJlc3MgZnJvbSB0aGUgdjEgd2FsbGV0IHdoZW4gYSBuZXcgYWRkcmVzcyBpcyByZXF1ZXN0ZWQuXG4gKiBJZiB0aGlzIG5ldyBhZGRyZXNzIGlzIHJlcXVlc3RlZCBmb3IgdGhlIHB1cnBvc2VzIG9mIHNwZW5kaW5nIGNoYW5nZSBiYWNrIHRvIHRoZSB3YWxsZXQsXG4gKiB0aGUgY2hhbmdlIHdpbGwgZ28gdG8gdGhlIHYxIHdhbGxldCBiYXNlIGFkZHJlc3MuIFRoaXMgYWRkcmVzcyAqaXMqIG9uIHRoZSB3YWxsZXQsXG4gKiBidXQgaXQgd2lsbCBzdGlsbCBjYXVzZSBhbiBlcnJvciB0byBiZSB0aHJvd24gYnkgdmVyaWZ5QWRkcmVzcywgc2luY2UgdGhlIGRlcml2YXRpb24gcGF0aFxuICogdXNlZCBmb3IgdGhpcyBhZGRyZXNzIGlzIG5vbi1zdGFuZGFyZC4gKEkgaGF2ZSBzZWVuIHRoZXNlIGFkZHJlc3NlcyBkZXJpdmVkIHVzaW5nIHBhdGhzIG0vMC8wIGFuZCBtLzEwMSxcbiAqIHdoZXJlYXMgdGhlIHYyIGFkZHJlc3NlcyBhcmUgZGVyaXZlZCB1c2luZyBwYXRoICBtLzAvMC8ke2NoYWlufS8ke2luZGV4fSkuXG4gKlxuICogVGhpcyBtZWFucyB3ZSBuZWVkIHRvIGNoZWNrIGZvciB0aGlzIGNhc2UgZXhwbGljaXRseSBpbiB0aGlzIGNhdGNoIGJsb2NrLCBhbmQgY2xhc3NpZnlcbiAqIHRoZXNlIHR5cGVzIG9mIG91dHB1dHMgYXMgaW50ZXJuYWwgaW5zdGVhZCBvZiBleHRlcm5hbC4gRmFpbGluZyB0byBkbyBzbyB3b3VsZCBjYXVzZSB0aGVcbiAqIHRyYW5zYWN0aW9uJ3MgaW1wbGljaXQgZXh0ZXJuYWwgb3V0cHV0cyAoaWUsIG91dHB1dHMgd2hpY2ggZ28gdG8gYWRkcmVzc2VzIG5vdCBzcGVjaWZpZWQgaW5cbiAqIHRoZSByZWNpcGllbnRzIGFycmF5KSB0byBhZGQgdXAgdG8gbW9yZSB0aGFuIHRoZSAxNTAgYmFzaXMgcG9pbnQgbGltaXQgd2hpY2ggd2UgZW5mb3JjZSBvblxuICogcGF5LWFzLXlvdS1nbyBvdXRwdXRzICh3aGljaCBzaG91bGQgYmUgdGhlIG9ubHkgaW1wbGljaXQgZXh0ZXJuYWwgb3V0cHV0cyBvbiBvdXIgdHJhbnNhY3Rpb25zKS5cbiAqXG4gKiBUaGUgMTUwIGJhc2lzIHBvaW50IGxpbWl0IGZvciBpbXBsaWNpdCBleHRlcm5hbCBzZW5kcyBpcyBlbmZvcmNlZCBpbiB2ZXJpZnlUcmFuc2FjdGlvbixcbiAqIHdoaWNoIGNhbGxzIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IGluZm9ybWF0aW9uIG9uIHRoZSB0b3RhbCBleHRlcm5hbC9pbnRlcm5hbCBzcGVuZCBhbW91bnRzXG4gKiBmb3IgYSB0cmFuc2FjdGlvbi4gVGhlIGlkZWEgaGVyZSBpcyB0byBwcm90ZWN0IGZyb20gdGhlIHRyYW5zYWN0aW9uIGJlaW5nIG1hbGljaW91c2x5IG1vZGlmaWVkXG4gKiB0byBhZGQgbW9yZSBpbXBsaWNpdCBleHRlcm5hbCBzcGVuZHMgKGVnLCB0byBhbiBhdHRhY2tlci1jb250cm9sbGVkIHdhbGxldCkuXG4gKlxuICogU2VlIHZlcmlmeVRyYW5zYWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0cmFuc2FjdGlvbiBwcmVidWlsZHMgYXJlIHZlcmlmaWVkIGJlZm9yZSBzaWduaW5nLlxuICpcbiAqIEBwYXJhbSB3YWxsZXQge1dhbGxldH0gd2FsbGV0IHdoaWNoIGlzIG1ha2luZyB0aGUgdHJhbnNhY3Rpb25cbiAqIEBwYXJhbSBjdXJyZW50QWRkcmVzcyB7c3RyaW5nfSBhZGRyZXNzIHRvIGNoZWNrIGZvciBleHRlcm5hbGl0eSByZWxhdGl2ZSB0byB2MSB3YWxsZXQgYmFzZSBhZGRyZXNzXG4gKi9cbmZ1bmN0aW9uIGlzTWlncmF0ZWRBZGRyZXNzKHdhbGxldDogSVdhbGxldCwgY3VycmVudEFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoXy5pc1N0cmluZyh3YWxsZXQubWlncmF0ZWRGcm9tKCkpICYmIHdhbGxldC5taWdyYXRlZEZyb20oKSA9PT0gY3VycmVudEFkZHJlc3MpIHtcbiAgICBkZWJ1ZygnZm91bmQgYWRkcmVzcyAlcyB3aGljaCB3YXMgbWlncmF0ZWQgZnJvbSB2MSB3YWxsZXQsIGFkZHJlc3MgaXMgbm90IGV4dGVybmFsJywgY3VycmVudEFkZHJlc3MpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5pbnRlcmZhY2UgVmVyaWZ5Q3VzdG9tQ2hhbmdlQWRkcmVzc09wdGlvbnMge1xuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luO1xuICBjdXN0b21DaGFuZ2VLZXlzOiBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JPcHRpb25zWydjdXN0b21DaGFuZ2VLZXlzJ107XG4gIGFkZHJlc3NEZXRhaWxzOiBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JPcHRpb25zWydhZGRyZXNzRGV0YWlscyddO1xuICBjdXJyZW50QWRkcmVzczogSGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yT3B0aW9uc1snY3VycmVudEFkZHJlc3MnXTtcbn1cblxuLyoqXG4gKiBDaGVjayB0byBzZWUgaWYgYW4gYWRkcmVzcyBpcyBkZXJpdmVkIGZyb20gdGhlIGdpdmVuIGN1c3RvbSBjaGFuZ2Uga2V5c1xuICogQHBhcmFtIHtWZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzT3B0aW9uc30gcGFyYW1zXG4gKiBAcmV0dXJuIHtib29sZWFufVxuICovXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlDdXN0b21DaGFuZ2VBZGRyZXNzKHBhcmFtczogVmVyaWZ5Q3VzdG9tQ2hhbmdlQWRkcmVzc09wdGlvbnMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgeyBjb2luLCBjdXN0b21DaGFuZ2VLZXlzLCBhZGRyZXNzRGV0YWlscywgY3VycmVudEFkZHJlc3MgfSA9IHBhcmFtcztcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgY29pbi52ZXJpZnlBZGRyZXNzKFxuICAgICAgXy5leHRlbmQoe30sIGFkZHJlc3NEZXRhaWxzLCB7XG4gICAgICAgIGtleWNoYWluczogY3VzdG9tQ2hhbmdlS2V5cyxcbiAgICAgICAgYWRkcmVzczogY3VycmVudEFkZHJlc3MsXG4gICAgICB9KVxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkZWJ1ZygnZmFpbGVkIHRvIHZlcmlmeSBjdXN0b20gY2hhbmdlIGFkZHJlc3MgJXMnLCBjdXJyZW50QWRkcmVzcyk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmludGVyZmFjZSBIYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3JPcHRpb25zIHtcbiAgZTogRXJyb3I7XG4gIGN1cnJlbnRBZGRyZXNzOiBzdHJpbmc7XG4gIHdhbGxldDogSVdhbGxldDtcbiAgdHhQYXJhbXM6IHtcbiAgICBjaGFuZ2VBZGRyZXNzPzogc3RyaW5nO1xuICB9O1xuICBjdXN0b21DaGFuZ2VLZXlzPzogQ3VzdG9tQ2hhbmdlT3B0aW9uc1sna2V5cyddO1xuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luO1xuICBhZGRyZXNzRGV0YWlscz86IGFueTtcbiAgY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWw/OiBib29sZWFuO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVWZXJpZnlBZGRyZXNzRXJyb3Ioe1xuICBlLFxuICBjdXJyZW50QWRkcmVzcyxcbiAgd2FsbGV0LFxuICB0eFBhcmFtcyxcbiAgY3VzdG9tQ2hhbmdlS2V5cyxcbiAgY29pbixcbiAgYWRkcmVzc0RldGFpbHMsXG4gIGNvbnNpZGVyTWlncmF0ZWRGcm9tQWRkcmVzc0ludGVybmFsLFxufTogSGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yT3B0aW9ucyk6IFByb21pc2U8SGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yUmVzcG9uc2U+IHtcbiAgLy8gVG9kbzogbmFtZSBzZXJ2ZXItc2lkZSBlcnJvcnMgdG8gYXZvaWQgbWVzc2FnZS1iYXNlZCBjaGVja2luZyBbQkctNTEyNF1cbiAgY29uc3Qgd2FsbGV0QWRkcmVzc05vdEZvdW5kID0gZS5tZXNzYWdlLmluY2x1ZGVzKCd3YWxsZXQgYWRkcmVzcyBub3QgZm91bmQnKTtcbiAgY29uc3QgdW5leHBlY3RlZEFkZHJlc3MgPSBlIGluc3RhbmNlb2YgVW5leHBlY3RlZEFkZHJlc3NFcnJvcjtcbiAgaWYgKHdhbGxldEFkZHJlc3NOb3RGb3VuZCB8fCB1bmV4cGVjdGVkQWRkcmVzcykge1xuICAgIGlmICh1bmV4cGVjdGVkQWRkcmVzcyAmJiAhd2FsbGV0QWRkcmVzc05vdEZvdW5kKSB7XG4gICAgICAvLyBjaGVjayB0byBzZWUgaWYgdGhpcyBpcyBhIG1pZ3JhdGVkIHYxIGJjaCBhZGRyZXNzIC0gaXQgY291bGQgYmUgaW50ZXJuYWxcbiAgICAgIGNvbnN0IGlzTWlncmF0ZWQgPSBpc01pZ3JhdGVkQWRkcmVzcyh3YWxsZXQsIGN1cnJlbnRBZGRyZXNzKTtcbiAgICAgIGlmIChpc01pZ3JhdGVkKSB7XG4gICAgICAgIHJldHVybiB7IGV4dGVybmFsOiBjb25zaWRlck1pZ3JhdGVkRnJvbUFkZHJlc3NJbnRlcm5hbCA9PT0gZmFsc2UgfTtcbiAgICAgIH1cblxuICAgICAgZGVidWcoJ0FkZHJlc3MgJXMgd2FzIGZvdW5kIG9uIHdhbGxldCBidXQgY291bGQgbm90IGJlIHJlY29uc3RydWN0ZWQnLCBjdXJyZW50QWRkcmVzcyk7XG5cbiAgICAgIC8vIGF0dGVtcHQgdG8gdmVyaWZ5IGFkZHJlc3MgdXNpbmcgY3VzdG9tIGNoYW5nZSBhZGRyZXNzIGtleXMgaWYgdGhlIHdhbGxldCBoYXMgdGhhdCBmZWF0dXJlIGVuYWJsZWRcbiAgICAgIGlmIChcbiAgICAgICAgY3VzdG9tQ2hhbmdlS2V5cyAmJlxuICAgICAgICAoYXdhaXQgdmVyaWZ5Q3VzdG9tQ2hhbmdlQWRkcmVzcyh7IGNvaW4sIGFkZHJlc3NEZXRhaWxzLCBjdXJyZW50QWRkcmVzcywgY3VzdG9tQ2hhbmdlS2V5cyB9KSlcbiAgICAgICkge1xuICAgICAgICAvLyBhZGRyZXNzIGlzIHZhbGlkIGFnYWluc3QgdGhlIGN1c3RvbSBjaGFuZ2Uga2V5cy4gTWFyayBhZGRyZXNzIGFzIG5vdCBleHRlcm5hbFxuICAgICAgICAvLyBhbmQgcmVxdWVzdCBzaWduYXR1cmUgdmVyaWZpY2F0aW9uIGZvciB0aGUgY3VzdG9tIGNoYW5nZSBrZXlzXG4gICAgICAgIGRlYnVnKCdBZGRyZXNzICVzIHZlcmlmaWVkIGFzIGRlcml2ZWQgZnJvbSB0aGUgY3VzdG9tIGNoYW5nZSBrZXlzJywgY3VycmVudEFkZHJlc3MpO1xuICAgICAgICByZXR1cm4geyBleHRlcm5hbDogZmFsc2UsIG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uOiB0cnVlIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gdGhlIGFkZHJlc3Mgd2FzIGZvdW5kLCBidXQgbm90IG9uIHRoZSB3YWxsZXQsIHdoaWNoIHNpbXBseSBtZWFucyBpdCdzIGV4dGVybmFsXG4gICAgZGVidWcoJ0FkZHJlc3MgJXMgcHJlc3VtZWQgZXh0ZXJuYWwnLCBjdXJyZW50QWRkcmVzcyk7XG4gICAgcmV0dXJuIHsgZXh0ZXJuYWw6IHRydWUgfTtcbiAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgSW52YWxpZEFkZHJlc3NEZXJpdmF0aW9uUHJvcGVydHlFcnJvciAmJiBjdXJyZW50QWRkcmVzcyA9PT0gdHhQYXJhbXMuY2hhbmdlQWRkcmVzcykge1xuICAgIC8vIGV4cGVjdCB0byBzZWUgdGhpcyBlcnJvciB3aGVuIHBhc3NpbmcgaW4gYSBjdXN0b20gY2hhbmdlQWRkcmVzcyB3aXRoIG5vIGNoYWluIG9yIGluZGV4XG4gICAgcmV0dXJuIHsgZXh0ZXJuYWw6IGZhbHNlIH07XG4gIH1cblxuICBjb25zb2xlLmVycm9yKCdBZGRyZXNzIGNsYXNzaWZpY2F0aW9uIGZhaWxlZCBmb3IgYWRkcmVzcycsIGN1cnJlbnRBZGRyZXNzKTtcbiAgY29uc29sZS50cmFjZShlKTtcbiAgLyoqXG4gICAqIEl0IG1pZ2h0IGJlIGEgY29tcGxldGVseSBpbnZhbGlkIGFkZHJlc3Mgb3IgYSBiYWQgdmFsaWRhdGlvbiBhdHRlbXB0IG9yIHNvbWV0aGluZyBlbHNlIGNvbXBsZXRlbHksIGluXG4gICAqIHdoaWNoIGNhc2Ugd2UgZG8gbm90IHByb2NlZWQgYW5kIHJhdGhlciByZXRocm93IHRoZSBlcnJvciwgd2hpY2ggaXMgc2FmZXIgdGhhbiBhc3N1bWluZyB0aGF0IHRoZSBhZGRyZXNzXG4gICAqIHZhbGlkYXRpb24gZmFpbGVkIHNpbXBseSBiZWNhdXNlIGl0J3MgZXh0ZXJuYWwgdG8gdGhlIHdhbGxldC5cbiAgICovXG4gIHRocm93IGU7XG59XG5cbmludGVyZmFjZSBGZXRjaEFkZHJlc3NEZXRhaWxzT3B0aW9ucyB7XG4gIHJlcUlkPzogSVJlcXVlc3RUcmFjZXI7XG4gIGRpc2FibGVOZXR3b3JraW5nOiBib29sZWFuO1xuICBhZGRyZXNzRGV0YWlsc1ByZWJ1aWxkOiBhbnk7XG4gIGFkZHJlc3NEZXRhaWxzVmVyaWZpY2F0aW9uOiBhbnk7XG4gIGN1cnJlbnRBZGRyZXNzOiBzdHJpbmc7XG4gIHdhbGxldDogSVdhbGxldDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBZGRyZXNzRGV0YWlscyh7XG4gIHJlcUlkLFxuICBkaXNhYmxlTmV0d29ya2luZyxcbiAgYWRkcmVzc0RldGFpbHNQcmVidWlsZCxcbiAgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb24sXG4gIGN1cnJlbnRBZGRyZXNzLFxuICB3YWxsZXQsXG59OiBGZXRjaEFkZHJlc3NEZXRhaWxzT3B0aW9ucykge1xuICBsZXQgYWRkcmVzc0RldGFpbHMgPSBfLmV4dGVuZCh7fSwgYWRkcmVzc0RldGFpbHNQcmVidWlsZCwgYWRkcmVzc0RldGFpbHNWZXJpZmljYXRpb24pO1xuICBkZWJ1ZygnTG9jYWxseSBhdmFpbGFibGUgYWRkcmVzcyAlcyBkZXRhaWxzOiAlTycsIGN1cnJlbnRBZGRyZXNzLCBhZGRyZXNzRGV0YWlscyk7XG4gIGlmIChfLmlzRW1wdHkoYWRkcmVzc0RldGFpbHMpICYmICFkaXNhYmxlTmV0d29ya2luZykge1xuICAgIGFkZHJlc3NEZXRhaWxzID0gYXdhaXQgd2FsbGV0LmdldEFkZHJlc3MoeyBhZGRyZXNzOiBjdXJyZW50QWRkcmVzcywgcmVxSWQgfSk7XG4gICAgZGVidWcoJ0Rvd25sb2FkZWQgYWRkcmVzcyAlcyBkZXRhaWxzOiAlTycsIGN1cnJlbnRBZGRyZXNzLCBhZGRyZXNzRGV0YWlscyk7XG4gIH1cbiAgcmV0dXJuIGFkZHJlc3NEZXRhaWxzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbUNoYW5nZU9wdGlvbnMge1xuICBrZXlzOiBUcmlwbGU8eyBwdWI6IHN0cmluZyB9PjtcbiAgc2lnbmF0dXJlczogVHJpcGxlPHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyc2VPdXRwdXRPcHRpb25zIHtcbiAgY3VycmVudE91dHB1dDogT3V0cHV0O1xuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luO1xuICB0eFByZWJ1aWxkOiBUcmFuc2FjdGlvblByZWJ1aWxkO1xuICB2ZXJpZmljYXRpb246IFZlcmlmaWNhdGlvbk9wdGlvbnM7XG4gIGtleWNoYWluQXJyYXk6IFRyaXBsZTx7IHB1Yjogc3RyaW5nIH0+O1xuICB3YWxsZXQ6IElXYWxsZXQ7XG4gIHR4UGFyYW1zOiB7XG4gICAgcmVjaXBpZW50czogSVRyYW5zYWN0aW9uUmVjaXBpZW50W107XG4gICAgY2hhbmdlQWRkcmVzcz86IHN0cmluZztcbiAgfTtcbiAgY3VzdG9tQ2hhbmdlPzogQ3VzdG9tQ2hhbmdlT3B0aW9ucztcbiAgcmVxSWQ/OiBJUmVxdWVzdFRyYWNlcjtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBhcnNlT3V0cHV0KHtcbiAgY3VycmVudE91dHB1dCxcbiAgY29pbixcbiAgdHhQcmVidWlsZCxcbiAgdmVyaWZpY2F0aW9uLFxuICBrZXljaGFpbkFycmF5LFxuICB3YWxsZXQsXG4gIHR4UGFyYW1zLFxuICBjdXN0b21DaGFuZ2UsXG4gIHJlcUlkLFxufTogUGFyc2VPdXRwdXRPcHRpb25zKTogUHJvbWlzZTxPdXRwdXQ+IHtcbiAgY29uc3QgZGlzYWJsZU5ldHdvcmtpbmcgPSAhIXZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcbiAgY29uc3QgY3VycmVudEFkZHJlc3MgPSBjdXJyZW50T3V0cHV0LmFkZHJlc3M7XG5cbiAgaWYgKGN1cnJlbnRBZGRyZXNzID09PSB1bmRlZmluZWQpIHtcbiAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBhZGRyZXNzIGlzIHVuZGVmaW5lZCwgaXQgbWVhbnMgdGhhdCB0aGUgb3V0cHV0IGhhcyBhIG5vbi1lbmNvZGVhYmxlIHNjcmlwdFB1YmtleVxuICAgIC8vIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZW4gd2UgbmVlZCB0byBjaGVjayB0aGF0IHRoZSBhbW91bnQgaXMgMCBhbmQgd2UgY2FuIHNraXAgdGhlIHJlc3QuXG4gICAgaWYgKGN1cnJlbnRPdXRwdXQuYW1vdW50LnRvU3RyaW5nKCkgIT09ICcwJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvdXRwdXQgd2l0aCB1bmRlZmluZWQgYWRkcmVzcyBtdXN0IGhhdmUgYW1vdW50IG9mIDAnKTtcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRPdXRwdXQ7XG4gIH1cblxuICAvLyBhdHRlbXB0IHRvIGdyYWIgdGhlIGFkZHJlc3MgZGV0YWlscyBmcm9tIGVpdGhlciB0aGUgcHJlYnVpbHQgdHgsIG9yIHRoZSB2ZXJpZmljYXRpb24gcGFyYW1zLlxuICAvLyBJZiBib3RoIG9mIHRoZXNlIGFyZSBlbXB0eSwgdGhlbiB3ZSB3aWxsIHRyeSB0byBnZXQgdGhlIGFkZHJlc3MgZGV0YWlscyBmcm9tIGJpdGdvIGluc3RlYWRcbiAgY29uc3QgYWRkcmVzc0RldGFpbHNQcmVidWlsZCA9IF8uZ2V0KHR4UHJlYnVpbGQsIGB0eEluZm8ud2FsbGV0QWRkcmVzc0RldGFpbHMuJHtjdXJyZW50QWRkcmVzc31gLCB7fSk7XG4gIGNvbnN0IGFkZHJlc3NEZXRhaWxzVmVyaWZpY2F0aW9uOiBBZGRyZXNzVmVyaWZpY2F0aW9uRGF0YSA9IHZlcmlmaWNhdGlvbj8uYWRkcmVzc2VzPy5bY3VycmVudEFkZHJlc3NdID8/IHt9O1xuICBkZWJ1ZygnUGFyc2luZyBhZGRyZXNzIGRldGFpbHMgZm9yICVzJywgY3VycmVudEFkZHJlc3MpO1xuICBsZXQgY3VycmVudEFkZHJlc3NEZXRhaWxzID0gdW5kZWZpbmVkO1xuICBjb25zdCBSRUNJUElFTlRfVEhSRVNIT0xEID0gMTAwMDtcbiAgdHJ5IHtcbiAgICAvLyBJbiB0aGUgY2FzZSBvZiBQU0JUcywgd2UgY2FuIGFscmVhZHkgZGV0ZXJtaW5lIHRoZSBpbnRlcm5hbC9leHRlcm5hbCBzdGF0dXMgb2YgdGhlIG91dHB1dCBhZGRyZXNzZXNcbiAgICAvLyBiYXNlZCBvbiB0aGUgZGVyaXZhdGlvbiBpbmZvcm1hdGlvbiBiZWluZyBpbmNsdWRlZCBpbiB0aGUgUFNCVC4gV2UgY2FuIHNob3J0IGNpcmN1aXQgR0VUIHYyLndhbGxldC5hZGRyZXNzXG4gICAgLy8gYW5kIHNhdmUgb24gbmV0d29yayByZXF1ZXN0cy4gU2luY2Ugd2UgaGF2ZSB0aGUgZGVyaXZhdGlvbiBpbmZvcm1hdGlvbiBhbHJlYWR5LCB3ZSBjYW4gc3RpbGwgdmVyaWZ5IHRoZSBhZGRyZXNzXG4gICAgaWYgKGN1cnJlbnRPdXRwdXQuZXh0ZXJuYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB3ZSBoYXZlIGEgY3VzdG9tIGNoYW5nZSB3YWxsZXQsIHdlIG5lZWQgdG8gdmVyaWZ5IHRoZSBhZGRyZXNzIGFnYWluc3QgdGhlIGN1c3RvbSBjaGFuZ2Uga2V5c1xuICAgICAgLy8gYW5kIG5vdCB0aGUgd2FsbGV0IGtleXMuIFRoaXMgY2hlY2sgaXMgZG9uZSBpbiB0aGUgaGFuZGxlVmVyaWZ5QWRkcmVzc0Vycm9yIGZ1bmN0aW9uIGlmIHRoaXMgZXJyb3IgaXMgdGhyb3duLlxuICAgICAgaWYgKGN1c3RvbUNoYW5nZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKCdgYWRkcmVzcyB2YWxpZGF0aW9uIGZhaWx1cmUnKTtcbiAgICAgIH1cbiAgICAgIC8vIElmIGl0IGlzIGFuIGludGVybmFsIGFkZHJlc3MsIHdlIGNhbiBza2lwIHRoZSBuZXR3b3JrIHJlcXVlc3QgYW5kIGp1c3QgdmVyaWZ5IHRoZSBhZGRyZXNzIGxvY2FsbHkgd2l0aCB0aGVcbiAgICAgIC8vIGRlcml2YXRpb24gaW5mb3JtYXRpb24gd2UgaGF2ZS4gT3RoZXJ3aXNlLCBpZiB0aGUgYWRkcmVzcyBpcyBleHRlcm5hbCwgd2hpY2ggaXMgdGhlIG9ubHkgcmVtYWluaW5nIGNhc2UsIHdlXG4gICAgICAvLyBjYW4ganVzdCByZXR1cm4gdGhlIGN1cnJlbnQgb3V0cHV0IGFzIGlzIHdpdGhvdXQgY29udGFjdGluZyB0aGUgc2VydmVyLlxuICAgICAgaWYgKGlzV2FsbGV0T3V0cHV0KGN1cnJlbnRPdXRwdXQpKSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGNvaW4uaXNXYWxsZXRBZGRyZXNzKHtcbiAgICAgICAgICBrZXljaGFpbnM6IGtleWNoYWluQXJyYXksXG4gICAgICAgICAgYWRkcmVzczogY3VycmVudEFkZHJlc3MsXG4gICAgICAgICAgY2hhaW46IGN1cnJlbnRPdXRwdXQuY2hhaW4sXG4gICAgICAgICAgaW5kZXg6IGN1cnJlbnRPdXRwdXQuaW5kZXgsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoIXJlcykge1xuICAgICAgICAgIHRocm93IG5ldyBVbmV4cGVjdGVkQWRkcmVzc0Vycm9yKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjdXJyZW50T3V0cHV0O1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdHJhbnNhY3Rpb24gd2l0aCB0aGUgbGVnYWN5IHRyYW5zYWN0aW9uIGZvcm1hdCwgdGhlIG9ubHkgd2F5IHRvXG4gICAgICogZGV0ZXJtaW5lIHdoZXRoZXIgYW4gYWRkcmVzcyBpcyBrbm93biBvbiB0aGUgd2FsbGV0IGlzIHRvIGluaXRpYXRlIGFcbiAgICAgKiBuZXR3b3JrIHJlcXVlc3QgYW5kIGZldGNoIGl0LiBTaG91bGQgdGhlIHJlcXVlc3QgZmFpbCBhbmQgcmV0dXJuIGEgNDA0LFxuICAgICAqIGl0IHdpbGwgdGhyb3cgYW5kIHRoZXJlZm9yZSBoYXMgdG8gYmUgY2F1Z2h0LiBGb3IgdGhhdCByZWFzb24sIGFkZHJlc3NcbiAgICAgKiB3YWxsZXQgb3duZXJzaGlwIGRldGVjdGlvbiBpcyB3cmFwcGVkIGluIGEgdHJ5L2NhdGNoLiBBZGRpdGlvbmFsbHksIG9uY2VcbiAgICAgKiB0aGUgYWRkcmVzcyBkZXRhaWxzIGFyZSBmZXRjaGVkIG9uIHRoZSB3YWxsZXQsIGEgbG9jYWwgYWRkcmVzcyB2YWxpZGF0aW9uXG4gICAgICogaXMgcnVuLCB3aG9zZSBlcnJvcnMgaG93ZXZlciBhcmUgZ2VuZXJhdGVkIGNsaWVudC1zaWRlIGFuZCBjYW4gdGhlcmVmb3JlXG4gICAgICogYmUgYW5hbHl6ZWQgd2l0aCBtb3JlIGdyYW51bGFyaXR5IGFuZCB0eXBlIGNoZWNraW5nLlxuICAgICAqL1xuXG4gICAgLyoqXG4gICAgICogSW4gb3JkZXIgdG8gbWluaW1pemUgQVBJIHJlcXVlc3RzLCB3ZSBhc3N1bWUgdGhhdCBleHBsaWNpdCByZWNpcGllbnRzIGFyZSBhbHdheXMgZXh0ZXJuYWwgd2hlbiB0aGVcbiAgICAgKiByZWNpcGllbnQgbGlzdCBpcyA+IDEwMDAgVGhpcyBpcyBub3QgYWx3YXlzIGEgdmFsaWQgYXNzdW1wdGlvbiBhbmQgY291bGQgbGVhZCBncmVhdGVyIGFwcGFyZW50IHNwZW5kIChidXQgbmV2ZXIgbG93ZXIpXG4gICAgICovXG4gICAgaWYgKHR4UGFyYW1zLnJlY2lwaWVudHMgIT09IHVuZGVmaW5lZCAmJiB0eFBhcmFtcy5yZWNpcGllbnRzLmxlbmd0aCA+IFJFQ0lQSUVOVF9USFJFU0hPTEQpIHtcbiAgICAgIGNvbnN0IGlzQ3VycmVudEFkZHJlc3NJblJlY2lwaWVudHMgPSB0eFBhcmFtcy5yZWNpcGllbnRzLnNvbWUoKHJlY2lwaWVudCkgPT5cbiAgICAgICAgZnJvbUV4dGVuZGVkQWRkcmVzc0Zvcm1hdFRvU2NyaXB0KHJlY2lwaWVudC5hZGRyZXNzLCBjb2luLm5hbWUpLmVxdWFscyhcbiAgICAgICAgICBmcm9tRXh0ZW5kZWRBZGRyZXNzRm9ybWF0VG9TY3JpcHQoY3VycmVudEFkZHJlc3MsIGNvaW4ubmFtZSlcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgaWYgKGlzQ3VycmVudEFkZHJlc3NJblJlY2lwaWVudHMpIHtcbiAgICAgICAgcmV0dXJuIHsgLi4uY3VycmVudE91dHB1dCB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGFkZHJlc3NEZXRhaWxzID0gYXdhaXQgZmV0Y2hBZGRyZXNzRGV0YWlscyh7XG4gICAgICByZXFJZCxcbiAgICAgIGFkZHJlc3NEZXRhaWxzVmVyaWZpY2F0aW9uLFxuICAgICAgYWRkcmVzc0RldGFpbHNQcmVidWlsZCxcbiAgICAgIGN1cnJlbnRBZGRyZXNzLFxuICAgICAgZGlzYWJsZU5ldHdvcmtpbmcsXG4gICAgICB3YWxsZXQsXG4gICAgfSk7XG4gICAgLy8gdmVyaWZ5IHRoYXQgdGhlIGFkZHJlc3MgaXMgb24gdGhlIHdhbGxldC4gdmVyaWZ5QWRkcmVzcyB0aHJvd3MgaWZcbiAgICAvLyBpdCBmYWlscyB0byBjb3JyZWN0bHkgcmVkZXJpdmUgdGhlIGFkZHJlc3MsIG1lYW5pbmcgaXQncyBleHRlcm5hbFxuICAgIGN1cnJlbnRBZGRyZXNzRGV0YWlscyA9IGFkZHJlc3NEZXRhaWxzO1xuICAgIGF3YWl0IGNvaW4udmVyaWZ5QWRkcmVzcyhcbiAgICAgIF8uZXh0ZW5kKHt9LCBhZGRyZXNzRGV0YWlscywge1xuICAgICAgICBrZXljaGFpbnM6IGtleWNoYWluQXJyYXksXG4gICAgICAgIGFkZHJlc3M6IGN1cnJlbnRBZGRyZXNzLFxuICAgICAgfSlcbiAgICApO1xuICAgIGRlYnVnKCdBZGRyZXNzICVzIHZlcmlmaWNhdGlvbiBwYXNzZWQnLCBjdXJyZW50QWRkcmVzcyk7XG5cbiAgICAvLyB2ZXJpZnkgYWRkcmVzcyBzdWNjZWVkZWQgd2l0aG91dCB0aHJvd2luZywgc28gdGhlIGFkZHJlc3Mgd2FzXG4gICAgLy8gY29ycmVjdGx5IHJlZGVyaXZlZCBmcm9tIHRoZSB3YWxsZXQga2V5Y2hhaW5zLCBtYWtpbmcgaXQgbm90IGV4dGVybmFsXG4gICAgcmV0dXJuIF8uZXh0ZW5kKHt9LCBjdXJyZW50T3V0cHV0LCBhZGRyZXNzRGV0YWlscywgeyBleHRlcm5hbDogZmFsc2UgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkZWJ1ZygnQWRkcmVzcyAlcyB2ZXJpZmljYXRpb24gdGhyZXcgYW4gZXJyb3I6JywgY3VycmVudEFkZHJlc3MsIGUpO1xuICAgIHJldHVybiBfLmV4dGVuZChcbiAgICAgIHt9LFxuICAgICAgY3VycmVudE91dHB1dCxcbiAgICAgIGF3YWl0IGhhbmRsZVZlcmlmeUFkZHJlc3NFcnJvcih7XG4gICAgICAgIGUsXG4gICAgICAgIGNvaW4sXG4gICAgICAgIGN1cnJlbnRBZGRyZXNzLFxuICAgICAgICB3YWxsZXQsXG4gICAgICAgIHR4UGFyYW1zLFxuICAgICAgICBjdXN0b21DaGFuZ2VLZXlzOiBjdXN0b21DaGFuZ2UgJiYgY3VzdG9tQ2hhbmdlLmtleXMsXG4gICAgICAgIGFkZHJlc3NEZXRhaWxzOiBjdXJyZW50QWRkcmVzc0RldGFpbHMsXG4gICAgICAgIGNvbnNpZGVyTWlncmF0ZWRGcm9tQWRkcmVzc0ludGVybmFsOiB2ZXJpZmljYXRpb24uY29uc2lkZXJNaWdyYXRlZEZyb21BZGRyZXNzSW50ZXJuYWwsXG4gICAgICB9KVxuICAgICk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ import type { AbstractUtxoCoin, ParseTransactionOptions } from '../../abstractUtxoCoin';
2
+ import type { ParsedTransaction } from '../types';
3
+ import { ComparableOutput, ExpectedOutput } from '../outputDifference';
4
+ export type ComparableOutputWithExternal<TValue> = (ComparableOutput<TValue> | ExpectedOutput) & {
5
+ external: boolean | undefined;
6
+ };
7
+ export declare function parseTransaction<TNumber extends bigint | number>(coin: AbstractUtxoCoin, params: ParseTransactionOptions<TNumber>): Promise<ParsedTransaction<TNumber>>;
8
+ //# sourceMappingURL=parseTransaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parseTransaction.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/parseTransaction.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACxF,OAAO,KAAK,EAAmC,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAiBnF,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAoB,MAAM,qBAAqB,CAAC;AAMzF,MAAM,MAAM,4BAA4B,CAAC,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG;IAC/F,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B,CAAC;AAyGF,wBAAsB,gBAAgB,CAAC,OAAO,SAAS,MAAM,GAAG,MAAM,EACpE,IAAI,EAAE,gBAAgB,EACtB,MAAM,EAAE,uBAAuB,CAAC,OAAO,CAAC,GACvC,OAAO,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CA0KrC"}
@@ -0,0 +1,222 @@
1
+ import assert from 'assert';
2
+ import _ from 'lodash';
3
+ import { KeyIndices } from '@bitgo-beta/sdk-core';
4
+ import { fetchKeychains, getKeySignatures, toKeychainTriple, toXpubTriple, UtxoNamedKeychains, } from '../../keychains';
5
+ import { verifyKeySignature } from '../../verifyKey';
6
+ import { assertValidTransactionRecipient, fromExtendedAddressFormatToScript, isScriptRecipient, toExtendedAddressFormat, toOutputScript, } from '../recipient';
7
+ import { outputDifference } from '../outputDifference';
8
+ import { toTNumber } from '../../tnumber';
9
+ import { parseOutput } from './parseOutput';
10
+ function toCanonicalTransactionRecipient(coin, output) {
11
+ const amount = BigInt(output.valueString);
12
+ assertValidTransactionRecipient({ amount, address: output.address });
13
+ assert(output.address, 'address is required');
14
+ if (isScriptRecipient(output.address)) {
15
+ return { amount, address: output.address };
16
+ }
17
+ return { amount, address: coin.canonicalAddress(output.address) };
18
+ }
19
+ async function parseRbfTransaction(coin, params) {
20
+ const { txParams, wallet } = params;
21
+ assert(txParams.rbfTxIds);
22
+ assert(txParams.rbfTxIds.length === 1);
23
+ const txToBeReplaced = await wallet.getTransaction({ txHash: txParams.rbfTxIds[0], includeRbf: true });
24
+ const recipients = txToBeReplaced.outputs.flatMap((output) => {
25
+ // For self-sends, the walletId will be the same as the wallet's id
26
+ if (output.wallet === wallet.id()) {
27
+ return [];
28
+ }
29
+ return [toCanonicalTransactionRecipient(coin, output)];
30
+ });
31
+ // Recurse into parseTransaction with the derived recipients and without rbfTxIds
32
+ return parseTransaction(coin, {
33
+ ...params,
34
+ txParams: {
35
+ ...txParams,
36
+ recipients,
37
+ rbfTxIds: undefined,
38
+ },
39
+ });
40
+ }
41
+ function toExpectedOutputs(coin, txParams) {
42
+ // verify that each recipient from txParams has their own output
43
+ const expectedOutputs = (txParams.recipients ?? []).flatMap((output) => {
44
+ if (output.address === undefined) {
45
+ assert('script' in output, 'script is required for non-encodeable scriptPubkeys');
46
+ if (output.amount.toString() !== '0') {
47
+ throw new Error(`Only zero amounts allowed for non-encodeable scriptPubkeys: ${output}`);
48
+ }
49
+ return [
50
+ {
51
+ script: toOutputScript(output, coin.name),
52
+ value: output.amount === 'max' ? 'max' : BigInt(output.amount),
53
+ },
54
+ ];
55
+ }
56
+ return [
57
+ {
58
+ script: fromExtendedAddressFormatToScript(output.address, coin.name),
59
+ value: output.amount === 'max' ? 'max' : BigInt(output.amount),
60
+ },
61
+ ];
62
+ });
63
+ if (txParams.allowExternalChangeAddress && txParams.changeAddress) {
64
+ expectedOutputs.push({
65
+ script: toOutputScript(txParams.changeAddress, coin.name),
66
+ // When an external change address is explicitly specified, count all outputs going towards that
67
+ // address in the expected outputs (regardless of the output amount)
68
+ value: 'max',
69
+ // Note that the change output is not required to exist, so we mark it as optional.
70
+ optional: true,
71
+ });
72
+ }
73
+ return expectedOutputs;
74
+ }
75
+ function verifyCustomChangeKeys(userKeychain, customChange) {
76
+ for (const keyIndex of [KeyIndices.USER, KeyIndices.BACKUP, KeyIndices.BITGO]) {
77
+ if (!verifyKeySignature({
78
+ userKeychain,
79
+ keychainToVerify: customChange.keys[keyIndex],
80
+ keySignature: customChange.signatures[keyIndex],
81
+ })) {
82
+ throw new Error(`failed to verify custom change ${KeyIndices[keyIndex].toLowerCase()} key signature`);
83
+ }
84
+ }
85
+ }
86
+ export async function parseTransaction(coin, params) {
87
+ const { txParams, txPrebuild, wallet, verification = {}, reqId } = params;
88
+ // Branch off early for RBF transactions
89
+ if (txParams.rbfTxIds) {
90
+ return parseRbfTransaction(coin, params);
91
+ }
92
+ if (!_.isUndefined(verification.disableNetworking) && !_.isBoolean(verification.disableNetworking)) {
93
+ throw new Error('verification.disableNetworking must be a boolean');
94
+ }
95
+ const disableNetworking = verification.disableNetworking;
96
+ // obtain the keychains and key signatures
97
+ let keychains = verification.keychains;
98
+ if (!keychains) {
99
+ if (disableNetworking) {
100
+ throw new Error('cannot fetch keychains without networking');
101
+ }
102
+ keychains = await fetchKeychains(coin, wallet, reqId);
103
+ }
104
+ if (!UtxoNamedKeychains.is(keychains)) {
105
+ throw new Error('invalid keychains');
106
+ }
107
+ const keychainArray = toKeychainTriple(keychains);
108
+ const effectiveTxHex = txPrebuild.txHexPsbt ?? txPrebuild.txHex;
109
+ if (_.isUndefined(effectiveTxHex)) {
110
+ throw new Error('missing required txPrebuild property txHex');
111
+ }
112
+ const expectedOutputs = toExpectedOutputs(coin, txParams);
113
+ // get the keychains from the custom change wallet if needed
114
+ let customChange;
115
+ const { customChangeWalletId = undefined } = wallet.coinSpecific() || {};
116
+ if (customChangeWalletId) {
117
+ // fetch keychains from custom change wallet for deriving addresses.
118
+ // These keychains should be signed and this should be verified in verifyTransaction
119
+ const customChangeKeySignatures = wallet._wallet.customChangeKeySignatures;
120
+ const customChangeWallet = await coin.wallets().get({ id: customChangeWalletId });
121
+ const customChangeKeys = await fetchKeychains(coin, customChangeWallet, reqId);
122
+ if (!customChangeKeys) {
123
+ throw new Error('failed to fetch keychains for custom change wallet');
124
+ }
125
+ if (customChangeKeys.user && customChangeKeys.backup && customChangeKeys.bitgo && customChangeWallet) {
126
+ const customChangeKeychains = [
127
+ customChangeKeys.user,
128
+ customChangeKeys.backup,
129
+ customChangeKeys.bitgo,
130
+ ];
131
+ customChange = {
132
+ keys: customChangeKeychains,
133
+ signatures: [customChangeKeySignatures.user, customChangeKeySignatures.backup, customChangeKeySignatures.bitgo],
134
+ };
135
+ }
136
+ }
137
+ let customChangeXpubs;
138
+ if (customChange) {
139
+ verifyCustomChangeKeys(keychainArray[KeyIndices.USER], customChange);
140
+ customChangeXpubs = toXpubTriple(customChange.keys);
141
+ }
142
+ // obtain all outputs
143
+ const explanation = await coin.explainTransaction({
144
+ txHex: effectiveTxHex,
145
+ txInfo: txPrebuild.txInfo,
146
+ decodeWith: txPrebuild.decodeWith,
147
+ pubs: keychainArray.map((k) => k.pub),
148
+ customChangeXpubs,
149
+ });
150
+ const allOutputs = [...explanation.outputs, ...explanation.changeOutputs];
151
+ /**
152
+ * Loop through all the outputs and classify each of them as either internal spends
153
+ * or external spends by setting the "external" property to true or false on the output object.
154
+ */
155
+ const allOutputDetails = await Promise.all(allOutputs.map((currentOutput) => {
156
+ return parseOutput({
157
+ currentOutput,
158
+ coin,
159
+ txPrebuild,
160
+ verification,
161
+ keychainArray: toKeychainTriple(keychains),
162
+ wallet,
163
+ txParams: {
164
+ recipients: txParams.recipients ?? [],
165
+ changeAddress: txParams.changeAddress,
166
+ },
167
+ customChange,
168
+ reqId,
169
+ });
170
+ }));
171
+ const needsCustomChangeKeySignatureVerification = allOutputDetails.some((output) => output?.needsCustomChangeKeySignatureVerification);
172
+ const changeOutputs = _.filter(allOutputDetails, { external: false });
173
+ function toComparableOutputsWithExternal(outputs) {
174
+ return outputs.map((output) => ({
175
+ script: fromExtendedAddressFormatToScript(output.address, coin.name),
176
+ value: output.amount === 'max' ? 'max' : BigInt(output.amount),
177
+ external: output.external,
178
+ }));
179
+ }
180
+ const missingOutputs = outputDifference(expectedOutputs, toComparableOutputsWithExternal(allOutputs));
181
+ const implicitOutputs = outputDifference(toComparableOutputsWithExternal(allOutputDetails), expectedOutputs);
182
+ const explicitOutputs = outputDifference(toComparableOutputsWithExternal(allOutputDetails), implicitOutputs);
183
+ // these are all the non-wallet outputs that had been originally explicitly specified in recipients
184
+ const explicitExternalOutputs = explicitOutputs.filter((output) => output.external);
185
+ // this is the sum of all the originally explicitly specified non-wallet output values
186
+ const explicitExternalSpendAmount = toTNumber(explicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), coin.amountType);
187
+ /**
188
+ * The calculation of the implicit external spend amount pertains to verifying the pay-as-you-go-fee BitGo
189
+ * automatically applied to transactions sending money out of the wallet. The logic is fairly straightforward
190
+ * in that we compare the external spend amount that was specified explicitly by the user to the portion
191
+ * that was specified implicitly. To protect customers from people tampering with the transaction outputs, we
192
+ * define a threshold for the maximum percentage of the implicit external spend in relation to the explicit
193
+ * external spend.
194
+ *
195
+ * This has become obsolete with the intoduction of `utxocore.paygo.verifyPayGoAddressProof()`.
196
+ */
197
+ // make sure that all the extra addresses are change addresses
198
+ // get all the additional external outputs the server added and calculate their values
199
+ const implicitExternalOutputs = implicitOutputs.filter((output) => output.external);
200
+ const implicitExternalSpendAmount = toTNumber(implicitExternalOutputs.reduce((sum, o) => sum + BigInt(o.value), BigInt(0)), coin.amountType);
201
+ function toOutputs(outputs) {
202
+ return outputs.map((output) => ({
203
+ address: toExtendedAddressFormat(output.script, coin.name),
204
+ amount: output.value.toString(),
205
+ external: output.external,
206
+ }));
207
+ }
208
+ return {
209
+ keychains,
210
+ keySignatures: getKeySignatures(wallet) ?? {},
211
+ outputs: allOutputDetails,
212
+ missingOutputs: toOutputs(missingOutputs),
213
+ explicitExternalOutputs: toOutputs(explicitExternalOutputs),
214
+ implicitExternalOutputs: toOutputs(implicitExternalOutputs),
215
+ changeOutputs,
216
+ explicitExternalSpendAmount,
217
+ implicitExternalSpendAmount,
218
+ needsCustomChangeKeySignatureVerification,
219
+ customChange,
220
+ };
221
+ }
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VUcmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9wYXJzZVRyYW5zYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxFQUF5QixVQUFVLEVBQXVDLE1BQU0sc0JBQXNCLENBQUM7QUFJOUcsT0FBTyxFQUNMLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsZ0JBQWdCLEVBQ2hCLFlBQVksRUFFWixrQkFBa0IsR0FDbkIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRCxPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLGlDQUFpQyxFQUNqQyxpQkFBaUIsRUFDakIsdUJBQXVCLEVBQ3ZCLGNBQWMsR0FDZixNQUFNLGNBQWMsQ0FBQztBQUN0QixPQUFPLEVBQW9DLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDekYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUcxQyxPQUFPLEVBQXVCLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQU1qRSxTQUFTLCtCQUErQixDQUN0QyxJQUFzQixFQUN0QixNQUFpRDtJQUtqRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzFDLCtCQUErQixDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyRSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQzlDLElBQUksaUJBQWlCLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7UUFD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XyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSVRyYW5zYWN0aW9uUmVjaXBpZW50LCBLZXlJbmRpY2VzLCBUcmlwbGUsIFZlcmlmaWNhdGlvbk9wdGlvbnMsIFdhbGxldCB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcblxuaW1wb3J0IHR5cGUgeyBBYnN0cmFjdFV0eG9Db2luLCBQYXJzZVRyYW5zYWN0aW9uT3B0aW9ucyB9IGZyb20gJy4uLy4uL2Fic3RyYWN0VXR4b0NvaW4nO1xuaW1wb3J0IHR5cGUgeyBGaXhlZFNjcmlwdFdhbGxldE91dHB1dCwgT3V0cHV0LCBQYXJzZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7XG4gIGZldGNoS2V5Y2hhaW5zLFxuICBnZXRLZXlTaWduYXR1cmVzLFxuICB0b0tleWNoYWluVHJpcGxlLFxuICB0b1hwdWJUcmlwbGUsXG4gIFV0eG9LZXljaGFpbixcbiAgVXR4b05hbWVkS2V5Y2hhaW5zLFxufSBmcm9tICcuLi8uLi9rZXljaGFpbnMnO1xuaW1wb3J0IHsgdmVyaWZ5S2V5U2lnbmF0dXJlIH0gZnJvbSAnLi4vLi4vdmVyaWZ5S2V5JztcbmltcG9ydCB7XG4gIGFzc2VydFZhbGlkVHJhbnNhY3Rpb25SZWNpcGllbnQsXG4gIGZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXRUb1NjcmlwdCxcbiAgaXNTY3JpcHRSZWNpcGllbnQsXG4gIHRvRXh0ZW5kZWRBZGRyZXNzRm9ybWF0LFxuICB0b091dHB1dFNjcmlwdCxcbn0gZnJvbSAnLi4vcmVjaXBpZW50JztcbmltcG9ydCB7IENvbXBhcmFibGVPdXRwdXQsIEV4cGVjdGVkT3V0cHV0LCBvdXRwdXREaWZmZXJlbmNlIH0gZnJvbSAnLi4vb3V0cHV0RGlmZmVyZW5jZSc7XG5pbXBvcnQgeyB0b1ROdW1iZXIgfSBmcm9tICcuLi8uLi90bnVtYmVyJztcblxuaW1wb3J0IHR5cGUgeyBUcmFuc2FjdGlvbkV4cGxhbmF0aW9uIH0gZnJvbSAnLi9leHBsYWluVHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgQ3VzdG9tQ2hhbmdlT3B0aW9ucywgcGFyc2VPdXRwdXQgfSBmcm9tICcuL3BhcnNlT3V0cHV0JztcblxuZXhwb3J0IHR5cGUgQ29tcGFyYWJsZU91dHB1dFdpdGhFeHRlcm5hbDxUVmFsdWU+ID0gKENvbXBhcmFibGVPdXRwdXQ8VFZhbHVlPiB8IEV4cGVjdGVkT3V0cHV0KSAmIHtcbiAgZXh0ZXJuYWw6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59O1xuXG5mdW5jdGlvbiB0b0Nhbm9uaWNhbFRyYW5zYWN0aW9uUmVjaXBpZW50KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBvdXRwdXQ6IHsgdmFsdWVTdHJpbmc6IHN0cmluZzsgYWRkcmVzcz86IHN0cmluZyB9XG4pOiB7XG4gIGFtb3VudDogYmlnaW50O1xuICBhZGRyZXNzOiBzdHJpbmc7XG59IHtcbiAgY29uc3QgYW1vdW50ID0gQmlnSW50KG91dHB1dC52YWx1ZVN0cmluZyk7XG4gIGFzc2VydFZhbGlkVHJhbnNhY3Rpb25SZWNpcGllbnQoeyBhbW91bnQsIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzIH0pO1xuICBhc3NlcnQob3V0cHV0LmFkZHJlc3MsICdhZGRyZXNzIGlzIHJlcXVpcmVkJyk7XG4gIGlmIChpc1NjcmlwdFJlY2lwaWVudChvdXRwdXQuYWRkcmVzcykpIHtcbiAgICByZXR1cm4geyBhbW91bnQsIGFkZHJlc3M6IG91dHB1dC5hZGRyZXNzIH07XG4gIH1cbiAgcmV0dXJuIHsgYW1vdW50LCBhZGRyZXNzOiBjb2luLmNhbm9uaWNhbEFkZHJlc3Mob3V0cHV0LmFkZHJlc3MpIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBhcnNlUmJmVHJhbnNhY3Rpb248VE51bWJlciBleHRlbmRzIGJpZ2ludCB8IG51bWJlcj4oXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHBhcmFtczogUGFyc2VUcmFuc2FjdGlvbk9wdGlvbnM8VE51bWJlcj5cbik6IFByb21pc2U8UGFyc2VkVHJhbnNhY3Rpb248VE51bWJlcj4+IHtcbiAgY29uc3QgeyB0eFBhcmFtcywgd2FsbGV0IH0gPSBwYXJhbXM7XG5cbiAgYXNzZXJ0KHR4UGFyYW1zLnJiZlR4SWRzKTtcbiAgYXNzZXJ0KHR4UGFyYW1zLnJiZlR4SWRzLmxlbmd0aCA9PT0gMSk7XG5cbiAgY29uc3QgdHhUb0JlUmVwbGFjZWQgPSBhd2FpdCB3YWxsZXQuZ2V0VHJhbnNhY3Rpb24oeyB0eEhhc2g6IHR4UGFyYW1zLnJiZlR4SWRzWzBdLCBpbmNsdWRlUmJmOiB0cnVlIH0pO1xuICBjb25zdCByZWNpcGllbnRzID0gdHhUb0JlUmVwbGFjZWQub3V0cHV0cy5mbGF0TWFwKFxuICAgIChvdXRwdXQ6IHsgdmFsdWVTdHJpbmc6IHN0cmluZzsgYWRkcmVzcz86IHN0cmluZzsgd2FsbGV0Pzogc3RyaW5nIH0pID0+IHtcbiAgICAgIC8vIEZvciBzZWxmLXNlbmRzLCB0aGUgd2FsbGV0SWQgd2lsbCBiZSB0aGUgc2FtZSBhcyB0aGUgd2FsbGV0J3MgaWRcbiAgICAgIGlmIChvdXRwdXQud2FsbGV0ID09PSB3YWxsZXQuaWQoKSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgICB9XG4gICAgICByZXR1cm4gW3RvQ2Fub25pY2FsVHJhbnNhY3Rpb25SZWNpcGllbnQoY29pbiwgb3V0cHV0KV07XG4gICAgfVxuICApO1xuXG4gIC8vIFJlY3Vyc2UgaW50byBwYXJzZVRyYW5zYWN0aW9uIHdpdGggdGhlIGRlcml2ZWQgcmVjaXBpZW50cyBhbmQgd2l0aG91dCByYmZUeElkc1xuICByZXR1cm4gcGFyc2VUcmFuc2FjdGlvbihjb2luLCB7XG4gICAgLi4ucGFyYW1zLFxuICAgIHR4UGFyYW1zOiB7XG4gICAgICAuLi50eFBhcmFtcyxcbiAgICAgIHJlY2lwaWVudHMsXG4gICAgICByYmZUeElkczogdW5kZWZpbmVkLFxuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiB0b0V4cGVjdGVkT3V0cHV0cyhcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgdHhQYXJhbXM6IHtcbiAgICByZWNpcGllbnRzPzogSVRyYW5zYWN0aW9uUmVjaXBpZW50W107XG4gICAgYWxsb3dFeHRlcm5hbENoYW5nZUFkZHJlc3M/OiBib29sZWFuO1xuICAgIGNoYW5nZUFkZHJlc3M/OiBzdHJpbmc7XG4gIH1cbik6IEV4cGVjdGVkT3V0cHV0W10ge1xuICAvLyB2ZXJpZnkgdGhhdCBlYWNoIHJlY2lwaWVudCBmcm9tIHR4UGFyYW1zIGhhcyB0aGVpciBvd24gb3V0cHV0XG4gIGNvbnN0IGV4cGVjdGVkT3V0cHV0czogRXhwZWN0ZWRPdXRwdXRbXSA9ICh0eFBhcmFtcy5yZWNpcGllbnRzID8/IFtdKS5mbGF0TWFwKChvdXRwdXQpID0+IHtcbiAgICBpZiAob3V0cHV0LmFkZHJlc3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgYXNzZXJ0KCdzY3JpcHQnIGluIG91dHB1dCwgJ3NjcmlwdCBpcyByZXF1aXJlZCBmb3Igbm9uLWVuY29kZWFibGUgc2NyaXB0UHVia2V5cycpO1xuICAgICAgaWYgKG91dHB1dC5hbW91bnQudG9TdHJpbmcoKSAhPT0gJzAnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgT25seSB6ZXJvIGFtb3VudHMgYWxsb3dlZCBmb3Igbm9uLWVuY29kZWFibGUgc2NyaXB0UHVia2V5czogJHtvdXRwdXR9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgc2NyaXB0OiB0b091dHB1dFNjcmlwdChvdXRwdXQsIGNvaW4ubmFtZSksXG4gICAgICAgICAgdmFsdWU6IG91dHB1dC5hbW91bnQgPT09ICdtYXgnID8gJ21heCcgOiBCaWdJbnQob3V0cHV0LmFtb3VudCksXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cbiAgICByZXR1cm4gW1xuICAgICAge1xuICAgICAgICBzY3JpcHQ6IGZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXRUb1NjcmlwdChvdXRwdXQuYWRkcmVzcywgY29pbi5uYW1lKSxcbiAgICAgICAgdmFsdWU6IG91dHB1dC5hbW91bnQgPT09ICdtYXgnID8gJ21heCcgOiBCaWdJbnQob3V0cHV0LmFtb3VudCksXG4gICAgICB9LFxuICAgIF07XG4gIH0pO1xuICBpZiAodHhQYXJhbXMuYWxsb3dFeHRlcm5hbENoYW5nZUFkZHJlc3MgJiYgdHhQYXJhbXMuY2hhbmdlQWRkcmVzcykge1xuICAgIGV4cGVjdGVkT3V0cHV0cy5wdXNoKHtcbiAgICAgIHNjcmlwdDogdG9PdXRwdXRTY3JpcHQodHhQYXJhbXMuY2hhbmdlQWRkcmVzcywgY29pbi5uYW1lKSxcbiAgICAgIC8vIFdoZW4gYW4gZXh0ZXJuYWwgY2hhbmdlIGFkZHJlc3MgaXMgZXhwbGljaXRseSBzcGVjaWZpZWQsIGNvdW50IGFsbCBvdXRwdXRzIGdvaW5nIHRvd2FyZHMgdGhhdFxuICAgICAgLy8gYWRkcmVzcyBpbiB0aGUgZXhwZWN0ZWQgb3V0cHV0cyAocmVnYXJkbGVzcyBvZiB0aGUgb3V0cHV0IGFtb3VudClcbiAgICAgIHZhbHVlOiAnbWF4JyxcbiAgICAgIC8vIE5vdGUgdGhhdCB0aGUgY2hhbmdlIG91dHB1dCBpcyBub3QgcmVxdWlyZWQgdG8gZXhpc3QsIHNvIHdlIG1hcmsgaXQgYXMgb3B0aW9uYWwuXG4gICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZXhwZWN0ZWRPdXRwdXRzO1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlDdXN0b21DaGFuZ2VLZXlzKHVzZXJLZXljaGFpbjogVXR4b0tleWNoYWluLCBjdXN0b21DaGFuZ2U6IEN1c3RvbUNoYW5nZU9wdGlvbnMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXlJbmRleCBvZiBbS2V5SW5kaWNlcy5VU0VSLCBLZXlJbmRpY2VzLkJBQ0tVUCwgS2V5SW5kaWNlcy5CSVRHT10pIHtcbiAgICBpZiAoXG4gICAgICAhdmVyaWZ5S2V5U2lnbmF0dXJlKHtcbiAgICAgICAgdXNlcktleWNoYWluLFxuICAgICAgICBrZXljaGFpblRvVmVyaWZ5OiBjdXN0b21DaGFuZ2Uua2V5c1trZXlJbmRleF0sXG4gICAgICAgIGtleVNpZ25hdHVyZTogY3VzdG9tQ2hhbmdlLnNpZ25hdHVyZXNba2V5SW5kZXhdLFxuICAgICAgfSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZmFpbGVkIHRvIHZlcmlmeSBjdXN0b20gY2hhbmdlICR7S2V5SW5kaWNlc1trZXlJbmRleF0udG9Mb3dlckNhc2UoKX0ga2V5IHNpZ25hdHVyZWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGFyc2VUcmFuc2FjdGlvbjxUTnVtYmVyIGV4dGVuZHMgYmlnaW50IHwgbnVtYmVyPihcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgcGFyYW1zOiBQYXJzZVRyYW5zYWN0aW9uT3B0aW9uczxUTnVtYmVyPlxuKTogUHJvbWlzZTxQYXJzZWRUcmFuc2FjdGlvbjxUTnVtYmVyPj4ge1xuICBjb25zdCB7IHR4UGFyYW1zLCB0eFByZWJ1aWxkLCB3YWxsZXQsIHZlcmlmaWNhdGlvbiA9IHt9LCByZXFJZCB9ID0gcGFyYW1zO1xuXG4gIC8vIEJyYW5jaCBvZmYgZWFybHkgZm9yIFJCRiB0cmFuc2FjdGlvbnNcbiAgaWYgKHR4UGFyYW1zLnJiZlR4SWRzKSB7XG4gICAgcmV0dXJuIHBhcnNlUmJmVHJhbnNhY3Rpb24oY29pbiwgcGFyYW1zKTtcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZCh2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpICYmICFfLmlzQm9vbGVhbih2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd2ZXJpZmljYXRpb24uZGlzYWJsZU5ldHdvcmtpbmcgbXVzdCBiZSBhIGJvb2xlYW4nKTtcbiAgfVxuICBjb25zdCBkaXNhYmxlTmV0d29ya2luZyA9IHZlcmlmaWNhdGlvbi5kaXNhYmxlTmV0d29ya2luZztcblxuICAvLyBvYnRhaW4gdGhlIGtleWNoYWlucyBhbmQga2V5IHNpZ25hdHVyZXNcbiAgbGV0IGtleWNoYWluczogVXR4b05hbWVkS2V5Y2hhaW5zIHwgVmVyaWZpY2F0aW9uT3B0aW9uc1sna2V5Y2hhaW5zJ10gfCB1bmRlZmluZWQgPSB2ZXJpZmljYXRpb24ua2V5Y2hhaW5zO1xuICBpZiAoIWtleWNoYWlucykge1xuICAgIGlmIChkaXNhYmxlTmV0d29ya2luZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjYW5ub3QgZmV0Y2gga2V5Y2hhaW5zIHdpdGhvdXQgbmV0d29ya2luZycpO1xuICAgIH1cbiAgICBrZXljaGFpbnMgPSBhd2FpdCBmZXRjaEtleWNoYWlucyhjb2luLCB3YWxsZXQsIHJlcUlkKTtcbiAgfVxuXG4gIGlmICghVXR4b05hbWVkS2V5Y2hhaW5zLmlzKGtleWNoYWlucykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQga2V5Y2hhaW5zJyk7XG4gIH1cblxuICBjb25zdCBrZXljaGFpbkFycmF5OiBUcmlwbGU8VXR4b0tleWNoYWluPiA9IHRvS2V5Y2hhaW5UcmlwbGUoa2V5Y2hhaW5zKTtcblxuICBjb25zdCBlZmZlY3RpdmVUeEhleCA9IHR4UHJlYnVpbGQudHhIZXhQc2J0ID8/IHR4UHJlYnVpbGQudHhIZXg7XG4gIGlmIChfLmlzVW5kZWZpbmVkKGVmZmVjdGl2ZVR4SGV4KSkge1xuICAgIHRocm93IG5ldyBFcnJvcignbWlzc2luZyByZXF1aXJlZCB0eFByZWJ1aWxkIHByb3BlcnR5IHR4SGV4Jyk7XG4gIH1cblxuICBjb25zdCBleHBlY3RlZE91dHB1dHMgPSB0b0V4cGVjdGVkT3V0cHV0cyhjb2luLCB0eFBhcmFtcyk7XG5cbiAgLy8gZ2V0IHRoZSBrZXljaGFpbnMgZnJvbSB0aGUgY3VzdG9tIGNoYW5nZSB3YWxsZXQgaWYgbmVlZGVkXG4gIGxldCBjdXN0b21DaGFuZ2U6IEN1c3RvbUNoYW5nZU9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgY3VzdG9tQ2hhbmdlV2FsbGV0SWQgPSB1bmRlZmluZWQgfSA9IHdhbGxldC5jb2luU3BlY2lmaWMoKSB8fCB7fTtcbiAgaWYgKGN1c3RvbUNoYW5nZVdhbGxldElkKSB7XG4gICAgLy8gZmV0Y2gga2V5Y2hhaW5zIGZyb20gY3VzdG9tIGNoYW5nZSB3YWxsZXQgZm9yIGRlcml2aW5nIGFkZHJlc3Nlcy5cbiAgICAvLyBUaGVzZSBrZXljaGFpbnMgc2hvdWxkIGJlIHNpZ25lZCBhbmQgdGhpcyBzaG91bGQgYmUgdmVyaWZpZWQgaW4gdmVyaWZ5VHJhbnNhY3Rpb25cbiAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzID0gd2FsbGV0Ll93YWxsZXQuY3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlcztcbiAgICBjb25zdCBjdXN0b21DaGFuZ2VXYWxsZXQ6IFdhbGxldCA9IGF3YWl0IGNvaW4ud2FsbGV0cygpLmdldCh7IGlkOiBjdXN0b21DaGFuZ2VXYWxsZXRJZCB9KTtcbiAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXlzID0gYXdhaXQgZmV0Y2hLZXljaGFpbnMoY29pbiwgY3VzdG9tQ2hhbmdlV2FsbGV0LCByZXFJZCk7XG5cbiAgICBpZiAoIWN1c3RvbUNoYW5nZUtleXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignZmFpbGVkIHRvIGZldGNoIGtleWNoYWlucyBmb3IgY3VzdG9tIGNoYW5nZSB3YWxsZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoY3VzdG9tQ2hhbmdlS2V5cy51c2VyICYmIGN1c3RvbUNoYW5nZUtleXMuYmFja3VwICYmIGN1c3RvbUNoYW5nZUtleXMuYml0Z28gJiYgY3VzdG9tQ2hhbmdlV2FsbGV0KSB7XG4gICAgICBjb25zdCBjdXN0b21DaGFuZ2VLZXljaGFpbnM6IFRyaXBsZTxVdHhvS2V5Y2hhaW4+ID0gW1xuICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLnVzZXIsXG4gICAgICAgIGN1c3RvbUNoYW5nZUtleXMuYmFja3VwLFxuICAgICAgICBjdXN0b21DaGFuZ2VLZXlzLmJpdGdvLFxuICAgICAgXTtcblxuICAgICAgY3VzdG9tQ2hhbmdlID0ge1xuICAgICAgICBrZXlzOiBjdXN0b21DaGFuZ2VLZXljaGFpbnMsXG4gICAgICAgIHNpZ25hdHVyZXM6IFtjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLnVzZXIsIGN1c3RvbUNoYW5nZUtleVNpZ25hdHVyZXMuYmFja3VwLCBjdXN0b21DaGFuZ2VLZXlTaWduYXR1cmVzLmJpdGdvXSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgbGV0IGN1c3RvbUNoYW5nZVhwdWJzOiBUcmlwbGU8c3RyaW5nPiB8IHVuZGVmaW5lZDtcbiAgaWYgKGN1c3RvbUNoYW5nZSkge1xuICAgIHZlcmlmeUN1c3RvbUNoYW5nZUtleXMoa2V5Y2hhaW5BcnJheVtLZXlJbmRpY2VzLlVTRVJdLCBjdXN0b21DaGFuZ2UpO1xuICAgIGN1c3RvbUNoYW5nZVhwdWJzID0gdG9YcHViVHJpcGxlKGN1c3RvbUNoYW5nZS5rZXlzKTtcbiAgfVxuXG4gIC8vIG9idGFpbiBhbGwgb3V0cHV0c1xuICBjb25zdCBleHBsYW5hdGlvbjogVHJhbnNhY3Rpb25FeHBsYW5hdGlvbiA9IGF3YWl0IGNvaW4uZXhwbGFpblRyYW5zYWN0aW9uPFROdW1iZXI+KHtcbiAgICB0eEhleDogZWZmZWN0aXZlVHhIZXgsXG4gICAgdHhJbmZvOiB0eFByZWJ1aWxkLnR4SW5mbyxcbiAgICBkZWNvZGVXaXRoOiB0eFByZWJ1aWxkLmRlY29kZVdpdGgsXG4gICAgcHViczoga2V5Y2hhaW5BcnJheS5tYXAoKGspID0+IGsucHViKSBhcyBUcmlwbGU8c3RyaW5nPixcbiAgICBjdXN0b21DaGFuZ2VYcHVicyxcbiAgfSk7XG5cbiAgY29uc3QgYWxsT3V0cHV0cyA9IFsuLi5leHBsYW5hdGlvbi5vdXRwdXRzLCAuLi5leHBsYW5hdGlvbi5jaGFuZ2VPdXRwdXRzXTtcblxuICAvKipcbiAgICogTG9vcCB0aHJvdWdoIGFsbCB0aGUgb3V0cHV0cyBhbmQgY2xhc3NpZnkgZWFjaCBvZiB0aGVtIGFzIGVpdGhlciBpbnRlcm5hbCBzcGVuZHNcbiAgICogb3IgZXh0ZXJuYWwgc3BlbmRzIGJ5IHNldHRpbmcgdGhlIFwiZXh0ZXJuYWxcIiBwcm9wZXJ0eSB0byB0cnVlIG9yIGZhbHNlIG9uIHRoZSBvdXRwdXQgb2JqZWN0LlxuICAgKi9cbiAgY29uc3QgYWxsT3V0cHV0RGV0YWlsczogT3V0cHV0W10gPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBhbGxPdXRwdXRzLm1hcCgoY3VycmVudE91dHB1dCkgPT4ge1xuICAgICAgcmV0dXJuIHBhcnNlT3V0cHV0KHtcbiAgICAgICAgY3VycmVudE91dHB1dCxcbiAgICAgICAgY29pbixcbiAgICAgICAgdHhQcmVidWlsZCxcbiAgICAgICAgdmVyaWZpY2F0aW9uLFxuICAgICAgICBrZXljaGFpbkFycmF5OiB0b0tleWNoYWluVHJpcGxlKGtleWNoYWlucyksXG4gICAgICAgIHdhbGxldCxcbiAgICAgICAgdHhQYXJhbXM6IHtcbiAgICAgICAgICByZWNpcGllbnRzOiB0eFBhcmFtcy5yZWNpcGllbnRzID8/IFtdLFxuICAgICAgICAgIGNoYW5nZUFkZHJlc3M6IHR4UGFyYW1zLmNoYW5nZUFkZHJlc3MsXG4gICAgICAgIH0sXG4gICAgICAgIGN1c3RvbUNoYW5nZSxcbiAgICAgICAgcmVxSWQsXG4gICAgICB9KTtcbiAgICB9KVxuICApO1xuXG4gIGNvbnN0IG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uID0gYWxsT3V0cHV0RGV0YWlscy5zb21lKFxuICAgIChvdXRwdXQpID0+IChvdXRwdXQgYXMgRml4ZWRTY3JpcHRXYWxsZXRPdXRwdXQpPy5uZWVkc0N1c3RvbUNoYW5nZUtleVNpZ25hdHVyZVZlcmlmaWNhdGlvblxuICApO1xuXG4gIGNvbnN0IGNoYW5nZU91dHB1dHMgPSBfLmZpbHRlcihhbGxPdXRwdXREZXRhaWxzLCB7IGV4dGVybmFsOiBmYWxzZSB9KTtcblxuICBmdW5jdGlvbiB0b0NvbXBhcmFibGVPdXRwdXRzV2l0aEV4dGVybmFsKG91dHB1dHM6IE91dHB1dFtdKTogQ29tcGFyYWJsZU91dHB1dFdpdGhFeHRlcm5hbDxiaWdpbnQgfCAnbWF4Jz5bXSB7XG4gICAgcmV0dXJuIG91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICBzY3JpcHQ6IGZyb21FeHRlbmRlZEFkZHJlc3NGb3JtYXRUb1NjcmlwdChvdXRwdXQuYWRkcmVzcywgY29pbi5uYW1lKSxcbiAgICAgIHZhbHVlOiBvdXRwdXQuYW1vdW50ID09PSAnbWF4JyA/ICdtYXgnIDogKEJpZ0ludChvdXRwdXQuYW1vdW50KSBhcyBiaWdpbnQgfCAnbWF4JyksXG4gICAgICBleHRlcm5hbDogb3V0cHV0LmV4dGVybmFsLFxuICAgIH0pKTtcbiAgfVxuXG4gIGNvbnN0IG1pc3NpbmdPdXRwdXRzID0gb3V0cHV0RGlmZmVyZW5jZShleHBlY3RlZE91dHB1dHMsIHRvQ29tcGFyYWJsZU91dHB1dHNXaXRoRXh0ZXJuYWwoYWxsT3V0cHV0cykpO1xuXG4gIGNvbnN0IGltcGxpY2l0T3V0cHV0cyA9IG91dHB1dERpZmZlcmVuY2UodG9Db21wYXJhYmxlT3V0cHV0c1dpdGhFeHRlcm5hbChhbGxPdXRwdXREZXRhaWxzKSwgZXhwZWN0ZWRPdXRwdXRzKTtcbiAgY29uc3QgZXhwbGljaXRPdXRwdXRzID0gb3V0cHV0RGlmZmVyZW5jZSh0b0NvbXBhcmFibGVPdXRwdXRzV2l0aEV4dGVybmFsKGFsbE91dHB1dERldGFpbHMpLCBpbXBsaWNpdE91dHB1dHMpO1xuXG4gIC8vIHRoZXNlIGFyZSBhbGwgdGhlIG5vbi13YWxsZXQgb3V0cHV0cyB0aGF0IGhhZCBiZWVuIG9yaWdpbmFsbHkgZXhwbGljaXRseSBzcGVjaWZpZWQgaW4gcmVjaXBpZW50c1xuICBjb25zdCBleHBsaWNpdEV4dGVybmFsT3V0cHV0cyA9IGV4cGxpY2l0T3V0cHV0cy5maWx0ZXIoKG91dHB1dCkgPT4gb3V0cHV0LmV4dGVybmFsKTtcbiAgLy8gdGhpcyBpcyB0aGUgc3VtIG9mIGFsbCB0aGUgb3JpZ2luYWxseSBleHBsaWNpdGx5IHNwZWNpZmllZCBub24td2FsbGV0IG91dHB1dCB2YWx1ZXNcbiAgY29uc3QgZXhwbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50ID0gdG9UTnVtYmVyKFxuICAgIGV4cGxpY2l0RXh0ZXJuYWxPdXRwdXRzLnJlZHVjZSgoc3VtOiBiaWdpbnQsIG8pID0+IHN1bSArIEJpZ0ludChvLnZhbHVlKSwgQmlnSW50KDApKSxcbiAgICBjb2luLmFtb3VudFR5cGVcbiAgKSBhcyBUTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FsY3VsYXRpb24gb2YgdGhlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kIGFtb3VudCBwZXJ0YWlucyB0byB2ZXJpZnlpbmcgdGhlIHBheS1hcy15b3UtZ28tZmVlIEJpdEdvXG4gICAqIGF1dG9tYXRpY2FsbHkgYXBwbGllZCB0byB0cmFuc2FjdGlvbnMgc2VuZGluZyBtb25leSBvdXQgb2YgdGhlIHdhbGxldC4gVGhlIGxvZ2ljIGlzIGZhaXJseSBzdHJhaWdodGZvcndhcmRcbiAgICogaW4gdGhhdCB3ZSBjb21wYXJlIHRoZSBleHRlcm5hbCBzcGVuZCBhbW91bnQgdGhhdCB3YXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkgYnkgdGhlIHVzZXIgdG8gdGhlIHBvcnRpb25cbiAgICogdGhhdCB3YXMgc3BlY2lmaWVkIGltcGxpY2l0bHkuIFRvIHByb3RlY3QgY3VzdG9tZXJzIGZyb20gcGVvcGxlIHRhbXBlcmluZyB3aXRoIHRoZSB0cmFuc2FjdGlvbiBvdXRwdXRzLCB3ZVxuICAgKiBkZWZpbmUgYSB0aHJlc2hvbGQgZm9yIHRoZSBtYXhpbXVtIHBlcmNlbnRhZ2Ugb2YgdGhlIGltcGxpY2l0IGV4dGVybmFsIHNwZW5kIGluIHJlbGF0aW9uIHRvIHRoZSBleHBsaWNpdFxuICAgKiBleHRlcm5hbCBzcGVuZC5cbiAgICpcbiAgICogVGhpcyBoYXMgYmVjb21lIG9ic29sZXRlIHdpdGggdGhlIGludG9kdWN0aW9uIG9mIGB1dHhvY29yZS5wYXlnby52ZXJpZnlQYXlHb0FkZHJlc3NQcm9vZigpYC5cbiAgICovXG5cbiAgLy8gbWFrZSBzdXJlIHRoYXQgYWxsIHRoZSBleHRyYSBhZGRyZXNzZXMgYXJlIGNoYW5nZSBhZGRyZXNzZXNcbiAgLy8gZ2V0IGFsbCB0aGUgYWRkaXRpb25hbCBleHRlcm5hbCBvdXRwdXRzIHRoZSBzZXJ2ZXIgYWRkZWQgYW5kIGNhbGN1bGF0ZSB0aGVpciB2YWx1ZXNcbiAgY29uc3QgaW1wbGljaXRFeHRlcm5hbE91dHB1dHMgPSBpbXBsaWNpdE91dHB1dHMuZmlsdGVyKChvdXRwdXQpID0+IG91dHB1dC5leHRlcm5hbCk7XG4gIGNvbnN0IGltcGxpY2l0RXh0ZXJuYWxTcGVuZEFtb3VudCA9IHRvVE51bWJlcihcbiAgICBpbXBsaWNpdEV4dGVybmFsT3V0cHV0cy5yZWR1Y2UoKHN1bTogYmlnaW50LCBvKSA9PiBzdW0gKyBCaWdJbnQoby52YWx1ZSksIEJpZ0ludCgwKSksXG4gICAgY29pbi5hbW91bnRUeXBlXG4gICkgYXMgVE51bWJlcjtcblxuICBmdW5jdGlvbiB0b091dHB1dHMob3V0cHV0czogRXhwZWN0ZWRPdXRwdXRbXSB8IENvbXBhcmFibGVPdXRwdXRXaXRoRXh0ZXJuYWw8YmlnaW50IHwgJ21heCc+W10pOiBPdXRwdXRbXSB7XG4gICAgcmV0dXJuIG91dHB1dHMubWFwKChvdXRwdXQpID0+ICh7XG4gICAgICBhZGRyZXNzOiB0b0V4dGVuZGVkQWRkcmVzc0Zvcm1hdChvdXRwdXQuc2NyaXB0LCBjb2luLm5hbWUpLFxuICAgICAgYW1vdW50OiBvdXRwdXQudmFsdWUudG9TdHJpbmcoKSxcbiAgICAgIGV4dGVybmFsOiBvdXRwdXQuZXh0ZXJuYWwsXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBrZXljaGFpbnMsXG4gICAga2V5U2lnbmF0dXJlczogZ2V0S2V5U2lnbmF0dXJlcyh3YWxsZXQpID8/IHt9LFxuICAgIG91dHB1dHM6IGFsbE91dHB1dERldGFpbHMsXG4gICAgbWlzc2luZ091dHB1dHM6IHRvT3V0cHV0cyhtaXNzaW5nT3V0cHV0cyksXG4gICAgZXhwbGljaXRFeHRlcm5hbE91dHB1dHM6IHRvT3V0cHV0cyhleHBsaWNpdEV4dGVybmFsT3V0cHV0cyksXG4gICAgaW1wbGljaXRFeHRlcm5hbE91dHB1dHM6IHRvT3V0cHV0cyhpbXBsaWNpdEV4dGVybmFsT3V0cHV0cyksXG4gICAgY2hhbmdlT3V0cHV0cyxcbiAgICBleHBsaWNpdEV4dGVybmFsU3BlbmRBbW91bnQsXG4gICAgaW1wbGljaXRFeHRlcm5hbFNwZW5kQW1vdW50LFxuICAgIG5lZWRzQ3VzdG9tQ2hhbmdlS2V5U2lnbmF0dXJlVmVyaWZpY2F0aW9uLFxuICAgIGN1c3RvbUNoYW5nZSxcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { type AddressFormat } from '@bitgo/wasm-utxo';
2
+ import { UtxoCoinName } from '../../names';
3
+ export declare const pubkeyProd: Buffer<ArrayBuffer>;
4
+ export declare const pubkeyTestnet: Buffer<ArrayBuffer>;
5
+ export declare function getReplayProtectionPubkeys(coinName: UtxoCoinName): Buffer[];
6
+ export declare function getReplayProtectionAddresses(coinName: UtxoCoinName, format?: AddressFormat): string[];
7
+ export declare function isReplayProtectionUnspent(u: {
8
+ address: string;
9
+ }, coinName: UtxoCoinName): boolean;
10
+ //# sourceMappingURL=replayProtection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replayProtection.d.ts","sourceRoot":"","sources":["../../../../src/transaction/fixedScript/replayProtection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAE/D,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,eAAO,MAAM,UAAU,qBAA2F,CAAC;AAEnH,eAAO,MAAM,aAAa,qBAA2F,CAAC;AAEtH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAU3E;AAWD,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,GAAE,aAAyB,GAAG,MAAM,EAAE,CAWhH;AAED,wBAAgB,yBAAyB,CAAC,CAAC,EAAE;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,QAAQ,EAAE,YAAY,GAAG,OAAO,CAEjG"}
@@ -0,0 +1,38 @@
1
+ import { address } from '@bitgo/wasm-utxo';
2
+ export const pubkeyProd = Buffer.from('0255b9f71ac2c78fffd83e3e37b9e17ae70d5437b7f56d0ed2e93b7de08015aa59', 'hex');
3
+ export const pubkeyTestnet = Buffer.from('0219da48412c2268865fe8c126327d1b12eee350a3b69eb09e3323cc9a11828945', 'hex');
4
+ export function getReplayProtectionPubkeys(coinName) {
5
+ switch (coinName) {
6
+ case 'bch':
7
+ case 'bsv':
8
+ return [pubkeyProd];
9
+ case 'tbsv':
10
+ case 'tbch':
11
+ return [pubkeyTestnet];
12
+ }
13
+ return [];
14
+ }
15
+ // sh(pk(pubkeyProd))
16
+ // 33p1q7mTGyeM5UnZERGiMcVUkY12SCsatA
17
+ // bitcoincash:pqt5x9w0m6z0f3znjkkx79wl3l7ywrszesemp8xgpf
18
+ const replayProtectionScriptsProd = [Buffer.from('a914174315cfde84f4c45395ac6f15df8ffc470e02cc87', 'hex')];
19
+ // sh(pk(pubkeyTestnet))
20
+ // 2MuMnPoSDgWEpNWH28X2nLtYMXQJCyT61eY
21
+ // bchtest:pqtjmnzwqffkrk2349g3cecfwwjwxusvnq87n07cal
22
+ const replayProtectionScriptsTestnet = [Buffer.from('a914172dcc4e025361d951a9511c670973a4e3720c9887', 'hex')];
23
+ export function getReplayProtectionAddresses(coinName, format = 'default') {
24
+ switch (coinName) {
25
+ case 'bch':
26
+ case 'bsv':
27
+ return replayProtectionScriptsProd.map((script) => address.fromOutputScriptWithCoin(script, coinName, format));
28
+ case 'tbsv':
29
+ case 'tbch':
30
+ return replayProtectionScriptsTestnet.map((script) => address.fromOutputScriptWithCoin(script, coinName, format));
31
+ default:
32
+ return [];
33
+ }
34
+ }
35
+ export function isReplayProtectionUnspent(u, coinName) {
36
+ return getReplayProtectionAddresses(coinName).includes(u.address);
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVwbGF5UHJvdGVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy90cmFuc2FjdGlvbi9maXhlZFNjcmlwdC9yZXBsYXlQcm90ZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQXNCLE1BQU0sa0JBQWtCLENBQUM7QUFJL0QsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0VBQW9FLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFbkgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsb0VBQW9FLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFFdEgsTUFBTSxVQUFVLDBCQUEwQixDQUFDLFFBQXNCO0lBQy9ELFFBQVEsUUFBUSxFQUFFLENBQUM7UUFDakIsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLEtBQUs7WUFDUixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEIsS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLE1BQU07WUFDVCxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUNELE9BQU8sRUFBRSxDQUFDO0FBQ1osQ0FBQztBQUVELHFCQUFxQjtBQUNyQixxQ0FBcUM7QUFDckMseURBQXlEO0FBQ3pELE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdEQUFnRCxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDM0csd0JBQXdCO0FBQ3hCLHNDQUFzQztBQUN0QyxxREFBcUQ7QUFDckQsTUFBTSw4QkFBOEIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0RBQWdELEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUU5RyxNQUFNLFVBQVUsNEJBQTRCLENBQUMsUUFBc0IsRUFBRSxTQUF3QixTQUFTO0lBQ3BHLFFBQVEsUUFBUSxFQUFFLENBQUM7UUFDakIsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLEtBQUs7WUFDUixPQUFPLDJCQUEyQixDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUNqSCxLQUFLLE1BQU0sQ0FBQztRQUNaLEtBQUssTUFBTTtZQUNULE9BQU8sOEJBQThCLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3BIO1lBQ0UsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxDQUFzQixFQUFFLFFBQXNCO0lBQ3RGLE9BQU8sNEJBQTRCLENBQUMsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWRkcmVzcywgdHlwZSBBZGRyZXNzRm9ybWF0IH0gZnJvbSAnQGJpdGdvL3dhc20tdXR4byc7XG5cbmltcG9ydCB7IFV0eG9Db2luTmFtZSB9IGZyb20gJy4uLy4uL25hbWVzJztcblxuZXhwb3J0IGNvbnN0IHB1YmtleVByb2QgPSBCdWZmZXIuZnJvbSgnMDI1NWI5ZjcxYWMyYzc4ZmZmZDgzZTNlMzdiOWUxN2FlNzBkNTQzN2I3ZjU2ZDBlZDJlOTNiN2RlMDgwMTVhYTU5JywgJ2hleCcpO1xuXG5leHBvcnQgY29uc3QgcHVia2V5VGVzdG5ldCA9IEJ1ZmZlci5mcm9tKCcwMjE5ZGE0ODQxMmMyMjY4ODY1ZmU4YzEyNjMyN2QxYjEyZWVlMzUwYTNiNjllYjA5ZTMzMjNjYzlhMTE4Mjg5NDUnLCAnaGV4Jyk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXBsYXlQcm90ZWN0aW9uUHVia2V5cyhjb2luTmFtZTogVXR4b0NvaW5OYW1lKTogQnVmZmVyW10ge1xuICBzd2l0Y2ggKGNvaW5OYW1lKSB7XG4gICAgY2FzZSAnYmNoJzpcbiAgICBjYXNlICdic3YnOlxuICAgICAgcmV0dXJuIFtwdWJrZXlQcm9kXTtcbiAgICBjYXNlICd0YnN2JzpcbiAgICBjYXNlICd0YmNoJzpcbiAgICAgIHJldHVybiBbcHVia2V5VGVzdG5ldF07XG4gIH1cbiAgcmV0dXJuIFtdO1xufVxuXG4vLyBzaChwayhwdWJrZXlQcm9kKSlcbi8vIDMzcDFxN21UR3llTTVVblpFUkdpTWNWVWtZMTJTQ3NhdEFcbi8vIGJpdGNvaW5jYXNoOnBxdDV4OXcwbTZ6MGYzem5qa2t4Nzl3bDNsN3l3cnN6ZXNlbXA4eGdwZlxuY29uc3QgcmVwbGF5UHJvdGVjdGlvblNjcmlwdHNQcm9kID0gW0J1ZmZlci5mcm9tKCdhOTE0MTc0MzE1Y2ZkZTg0ZjRjNDUzOTVhYzZmMTVkZjhmZmM0NzBlMDJjYzg3JywgJ2hleCcpXTtcbi8vIHNoKHBrKHB1YmtleVRlc3RuZXQpKVxuLy8gMk11TW5Qb1NEZ1dFcE5XSDI4WDJuTHRZTVhRSkN5VDYxZVlcbi8vIGJjaHRlc3Q6cHF0am1uendxZmZrcmsyMzQ5ZzNjZWNmd3dqd3h1c3ZucTg3bjA3Y2FsXG5jb25zdCByZXBsYXlQcm90ZWN0aW9uU2NyaXB0c1Rlc3RuZXQgPSBbQnVmZmVyLmZyb20oJ2E5MTQxNzJkY2M0ZTAyNTM2MWQ5NTFhOTUxMWM2NzA5NzNhNGUzNzIwYzk4ODcnLCAnaGV4JyldO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVwbGF5UHJvdGVjdGlvbkFkZHJlc3Nlcyhjb2luTmFtZTogVXR4b0NvaW5OYW1lLCBmb3JtYXQ6IEFkZHJlc3NGb3JtYXQgPSAnZGVmYXVsdCcpOiBzdHJpbmdbXSB7XG4gIHN3aXRjaCAoY29pbk5hbWUpIHtcbiAgICBjYXNlICdiY2gnOlxuICAgIGNhc2UgJ2Jzdic6XG4gICAgICByZXR1cm4gcmVwbGF5UHJvdGVjdGlvblNjcmlwdHNQcm9kLm1hcCgoc2NyaXB0KSA9PiBhZGRyZXNzLmZyb21PdXRwdXRTY3JpcHRXaXRoQ29pbihzY3JpcHQsIGNvaW5OYW1lLCBmb3JtYXQpKTtcbiAgICBjYXNlICd0YnN2JzpcbiAgICBjYXNlICd0YmNoJzpcbiAgICAgIHJldHVybiByZXBsYXlQcm90ZWN0aW9uU2NyaXB0c1Rlc3RuZXQubWFwKChzY3JpcHQpID0+IGFkZHJlc3MuZnJvbU91dHB1dFNjcmlwdFdpdGhDb2luKHNjcmlwdCwgY29pbk5hbWUsIGZvcm1hdCkpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gW107XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVwbGF5UHJvdGVjdGlvblVuc3BlbnQodTogeyBhZGRyZXNzOiBzdHJpbmcgfSwgY29pbk5hbWU6IFV0eG9Db2luTmFtZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0UmVwbGF5UHJvdGVjdGlvbkFkZHJlc3Nlcyhjb2luTmFtZSkuaW5jbHVkZXModS5hZGRyZXNzKTtcbn1cbiJdfQ==