@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,245 @@
1
+ import {IPriceProvider} from "./abstract/IPriceProvider";
2
+ import {BinancePriceProvider} from "./providers/BinancePriceProvider";
3
+ import {OKXPriceProvider} from "./providers/OKXPriceProvider";
4
+ import {CoinGeckoPriceProvider} from "./providers/CoinGeckoPriceProvider";
5
+ import {CoinPaprikaPriceProvider} from "./providers/CoinPaprikaPriceProvider";
6
+ import {promiseAny} from "../utils/Utils";
7
+ import {ICachedSwapPrice} from "./abstract/ICachedSwapPrice";
8
+ import {RequestError} from "../errors/RequestError";
9
+ import {ChainIds, MultiChain} from "../swapper/Swapper";
10
+ import {KrakenPriceProvider} from "./providers/KrakenPriceProvider";
11
+ import {getLogger} from "../utils/Logger";
12
+ import {tryWithRetries} from "../utils/RetryUtils";
13
+
14
+ /**
15
+ * Asset configuration for redundant swap pricing
16
+ * @category Pricing and LPs
17
+ */
18
+ export type RedundantSwapPriceAssets<T extends MultiChain> = {
19
+ binancePair?: string,
20
+ okxPair?: string,
21
+ coinGeckoCoinId?: string,
22
+ coinPaprikaCoinId?: string,
23
+ krakenPair?: string,
24
+ chains: {
25
+ [chainIdentifier in keyof T]?: {
26
+ address: string,
27
+ decimals: number
28
+ }
29
+ }
30
+ }[];
31
+
32
+ export type CtorCoinDecimals<T extends MultiChain> = {
33
+ chains: {
34
+ [chainIdentifier in keyof T]?: {
35
+ address: string,
36
+ decimals: number
37
+ }
38
+ }
39
+ }[];
40
+
41
+ type CoinDecimals<T extends MultiChain> = {
42
+ [chainIdentifier in keyof T]?: {
43
+ [tokenAddress: string]: number
44
+ }
45
+ };
46
+
47
+ const logger = getLogger("RedundantSwapPrice: ");
48
+
49
+ /**
50
+ * Swap price API using multiple price sources, handles errors on the APIs and automatically switches between them, such
51
+ * that there always is a functional API
52
+ * @category Pricing and LPs
53
+ */
54
+ export class RedundantSwapPrice<T extends MultiChain> extends ICachedSwapPrice<T> {
55
+
56
+ static createFromTokenMap<T extends MultiChain>(maxAllowedFeeDiffPPM: bigint, assets: RedundantSwapPriceAssets<T>, cacheTimeout?: number): RedundantSwapPrice<T> {
57
+ const priceApis = [
58
+ new BinancePriceProvider(assets.map(coinData => {
59
+ return {
60
+ coinId: coinData.binancePair,
61
+ chains: coinData.chains
62
+ };
63
+ })),
64
+ new OKXPriceProvider(assets.map(coinData => {
65
+ return {
66
+ coinId: coinData.okxPair,
67
+ chains: coinData.chains
68
+ };
69
+ })),
70
+ new CoinGeckoPriceProvider(assets.map(coinData => {
71
+ return {
72
+ coinId: coinData.coinGeckoCoinId,
73
+ chains: coinData.chains
74
+ };
75
+ })),
76
+ new CoinPaprikaPriceProvider(assets.map(coinData => {
77
+ return {
78
+ coinId: coinData.coinPaprikaCoinId,
79
+ chains: coinData.chains
80
+ };
81
+ })),
82
+ new KrakenPriceProvider(assets.map(coinData => {
83
+ return {
84
+ coinId: coinData.krakenPair,
85
+ chains: coinData.chains
86
+ };
87
+ }))
88
+ ];
89
+
90
+ return new RedundantSwapPrice(maxAllowedFeeDiffPPM, assets, priceApis, cacheTimeout);
91
+ }
92
+
93
+ coinsDecimals: CoinDecimals<T> = {};
94
+ priceApis: {
95
+ priceApi: IPriceProvider<T>,
96
+ operational?: boolean
97
+ }[];
98
+
99
+ constructor(maxAllowedFeeDiffPPM: bigint, coinsDecimals: CtorCoinDecimals<T>, priceApis: IPriceProvider<T>[], cacheTimeout?: number) {
100
+ super(maxAllowedFeeDiffPPM, cacheTimeout);
101
+ for(let coinData of coinsDecimals) {
102
+ for(let chainId in coinData.chains) {
103
+ const {address, decimals} = coinData.chains[chainId]!;
104
+ this.coinsDecimals[chainId] ??= {};
105
+ (this.coinsDecimals[chainId] as any)[address.toString()] = decimals;
106
+ }
107
+ }
108
+ this.priceApis = priceApis.map(api => {
109
+ return {
110
+ priceApi: api
111
+ }
112
+ });
113
+ }
114
+
115
+ /**
116
+ * Returns price api that should be operational
117
+ *
118
+ * @private
119
+ */
120
+ private getOperationalPriceApi(): {priceApi: IPriceProvider<T>, operational?: boolean} | undefined {
121
+ return this.priceApis.find(e => e.operational===true);
122
+ }
123
+
124
+ /**
125
+ * Returns price apis that are maybe operational, in case none is considered operational returns all of the price
126
+ * apis such that they can be tested again whether they are operational
127
+ *
128
+ * @private
129
+ */
130
+ private getMaybeOperationalPriceApis(): {priceApi: IPriceProvider<T>, operational?: boolean}[] {
131
+ let operational = this.priceApis.filter(e => e.operational===true || e.operational===undefined);
132
+ if(operational.length===0) {
133
+ this.priceApis.forEach(e => e.operational=undefined);
134
+ operational = this.priceApis;
135
+ }
136
+ return operational;
137
+ }
138
+
139
+ /**
140
+ * Fetches price in parallel from multiple maybe operational price APIs
141
+ *
142
+ * @param chainIdentifier
143
+ * @param token
144
+ * @param abortSignal
145
+ * @private
146
+ */
147
+ private async fetchPriceFromMaybeOperationalPriceApis<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal) {
148
+ try {
149
+ return await promiseAny<bigint>(this.getMaybeOperationalPriceApis().map(
150
+ obj => (async () => {
151
+ try {
152
+ const price = await obj.priceApi.getPrice(chainIdentifier, token, abortSignal);
153
+ logger.debug("fetchPrice(): Price from "+obj.priceApi.constructor.name+": ", price.toString(10));
154
+ obj.operational = true;
155
+ return price;
156
+ } catch (e) {
157
+ if(abortSignal!=null) abortSignal.throwIfAborted();
158
+ obj.operational = false;
159
+ throw e;
160
+ }
161
+ })()
162
+ ))
163
+ } catch (_e: any) {
164
+ const e = _e as any[];
165
+ if(abortSignal!=null) abortSignal.throwIfAborted();
166
+ throw e.find(err => !(err instanceof RequestError)) || e[0];
167
+ }
168
+ }
169
+
170
+ /**
171
+ * Fetches the prices, first tries to use the operational price API (if any) and if that fails it falls back
172
+ * to using maybe operational price APIs
173
+ *
174
+ * @param chainIdentifier
175
+ * @param token
176
+ * @param abortSignal
177
+ * @private
178
+ */
179
+ protected fetchPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint> {
180
+ return tryWithRetries(async () => {
181
+ const operationalPriceApi = this.getOperationalPriceApi();
182
+ if (operationalPriceApi != null) {
183
+ try {
184
+ return await operationalPriceApi.priceApi.getPrice(chainIdentifier, token, abortSignal);
185
+ } catch (err) {
186
+ if (abortSignal != null)
187
+ abortSignal.throwIfAborted();
188
+ operationalPriceApi.operational = false;
189
+ return await this.fetchPriceFromMaybeOperationalPriceApis(chainIdentifier, token, abortSignal);
190
+ }
191
+ }
192
+ return await this.fetchPriceFromMaybeOperationalPriceApis(chainIdentifier, token, abortSignal);
193
+ }, undefined, RequestError, abortSignal);
194
+ }
195
+
196
+ protected getDecimals<C extends ChainIds<T>>(chainIdentifier: C, token: string): number | null {
197
+ if(this.coinsDecimals[chainIdentifier]==null) return null;
198
+ return this.coinsDecimals[chainIdentifier]?.[token.toString()] ?? null;
199
+ }
200
+
201
+
202
+ /**
203
+ * Fetches BTC price in USD in parallel from multiple maybe operational price APIs
204
+ *
205
+ * @param abortSignal
206
+ * @private
207
+ */
208
+ private async fetchUsdPriceFromMaybeOperationalPriceApis(abortSignal?: AbortSignal): Promise<number> {
209
+ try {
210
+ return await promiseAny<number>(this.getMaybeOperationalPriceApis().map(
211
+ obj => (async () => {
212
+ try {
213
+ const price = await obj.priceApi.getUsdPrice(abortSignal);
214
+ logger.debug("fetchPrice(): USD price from "+obj.priceApi.constructor.name+": ", price.toString(10));
215
+ obj.operational = true;
216
+ return price;
217
+ } catch (e) {
218
+ if(abortSignal!=null) abortSignal.throwIfAborted();
219
+ obj.operational = false;
220
+ throw e;
221
+ }
222
+ })()
223
+ ))
224
+ } catch (_e: any) {
225
+ const e = _e as any[];
226
+ if(abortSignal!=null) abortSignal.throwIfAborted();
227
+ throw e.find(err => !(err instanceof RequestError)) || e[0];
228
+ }
229
+ }
230
+
231
+ protected fetchUsdPrice(abortSignal?: AbortSignal): Promise<number> {
232
+ return tryWithRetries(() => {
233
+ const operationalPriceApi = this.getOperationalPriceApi();
234
+ if(operationalPriceApi!=null) {
235
+ return operationalPriceApi.priceApi.getUsdPrice(abortSignal).catch(err => {
236
+ if(abortSignal!=null) abortSignal.throwIfAborted();
237
+ operationalPriceApi.operational = false;
238
+ return this.fetchUsdPriceFromMaybeOperationalPriceApis(abortSignal);
239
+ });
240
+ }
241
+ return this.fetchUsdPriceFromMaybeOperationalPriceApis(abortSignal);
242
+ }, undefined, RequestError, abortSignal);
243
+ }
244
+
245
+ }
@@ -0,0 +1,47 @@
1
+ import {IPriceProvider} from "./abstract/IPriceProvider";
2
+ import {ICachedSwapPrice} from "./abstract/ICachedSwapPrice";
3
+ import {ChainIds, MultiChain} from "../swapper/Swapper";
4
+
5
+ /**
6
+ * Swap price API using single price source
7
+ * @category Pricing and LPs
8
+ */
9
+ export class SingleSwapPrice<T extends MultiChain> extends ICachedSwapPrice<T> {
10
+
11
+ priceProvider: IPriceProvider<T>;
12
+
13
+ constructor(maxAllowedFeeDiffPPM: bigint, priceProvider: IPriceProvider<T>, cacheTimeout?: number) {
14
+ super(maxAllowedFeeDiffPPM, cacheTimeout);
15
+ this.priceProvider = priceProvider;
16
+ }
17
+
18
+ /**
19
+ * Fetch price in uSats (micro sats) for a given token against BTC
20
+ *
21
+ * @param chainIdentifier
22
+ * @param token
23
+ * @param abortSignal
24
+ * @protected
25
+ * @returns token price in uSats (micro sats)
26
+ */
27
+ protected fetchPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint> {
28
+ return this.priceProvider.getPrice(chainIdentifier, token, abortSignal);
29
+ }
30
+
31
+ /**
32
+ * Returns the decimal places of the specified token, or -1 if token should be ignored, returns null if
33
+ * token is not found
34
+ *
35
+ * @param chainIdentifier
36
+ * @param token
37
+ * @protected
38
+ */
39
+ protected getDecimals<C extends ChainIds<T>>(chainIdentifier: C, token: string): number | null {
40
+ return this.priceProvider.getDecimals(chainIdentifier, token.toString());
41
+ }
42
+
43
+ protected fetchUsdPrice(abortSignal?: AbortSignal): Promise<number> {
44
+ return this.priceProvider.getUsdPrice(abortSignal);
45
+ }
46
+
47
+ }
@@ -0,0 +1,157 @@
1
+ import {ISwapPrice} from "./abstract/ISwapPrice";
2
+ import {ChainIds, MultiChain} from "../swapper/Swapper";
3
+
4
+ import {Token} from "../types/Token";
5
+ import {PriceInfoType} from "../types/PriceInfoType";
6
+
7
+ /**
8
+ * Chain-specific wrapper for swap pricing
9
+ * @category Pricing and LPs
10
+ */
11
+ export class SwapPriceWithChain<T extends MultiChain, ChainIdentifier extends ChainIds<T>> {
12
+
13
+ swapPrice: ISwapPrice<T>;
14
+ chainIdentifier: ChainIdentifier;
15
+ maxAllowedFeeDifferencePPM: bigint;
16
+
17
+ constructor(swapPrice: ISwapPrice<T>, chainIdentifier: ChainIdentifier) {
18
+ this.swapPrice = swapPrice;
19
+ this.chainIdentifier = chainIdentifier;
20
+ this.maxAllowedFeeDifferencePPM = swapPrice.maxAllowedFeeDifferencePPM;
21
+ }
22
+
23
+ /**
24
+ * Checks whether the swap amounts are valid given the current market rate for a given pair
25
+ *
26
+ * @param amountSats Amount of sats (BTC) to be received from the swap
27
+ * @param satsBaseFee Base fee in sats (BTC) as reported by the intermediary
28
+ * @param feePPM PPM fee rate as reported by the intermediary
29
+ * @param paidToken Amount of token to be paid to the swap
30
+ * @param token
31
+ * @param abortSignal
32
+ * @param preFetchedPrice Already pre-fetched price
33
+ */
34
+ public async isValidAmountSend(
35
+ amountSats: bigint,
36
+ satsBaseFee: bigint,
37
+ feePPM: bigint,
38
+ paidToken: bigint,
39
+ token: string,
40
+ abortSignal?: AbortSignal,
41
+ preFetchedPrice?: bigint
42
+ ): Promise<PriceInfoType> {
43
+ return this.swapPrice.isValidAmountSend<ChainIdentifier>(
44
+ this.chainIdentifier, amountSats, satsBaseFee, feePPM, paidToken, token, abortSignal, preFetchedPrice
45
+ );
46
+ }
47
+
48
+ /**
49
+ * Checks whether the swap amounts are valid given the current market rate for a given pair
50
+ *
51
+ * @param amountSats Amount of sats (BTC) to be paid to the swap
52
+ * @param satsBaseFee Base fee in sats (BTC) as reported by the intermediary
53
+ * @param feePPM PPM fee rate as reported by the intermediary
54
+ * @param receiveToken Amount of token to be received from the swap
55
+ * @param token
56
+ * @param abortSignal
57
+ * @param preFetchedPrice Already pre-fetched price
58
+ */
59
+ public async isValidAmountReceive(
60
+ amountSats: bigint,
61
+ satsBaseFee: bigint,
62
+ feePPM: bigint,
63
+ receiveToken: bigint,
64
+ token: string,
65
+ abortSignal?: AbortSignal,
66
+ preFetchedPrice?: bigint
67
+ ): Promise<PriceInfoType> {
68
+ return this.swapPrice.isValidAmountReceive<ChainIdentifier>(
69
+ this.chainIdentifier, amountSats, satsBaseFee, feePPM, receiveToken, token, abortSignal, preFetchedPrice
70
+ );
71
+ }
72
+
73
+ public preFetchPrice(token: string, abortSignal?: AbortSignal): Promise<bigint> {
74
+ return this.swapPrice.preFetchPrice<ChainIdentifier>(this.chainIdentifier, token, abortSignal);
75
+ }
76
+
77
+ public preFetchUsdPrice(abortSignal?: AbortSignal): Promise<number> {
78
+ return this.swapPrice.preFetchUsdPrice(abortSignal);
79
+ }
80
+
81
+ /**
82
+ * Returns amount of {toToken} that are equivalent to {fromAmount} satoshis
83
+ *
84
+ * @param fromAmount Amount of satoshis
85
+ * @param toToken Token
86
+ * @param abortSignal
87
+ * @param preFetchedPrice
88
+ * @throws {Error} when token is not found
89
+ */
90
+ public async getFromBtcSwapAmount(
91
+ fromAmount: bigint,
92
+ toToken: string,
93
+ abortSignal?: AbortSignal,
94
+ preFetchedPrice?: bigint
95
+ ): Promise<bigint> {
96
+ return this.swapPrice.getFromBtcSwapAmount<ChainIdentifier>(
97
+ this.chainIdentifier, fromAmount, toToken, abortSignal, preFetchedPrice
98
+ );
99
+ }
100
+
101
+ /**
102
+ * Returns amount of satoshis that are equivalent to {fromAmount} of {fromToken}
103
+ *
104
+ * @param fromAmount Amount of the token
105
+ * @param fromToken Token
106
+ * @param abortSignal
107
+ * @param preFetchedPrice Pre-fetched swap price if available
108
+ * @throws {Error} when token is not found
109
+ */
110
+ public async getToBtcSwapAmount(
111
+ fromAmount: bigint,
112
+ fromToken: string,
113
+ abortSignal?: AbortSignal,
114
+ preFetchedPrice?: bigint
115
+ ): Promise<bigint> {
116
+ return this.swapPrice.getToBtcSwapAmount<ChainIdentifier>(
117
+ this.chainIdentifier, fromAmount, fromToken, abortSignal, preFetchedPrice
118
+ );
119
+ }
120
+
121
+ /**
122
+ * Returns whether the token should be ignored and pricing for it not calculated
123
+ *
124
+ * @param tokenAddress
125
+ * @throws {Error} if token is not found
126
+ */
127
+ public shouldIgnore(tokenAddress: string): boolean {
128
+ return this.swapPrice.shouldIgnore<ChainIdentifier>(this.chainIdentifier, tokenAddress);
129
+ }
130
+
131
+ public async getBtcUsdValue(
132
+ btcSats: bigint,
133
+ abortSignal?: AbortSignal,
134
+ preFetchedPrice?: number
135
+ ): Promise<number> {
136
+ return this.swapPrice.getBtcUsdValue(btcSats, abortSignal, preFetchedPrice);
137
+ }
138
+
139
+ public async getTokenUsdValue(
140
+ tokenAmount: bigint,
141
+ token: string,
142
+ abortSignal?: AbortSignal,
143
+ preFetchedPrice?: number
144
+ ): Promise<number> {
145
+ return this.swapPrice.getTokenUsdValue(this.chainIdentifier, tokenAmount, token, abortSignal, preFetchedPrice);
146
+ }
147
+
148
+ public getUsdValue(
149
+ amount: bigint,
150
+ token: Token<ChainIdentifier>,
151
+ abortSignal?: AbortSignal,
152
+ preFetchedUsdPrice?: number
153
+ ): Promise<number> {
154
+ return this.swapPrice.getUsdValue(amount, token, abortSignal, preFetchedUsdPrice);
155
+ }
156
+
157
+ }
@@ -0,0 +1,86 @@
1
+ import {ISwapPrice} from "./ISwapPrice";
2
+ import {ChainIds, MultiChain} from "../../swapper/Swapper";
3
+
4
+ const DEFAULT_CACHE_DURATION = 10000;
5
+
6
+ export abstract class ICachedSwapPrice<T extends MultiChain> extends ISwapPrice<T> {
7
+
8
+ cache: {
9
+ [chainIdentifier in keyof T]?: {
10
+ [tokenAddress: string]: {
11
+ price: Promise<bigint>,
12
+ expiry: number
13
+ }
14
+ }
15
+ } = {};
16
+ usdCache?: {
17
+ price: Promise<number>,
18
+ expiry: number
19
+ };
20
+ cacheTimeout: number;
21
+
22
+ protected constructor(maxAllowedFeeDiffPPM: bigint, cacheTimeout?: number) {
23
+ super(maxAllowedFeeDiffPPM);
24
+ this.cacheTimeout = cacheTimeout || DEFAULT_CACHE_DURATION;
25
+ }
26
+
27
+ protected abstract fetchPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint>;
28
+ protected abstract fetchUsdPrice(abortSignal?: AbortSignal): Promise<number>;
29
+
30
+ protected getPrice<C extends ChainIds<T>>(chainIdentifier: C, tokenAddress: string, abortSignal?: AbortSignal): Promise<bigint> {
31
+ const token = tokenAddress.toString();
32
+
33
+ const chainCache = this.cache[chainIdentifier];
34
+ if(chainCache!=null) {
35
+ const cachedValue = chainCache[token];
36
+ if(cachedValue!=null && cachedValue.expiry>Date.now()) {
37
+ //Cache still fresh
38
+ return cachedValue.price.catch(e => this.fetchPrice(chainIdentifier, token, abortSignal));
39
+ }
40
+ }
41
+
42
+ //Refresh cache
43
+ const thisFetch = this.fetchPrice(chainIdentifier, token);
44
+ this.cache[chainIdentifier] ??= {};
45
+ (this.cache[chainIdentifier] as any)[token] = {
46
+ price: thisFetch,
47
+ expiry: Date.now()+this.cacheTimeout
48
+ };
49
+ thisFetch.catch(e => {
50
+ if(
51
+ this.cache?.[chainIdentifier]?.[token].price===thisFetch
52
+ ) delete this.cache[token];
53
+ throw e;
54
+ });
55
+ return thisFetch;
56
+ }
57
+
58
+ /**
59
+ * Returns BTC price in USD (sats/USD)
60
+ *
61
+ * @param abortSignal
62
+ * @throws {Error} if token is not found
63
+ */
64
+ protected getUsdPrice(abortSignal?: AbortSignal): Promise<number> {
65
+ if(this.usdCache!=null && this.usdCache.expiry>Date.now()) {
66
+ //Cache still fresh
67
+ return this.usdCache.price.catch(e => this.fetchUsdPrice(abortSignal));
68
+ }
69
+
70
+ //Refresh cache
71
+ const thisFetch = this.fetchUsdPrice();
72
+ this.usdCache = {
73
+ price: thisFetch,
74
+ expiry: Date.now()+this.cacheTimeout
75
+ };
76
+ thisFetch.catch(e => {
77
+ if(
78
+ this.usdCache!=null &&
79
+ this.usdCache.price===thisFetch
80
+ ) delete this.usdCache;
81
+ throw e;
82
+ });
83
+ return thisFetch;
84
+ }
85
+
86
+ }
@@ -0,0 +1,128 @@
1
+ import {ChainIds, MultiChain} from "../../swapper/Swapper";
2
+
3
+ /**
4
+ * Coin type definition for price providers
5
+ * @category Pricing and LPs
6
+ */
7
+ export type CoinType = {
8
+ coinId: string;
9
+ decimals: number;
10
+ };
11
+
12
+ /**
13
+ * Constructor coin types for price providers
14
+ * @category Pricing and LPs
15
+ */
16
+ export type CtorCoinTypes<T extends MultiChain> = {
17
+ coinId?: string,
18
+ chains: {
19
+ [chainId in keyof T]?: {
20
+ address: string,
21
+ decimals: number,
22
+ }
23
+ }
24
+ }[]
25
+
26
+ /**
27
+ * Coin types mapping by chain
28
+ * @category Pricing and LPs
29
+ */
30
+ export type CoinTypes<T extends MultiChain> = {
31
+ [chainId in keyof T]?: {
32
+ [address: string]: CoinType
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Abstract base class for price provider implementations
38
+ * @category Pricing and LPs
39
+ */
40
+ export abstract class IPriceProvider<T extends MultiChain> {
41
+
42
+ coinsMap: CoinTypes<T> = {};
43
+
44
+ protected constructor(coins: CtorCoinTypes<T>) {
45
+ for(let coinData of coins) {
46
+ if(coinData.coinId==null) continue;
47
+ for(let chainId in coinData.chains) {
48
+ const {address, decimals} = coinData.chains[chainId]!;
49
+ this.coinsMap[chainId] ??= {};
50
+ (this.coinsMap[chainId] as any)[address.toString()] = {
51
+ coinId: coinData.coinId,
52
+ decimals
53
+ };
54
+ }
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Fetches the price for a given token against BTC
60
+ *
61
+ * @param token
62
+ * @param abortSignal
63
+ * @protected
64
+ * @returns Price per token in uSats (micro sats)
65
+ */
66
+ protected abstract fetchPrice(token: CoinType, abortSignal?: AbortSignal): Promise<bigint>;
67
+
68
+ /**
69
+ * Fetches the USD price of BTC
70
+ *
71
+ * @param abortSignal
72
+ * @protected
73
+ */
74
+ protected abstract fetchUsdPrice(abortSignal?: AbortSignal): Promise<number>;
75
+
76
+ /**
77
+ * Returns coin price in uSat (microSat)
78
+ *
79
+ * @param chainIdentifier
80
+ * @param token
81
+ * @param abortSignal
82
+ * @throws {Error} if token is not found
83
+ */
84
+ getPrice<C extends ChainIds<T>>(chainIdentifier: C, token: string, abortSignal?: AbortSignal): Promise<bigint> {
85
+ let tokenAddress: string = token.toString();
86
+
87
+ const chainTokens = this.coinsMap[chainIdentifier];
88
+ if(chainTokens==null) throw new Error("Chain not found");
89
+ const coin = chainTokens[tokenAddress];
90
+ if(coin==null) throw new Error("Token not found");
91
+
92
+ if(coin.coinId.startsWith("$fixed-")) {
93
+ const amt: number = parseFloat(coin.coinId.substring(7));
94
+ return Promise.resolve(BigInt(Math.floor(amt*1000000).toString(10)));
95
+ }
96
+
97
+ return this.fetchPrice(coin, abortSignal);
98
+ }
99
+
100
+ /**
101
+ * Returns coin price in uSat (microSat)
102
+ *
103
+ * @param abortSignal
104
+ * @throws {Error} if token is not found
105
+ */
106
+ getUsdPrice(abortSignal?: AbortSignal): Promise<number> {
107
+ return this.fetchUsdPrice(abortSignal);
108
+ }
109
+
110
+ /**
111
+ * Returns the decimal places of the specified token, or -1 if token should be ignored, returns null if
112
+ * token is not found
113
+ *
114
+ * @param chainIdentifier
115
+ * @param token
116
+ * @protected
117
+ * @throws {Error} If token is not found
118
+ */
119
+ getDecimals<C extends ChainIds<T>>(chainIdentifier: C, token: string): number {
120
+ const chainTokens = this.coinsMap[chainIdentifier];
121
+ if(chainTokens==null) throw new Error("Chain not found");
122
+ const coin = chainTokens[token.toString()];
123
+ if(coin==null) throw new Error("Token not found");
124
+
125
+ return coin.coinId==="$ignore" ? -1 : coin.decimals;
126
+ }
127
+
128
+ }