@atomiqlabs/sdk 7.0.12 → 8.0.8

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 (364) hide show
  1. package/README.md +45 -29
  2. package/dist/SmartChainAssets.d.ts +11 -3
  3. package/dist/SmartChainAssets.js +7 -3
  4. package/dist/bitcoin/BitcoinRpcWithAddressIndex.d.ts +68 -0
  5. package/dist/bitcoin/BitcoinRpcWithAddressIndex.js +2 -0
  6. package/dist/bitcoin/LightningNetworkApi.d.ts +12 -0
  7. package/dist/bitcoin/LightningNetworkApi.js +2 -0
  8. package/dist/bitcoin/coinselect2/accumulative.d.ts +6 -0
  9. package/dist/bitcoin/coinselect2/accumulative.js +52 -0
  10. package/dist/bitcoin/coinselect2/blackjack.d.ts +6 -0
  11. package/dist/bitcoin/coinselect2/blackjack.js +38 -0
  12. package/dist/bitcoin/coinselect2/index.d.ts +19 -0
  13. package/dist/bitcoin/coinselect2/index.js +69 -0
  14. package/dist/bitcoin/coinselect2/utils.d.ts +71 -0
  15. package/dist/bitcoin/coinselect2/utils.js +123 -0
  16. package/dist/bitcoin/mempool/MempoolApi.d.ts +350 -0
  17. package/dist/bitcoin/mempool/MempoolApi.js +311 -0
  18. package/dist/bitcoin/mempool/MempoolBitcoinBlock.d.ts +44 -0
  19. package/dist/bitcoin/mempool/MempoolBitcoinBlock.js +48 -0
  20. package/dist/bitcoin/mempool/MempoolBitcoinRpc.d.ts +119 -0
  21. package/dist/bitcoin/mempool/MempoolBitcoinRpc.js +361 -0
  22. package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.d.ts +22 -0
  23. package/dist/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.js +105 -0
  24. package/dist/bitcoin/wallet/BitcoinWallet.d.ts +93 -0
  25. package/dist/bitcoin/wallet/BitcoinWallet.js +273 -0
  26. package/dist/bitcoin/wallet/IBitcoinWallet.d.ts +28 -0
  27. package/dist/bitcoin/wallet/IBitcoinWallet.js +20 -0
  28. package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.d.ts +21 -0
  29. package/dist/bitcoin/wallet/MinimalBitcoinWalletInterface.js +2 -0
  30. package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.d.ts +7 -0
  31. package/dist/bitcoin/wallet/MinimalLightningNetworkWalletInterface.js +2 -0
  32. package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.d.ts +40 -0
  33. package/dist/bitcoin/wallet/SingleAddressBitcoinWallet.js +86 -0
  34. package/dist/enums/FeeType.d.ts +8 -0
  35. package/dist/enums/FeeType.js +12 -0
  36. package/dist/enums/SwapAmountType.d.ts +8 -0
  37. package/dist/enums/SwapAmountType.js +12 -0
  38. package/dist/enums/SwapDirection.d.ts +8 -0
  39. package/dist/enums/SwapDirection.js +12 -0
  40. package/dist/enums/SwapType.d.ts +14 -0
  41. package/dist/enums/SwapType.js +18 -0
  42. package/dist/errors/IntermediaryError.d.ts +9 -0
  43. package/dist/errors/IntermediaryError.js +26 -0
  44. package/dist/errors/PaymentAuthError.d.ts +11 -0
  45. package/dist/errors/PaymentAuthError.js +23 -0
  46. package/dist/errors/RequestError.d.ts +18 -0
  47. package/dist/errors/RequestError.js +46 -0
  48. package/dist/errors/UserError.d.ts +7 -0
  49. package/dist/errors/UserError.js +15 -0
  50. package/dist/events/UnifiedSwapEventListener.d.ts +23 -0
  51. package/dist/events/UnifiedSwapEventListener.js +130 -0
  52. package/dist/http/HttpUtils.d.ts +27 -0
  53. package/dist/http/HttpUtils.js +91 -0
  54. package/dist/http/paramcoders/IParamReader.d.ts +8 -0
  55. package/dist/http/paramcoders/IParamReader.js +2 -0
  56. package/dist/http/paramcoders/ParamDecoder.d.ts +44 -0
  57. package/dist/http/paramcoders/ParamDecoder.js +132 -0
  58. package/dist/http/paramcoders/ParamEncoder.d.ts +20 -0
  59. package/dist/http/paramcoders/ParamEncoder.js +31 -0
  60. package/dist/http/paramcoders/SchemaVerifier.d.ts +26 -0
  61. package/dist/http/paramcoders/SchemaVerifier.js +145 -0
  62. package/dist/http/paramcoders/client/ResponseParamDecoder.d.ts +11 -0
  63. package/dist/http/paramcoders/client/ResponseParamDecoder.js +57 -0
  64. package/dist/http/paramcoders/client/StreamParamEncoder.d.ts +13 -0
  65. package/dist/http/paramcoders/client/StreamParamEncoder.js +26 -0
  66. package/dist/http/paramcoders/client/StreamingFetchPromise.d.ts +16 -0
  67. package/dist/http/paramcoders/client/StreamingFetchPromise.js +174 -0
  68. package/dist/index.d.ts +82 -4
  69. package/dist/index.js +128 -4
  70. package/dist/intermediaries/Intermediary.d.ts +111 -0
  71. package/dist/intermediaries/Intermediary.js +115 -0
  72. package/dist/intermediaries/IntermediaryDiscovery.d.ts +166 -0
  73. package/dist/intermediaries/IntermediaryDiscovery.js +390 -0
  74. package/dist/intermediaries/apis/IntermediaryAPI.d.ts +436 -0
  75. package/dist/intermediaries/apis/IntermediaryAPI.js +600 -0
  76. package/dist/intermediaries/apis/TrustedIntermediaryAPI.d.ts +154 -0
  77. package/dist/intermediaries/apis/TrustedIntermediaryAPI.js +136 -0
  78. package/dist/lnurl/LNURL.d.ts +102 -0
  79. package/dist/lnurl/LNURL.js +321 -0
  80. package/dist/prices/RedundantSwapPrice.d.ts +89 -0
  81. package/dist/prices/RedundantSwapPrice.js +202 -0
  82. package/dist/prices/SingleSwapPrice.d.ts +31 -0
  83. package/dist/prices/SingleSwapPrice.js +41 -0
  84. package/dist/prices/SwapPriceWithChain.d.ts +70 -0
  85. package/dist/prices/SwapPriceWithChain.js +91 -0
  86. package/dist/prices/abstract/ICachedSwapPrice.d.ts +28 -0
  87. package/dist/prices/abstract/ICachedSwapPrice.js +62 -0
  88. package/dist/prices/abstract/IPriceProvider.d.ts +81 -0
  89. package/dist/prices/abstract/IPriceProvider.js +74 -0
  90. package/dist/prices/abstract/ISwapPrice.d.ts +117 -0
  91. package/dist/prices/abstract/ISwapPrice.js +219 -0
  92. package/dist/prices/providers/BinancePriceProvider.d.ts +16 -0
  93. package/dist/prices/providers/BinancePriceProvider.js +23 -0
  94. package/dist/prices/providers/CoinGeckoPriceProvider.d.ts +17 -0
  95. package/dist/prices/providers/CoinGeckoPriceProvider.js +23 -0
  96. package/dist/prices/providers/CoinPaprikaPriceProvider.d.ts +19 -0
  97. package/dist/prices/providers/CoinPaprikaPriceProvider.js +23 -0
  98. package/dist/prices/providers/CustomPriceProvider.d.ts +13 -0
  99. package/dist/prices/providers/CustomPriceProvider.js +24 -0
  100. package/dist/prices/providers/KrakenPriceProvider.d.ts +29 -0
  101. package/dist/prices/providers/KrakenPriceProvider.js +36 -0
  102. package/dist/prices/providers/OKXPriceProvider.d.ts +28 -0
  103. package/dist/prices/providers/OKXPriceProvider.js +23 -0
  104. package/dist/prices/providers/abstract/ExchangePriceProvider.d.ts +14 -0
  105. package/dist/prices/providers/abstract/ExchangePriceProvider.js +18 -0
  106. package/dist/prices/providers/abstract/HttpPriceProvider.d.ts +7 -0
  107. package/dist/prices/providers/abstract/HttpPriceProvider.js +12 -0
  108. package/dist/storage/IUnifiedStorage.d.ts +73 -0
  109. package/dist/storage/IUnifiedStorage.js +2 -0
  110. package/dist/storage/UnifiedSwapStorage.d.ts +82 -0
  111. package/dist/storage/UnifiedSwapStorage.js +83 -0
  112. package/dist/storage-browser/IndexedDBUnifiedStorage.d.ts +39 -0
  113. package/dist/storage-browser/IndexedDBUnifiedStorage.js +275 -0
  114. package/dist/{storage → storage-browser}/LocalStorageManager.d.ts +1 -0
  115. package/dist/{storage → storage-browser}/LocalStorageManager.js +2 -1
  116. package/dist/swapper/Swapper.d.ts +533 -0
  117. package/dist/swapper/Swapper.js +1566 -0
  118. package/dist/swapper/SwapperFactory.d.ts +87 -0
  119. package/dist/{SwapperFactory.js → swapper/SwapperFactory.js} +37 -19
  120. package/dist/swapper/SwapperUtils.d.ts +153 -0
  121. package/dist/swapper/SwapperUtils.js +420 -0
  122. package/dist/swapper/SwapperWithChain.d.ts +214 -0
  123. package/dist/swapper/SwapperWithChain.js +315 -0
  124. package/dist/swapper/SwapperWithSigner.d.ts +178 -0
  125. package/dist/swapper/SwapperWithSigner.js +172 -0
  126. package/dist/swaps/IAddressSwap.d.ts +13 -0
  127. package/dist/swaps/IAddressSwap.js +13 -0
  128. package/dist/swaps/IBTCWalletSwap.d.ts +55 -0
  129. package/dist/swaps/IBTCWalletSwap.js +17 -0
  130. package/dist/swaps/IClaimableSwap.d.ts +17 -0
  131. package/dist/swaps/IClaimableSwap.js +14 -0
  132. package/dist/swaps/IClaimableSwapWrapper.d.ts +5 -0
  133. package/dist/swaps/IClaimableSwapWrapper.js +2 -0
  134. package/dist/swaps/IRefundableSwap.d.ts +17 -0
  135. package/dist/swaps/IRefundableSwap.js +13 -0
  136. package/dist/swaps/ISwap.d.ts +207 -0
  137. package/dist/swaps/ISwap.js +264 -0
  138. package/dist/swaps/ISwapWithGasDrop.d.ts +15 -0
  139. package/dist/swaps/ISwapWithGasDrop.js +11 -0
  140. package/dist/swaps/ISwapWrapper.d.ts +153 -0
  141. package/dist/swaps/ISwapWrapper.js +227 -0
  142. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.d.ts +53 -0
  143. package/dist/swaps/escrow_swaps/IEscrowSelfInitSwap.js +116 -0
  144. package/dist/swaps/escrow_swaps/IEscrowSwap.d.ts +70 -0
  145. package/dist/swaps/escrow_swaps/IEscrowSwap.js +132 -0
  146. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.d.ts +85 -0
  147. package/dist/swaps/escrow_swaps/IEscrowSwapWrapper.js +122 -0
  148. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.d.ts +86 -0
  149. package/dist/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.js +115 -0
  150. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.d.ts +93 -0
  151. package/dist/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.js +121 -0
  152. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.d.ts +45 -0
  153. package/dist/swaps/escrow_swaps/frombtc/IFromBTCWrapper.js +65 -0
  154. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.d.ts +263 -0
  155. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.js +933 -0
  156. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.d.ts +110 -0
  157. package/dist/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.js +307 -0
  158. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.d.ts +236 -0
  159. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.js +898 -0
  160. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.d.ts +125 -0
  161. package/dist/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.js +393 -0
  162. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.d.ts +245 -0
  163. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.js +841 -0
  164. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.d.ts +120 -0
  165. package/dist/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.js +294 -0
  166. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.d.ts +228 -0
  167. package/dist/swaps/escrow_swaps/tobtc/IToBTCSwap.js +721 -0
  168. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.d.ts +37 -0
  169. package/dist/swaps/escrow_swaps/tobtc/IToBTCWrapper.js +93 -0
  170. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.d.ts +86 -0
  171. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.js +213 -0
  172. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.d.ts +170 -0
  173. package/dist/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.js +520 -0
  174. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.d.ts +50 -0
  175. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.js +109 -0
  176. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.d.ts +93 -0
  177. package/dist/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.js +217 -0
  178. package/dist/swaps/spv_swaps/SpvFromBTCSwap.d.ts +315 -0
  179. package/dist/swaps/spv_swaps/SpvFromBTCSwap.js +1098 -0
  180. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.d.ts +125 -0
  181. package/dist/swaps/spv_swaps/SpvFromBTCWrapper.js +631 -0
  182. package/dist/swaps/trusted/ln/LnForGasSwap.d.ts +107 -0
  183. package/dist/swaps/trusted/ln/LnForGasSwap.js +343 -0
  184. package/dist/swaps/trusted/ln/LnForGasWrapper.d.ts +21 -0
  185. package/dist/swaps/trusted/ln/LnForGasWrapper.js +62 -0
  186. package/dist/swaps/trusted/onchain/OnchainForGasSwap.d.ts +164 -0
  187. package/dist/swaps/trusted/onchain/OnchainForGasSwap.js +520 -0
  188. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.d.ts +48 -0
  189. package/dist/swaps/trusted/onchain/OnchainForGasWrapper.js +74 -0
  190. package/dist/types/AmountData.d.ts +9 -0
  191. package/dist/types/AmountData.js +2 -0
  192. package/dist/types/CustomPriceFunction.d.ts +5 -0
  193. package/dist/types/CustomPriceFunction.js +2 -0
  194. package/dist/types/PriceInfoType.d.ts +28 -0
  195. package/dist/types/PriceInfoType.js +57 -0
  196. package/dist/types/SwapExecutionAction.d.ts +7 -0
  197. package/dist/types/SwapExecutionAction.js +2 -0
  198. package/dist/types/SwapWithSigner.d.ts +14 -0
  199. package/dist/types/SwapWithSigner.js +40 -0
  200. package/dist/types/Token.d.ts +53 -0
  201. package/dist/types/Token.js +58 -0
  202. package/dist/types/TokenAmount.d.ts +57 -0
  203. package/dist/types/TokenAmount.js +47 -0
  204. package/dist/types/fees/Fee.d.ts +49 -0
  205. package/dist/types/fees/Fee.js +2 -0
  206. package/dist/types/fees/FeeBreakdown.d.ts +10 -0
  207. package/dist/types/fees/FeeBreakdown.js +2 -0
  208. package/dist/types/fees/PercentagePPM.d.ts +15 -0
  209. package/dist/types/fees/PercentagePPM.js +17 -0
  210. package/dist/types/lnurl/LNURLPay.d.ts +54 -0
  211. package/dist/types/lnurl/LNURLPay.js +28 -0
  212. package/dist/types/lnurl/LNURLWithdraw.d.ts +42 -0
  213. package/dist/types/lnurl/LNURLWithdraw.js +24 -0
  214. package/dist/utils/AutomaticClockDriftCorrection.d.ts +1 -0
  215. package/dist/utils/AutomaticClockDriftCorrection.js +70 -0
  216. package/dist/utils/BitcoinUtils.d.ts +13 -0
  217. package/dist/utils/BitcoinUtils.js +98 -0
  218. package/dist/utils/BitcoinWalletUtils.d.ts +7 -0
  219. package/dist/utils/BitcoinWalletUtils.js +14 -0
  220. package/dist/utils/Logger.d.ts +7 -0
  221. package/dist/utils/Logger.js +12 -0
  222. package/dist/utils/RetryUtils.d.ts +21 -0
  223. package/dist/utils/RetryUtils.js +66 -0
  224. package/dist/utils/SwapUtils.d.ts +31 -0
  225. package/dist/utils/SwapUtils.js +18 -0
  226. package/dist/{Utils.d.ts → utils/TimeoutUtils.d.ts} +9 -3
  227. package/dist/utils/TimeoutUtils.js +55 -0
  228. package/dist/utils/TokenUtils.d.ts +11 -0
  229. package/dist/utils/TokenUtils.js +29 -0
  230. package/dist/utils/TypeUtils.d.ts +7 -0
  231. package/dist/utils/TypeUtils.js +2 -0
  232. package/dist/utils/Utils.d.ts +57 -0
  233. package/dist/utils/Utils.js +178 -0
  234. package/package.json +14 -6
  235. package/src/SmartChainAssets.ts +11 -3
  236. package/src/bitcoin/BitcoinRpcWithAddressIndex.ts +87 -0
  237. package/src/bitcoin/LightningNetworkApi.ts +16 -0
  238. package/src/bitcoin/coinselect2/accumulative.ts +68 -0
  239. package/src/bitcoin/coinselect2/blackjack.ts +49 -0
  240. package/src/bitcoin/coinselect2/index.ts +92 -0
  241. package/src/bitcoin/coinselect2/utils.ts +189 -0
  242. package/src/bitcoin/mempool/MempoolApi.ts +554 -0
  243. package/src/bitcoin/mempool/MempoolBitcoinBlock.ts +88 -0
  244. package/src/bitcoin/mempool/MempoolBitcoinRpc.ts +437 -0
  245. package/src/bitcoin/mempool/synchronizer/MempoolBtcRelaySynchronizer.ts +134 -0
  246. package/src/bitcoin/wallet/BitcoinWallet.ts +375 -0
  247. package/src/bitcoin/wallet/IBitcoinWallet.ts +44 -0
  248. package/src/bitcoin/wallet/MinimalBitcoinWalletInterface.ts +19 -0
  249. package/src/bitcoin/wallet/MinimalLightningNetworkWalletInterface.ts +7 -0
  250. package/src/bitcoin/wallet/SingleAddressBitcoinWallet.ts +108 -0
  251. package/src/enums/FeeType.ts +9 -0
  252. package/src/enums/SwapAmountType.ts +9 -0
  253. package/src/enums/SwapDirection.ts +9 -0
  254. package/src/enums/SwapType.ts +15 -0
  255. package/src/errors/IntermediaryError.ts +24 -0
  256. package/src/errors/PaymentAuthError.ts +26 -0
  257. package/src/errors/RequestError.ts +51 -0
  258. package/src/errors/UserError.ts +14 -0
  259. package/src/events/UnifiedSwapEventListener.ts +171 -0
  260. package/src/http/HttpUtils.ts +92 -0
  261. package/src/http/paramcoders/IParamReader.ts +10 -0
  262. package/src/http/paramcoders/ParamDecoder.ts +142 -0
  263. package/src/http/paramcoders/ParamEncoder.ts +37 -0
  264. package/src/http/paramcoders/SchemaVerifier.ts +153 -0
  265. package/src/http/paramcoders/client/ResponseParamDecoder.ts +58 -0
  266. package/src/http/paramcoders/client/StreamParamEncoder.ts +29 -0
  267. package/src/http/paramcoders/client/StreamingFetchPromise.ts +193 -0
  268. package/src/index.ts +102 -4
  269. package/src/intermediaries/Intermediary.ts +204 -0
  270. package/src/intermediaries/IntermediaryDiscovery.ts +485 -0
  271. package/src/intermediaries/apis/IntermediaryAPI.ts +940 -0
  272. package/src/intermediaries/apis/TrustedIntermediaryAPI.ts +257 -0
  273. package/src/lnurl/LNURL.ts +403 -0
  274. package/src/prices/RedundantSwapPrice.ts +245 -0
  275. package/src/prices/SingleSwapPrice.ts +47 -0
  276. package/src/prices/SwapPriceWithChain.ts +157 -0
  277. package/src/prices/abstract/ICachedSwapPrice.ts +86 -0
  278. package/src/prices/abstract/IPriceProvider.ts +128 -0
  279. package/src/prices/abstract/ISwapPrice.ts +328 -0
  280. package/src/prices/providers/BinancePriceProvider.ts +41 -0
  281. package/src/prices/providers/CoinGeckoPriceProvider.ts +40 -0
  282. package/src/prices/providers/CoinPaprikaPriceProvider.ts +44 -0
  283. package/src/prices/providers/CustomPriceProvider.ts +29 -0
  284. package/src/prices/providers/KrakenPriceProvider.ts +74 -0
  285. package/src/prices/providers/OKXPriceProvider.ts +53 -0
  286. package/src/prices/providers/abstract/ExchangePriceProvider.ts +29 -0
  287. package/src/prices/providers/abstract/HttpPriceProvider.ts +15 -0
  288. package/src/storage/IUnifiedStorage.ts +83 -0
  289. package/src/storage/UnifiedSwapStorage.ts +104 -0
  290. package/src/storage-browser/IndexedDBUnifiedStorage.ts +328 -0
  291. package/src/{storage → storage-browser}/LocalStorageManager.ts +2 -1
  292. package/src/swapper/Swapper.ts +2107 -0
  293. package/src/{SwapperFactory.ts → swapper/SwapperFactory.ts} +113 -72
  294. package/src/swapper/SwapperUtils.ts +510 -0
  295. package/src/swapper/SwapperWithChain.ts +464 -0
  296. package/src/swapper/SwapperWithSigner.ts +300 -0
  297. package/src/swaps/IAddressSwap.ts +20 -0
  298. package/src/swaps/IBTCWalletSwap.ts +77 -0
  299. package/src/swaps/IClaimableSwap.ts +30 -0
  300. package/src/swaps/IClaimableSwapWrapper.ts +9 -0
  301. package/src/swaps/IRefundableSwap.ts +29 -0
  302. package/src/swaps/ISwap.ts +490 -0
  303. package/src/swaps/ISwapWithGasDrop.ts +19 -0
  304. package/src/swaps/ISwapWrapper.ts +344 -0
  305. package/src/swaps/escrow_swaps/IEscrowSelfInitSwap.ts +168 -0
  306. package/src/swaps/escrow_swaps/IEscrowSwap.ts +197 -0
  307. package/src/swaps/escrow_swaps/IEscrowSwapWrapper.ts +210 -0
  308. package/src/swaps/escrow_swaps/frombtc/IFromBTCLNWrapper.ts +150 -0
  309. package/src/swaps/escrow_swaps/frombtc/IFromBTCSelfInitSwap.ts +219 -0
  310. package/src/swaps/escrow_swaps/frombtc/IFromBTCWrapper.ts +84 -0
  311. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNSwap.ts +1082 -0
  312. package/src/swaps/escrow_swaps/frombtc/ln/FromBTCLNWrapper.ts +429 -0
  313. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoSwap.ts +1078 -0
  314. package/src/swaps/escrow_swaps/frombtc/ln_auto/FromBTCLNAutoWrapper.ts +549 -0
  315. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCSwap.ts +974 -0
  316. package/src/swaps/escrow_swaps/frombtc/onchain/FromBTCWrapper.ts +443 -0
  317. package/src/swaps/escrow_swaps/tobtc/IToBTCSwap.ts +860 -0
  318. package/src/swaps/escrow_swaps/tobtc/IToBTCWrapper.ts +104 -0
  319. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNSwap.ts +256 -0
  320. package/src/swaps/escrow_swaps/tobtc/ln/ToBTCLNWrapper.ts +716 -0
  321. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCSwap.ts +151 -0
  322. package/src/swaps/escrow_swaps/tobtc/onchain/ToBTCWrapper.ts +299 -0
  323. package/src/swaps/spv_swaps/SpvFromBTCSwap.ts +1394 -0
  324. package/src/swaps/spv_swaps/SpvFromBTCWrapper.ts +796 -0
  325. package/src/swaps/trusted/ln/LnForGasSwap.ts +402 -0
  326. package/src/swaps/trusted/ln/LnForGasWrapper.ts +70 -0
  327. package/src/swaps/trusted/onchain/OnchainForGasSwap.ts +633 -0
  328. package/src/swaps/trusted/onchain/OnchainForGasWrapper.ts +110 -0
  329. package/src/types/AmountData.ts +9 -0
  330. package/src/types/CustomPriceFunction.ts +5 -0
  331. package/src/types/PriceInfoType.ts +67 -0
  332. package/src/types/SwapExecutionAction.ts +8 -0
  333. package/src/types/SwapWithSigner.ts +57 -0
  334. package/src/types/Token.ts +90 -0
  335. package/src/types/TokenAmount.ts +110 -0
  336. package/src/types/fees/Fee.ts +55 -0
  337. package/src/types/fees/FeeBreakdown.ts +11 -0
  338. package/src/types/fees/PercentagePPM.ts +24 -0
  339. package/src/types/lnurl/LNURLPay.ts +72 -0
  340. package/src/types/lnurl/LNURLWithdraw.ts +55 -0
  341. package/src/utils/AutomaticClockDriftCorrection.ts +71 -0
  342. package/src/utils/BitcoinUtils.ts +86 -0
  343. package/src/utils/BitcoinWalletUtils.ts +16 -0
  344. package/src/utils/Logger.ts +15 -0
  345. package/src/utils/RetryUtils.ts +71 -0
  346. package/src/utils/SwapUtils.ts +38 -0
  347. package/src/utils/TimeoutUtils.ts +50 -0
  348. package/src/utils/TokenUtils.ts +25 -0
  349. package/src/utils/TypeUtils.ts +9 -0
  350. package/src/utils/Utils.ts +182 -0
  351. package/dist/SwapperFactory.d.ts +0 -52
  352. package/dist/Utils.js +0 -37
  353. package/dist/fs-storage/FileSystemStorageManager.d.ts +0 -15
  354. package/dist/fs-storage/FileSystemStorageManager.js +0 -60
  355. package/dist/fs-storage/index.d.ts +0 -1
  356. package/dist/fs-storage/index.js +0 -17
  357. package/src/SmartChainAssets.js +0 -75
  358. package/src/SwapperFactory.js +0 -120
  359. package/src/Utils.js +0 -37
  360. package/src/Utils.ts +0 -31
  361. package/src/fs-storage/FileSystemStorageManager.ts +0 -71
  362. package/src/fs-storage/index.ts +0 -1
  363. package/src/index.js +0 -21
  364. package/src/storage/LocalStorageManager.js +0 -72
@@ -0,0 +1,321 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LNURL = exports.isLNURLPaySuccessAction = void 0;
4
+ const RequestError_1 = require("../errors/RequestError");
5
+ const bolt11_1 = require("@atomiqlabs/bolt11");
6
+ const UserError_1 = require("../errors/UserError");
7
+ const base_1 = require("@scure/base");
8
+ const aes_1 = require("@noble/ciphers/aes");
9
+ const buffer_1 = require("buffer");
10
+ const sha2_1 = require("@noble/hashes/sha2");
11
+ const HttpUtils_1 = require("../http/HttpUtils");
12
+ const LNURLWithdraw_1 = require("../types/lnurl/LNURLWithdraw");
13
+ const LNURLPay_1 = require("../types/lnurl/LNURLPay");
14
+ const RetryUtils_1 = require("../utils/RetryUtils");
15
+ function isLNURLError(obj) {
16
+ return obj.status === "ERROR" &&
17
+ (obj.reason == null || typeof obj.reason === "string");
18
+ }
19
+ function isLNURLPayResult(obj, domain) {
20
+ return typeof obj.pr === "string" &&
21
+ (obj.routes == null || Array.isArray(obj.routes)) &&
22
+ (obj.disposable === null || obj.disposable === undefined || typeof obj.disposable === "boolean") &&
23
+ (obj.successAction == null || isLNURLPaySuccessAction(obj.successAction, domain));
24
+ }
25
+ function isLNURLPaySuccessAction(obj, domain) {
26
+ if (obj == null || typeof obj !== 'object' || typeof obj.tag !== 'string')
27
+ return false;
28
+ switch (obj.tag) {
29
+ case "message":
30
+ return obj.message != null && obj.message.length <= 144;
31
+ case "url":
32
+ return obj.description != null && obj.description.length <= 144 &&
33
+ obj.url != null &&
34
+ (domain == null || new URL(obj.url).hostname === domain);
35
+ case "aes":
36
+ return obj.description != null && obj.description.length <= 144 &&
37
+ obj.ciphertext != null && obj.ciphertext.length <= 4096 && BASE64_REGEX.test(obj.ciphertext) &&
38
+ obj.iv != null && obj.iv.length <= 24 && BASE64_REGEX.test(obj.iv);
39
+ default:
40
+ //Unsupported action
41
+ return false;
42
+ }
43
+ }
44
+ exports.isLNURLPaySuccessAction = isLNURLPaySuccessAction;
45
+ const BASE64_REGEX = /^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/;
46
+ const MAIL_REGEX = /(?:[A-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[A-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[A-z0-9](?:[A-z0-9-]*[A-z0-9])?\.)+[A-z0-9](?:[A-z0-9-]*[A-z0-9])?|\[(?:(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9]))\.){3}(?:(2(5[0-5]|[0-4][0-9])|1[0-9][0-9]|[1-9]?[0-9])|[A-z0-9-]*[A-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])/;
47
+ /**
48
+ * LNURL encoding/decoding and callback handling
49
+ * @category Bitcoin
50
+ */
51
+ class LNURL {
52
+ static findBech32LNURL(str) {
53
+ const arr = /,*?((lnurl)([0-9]{1,}[a-z0-9]+){1})/.exec(str.toLowerCase());
54
+ if (arr == null)
55
+ return null;
56
+ return arr[1];
57
+ }
58
+ static isBech32LNURL(str) {
59
+ return this.findBech32LNURL(str) != null;
60
+ }
61
+ /**
62
+ * Checks whether a provided string is bare (non bech32 encoded) lnurl
63
+ * @param str
64
+ * @private
65
+ */
66
+ static isBareLNURL(str) {
67
+ try {
68
+ return str.startsWith("lnurlw://") || str.startsWith("lnurlp://");
69
+ }
70
+ catch (e) { }
71
+ return false;
72
+ }
73
+ /**
74
+ * Checks if the provided string is a lightning network address (e.g. satoshi@nakamoto.com)
75
+ * @param str
76
+ * @private
77
+ */
78
+ static isLightningAddress(str) {
79
+ return MAIL_REGEX.test(str);
80
+ }
81
+ /**
82
+ * Checks whether a given string is a LNURL or lightning address
83
+ * @param str
84
+ */
85
+ static isLNURL(str) {
86
+ return LNURL.isBech32LNURL(str) || LNURL.isLightningAddress(str) || LNURL.isBareLNURL(str);
87
+ }
88
+ /**
89
+ * Extracts the URL that needs to be request from LNURL or lightning address
90
+ * @param str
91
+ * @private
92
+ * @returns An URL to send the request to, or null if it cannot be parsed
93
+ */
94
+ static extractCallUrl(str) {
95
+ if (MAIL_REGEX.test(str)) {
96
+ //lightning e-mail like address
97
+ const arr = str.split("@");
98
+ const username = arr[0];
99
+ const domain = arr[1];
100
+ let scheme = "https";
101
+ if (domain.endsWith(".onion")) {
102
+ scheme = "http";
103
+ }
104
+ return scheme + "://" + domain + "/.well-known/lnurlp/" + username;
105
+ }
106
+ else if (LNURL.isBareLNURL(str)) {
107
+ //non-bech32m encoded lnurl
108
+ const data = str.substring("lnurlw://".length);
109
+ const httpUrl = new URL("http://" + data);
110
+ let scheme = "https";
111
+ if (httpUrl.hostname.endsWith(".onion")) {
112
+ scheme = "http";
113
+ }
114
+ return scheme + "://" + data;
115
+ }
116
+ else {
117
+ const lnurl = LNURL.findBech32LNURL(str);
118
+ if (lnurl != null) {
119
+ let { prefix: hrp, words: dataPart } = base_1.bech32.decode(lnurl, 2000);
120
+ let requestByteArray = base_1.bech32.fromWords(dataPart);
121
+ return buffer_1.Buffer.from(requestByteArray).toString();
122
+ }
123
+ }
124
+ return null;
125
+ }
126
+ /**
127
+ * Sends a request to obtain data about a specific LNURL or lightning address
128
+ *
129
+ * @param str A lnurl or lightning address
130
+ * @param shouldRetry Whether we should retry in case of network failure
131
+ * @param timeout Request timeout in milliseconds
132
+ * @param abortSignal
133
+ */
134
+ static async getLNURL(str, shouldRetry = true, timeout, abortSignal) {
135
+ if (shouldRetry == null)
136
+ shouldRetry = true;
137
+ const url = LNURL.extractCallUrl(str);
138
+ if (url == null)
139
+ return null;
140
+ const sendRequest = () => (0, HttpUtils_1.httpGet)(url, timeout, abortSignal, true);
141
+ let response = shouldRetry ?
142
+ await (0, RetryUtils_1.tryWithRetries)(sendRequest, undefined, RequestError_1.RequestError, abortSignal) :
143
+ await sendRequest();
144
+ if (isLNURLError(response))
145
+ return null;
146
+ if (response.tag === "payRequest")
147
+ try {
148
+ response.decodedMetadata = JSON.parse(response.metadata);
149
+ }
150
+ catch (err) {
151
+ response.decodedMetadata = [];
152
+ }
153
+ if (!(0, LNURLPay_1.isLNURLPayParams)(response) && !(0, LNURLWithdraw_1.isLNURLWithdrawParams)(response))
154
+ return null;
155
+ return {
156
+ ...response,
157
+ url: str
158
+ };
159
+ }
160
+ /**
161
+ * Sends a request to obtain data about a specific LNURL or lightning address
162
+ *
163
+ * @param str A lnurl or lightning address
164
+ * @param shouldRetry Whether we should retry in case of network failure
165
+ * @param timeout Request timeout in milliseconds
166
+ * @param abortSignal
167
+ */
168
+ static async getLNURLType(str, shouldRetry, timeout, abortSignal) {
169
+ let res = await LNURL.getLNURL(str, shouldRetry, timeout, abortSignal);
170
+ if (res.tag === "payRequest") {
171
+ const payRequest = res;
172
+ let shortDescription = undefined;
173
+ let longDescription = undefined;
174
+ let icon = undefined;
175
+ payRequest.decodedMetadata.forEach(data => {
176
+ switch (data[0]) {
177
+ case "text/plain":
178
+ shortDescription = data[1];
179
+ break;
180
+ case "text/long-desc":
181
+ longDescription = data[1];
182
+ break;
183
+ case "image/png;base64":
184
+ icon = "data:" + data[0] + "," + data[1];
185
+ break;
186
+ case "image/jpeg;base64":
187
+ icon = "data:" + data[0] + "," + data[1];
188
+ break;
189
+ }
190
+ });
191
+ return {
192
+ type: "pay",
193
+ min: BigInt(payRequest.minSendable) / 1000n,
194
+ max: BigInt(payRequest.maxSendable) / 1000n,
195
+ commentMaxLength: payRequest.commentAllowed || 0,
196
+ shortDescription,
197
+ longDescription,
198
+ icon,
199
+ params: payRequest
200
+ };
201
+ }
202
+ if (res.tag === "withdrawRequest") {
203
+ const payRequest = res;
204
+ return {
205
+ type: "withdraw",
206
+ min: BigInt(payRequest.minWithdrawable) / 1000n,
207
+ max: BigInt(payRequest.maxWithdrawable) / 1000n,
208
+ params: payRequest
209
+ };
210
+ }
211
+ return null;
212
+ }
213
+ /**
214
+ * Uses a LNURL-pay request by obtaining a lightning network invoice from it
215
+ *
216
+ * @param payRequest LNURL params as returned from the getLNURL call
217
+ * @param amount Amount of sats (BTC) to pay
218
+ * @param comment Optional comment for the payment request
219
+ * @param timeout Request timeout in milliseconds
220
+ * @param abortSignal
221
+ * @throws {RequestError} If the response is non-200, status: ERROR, or invalid format
222
+ */
223
+ static async useLNURLPay(payRequest, amount, comment, timeout, abortSignal) {
224
+ const params = ["amount=" + (amount * 1000n).toString(10)];
225
+ if (comment != null) {
226
+ params.push("comment=" + encodeURIComponent(comment));
227
+ }
228
+ const queryParams = (payRequest.callback.includes("?") ? "&" : "?") + params.join("&");
229
+ const response = await (0, RetryUtils_1.tryWithRetries)(() => (0, HttpUtils_1.httpGet)(payRequest.callback + queryParams, timeout, abortSignal, true), undefined, RequestError_1.RequestError, abortSignal);
230
+ if (isLNURLError(response))
231
+ throw new RequestError_1.RequestError("LNURL callback error: " + response.reason, 200);
232
+ if (!isLNURLPayResult(response))
233
+ throw new RequestError_1.RequestError("Invalid LNURL response!", 200);
234
+ const parsedPR = (0, bolt11_1.decode)(response.pr);
235
+ const descHash = buffer_1.Buffer.from((0, sha2_1.sha256)(payRequest.metadata)).toString("hex");
236
+ if (parsedPR.tagsObject.purpose_commit_hash !== descHash)
237
+ throw new RequestError_1.RequestError("Invalid invoice received (description hash)!", 200);
238
+ const msats = parsedPR.millisatoshis;
239
+ if (msats == null)
240
+ throw new RequestError_1.RequestError("Invalid invoice received (amount msats not defined)", 200);
241
+ const invoiceMSats = BigInt(msats);
242
+ if (invoiceMSats !== (amount * 1000n))
243
+ throw new RequestError_1.RequestError("Invalid invoice received (amount)!", 200);
244
+ return {
245
+ invoice: response.pr,
246
+ parsedInvoice: parsedPR,
247
+ successAction: response.successAction ?? undefined
248
+ };
249
+ }
250
+ /**
251
+ * Submits the bolt11 lightning invoice to the lnurl withdraw url
252
+ *
253
+ * @param withdrawRequest Withdraw request to use
254
+ * @param withdrawRequest.k1 K1 parameter
255
+ * @param withdrawRequest.callback A URL to call
256
+ * @param lnpr bolt11 lightning network invoice to submit to the withdrawal endpoint
257
+ * @throws {RequestError} If the response is non-200 or status: ERROR
258
+ */
259
+ static async postInvoiceToLNURLWithdraw(withdrawRequest, lnpr) {
260
+ const params = [
261
+ "pr=" + lnpr,
262
+ "k1=" + withdrawRequest.k1
263
+ ];
264
+ const queryParams = (withdrawRequest.callback.includes("?") ? "&" : "?") + params.join("&");
265
+ const response = await (0, RetryUtils_1.tryWithRetries)(() => (0, HttpUtils_1.httpGet)(withdrawRequest.callback + queryParams, undefined, undefined, true), undefined, RequestError_1.RequestError);
266
+ if (isLNURLError(response))
267
+ throw new RequestError_1.RequestError("LNURL callback error: " + response.reason, 200);
268
+ }
269
+ /**
270
+ * Uses a LNURL-withdraw request by submitting a lightning network invoice to it
271
+ *
272
+ * @param withdrawRequest Withdrawal request as returned from getLNURL call
273
+ * @param lnpr bolt11 lightning network invoice to submit to the withdrawal endpoint
274
+ * @throws {UserError} In case the provided bolt11 lightning invoice has an amount that is out of bounds for
275
+ * the specified LNURL-withdraw request
276
+ */
277
+ static async useLNURLWithdraw(withdrawRequest, lnpr) {
278
+ const min = BigInt(withdrawRequest.minWithdrawable) / 1000n;
279
+ const max = BigInt(withdrawRequest.maxWithdrawable) / 1000n;
280
+ const parsedPR = (0, bolt11_1.decode)(lnpr);
281
+ const msats = parsedPR.millisatoshis;
282
+ if (msats == null)
283
+ throw new UserError_1.UserError("Invoice without msats value field!");
284
+ const amount = (BigInt(msats) + 999n) / 1000n;
285
+ if (amount < min)
286
+ throw new UserError_1.UserError("Invoice amount less than minimum LNURL-withdraw limit");
287
+ if (amount > max)
288
+ throw new UserError_1.UserError("Invoice amount more than maximum LNURL-withdraw limit");
289
+ return await LNURL.postInvoiceToLNURLWithdraw(withdrawRequest, lnpr);
290
+ }
291
+ static decodeSuccessAction(successAction, secret) {
292
+ if (secret == null)
293
+ return null;
294
+ if (successAction == null)
295
+ return null;
296
+ if (successAction.tag === "message" && successAction.message != null) {
297
+ return {
298
+ description: successAction.message
299
+ };
300
+ }
301
+ if (successAction.tag === "url" && successAction.description != null && successAction.url != null) {
302
+ return {
303
+ description: successAction.description,
304
+ url: successAction.url
305
+ };
306
+ }
307
+ if (successAction.tag === "aes" && successAction.iv != null && successAction.ciphertext != null && successAction.description != null) {
308
+ const CBC = (0, aes_1.cbc)(buffer_1.Buffer.from(secret, "hex"), buffer_1.Buffer.from(successAction.iv, "hex"));
309
+ let plaintext = CBC.decrypt(buffer_1.Buffer.from(successAction.ciphertext, "base64"));
310
+ // remove padding
311
+ const size = plaintext.length;
312
+ const pad = plaintext[size - 1];
313
+ return {
314
+ description: successAction.description,
315
+ text: buffer_1.Buffer.from(plaintext).toString("utf8", 0, size - pad)
316
+ };
317
+ }
318
+ return null;
319
+ }
320
+ }
321
+ exports.LNURL = LNURL;
@@ -0,0 +1,89 @@
1
+ import { IPriceProvider } from "./abstract/IPriceProvider";
2
+ import { ICachedSwapPrice } from "./abstract/ICachedSwapPrice";
3
+ import { ChainIds, MultiChain } from "../swapper/Swapper";
4
+ /**
5
+ * Asset configuration for redundant swap pricing
6
+ * @category Pricing and LPs
7
+ */
8
+ export type RedundantSwapPriceAssets<T extends MultiChain> = {
9
+ binancePair?: string;
10
+ okxPair?: string;
11
+ coinGeckoCoinId?: string;
12
+ coinPaprikaCoinId?: string;
13
+ krakenPair?: string;
14
+ chains: {
15
+ [chainIdentifier in keyof T]?: {
16
+ address: string;
17
+ decimals: number;
18
+ };
19
+ };
20
+ }[];
21
+ export type CtorCoinDecimals<T extends MultiChain> = {
22
+ chains: {
23
+ [chainIdentifier in keyof T]?: {
24
+ address: string;
25
+ decimals: number;
26
+ };
27
+ };
28
+ }[];
29
+ type CoinDecimals<T extends MultiChain> = {
30
+ [chainIdentifier in keyof T]?: {
31
+ [tokenAddress: string]: number;
32
+ };
33
+ };
34
+ /**
35
+ * Swap price API using multiple price sources, handles errors on the APIs and automatically switches between them, such
36
+ * that there always is a functional API
37
+ * @category Pricing and LPs
38
+ */
39
+ export declare class RedundantSwapPrice<T extends MultiChain> extends ICachedSwapPrice<T> {
40
+ static createFromTokenMap<T extends MultiChain>(maxAllowedFeeDiffPPM: bigint, assets: RedundantSwapPriceAssets<T>, cacheTimeout?: number): RedundantSwapPrice<T>;
41
+ coinsDecimals: CoinDecimals<T>;
42
+ priceApis: {
43
+ priceApi: IPriceProvider<T>;
44
+ operational?: boolean;
45
+ }[];
46
+ constructor(maxAllowedFeeDiffPPM: bigint, coinsDecimals: CtorCoinDecimals<T>, priceApis: IPriceProvider<T>[], cacheTimeout?: number);
47
+ /**
48
+ * Returns price api that should be operational
49
+ *
50
+ * @private
51
+ */
52
+ private getOperationalPriceApi;
53
+ /**
54
+ * Returns price apis that are maybe operational, in case none is considered operational returns all of the price
55
+ * apis such that they can be tested again whether they are operational
56
+ *
57
+ * @private
58
+ */
59
+ private getMaybeOperationalPriceApis;
60
+ /**
61
+ * Fetches price in parallel from multiple maybe operational price APIs
62
+ *
63
+ * @param chainIdentifier
64
+ * @param token
65
+ * @param abortSignal
66
+ * @private
67
+ */
68
+ private fetchPriceFromMaybeOperationalPriceApis;
69
+ /**
70
+ * Fetches the prices, first tries to use the operational price API (if any) and if that fails it falls back
71
+ * to using maybe operational price APIs
72
+ *
73
+ * @param chainIdentifier
74
+ * @param token
75
+ * @param abortSignal
76
+ * @private
77
+ */
78
+ protected fetchPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint>;
79
+ protected getDecimals<C extends ChainIds<T>>(chainIdentifier: C, token: string): number | null;
80
+ /**
81
+ * Fetches BTC price in USD in parallel from multiple maybe operational price APIs
82
+ *
83
+ * @param abortSignal
84
+ * @private
85
+ */
86
+ private fetchUsdPriceFromMaybeOperationalPriceApis;
87
+ protected fetchUsdPrice(abortSignal?: AbortSignal): Promise<number>;
88
+ }
89
+ export {};
@@ -0,0 +1,202 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RedundantSwapPrice = void 0;
4
+ const BinancePriceProvider_1 = require("./providers/BinancePriceProvider");
5
+ const OKXPriceProvider_1 = require("./providers/OKXPriceProvider");
6
+ const CoinGeckoPriceProvider_1 = require("./providers/CoinGeckoPriceProvider");
7
+ const CoinPaprikaPriceProvider_1 = require("./providers/CoinPaprikaPriceProvider");
8
+ const Utils_1 = require("../utils/Utils");
9
+ const ICachedSwapPrice_1 = require("./abstract/ICachedSwapPrice");
10
+ const RequestError_1 = require("../errors/RequestError");
11
+ const KrakenPriceProvider_1 = require("./providers/KrakenPriceProvider");
12
+ const Logger_1 = require("../utils/Logger");
13
+ const RetryUtils_1 = require("../utils/RetryUtils");
14
+ const logger = (0, Logger_1.getLogger)("RedundantSwapPrice: ");
15
+ /**
16
+ * Swap price API using multiple price sources, handles errors on the APIs and automatically switches between them, such
17
+ * that there always is a functional API
18
+ * @category Pricing and LPs
19
+ */
20
+ class RedundantSwapPrice extends ICachedSwapPrice_1.ICachedSwapPrice {
21
+ static createFromTokenMap(maxAllowedFeeDiffPPM, assets, cacheTimeout) {
22
+ const priceApis = [
23
+ new BinancePriceProvider_1.BinancePriceProvider(assets.map(coinData => {
24
+ return {
25
+ coinId: coinData.binancePair,
26
+ chains: coinData.chains
27
+ };
28
+ })),
29
+ new OKXPriceProvider_1.OKXPriceProvider(assets.map(coinData => {
30
+ return {
31
+ coinId: coinData.okxPair,
32
+ chains: coinData.chains
33
+ };
34
+ })),
35
+ new CoinGeckoPriceProvider_1.CoinGeckoPriceProvider(assets.map(coinData => {
36
+ return {
37
+ coinId: coinData.coinGeckoCoinId,
38
+ chains: coinData.chains
39
+ };
40
+ })),
41
+ new CoinPaprikaPriceProvider_1.CoinPaprikaPriceProvider(assets.map(coinData => {
42
+ return {
43
+ coinId: coinData.coinPaprikaCoinId,
44
+ chains: coinData.chains
45
+ };
46
+ })),
47
+ new KrakenPriceProvider_1.KrakenPriceProvider(assets.map(coinData => {
48
+ return {
49
+ coinId: coinData.krakenPair,
50
+ chains: coinData.chains
51
+ };
52
+ }))
53
+ ];
54
+ return new RedundantSwapPrice(maxAllowedFeeDiffPPM, assets, priceApis, cacheTimeout);
55
+ }
56
+ constructor(maxAllowedFeeDiffPPM, coinsDecimals, priceApis, cacheTimeout) {
57
+ super(maxAllowedFeeDiffPPM, cacheTimeout);
58
+ this.coinsDecimals = {};
59
+ for (let coinData of coinsDecimals) {
60
+ for (let chainId in coinData.chains) {
61
+ const { address, decimals } = coinData.chains[chainId];
62
+ this.coinsDecimals[chainId] ??= {};
63
+ this.coinsDecimals[chainId][address.toString()] = decimals;
64
+ }
65
+ }
66
+ this.priceApis = priceApis.map(api => {
67
+ return {
68
+ priceApi: api
69
+ };
70
+ });
71
+ }
72
+ /**
73
+ * Returns price api that should be operational
74
+ *
75
+ * @private
76
+ */
77
+ getOperationalPriceApi() {
78
+ return this.priceApis.find(e => e.operational === true);
79
+ }
80
+ /**
81
+ * Returns price apis that are maybe operational, in case none is considered operational returns all of the price
82
+ * apis such that they can be tested again whether they are operational
83
+ *
84
+ * @private
85
+ */
86
+ getMaybeOperationalPriceApis() {
87
+ let operational = this.priceApis.filter(e => e.operational === true || e.operational === undefined);
88
+ if (operational.length === 0) {
89
+ this.priceApis.forEach(e => e.operational = undefined);
90
+ operational = this.priceApis;
91
+ }
92
+ return operational;
93
+ }
94
+ /**
95
+ * Fetches price in parallel from multiple maybe operational price APIs
96
+ *
97
+ * @param chainIdentifier
98
+ * @param token
99
+ * @param abortSignal
100
+ * @private
101
+ */
102
+ async fetchPriceFromMaybeOperationalPriceApis(chainIdentifier, token, abortSignal) {
103
+ try {
104
+ return await (0, Utils_1.promiseAny)(this.getMaybeOperationalPriceApis().map(obj => (async () => {
105
+ try {
106
+ const price = await obj.priceApi.getPrice(chainIdentifier, token, abortSignal);
107
+ logger.debug("fetchPrice(): Price from " + obj.priceApi.constructor.name + ": ", price.toString(10));
108
+ obj.operational = true;
109
+ return price;
110
+ }
111
+ catch (e) {
112
+ if (abortSignal != null)
113
+ abortSignal.throwIfAborted();
114
+ obj.operational = false;
115
+ throw e;
116
+ }
117
+ })()));
118
+ }
119
+ catch (_e) {
120
+ const e = _e;
121
+ if (abortSignal != null)
122
+ abortSignal.throwIfAborted();
123
+ throw e.find(err => !(err instanceof RequestError_1.RequestError)) || e[0];
124
+ }
125
+ }
126
+ /**
127
+ * Fetches the prices, first tries to use the operational price API (if any) and if that fails it falls back
128
+ * to using maybe operational price APIs
129
+ *
130
+ * @param chainIdentifier
131
+ * @param token
132
+ * @param abortSignal
133
+ * @private
134
+ */
135
+ fetchPrice(chainIdentifier, token, abortSignal) {
136
+ return (0, RetryUtils_1.tryWithRetries)(async () => {
137
+ const operationalPriceApi = this.getOperationalPriceApi();
138
+ if (operationalPriceApi != null) {
139
+ try {
140
+ return await operationalPriceApi.priceApi.getPrice(chainIdentifier, token, abortSignal);
141
+ }
142
+ catch (err) {
143
+ if (abortSignal != null)
144
+ abortSignal.throwIfAborted();
145
+ operationalPriceApi.operational = false;
146
+ return await this.fetchPriceFromMaybeOperationalPriceApis(chainIdentifier, token, abortSignal);
147
+ }
148
+ }
149
+ return await this.fetchPriceFromMaybeOperationalPriceApis(chainIdentifier, token, abortSignal);
150
+ }, undefined, RequestError_1.RequestError, abortSignal);
151
+ }
152
+ getDecimals(chainIdentifier, token) {
153
+ if (this.coinsDecimals[chainIdentifier] == null)
154
+ return null;
155
+ return this.coinsDecimals[chainIdentifier]?.[token.toString()] ?? null;
156
+ }
157
+ /**
158
+ * Fetches BTC price in USD in parallel from multiple maybe operational price APIs
159
+ *
160
+ * @param abortSignal
161
+ * @private
162
+ */
163
+ async fetchUsdPriceFromMaybeOperationalPriceApis(abortSignal) {
164
+ try {
165
+ return await (0, Utils_1.promiseAny)(this.getMaybeOperationalPriceApis().map(obj => (async () => {
166
+ try {
167
+ const price = await obj.priceApi.getUsdPrice(abortSignal);
168
+ logger.debug("fetchPrice(): USD price from " + obj.priceApi.constructor.name + ": ", price.toString(10));
169
+ obj.operational = true;
170
+ return price;
171
+ }
172
+ catch (e) {
173
+ if (abortSignal != null)
174
+ abortSignal.throwIfAborted();
175
+ obj.operational = false;
176
+ throw e;
177
+ }
178
+ })()));
179
+ }
180
+ catch (_e) {
181
+ const e = _e;
182
+ if (abortSignal != null)
183
+ abortSignal.throwIfAborted();
184
+ throw e.find(err => !(err instanceof RequestError_1.RequestError)) || e[0];
185
+ }
186
+ }
187
+ fetchUsdPrice(abortSignal) {
188
+ return (0, RetryUtils_1.tryWithRetries)(() => {
189
+ const operationalPriceApi = this.getOperationalPriceApi();
190
+ if (operationalPriceApi != null) {
191
+ return operationalPriceApi.priceApi.getUsdPrice(abortSignal).catch(err => {
192
+ if (abortSignal != null)
193
+ abortSignal.throwIfAborted();
194
+ operationalPriceApi.operational = false;
195
+ return this.fetchUsdPriceFromMaybeOperationalPriceApis(abortSignal);
196
+ });
197
+ }
198
+ return this.fetchUsdPriceFromMaybeOperationalPriceApis(abortSignal);
199
+ }, undefined, RequestError_1.RequestError, abortSignal);
200
+ }
201
+ }
202
+ exports.RedundantSwapPrice = RedundantSwapPrice;
@@ -0,0 +1,31 @@
1
+ import { IPriceProvider } from "./abstract/IPriceProvider";
2
+ import { ICachedSwapPrice } from "./abstract/ICachedSwapPrice";
3
+ import { ChainIds, MultiChain } from "../swapper/Swapper";
4
+ /**
5
+ * Swap price API using single price source
6
+ * @category Pricing and LPs
7
+ */
8
+ export declare class SingleSwapPrice<T extends MultiChain> extends ICachedSwapPrice<T> {
9
+ priceProvider: IPriceProvider<T>;
10
+ constructor(maxAllowedFeeDiffPPM: bigint, priceProvider: IPriceProvider<T>, cacheTimeout?: number);
11
+ /**
12
+ * Fetch price in uSats (micro sats) for a given token against BTC
13
+ *
14
+ * @param chainIdentifier
15
+ * @param token
16
+ * @param abortSignal
17
+ * @protected
18
+ * @returns token price in uSats (micro sats)
19
+ */
20
+ protected fetchPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint>;
21
+ /**
22
+ * Returns the decimal places of the specified token, or -1 if token should be ignored, returns null if
23
+ * token is not found
24
+ *
25
+ * @param chainIdentifier
26
+ * @param token
27
+ * @protected
28
+ */
29
+ protected getDecimals<C extends ChainIds<T>>(chainIdentifier: C, token: string): number | null;
30
+ protected fetchUsdPrice(abortSignal?: AbortSignal): Promise<number>;
31
+ }
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SingleSwapPrice = void 0;
4
+ const ICachedSwapPrice_1 = require("./abstract/ICachedSwapPrice");
5
+ /**
6
+ * Swap price API using single price source
7
+ * @category Pricing and LPs
8
+ */
9
+ class SingleSwapPrice extends ICachedSwapPrice_1.ICachedSwapPrice {
10
+ constructor(maxAllowedFeeDiffPPM, priceProvider, cacheTimeout) {
11
+ super(maxAllowedFeeDiffPPM, cacheTimeout);
12
+ this.priceProvider = priceProvider;
13
+ }
14
+ /**
15
+ * Fetch price in uSats (micro sats) for a given token against BTC
16
+ *
17
+ * @param chainIdentifier
18
+ * @param token
19
+ * @param abortSignal
20
+ * @protected
21
+ * @returns token price in uSats (micro sats)
22
+ */
23
+ fetchPrice(chainIdentifier, token, abortSignal) {
24
+ return this.priceProvider.getPrice(chainIdentifier, token, abortSignal);
25
+ }
26
+ /**
27
+ * Returns the decimal places of the specified token, or -1 if token should be ignored, returns null if
28
+ * token is not found
29
+ *
30
+ * @param chainIdentifier
31
+ * @param token
32
+ * @protected
33
+ */
34
+ getDecimals(chainIdentifier, token) {
35
+ return this.priceProvider.getDecimals(chainIdentifier, token.toString());
36
+ }
37
+ fetchUsdPrice(abortSignal) {
38
+ return this.priceProvider.getUsdPrice(abortSignal);
39
+ }
40
+ }
41
+ exports.SingleSwapPrice = SingleSwapPrice;