@atomiqlabs/sdk 7.0.11 → 8.0.7

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} +40 -22
  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} +116 -75
  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,485 @@
1
+ import {Intermediary, ServicesType} from "./Intermediary";
2
+ import {SwapType} from "../enums/SwapType";
3
+ import {SignatureVerificationError, SwapContract} from "@atomiqlabs/base";
4
+ import {EventEmitter} from "events";
5
+ import {Buffer} from "buffer";
6
+ import {bigIntMax, bigIntMin, extendAbortController} from "../utils/Utils";
7
+ import {IntermediaryAPI} from "./apis/IntermediaryAPI";
8
+ import {getLogger} from "../utils/Logger";
9
+ import {httpGet} from "../http/HttpUtils";
10
+ import {tryWithRetries} from "../utils/RetryUtils";
11
+
12
+ /**
13
+ * Swap handler type enum for intermediary communication
14
+ * @category Pricing and LPs
15
+ */
16
+ export enum SwapHandlerType {
17
+ TO_BTC = "TO_BTC",
18
+ FROM_BTC = "FROM_BTC",
19
+ TO_BTCLN = "TO_BTCLN",
20
+ FROM_BTCLN = "FROM_BTCLN",
21
+ FROM_BTC_TRUSTED = "FROM_BTC_TRUSTED",
22
+ FROM_BTCLN_TRUSTED = "FROM_BTCLN_TRUSTED",
23
+ FROM_BTC_SPV = "FROM_BTC_SPV",
24
+ FROM_BTCLN_AUTO = "FROM_BTCLN_AUTO"
25
+ }
26
+
27
+ /**
28
+ * Swap handler information type
29
+ * @category Pricing and LPs
30
+ */
31
+ export type SwapHandlerInfoType = {
32
+ swapFeePPM: number,
33
+ swapBaseFee: number,
34
+ min: number,
35
+ max: number,
36
+ tokens: string[],
37
+ chainTokens?: {[chainId: string]: string[]};
38
+ data?: any,
39
+ };
40
+
41
+ type InfoHandlerResponseEnvelope = {
42
+ nonce: string,
43
+ services: {
44
+ [key in SwapHandlerType]?: SwapHandlerInfoType
45
+ }
46
+ };
47
+
48
+ /**
49
+ * Token bounds (min/max) for swaps
50
+ * @category Pricing and LPs
51
+ */
52
+ export type TokenBounds = {
53
+ [token: string]: {
54
+ min: bigint,
55
+ max: bigint
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Multi-chain token bounds
61
+ * @category Pricing and LPs
62
+ */
63
+ export type MultichainTokenBounds = {
64
+ [chainId: string]: TokenBounds
65
+ }
66
+
67
+ /**
68
+ * Swap bounds by type
69
+ * @category Pricing and LPs
70
+ */
71
+ export type SwapBounds = {
72
+ [key in SwapType]?: TokenBounds
73
+ }
74
+
75
+ /**
76
+ * Multi-chain swap bounds
77
+ * @category Pricing and LPs
78
+ */
79
+ export type MultichainSwapBounds = {
80
+ [key in SwapType]?: MultichainTokenBounds
81
+ }
82
+
83
+ /**
84
+ * Converts SwapHandlerType (represented as string & used in REST API communication with intermediaries) to regular
85
+ * SwapType
86
+ *
87
+ * @param swapHandlerType
88
+ */
89
+ function swapHandlerTypeToSwapType(swapHandlerType: SwapHandlerType): SwapType {
90
+ switch (swapHandlerType) {
91
+ case SwapHandlerType.FROM_BTC:
92
+ return SwapType.FROM_BTC;
93
+ case SwapHandlerType.TO_BTC:
94
+ return SwapType.TO_BTC;
95
+ case SwapHandlerType.FROM_BTCLN:
96
+ return SwapType.FROM_BTCLN;
97
+ case SwapHandlerType.TO_BTCLN:
98
+ return SwapType.TO_BTCLN;
99
+ case SwapHandlerType.FROM_BTC_TRUSTED:
100
+ return SwapType.TRUSTED_FROM_BTC;
101
+ case SwapHandlerType.FROM_BTCLN_TRUSTED:
102
+ return SwapType.TRUSTED_FROM_BTCLN;
103
+ case SwapHandlerType.FROM_BTC_SPV:
104
+ return SwapType.SPV_VAULT_FROM_BTC;
105
+ case SwapHandlerType.FROM_BTCLN_AUTO:
106
+ return SwapType.FROM_BTCLN_AUTO;
107
+ }
108
+ }
109
+
110
+ /**
111
+ * A default intermediary comparator, only takes to announced fee into consideration
112
+ *
113
+ * @param swapType
114
+ * @param tokenAddress
115
+ * @param swapAmount
116
+ */
117
+ function getIntermediaryComparator(swapType: SwapType, tokenAddress: string, swapAmount?: bigint) {
118
+
119
+ if(swapType===SwapType.TO_BTC) {
120
+ //TODO: Also take reputation into account
121
+ }
122
+
123
+ return (a: Intermediary, b: Intermediary): number => {
124
+ const aService = a.services[swapType];
125
+ const bService = b.services[swapType];
126
+ if(aService==null && bService==null) return 0;
127
+ if(aService==null) return 1;
128
+ if(bService==null) return -1;
129
+
130
+ if(swapAmount==null) {
131
+ return aService.swapFeePPM - bService.swapFeePPM;
132
+ } else {
133
+ const feeA = BigInt(aService.swapBaseFee) + (swapAmount * BigInt(aService.swapFeePPM) / 1000000n);
134
+ const feeB = BigInt(bService.swapBaseFee) + (swapAmount * BigInt(bService.swapFeePPM) / 1000000n);
135
+
136
+ return feeA - feeB > 0n ? 1 : feeA === feeB ? 0 : -1;
137
+ }
138
+ }
139
+
140
+ }
141
+
142
+ const logger = getLogger("IntermediaryDiscovery: ");
143
+
144
+ const REGISTRY_URL = "https://api.github.com/repos/adambor/SolLightning-registry/contents/registry.json?ref=main";
145
+
146
+ //To allow for legacy responses from not-yet updated LPs
147
+ const DEFAULT_CHAIN = "SOLANA";
148
+
149
+ /**
150
+ * Discovery service for available liquidity providers/intermediaries
151
+ * @category Pricing and LPs
152
+ */
153
+ export class IntermediaryDiscovery extends EventEmitter {
154
+
155
+ intermediaries: Intermediary[] = [];
156
+
157
+ swapContracts: {[key: string]: SwapContract};
158
+ registryUrl: string;
159
+
160
+ httpRequestTimeout?: number;
161
+ /**
162
+ * Maximum time (in millis) to wait for other LP's responses after the first one was founds
163
+ */
164
+ maxWaitForOthersTimeout?: number;
165
+
166
+ private overrideNodeUrls?: string[];
167
+
168
+ constructor(
169
+ swapContracts: {[key: string]: SwapContract},
170
+ registryUrl: string = REGISTRY_URL,
171
+ nodeUrls?: string[],
172
+ httpRequestTimeout?: number,
173
+ maxWaitForOthersTimeout?: number
174
+ ) {
175
+ super();
176
+ this.swapContracts = swapContracts;
177
+ this.registryUrl = registryUrl;
178
+ this.overrideNodeUrls = nodeUrls;
179
+ this.httpRequestTimeout = httpRequestTimeout;
180
+ this.maxWaitForOthersTimeout = maxWaitForOthersTimeout;
181
+ }
182
+
183
+ /**
184
+ * Fetches the URLs of swap intermediaries from registry or from a pre-defined array of node urls
185
+ *
186
+ * @param abortSignal
187
+ */
188
+ private async getIntermediaryUrls(abortSignal?: AbortSignal): Promise<string[]> {
189
+ if(this.overrideNodeUrls!=null && this.overrideNodeUrls.length>0) {
190
+ return this.overrideNodeUrls;
191
+ }
192
+
193
+ const response = await tryWithRetries(
194
+ () => httpGet<{content: string}>(this.registryUrl, this.httpRequestTimeout, abortSignal),
195
+ {maxRetries: 3, delay: 100, exponential: true}
196
+ );
197
+
198
+ const content = response.content.replace(new RegExp("\\n", "g"), "");
199
+
200
+ return JSON.parse(Buffer.from(content, "base64").toString()) as string[];
201
+ }
202
+
203
+ /**
204
+ * Returns data as reported by a specific node (as identified by its URL). This function is specifically made
205
+ * in a way, that in case the abortSignal fires AFTER the LP response was received (and during signature checking),
206
+ * it proceeds with the addresses it was able to verify already. Hence after calling abort, this function is guaranteed
207
+ * to either reject or resolve instantly.
208
+ *
209
+ * @param url
210
+ * @param abortSignal
211
+ */
212
+ private async getNodeInfo(url: string, abortSignal?: AbortSignal) : Promise<{addresses: {[key: string]: string}, info: InfoHandlerResponseEnvelope}> {
213
+ const response = await tryWithRetries(
214
+ () => IntermediaryAPI.getIntermediaryInfo(url, this.httpRequestTimeout, abortSignal),
215
+ {maxRetries: 3, delay: 100, exponential: true},
216
+ undefined,
217
+ abortSignal
218
+ );
219
+ abortSignal?.throwIfAborted();
220
+
221
+ const promises: Promise<void>[] = [];
222
+ const addresses: {[key: string]: string} = {};
223
+ for(let chain in response.chains) {
224
+ if(this.swapContracts[chain]!=null) {
225
+ promises.push((async () => {
226
+ const {signature, address} = response.chains[chain];
227
+ try {
228
+ await this.swapContracts[chain].isValidDataSignature(Buffer.from(response.envelope), signature, address);
229
+ addresses[chain] = address;
230
+ } catch (e) {
231
+ logger.warn("Failed to verify "+chain+" signature for intermediary: "+url);
232
+ }
233
+ })());
234
+ }
235
+ }
236
+
237
+ if(abortSignal!=null) {
238
+ await Promise.race([
239
+ Promise.all(promises),
240
+ new Promise(resolve => abortSignal.addEventListener("abort", resolve))
241
+ ]);
242
+ } else {
243
+ await Promise.all(promises);
244
+ }
245
+
246
+ //Handle legacy responses
247
+ const info: InfoHandlerResponseEnvelope = JSON.parse(response.envelope);
248
+ for(let swapType in info.services) {
249
+ const serviceData: SwapHandlerInfoType = info.services[swapType as SwapHandlerType]!;
250
+ if(serviceData.chainTokens==null) serviceData.chainTokens = {
251
+ [DEFAULT_CHAIN]: serviceData.tokens
252
+ };
253
+ for(let chain in serviceData.chainTokens) {
254
+ if(addresses[chain]==null) delete serviceData.chainTokens[chain];
255
+ }
256
+ }
257
+
258
+ return {
259
+ addresses,
260
+ info
261
+ };
262
+ }
263
+
264
+ /**
265
+ * Inherits abort signal logic from `getNodeInfo()`, check those function docs to better understand
266
+ *
267
+ * @param url
268
+ * @param abortSignal
269
+ * @private
270
+ */
271
+ private async loadIntermediary(url: string, abortSignal?: AbortSignal): Promise<Intermediary | null> {
272
+ try {
273
+ const nodeInfo = await this.getNodeInfo(url, abortSignal);
274
+ const services: ServicesType = {};
275
+ for(let key in nodeInfo.info.services) {
276
+ services[swapHandlerTypeToSwapType(key as SwapHandlerType)] = nodeInfo.info.services[key as SwapHandlerType];
277
+ }
278
+ return new Intermediary(url, nodeInfo.addresses, services);
279
+ } catch (e) {
280
+ logger.warn("fetchIntermediaries(): Error contacting intermediary "+url+": ", e);
281
+ return null;
282
+ }
283
+ }
284
+
285
+ /**
286
+ * Returns the intermediary at the provided URL, either from the already fetched list of LPs or fetches the data on-demand
287
+ *
288
+ * @param url
289
+ * @param abortSignal
290
+ */
291
+ getIntermediary(url: string, abortSignal?: AbortSignal): Promise<Intermediary | null> {
292
+ const foundLp = this.intermediaries.find(lp => lp.url===url);
293
+ if(foundLp!=null) return Promise.resolve(foundLp);
294
+ return this.loadIntermediary(url, abortSignal);
295
+ }
296
+
297
+ /**
298
+ * Reloads the saves a list of intermediaries
299
+ * @param abortSignal
300
+ */
301
+ async reloadIntermediaries(abortSignal?: AbortSignal): Promise<void> {
302
+ //Get LP urls
303
+ const urls = await this.getIntermediaryUrls(abortSignal);
304
+
305
+ logger.debug("reloadIntermediaries(): Pinging intermediaries: ", urls.join());
306
+
307
+ const abortController = extendAbortController(abortSignal);
308
+ let timer: any;
309
+ const intermediaries = await Promise.all(urls.map(url => this.loadIntermediary(url, abortController.signal).then(lp => {
310
+ if(lp!=null && timer==null) timer = setTimeout(() => {
311
+ //Trigger abort through the abort controller, such that all underlying promises resolve instantly
312
+ abortController.abort();
313
+ }, this.maxWaitForOthersTimeout ?? 5*1000);
314
+ return lp;
315
+ })));
316
+ if(timer!=null) clearTimeout(timer);
317
+
318
+ const activeNodes: Intermediary[] = intermediaries.filter(intermediary => intermediary!=null) as Intermediary[];
319
+ if(activeNodes.length===0) logger.error("reloadIntermediaries(): No online intermediary found! Swaps might not be possible!");
320
+
321
+ this.intermediaries = activeNodes;
322
+ this.emit("added", activeNodes);
323
+
324
+ logger.info("reloadIntermediaries(): Using active intermediaries: ", activeNodes.map(lp => lp.url).join());
325
+ }
326
+
327
+ /**
328
+ * Initializes the discovery by fetching/reloading intermediaries
329
+ *
330
+ * @param abortSignal
331
+ */
332
+ init(abortSignal?: AbortSignal): Promise<void> {
333
+ logger.info("init(): Initializing with registryUrl: "+this.registryUrl+" intermediary array: "+(this.overrideNodeUrls || []).join());
334
+ return this.reloadIntermediaries(abortSignal);
335
+ }
336
+
337
+ getMultichainSwapBounds(): MultichainSwapBounds {
338
+ const bounds: MultichainSwapBounds = {};
339
+
340
+ this.intermediaries.forEach(intermediary => {
341
+ for(let _swapType in intermediary.services) {
342
+ const swapType = parseInt(_swapType) as SwapType;
343
+ const swapService: SwapHandlerInfoType = intermediary.services[swapType]!;
344
+ const multichainBounds: MultichainTokenBounds = (bounds[swapType] ??= {});
345
+ for(let chainId in swapService.chainTokens) {
346
+ multichainBounds[chainId] ??= {};
347
+ const tokenBounds: TokenBounds = multichainBounds[chainId];
348
+
349
+ for(let token of swapService.chainTokens[chainId]) {
350
+ const tokenMinMax = tokenBounds[token];
351
+ if(tokenMinMax==null) {
352
+ tokenBounds[token] = {
353
+ min: BigInt(swapService.min),
354
+ max: BigInt(swapService.max)
355
+ }
356
+ } else {
357
+ tokenMinMax.min = bigIntMin(tokenMinMax.min, BigInt(swapService.min));
358
+ tokenMinMax.max = bigIntMax(tokenMinMax.max, BigInt(swapService.max));
359
+ }
360
+ }
361
+ }
362
+ }
363
+ });
364
+
365
+ return bounds;
366
+ }
367
+
368
+ /**
369
+ * Returns aggregate swap bounds (in sats - BTC) as indicated by the intermediaries
370
+ */
371
+ getSwapBounds(chainIdentifier: string): SwapBounds {
372
+ const bounds: SwapBounds = {};
373
+
374
+ this.intermediaries.forEach(intermediary => {
375
+ for(let _swapType in intermediary.services) {
376
+ const swapType = parseInt(_swapType) as SwapType;
377
+ const swapService: SwapHandlerInfoType = intermediary.services[swapType]!;
378
+ const tokenBounds: TokenBounds = (bounds[swapType] ??= {});
379
+ if(swapService.chainTokens!=null && swapService.chainTokens[chainIdentifier]!=null) {
380
+ for(let token of swapService.chainTokens[chainIdentifier]) {
381
+ const tokenMinMax = tokenBounds[token];
382
+ if(tokenMinMax==null) {
383
+ tokenBounds[token] = {
384
+ min: BigInt(swapService.min),
385
+ max: BigInt(swapService.max)
386
+ }
387
+ } else {
388
+ tokenMinMax.min = bigIntMin(tokenMinMax.min, BigInt(swapService.min));
389
+ tokenMinMax.max = bigIntMax(tokenMinMax.max, BigInt(swapService.max));
390
+ }
391
+ }
392
+ }
393
+ }
394
+ });
395
+
396
+ return bounds;
397
+ }
398
+
399
+ /**
400
+ * Returns the aggregate swap minimum (in sats - BTC) for a specific swap type & token
401
+ * as indicated by the intermediaries
402
+ *
403
+ * @param chainIdentifier
404
+ * @param swapType
405
+ * @param token
406
+ */
407
+ getSwapMinimum(chainIdentifier: string, swapType: SwapType, token: any): number | null {
408
+ const tokenStr = token.toString();
409
+ return this.intermediaries.reduce<number | null>((prevMin: number | null, intermediary: Intermediary) => {
410
+ const swapService = intermediary.services[swapType];
411
+ if(swapService==null) return prevMin;
412
+ const chainTokens = swapService.chainTokens?.[chainIdentifier];
413
+ if(chainTokens==null) return prevMin;
414
+ if(!chainTokens.includes(tokenStr)) return prevMin;
415
+ return prevMin==null ? swapService.min : Math.min(prevMin, swapService.min);
416
+ }, null);
417
+ }
418
+
419
+ /**
420
+ * Returns the aggregate swap maximum (in sats - BTC) for a specific swap type & token
421
+ * as indicated by the intermediaries
422
+ *
423
+ * @param chainIdentifier
424
+ * @param swapType
425
+ * @param token
426
+ */
427
+ getSwapMaximum(chainIdentifier: string, swapType: SwapType, token: any): number | null {
428
+ const tokenStr = token.toString();
429
+ return this.intermediaries.reduce<number | null>((prevMax: number | null, intermediary: Intermediary) => {
430
+ const swapService = intermediary.services[swapType];
431
+ if(swapService==null) return prevMax;
432
+ const chainTokens = swapService.chainTokens?.[chainIdentifier];
433
+ if(chainTokens==null) return prevMax;
434
+ if(!chainTokens.includes(tokenStr)) return prevMax;
435
+ return prevMax==null ? swapService.max : Math.max(prevMax, swapService.max);
436
+ }, null);
437
+ }
438
+
439
+ /**
440
+ * Returns swap candidates for a specific swap type & token address
441
+ *
442
+ * @param chainIdentifier
443
+ * @param swapType
444
+ * @param tokenAddress
445
+ * @param amount Amount to be swapped in sats - BTC
446
+ * @param count How many intermediaries to return at most
447
+ */
448
+ getSwapCandidates(chainIdentifier: string, swapType: SwapType, tokenAddress: any, amount?: bigint, count?: number): Intermediary[] {
449
+ const candidates = this.intermediaries.filter(e => {
450
+ const swapService = e.services[swapType];
451
+ if(swapService==null) return false;
452
+ if(amount!=null && amount < BigInt(swapService.min)) return false;
453
+ if(amount!=null && amount > BigInt(swapService.max)) return false;
454
+ if(swapService.chainTokens==null) return false;
455
+ if(swapService.chainTokens[chainIdentifier]==null) return false;
456
+ if(!swapService.chainTokens[chainIdentifier].includes(tokenAddress.toString())) return false;
457
+ return true;
458
+ });
459
+
460
+ candidates.sort(getIntermediaryComparator(swapType, tokenAddress, amount));
461
+
462
+ if(count==null) {
463
+ return candidates;
464
+ } else {
465
+ return candidates.slice(0, count);
466
+ }
467
+ }
468
+
469
+ /**
470
+ * Removes a specific intermediary from the list of active intermediaries (used for blacklisting)
471
+ *
472
+ * @param intermediary
473
+ */
474
+ removeIntermediary(intermediary: Intermediary): boolean {
475
+ const index = this.intermediaries.indexOf(intermediary);
476
+ if(index>=0) {
477
+ logger.info("removeIntermediary(): Removing intermediary: "+intermediary.url);
478
+ this.intermediaries.splice(index, 1);
479
+ this.emit("removed", [intermediary]);
480
+ return true;
481
+ }
482
+ return false;
483
+ }
484
+
485
+ }