@bitgo/abstract-utxo 10.5.0 → 10.7.0

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 (782) hide show
  1. package/dist/{src → cjs/src}/abstractUtxoCoin.d.ts +18 -68
  2. package/dist/cjs/src/abstractUtxoCoin.d.ts.map +1 -0
  3. package/dist/cjs/src/abstractUtxoCoin.js +645 -0
  4. package/dist/cjs/src/address/fixedScript.d.ts.map +1 -0
  5. package/dist/cjs/src/address/fixedScript.js +150 -0
  6. package/dist/cjs/src/address/index.d.ts.map +1 -0
  7. package/dist/{src → cjs/src}/address/index.js +1 -1
  8. package/dist/cjs/src/config.d.ts.map +1 -0
  9. package/dist/cjs/src/config.js +14 -0
  10. package/dist/cjs/src/descriptor/NamedDescriptor.d.ts.map +1 -0
  11. package/dist/cjs/src/descriptor/NamedDescriptor.js +79 -0
  12. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.d.ts.map +1 -0
  13. package/dist/cjs/src/descriptor/assertDescriptorWalletAddress.js +66 -0
  14. package/dist/cjs/src/descriptor/builder/builder.d.ts.map +1 -0
  15. package/dist/cjs/src/descriptor/builder/builder.js +37 -0
  16. package/dist/cjs/src/descriptor/builder/index.d.ts.map +1 -0
  17. package/dist/{src → cjs/src}/descriptor/builder/index.js +1 -1
  18. package/dist/cjs/src/descriptor/builder/parse.d.ts.map +1 -0
  19. package/dist/cjs/src/descriptor/builder/parse.js +116 -0
  20. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.d.ts.map +1 -0
  21. package/dist/cjs/src/descriptor/createWallet/createDescriptorWallet.js +41 -0
  22. package/dist/cjs/src/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  23. package/dist/cjs/src/descriptor/createWallet/createDescriptors.js +33 -0
  24. package/dist/cjs/src/descriptor/createWallet/index.d.ts.map +1 -0
  25. package/dist/{src → cjs/src}/descriptor/createWallet/index.js +1 -1
  26. package/dist/cjs/src/descriptor/descriptorWallet.d.ts.map +1 -0
  27. package/dist/cjs/src/descriptor/descriptorWallet.js +54 -0
  28. package/dist/cjs/src/descriptor/index.d.ts.map +1 -0
  29. package/dist/{src → cjs/src}/descriptor/index.js +1 -1
  30. package/dist/cjs/src/descriptor/validatePolicy.d.ts.map +1 -0
  31. package/dist/cjs/src/descriptor/validatePolicy.js +92 -0
  32. package/dist/cjs/src/impl/bch/bch.d.ts.map +1 -0
  33. package/dist/cjs/src/impl/bch/bch.js +74 -0
  34. package/dist/cjs/src/impl/bch/index.d.ts.map +1 -0
  35. package/dist/{src → cjs/src}/impl/bch/index.js +1 -1
  36. package/dist/cjs/src/impl/bch/tbch.d.ts.map +1 -0
  37. package/dist/{src → cjs/src}/impl/bch/tbch.js +1 -1
  38. package/dist/{src → cjs/src}/impl/bcha/bcha.d.ts +0 -1
  39. package/dist/cjs/src/impl/bcha/bcha.d.ts.map +1 -0
  40. package/dist/cjs/src/impl/bcha/bcha.js +48 -0
  41. package/dist/cjs/src/impl/bcha/index.d.ts.map +1 -0
  42. package/dist/{src → cjs/src}/impl/bcha/index.js +1 -1
  43. package/dist/cjs/src/impl/bcha/tbcha.d.ts.map +1 -0
  44. package/dist/{src → cjs/src}/impl/bcha/tbcha.js +1 -1
  45. package/dist/cjs/src/impl/bsv/bsv.d.ts.map +1 -0
  46. package/dist/{src → cjs/src}/impl/bsv/bsv.js +1 -1
  47. package/dist/cjs/src/impl/bsv/index.d.ts.map +1 -0
  48. package/dist/{src → cjs/src}/impl/bsv/index.js +1 -1
  49. package/dist/cjs/src/impl/bsv/tbsv.d.ts.map +1 -0
  50. package/dist/{src → cjs/src}/impl/bsv/tbsv.js +1 -1
  51. package/dist/cjs/src/impl/btc/btc.d.ts.map +1 -0
  52. package/dist/{src → cjs/src}/impl/btc/btc.js +1 -1
  53. package/dist/cjs/src/impl/btc/index.d.ts.map +1 -0
  54. package/dist/{src → cjs/src}/impl/btc/index.js +1 -1
  55. package/dist/cjs/src/impl/btc/inscriptionBuilder.d.ts.map +1 -0
  56. package/dist/cjs/src/impl/btc/inscriptionBuilder.js +183 -0
  57. package/dist/cjs/src/impl/btc/tbtc.d.ts.map +1 -0
  58. package/dist/{src → cjs/src}/impl/btc/tbtc.js +1 -1
  59. package/dist/cjs/src/impl/btc/tbtc4.d.ts.map +1 -0
  60. package/dist/{src → cjs/src}/impl/btc/tbtc4.js +1 -1
  61. package/dist/cjs/src/impl/btc/tbtcbgsig.d.ts.map +1 -0
  62. package/dist/{src → cjs/src}/impl/btc/tbtcbgsig.js +1 -1
  63. package/dist/cjs/src/impl/btc/tbtcsig.d.ts.map +1 -0
  64. package/dist/{src → cjs/src}/impl/btc/tbtcsig.js +1 -1
  65. package/dist/cjs/src/impl/btg/btg.d.ts.map +1 -0
  66. package/dist/{src → cjs/src}/impl/btg/btg.js +1 -1
  67. package/dist/cjs/src/impl/btg/index.d.ts.map +1 -0
  68. package/dist/{src → cjs/src}/impl/btg/index.js +1 -1
  69. package/dist/cjs/src/impl/dash/dash.d.ts.map +1 -0
  70. package/dist/{src → cjs/src}/impl/dash/dash.js +1 -1
  71. package/dist/cjs/src/impl/dash/index.d.ts.map +1 -0
  72. package/dist/{src → cjs/src}/impl/dash/index.js +1 -1
  73. package/dist/cjs/src/impl/dash/tdash.d.ts.map +1 -0
  74. package/dist/{src → cjs/src}/impl/dash/tdash.js +1 -1
  75. package/dist/{src → cjs/src}/impl/doge/doge.d.ts +4 -2
  76. package/dist/cjs/src/impl/doge/doge.d.ts.map +1 -0
  77. package/dist/cjs/src/impl/doge/doge.js +79 -0
  78. package/dist/cjs/src/impl/doge/index.d.ts.map +1 -0
  79. package/dist/{src → cjs/src}/impl/doge/index.js +1 -1
  80. package/dist/cjs/src/impl/doge/tdoge.d.ts.map +1 -0
  81. package/dist/{src → cjs/src}/impl/doge/tdoge.js +1 -1
  82. package/dist/cjs/src/impl/index.d.ts.map +1 -0
  83. package/dist/{src → cjs/src}/impl/index.js +1 -1
  84. package/dist/cjs/src/impl/ltc/index.d.ts.map +1 -0
  85. package/dist/{src → cjs/src}/impl/ltc/index.js +1 -1
  86. package/dist/cjs/src/impl/ltc/ltc.d.ts.map +1 -0
  87. package/dist/{src → cjs/src}/impl/ltc/ltc.js +1 -1
  88. package/dist/cjs/src/impl/ltc/tltc.d.ts.map +1 -0
  89. package/dist/{src → cjs/src}/impl/ltc/tltc.js +1 -1
  90. package/dist/cjs/src/impl/zec/index.d.ts.map +1 -0
  91. package/dist/{src → cjs/src}/impl/zec/index.js +1 -1
  92. package/dist/cjs/src/impl/zec/tzec.d.ts.map +1 -0
  93. package/dist/{src → cjs/src}/impl/zec/tzec.js +1 -1
  94. package/dist/cjs/src/impl/zec/zec.d.ts.map +1 -0
  95. package/dist/{src → cjs/src}/impl/zec/zec.js +1 -1
  96. package/dist/cjs/src/index.d.ts.map +1 -0
  97. package/dist/{src → cjs/src}/index.js +1 -1
  98. package/dist/cjs/src/keychains.d.ts.map +1 -0
  99. package/dist/cjs/src/keychains.js +104 -0
  100. package/dist/cjs/src/names.d.ts.map +1 -0
  101. package/dist/cjs/src/names.js +214 -0
  102. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.d.ts.map +1 -0
  103. package/dist/cjs/src/offlineVault/OfflineVaultHalfSigned.js +26 -0
  104. package/dist/cjs/src/offlineVault/OfflineVaultSignable.d.ts.map +1 -0
  105. package/dist/cjs/src/offlineVault/OfflineVaultSignable.js +55 -0
  106. package/dist/cjs/src/offlineVault/TransactionExplanation.d.ts.map +1 -0
  107. package/dist/cjs/src/offlineVault/TransactionExplanation.js +16 -0
  108. package/dist/cjs/src/offlineVault/descriptor/index.d.ts.map +1 -0
  109. package/dist/{src → cjs/src}/offlineVault/descriptor/index.js +1 -1
  110. package/dist/cjs/src/offlineVault/descriptor/transaction.d.ts.map +1 -0
  111. package/dist/cjs/src/offlineVault/descriptor/transaction.js +80 -0
  112. package/dist/cjs/src/offlineVault/index.d.ts.map +1 -0
  113. package/dist/{src → cjs/src}/offlineVault/index.js +1 -1
  114. package/dist/cjs/src/recovery/RecoveryProvider.d.ts.map +1 -0
  115. package/dist/cjs/src/recovery/RecoveryProvider.js +22 -0
  116. package/dist/cjs/src/recovery/backupKeyRecovery.d.ts.map +1 -0
  117. package/dist/cjs/src/recovery/backupKeyRecovery.js +370 -0
  118. package/dist/cjs/src/recovery/baseApi.d.ts.map +1 -0
  119. package/dist/cjs/src/recovery/baseApi.js +73 -0
  120. package/dist/cjs/src/recovery/coingeckoApi.d.ts.map +1 -0
  121. package/dist/cjs/src/recovery/coingeckoApi.js +44 -0
  122. package/dist/cjs/src/recovery/crossChainRecovery.d.ts.map +1 -0
  123. package/dist/cjs/src/recovery/crossChainRecovery.js +364 -0
  124. package/dist/cjs/src/recovery/index.d.ts.map +1 -0
  125. package/dist/{src → cjs/src}/recovery/index.js +1 -1
  126. package/dist/cjs/src/recovery/mempoolApi.d.ts.map +1 -0
  127. package/dist/cjs/src/recovery/mempoolApi.js +36 -0
  128. package/dist/{src → cjs/src}/replayProtection.d.ts +1 -0
  129. package/dist/cjs/src/replayProtection.d.ts.map +1 -0
  130. package/dist/cjs/src/replayProtection.js +58 -0
  131. package/dist/cjs/src/sign.d.ts.map +1 -0
  132. package/dist/cjs/src/sign.js +205 -0
  133. package/dist/cjs/src/transaction/bip322.d.ts.map +1 -0
  134. package/dist/cjs/src/transaction/bip322.js +125 -0
  135. package/dist/cjs/src/transaction/common/verifyPayGoAmount.d.ts.map +1 -0
  136. package/dist/cjs/src/transaction/common/verifyPayGoAmount.js +3 -0
  137. package/dist/{src → cjs/src}/transaction/descriptor/explainPsbt.d.ts +2 -2
  138. package/dist/cjs/src/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  139. package/dist/cjs/src/transaction/descriptor/explainPsbt.js +80 -0
  140. package/dist/cjs/src/transaction/descriptor/index.d.ts.map +1 -0
  141. package/dist/{src → cjs/src}/transaction/descriptor/index.js +1 -1
  142. package/dist/{src → cjs/src}/transaction/descriptor/parse.d.ts +2 -1
  143. package/dist/cjs/src/transaction/descriptor/parse.d.ts.map +1 -0
  144. package/dist/cjs/src/transaction/descriptor/parse.js +116 -0
  145. package/dist/{src → cjs/src}/transaction/descriptor/parseToAmountType.d.ts +2 -1
  146. package/dist/cjs/src/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  147. package/dist/cjs/src/transaction/descriptor/parseToAmountType.js +60 -0
  148. package/dist/cjs/src/transaction/descriptor/recipient.d.ts.map +1 -0
  149. package/dist/cjs/src/transaction/descriptor/recipient.js +3 -0
  150. package/dist/cjs/src/transaction/descriptor/signPsbt.d.ts.map +1 -0
  151. package/dist/cjs/src/transaction/descriptor/signPsbt.js +43 -0
  152. package/dist/{src → cjs/src}/transaction/descriptor/verifyTransaction.d.ts +2 -1
  153. package/dist/cjs/src/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  154. package/dist/cjs/src/transaction/descriptor/verifyTransaction.js +108 -0
  155. package/dist/{src → cjs/src}/transaction/explainTransaction.d.ts +4 -3
  156. package/dist/cjs/src/transaction/explainTransaction.d.ts.map +1 -0
  157. package/dist/cjs/src/transaction/explainTransaction.js +88 -0
  158. package/dist/cjs/src/transaction/fetchInputs.d.ts.map +1 -0
  159. package/dist/cjs/src/transaction/fetchInputs.js +109 -0
  160. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts +10 -0
  161. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  162. package/dist/cjs/src/transaction/fixedScript/explainPsbtWasm.js +43 -0
  163. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts +64 -0
  164. package/dist/cjs/src/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  165. package/dist/cjs/src/transaction/fixedScript/explainTransaction.js +321 -0
  166. package/dist/{src → cjs/src}/transaction/fixedScript/index.d.ts +1 -0
  167. package/dist/cjs/src/transaction/fixedScript/index.d.ts.map +1 -0
  168. package/dist/{src → cjs/src}/transaction/fixedScript/index.js +4 -2
  169. package/dist/{src → cjs/src}/transaction/fixedScript/parseOutput.d.ts +3 -1
  170. package/dist/cjs/src/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  171. package/dist/cjs/src/transaction/fixedScript/parseOutput.js +217 -0
  172. package/dist/{src → cjs/src}/transaction/fixedScript/parseTransaction.d.ts +2 -1
  173. package/dist/cjs/src/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  174. package/dist/cjs/src/transaction/fixedScript/parseTransaction.js +215 -0
  175. package/dist/cjs/src/transaction/fixedScript/signTransaction.d.ts.map +1 -0
  176. package/dist/cjs/src/transaction/fixedScript/signTransaction.js +101 -0
  177. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  178. package/dist/cjs/src/transaction/fixedScript/verifyTransaction.js +198 -0
  179. package/dist/cjs/src/transaction/getPayGoVerificationPubkey.d.ts.map +1 -0
  180. package/dist/{src → cjs/src}/transaction/getPayGoVerificationPubkey.js +1 -1
  181. package/dist/{src → cjs/src}/transaction/index.d.ts +1 -0
  182. package/dist/cjs/src/transaction/index.d.ts.map +1 -0
  183. package/dist/{src → cjs/src}/transaction/index.js +2 -1
  184. package/dist/cjs/src/transaction/outputDifference.d.ts.map +1 -0
  185. package/dist/cjs/src/transaction/outputDifference.js +47 -0
  186. package/dist/{src → cjs/src}/transaction/parseTransaction.d.ts +2 -1
  187. package/dist/cjs/src/transaction/parseTransaction.d.ts.map +1 -0
  188. package/dist/{src → cjs/src}/transaction/parseTransaction.js +1 -1
  189. package/dist/cjs/src/transaction/recipient.d.ts.map +1 -0
  190. package/dist/cjs/src/transaction/recipient.js +88 -0
  191. package/dist/cjs/src/transaction/signTransaction.d.ts.map +1 -0
  192. package/dist/cjs/src/transaction/signTransaction.js +102 -0
  193. package/dist/cjs/src/transaction/types.d.ts +44 -0
  194. package/dist/cjs/src/transaction/types.d.ts.map +1 -0
  195. package/dist/cjs/src/transaction/types.js +3 -0
  196. package/dist/cjs/src/transaction/verifyTransaction.d.ts.map +1 -0
  197. package/dist/{src → cjs/src}/transaction/verifyTransaction.js +1 -1
  198. package/dist/{src → cjs/src}/verifyKey.d.ts +2 -1
  199. package/dist/cjs/src/verifyKey.d.ts.map +1 -0
  200. package/dist/cjs/src/verifyKey.js +164 -0
  201. package/dist/cjs/src/wallet.d.ts.map +1 -0
  202. package/dist/cjs/src/wallet.js +8 -0
  203. package/dist/cjs/test/integration/impl/bch/bch.d.ts +2 -0
  204. package/dist/cjs/test/integration/impl/bch/bch.d.ts.map +1 -0
  205. package/dist/cjs/test/integration/impl/bch/bch.js +74 -0
  206. package/dist/cjs/test/unit/address.d.ts +2 -0
  207. package/dist/cjs/test/unit/address.d.ts.map +1 -0
  208. package/dist/cjs/test/unit/address.js +182 -0
  209. package/dist/cjs/test/unit/bip322.d.ts +2 -0
  210. package/dist/cjs/test/unit/bip322.d.ts.map +1 -0
  211. package/dist/cjs/test/unit/bip322.js +45 -0
  212. package/dist/cjs/test/unit/coins.d.ts +2 -0
  213. package/dist/cjs/test/unit/coins.d.ts.map +1 -0
  214. package/dist/cjs/test/unit/coins.js +97 -0
  215. package/dist/cjs/test/unit/customChangeWallet.d.ts +2 -0
  216. package/dist/cjs/test/unit/customChangeWallet.d.ts.map +1 -0
  217. package/dist/cjs/test/unit/customChangeWallet.js +154 -0
  218. package/dist/cjs/test/unit/customSigner.d.ts +3 -0
  219. package/dist/cjs/test/unit/customSigner.d.ts.map +1 -0
  220. package/dist/cjs/test/unit/customSigner.js +108 -0
  221. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts +2 -0
  222. package/dist/cjs/test/unit/descriptor/NamedDescriptor.d.ts.map +1 -0
  223. package/dist/cjs/test/unit/descriptor/NamedDescriptor.js +18 -0
  224. package/dist/cjs/test/unit/descriptor/builder.d.ts +2 -0
  225. package/dist/cjs/test/unit/descriptor/builder.d.ts.map +1 -0
  226. package/dist/cjs/test/unit/descriptor/builder.js +72 -0
  227. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts +2 -0
  228. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.d.ts.map +1 -0
  229. package/dist/cjs/test/unit/descriptor/createWallet/createDescriptors.js +20 -0
  230. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts +2 -0
  231. package/dist/cjs/test/unit/descriptor/descriptorWallet.d.ts.map +1 -0
  232. package/dist/cjs/test/unit/descriptor/descriptorWallet.js +28 -0
  233. package/dist/cjs/test/unit/descriptorAddress.d.ts +3 -0
  234. package/dist/cjs/test/unit/descriptorAddress.d.ts.map +1 -0
  235. package/dist/cjs/test/unit/descriptorAddress.js +102 -0
  236. package/dist/cjs/test/unit/explainTransaction.d.ts +2 -0
  237. package/dist/cjs/test/unit/explainTransaction.d.ts.map +1 -0
  238. package/dist/cjs/test/unit/explainTransaction.js +74 -0
  239. package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts +15 -0
  240. package/dist/cjs/test/unit/fixtures/bip322/fixtures.d.ts.map +1 -0
  241. package/dist/cjs/test/unit/fixtures/bip322/fixtures.js +51 -0
  242. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts +4 -0
  243. package/dist/cjs/test/unit/fixtures/psbtHexProof.d.ts.map +1 -0
  244. package/dist/cjs/test/unit/fixtures/psbtHexProof.js +9 -0
  245. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts +2 -0
  246. package/dist/cjs/test/unit/impl/bch/unit/bch.d.ts.map +1 -0
  247. package/dist/cjs/test/unit/impl/bch/unit/bch.js +138 -0
  248. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts +2 -0
  249. package/dist/cjs/test/unit/impl/bcha/unit/index.d.ts.map +1 -0
  250. package/dist/cjs/test/unit/impl/bcha/unit/index.js +47 -0
  251. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts +2 -0
  252. package/dist/cjs/test/unit/impl/bsv/unit/index.d.ts.map +1 -0
  253. package/dist/cjs/test/unit/impl/bsv/unit/index.js +32 -0
  254. package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts +2 -0
  255. package/dist/cjs/test/unit/impl/btc/unit/btc.d.ts.map +1 -0
  256. package/dist/cjs/test/unit/impl/btc/unit/btc.js +220 -0
  257. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts +4 -0
  258. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.d.ts.map +1 -0
  259. package/dist/cjs/test/unit/impl/btc/unit/fixtures/btcBackupKey.js +10 -0
  260. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts +2 -0
  261. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.d.ts.map +1 -0
  262. package/dist/cjs/test/unit/impl/btc/unit/fixtures/index.js +18 -0
  263. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts +2 -0
  264. package/dist/cjs/test/unit/impl/btg/unit/index.d.ts.map +1 -0
  265. package/dist/cjs/test/unit/impl/btg/unit/index.js +29 -0
  266. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts +2 -0
  267. package/dist/cjs/test/unit/impl/dash/unit/index.d.ts.map +1 -0
  268. package/dist/cjs/test/unit/impl/dash/unit/index.js +32 -0
  269. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts +2 -0
  270. package/dist/cjs/test/unit/impl/doge/unit/index.d.ts.map +1 -0
  271. package/dist/cjs/test/unit/impl/doge/unit/index.js +32 -0
  272. package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts +2 -0
  273. package/dist/cjs/test/unit/impl/ltc/unit/index.d.ts.map +1 -0
  274. package/dist/cjs/test/unit/impl/ltc/unit/index.js +39 -0
  275. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts +2 -0
  276. package/dist/cjs/test/unit/impl/zec/unit/index.d.ts.map +1 -0
  277. package/dist/cjs/test/unit/impl/zec/unit/index.js +29 -0
  278. package/dist/cjs/test/unit/keySignatures.d.ts +2 -0
  279. package/dist/cjs/test/unit/keySignatures.d.ts.map +1 -0
  280. package/dist/cjs/test/unit/keySignatures.js +54 -0
  281. package/dist/cjs/test/unit/keychains.d.ts +2 -0
  282. package/dist/cjs/test/unit/keychains.d.ts.map +1 -0
  283. package/dist/cjs/test/unit/keychains.js +49 -0
  284. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts +2 -0
  285. package/dist/cjs/test/unit/offlineVault/halfSigned.d.ts.map +1 -0
  286. package/dist/cjs/test/unit/offlineVault/halfSigned.js +124 -0
  287. package/dist/cjs/test/unit/parseTransaction.d.ts +2 -0
  288. package/dist/cjs/test/unit/parseTransaction.d.ts.map +1 -0
  289. package/dist/cjs/test/unit/parseTransaction.js +125 -0
  290. package/dist/cjs/test/unit/prebuildAndSign.d.ts +6 -0
  291. package/dist/cjs/test/unit/prebuildAndSign.d.ts.map +1 -0
  292. package/dist/cjs/test/unit/prebuildAndSign.js +270 -0
  293. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts +2 -0
  294. package/dist/cjs/test/unit/recovery/backupKeyRecovery.d.ts.map +1 -0
  295. package/dist/cjs/test/unit/recovery/backupKeyRecovery.js +285 -0
  296. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts +2 -0
  297. package/dist/cjs/test/unit/recovery/crossChainRecovery.d.ts.map +1 -0
  298. package/dist/cjs/test/unit/recovery/crossChainRecovery.js +283 -0
  299. package/dist/cjs/test/unit/recovery/mock.d.ts +30 -0
  300. package/dist/cjs/test/unit/recovery/mock.d.ts.map +1 -0
  301. package/dist/cjs/test/unit/recovery/mock.js +138 -0
  302. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts +2 -0
  303. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  304. package/dist/cjs/test/unit/transaction/descriptor/explainPsbt.js +30 -0
  305. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts +6 -0
  306. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.d.ts.map +1 -0
  307. package/dist/cjs/test/unit/transaction/descriptor/fixtures.utils.js +17 -0
  308. package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts +2 -0
  309. package/dist/cjs/test/unit/transaction/descriptor/outputDifference.d.ts.map +1 -0
  310. package/dist/cjs/test/unit/transaction/descriptor/outputDifference.js +76 -0
  311. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts +2 -0
  312. package/dist/cjs/test/unit/transaction/descriptor/parse.d.ts.map +1 -0
  313. package/dist/cjs/test/unit/transaction/descriptor/parse.js +135 -0
  314. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts +2 -0
  315. package/dist/cjs/test/unit/transaction/descriptor/sign.d.ts.map +1 -0
  316. package/dist/cjs/test/unit/transaction/descriptor/sign.js +32 -0
  317. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts +2 -0
  318. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.d.ts.map +1 -0
  319. package/dist/cjs/test/unit/transaction/descriptor/validatePolicy.js +48 -0
  320. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts +2 -0
  321. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.d.ts.map +1 -0
  322. package/dist/cjs/test/unit/transaction/fixedScript/explainPsbt.js +101 -0
  323. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts +2 -0
  324. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.d.ts.map +1 -0
  325. package/dist/cjs/test/unit/transaction/fixedScript/parsePsbt.js +288 -0
  326. package/dist/cjs/test/unit/transaction/fixedScript/util.d.ts +3 -0
  327. package/dist/cjs/test/unit/transaction/fixedScript/util.d.ts.map +1 -0
  328. package/dist/cjs/test/unit/transaction/fixedScript/util.js +46 -0
  329. package/dist/cjs/test/unit/transaction.d.ts +2 -0
  330. package/dist/cjs/test/unit/transaction.d.ts.map +1 -0
  331. package/dist/cjs/test/unit/transaction.js +501 -0
  332. package/dist/cjs/test/unit/txFormat.d.ts +30 -0
  333. package/dist/cjs/test/unit/txFormat.d.ts.map +1 -0
  334. package/dist/cjs/test/unit/txFormat.js +174 -0
  335. package/dist/cjs/test/unit/util/fixtures.d.ts +14 -0
  336. package/dist/cjs/test/unit/util/fixtures.d.ts.map +1 -0
  337. package/dist/cjs/test/unit/util/fixtures.js +102 -0
  338. package/dist/cjs/test/unit/util/index.d.ts +7 -0
  339. package/dist/cjs/test/unit/util/index.d.ts.map +1 -0
  340. package/dist/cjs/test/unit/util/index.js +23 -0
  341. package/dist/cjs/test/unit/util/keychains.d.ts +26 -0
  342. package/dist/cjs/test/unit/util/keychains.d.ts.map +1 -0
  343. package/dist/cjs/test/unit/util/keychains.js +72 -0
  344. package/dist/cjs/test/unit/util/nockBitGo.d.ts +3 -0
  345. package/dist/cjs/test/unit/util/nockBitGo.d.ts.map +1 -0
  346. package/dist/cjs/test/unit/util/nockBitGo.js +11 -0
  347. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts +8 -0
  348. package/dist/cjs/test/unit/util/nockIndexerAPI.d.ts.map +1 -0
  349. package/dist/cjs/test/unit/util/nockIndexerAPI.js +56 -0
  350. package/dist/cjs/test/unit/util/transaction.d.ts +24 -0
  351. package/dist/cjs/test/unit/util/transaction.d.ts.map +1 -0
  352. package/dist/cjs/test/unit/util/transaction.js +107 -0
  353. package/dist/cjs/test/unit/util/unspents.d.ts +13 -0
  354. package/dist/cjs/test/unit/util/unspents.d.ts.map +1 -0
  355. package/dist/cjs/test/unit/util/unspents.js +106 -0
  356. package/dist/cjs/test/unit/util/utxoCoins.d.ts +8 -0
  357. package/dist/cjs/test/unit/util/utxoCoins.d.ts.map +1 -0
  358. package/dist/cjs/test/unit/util/utxoCoins.js +95 -0
  359. package/dist/cjs/test/unit/util/wallet.d.ts +4 -0
  360. package/dist/cjs/test/unit/util/wallet.d.ts.map +1 -0
  361. package/dist/cjs/test/unit/util/wallet.js +9 -0
  362. package/dist/cjs/test/unit/verifyTransaction.d.ts +2 -0
  363. package/dist/cjs/test/unit/verifyTransaction.d.ts.map +1 -0
  364. package/dist/cjs/test/unit/verifyTransaction.js +327 -0
  365. package/dist/cjs/test/unit/wallet.d.ts +2 -0
  366. package/dist/cjs/test/unit/wallet.d.ts.map +1 -0
  367. package/dist/cjs/test/unit/wallet.js +248 -0
  368. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  369. package/dist/esm/abstractUtxoCoin.d.ts +425 -0
  370. package/dist/esm/abstractUtxoCoin.d.ts.map +1 -0
  371. package/dist/esm/abstractUtxoCoin.js +604 -0
  372. package/dist/esm/address/fixedScript.d.ts +51 -0
  373. package/dist/{src → esm}/address/fixedScript.d.ts.map +1 -1
  374. package/dist/esm/address/fixedScript.js +109 -0
  375. package/dist/esm/address/index.d.ts +2 -0
  376. package/dist/esm/address/index.js +2 -0
  377. package/dist/esm/config.d.ts +9 -0
  378. package/dist/esm/config.js +11 -0
  379. package/dist/esm/descriptor/NamedDescriptor.d.ts +20 -0
  380. package/dist/esm/descriptor/NamedDescriptor.js +39 -0
  381. package/dist/esm/descriptor/assertDescriptorWalletAddress.d.ts +5 -0
  382. package/dist/esm/descriptor/assertDescriptorWalletAddress.js +27 -0
  383. package/dist/esm/descriptor/builder/builder.d.ts +13 -0
  384. package/dist/esm/descriptor/builder/builder.js +34 -0
  385. package/dist/esm/descriptor/builder/index.d.ts +3 -0
  386. package/dist/esm/descriptor/builder/index.js +3 -0
  387. package/dist/esm/descriptor/builder/parse.d.ts +5 -0
  388. package/dist/esm/descriptor/builder/parse.js +112 -0
  389. package/dist/esm/descriptor/createWallet/createDescriptorWallet.d.ts +20 -0
  390. package/dist/esm/descriptor/createWallet/createDescriptorWallet.js +37 -0
  391. package/dist/esm/descriptor/createWallet/createDescriptors.d.ts +12 -0
  392. package/dist/esm/descriptor/createWallet/createDescriptors.js +29 -0
  393. package/dist/esm/descriptor/createWallet/index.d.ts +3 -0
  394. package/dist/esm/descriptor/createWallet/index.js +3 -0
  395. package/dist/esm/descriptor/descriptorWallet.d.ts +19 -0
  396. package/dist/esm/descriptor/descriptorWallet.js +16 -0
  397. package/dist/esm/descriptor/index.d.ts +8 -0
  398. package/dist/esm/descriptor/index.js +7 -0
  399. package/dist/esm/descriptor/validatePolicy.d.ts +22 -0
  400. package/dist/esm/descriptor/validatePolicy.js +80 -0
  401. package/dist/esm/impl/bch/bch.d.ts +20 -0
  402. package/dist/{src → esm}/impl/bch/bch.d.ts.map +1 -1
  403. package/dist/esm/impl/bch/bch.js +37 -0
  404. package/dist/esm/impl/bch/index.d.ts +3 -0
  405. package/dist/esm/impl/bch/index.js +3 -0
  406. package/dist/esm/impl/bch/tbch.d.ts +10 -0
  407. package/dist/esm/impl/bch/tbch.js +11 -0
  408. package/dist/esm/impl/bcha/bcha.d.ts +8 -0
  409. package/dist/{src → esm}/impl/bcha/bcha.d.ts.map +1 -1
  410. package/dist/esm/impl/bcha/bcha.js +11 -0
  411. package/dist/esm/impl/bcha/index.d.ts +3 -0
  412. package/dist/esm/impl/bcha/index.js +3 -0
  413. package/dist/esm/impl/bcha/tbcha.d.ts +10 -0
  414. package/dist/esm/impl/bcha/tbcha.js +11 -0
  415. package/dist/esm/impl/bsv/bsv.d.ts +8 -0
  416. package/dist/esm/impl/bsv/bsv.js +11 -0
  417. package/dist/esm/impl/bsv/index.d.ts +3 -0
  418. package/dist/esm/impl/bsv/index.js +3 -0
  419. package/dist/esm/impl/bsv/tbsv.d.ts +10 -0
  420. package/dist/esm/impl/bsv/tbsv.js +11 -0
  421. package/dist/esm/impl/btc/btc.d.ts +13 -0
  422. package/dist/esm/impl/btc/btc.js +18 -0
  423. package/dist/esm/impl/btc/index.d.ts +7 -0
  424. package/dist/esm/impl/btc/index.js +7 -0
  425. package/dist/esm/impl/btc/inscriptionBuilder.d.ts +51 -0
  426. package/dist/esm/impl/btc/inscriptionBuilder.js +143 -0
  427. package/dist/esm/impl/btc/tbtc.d.ts +10 -0
  428. package/dist/esm/impl/btc/tbtc.js +11 -0
  429. package/dist/esm/impl/btc/tbtc4.d.ts +10 -0
  430. package/dist/esm/impl/btc/tbtc4.js +11 -0
  431. package/dist/esm/impl/btc/tbtcbgsig.d.ts +10 -0
  432. package/dist/esm/impl/btc/tbtcbgsig.js +11 -0
  433. package/dist/esm/impl/btc/tbtcsig.d.ts +10 -0
  434. package/dist/esm/impl/btc/tbtcsig.js +11 -0
  435. package/dist/esm/impl/btg/btg.d.ts +7 -0
  436. package/dist/esm/impl/btg/btg.js +11 -0
  437. package/dist/esm/impl/btg/index.d.ts +2 -0
  438. package/dist/esm/impl/btg/index.js +2 -0
  439. package/dist/esm/impl/dash/dash.d.ts +7 -0
  440. package/dist/esm/impl/dash/dash.js +11 -0
  441. package/dist/esm/impl/dash/index.d.ts +3 -0
  442. package/dist/esm/impl/dash/index.js +3 -0
  443. package/dist/esm/impl/dash/tdash.d.ts +10 -0
  444. package/dist/esm/impl/dash/tdash.js +11 -0
  445. package/dist/esm/impl/doge/doge.d.ts +32 -0
  446. package/dist/esm/impl/doge/doge.d.ts.map +1 -0
  447. package/dist/esm/impl/doge/doge.js +75 -0
  448. package/dist/esm/impl/doge/index.d.ts +3 -0
  449. package/dist/esm/impl/doge/index.js +3 -0
  450. package/dist/esm/impl/doge/tdoge.d.ts +10 -0
  451. package/dist/esm/impl/doge/tdoge.js +11 -0
  452. package/dist/esm/impl/index.d.ts +10 -0
  453. package/dist/esm/impl/index.js +10 -0
  454. package/dist/esm/impl/ltc/index.d.ts +3 -0
  455. package/dist/esm/impl/ltc/index.js +3 -0
  456. package/dist/esm/impl/ltc/ltc.d.ts +7 -0
  457. package/dist/esm/impl/ltc/ltc.js +15 -0
  458. package/dist/esm/impl/ltc/tltc.d.ts +7 -0
  459. package/dist/esm/impl/ltc/tltc.js +14 -0
  460. package/dist/esm/impl/zec/index.d.ts +3 -0
  461. package/dist/esm/impl/zec/index.js +3 -0
  462. package/dist/esm/impl/zec/tzec.d.ts +7 -0
  463. package/dist/esm/impl/zec/tzec.js +11 -0
  464. package/dist/esm/impl/zec/zec.d.ts +10 -0
  465. package/dist/esm/impl/zec/zec.js +11 -0
  466. package/dist/esm/index.d.ts +21 -0
  467. package/dist/esm/index.js +21 -0
  468. package/dist/esm/keychains.d.ts +48 -0
  469. package/dist/esm/keychains.js +61 -0
  470. package/dist/esm/names.d.ts +26 -0
  471. package/dist/esm/names.js +171 -0
  472. package/dist/esm/offlineVault/OfflineVaultHalfSigned.d.ts +8 -0
  473. package/dist/esm/offlineVault/OfflineVaultHalfSigned.js +23 -0
  474. package/dist/esm/offlineVault/OfflineVaultSignable.d.ts +46 -0
  475. package/dist/esm/offlineVault/OfflineVaultSignable.js +18 -0
  476. package/dist/esm/offlineVault/TransactionExplanation.d.ts +15 -0
  477. package/dist/esm/offlineVault/TransactionExplanation.js +13 -0
  478. package/dist/esm/offlineVault/descriptor/index.d.ts +2 -0
  479. package/dist/esm/offlineVault/descriptor/index.js +2 -0
  480. package/dist/esm/offlineVault/descriptor/transaction.d.ts +38 -0
  481. package/dist/esm/offlineVault/descriptor/transaction.js +41 -0
  482. package/dist/esm/offlineVault/index.d.ts +6 -0
  483. package/dist/esm/offlineVault/index.js +4 -0
  484. package/dist/esm/recovery/RecoveryProvider.d.ts +22 -0
  485. package/dist/{src → esm}/recovery/RecoveryProvider.js +6 -9
  486. package/dist/esm/recovery/backupKeyRecovery.d.ts +88 -0
  487. package/dist/esm/recovery/backupKeyRecovery.js +329 -0
  488. package/dist/esm/recovery/baseApi.d.ts +24 -0
  489. package/dist/esm/recovery/baseApi.js +64 -0
  490. package/dist/esm/recovery/coingeckoApi.d.ts +6 -0
  491. package/dist/esm/recovery/coingeckoApi.js +40 -0
  492. package/dist/esm/recovery/crossChainRecovery.d.ts +86 -0
  493. package/dist/esm/recovery/crossChainRecovery.js +325 -0
  494. package/dist/esm/recovery/index.d.ts +7 -0
  495. package/dist/esm/recovery/index.js +7 -0
  496. package/dist/esm/recovery/mempoolApi.d.ts +7 -0
  497. package/dist/esm/recovery/mempoolApi.js +29 -0
  498. package/dist/esm/replayProtection.d.ts +5 -0
  499. package/dist/esm/replayProtection.d.ts.map +1 -0
  500. package/dist/esm/replayProtection.js +20 -0
  501. package/dist/esm/sign.d.ts +54 -0
  502. package/dist/esm/sign.js +162 -0
  503. package/dist/esm/transaction/bip322.d.ts +27 -0
  504. package/dist/esm/transaction/bip322.js +86 -0
  505. package/dist/esm/transaction/common/verifyPayGoAmount.d.ts +1 -0
  506. package/dist/{src → esm}/transaction/common/verifyPayGoAmount.js +0 -2
  507. package/dist/esm/transaction/descriptor/explainPsbt.d.ts +5 -0
  508. package/dist/esm/transaction/descriptor/explainPsbt.d.ts.map +1 -0
  509. package/dist/esm/transaction/descriptor/explainPsbt.js +44 -0
  510. package/dist/esm/transaction/descriptor/index.d.ts +7 -0
  511. package/dist/esm/transaction/descriptor/index.js +6 -0
  512. package/dist/esm/transaction/descriptor/parse.d.ts +16 -0
  513. package/dist/esm/transaction/descriptor/parse.d.ts.map +1 -0
  514. package/dist/esm/transaction/descriptor/parse.js +79 -0
  515. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts +14 -0
  516. package/dist/esm/transaction/descriptor/parseToAmountType.d.ts.map +1 -0
  517. package/dist/esm/transaction/descriptor/parseToAmountType.js +55 -0
  518. package/dist/esm/transaction/descriptor/recipient.d.ts +5 -0
  519. package/dist/{src → esm}/transaction/descriptor/recipient.js +1 -2
  520. package/dist/esm/transaction/descriptor/signPsbt.d.ts +25 -0
  521. package/dist/esm/transaction/descriptor/signPsbt.js +38 -0
  522. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts +36 -0
  523. package/dist/esm/transaction/descriptor/verifyTransaction.d.ts.map +1 -0
  524. package/dist/esm/transaction/descriptor/verifyTransaction.js +65 -0
  525. package/dist/esm/transaction/explainTransaction.d.ts +18 -0
  526. package/dist/esm/transaction/explainTransaction.d.ts.map +1 -0
  527. package/dist/esm/transaction/explainTransaction.js +52 -0
  528. package/dist/esm/transaction/fetchInputs.d.ts +26 -0
  529. package/dist/esm/transaction/fetchInputs.js +72 -0
  530. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts +10 -0
  531. package/dist/esm/transaction/fixedScript/explainPsbtWasm.d.ts.map +1 -0
  532. package/dist/esm/transaction/fixedScript/explainPsbtWasm.js +40 -0
  533. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts +64 -0
  534. package/dist/esm/transaction/fixedScript/explainTransaction.d.ts.map +1 -0
  535. package/dist/esm/transaction/fixedScript/explainTransaction.js +284 -0
  536. package/dist/esm/transaction/fixedScript/index.d.ts +7 -0
  537. package/dist/esm/transaction/fixedScript/index.d.ts.map +1 -0
  538. package/dist/esm/transaction/fixedScript/index.js +6 -0
  539. package/dist/esm/transaction/fixedScript/parseOutput.d.ts +28 -0
  540. package/dist/esm/transaction/fixedScript/parseOutput.d.ts.map +1 -0
  541. package/dist/esm/transaction/fixedScript/parseOutput.js +210 -0
  542. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts +8 -0
  543. package/dist/esm/transaction/fixedScript/parseTransaction.d.ts.map +1 -0
  544. package/dist/esm/transaction/fixedScript/parseTransaction.js +176 -0
  545. package/dist/esm/transaction/fixedScript/signTransaction.d.ts +18 -0
  546. package/dist/esm/transaction/fixedScript/signTransaction.js +95 -0
  547. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts +21 -0
  548. package/dist/esm/transaction/fixedScript/verifyTransaction.d.ts.map +1 -0
  549. package/dist/esm/transaction/fixedScript/verifyTransaction.js +159 -0
  550. package/dist/esm/transaction/getPayGoVerificationPubkey.d.ts +9 -0
  551. package/dist/esm/transaction/getPayGoVerificationPubkey.js +17 -0
  552. package/dist/esm/transaction/index.d.ts +8 -0
  553. package/dist/esm/transaction/index.d.ts.map +1 -0
  554. package/dist/esm/transaction/index.js +8 -0
  555. package/dist/esm/transaction/outputDifference.d.ts +40 -0
  556. package/dist/esm/transaction/outputDifference.js +42 -0
  557. package/dist/esm/transaction/parseTransaction.d.ts +4 -0
  558. package/dist/esm/transaction/parseTransaction.d.ts.map +1 -0
  559. package/dist/esm/transaction/parseTransaction.js +12 -0
  560. package/dist/esm/transaction/recipient.d.ts +29 -0
  561. package/dist/{src → esm}/transaction/recipient.d.ts.map +1 -1
  562. package/dist/esm/transaction/recipient.js +48 -0
  563. package/dist/esm/transaction/signTransaction.d.ts +6 -0
  564. package/dist/esm/transaction/signTransaction.js +63 -0
  565. package/dist/esm/transaction/types.d.ts +44 -0
  566. package/dist/esm/transaction/types.d.ts.map +1 -0
  567. package/dist/esm/transaction/types.js +2 -0
  568. package/dist/esm/transaction/verifyTransaction.d.ts +4 -0
  569. package/dist/esm/transaction/verifyTransaction.js +14 -0
  570. package/dist/esm/verifyKey.d.ts +29 -0
  571. package/dist/esm/verifyKey.d.ts.map +1 -0
  572. package/dist/esm/verifyKey.js +123 -0
  573. package/dist/esm/wallet.d.ts +15 -0
  574. package/dist/esm/wallet.js +5 -0
  575. package/package.json +33 -16
  576. package/dist/src/abstractUtxoCoin.d.ts.map +0 -1
  577. package/dist/src/abstractUtxoCoin.js +0 -634
  578. package/dist/src/address/fixedScript.js +0 -143
  579. package/dist/src/config.js +0 -14
  580. package/dist/src/descriptor/NamedDescriptor.js +0 -79
  581. package/dist/src/descriptor/assertDescriptorWalletAddress.js +0 -66
  582. package/dist/src/descriptor/builder/builder.js +0 -37
  583. package/dist/src/descriptor/builder/parse.js +0 -116
  584. package/dist/src/descriptor/createWallet/createDescriptorWallet.js +0 -41
  585. package/dist/src/descriptor/createWallet/createDescriptors.js +0 -33
  586. package/dist/src/descriptor/descriptorWallet.js +0 -54
  587. package/dist/src/descriptor/validatePolicy.js +0 -92
  588. package/dist/src/impl/bch/bch.js +0 -70
  589. package/dist/src/impl/bcha/bcha.js +0 -58
  590. package/dist/src/impl/btc/inscriptionBuilder.js +0 -183
  591. package/dist/src/impl/doge/doge.d.ts.map +0 -1
  592. package/dist/src/impl/doge/doge.js +0 -79
  593. package/dist/src/keychains.js +0 -104
  594. package/dist/src/names.js +0 -214
  595. package/dist/src/offlineVault/OfflineVaultHalfSigned.js +0 -26
  596. package/dist/src/offlineVault/OfflineVaultSignable.js +0 -55
  597. package/dist/src/offlineVault/TransactionExplanation.js +0 -16
  598. package/dist/src/offlineVault/descriptor/transaction.js +0 -80
  599. package/dist/src/recovery/backupKeyRecovery.js +0 -370
  600. package/dist/src/recovery/baseApi.js +0 -73
  601. package/dist/src/recovery/coingeckoApi.js +0 -44
  602. package/dist/src/recovery/crossChainRecovery.js +0 -364
  603. package/dist/src/recovery/mempoolApi.js +0 -36
  604. package/dist/src/replayProtection.d.ts.map +0 -1
  605. package/dist/src/replayProtection.js +0 -53
  606. package/dist/src/sign.js +0 -205
  607. package/dist/src/transaction/bip322.js +0 -125
  608. package/dist/src/transaction/descriptor/explainPsbt.d.ts.map +0 -1
  609. package/dist/src/transaction/descriptor/explainPsbt.js +0 -80
  610. package/dist/src/transaction/descriptor/parse.d.ts.map +0 -1
  611. package/dist/src/transaction/descriptor/parse.js +0 -116
  612. package/dist/src/transaction/descriptor/parseToAmountType.d.ts.map +0 -1
  613. package/dist/src/transaction/descriptor/parseToAmountType.js +0 -60
  614. package/dist/src/transaction/descriptor/signPsbt.js +0 -43
  615. package/dist/src/transaction/descriptor/verifyTransaction.d.ts.map +0 -1
  616. package/dist/src/transaction/descriptor/verifyTransaction.js +0 -108
  617. package/dist/src/transaction/explainTransaction.d.ts.map +0 -1
  618. package/dist/src/transaction/explainTransaction.js +0 -67
  619. package/dist/src/transaction/fetchInputs.js +0 -109
  620. package/dist/src/transaction/fixedScript/explainTransaction.d.ts +0 -29
  621. package/dist/src/transaction/fixedScript/explainTransaction.d.ts.map +0 -1
  622. package/dist/src/transaction/fixedScript/explainTransaction.js +0 -321
  623. package/dist/src/transaction/fixedScript/index.d.ts.map +0 -1
  624. package/dist/src/transaction/fixedScript/parseOutput.d.ts.map +0 -1
  625. package/dist/src/transaction/fixedScript/parseOutput.js +0 -213
  626. package/dist/src/transaction/fixedScript/parseTransaction.d.ts.map +0 -1
  627. package/dist/src/transaction/fixedScript/parseTransaction.js +0 -203
  628. package/dist/src/transaction/fixedScript/signTransaction.js +0 -101
  629. package/dist/src/transaction/fixedScript/verifyTransaction.d.ts.map +0 -1
  630. package/dist/src/transaction/fixedScript/verifyTransaction.js +0 -198
  631. package/dist/src/transaction/index.d.ts.map +0 -1
  632. package/dist/src/transaction/outputDifference.js +0 -47
  633. package/dist/src/transaction/parseTransaction.d.ts.map +0 -1
  634. package/dist/src/transaction/recipient.js +0 -88
  635. package/dist/src/transaction/signTransaction.js +0 -102
  636. package/dist/src/verifyKey.d.ts.map +0 -1
  637. package/dist/src/verifyKey.js +0 -164
  638. package/dist/src/wallet.js +0 -8
  639. /package/dist/{src → cjs/src}/address/fixedScript.d.ts +0 -0
  640. /package/dist/{src → cjs/src}/address/index.d.ts +0 -0
  641. /package/dist/{src → cjs/src}/config.d.ts +0 -0
  642. /package/dist/{src → cjs/src}/descriptor/NamedDescriptor.d.ts +0 -0
  643. /package/dist/{src → cjs/src}/descriptor/assertDescriptorWalletAddress.d.ts +0 -0
  644. /package/dist/{src → cjs/src}/descriptor/builder/builder.d.ts +0 -0
  645. /package/dist/{src → cjs/src}/descriptor/builder/index.d.ts +0 -0
  646. /package/dist/{src → cjs/src}/descriptor/builder/parse.d.ts +0 -0
  647. /package/dist/{src → cjs/src}/descriptor/createWallet/createDescriptorWallet.d.ts +0 -0
  648. /package/dist/{src → cjs/src}/descriptor/createWallet/createDescriptors.d.ts +0 -0
  649. /package/dist/{src → cjs/src}/descriptor/createWallet/index.d.ts +0 -0
  650. /package/dist/{src → cjs/src}/descriptor/descriptorWallet.d.ts +0 -0
  651. /package/dist/{src → cjs/src}/descriptor/index.d.ts +0 -0
  652. /package/dist/{src → cjs/src}/descriptor/validatePolicy.d.ts +0 -0
  653. /package/dist/{src → cjs/src}/impl/bch/bch.d.ts +0 -0
  654. /package/dist/{src → cjs/src}/impl/bch/index.d.ts +0 -0
  655. /package/dist/{src → cjs/src}/impl/bch/tbch.d.ts +0 -0
  656. /package/dist/{src → cjs/src}/impl/bcha/index.d.ts +0 -0
  657. /package/dist/{src → cjs/src}/impl/bcha/tbcha.d.ts +0 -0
  658. /package/dist/{src → cjs/src}/impl/bsv/bsv.d.ts +0 -0
  659. /package/dist/{src → cjs/src}/impl/bsv/index.d.ts +0 -0
  660. /package/dist/{src → cjs/src}/impl/bsv/tbsv.d.ts +0 -0
  661. /package/dist/{src → cjs/src}/impl/btc/btc.d.ts +0 -0
  662. /package/dist/{src → cjs/src}/impl/btc/index.d.ts +0 -0
  663. /package/dist/{src → cjs/src}/impl/btc/inscriptionBuilder.d.ts +0 -0
  664. /package/dist/{src → cjs/src}/impl/btc/tbtc.d.ts +0 -0
  665. /package/dist/{src → cjs/src}/impl/btc/tbtc4.d.ts +0 -0
  666. /package/dist/{src → cjs/src}/impl/btc/tbtcbgsig.d.ts +0 -0
  667. /package/dist/{src → cjs/src}/impl/btc/tbtcsig.d.ts +0 -0
  668. /package/dist/{src → cjs/src}/impl/btg/btg.d.ts +0 -0
  669. /package/dist/{src → cjs/src}/impl/btg/index.d.ts +0 -0
  670. /package/dist/{src → cjs/src}/impl/dash/dash.d.ts +0 -0
  671. /package/dist/{src → cjs/src}/impl/dash/index.d.ts +0 -0
  672. /package/dist/{src → cjs/src}/impl/dash/tdash.d.ts +0 -0
  673. /package/dist/{src → cjs/src}/impl/doge/index.d.ts +0 -0
  674. /package/dist/{src → cjs/src}/impl/doge/tdoge.d.ts +0 -0
  675. /package/dist/{src → cjs/src}/impl/index.d.ts +0 -0
  676. /package/dist/{src → cjs/src}/impl/ltc/index.d.ts +0 -0
  677. /package/dist/{src → cjs/src}/impl/ltc/ltc.d.ts +0 -0
  678. /package/dist/{src → cjs/src}/impl/ltc/tltc.d.ts +0 -0
  679. /package/dist/{src → cjs/src}/impl/zec/index.d.ts +0 -0
  680. /package/dist/{src → cjs/src}/impl/zec/tzec.d.ts +0 -0
  681. /package/dist/{src → cjs/src}/impl/zec/zec.d.ts +0 -0
  682. /package/dist/{src → cjs/src}/index.d.ts +0 -0
  683. /package/dist/{src → cjs/src}/keychains.d.ts +0 -0
  684. /package/dist/{src → cjs/src}/names.d.ts +0 -0
  685. /package/dist/{src → cjs/src}/offlineVault/OfflineVaultHalfSigned.d.ts +0 -0
  686. /package/dist/{src → cjs/src}/offlineVault/OfflineVaultSignable.d.ts +0 -0
  687. /package/dist/{src → cjs/src}/offlineVault/TransactionExplanation.d.ts +0 -0
  688. /package/dist/{src → cjs/src}/offlineVault/descriptor/index.d.ts +0 -0
  689. /package/dist/{src → cjs/src}/offlineVault/descriptor/transaction.d.ts +0 -0
  690. /package/dist/{src → cjs/src}/offlineVault/index.d.ts +0 -0
  691. /package/dist/{src → cjs/src}/recovery/RecoveryProvider.d.ts +0 -0
  692. /package/dist/{src → cjs/src}/recovery/backupKeyRecovery.d.ts +0 -0
  693. /package/dist/{src → cjs/src}/recovery/baseApi.d.ts +0 -0
  694. /package/dist/{src → cjs/src}/recovery/coingeckoApi.d.ts +0 -0
  695. /package/dist/{src → cjs/src}/recovery/crossChainRecovery.d.ts +0 -0
  696. /package/dist/{src → cjs/src}/recovery/index.d.ts +0 -0
  697. /package/dist/{src → cjs/src}/recovery/mempoolApi.d.ts +0 -0
  698. /package/dist/{src → cjs/src}/sign.d.ts +0 -0
  699. /package/dist/{src → cjs/src}/transaction/bip322.d.ts +0 -0
  700. /package/dist/{src → cjs/src}/transaction/common/verifyPayGoAmount.d.ts +0 -0
  701. /package/dist/{src → cjs/src}/transaction/descriptor/index.d.ts +0 -0
  702. /package/dist/{src → cjs/src}/transaction/descriptor/recipient.d.ts +0 -0
  703. /package/dist/{src → cjs/src}/transaction/descriptor/signPsbt.d.ts +0 -0
  704. /package/dist/{src → cjs/src}/transaction/fetchInputs.d.ts +0 -0
  705. /package/dist/{src → cjs/src}/transaction/fixedScript/signTransaction.d.ts +0 -0
  706. /package/dist/{src → cjs/src}/transaction/fixedScript/verifyTransaction.d.ts +0 -0
  707. /package/dist/{src → cjs/src}/transaction/getPayGoVerificationPubkey.d.ts +0 -0
  708. /package/dist/{src → cjs/src}/transaction/outputDifference.d.ts +0 -0
  709. /package/dist/{src → cjs/src}/transaction/recipient.d.ts +0 -0
  710. /package/dist/{src → cjs/src}/transaction/signTransaction.d.ts +0 -0
  711. /package/dist/{src → cjs/src}/transaction/verifyTransaction.d.ts +0 -0
  712. /package/dist/{src → cjs/src}/wallet.d.ts +0 -0
  713. /package/dist/{src → esm}/address/index.d.ts.map +0 -0
  714. /package/dist/{src → esm}/config.d.ts.map +0 -0
  715. /package/dist/{src → esm}/descriptor/NamedDescriptor.d.ts.map +0 -0
  716. /package/dist/{src → esm}/descriptor/assertDescriptorWalletAddress.d.ts.map +0 -0
  717. /package/dist/{src → esm}/descriptor/builder/builder.d.ts.map +0 -0
  718. /package/dist/{src → esm}/descriptor/builder/index.d.ts.map +0 -0
  719. /package/dist/{src → esm}/descriptor/builder/parse.d.ts.map +0 -0
  720. /package/dist/{src → esm}/descriptor/createWallet/createDescriptorWallet.d.ts.map +0 -0
  721. /package/dist/{src → esm}/descriptor/createWallet/createDescriptors.d.ts.map +0 -0
  722. /package/dist/{src → esm}/descriptor/createWallet/index.d.ts.map +0 -0
  723. /package/dist/{src → esm}/descriptor/descriptorWallet.d.ts.map +0 -0
  724. /package/dist/{src → esm}/descriptor/index.d.ts.map +0 -0
  725. /package/dist/{src → esm}/descriptor/validatePolicy.d.ts.map +0 -0
  726. /package/dist/{src → esm}/impl/bch/index.d.ts.map +0 -0
  727. /package/dist/{src → esm}/impl/bch/tbch.d.ts.map +0 -0
  728. /package/dist/{src → esm}/impl/bcha/index.d.ts.map +0 -0
  729. /package/dist/{src → esm}/impl/bcha/tbcha.d.ts.map +0 -0
  730. /package/dist/{src → esm}/impl/bsv/bsv.d.ts.map +0 -0
  731. /package/dist/{src → esm}/impl/bsv/index.d.ts.map +0 -0
  732. /package/dist/{src → esm}/impl/bsv/tbsv.d.ts.map +0 -0
  733. /package/dist/{src → esm}/impl/btc/btc.d.ts.map +0 -0
  734. /package/dist/{src → esm}/impl/btc/index.d.ts.map +0 -0
  735. /package/dist/{src → esm}/impl/btc/inscriptionBuilder.d.ts.map +0 -0
  736. /package/dist/{src → esm}/impl/btc/tbtc.d.ts.map +0 -0
  737. /package/dist/{src → esm}/impl/btc/tbtc4.d.ts.map +0 -0
  738. /package/dist/{src → esm}/impl/btc/tbtcbgsig.d.ts.map +0 -0
  739. /package/dist/{src → esm}/impl/btc/tbtcsig.d.ts.map +0 -0
  740. /package/dist/{src → esm}/impl/btg/btg.d.ts.map +0 -0
  741. /package/dist/{src → esm}/impl/btg/index.d.ts.map +0 -0
  742. /package/dist/{src → esm}/impl/dash/dash.d.ts.map +0 -0
  743. /package/dist/{src → esm}/impl/dash/index.d.ts.map +0 -0
  744. /package/dist/{src → esm}/impl/dash/tdash.d.ts.map +0 -0
  745. /package/dist/{src → esm}/impl/doge/index.d.ts.map +0 -0
  746. /package/dist/{src → esm}/impl/doge/tdoge.d.ts.map +0 -0
  747. /package/dist/{src → esm}/impl/index.d.ts.map +0 -0
  748. /package/dist/{src → esm}/impl/ltc/index.d.ts.map +0 -0
  749. /package/dist/{src → esm}/impl/ltc/ltc.d.ts.map +0 -0
  750. /package/dist/{src → esm}/impl/ltc/tltc.d.ts.map +0 -0
  751. /package/dist/{src → esm}/impl/zec/index.d.ts.map +0 -0
  752. /package/dist/{src → esm}/impl/zec/tzec.d.ts.map +0 -0
  753. /package/dist/{src → esm}/impl/zec/zec.d.ts.map +0 -0
  754. /package/dist/{src → esm}/index.d.ts.map +0 -0
  755. /package/dist/{src → esm}/keychains.d.ts.map +0 -0
  756. /package/dist/{src → esm}/names.d.ts.map +0 -0
  757. /package/dist/{src → esm}/offlineVault/OfflineVaultHalfSigned.d.ts.map +0 -0
  758. /package/dist/{src → esm}/offlineVault/OfflineVaultSignable.d.ts.map +0 -0
  759. /package/dist/{src → esm}/offlineVault/TransactionExplanation.d.ts.map +0 -0
  760. /package/dist/{src → esm}/offlineVault/descriptor/index.d.ts.map +0 -0
  761. /package/dist/{src → esm}/offlineVault/descriptor/transaction.d.ts.map +0 -0
  762. /package/dist/{src → esm}/offlineVault/index.d.ts.map +0 -0
  763. /package/dist/{src → esm}/recovery/RecoveryProvider.d.ts.map +0 -0
  764. /package/dist/{src → esm}/recovery/backupKeyRecovery.d.ts.map +0 -0
  765. /package/dist/{src → esm}/recovery/baseApi.d.ts.map +0 -0
  766. /package/dist/{src → esm}/recovery/coingeckoApi.d.ts.map +0 -0
  767. /package/dist/{src → esm}/recovery/crossChainRecovery.d.ts.map +0 -0
  768. /package/dist/{src → esm}/recovery/index.d.ts.map +0 -0
  769. /package/dist/{src → esm}/recovery/mempoolApi.d.ts.map +0 -0
  770. /package/dist/{src → esm}/sign.d.ts.map +0 -0
  771. /package/dist/{src → esm}/transaction/bip322.d.ts.map +0 -0
  772. /package/dist/{src → esm}/transaction/common/verifyPayGoAmount.d.ts.map +0 -0
  773. /package/dist/{src → esm}/transaction/descriptor/index.d.ts.map +0 -0
  774. /package/dist/{src → esm}/transaction/descriptor/recipient.d.ts.map +0 -0
  775. /package/dist/{src → esm}/transaction/descriptor/signPsbt.d.ts.map +0 -0
  776. /package/dist/{src → esm}/transaction/fetchInputs.d.ts.map +0 -0
  777. /package/dist/{src → esm}/transaction/fixedScript/signTransaction.d.ts.map +0 -0
  778. /package/dist/{src → esm}/transaction/getPayGoVerificationPubkey.d.ts.map +0 -0
  779. /package/dist/{src → esm}/transaction/outputDifference.d.ts.map +0 -0
  780. /package/dist/{src → esm}/transaction/signTransaction.d.ts.map +0 -0
  781. /package/dist/{src → esm}/transaction/verifyTransaction.d.ts.map +0 -0
  782. /package/dist/{src → esm}/wallet.d.ts.map +0 -0
@@ -0,0 +1,329 @@
1
+ import assert from 'assert';
2
+ import _ from 'lodash';
3
+ import * as utxolib from '@bitgo/utxo-lib';
4
+ import { Dimensions } from '@bitgo/unspents';
5
+ import { ErrorNoInputToRecover, getKrsProvider, getBip32Keys, getIsKrsRecovery, getIsUnsignedSweep, isTriple, krsProviders, } from '@bitgo/sdk-core';
6
+ import { getMainnet, networks } from '@bitgo/utxo-lib';
7
+ import { signAndVerifyPsbt } from '../sign';
8
+ import { forCoin } from './RecoveryProvider';
9
+ import { MempoolApi } from './mempoolApi';
10
+ import { CoingeckoApi } from './coingeckoApi';
11
+ const { getInternalChainCode, scriptTypeForChain, outputScripts, getExternalChainCode } = utxolib.bitgo;
12
+ /**
13
+ * This transforms the txInfo from recover into the format that offline-signing-tool expects
14
+ * @param coinName
15
+ * @param txInfo
16
+ * @param txHex
17
+ * @returns {{txHex: *, txInfo: {unspents: *}, feeInfo: {}, coin: void}}
18
+ */
19
+ function formatForOfflineVault(coinName, txInfo, txHex) {
20
+ return {
21
+ txHex,
22
+ txInfo: {
23
+ unspents: txInfo.inputs.map((input) => {
24
+ assert(input.valueString);
25
+ return { ...input, valueString: input.valueString };
26
+ }),
27
+ },
28
+ feeInfo: {},
29
+ coin: coinName,
30
+ };
31
+ }
32
+ /**
33
+ * Get the current market price from a third party to be used for recovery
34
+ * This function is only intended for non-bitgo recovery transactions, when it is necessary
35
+ * to calculate the rough fee needed to pay to Keyternal. We are okay with approximating,
36
+ * because the resulting price of this function only has less than 1 dollar influence on the
37
+ * fee that needs to be paid to Keyternal.
38
+ *
39
+ * See calculateFeeAmount function: return Math.round(feeAmountUsd / currentPrice * self.getBaseFactor());
40
+ *
41
+ * This end function should not be used as an accurate endpoint, since some coins' prices are missing from the provider
42
+ */
43
+ async function getRecoveryMarketPrice(coin) {
44
+ return await new CoingeckoApi().getUSDPrice(coin.getFamily());
45
+ }
46
+ /**
47
+ * Calculates the amount (in base units) to pay a KRS provider when building a recovery transaction
48
+ * @param coin
49
+ * @param params
50
+ * @param params.provider {String} the KRS provider that holds the backup key
51
+ * @returns {*}
52
+ */
53
+ async function calculateFeeAmount(coin, params) {
54
+ const krsProvider = krsProviders[params.provider];
55
+ if (krsProvider === undefined) {
56
+ throw new Error(`no fee structure specified for provider ${params.provider}`);
57
+ }
58
+ if (krsProvider.feeType === 'flatUsd') {
59
+ const feeAmountUsd = krsProvider.feeAmount;
60
+ const currentPrice = await getRecoveryMarketPrice(coin);
61
+ return Math.round((feeAmountUsd / currentPrice) * coin.getBaseFactor());
62
+ }
63
+ else {
64
+ // we can add more fee structures here as needed for different providers, such as percentage of recovery amount
65
+ throw new Error('Fee structure not implemented');
66
+ }
67
+ }
68
+ function getFormattedAddress(coin, address) {
69
+ // Blockchair uses cashaddr format when querying the API for address information. Convert legacy addresses to cashaddr
70
+ // before querying the API.
71
+ return coin.getChain() === 'bch' || coin.getChain() === 'bcha'
72
+ ? coin.canonicalAddress(address.address, 'cashaddr').split(':')[1]
73
+ : address.address;
74
+ }
75
+ async function queryBlockchainUnspentsPath(coin, params, walletKeys, chain) {
76
+ const scriptType = scriptTypeForChain(chain);
77
+ const fetchPrevTx = !utxolib.bitgo.outputScripts.hasWitnessData(scriptType) && getMainnet(coin.network) !== networks.zcash;
78
+ const recoveryProvider = params.recoveryProvider ?? forCoin(coin.getChain(), params.apiKey);
79
+ const MAX_SEQUENTIAL_ADDRESSES_WITHOUT_TXS = params.scan || 20;
80
+ let numSequentialAddressesWithoutTxs = 0;
81
+ const prevTxCache = new Map();
82
+ async function getPrevTx(txid) {
83
+ let prevTxHex = prevTxCache.get(txid);
84
+ if (!prevTxHex) {
85
+ prevTxHex = await recoveryProvider.getTransactionHex(txid);
86
+ prevTxCache.set(txid, prevTxHex);
87
+ }
88
+ return prevTxHex;
89
+ }
90
+ async function gatherUnspents(addrIndex) {
91
+ const walletKeysForUnspent = walletKeys.deriveForChainAndIndex(chain, addrIndex);
92
+ const address = coin.createMultiSigAddress(scriptType, 2, walletKeysForUnspent.publicKeys);
93
+ const formattedAddress = getFormattedAddress(coin, address);
94
+ const addrInfo = await recoveryProvider.getAddressInfo(formattedAddress);
95
+ // we use txCount here because it implies usage - having tx'es means the addr was generated and used
96
+ if (addrInfo.txCount === 0) {
97
+ numSequentialAddressesWithoutTxs++;
98
+ }
99
+ else {
100
+ numSequentialAddressesWithoutTxs = 0;
101
+ if (addrInfo.balance > 0) {
102
+ console.log(`Found an address with balance: ${address.address} with balance ${addrInfo.balance}`);
103
+ const addressUnspents = await recoveryProvider.getUnspentsForAddresses([formattedAddress]);
104
+ const processedUnspents = await Promise.all(addressUnspents.map(async (u) => {
105
+ const { txid, vout } = utxolib.bitgo.parseOutputId(u.id);
106
+ let val = BigInt(u.value);
107
+ if (coin.amountType === 'bigint') {
108
+ // blockchair returns the number with the correct precision, but in number format
109
+ // json parse won't parse it correctly, so we requery the txid for the tx hex to decode here
110
+ if (!Number.isSafeInteger(u.value)) {
111
+ const txHex = await getPrevTx(txid);
112
+ const tx = coin.createTransactionFromHex(txHex);
113
+ val = tx.outs[vout].value;
114
+ }
115
+ }
116
+ // the api may return cashaddr's instead of legacy for BCH and BCHA
117
+ // downstream processes's only expect legacy addresses
118
+ u = { ...u, address: coin.canonicalAddress(u.address) };
119
+ return {
120
+ ...u,
121
+ value: val,
122
+ chain: chain,
123
+ index: addrIndex,
124
+ prevTx: fetchPrevTx ? Buffer.from(await getPrevTx(txid), 'hex') : undefined,
125
+ };
126
+ }));
127
+ walletUnspents.push(...processedUnspents);
128
+ }
129
+ }
130
+ if (numSequentialAddressesWithoutTxs >= MAX_SEQUENTIAL_ADDRESSES_WITHOUT_TXS) {
131
+ // stop searching for addresses with unspents in them, we've found ${MAX_SEQUENTIAL_ADDRESSES_WITHOUT_TXS} in a row with none
132
+ // we are done
133
+ return;
134
+ }
135
+ return gatherUnspents(addrIndex + 1);
136
+ }
137
+ // get unspents for these addresses
138
+ const walletUnspents = [];
139
+ // This will populate walletAddresses
140
+ await gatherUnspents(0);
141
+ if (walletUnspents.length === 0) {
142
+ // Couldn't find any addresses with funds
143
+ return [];
144
+ }
145
+ return walletUnspents;
146
+ }
147
+ async function getRecoveryFeePerBytes(coin, { defaultValue }) {
148
+ if (coin.getFamily() === 'doge') {
149
+ // https://github.com/dogecoin/dogecoin/blob/master/doc/fee-recommendation.md
150
+ // 0.01 DOGE per KB
151
+ return 1000;
152
+ }
153
+ try {
154
+ return await MempoolApi.forCoin(coin.getChain()).getRecoveryFeePerBytes();
155
+ }
156
+ catch (e) {
157
+ console.dir(e);
158
+ return defaultValue;
159
+ }
160
+ }
161
+ /**
162
+ * Builds a funds recovery transaction without BitGo.
163
+ *
164
+ * Returns transaction hex in legacy format for unsigned sweep transaction, half signed backup recovery transaction with KRS provider (only keyternal),
165
+ * fully signed backup recovery transaction without a KRS provider.
166
+ *
167
+ * Returns PSBT hex for half signed backup recovery transaction with KRS provider (excluding keyternal)
168
+ * For PSBT hex cases, Unspents are not required in response.
169
+ *
170
+ * @param coin
171
+ * @param bitgo
172
+ * @param params
173
+ * - userKey: [encrypted] xprv, or xpub
174
+ * - backupKey: [encrypted] xprv, or xpub if the xprv is held by a KRS provider
175
+ * - walletPassphrase: necessary if one of the xprvs is encrypted
176
+ * - bitgoKey: xpub
177
+ * - krsProvider: necessary if backup key is held by KRS
178
+ * - recoveryDestination: target address to send recovered funds to
179
+ * - scan: the amount of consecutive addresses without unspents to scan through before stopping
180
+ * - ignoreAddressTypes: (optional) scripts to ignore
181
+ * for example: ['p2shP2wsh', 'p2wsh'] will prevent code from checking for wrapped-segwit and native-segwit chains on the public block explorers
182
+ */
183
+ export async function backupKeyRecovery(coin, bitgo, params) {
184
+ if (_.isUndefined(params.userKey)) {
185
+ throw new Error('missing userKey');
186
+ }
187
+ if (_.isUndefined(params.backupKey)) {
188
+ throw new Error('missing backupKey');
189
+ }
190
+ if (_.isUndefined(params.recoveryDestination) ||
191
+ !coin.isValidAddress(params.recoveryDestination, { anyFormat: true })) {
192
+ throw new Error('invalid recoveryDestination');
193
+ }
194
+ if (!_.isUndefined(params.scan) && (!_.isInteger(params.scan) || params.scan < 0)) {
195
+ throw new Error('scan must be a positive integer');
196
+ }
197
+ if (params.feeRate !== undefined && (!Number.isFinite(params.feeRate) || params.feeRate <= 0)) {
198
+ throw new Error('feeRate must be a positive number');
199
+ }
200
+ const isKrsRecovery = getIsKrsRecovery(params);
201
+ const isUnsignedSweep = getIsUnsignedSweep(params);
202
+ const responseTxFormat = isUnsignedSweep || !isKrsRecovery || params.krsProvider === 'keyternal' ? 'legacy' : 'psbt';
203
+ const krsProvider = isKrsRecovery ? getKrsProvider(coin, params.krsProvider) : undefined;
204
+ // check whether key material and password authenticate the users and return parent keys of all three keys of the wallet
205
+ const keys = getBip32Keys(bitgo, params, { requireBitGoXpub: true });
206
+ if (!isTriple(keys)) {
207
+ throw new Error(`expected key triple`);
208
+ }
209
+ const walletKeys = new utxolib.bitgo.RootWalletKeys(keys, [
210
+ params.userKeyPath || utxolib.bitgo.RootWalletKeys.defaultPrefix,
211
+ utxolib.bitgo.RootWalletKeys.defaultPrefix,
212
+ utxolib.bitgo.RootWalletKeys.defaultPrefix,
213
+ ]);
214
+ const unspents = (await Promise.all(outputScripts.scriptTypes2Of3
215
+ .filter((addressType) => coin.supportsAddressType(addressType) && !params.ignoreAddressTypes?.includes(addressType))
216
+ .reduce((queries, addressType) => [
217
+ ...queries,
218
+ queryBlockchainUnspentsPath(coin, params, walletKeys, getExternalChainCode(addressType)),
219
+ queryBlockchainUnspentsPath(coin, params, walletKeys, getInternalChainCode(addressType)),
220
+ ], []))).flat();
221
+ // Execute the queries and gather the unspents
222
+ const totalInputAmount = utxolib.bitgo.unspentSum(unspents, 'bigint');
223
+ if (totalInputAmount <= BigInt(0)) {
224
+ throw new ErrorNoInputToRecover();
225
+ }
226
+ // Build the psbt
227
+ const psbt = utxolib.bitgo.createPsbtForNetwork({ network: coin.network });
228
+ // xpubs can become handy for many things.
229
+ utxolib.bitgo.addXpubsToPsbt(psbt, walletKeys);
230
+ const txInfo = {};
231
+ const feePerByte = params.feeRate !== undefined ? params.feeRate : await getRecoveryFeePerBytes(coin, { defaultValue: 50 });
232
+ // KRS recovery transactions have a 2nd output to pay the recovery fee, like paygo fees.
233
+ const dimensions = Dimensions.fromPsbt(psbt).plus(isKrsRecovery ? Dimensions.SingleOutput.p2wsh : Dimensions.ZERO);
234
+ const approximateFee = BigInt(dimensions.getVSize() * feePerByte);
235
+ txInfo.inputs =
236
+ responseTxFormat === 'legacy'
237
+ ? unspents.map((u) => ({ ...u, value: Number(u.value), valueString: u.value.toString(), prevTx: undefined }))
238
+ : undefined;
239
+ unspents.forEach((unspent) => {
240
+ utxolib.bitgo.addWalletUnspentToPsbt(psbt, unspent, walletKeys, 'user', 'backup');
241
+ });
242
+ let krsFee = BigInt(0);
243
+ if (isKrsRecovery && params.krsProvider) {
244
+ try {
245
+ krsFee = BigInt(await calculateFeeAmount(coin, { provider: params.krsProvider }));
246
+ }
247
+ catch (err) {
248
+ // Don't let this error block the recovery -
249
+ console.dir(err);
250
+ }
251
+ }
252
+ const recoveryAmount = totalInputAmount - approximateFee - krsFee;
253
+ if (recoveryAmount < BigInt(0)) {
254
+ throw new Error(`this wallet\'s balance is too low to pay the fees specified by the KRS provider.
255
+ Existing balance on wallet: ${totalInputAmount.toString()}. Estimated network fee for the recovery transaction
256
+ : ${approximateFee.toString()}, KRS fee to pay: ${krsFee.toString()}. After deducting fees, your total
257
+ recoverable balance is ${recoveryAmount.toString()}`);
258
+ }
259
+ const recoveryOutputScript = utxolib.address.toOutputScript(params.recoveryDestination, coin.network);
260
+ psbt.addOutput({ script: recoveryOutputScript, value: recoveryAmount });
261
+ if (krsProvider && krsFee > BigInt(0)) {
262
+ if (!krsProvider.feeAddresses) {
263
+ throw new Error(`keyProvider must define feeAddresses`);
264
+ }
265
+ const krsFeeAddress = krsProvider.feeAddresses[coin.getChain()];
266
+ if (!krsFeeAddress) {
267
+ throw new Error('this KRS provider has not configured their fee structure yet - recovery cannot be completed');
268
+ }
269
+ const krsFeeOutputScript = utxolib.address.toOutputScript(krsFeeAddress, coin.network);
270
+ psbt.addOutput({ script: krsFeeOutputScript, value: krsFee });
271
+ }
272
+ if (isUnsignedSweep) {
273
+ // TODO BTC-317 - When ready to PSBTify OVC, send psbt hex and skip unspents in response.
274
+ const txHex = psbt.getUnsignedTx().toBuffer().toString('hex');
275
+ return formatForOfflineVault(coin.getChain(), txInfo, txHex);
276
+ }
277
+ else {
278
+ signAndVerifyPsbt(psbt, walletKeys.user, { isLastSignature: false });
279
+ if (isKrsRecovery) {
280
+ // The KRS provider keyternal solely supports P2SH, P2WSH, and P2SH-P2WSH input script types.
281
+ // It currently uses an outdated BitGoJS SDK, which relies on a legacy transaction builder for cosigning.
282
+ // Unfortunately, upgrading the keyternal code presents challenges,
283
+ // which hinders the integration of the latest BitGoJS SDK with PSBT signing support.
284
+ txInfo.transactionHex =
285
+ params.krsProvider === 'keyternal'
286
+ ? utxolib.bitgo.extractP2msOnlyHalfSignedTx(psbt).toBuffer().toString('hex')
287
+ : psbt.toHex();
288
+ }
289
+ else {
290
+ const tx = signAndVerifyPsbt(psbt, walletKeys.backup, { isLastSignature: true });
291
+ txInfo.transactionHex = tx.toBuffer().toString('hex');
292
+ }
293
+ }
294
+ if (isKrsRecovery) {
295
+ txInfo.coin = coin.getChain();
296
+ txInfo.backupKey = params.backupKey;
297
+ txInfo.recoveryAmount = Number(recoveryAmount);
298
+ txInfo.recoveryAmountString = recoveryAmount.toString();
299
+ }
300
+ return txInfo;
301
+ }
302
+ export async function v1BackupKeyRecovery(coin, bitgo, params) {
303
+ if (_.isUndefined(params.recoveryDestination) ||
304
+ !coin.isValidAddress(params.recoveryDestination, { anyFormat: true })) {
305
+ throw new Error('invalid recoveryDestination');
306
+ }
307
+ const recoveryFeePerByte = await getRecoveryFeePerBytes(coin, { defaultValue: 50 });
308
+ const v1wallet = await bitgo.wallets().get({ id: params.walletId });
309
+ return await v1wallet.recover({
310
+ ...params,
311
+ feeRate: recoveryFeePerByte,
312
+ });
313
+ }
314
+ export async function v1Sweep(coin, bitgo, params) {
315
+ if (_.isUndefined(params.recoveryDestination) ||
316
+ !coin.isValidAddress(params.recoveryDestination, { anyFormat: true })) {
317
+ throw new Error('invalid recoveryDestination');
318
+ }
319
+ let recoveryFeePerByte = 100;
320
+ if (bitgo.env === 'prod') {
321
+ recoveryFeePerByte = await getRecoveryFeePerBytes(coin, { defaultValue: 100 });
322
+ }
323
+ const v1wallet = await bitgo.wallets().get({ id: params.walletId });
324
+ return await v1wallet.sweep({
325
+ ...params,
326
+ feeRate: recoveryFeePerByte,
327
+ });
328
+ }
329
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja3VwS2V5UmVjb3ZlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcmVjb3ZlcnkvYmFja3VwS2V5UmVjb3ZlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUN2QixPQUFPLEtBQUssT0FBTyxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBRUwscUJBQXFCLEVBQ3JCLGNBQWMsRUFDZCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixRQUFRLEVBQ1IsWUFBWSxHQUNiLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd2RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFNUMsT0FBTyxFQUFFLE9BQU8sRUFBb0IsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQVU5QyxNQUFNLEVBQUUsb0JBQW9CLEVBQUUsa0JBQWtCLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztBQWV4Rzs7Ozs7O0dBTUc7QUFDSCxTQUFTLHFCQUFxQixDQUM1QixRQUFnQixFQUNoQixNQUEwQixFQUMxQixLQUFhO0lBRWIsT0FBTztRQUNMLEtBQUs7UUFDTCxNQUFNLEVBQUU7WUFDTixRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDcEMsTUFBTSxDQUFDLEtBQUssQ0FBQyxX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QixDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELElBQUksa0JBQWtCLEdBQUcsR0FBRyxDQUFDO0lBQzdCLElBQUksS0FBSyxDQUFDLEdBQUcsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN6QixrQkFBa0IsR0FBRyxNQUFNLHNCQUFzQixDQUFDLElBQUksRUFBRSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2pGLENBQUM7SUFFRCxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDcEUsT0FBTyxNQUFNLFFBQVEsQ0FBQyxLQUFLLENBQUM7UUFDMUIsR0FBRyxNQUFNO1FBQ1QsT0FBTyxFQUFFLGtCQUFrQjtLQUM1QixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgRGltZW5zaW9ucyB9IGZyb20gJ0BiaXRnby91bnNwZW50cyc7XG5pbXBvcnQge1xuICBCaXRHb0Jhc2UsXG4gIEVycm9yTm9JbnB1dFRvUmVjb3ZlcixcbiAgZ2V0S3JzUHJvdmlkZXIsXG4gIGdldEJpcDMyS2V5cyxcbiAgZ2V0SXNLcnNSZWNvdmVyeSxcbiAgZ2V0SXNVbnNpZ25lZFN3ZWVwLFxuICBpc1RyaXBsZSxcbiAga3JzUHJvdmlkZXJzLFxufSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0IHsgZ2V0TWFpbm5ldCwgbmV0d29ya3MgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luLCBNdWx0aVNpZ0FkZHJlc3MgfSBmcm9tICcuLi9hYnN0cmFjdFV0eG9Db2luJztcbmltcG9ydCB7IHNpZ25BbmRWZXJpZnlQc2J0IH0gZnJvbSAnLi4vc2lnbic7XG5cbmltcG9ydCB7IGZvckNvaW4sIFJlY292ZXJ5UHJvdmlkZXIgfSBmcm9tICcuL1JlY292ZXJ5UHJvdmlkZXInO1xuaW1wb3J0IHsgTWVtcG9vbEFwaSB9IGZyb20gJy4vbWVtcG9vbEFwaSc7XG5pbXBvcnQgeyBDb2luZ2Vja29BcGkgfSBmcm9tICcuL2NvaW5nZWNrb0FwaSc7XG5cbnR5cGUgU2NyaXB0VHlwZTJPZjMgPSB1dHhvbGliLmJpdGdvLm91dHB1dFNjcmlwdHMuU2NyaXB0VHlwZTJPZjM7XG50eXBlIENoYWluQ29kZSA9IHV0eG9saWIuYml0Z28uQ2hhaW5Db2RlO1xudHlwZSBSb290V2FsbGV0S2V5cyA9IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXM7XG50eXBlIFdhbGxldFVuc3BlbnQ8VE51bWJlciBleHRlbmRzIG51bWJlciB8IGJpZ2ludD4gPSB1dHhvbGliLmJpdGdvLldhbGxldFVuc3BlbnQ8VE51bWJlcj47XG50eXBlIFdhbGxldFVuc3BlbnRKU09OID0gdXR4b2xpYi5iaXRnby5XYWxsZXRVbnNwZW50ICYge1xuICB2YWx1ZVN0cmluZzogc3RyaW5nO1xufTtcblxuY29uc3QgeyBnZXRJbnRlcm5hbENoYWluQ29kZSwgc2NyaXB0VHlwZUZvckNoYWluLCBvdXRwdXRTY3JpcHRzLCBnZXRFeHRlcm5hbENoYWluQ29kZSB9ID0gdXR4b2xpYi5iaXRnbztcblxuZXhwb3J0IGludGVyZmFjZSBPZmZsaW5lVmF1bHRUeEluZm8ge1xuICBpbnB1dHM6IFdhbGxldFVuc3BlbnRKU09OW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0dGVkT2ZmbGluZVZhdWx0VHhJbmZvIHtcbiAgdHhJbmZvOiB7XG4gICAgdW5zcGVudHM6IFdhbGxldFVuc3BlbnRKU09OW107XG4gIH07XG4gIHR4SGV4OiBzdHJpbmc7XG4gIGZlZUluZm86IFJlY29yZDxzdHJpbmcsIG5ldmVyPjtcbiAgY29pbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoaXMgdHJhbnNmb3JtcyB0aGUgdHhJbmZvIGZyb20gcmVjb3ZlciBpbnRvIHRoZSBmb3JtYXQgdGhhdCBvZmZsaW5lLXNpZ25pbmctdG9vbCBleHBlY3RzXG4gKiBAcGFyYW0gY29pbk5hbWVcbiAqIEBwYXJhbSB0eEluZm9cbiAqIEBwYXJhbSB0eEhleFxuICogQHJldHVybnMge3t0eEhleDogKiwgdHhJbmZvOiB7dW5zcGVudHM6ICp9LCBmZWVJbmZvOiB7fSwgY29pbjogdm9pZH19XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdEZvck9mZmxpbmVWYXVsdChcbiAgY29pbk5hbWU6IHN0cmluZyxcbiAgdHhJbmZvOiBPZmZsaW5lVmF1bHRUeEluZm8sXG4gIHR4SGV4OiBzdHJpbmdcbik6IEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbyB7XG4gIHJldHVybiB7XG4gICAgdHhIZXgsXG4gICAgdHhJbmZvOiB7XG4gICAgICB1bnNwZW50czogdHhJbmZvLmlucHV0cy5tYXAoKGlucHV0KSA9PiB7XG4gICAgICAgIGFzc2VydChpbnB1dC52YWx1ZVN0cmluZyk7XG4gICAgICAgIHJldHVybiB7IC4uLmlucHV0LCB2YWx1ZVN0cmluZzogaW5wdXQudmFsdWVTdHJpbmcgfTtcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgZmVlSW5mbzoge30sXG4gICAgY29pbjogY29pbk5hbWUsXG4gIH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IG1hcmtldCBwcmljZSBmcm9tIGEgdGhpcmQgcGFydHkgdG8gYmUgdXNlZCBmb3IgcmVjb3ZlcnlcbiAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBpbnRlbmRlZCBmb3Igbm9uLWJpdGdvIHJlY292ZXJ5IHRyYW5zYWN0aW9ucywgd2hlbiBpdCBpcyBuZWNlc3NhcnlcbiAqIHRvIGNhbGN1bGF0ZSB0aGUgcm91Z2ggZmVlIG5lZWRlZCB0byBwYXkgdG8gS2V5dGVybmFsLiBXZSBhcmUgb2theSB3aXRoIGFwcHJveGltYXRpbmcsXG4gKiBiZWNhdXNlIHRoZSByZXN1bHRpbmcgcHJpY2Ugb2YgdGhpcyBmdW5jdGlvbiBvbmx5IGhhcyBsZXNzIHRoYW4gMSBkb2xsYXIgaW5mbHVlbmNlIG9uIHRoZVxuICogZmVlIHRoYXQgbmVlZHMgdG8gYmUgcGFpZCB0byBLZXl0ZXJuYWwuXG4gKlxuICogU2VlIGNhbGN1bGF0ZUZlZUFtb3VudCBmdW5jdGlvbjogIHJldHVybiBNYXRoLnJvdW5kKGZlZUFtb3VudFVzZCAvIGN1cnJlbnRQcmljZSAqIHNlbGYuZ2V0QmFzZUZhY3RvcigpKTtcbiAqXG4gKiBUaGlzIGVuZCBmdW5jdGlvbiBzaG91bGQgbm90IGJlIHVzZWQgYXMgYW4gYWNjdXJhdGUgZW5kcG9pbnQsIHNpbmNlIHNvbWUgY29pbnMnIHByaWNlcyBhcmUgbWlzc2luZyBmcm9tIHRoZSBwcm92aWRlclxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRSZWNvdmVyeU1hcmtldFByaWNlKGNvaW46IEFic3RyYWN0VXR4b0NvaW4pOiBQcm9taXNlPG51bWJlcj4ge1xuICByZXR1cm4gYXdhaXQgbmV3IENvaW5nZWNrb0FwaSgpLmdldFVTRFByaWNlKGNvaW4uZ2V0RmFtaWx5KCkpO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIGFtb3VudCAoaW4gYmFzZSB1bml0cykgdG8gcGF5IGEgS1JTIHByb3ZpZGVyIHdoZW4gYnVpbGRpbmcgYSByZWNvdmVyeSB0cmFuc2FjdGlvblxuICogQHBhcmFtIGNvaW5cbiAqIEBwYXJhbSBwYXJhbXNcbiAqIEBwYXJhbSBwYXJhbXMucHJvdmlkZXIge1N0cmluZ30gdGhlIEtSUyBwcm92aWRlciB0aGF0IGhvbGRzIHRoZSBiYWNrdXAga2V5XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY2FsY3VsYXRlRmVlQW1vdW50KGNvaW46IEFic3RyYWN0VXR4b0NvaW4sIHBhcmFtczogeyBwcm92aWRlcjogc3RyaW5nIH0pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBrcnNQcm92aWRlciA9IGtyc1Byb3ZpZGVyc1twYXJhbXMucHJvdmlkZXJdO1xuXG4gIGlmIChrcnNQcm92aWRlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBmZWUgc3RydWN0dXJlIHNwZWNpZmllZCBmb3IgcHJvdmlkZXIgJHtwYXJhbXMucHJvdmlkZXJ9YCk7XG4gIH1cblxuICBpZiAoa3JzUHJvdmlkZXIuZmVlVHlwZSA9PT0gJ2ZsYXRVc2QnKSB7XG4gICAgY29uc3QgZmVlQW1vdW50VXNkID0ga3JzUHJvdmlkZXIuZmVlQW1vdW50O1xuICAgIGNvbnN0IGN1cnJlbnRQcmljZTogbnVtYmVyID0gYXdhaXQgZ2V0UmVjb3ZlcnlNYXJrZXRQcmljZShjb2luKTtcblxuICAgIHJldHVybiBNYXRoLnJvdW5kKChmZWVBbW91bnRVc2QgLyBjdXJyZW50UHJpY2UpICogY29pbi5nZXRCYXNlRmFjdG9yKCkpO1xuICB9IGVsc2Uge1xuICAgIC8vIHdlIGNhbiBhZGQgbW9yZSBmZWUgc3RydWN0dXJlcyBoZXJlIGFzIG5lZWRlZCBmb3IgZGlmZmVyZW50IHByb3ZpZGVycywgc3VjaCBhcyBwZXJjZW50YWdlIG9mIHJlY292ZXJ5IGFtb3VudFxuICAgIHRocm93IG5ldyBFcnJvcignRmVlIHN0cnVjdHVyZSBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlY292ZXJQYXJhbXMge1xuICBzY2FuPzogbnVtYmVyO1xuICB1c2VyS2V5OiBzdHJpbmc7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xuICBiaXRnb0tleTogc3RyaW5nO1xuICByZWNvdmVyeURlc3RpbmF0aW9uOiBzdHJpbmc7XG4gIGtyc1Byb3ZpZGVyPzogc3RyaW5nO1xuICBpZ25vcmVBZGRyZXNzVHlwZXM6IFNjcmlwdFR5cGUyT2YzW107XG4gIHdhbGxldFBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIGFwaUtleT86IHN0cmluZztcbiAgdXNlcktleVBhdGg/OiBzdHJpbmc7XG4gIHJlY292ZXJ5UHJvdmlkZXI/OiBSZWNvdmVyeVByb3ZpZGVyO1xuICBmZWVSYXRlPzogbnVtYmVyO1xufVxuXG5mdW5jdGlvbiBnZXRGb3JtYXR0ZWRBZGRyZXNzKGNvaW46IEFic3RyYWN0VXR4b0NvaW4sIGFkZHJlc3M6IE11bHRpU2lnQWRkcmVzcykge1xuICAvLyBCbG9ja2NoYWlyIHVzZXMgY2FzaGFkZHIgZm9ybWF0IHdoZW4gcXVlcnlpbmcgdGhlIEFQSSBmb3IgYWRkcmVzcyBpbmZvcm1hdGlvbi4gQ29udmVydCBsZWdhY3kgYWRkcmVzc2VzIHRvIGNhc2hhZGRyXG4gIC8vIGJlZm9yZSBxdWVyeWluZyB0aGUgQVBJLlxuICByZXR1cm4gY29pbi5nZXRDaGFpbigpID09PSAnYmNoJyB8fCBjb2luLmdldENoYWluKCkgPT09ICdiY2hhJ1xuICAgID8gY29pbi5jYW5vbmljYWxBZGRyZXNzKGFkZHJlc3MuYWRkcmVzcywgJ2Nhc2hhZGRyJykuc3BsaXQoJzonKVsxXVxuICAgIDogYWRkcmVzcy5hZGRyZXNzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBxdWVyeUJsb2NrY2hhaW5VbnNwZW50c1BhdGgoXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIHBhcmFtczogUmVjb3ZlclBhcmFtcyxcbiAgd2FsbGV0S2V5czogUm9vdFdhbGxldEtleXMsXG4gIGNoYWluOiBDaGFpbkNvZGVcbik6IFByb21pc2U8V2FsbGV0VW5zcGVudDxiaWdpbnQ+W10+IHtcbiAgY29uc3Qgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGVGb3JDaGFpbihjaGFpbik7XG4gIGNvbnN0IGZldGNoUHJldlR4ID1cbiAgICAhdXR4b2xpYi5iaXRnby5vdXRwdXRTY3JpcHRzLmhhc1dpdG5lc3NEYXRhKHNjcmlwdFR5cGUpICYmIGdldE1haW5uZXQoY29pbi5uZXR3b3JrKSAhPT0gbmV0d29ya3MuemNhc2g7XG4gIGNvbnN0IHJlY292ZXJ5UHJvdmlkZXIgPSBwYXJhbXMucmVjb3ZlcnlQcm92aWRlciA/PyBmb3JDb2luKGNvaW4uZ2V0Q2hhaW4oKSwgcGFyYW1zLmFwaUtleSk7XG4gIGNvbnN0IE1BWF9TRVFVRU5USUFMX0FERFJFU1NFU19XSVRIT1VUX1RYUyA9IHBhcmFtcy5zY2FuIHx8IDIwO1xuICBsZXQgbnVtU2VxdWVudGlhbEFkZHJlc3Nlc1dpdGhvdXRUeHMgPSAwO1xuICBjb25zdCBwcmV2VHhDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0UHJldlR4KHR4aWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IHByZXZUeEhleCA9IHByZXZUeENhY2hlLmdldCh0eGlkKTtcbiAgICBpZiAoIXByZXZUeEhleCkge1xuICAgICAgcHJldlR4SGV4ID0gYXdhaXQgcmVjb3ZlcnlQcm92aWRlci5nZXRUcmFuc2FjdGlvbkhleCh0eGlkKTtcbiAgICAgIHByZXZUeENhY2hlLnNldCh0eGlkLCBwcmV2VHhIZXgpO1xuICAgIH1cbiAgICByZXR1cm4gcHJldlR4SGV4O1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2F0aGVyVW5zcGVudHMoYWRkckluZGV4OiBudW1iZXIpIHtcbiAgICBjb25zdCB3YWxsZXRLZXlzRm9yVW5zcGVudCA9IHdhbGxldEtleXMuZGVyaXZlRm9yQ2hhaW5BbmRJbmRleChjaGFpbiwgYWRkckluZGV4KTtcbiAgICBjb25zdCBhZGRyZXNzID0gY29pbi5jcmVhdGVNdWx0aVNpZ0FkZHJlc3Moc2NyaXB0VHlwZSwgMiwgd2FsbGV0S2V5c0ZvclVuc3BlbnQucHVibGljS2V5cyk7XG5cbiAgICBjb25zdCBmb3JtYXR0ZWRBZGRyZXNzID0gZ2V0Rm9ybWF0dGVkQWRkcmVzcyhjb2luLCBhZGRyZXNzKTtcbiAgICBjb25zdCBhZGRySW5mbyA9IGF3YWl0IHJlY292ZXJ5UHJvdmlkZXIuZ2V0QWRkcmVzc0luZm8oZm9ybWF0dGVkQWRkcmVzcyk7XG4gICAgLy8gd2UgdXNlIHR4Q291bnQgaGVyZSBiZWNhdXNlIGl0IGltcGxpZXMgdXNhZ2UgLSBoYXZpbmcgdHgnZXMgbWVhbnMgdGhlIGFkZHIgd2FzIGdlbmVyYXRlZCBhbmQgdXNlZFxuICAgIGlmIChhZGRySW5mby50eENvdW50ID09PSAwKSB7XG4gICAgICBudW1TZXF1ZW50aWFsQWRkcmVzc2VzV2l0aG91dFR4cysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBudW1TZXF1ZW50aWFsQWRkcmVzc2VzV2l0aG91dFR4cyA9IDA7XG5cbiAgICAgIGlmIChhZGRySW5mby5iYWxhbmNlID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgRm91bmQgYW4gYWRkcmVzcyB3aXRoIGJhbGFuY2U6ICR7YWRkcmVzcy5hZGRyZXNzfSB3aXRoIGJhbGFuY2UgJHthZGRySW5mby5iYWxhbmNlfWApO1xuICAgICAgICBjb25zdCBhZGRyZXNzVW5zcGVudHMgPSBhd2FpdCByZWNvdmVyeVByb3ZpZGVyLmdldFVuc3BlbnRzRm9yQWRkcmVzc2VzKFtmb3JtYXR0ZWRBZGRyZXNzXSk7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NlZFVuc3BlbnRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgYWRkcmVzc1Vuc3BlbnRzLm1hcChhc3luYyAodSk6IFByb21pc2U8V2FsbGV0VW5zcGVudDxiaWdpbnQ+PiA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IHR4aWQsIHZvdXQgfSA9IHV0eG9saWIuYml0Z28ucGFyc2VPdXRwdXRJZCh1LmlkKTtcbiAgICAgICAgICAgIGxldCB2YWwgPSBCaWdJbnQodS52YWx1ZSk7XG4gICAgICAgICAgICBpZiAoY29pbi5hbW91bnRUeXBlID09PSAnYmlnaW50Jykge1xuICAgICAgICAgICAgICAvLyBibG9ja2NoYWlyIHJldHVybnMgdGhlIG51bWJlciB3aXRoIHRoZSBjb3JyZWN0IHByZWNpc2lvbiwgYnV0IGluIG51bWJlciBmb3JtYXRcbiAgICAgICAgICAgICAgLy8ganNvbiBwYXJzZSB3b24ndCBwYXJzZSBpdCBjb3JyZWN0bHksIHNvIHdlIHJlcXVlcnkgdGhlIHR4aWQgZm9yIHRoZSB0eCBoZXggdG8gZGVjb2RlIGhlcmVcbiAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcih1LnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHR4SGV4ID0gYXdhaXQgZ2V0UHJldlR4KHR4aWQpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR4ID0gY29pbi5jcmVhdGVUcmFuc2FjdGlvbkZyb21IZXg8YmlnaW50Pih0eEhleCk7XG4gICAgICAgICAgICAgICAgdmFsID0gdHgub3V0c1t2b3V0XS52YWx1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhlIGFwaSBtYXkgcmV0dXJuIGNhc2hhZGRyJ3MgaW5zdGVhZCBvZiBsZWdhY3kgZm9yIEJDSCBhbmQgQkNIQVxuICAgICAgICAgICAgLy8gZG93bnN0cmVhbSBwcm9jZXNzZXMncyBvbmx5IGV4cGVjdCBsZWdhY3kgYWRkcmVzc2VzXG4gICAgICAgICAgICB1ID0geyAuLi51LCBhZGRyZXNzOiBjb2luLmNhbm9uaWNhbEFkZHJlc3ModS5hZGRyZXNzKSB9O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4udSxcbiAgICAgICAgICAgICAgdmFsdWU6IHZhbCxcbiAgICAgICAgICAgICAgY2hhaW46IGNoYWluLFxuICAgICAgICAgICAgICBpbmRleDogYWRkckluZGV4LFxuICAgICAgICAgICAgICBwcmV2VHg6IGZldGNoUHJldlR4ID8gQnVmZmVyLmZyb20oYXdhaXQgZ2V0UHJldlR4KHR4aWQpLCAnaGV4JykgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9IGFzIFdhbGxldFVuc3BlbnQ8YmlnaW50PjtcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHdhbGxldFVuc3BlbnRzLnB1c2goLi4ucHJvY2Vzc2VkVW5zcGVudHMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChudW1TZXF1ZW50aWFsQWRkcmVzc2VzV2l0aG91dFR4cyA+PSBNQVhfU0VRVUVOVElBTF9BRERSRVNTRVNfV0lUSE9VVF9UWFMpIHtcbiAgICAgIC8vIHN0b3Agc2VhcmNoaW5nIGZvciBhZGRyZXNzZXMgd2l0aCB1bnNwZW50cyBpbiB0aGVtLCB3ZSd2ZSBmb3VuZCAke01BWF9TRVFVRU5USUFMX0FERFJFU1NFU19XSVRIT1VUX1RYU30gaW4gYSByb3cgd2l0aCBub25lXG4gICAgICAvLyB3ZSBhcmUgZG9uZVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiBnYXRoZXJVbnNwZW50cyhhZGRySW5kZXggKyAxKTtcbiAgfVxuXG4gIC8vIGdldCB1bnNwZW50cyBmb3IgdGhlc2UgYWRkcmVzc2VzXG5cbiAgY29uc3Qgd2FsbGV0VW5zcGVudHM6IFdhbGxldFVuc3BlbnQ8YmlnaW50PltdID0gW107XG4gIC8vIFRoaXMgd2lsbCBwb3B1bGF0ZSB3YWxsZXRBZGRyZXNzZXNcbiAgYXdhaXQgZ2F0aGVyVW5zcGVudHMoMCk7XG5cbiAgaWYgKHdhbGxldFVuc3BlbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8vIENvdWxkbid0IGZpbmQgYW55IGFkZHJlc3NlcyB3aXRoIGZ1bmRzXG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmV0dXJuIHdhbGxldFVuc3BlbnRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRSZWNvdmVyeUZlZVBlckJ5dGVzKFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICB7IGRlZmF1bHRWYWx1ZSB9OiB7IGRlZmF1bHRWYWx1ZTogbnVtYmVyIH1cbik6IFByb21pc2U8bnVtYmVyPiB7XG4gIGlmIChjb2luLmdldEZhbWlseSgpID09PSAnZG9nZScpIHtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZG9nZWNvaW4vZG9nZWNvaW4vYmxvYi9tYXN0ZXIvZG9jL2ZlZS1yZWNvbW1lbmRhdGlvbi5tZFxuICAgIC8vIDAuMDEgRE9HRSBwZXIgS0JcbiAgICByZXR1cm4gMTAwMDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IE1lbXBvb2xBcGkuZm9yQ29pbihjb2luLmdldENoYWluKCkpLmdldFJlY292ZXJ5RmVlUGVyQnl0ZXMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGNvbnNvbGUuZGlyKGUpO1xuICAgIHJldHVybiBkZWZhdWx0VmFsdWU7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgQmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbiA9IHtcbiAgaW5wdXRzPzogV2FsbGV0VW5zcGVudEpTT05bXTtcbiAgdHJhbnNhY3Rpb25IZXg6IHN0cmluZztcbiAgY29pbjogc3RyaW5nO1xuICBiYWNrdXBLZXk6IHN0cmluZztcbiAgcmVjb3ZlcnlBbW91bnQ6IG51bWJlcjtcbiAgcmVjb3ZlcnlBbW91bnRTdHJpbmc6IHN0cmluZztcbn07XG5cbi8qKlxuICogQnVpbGRzIGEgZnVuZHMgcmVjb3ZlcnkgdHJhbnNhY3Rpb24gd2l0aG91dCBCaXRHby5cbiAqXG4gKiBSZXR1cm5zIHRyYW5zYWN0aW9uIGhleCBpbiBsZWdhY3kgZm9ybWF0IGZvciB1bnNpZ25lZCBzd2VlcCB0cmFuc2FjdGlvbiwgaGFsZiBzaWduZWQgYmFja3VwIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGggS1JTIHByb3ZpZGVyIChvbmx5IGtleXRlcm5hbCksXG4gKiBmdWxseSBzaWduZWQgYmFja3VwIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGhvdXQgYSBLUlMgcHJvdmlkZXIuXG4gKlxuICogUmV0dXJucyBQU0JUIGhleCBmb3IgaGFsZiBzaWduZWQgYmFja3VwIHJlY292ZXJ5IHRyYW5zYWN0aW9uIHdpdGggS1JTIHByb3ZpZGVyIChleGNsdWRpbmcga2V5dGVybmFsKVxuICogRm9yIFBTQlQgaGV4IGNhc2VzLCBVbnNwZW50cyBhcmUgbm90IHJlcXVpcmVkIGluIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSBjb2luXG4gKiBAcGFyYW0gYml0Z29cbiAqIEBwYXJhbSBwYXJhbXNcbiAqIC0gdXNlcktleTogW2VuY3J5cHRlZF0geHBydiwgb3IgeHB1YlxuICogLSBiYWNrdXBLZXk6IFtlbmNyeXB0ZWRdIHhwcnYsIG9yIHhwdWIgaWYgdGhlIHhwcnYgaXMgaGVsZCBieSBhIEtSUyBwcm92aWRlclxuICogLSB3YWxsZXRQYXNzcGhyYXNlOiBuZWNlc3NhcnkgaWYgb25lIG9mIHRoZSB4cHJ2cyBpcyBlbmNyeXB0ZWRcbiAqIC0gYml0Z29LZXk6IHhwdWJcbiAqIC0ga3JzUHJvdmlkZXI6IG5lY2Vzc2FyeSBpZiBiYWNrdXAga2V5IGlzIGhlbGQgYnkgS1JTXG4gKiAtIHJlY292ZXJ5RGVzdGluYXRpb246IHRhcmdldCBhZGRyZXNzIHRvIHNlbmQgcmVjb3ZlcmVkIGZ1bmRzIHRvXG4gKiAtIHNjYW46IHRoZSBhbW91bnQgb2YgY29uc2VjdXRpdmUgYWRkcmVzc2VzIHdpdGhvdXQgdW5zcGVudHMgdG8gc2NhbiB0aHJvdWdoIGJlZm9yZSBzdG9wcGluZ1xuICogLSBpZ25vcmVBZGRyZXNzVHlwZXM6IChvcHRpb25hbCkgc2NyaXB0cyB0byBpZ25vcmVcbiAqICAgICAgICBmb3IgZXhhbXBsZTogWydwMnNoUDJ3c2gnLCAncDJ3c2gnXSB3aWxsIHByZXZlbnQgY29kZSBmcm9tIGNoZWNraW5nIGZvciB3cmFwcGVkLXNlZ3dpdCBhbmQgbmF0aXZlLXNlZ3dpdCBjaGFpbnMgb24gdGhlIHB1YmxpYyBibG9jayBleHBsb3JlcnNcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGJhY2t1cEtleVJlY292ZXJ5KFxuICBjb2luOiBBYnN0cmFjdFV0eG9Db2luLFxuICBiaXRnbzogQml0R29CYXNlLFxuICBwYXJhbXM6IFJlY292ZXJQYXJhbXNcbik6IFByb21pc2U8QmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbiB8IEZvcm1hdHRlZE9mZmxpbmVWYXVsdFR4SW5mbz4ge1xuICBpZiAoXy5pc1VuZGVmaW5lZChwYXJhbXMudXNlcktleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgdXNlcktleScpO1xuICB9XG5cbiAgaWYgKF8uaXNVbmRlZmluZWQocGFyYW1zLmJhY2t1cEtleSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ21pc3NpbmcgYmFja3VwS2V5Jyk7XG4gIH1cblxuICBpZiAoXG4gICAgXy5pc1VuZGVmaW5lZChwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbikgfHxcbiAgICAhY29pbi5pc1ZhbGlkQWRkcmVzcyhwYXJhbXMucmVjb3ZlcnlEZXN0aW5hdGlvbiwgeyBhbnlGb3JtYXQ6IHRydWUgfSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIHJlY292ZXJ5RGVzdGluYXRpb24nKTtcbiAgfVxuXG4gIGlmICghXy5pc1VuZGVmaW5lZChwYXJhbXMuc2NhbikgJiYgKCFfLmlzSW50ZWdlcihwYXJhbXMuc2NhbikgfHwgcGFyYW1zLnNjYW4gPCAwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignc2NhbiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlcicpO1xuICB9XG5cbiAgaWYgKHBhcmFtcy5mZWVSYXRlICE9PSB1bmRlZmluZWQgJiYgKCFOdW1iZXIuaXNGaW5pdGUocGFyYW1zLmZlZVJhdGUpIHx8IHBhcmFtcy5mZWVSYXRlIDw9IDApKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdmZWVSYXRlIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgfVxuXG4gIGNvbnN0IGlzS3JzUmVjb3ZlcnkgPSBnZXRJc0tyc1JlY292ZXJ5KHBhcmFtcyk7XG4gIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9IGdldElzVW5zaWduZWRTd2VlcChwYXJhbXMpO1xuICBjb25zdCByZXNwb25zZVR4Rm9ybWF0ID0gaXNVbnNpZ25lZFN3ZWVwIHx8ICFpc0tyc1JlY292ZXJ5IHx8IHBhcmFtcy5rcnNQcm92aWRlciA9PT0gJ2tleXRlcm5hbCcgPyAnbGVnYWN5JyA6ICdwc2J0JztcblxuICBjb25zdCBrcnNQcm92aWRlciA9IGlzS3JzUmVjb3ZlcnkgPyBnZXRLcnNQcm92aWRlcihjb2luLCBwYXJhbXMua3JzUHJvdmlkZXIpIDogdW5kZWZpbmVkO1xuXG4gIC8vIGNoZWNrIHdoZXRoZXIga2V5IG1hdGVyaWFsIGFuZCBwYXNzd29yZCBhdXRoZW50aWNhdGUgdGhlIHVzZXJzIGFuZCByZXR1cm4gcGFyZW50IGtleXMgb2YgYWxsIHRocmVlIGtleXMgb2YgdGhlIHdhbGxldFxuICBjb25zdCBrZXlzID0gZ2V0QmlwMzJLZXlzKGJpdGdvLCBwYXJhbXMsIHsgcmVxdWlyZUJpdEdvWHB1YjogdHJ1ZSB9KTtcbiAgaWYgKCFpc1RyaXBsZShrZXlzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgZXhwZWN0ZWQga2V5IHRyaXBsZWApO1xuICB9XG4gIGNvbnN0IHdhbGxldEtleXMgPSBuZXcgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cyhrZXlzLCBbXG4gICAgcGFyYW1zLnVzZXJLZXlQYXRoIHx8IHV0eG9saWIuYml0Z28uUm9vdFdhbGxldEtleXMuZGVmYXVsdFByZWZpeCxcbiAgICB1dHhvbGliLmJpdGdvLlJvb3RXYWxsZXRLZXlzLmRlZmF1bHRQcmVmaXgsXG4gICAgdXR4b2xpYi5iaXRnby5Sb290V2FsbGV0S2V5cy5kZWZhdWx0UHJlZml4LFxuICBdKTtcblxuICBjb25zdCB1bnNwZW50czogV2FsbGV0VW5zcGVudDxiaWdpbnQ+W10gPSAoXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICBvdXRwdXRTY3JpcHRzLnNjcmlwdFR5cGVzMk9mM1xuICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgIChhZGRyZXNzVHlwZSkgPT4gY29pbi5zdXBwb3J0c0FkZHJlc3NUeXBlKGFkZHJlc3NUeXBlKSAmJiAhcGFyYW1zLmlnbm9yZUFkZHJlc3NUeXBlcz8uaW5jbHVkZXMoYWRkcmVzc1R5cGUpXG4gICAgICAgIClcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAocXVlcmllcywgYWRkcmVzc1R5cGUpID0+IFtcbiAgICAgICAgICAgIC4uLnF1ZXJpZXMsXG4gICAgICAgICAgICBxdWVyeUJsb2NrY2hhaW5VbnNwZW50c1BhdGgoY29pbiwgcGFyYW1zLCB3YWxsZXRLZXlzLCBnZXRFeHRlcm5hbENoYWluQ29kZShhZGRyZXNzVHlwZSkpLFxuICAgICAgICAgICAgcXVlcnlCbG9ja2NoYWluVW5zcGVudHNQYXRoKGNvaW4sIHBhcmFtcywgd2FsbGV0S2V5cywgZ2V0SW50ZXJuYWxDaGFpbkNvZGUoYWRkcmVzc1R5cGUpKSxcbiAgICAgICAgICBdLFxuICAgICAgICAgIFtdIGFzIFByb21pc2U8V2FsbGV0VW5zcGVudDxiaWdpbnQ+W10+W11cbiAgICAgICAgKVxuICAgIClcbiAgKS5mbGF0KCk7XG5cbiAgLy8gRXhlY3V0ZSB0aGUgcXVlcmllcyBhbmQgZ2F0aGVyIHRoZSB1bnNwZW50c1xuICBjb25zdCB0b3RhbElucHV0QW1vdW50ID0gdXR4b2xpYi5iaXRnby51bnNwZW50U3VtKHVuc3BlbnRzLCAnYmlnaW50Jyk7XG4gIGlmICh0b3RhbElucHV0QW1vdW50IDw9IEJpZ0ludCgwKSkge1xuICAgIHRocm93IG5ldyBFcnJvck5vSW5wdXRUb1JlY292ZXIoKTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSBwc2J0XG4gIGNvbnN0IHBzYnQgPSB1dHhvbGliLmJpdGdvLmNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yazogY29pbi5uZXR3b3JrIH0pO1xuICAvLyB4cHVicyBjYW4gYmVjb21lIGhhbmR5IGZvciBtYW55IHRoaW5ncy5cbiAgdXR4b2xpYi5iaXRnby5hZGRYcHVic1RvUHNidChwc2J0LCB3YWxsZXRLZXlzKTtcbiAgY29uc3QgdHhJbmZvID0ge30gYXMgQmFja3VwS2V5UmVjb3ZlcnlUcmFuc2Fuc2FjdGlvbjtcbiAgY29uc3QgZmVlUGVyQnl0ZTogbnVtYmVyID1cbiAgICBwYXJhbXMuZmVlUmF0ZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1zLmZlZVJhdGUgOiBhd2FpdCBnZXRSZWNvdmVyeUZlZVBlckJ5dGVzKGNvaW4sIHsgZGVmYXVsdFZhbHVlOiA1MCB9KTtcblxuICAvLyBLUlMgcmVjb3ZlcnkgdHJhbnNhY3Rpb25zIGhhdmUgYSAybmQgb3V0cHV0IHRvIHBheSB0aGUgcmVjb3ZlcnkgZmVlLCBsaWtlIHBheWdvIGZlZXMuXG4gIGNvbnN0IGRpbWVuc2lvbnMgPSBEaW1lbnNpb25zLmZyb21Qc2J0KHBzYnQpLnBsdXMoaXNLcnNSZWNvdmVyeSA/IERpbWVuc2lvbnMuU2luZ2xlT3V0cHV0LnAyd3NoIDogRGltZW5zaW9ucy5aRVJPKTtcbiAgY29uc3QgYXBwcm94aW1hdGVGZWUgPSBCaWdJbnQoZGltZW5zaW9ucy5nZXRWU2l6ZSgpICogZmVlUGVyQnl0ZSk7XG5cbiAgdHhJbmZvLmlucHV0cyA9XG4gICAgcmVzcG9uc2VUeEZvcm1hdCA9PT0gJ2xlZ2FjeSdcbiAgICAgID8gdW5zcGVudHMubWFwKCh1KSA9PiAoeyAuLi51LCB2YWx1ZTogTnVtYmVyKHUudmFsdWUpLCB2YWx1ZVN0cmluZzogdS52YWx1ZS50b1N0cmluZygpLCBwcmV2VHg6IHVuZGVmaW5lZCB9KSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gIHVuc3BlbnRzLmZvckVhY2goKHVuc3BlbnQpID0+IHtcbiAgICB1dHhvbGliLmJpdGdvLmFkZFdhbGxldFVuc3BlbnRUb1BzYnQocHNidCwgdW5zcGVudCwgd2FsbGV0S2V5cywgJ3VzZXInLCAnYmFja3VwJyk7XG4gIH0pO1xuXG4gIGxldCBrcnNGZWUgPSBCaWdJbnQoMCk7XG4gIGlmIChpc0tyc1JlY292ZXJ5ICYmIHBhcmFtcy5rcnNQcm92aWRlcikge1xuICAgIHRyeSB7XG4gICAgICBrcnNGZWUgPSBCaWdJbnQoYXdhaXQgY2FsY3VsYXRlRmVlQW1vdW50KGNvaW4sIHsgcHJvdmlkZXI6IHBhcmFtcy5rcnNQcm92aWRlciB9KSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBEb24ndCBsZXQgdGhpcyBlcnJvciBibG9jayB0aGUgcmVjb3ZlcnkgLVxuICAgICAgY29uc29sZS5kaXIoZXJyKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZWNvdmVyeUFtb3VudCA9IHRvdGFsSW5wdXRBbW91bnQgLSBhcHByb3hpbWF0ZUZlZSAtIGtyc0ZlZTtcblxuICBpZiAocmVjb3ZlcnlBbW91bnQgPCBCaWdJbnQoMCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHRoaXMgd2FsbGV0XFwncyBiYWxhbmNlIGlzIHRvbyBsb3cgdG8gcGF5IHRoZSBmZWVzIHNwZWNpZmllZCBieSB0aGUgS1JTIHByb3ZpZGVyLiBcbiAgICAgICAgICBFeGlzdGluZyBiYWxhbmNlIG9uIHdhbGxldDogJHt0b3RhbElucHV0QW1vdW50LnRvU3RyaW5nKCl9LiBFc3RpbWF0ZWQgbmV0d29yayBmZWUgZm9yIHRoZSByZWNvdmVyeSB0cmFuc2FjdGlvblxuICAgICAgICAgIDogJHthcHByb3hpbWF0ZUZlZS50b1N0cmluZygpfSwgS1JTIGZlZSB0byBwYXk6ICR7a3JzRmVlLnRvU3RyaW5nKCl9LiBBZnRlciBkZWR1Y3RpbmcgZmVlcywgeW91ciB0b3RhbCBcbiAgICAgICAgICByZWNvdmVyYWJsZSBiYWxhbmNlIGlzICR7cmVjb3ZlcnlBbW91bnQudG9TdHJpbmcoKX1gKTtcbiAgfVxuXG4gIGNvbnN0IHJlY292ZXJ5T3V0cHV0U2NyaXB0ID0gdXR4b2xpYi5hZGRyZXNzLnRvT3V0cHV0U2NyaXB0KHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCBjb2luLm5ldHdvcmspO1xuICBwc2J0LmFkZE91dHB1dCh7IHNjcmlwdDogcmVjb3ZlcnlPdXRwdXRTY3JpcHQsIHZhbHVlOiByZWNvdmVyeUFtb3VudCB9KTtcblxuICBpZiAoa3JzUHJvdmlkZXIgJiYga3JzRmVlID4gQmlnSW50KDApKSB7XG4gICAgaWYgKCFrcnNQcm92aWRlci5mZWVBZGRyZXNzZXMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihga2V5UHJvdmlkZXIgbXVzdCBkZWZpbmUgZmVlQWRkcmVzc2VzYCk7XG4gICAgfVxuXG4gICAgY29uc3Qga3JzRmVlQWRkcmVzcyA9IGtyc1Byb3ZpZGVyLmZlZUFkZHJlc3Nlc1tjb2luLmdldENoYWluKCldO1xuXG4gICAgaWYgKCFrcnNGZWVBZGRyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RoaXMgS1JTIHByb3ZpZGVyIGhhcyBub3QgY29uZmlndXJlZCB0aGVpciBmZWUgc3RydWN0dXJlIHlldCAtIHJlY292ZXJ5IGNhbm5vdCBiZSBjb21wbGV0ZWQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBrcnNGZWVPdXRwdXRTY3JpcHQgPSB1dHhvbGliLmFkZHJlc3MudG9PdXRwdXRTY3JpcHQoa3JzRmVlQWRkcmVzcywgY29pbi5uZXR3b3JrKTtcbiAgICBwc2J0LmFkZE91dHB1dCh7IHNjcmlwdDoga3JzRmVlT3V0cHV0U2NyaXB0LCB2YWx1ZToga3JzRmVlIH0pO1xuICB9XG5cbiAgaWYgKGlzVW5zaWduZWRTd2VlcCkge1xuICAgIC8vIFRPRE8gQlRDLTMxNyAtIFdoZW4gcmVhZHkgdG8gUFNCVGlmeSBPVkMsIHNlbmQgcHNidCBoZXggYW5kIHNraXAgdW5zcGVudHMgaW4gcmVzcG9uc2UuXG4gICAgY29uc3QgdHhIZXggPSBwc2J0LmdldFVuc2lnbmVkVHgoKS50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICByZXR1cm4gZm9ybWF0Rm9yT2ZmbGluZVZhdWx0KGNvaW4uZ2V0Q2hhaW4oKSwgdHhJbmZvIGFzIE9mZmxpbmVWYXVsdFR4SW5mbywgdHhIZXgpO1xuICB9IGVsc2Uge1xuICAgIHNpZ25BbmRWZXJpZnlQc2J0KHBzYnQsIHdhbGxldEtleXMudXNlciwgeyBpc0xhc3RTaWduYXR1cmU6IGZhbHNlIH0pO1xuICAgIGlmIChpc0tyc1JlY292ZXJ5KSB7XG4gICAgICAvLyBUaGUgS1JTIHByb3ZpZGVyIGtleXRlcm5hbCBzb2xlbHkgc3VwcG9ydHMgUDJTSCwgUDJXU0gsIGFuZCBQMlNILVAyV1NIIGlucHV0IHNjcmlwdCB0eXBlcy5cbiAgICAgIC8vIEl0IGN1cnJlbnRseSB1c2VzIGFuIG91dGRhdGVkIEJpdEdvSlMgU0RLLCB3aGljaCByZWxpZXMgb24gYSBsZWdhY3kgdHJhbnNhY3Rpb24gYnVpbGRlciBmb3IgY29zaWduaW5nLlxuICAgICAgLy8gVW5mb3J0dW5hdGVseSwgdXBncmFkaW5nIHRoZSBrZXl0ZXJuYWwgY29kZSBwcmVzZW50cyBjaGFsbGVuZ2VzLFxuICAgICAgLy8gd2hpY2ggaGluZGVycyB0aGUgaW50ZWdyYXRpb24gb2YgdGhlIGxhdGVzdCBCaXRHb0pTIFNESyB3aXRoIFBTQlQgc2lnbmluZyBzdXBwb3J0LlxuICAgICAgdHhJbmZvLnRyYW5zYWN0aW9uSGV4ID1cbiAgICAgICAgcGFyYW1zLmtyc1Byb3ZpZGVyID09PSAna2V5dGVybmFsJ1xuICAgICAgICAgID8gdXR4b2xpYi5iaXRnby5leHRyYWN0UDJtc09ubHlIYWxmU2lnbmVkVHgocHNidCkudG9CdWZmZXIoKS50b1N0cmluZygnaGV4JylcbiAgICAgICAgICA6IHBzYnQudG9IZXgoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgdHggPSBzaWduQW5kVmVyaWZ5UHNidChwc2J0LCB3YWxsZXRLZXlzLmJhY2t1cCwgeyBpc0xhc3RTaWduYXR1cmU6IHRydWUgfSk7XG4gICAgICB0eEluZm8udHJhbnNhY3Rpb25IZXggPSB0eC50b0J1ZmZlcigpLnRvU3RyaW5nKCdoZXgnKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNLcnNSZWNvdmVyeSkge1xuICAgIHR4SW5mby5jb2luID0gY29pbi5nZXRDaGFpbigpO1xuICAgIHR4SW5mby5iYWNrdXBLZXkgPSBwYXJhbXMuYmFja3VwS2V5O1xuICAgIHR4SW5mby5yZWNvdmVyeUFtb3VudCA9IE51bWJlcihyZWNvdmVyeUFtb3VudCk7XG4gICAgdHhJbmZvLnJlY292ZXJ5QW1vdW50U3RyaW5nID0gcmVjb3ZlcnlBbW91bnQudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJldHVybiB0eEluZm87XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQml0R29WMVVuc3BlbnQge1xuICB0eF9oYXNoOiBzdHJpbmc7XG4gIHR4X291dHB1dF9uOiBudW1iZXI7XG4gIHZhbHVlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVjFTd2VlcFBhcmFtcyB7XG4gIHdhbGxldElkOiBzdHJpbmc7XG4gIHdhbGxldFBhc3NwaHJhc2U6IHN0cmluZztcbiAgdW5zcGVudHM6IEJpdEdvVjFVbnNwZW50W107XG4gIHJlY292ZXJ5RGVzdGluYXRpb246IHN0cmluZztcbiAgdXNlcktleTogc3RyaW5nO1xuICBvdHA6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWMVJlY292ZXJQYXJhbXMgZXh0ZW5kcyBPbWl0PFYxU3dlZXBQYXJhbXMsICdvdHAnPiB7XG4gIGJhY2t1cEtleTogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdjFCYWNrdXBLZXlSZWNvdmVyeShcbiAgY29pbjogQWJzdHJhY3RVdHhvQ29pbixcbiAgYml0Z286IEJpdEdvQmFzZSxcbiAgcGFyYW1zOiBWMVJlY292ZXJQYXJhbXNcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmIChcbiAgICBfLmlzVW5kZWZpbmVkKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSB8fFxuICAgICFjb2luLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCB7IGFueUZvcm1hdDogdHJ1ZSB9KVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICB9XG5cbiAgY29uc3QgcmVjb3ZlcnlGZWVQZXJCeXRlID0gYXdhaXQgZ2V0UmVjb3ZlcnlGZWVQZXJCeXRlcyhjb2luLCB7IGRlZmF1bHRWYWx1ZTogNTAgfSk7XG4gIGNvbnN0IHYxd2FsbGV0ID0gYXdhaXQgYml0Z28ud2FsbGV0cygpLmdldCh7IGlkOiBwYXJhbXMud2FsbGV0SWQgfSk7XG4gIHJldHVybiBhd2FpdCB2MXdhbGxldC5yZWNvdmVyKHtcbiAgICAuLi5wYXJhbXMsXG4gICAgZmVlUmF0ZTogcmVjb3ZlcnlGZWVQZXJCeXRlLFxuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHYxU3dlZXAoXG4gIGNvaW46IEFic3RyYWN0VXR4b0NvaW4sXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIHBhcmFtczogVjFTd2VlcFBhcmFtc1xuKTogUHJvbWlzZTx7XG4gIHR4OiBzdHJpbmc7XG4gIGhhc2g6IHN0cmluZztcbiAgc3RhdHVzOiBzdHJpbmc7XG59PiB7XG4gIGlmIChcbiAgICBfLmlzVW5kZWZpbmVkKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uKSB8fFxuICAgICFjb2luLmlzVmFsaWRBZGRyZXNzKHBhcmFtcy5yZWNvdmVyeURlc3RpbmF0aW9uLCB7IGFueUZvcm1hdDogdHJ1ZSB9KVxuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgcmVjb3ZlcnlEZXN0aW5hdGlvbicpO1xuICB9XG5cbiAgbGV0IHJlY292ZXJ5RmVlUGVyQnl0ZSA9IDEwMDtcbiAgaWYgKGJpdGdvLmVudiA9PT0gJ3Byb2QnKSB7XG4gICAgcmVjb3ZlcnlGZWVQZXJCeXRlID0gYXdhaXQgZ2V0UmVjb3ZlcnlGZWVQZXJCeXRlcyhjb2luLCB7IGRlZmF1bHRWYWx1ZTogMTAwIH0pO1xuICB9XG5cbiAgY29uc3QgdjF3YWxsZXQgPSBhd2FpdCBiaXRnby53YWxsZXRzKCkuZ2V0KHsgaWQ6IHBhcmFtcy53YWxsZXRJZCB9KTtcbiAgcmV0dXJuIGF3YWl0IHYxd2FsbGV0LnN3ZWVwKHtcbiAgICAuLi5wYXJhbXMsXG4gICAgZmVlUmF0ZTogcmVjb3ZlcnlGZWVQZXJCeXRlLFxuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,24 @@
1
+ import superagent from 'superagent';
2
+ import { BitGoJsError } from '@bitgo/sdk-core';
3
+ export declare class ApiNotImplementedError extends BitGoJsError {
4
+ constructor(coinName: string);
5
+ }
6
+ export declare class ApiRequestError extends BitGoJsError {
7
+ constructor(url: string, reason: Error | string);
8
+ static forRequest(req: superagent.Request, reason: Error | string): ApiRequestError;
9
+ static forResponse(res: superagent.Response, reason: Error | string): ApiRequestError;
10
+ }
11
+ export type RequestOptions = {
12
+ retry?: number;
13
+ };
14
+ export type Response<T> = {
15
+ map<V>(f: (body: T) => V): V;
16
+ };
17
+ export declare class BaseApi {
18
+ baseUrl: string;
19
+ constructor(baseUrl: string);
20
+ request<T>(method: string, path: string, requestBody: unknown | undefined, params?: RequestOptions): Promise<Response<T>>;
21
+ get<T>(path: string, params?: RequestOptions): Promise<Response<T>>;
22
+ post<T>(path: string, body: unknown, params?: RequestOptions): Promise<Response<T>>;
23
+ }
24
+ //# sourceMappingURL=baseApi.d.ts.map
@@ -0,0 +1,64 @@
1
+ import superagent from 'superagent';
2
+ import { BitGoJsError } from '@bitgo/sdk-core';
3
+ export class ApiNotImplementedError extends BitGoJsError {
4
+ constructor(coinName) {
5
+ super(`api not implemented for coin ${coinName}`);
6
+ }
7
+ }
8
+ export class ApiRequestError extends BitGoJsError {
9
+ constructor(url, reason) {
10
+ super(`error in API request: ${url}: ${reason}`);
11
+ }
12
+ static forRequest(req, reason) {
13
+ return new ApiRequestError(req.toString(), reason);
14
+ }
15
+ static forResponse(res, reason) {
16
+ return new ApiRequestError(res.header, reason);
17
+ }
18
+ }
19
+ export class BaseApi {
20
+ constructor(baseUrl) {
21
+ this.baseUrl = baseUrl;
22
+ if (!baseUrl.startsWith('https://')) {
23
+ throw new Error(`baseUrl must start with https://`);
24
+ }
25
+ if (baseUrl.endsWith(`/`)) {
26
+ throw new Error(`baseUrl must not end with slash (/)`);
27
+ }
28
+ }
29
+ async request(method, path, requestBody, params = {}) {
30
+ if (!path.startsWith(path)) {
31
+ throw new Error(`path must start with '/' character`);
32
+ }
33
+ const url = this.baseUrl + path;
34
+ let response;
35
+ try {
36
+ response = await superagent(method, url)
37
+ .retry(params.retry)
38
+ .send(requestBody);
39
+ }
40
+ catch (e) {
41
+ throw new ApiRequestError(url, e);
42
+ }
43
+ if (!response.ok) {
44
+ throw new ApiRequestError(url, `status code ${response.statusCode}`);
45
+ }
46
+ return {
47
+ map(f) {
48
+ try {
49
+ return f(response.body);
50
+ }
51
+ catch (e) {
52
+ throw new ApiRequestError(url, e);
53
+ }
54
+ },
55
+ };
56
+ }
57
+ get(path, params) {
58
+ return this.request('get', path, undefined, params);
59
+ }
60
+ post(path, body, params) {
61
+ return this.request('post', path, body, params);
62
+ }
63
+ }
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZUFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9yZWNvdmVyeS9iYXNlQXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sVUFBVSxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFL0MsTUFBTSxPQUFPLHNCQUF1QixTQUFRLFlBQVk7SUFDdEQsWUFBWSxRQUFnQjtRQUMxQixLQUFLLENBQUMsZ0NBQWdDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLGVBQWdCLFNBQVEsWUFBWTtJQUMvQyxZQUFZLEdBQVcsRUFBRSxNQUFzQjtRQUM3QyxLQUFLLENBQUMseUJBQXlCLEdBQUcsS0FBSyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQXVCLEVBQUUsTUFBc0I7UUFDL0QsT0FBTyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBd0IsRUFBRSxNQUFzQjtRQUNqRSxPQUFPLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQztDQUNGO0FBVUQsTUFBTSxPQUFPLE9BQU87SUFDbEIsWUFBbUIsT0FBZTtRQUFmLFlBQU8sR0FBUCxPQUFPLENBQVE7UUFDaEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNwQyxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQ1gsTUFBYyxFQUNkLElBQVksRUFDWixXQUFnQyxFQUNoQyxTQUF5QixFQUFFO1FBRTNCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztRQUNoQyxJQUFJLFFBQVEsQ0FBQztRQUNiLElBQUksQ0FBQztZQUNILFFBQVEsR0FBRyxNQUFNLFVBQVUsQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO2lCQUNyQyxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQztpQkFDbkIsSUFBSSxDQUFDLFdBQXNDLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxlQUFlLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxlQUFlLENBQUMsR0FBRyxFQUFFLGVBQWUsUUFBUSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDdkUsQ0FBQztRQUVELE9BQU87WUFDTCxHQUFHLENBQUksQ0FBaUI7Z0JBQ3RCLElBQUksQ0FBQztvQkFDSCxPQUFPLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzFCLENBQUM7Z0JBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDWCxNQUFNLElBQUksZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDcEMsQ0FBQztZQUNILENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELEdBQUcsQ0FBSSxJQUFZLEVBQUUsTUFBdUI7UUFDMUMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLENBQUksSUFBWSxFQUFFLElBQWEsRUFBRSxNQUF1QjtRQUMxRCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHN1cGVyYWdlbnQgZnJvbSAnc3VwZXJhZ2VudCc7XG5pbXBvcnQgeyBCaXRHb0pzRXJyb3IgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuXG5leHBvcnQgY2xhc3MgQXBpTm90SW1wbGVtZW50ZWRFcnJvciBleHRlbmRzIEJpdEdvSnNFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGNvaW5OYW1lOiBzdHJpbmcpIHtcbiAgICBzdXBlcihgYXBpIG5vdCBpbXBsZW1lbnRlZCBmb3IgY29pbiAke2NvaW5OYW1lfWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBcGlSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBCaXRHb0pzRXJyb3Ige1xuICBjb25zdHJ1Y3Rvcih1cmw6IHN0cmluZywgcmVhc29uOiBFcnJvciB8IHN0cmluZykge1xuICAgIHN1cGVyKGBlcnJvciBpbiBBUEkgcmVxdWVzdDogJHt1cmx9OiAke3JlYXNvbn1gKTtcbiAgfVxuXG4gIHN0YXRpYyBmb3JSZXF1ZXN0KHJlcTogc3VwZXJhZ2VudC5SZXF1ZXN0LCByZWFzb246IEVycm9yIHwgc3RyaW5nKTogQXBpUmVxdWVzdEVycm9yIHtcbiAgICByZXR1cm4gbmV3IEFwaVJlcXVlc3RFcnJvcihyZXEudG9TdHJpbmcoKSwgcmVhc29uKTtcbiAgfVxuXG4gIHN0YXRpYyBmb3JSZXNwb25zZShyZXM6IHN1cGVyYWdlbnQuUmVzcG9uc2UsIHJlYXNvbjogRXJyb3IgfCBzdHJpbmcpOiBBcGlSZXF1ZXN0RXJyb3Ige1xuICAgIHJldHVybiBuZXcgQXBpUmVxdWVzdEVycm9yKHJlcy5oZWFkZXIsIHJlYXNvbik7XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgUmVxdWVzdE9wdGlvbnMgPSB7XG4gIHJldHJ5PzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgUmVzcG9uc2U8VD4gPSB7XG4gIG1hcDxWPihmOiAoYm9keTogVCkgPT4gVik6IFY7XG59O1xuXG5leHBvcnQgY2xhc3MgQmFzZUFwaSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBiYXNlVXJsOiBzdHJpbmcpIHtcbiAgICBpZiAoIWJhc2VVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBiYXNlVXJsIG11c3Qgc3RhcnQgd2l0aCBodHRwczovL2ApO1xuICAgIH1cbiAgICBpZiAoYmFzZVVybC5lbmRzV2l0aChgL2ApKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYGJhc2VVcmwgbXVzdCBub3QgZW5kIHdpdGggc2xhc2ggKC8pYCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgcmVxdWVzdDxUPihcbiAgICBtZXRob2Q6IHN0cmluZyxcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgcmVxdWVzdEJvZHk6IHVua25vd24gfCB1bmRlZmluZWQsXG4gICAgcGFyYW1zOiBSZXF1ZXN0T3B0aW9ucyA9IHt9XG4gICk6IFByb21pc2U8UmVzcG9uc2U8VD4+IHtcbiAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChwYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBwYXRoIG11c3Qgc3RhcnQgd2l0aCAnLycgY2hhcmFjdGVyYCk7XG4gICAgfVxuICAgIGNvbnN0IHVybCA9IHRoaXMuYmFzZVVybCArIHBhdGg7XG4gICAgbGV0IHJlc3BvbnNlO1xuICAgIHRyeSB7XG4gICAgICByZXNwb25zZSA9IGF3YWl0IHN1cGVyYWdlbnQobWV0aG9kLCB1cmwpXG4gICAgICAgIC5yZXRyeShwYXJhbXMucmV0cnkpXG4gICAgICAgIC5zZW5kKHJlcXVlc3RCb2R5IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgQXBpUmVxdWVzdEVycm9yKHVybCwgZSk7XG4gICAgfVxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIHRocm93IG5ldyBBcGlSZXF1ZXN0RXJyb3IodXJsLCBgc3RhdHVzIGNvZGUgJHtyZXNwb25zZS5zdGF0dXNDb2RlfWApO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBtYXA8Vj4oZjogKGJvZHk6IFQpID0+IFYpOiBWIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gZihyZXNwb25zZS5ib2R5KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIHRocm93IG5ldyBBcGlSZXF1ZXN0RXJyb3IodXJsLCBlKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgZ2V0PFQ+KHBhdGg6IHN0cmluZywgcGFyYW1zPzogUmVxdWVzdE9wdGlvbnMpOiBQcm9taXNlPFJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnZ2V0JywgcGF0aCwgdW5kZWZpbmVkLCBwYXJhbXMpO1xuICB9XG5cbiAgcG9zdDxUPihwYXRoOiBzdHJpbmcsIGJvZHk6IHVua25vd24sIHBhcmFtcz86IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ3Bvc3QnLCBwYXRoLCBib2R5LCBwYXJhbXMpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,6 @@
1
+ import { BaseApi } from './baseApi';
2
+ export declare class CoingeckoApi extends BaseApi {
3
+ constructor();
4
+ getUSDPrice(coinFamily: string): Promise<number>;
5
+ }
6
+ //# sourceMappingURL=coingeckoApi.d.ts.map
@@ -0,0 +1,40 @@
1
+ import { BaseApi } from './baseApi';
2
+ const familyNamesToCoinGeckoIds = new Map()
3
+ .set('BTC', 'bitcoin')
4
+ .set('LTC', 'litecoin')
5
+ .set('BCH', 'bitcoin-cash')
6
+ .set('ZEC', 'zcash')
7
+ .set('DASH', 'dash')
8
+ // note: we don't have a source for price data of BCHA and BSV, but we will use BCH as a proxy. We will substitute
9
+ // it out for a better source when it becomes available. TODO BG-26359.
10
+ .set('BCHA', 'bitcoin-cash')
11
+ .set('BSV', 'bitcoin-cash');
12
+ export class CoingeckoApi extends BaseApi {
13
+ constructor() {
14
+ super('https://api.coingecko.com/api/v3');
15
+ }
16
+ async getUSDPrice(coinFamily) {
17
+ const coinGeckoId = familyNamesToCoinGeckoIds.get(coinFamily.toUpperCase());
18
+ if (!coinGeckoId) {
19
+ throw new Error(`There is no CoinGecko id for family name ${coinFamily.toUpperCase()}.`);
20
+ }
21
+ const coinGeckoUrl = `/simple/price?ids=${coinGeckoId}&vs_currencies=USD`;
22
+ const res = await this.get(coinGeckoUrl, { retry: 2 });
23
+ return res.map((body) => {
24
+ // An example of response
25
+ // {
26
+ // "ethereum": {
27
+ // "usd": 220.64
28
+ // }
29
+ // }
30
+ if (!body) {
31
+ throw new Error('Unable to reach Coin Gecko API for price data');
32
+ }
33
+ if (!body[coinGeckoId]['usd'] || typeof body[coinGeckoId]['usd'] !== 'number') {
34
+ throw new Error('Unexpected response from Coin Gecko API for price data');
35
+ }
36
+ return body[coinGeckoId]['usd'];
37
+ });
38
+ }
39
+ }
40
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29pbmdlY2tvQXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3JlY292ZXJ5L2NvaW5nZWNrb0FwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXBDLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxHQUFHLEVBQUU7S0FDeEMsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUM7S0FDckIsR0FBRyxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUM7S0FDdEIsR0FBRyxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUM7S0FDMUIsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUM7S0FDbkIsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDcEIsa0hBQWtIO0lBQ2xILHdFQUF3RTtLQUN2RSxHQUFHLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQztLQUMzQixHQUFHLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBRTlCLE1BQU0sT0FBTyxZQUFhLFNBQVEsT0FBTztJQUN2QztRQUNFLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLFVBQWtCO1FBQ2xDLE1BQU0sV0FBVyxHQUFHLHlCQUF5QixDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsVUFBVSxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzRixDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcscUJBQXFCLFdBQVcsb0JBQW9CLENBQUM7UUFDMUUsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFNLFlBQVksRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVELE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ3RCLHlCQUF5QjtZQUN6QixJQUFJO1lBQ0osa0JBQWtCO1lBQ2xCLG9CQUFvQjtZQUNwQixNQUFNO1lBQ04sSUFBSTtZQUNKLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDVixNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7WUFDbkUsQ0FBQztZQUNELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzlFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztZQUM1RSxDQUFDO1lBRUQsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQXBpIH0gZnJvbSAnLi9iYXNlQXBpJztcblxuY29uc3QgZmFtaWx5TmFtZXNUb0NvaW5HZWNrb0lkcyA9IG5ldyBNYXAoKVxuICAuc2V0KCdCVEMnLCAnYml0Y29pbicpXG4gIC5zZXQoJ0xUQycsICdsaXRlY29pbicpXG4gIC5zZXQoJ0JDSCcsICdiaXRjb2luLWNhc2gnKVxuICAuc2V0KCdaRUMnLCAnemNhc2gnKVxuICAuc2V0KCdEQVNIJywgJ2Rhc2gnKVxuICAvLyBub3RlOiB3ZSBkb24ndCBoYXZlIGEgc291cmNlIGZvciBwcmljZSBkYXRhIG9mIEJDSEEgYW5kIEJTViwgYnV0IHdlIHdpbGwgdXNlIEJDSCBhcyBhIHByb3h5LiBXZSB3aWxsIHN1YnN0aXR1dGVcbiAgLy8gaXQgb3V0IGZvciBhIGJldHRlciBzb3VyY2Ugd2hlbiBpdCBiZWNvbWVzIGF2YWlsYWJsZS4gIFRPRE8gQkctMjYzNTkuXG4gIC5zZXQoJ0JDSEEnLCAnYml0Y29pbi1jYXNoJylcbiAgLnNldCgnQlNWJywgJ2JpdGNvaW4tY2FzaCcpO1xuXG5leHBvcnQgY2xhc3MgQ29pbmdlY2tvQXBpIGV4dGVuZHMgQmFzZUFwaSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCdodHRwczovL2FwaS5jb2luZ2Vja28uY29tL2FwaS92MycpO1xuICB9XG5cbiAgYXN5bmMgZ2V0VVNEUHJpY2UoY29pbkZhbWlseTogc3RyaW5nKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb2luR2Vja29JZCA9IGZhbWlseU5hbWVzVG9Db2luR2Vja29JZHMuZ2V0KGNvaW5GYW1pbHkudG9VcHBlckNhc2UoKSk7XG4gICAgaWYgKCFjb2luR2Vja29JZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGVyZSBpcyBubyBDb2luR2Vja28gaWQgZm9yIGZhbWlseSBuYW1lICR7Y29pbkZhbWlseS50b1VwcGVyQ2FzZSgpfS5gKTtcbiAgICB9XG4gICAgY29uc3QgY29pbkdlY2tvVXJsID0gYC9zaW1wbGUvcHJpY2U/aWRzPSR7Y29pbkdlY2tvSWR9JnZzX2N1cnJlbmNpZXM9VVNEYDtcbiAgICBjb25zdCByZXMgPSBhd2FpdCB0aGlzLmdldDxhbnk+KGNvaW5HZWNrb1VybCwgeyByZXRyeTogMiB9KTtcbiAgICByZXR1cm4gcmVzLm1hcCgoYm9keSkgPT4ge1xuICAgICAgLy8gQW4gZXhhbXBsZSBvZiByZXNwb25zZVxuICAgICAgLy8ge1xuICAgICAgLy8gICBcImV0aGVyZXVtXCI6IHtcbiAgICAgIC8vICAgICBcInVzZFwiOiAyMjAuNjRcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuICAgICAgaWYgKCFib2R5KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIHJlYWNoIENvaW4gR2Vja28gQVBJIGZvciBwcmljZSBkYXRhJyk7XG4gICAgICB9XG4gICAgICBpZiAoIWJvZHlbY29pbkdlY2tvSWRdWyd1c2QnXSB8fCB0eXBlb2YgYm9keVtjb2luR2Vja29JZF1bJ3VzZCddICE9PSAnbnVtYmVyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSBDb2luIEdlY2tvIEFQSSBmb3IgcHJpY2UgZGF0YScpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYm9keVtjb2luR2Vja29JZF1bJ3VzZCddO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,86 @@
1
+ import * as utxolib from '@bitgo/utxo-lib';
2
+ import { BitGoBase, IWallet } from '@bitgo/sdk-core';
3
+ import { AbstractUtxoCoin, TransactionInfo } from '../abstractUtxoCoin';
4
+ type RootWalletKeys = utxolib.bitgo.RootWalletKeys;
5
+ export interface BuildRecoveryTransactionOptions {
6
+ wallet: string;
7
+ faultyTxId: string;
8
+ recoveryAddress: string;
9
+ }
10
+ type FeeInfo = {
11
+ size: number;
12
+ feeRate: number;
13
+ fee: number;
14
+ payGoFee: number;
15
+ };
16
+ export interface CrossChainRecoveryUnsigned<TNumber extends number | bigint = number> {
17
+ txHex: string;
18
+ txInfo: TransactionInfo<TNumber>;
19
+ walletId: string;
20
+ feeInfo: FeeInfo;
21
+ address: string;
22
+ coin: string;
23
+ }
24
+ export interface CrossChainRecoverySigned<TNumber extends number | bigint = number> {
25
+ version: 1 | 2;
26
+ txHex: string;
27
+ txInfo: TransactionInfo<TNumber>;
28
+ walletId: string;
29
+ sourceCoin: string;
30
+ recoveryCoin: string;
31
+ recoveryAddress?: string;
32
+ recoveryAmount?: TNumber;
33
+ }
34
+ type WalletV1 = {
35
+ keychains: {
36
+ xpub: string;
37
+ }[];
38
+ address({ address }: {
39
+ address: string;
40
+ }): Promise<{
41
+ chain: number;
42
+ index: number;
43
+ }>;
44
+ getEncryptedUserKeychain(): Promise<{
45
+ encryptedXprv: string;
46
+ }>;
47
+ };
48
+ export declare function getWallet(bitgo: BitGoBase, coin: AbstractUtxoCoin, walletId: string): Promise<IWallet | WalletV1>;
49
+ /**
50
+ * @param recoveryCoin
51
+ * @param wallet
52
+ * @return wallet pubkeys
53
+ */
54
+ export declare function getWalletKeys(recoveryCoin: AbstractUtxoCoin, wallet: IWallet | WalletV1): Promise<RootWalletKeys>;
55
+ export declare function isWalletAddress(wallet: IWallet | WalletV1, address: string): Promise<boolean>;
56
+ type RecoverParams = {
57
+ /** Wallet ID (can be v1 wallet or v2 wallet) */
58
+ walletId: string;
59
+ /** Coin to create the transaction for */
60
+ sourceCoin: AbstractUtxoCoin;
61
+ /** Coin that wallet keys were set up for */
62
+ recoveryCoin: AbstractUtxoCoin;
63
+ /** Source coin transaction to recover outputs from (sourceCoin) */
64
+ txid: string;
65
+ /** Source coin address to send the funds to */
66
+ recoveryAddress: string;
67
+ /** If set, decrypts private key and signs transaction */
68
+ walletPassphrase?: string;
69
+ /** If set, signs transaction */
70
+ xprv?: string;
71
+ /** for utxo coins other than [BTC,TBTC] this is a Block Chair api key **/
72
+ apiKey?: string;
73
+ };
74
+ /**
75
+ * Recover wallet deposits that were received on the wrong blockchain
76
+ * (for instance bitcoin deposits that were received for a litecoin wallet).
77
+ *
78
+ * Fetches the unspent data from BitGo's public blockchain API and the script data from the user's
79
+ * wallet.
80
+ *
81
+ * @param {BitGoBase} bitgo
82
+ * @param {RecoverParams} params
83
+ */
84
+ export declare function recoverCrossChain<TNumber extends number | bigint = number>(bitgo: BitGoBase, params: RecoverParams): Promise<CrossChainRecoverySigned<TNumber> | CrossChainRecoveryUnsigned<TNumber>>;
85
+ export {};
86
+ //# sourceMappingURL=crossChainRecovery.d.ts.map