@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,51 @@
1
+
2
+ /**
3
+ * An error returned by the intermediary in a http response
4
+ * @category Errors
5
+ */
6
+ export class RequestError extends Error {
7
+
8
+ httpCode: number;
9
+
10
+ constructor(msg: string, httpCode: number) {
11
+ try {
12
+ const parsed = JSON.parse(msg);
13
+ if(parsed.msg!=null) msg = parsed.msg;
14
+ } catch (e) {}
15
+ super(msg);
16
+ // Set the prototype explicitly.
17
+ Object.setPrototypeOf(this, RequestError.prototype);
18
+ this.httpCode = httpCode;
19
+ }
20
+
21
+ static parse(msg: string, httpCode: number): RequestError {
22
+ try {
23
+ const parsed = JSON.parse(msg);
24
+ msg = parsed.msg;
25
+ if(parsed.code===20003 || parsed.code===20004) {
26
+ return new OutOfBoundsError(parsed.msg, httpCode, BigInt(parsed.data.min), BigInt(parsed.data.max));
27
+ }
28
+ } catch (e) {}
29
+ return new RequestError(msg, httpCode);
30
+ }
31
+
32
+ }
33
+
34
+
35
+ /**
36
+ * An error indicating out of bounds (amount too high or too low) on swap initialization
37
+ * @category Errors
38
+ */
39
+ export class OutOfBoundsError extends RequestError {
40
+
41
+ min: bigint;
42
+ max: bigint;
43
+
44
+ constructor(msg: string, httpCode: number, min: bigint, max: bigint) {
45
+ super(msg, httpCode);
46
+ this.max = max;
47
+ this.min = min;
48
+ Object.setPrototypeOf(this, OutOfBoundsError.prototype);
49
+ }
50
+
51
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * An error on the user side, such as invalid address provided
3
+ * @category Errors
4
+ */
5
+ export class UserError extends Error {
6
+
7
+ constructor(msg: string) {
8
+ super(msg);
9
+ // Set the prototype explicitly.
10
+ Object.setPrototypeOf(this, UserError.prototype);
11
+ }
12
+
13
+ }
14
+
@@ -0,0 +1,171 @@
1
+ import {
2
+ ChainEvent,
3
+ ChainSwapType,
4
+ ChainType,
5
+ InitializeEvent,
6
+ SpvVaultClaimEvent,
7
+ SpvVaultCloseEvent,
8
+ SpvVaultFrontEvent,
9
+ SwapEvent
10
+ } from "@atomiqlabs/base";
11
+ import {ISwap} from "../swaps/ISwap";
12
+ import {EventListener} from "@atomiqlabs/base/src/events/ChainEvents";
13
+ import {SwapType} from "../enums/SwapType";
14
+ import {UnifiedSwapStorage} from "../storage/UnifiedSwapStorage";
15
+
16
+ import {getLogger} from "../utils/Logger";
17
+
18
+ function chainEventToEscrowHash(event: ChainEvent<any>): string | undefined {
19
+ if(event instanceof SwapEvent) return event.escrowHash;
20
+ if(
21
+ event instanceof SpvVaultFrontEvent ||
22
+ event instanceof SpvVaultClaimEvent ||
23
+ event instanceof SpvVaultCloseEvent
24
+ ) return event.btcTxId;
25
+ }
26
+
27
+ export type SwapEventListener<
28
+ T extends ChainType,
29
+ S extends ISwap<T>
30
+ > = (event: ChainEvent<T["Data"]>, swap: S) => Promise<void>;
31
+
32
+ const logger = getLogger("UnifiedSwapEventListener: ");
33
+
34
+ export class UnifiedSwapEventListener<
35
+ T extends ChainType
36
+ > {
37
+
38
+ readonly storage: UnifiedSwapStorage<T>;
39
+ readonly events: T["Events"];
40
+ readonly listeners: {
41
+ [key in SwapType]?: {
42
+ listener: SwapEventListener<T, any>,
43
+ reviver: new (obj: any) => ISwap<T>
44
+ }
45
+ } = {};
46
+
47
+ constructor(unifiedStorage: UnifiedSwapStorage<T>, events: T["Events"]) {
48
+ this.storage = unifiedStorage;
49
+ this.events = events;
50
+ }
51
+
52
+ async processEvents(events: ChainEvent<T["Data"]>[]) {
53
+ const escrowHashesDeduped = new Set<string>();
54
+ events.forEach(event => {
55
+ const escrowHash = chainEventToEscrowHash(event);
56
+ if(escrowHash!=null) escrowHashesDeduped.add(escrowHash);
57
+ });
58
+ const escrowHashes = Array.from(escrowHashesDeduped);
59
+
60
+ logger.debug("processEvents(): Processing events with escrow hashes: ", escrowHashes);
61
+
62
+ const swaps = await this.storage.query<ISwap<T>>(
63
+ [
64
+ [{key: "escrowHash", value: escrowHashes}]
65
+ ],
66
+ (val: any) => {
67
+ const obj = this.listeners?.[val.type as SwapType];
68
+ if(obj==null) return null;
69
+ return new obj.reviver(val);
70
+ }
71
+ );
72
+ const swapsByEscrowHash: {[key: string]: ISwap<T>} = {};
73
+ swaps.forEach(swap => {
74
+ const escrowHash = swap._getEscrowHash();
75
+ if(escrowHash!=null) swapsByEscrowHash[escrowHash] = swap;
76
+ });
77
+
78
+ //We need to do this because FromBTCLNAutoSwaps might not yet know its escrowHash
79
+ // hence we try to get the claimHash and try to query based on that, FromBTCLNAutoSwaps
80
+ // will use their claimHash as escrowHash before they know the real escrowHash
81
+ const htlcCheckInitializeEvents: {[claimHash: string]: InitializeEvent<T["Data"]>} = {};
82
+
83
+ for(let event of events) {
84
+ const escrowHash = chainEventToEscrowHash(event);
85
+ if(escrowHash!=null) {
86
+ const swap = swapsByEscrowHash[escrowHash];
87
+ if(swap!=null) {
88
+ const obj = this.listeners[swap.getType()];
89
+ if(obj==null) continue;
90
+ await obj.listener(event, swap);
91
+ continue;
92
+ }
93
+ }
94
+ if(event instanceof InitializeEvent) {
95
+ if(event.swapType===ChainSwapType.HTLC) {
96
+ const swapData: T["Data"] = await event.swapData();
97
+ htlcCheckInitializeEvents[swapData.getClaimHash()] = event;
98
+ }
99
+ }
100
+ }
101
+
102
+ logger.debug("processEvents(): Additionally checking HTLC claim hashes: ", Object.keys(htlcCheckInitializeEvents));
103
+
104
+ if(Object.keys(htlcCheckInitializeEvents).length===0) return;
105
+
106
+ //Try to query based on claimData
107
+ const claimDataSwaps = await this.storage.query<ISwap<T>>(
108
+ [
109
+ [{key: "escrowHash", value: Object.keys(htlcCheckInitializeEvents)}]
110
+ ],
111
+ (val: any) => {
112
+ const obj = this.listeners?.[val.type as SwapType];
113
+ if(obj==null) return null;
114
+ return new obj.reviver(val);
115
+ }
116
+ );
117
+ const swapsByClaimDataHash: {[claimData: string]: ISwap<T>} = {};
118
+ claimDataSwaps.forEach(swap => {
119
+ const escrowHash = swap._getEscrowHash();
120
+ if(escrowHash!=null) swapsByClaimDataHash[escrowHash] = swap;
121
+ });
122
+
123
+ logger.debug("processEvents(): Additional HTLC swaps founds: ", swapsByClaimDataHash);
124
+
125
+ for(let claimData in htlcCheckInitializeEvents) {
126
+ const event = htlcCheckInitializeEvents[claimData];
127
+ const swap = swapsByClaimDataHash[claimData];
128
+ if(swap!=null) {
129
+ const obj = this.listeners[swap.getType()];
130
+ if(obj==null) continue;
131
+ await obj.listener(event, swap);
132
+ }
133
+ }
134
+
135
+ }
136
+
137
+ listener?: EventListener<T["Data"]>;
138
+ async start() {
139
+ if(this.listener!=null) return;
140
+ logger.info("start(): Starting unified swap event listener");
141
+ await this.storage.init();
142
+ logger.debug("start(): Storage initialized");
143
+ await this.events.init();
144
+ logger.debug("start(): Events initialized");
145
+ this.events.registerListener(this.listener = async (events) => {
146
+ await this.processEvents(events);
147
+ return true;
148
+ });
149
+ logger.info("start(): Successfully initiated the unified swap event listener!");
150
+ }
151
+
152
+ stop(): Promise<void> {
153
+ logger.info("stop(): Stopping unified swap event listener");
154
+ if(this.listener!=null) this.events.unregisterListener(this.listener);
155
+ return this.events.stop();
156
+ }
157
+
158
+ registerListener<S extends ISwap<T>>(type: SwapType, listener: SwapEventListener<T, S>, reviver: new (val: any) => S): void {
159
+ this.listeners[type] = {
160
+ listener,
161
+ reviver
162
+ };
163
+ }
164
+
165
+ unregisterListener(type: SwapType): boolean {
166
+ if(this.listeners[type]) return false;
167
+ delete this.listeners[type];
168
+ return true;
169
+ }
170
+
171
+ }
@@ -0,0 +1,92 @@
1
+ import {RequestError} from "../errors/RequestError";
2
+
3
+ import {timeoutSignal} from "../utils/TimeoutUtils";
4
+
5
+ /**
6
+ * Mimics fetch API byt adds a timeout to the request
7
+ *
8
+ * @param input
9
+ * @param init
10
+ */
11
+ export function fetchWithTimeout(input: RequestInfo | URL, init: RequestInit & {
12
+ timeout?: number
13
+ }): Promise<Response> {
14
+ if (init == null) init = {};
15
+ if (init.timeout != null) init.signal = timeoutSignal(init.timeout, new Error("Network request timed out"), init.signal ?? undefined);
16
+
17
+ return fetch(input, init).catch(e => {
18
+ if (e.name === "AbortError" && init.signal != null) {
19
+ throw init.signal.reason;
20
+ } else {
21
+ throw e;
22
+ }
23
+ });
24
+ }
25
+
26
+ /**
27
+ * Sends an HTTP GET request through a fetch API, handles non 200 response codes as errors
28
+ * @param url Send request to this URL
29
+ * @param timeout Timeout (in milliseconds) for the request to conclude
30
+ * @param abortSignal
31
+ * @param allowNon200 Whether to allow non-200 status code HTTP responses
32
+ * @throws {RequestError} if non 200 response code was returned or body cannot be parsed
33
+ */
34
+ export async function httpGet<T>(url: string, timeout?: number, abortSignal?: AbortSignal, allowNon200: boolean = false): Promise<T> {
35
+ const init = {
36
+ method: "GET",
37
+ timeout,
38
+ signal: abortSignal
39
+ };
40
+
41
+ const response: Response = await fetchWithTimeout(url, init);
42
+
43
+ if (response.status !== 200) {
44
+ let resp: string;
45
+ try {
46
+ resp = await response.text();
47
+ } catch (e) {
48
+ throw new RequestError(response.statusText, response.status);
49
+ }
50
+ if (allowNon200) {
51
+ try {
52
+ return JSON.parse(resp);
53
+ } catch (e) {
54
+ }
55
+ }
56
+ throw RequestError.parse(resp, response.status);
57
+ }
58
+
59
+ return await response.json();
60
+ }
61
+
62
+ /**
63
+ * Sends an HTTP POST request through a fetch API, handles non 200 response codes as errors
64
+ * @param url Send request to this URL
65
+ * @param body A HTTP request body to send to the server
66
+ * @param timeout Timeout (in milliseconds) for the request to conclude
67
+ * @param abortSignal
68
+ * @throws {RequestError} if non 200 response code was returned
69
+ */
70
+ export async function httpPost<T>(url: string, body: any, timeout?: number, abortSignal?: AbortSignal): Promise<T> {
71
+ const init = {
72
+ method: "POST",
73
+ timeout,
74
+ body: JSON.stringify(body),
75
+ headers: {'Content-Type': 'application/json'},
76
+ signal: abortSignal
77
+ };
78
+
79
+ const response: Response = timeout == null ? await fetch(url, init) : await fetchWithTimeout(url, init);
80
+
81
+ if (response.status !== 200) {
82
+ let resp: string;
83
+ try {
84
+ resp = await response.text();
85
+ } catch (e) {
86
+ throw new RequestError(response.statusText, response.status);
87
+ }
88
+ throw RequestError.parse(resp, response.status);
89
+ }
90
+
91
+ return await response.json();
92
+ }
@@ -0,0 +1,10 @@
1
+ export interface IParamReader {
2
+
3
+ /**
4
+ * Returns a promise when the specific property with the name is read from the stream
5
+ *
6
+ * @param name Name of the property
7
+ */
8
+ getParam<T>(name: string): Promise<T>;
9
+
10
+ }
@@ -0,0 +1,142 @@
1
+ import {IParamReader} from "./IParamReader";
2
+ import {Buffer} from "buffer";
3
+
4
+
5
+ export class ParamDecoder implements IParamReader {
6
+
7
+ frameHeader?: Buffer;
8
+ frameData: Buffer[] = [];
9
+ frameDataLength: number = 0;
10
+
11
+ closed: boolean = false;
12
+
13
+ params: {
14
+ [key: string]: {
15
+ promise: Promise<any>,
16
+ resolve?: (data: any) => void,
17
+ reject?: (err: any) => void
18
+ }
19
+ } = {};
20
+
21
+ /**
22
+ * Called when a frame is fully ready such that it can be parsed
23
+ *
24
+ * @param data Frame data
25
+ * @private
26
+ */
27
+ private onFrameRead(data: Buffer) {
28
+ const obj = JSON.parse(data.toString());
29
+ for(let key in obj) {
30
+ if(this.params[key]==null) {
31
+ this.params[key] = {
32
+ promise: Promise.resolve(obj[key])
33
+ };
34
+ } else {
35
+ const resolveFn = this.params[key].resolve;
36
+ if(resolveFn!=null) {
37
+ resolveFn(obj[key]);
38
+ delete this.params[key].resolve;
39
+ delete this.params[key].reject;
40
+ }
41
+ }
42
+ }
43
+ }
44
+
45
+ /**
46
+ * Called when data is read from the underlying source
47
+ *
48
+ * @param data Data that has been read from the underlying source
49
+ * @protected
50
+ */
51
+ protected onData(data: Buffer): void {
52
+ let leavesBuffer: Buffer | null = data;
53
+ while(leavesBuffer!=null && leavesBuffer.length>0) {
54
+ if(this.frameHeader==null) {
55
+ if(leavesBuffer.length<=4) {
56
+ this.frameHeader = leavesBuffer;
57
+ leavesBuffer = null;
58
+ } else {
59
+ this.frameHeader = leavesBuffer.subarray(0, 4);
60
+ leavesBuffer = leavesBuffer.subarray(4);
61
+ }
62
+ } else if(this.frameHeader.length<4) {
63
+ const requiredLen = 4-this.frameHeader.length;
64
+ if(leavesBuffer.length<=requiredLen) {
65
+ this.frameHeader = Buffer.concat([this.frameHeader, leavesBuffer]);
66
+ leavesBuffer = null;
67
+ } else {
68
+ this.frameHeader = Buffer.concat([this.frameHeader, leavesBuffer.subarray(0, requiredLen)]);
69
+ leavesBuffer = leavesBuffer.subarray(requiredLen);
70
+ }
71
+ }
72
+ if(leavesBuffer==null) continue;
73
+ if(this.frameHeader==null || this.frameHeader.length<4) continue;
74
+
75
+ const frameLength = this.frameHeader.readUint32LE();
76
+ const requiredLen = frameLength-this.frameDataLength;
77
+
78
+ if(leavesBuffer.length<=requiredLen) {
79
+ this.frameData.push(leavesBuffer);
80
+ this.frameDataLength += leavesBuffer.length;
81
+
82
+ leavesBuffer = null;
83
+ } else {
84
+ this.frameData.push(leavesBuffer.subarray(0, requiredLen));
85
+ this.frameDataLength += requiredLen;
86
+
87
+ leavesBuffer = leavesBuffer.subarray(requiredLen);
88
+ }
89
+
90
+ if(frameLength===this.frameDataLength) {
91
+ //Message read success
92
+ this.onFrameRead(Buffer.concat(this.frameData));
93
+ delete this.frameHeader;
94
+ this.frameData = [];
95
+ this.frameDataLength = 0;
96
+ }
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Called when the underlying source ends/closes/cancels
102
+ * @protected
103
+ */
104
+ protected onEnd(): void {
105
+ for(let key in this.params) {
106
+ this.params[key].reject?.(new Error("EOF before field seen!"));
107
+ }
108
+ this.closed = true;
109
+ }
110
+
111
+ /**
112
+ * Called when an error happens with the underlying stream
113
+ *
114
+ * @param e Error
115
+ * @protected
116
+ */
117
+ protected onError(e: any): void {
118
+ for(let key in this.params) {
119
+ this.params[key].reject?.(e);
120
+ }
121
+ this.closed = true;
122
+ }
123
+
124
+ getParam<T>(key: string): Promise<T> {
125
+ if(this.params[key]==null) {
126
+ if(this.closed) return Promise.reject(new Error("Stream already closed without param received!"));
127
+ let resolve: (data: any) => void;
128
+ let reject: (err: any) => void;
129
+ const promise = new Promise((_resolve, _reject) => {
130
+ resolve = _resolve
131
+ reject = _reject;
132
+ });
133
+ this.params[key] = {
134
+ resolve: resolve!,
135
+ reject: reject!,
136
+ promise
137
+ }
138
+ }
139
+ return this.params[key].promise;
140
+ }
141
+
142
+ }
@@ -0,0 +1,37 @@
1
+ import {Buffer} from "buffer";
2
+
3
+ export class ParamEncoder {
4
+
5
+ private readonly writeFN: (data: Buffer) => Promise<void>;
6
+ private readonly endFN: () => Promise<void>;
7
+
8
+ constructor(write: (data: Buffer) => Promise<void>, end: () => Promise<void>) {
9
+ this.writeFN = write;
10
+ this.endFN = end;
11
+ }
12
+
13
+ /**
14
+ * Write a set of parameters to the underlying sink
15
+ *
16
+ * @param data
17
+ */
18
+ writeParams(data: {[key: string]: any}): Promise<void> {
19
+ const serialized: Buffer = Buffer.from(JSON.stringify(data));
20
+
21
+ const frameLengthBuffer = Buffer.alloc(4);
22
+ frameLengthBuffer.writeUint32LE(serialized.length);
23
+
24
+ return this.writeFN(Buffer.concat([
25
+ frameLengthBuffer,
26
+ serialized
27
+ ]));
28
+ }
29
+
30
+ /**
31
+ * Cancels the underlying sink and encoder
32
+ */
33
+ end(): Promise<void> {
34
+ return this.endFN();
35
+ }
36
+
37
+ }
@@ -0,0 +1,153 @@
1
+
2
+ export function parseBigInt(str: string | number): bigint | null {
3
+ if(str==null) return null;
4
+ if(typeof(str)!=="string" && typeof(str)!=="number") return null;
5
+ try {
6
+ return BigInt(str);
7
+ } catch (e) {
8
+ return null;
9
+ }
10
+ }
11
+
12
+ export enum FieldTypeEnum {
13
+ String=0,
14
+ Boolean=1,
15
+ Number=2,
16
+ BigInt=3,
17
+ Any=4,
18
+
19
+ StringOptional=100,
20
+ BooleanOptional=101,
21
+ NumberOptional=102,
22
+ BigIntOptional=103,
23
+ AnyOptional=104,
24
+ }
25
+
26
+ export type FieldType<T extends FieldTypeEnum | RequestSchema | ((val: any) => (string | boolean | number | bigint | any))> =
27
+ T extends FieldTypeEnum.String ? string :
28
+ T extends FieldTypeEnum.Boolean ? boolean :
29
+ T extends FieldTypeEnum.Number ? number :
30
+ T extends FieldTypeEnum.BigInt ? bigint :
31
+ T extends FieldTypeEnum.Any ? any :
32
+ T extends FieldTypeEnum.StringOptional ? (string | null) :
33
+ T extends FieldTypeEnum.BooleanOptional ? (boolean | null) :
34
+ T extends FieldTypeEnum.NumberOptional ? (number | null) :
35
+ T extends FieldTypeEnum.BigIntOptional ? (bigint | null) :
36
+ T extends FieldTypeEnum.AnyOptional ? (any | null) :
37
+ T extends RequestSchema ? RequestSchemaResult<T> :
38
+ T extends ((val: any) => string) ? string :
39
+ T extends ((val: any) => boolean) ? boolean :
40
+ T extends ((val: any) => number) ? number :
41
+ T extends ((val: any) => bigint) ? bigint :
42
+ T extends ((val: any) => any) ? any :
43
+ never;
44
+
45
+ export type RequestSchemaResult<T extends RequestSchema> = {
46
+ [key in keyof T]: FieldType<T[key]>
47
+ }
48
+
49
+ export type RequestSchemaResultPromise<T extends RequestSchema> = {
50
+ [key in keyof T]: Promise<FieldType<T[key]>>
51
+ }
52
+
53
+ export type RequestSchema = {
54
+ [fieldName: string]: FieldTypeEnum | RequestSchema | ((val: any) => any)
55
+ }
56
+
57
+ function isAllOptional(schema: RequestSchema) {
58
+ for(let key in schema) {
59
+ if(!isOptionalField(schema[key])) return false;
60
+ }
61
+ return true;
62
+ }
63
+
64
+ export function isOptionalField(type: FieldTypeEnum | RequestSchema | ((val: any) => (string | boolean | number | bigint | any))) {
65
+ if(typeof(type)==="function") return type(undefined)!=null;
66
+ if(typeof(type)==="object") return isAllOptional(type);
67
+ return type>=100;
68
+ }
69
+
70
+ export function verifyField<
71
+ T extends FieldTypeEnum | RequestSchema | ((val: any) => (string | boolean | number | bigint | any))
72
+ >(fieldType: T, val: any): FieldType<T> | undefined {
73
+
74
+ const type: FieldTypeEnum | RequestSchema | ((val: any) => (string | boolean | number | bigint | any)) = fieldType;
75
+ if(typeof(type)==="function") {
76
+ const result = type(val);
77
+ if(result==null) return;
78
+ return result;
79
+ }
80
+
81
+ if(val==null && isOptionalField(type as FieldTypeEnum)) {
82
+ return null as FieldType<T>;
83
+ }
84
+
85
+ if(type===FieldTypeEnum.Any || type===FieldTypeEnum.AnyOptional) {
86
+ return val;
87
+ } else if(type===FieldTypeEnum.Boolean || type===FieldTypeEnum.BooleanOptional) {
88
+ if(typeof(val)!=="boolean") return;
89
+ return val as any;
90
+ } else if(type===FieldTypeEnum.Number || type===FieldTypeEnum.NumberOptional) {
91
+ if(typeof(val)!=="number") return;
92
+ if(isNaN(val as number)) return;
93
+ return val as any;
94
+ } else if(type===FieldTypeEnum.BigInt || type===FieldTypeEnum.BigIntOptional) {
95
+ const result = parseBigInt(val);
96
+ if(result==null) return;
97
+ return result as any;
98
+ } else if(type===FieldTypeEnum.String || type===FieldTypeEnum.StringOptional) {
99
+ if(typeof(val)!=="string") return;
100
+ return val as any;
101
+ } else {
102
+ //Probably another request schema
103
+ const result = verifySchema(val, type as RequestSchema);
104
+ if(result==null) return;
105
+ return result as any;
106
+ }
107
+
108
+ }
109
+
110
+ export function verifySchema<T extends RequestSchema>(req: any, schema: T): RequestSchemaResult<T> | null {
111
+ if(req==null) return null;
112
+ const resultSchema: any = {};
113
+ for(let fieldName in schema) {
114
+ const val: any = req[fieldName];
115
+
116
+ const type: FieldTypeEnum | RequestSchema | ((val: any) => boolean) = schema[fieldName];
117
+ if(typeof(type)==="function") {
118
+ const result = type(val);
119
+ if(result==null) return null;
120
+ resultSchema[fieldName] = result;
121
+ continue;
122
+ }
123
+
124
+ if(val==null && isOptionalField(type as FieldTypeEnum)) {
125
+ resultSchema[fieldName] = null;
126
+ continue;
127
+ }
128
+
129
+ if(type===FieldTypeEnum.Any || type===FieldTypeEnum.AnyOptional) {
130
+ resultSchema[fieldName] = val;
131
+ } else if(type===FieldTypeEnum.Boolean || type===FieldTypeEnum.BooleanOptional) {
132
+ if(typeof(val)!=="boolean") return null;
133
+ resultSchema[fieldName] = val;
134
+ } else if(type===FieldTypeEnum.Number || type===FieldTypeEnum.NumberOptional) {
135
+ if(typeof(val)!=="number") return null;
136
+ if(isNaN(val as number)) return null;
137
+ resultSchema[fieldName] = val;
138
+ } else if(type===FieldTypeEnum.BigInt || type===FieldTypeEnum.BigIntOptional) {
139
+ const result = parseBigInt(val);
140
+ if(result==null) return null;
141
+ resultSchema[fieldName] = result;
142
+ } else if(type===FieldTypeEnum.String || type===FieldTypeEnum.StringOptional) {
143
+ if(typeof(val)!=="string") return null;
144
+ resultSchema[fieldName] = val;
145
+ } else {
146
+ //Probably another request schema
147
+ const result = verifySchema(val, type as RequestSchema);
148
+ if(result==null) return null;
149
+ resultSchema[fieldName] = result;
150
+ }
151
+ }
152
+ return resultSchema;
153
+ }