@rabbitio/ui-kit 1.0.0-beta.11 → 1.0.0-beta.111

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 (381) hide show
  1. package/.env.example +1 -0
  2. package/.gitlab-ci.yml +29 -0
  3. package/.husky/commit-msg +19 -0
  4. package/.husky/pre-push +1 -0
  5. package/README.md +14 -4
  6. package/coverage/base.css +224 -0
  7. package/coverage/block-navigation.js +87 -0
  8. package/coverage/clover.xml +17666 -0
  9. package/coverage/coverage-final.json +119 -0
  10. package/coverage/favicon.png +0 -0
  11. package/coverage/index.html +1001 -0
  12. package/coverage/prettify.css +1 -0
  13. package/coverage/prettify.js +2 -0
  14. package/coverage/rabbit-ui-kit/index.html +116 -0
  15. package/coverage/rabbit-ui-kit/index.js.html +88 -0
  16. package/coverage/rabbit-ui-kit/src/common-apis/adapters/analyticsAdapters/googleAnalyticsAdapter.js.html +151 -0
  17. package/coverage/rabbit-ui-kit/src/common-apis/adapters/analyticsAdapters/index.html +146 -0
  18. package/coverage/rabbit-ui-kit/src/common-apis/adapters/analyticsAdapters/metrikaAdapter.js.html +172 -0
  19. package/coverage/rabbit-ui-kit/src/common-apis/adapters/analyticsAdapters/mixpanelAdapter.js.html +199 -0
  20. package/coverage/rabbit-ui-kit/src/common-apis/adapters/axiosAdapter.js.html +190 -0
  21. package/coverage/rabbit-ui-kit/src/common-apis/adapters/index.html +131 -0
  22. package/coverage/rabbit-ui-kit/src/common-apis/adapters/qrUtils.js.html +139 -0
  23. package/coverage/rabbit-ui-kit/src/common-apis/external-apis/apiGroups.js.html +253 -0
  24. package/coverage/rabbit-ui-kit/src/common-apis/external-apis/emailAPI.js.html +133 -0
  25. package/coverage/rabbit-ui-kit/src/common-apis/external-apis/index.html +146 -0
  26. package/coverage/rabbit-ui-kit/src/common-apis/external-apis/ipAddressProviders.js.html +391 -0
  27. package/coverage/rabbit-ui-kit/src/common-apis/globalConstants.jsx.html +94 -0
  28. package/coverage/rabbit-ui-kit/src/common-apis/index.html +116 -0
  29. package/coverage/rabbit-ui-kit/src/common-apis/models/blockchain.js.html +115 -0
  30. package/coverage/rabbit-ui-kit/src/common-apis/models/coin.js.html +829 -0
  31. package/coverage/rabbit-ui-kit/src/common-apis/models/index.html +146 -0
  32. package/coverage/rabbit-ui-kit/src/common-apis/models/protocol.js.html +100 -0
  33. package/coverage/rabbit-ui-kit/src/common-apis/services/fiatCurrenciesService.js.html +544 -0
  34. package/coverage/rabbit-ui-kit/src/common-apis/services/index.html +116 -0
  35. package/coverage/rabbit-ui-kit/src/common-apis/utils/amountUtils.js.html +1234 -0
  36. package/coverage/rabbit-ui-kit/src/common-apis/utils/cache.js.html +811 -0
  37. package/coverage/rabbit-ui-kit/src/common-apis/utils/errorUtils.js.html +211 -0
  38. package/coverage/rabbit-ui-kit/src/common-apis/utils/index.html +191 -0
  39. package/coverage/rabbit-ui-kit/src/common-apis/utils/logging/index.html +131 -0
  40. package/coverage/rabbit-ui-kit/src/common-apis/utils/logging/logger.js.html +211 -0
  41. package/coverage/rabbit-ui-kit/src/common-apis/utils/logging/logsStorage.js.html +268 -0
  42. package/coverage/rabbit-ui-kit/src/common-apis/utils/postponeExecution.js.html +118 -0
  43. package/coverage/rabbit-ui-kit/src/common-apis/utils/rabbitTicker.js.html +157 -0
  44. package/coverage/rabbit-ui-kit/src/common-apis/utils/safeStringify.js.html +235 -0
  45. package/coverage/rabbit-ui-kit/src/index.html +116 -0
  46. package/coverage/rabbit-ui-kit/src/index.js.html +382 -0
  47. package/coverage/rabbit-ui-kit/src/robust-api-caller/cacheAndConcurrentRequestsResolver.js.html +1660 -0
  48. package/coverage/rabbit-ui-kit/src/robust-api-caller/cachedRobustExternalApiCallerService.js.html +526 -0
  49. package/coverage/rabbit-ui-kit/src/robust-api-caller/cancelProcessing.js.html +172 -0
  50. package/coverage/rabbit-ui-kit/src/robust-api-caller/concurrentCalculationsMetadataHolder.js.html +310 -0
  51. package/coverage/rabbit-ui-kit/src/robust-api-caller/externalApiProvider.js.html +553 -0
  52. package/coverage/rabbit-ui-kit/src/robust-api-caller/externalServicesStatsCollector.js.html +319 -0
  53. package/coverage/rabbit-ui-kit/src/robust-api-caller/index.html +206 -0
  54. package/coverage/rabbit-ui-kit/src/robust-api-caller/robustExternalAPICallerService.js.html +997 -0
  55. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/exolixSwapProvider.js.html +1891 -0
  56. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/goexmeSwapProvider.js.html +2077 -0
  57. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/index.html +191 -0
  58. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/letsExchangeSwapProvider.js.html +1633 -0
  59. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/swapProvider.js.html +1825 -0
  60. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/swapspaceSwapProvider.js.html +1924 -0
  61. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/utils.js.html +163 -0
  62. package/coverage/rabbit-ui-kit/src/swaps-lib/models/baseSwapCreationInfo.js.html +319 -0
  63. package/coverage/rabbit-ui-kit/src/swaps-lib/models/existingSwap.js.html +514 -0
  64. package/coverage/rabbit-ui-kit/src/swaps-lib/models/existingSwapWithFiatData.js.html +529 -0
  65. package/coverage/rabbit-ui-kit/src/swaps-lib/models/index.html +176 -0
  66. package/coverage/rabbit-ui-kit/src/swaps-lib/models/partner.js.html +166 -0
  67. package/coverage/rabbit-ui-kit/src/swaps-lib/models/swapProviderCoinInfo.js.html +331 -0
  68. package/coverage/rabbit-ui-kit/src/swaps-lib/services/index.html +116 -0
  69. package/coverage/rabbit-ui-kit/src/swaps-lib/services/publicSwapService.js.html +1570 -0
  70. package/coverage/rabbit-ui-kit/src/swaps-lib/utils/index.html +116 -0
  71. package/coverage/rabbit-ui-kit/src/swaps-lib/utils/swapUtils.js.html +706 -0
  72. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/arrowIcon.jsx.html +124 -0
  73. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/arrowTosca.jsx.html +127 -0
  74. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/arrowWhite.jsx.html +127 -0
  75. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/darkRectangle.jsx.html +106 -0
  76. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/determinedError.jsx.html +439 -0
  77. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/failedValidationIcon.jsx.html +202 -0
  78. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/index.html +281 -0
  79. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/infoIcon.jsx.html +133 -0
  80. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/messageIcon.jsx.html +346 -0
  81. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/noticeQuestionIcon.jsx.html +247 -0
  82. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/successfulValidationIcon.jsx.html +163 -0
  83. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/supportDialogImage.jsx.html +268 -0
  84. package/coverage/rabbit-ui-kit/src/ui-kit/assets/wrappedImages/walletIcon.jsx.html +151 -0
  85. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/AssetIcon/AssetIcon.jsx.html +256 -0
  86. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/AssetIcon/index.html +116 -0
  87. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/AssetSelection/AssetSelection.jsx.html +289 -0
  88. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/AssetSelection/index.html +116 -0
  89. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/BackgroundTitle/BackgroundTitle.jsx.html +187 -0
  90. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/BackgroundTitle/index.html +116 -0
  91. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/InformationMessage/InformationMessage.jsx.html +238 -0
  92. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/InformationMessage/index.html +116 -0
  93. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Input/Input.jsx.html +634 -0
  94. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Input/index.html +116 -0
  95. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/LoadingDots/LoadingDots.jsx.html +196 -0
  96. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/LoadingDots/index.html +116 -0
  97. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/NoticeIcon/NoticeIcon.jsx.html +277 -0
  98. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/NoticeIcon/index.html +116 -0
  99. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/QrCode/QrCode.jsx.html +199 -0
  100. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/QrCode/index.html +116 -0
  101. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/RateSelector/RateSelector.jsx.html +175 -0
  102. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/RateSelector/index.html +116 -0
  103. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/SupportChat/SupportChat.jsx.html +217 -0
  104. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/SupportChat/index.html +116 -0
  105. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Textarea/Textarea.jsx.html +529 -0
  106. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Textarea/index.html +116 -0
  107. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/TitleBox/TitleBox.jsx.html +508 -0
  108. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/TitleBox/index.html +116 -0
  109. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Tooltip/Tooltip.jsx.html +316 -0
  110. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Tooltip/index.html +116 -0
  111. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/TwoLinesOfText/LinesOfText.jsx.html +313 -0
  112. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/TwoLinesOfText/index.html +116 -0
  113. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Validation/Validation.jsx.html +202 -0
  114. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/Validation/index.html +116 -0
  115. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/Button/Button.jsx.html +733 -0
  116. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/Button/index.html +116 -0
  117. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/Close/Close.jsx.html +259 -0
  118. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/Close/index.html +116 -0
  119. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/LinkButton/LinkButton.jsx.html +433 -0
  120. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/LinkButton/index.html +116 -0
  121. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx.html +415 -0
  122. package/coverage/rabbit-ui-kit/src/ui-kit/components/atoms/buttons/RadioButtonWithText/index.html +116 -0
  123. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/AmountInput/AmountInput.jsx.html +1429 -0
  124. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/AmountInput/index.html +116 -0
  125. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/CoinPicker/CoinPicker.jsx.html +1474 -0
  126. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/CoinPicker/index.html +116 -0
  127. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/ColoredNotice/ColoredNotice.jsx.html +241 -0
  128. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/ColoredNotice/index.html +116 -0
  129. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/LineWithIconLink/LineWithIconLink.jsx.html +190 -0
  130. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/LineWithIconLink/index.html +116 -0
  131. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/LogoCarousel/LogoCarousel.jsx.html +307 -0
  132. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/LogoCarousel/index.html +116 -0
  133. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/SearchableCoinsList/SearchableCoinsList.jsx.html +427 -0
  134. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/SearchableCoinsList/index.html +116 -0
  135. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx.html +181 -0
  136. package/coverage/rabbit-ui-kit/src/ui-kit/components/molecules/TitledLineWithIconLink/index.html +116 -0
  137. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx.html +283 -0
  138. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/CoinPickerDialogStep/index.html +116 -0
  139. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/Dialog.jsx.html +1567 -0
  140. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/DialogButtons/DialogButtons.jsx.html +481 -0
  141. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/DialogButtons/index.html +116 -0
  142. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/DialogStep/DialogStep.jsx.html +1747 -0
  143. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/DialogStep/index.html +116 -0
  144. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/Dialog/index.html +116 -0
  145. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/SwapForm/SwapForm.jsx.html +4228 -0
  146. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/SwapForm/index.html +116 -0
  147. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/WaitlistSubscription/WaitlistSubscription.jsx.html +559 -0
  148. package/coverage/rabbit-ui-kit/src/ui-kit/components/organisms/WaitlistSubscription/index.html +116 -0
  149. package/coverage/rabbit-ui-kit/src/ui-kit/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx.html +316 -0
  150. package/coverage/rabbit-ui-kit/src/ui-kit/components/templates/DeterminedErrorDialogStep/index.html +116 -0
  151. package/coverage/rabbit-ui-kit/src/ui-kit/hooks/index.html +146 -0
  152. package/coverage/rabbit-ui-kit/src/ui-kit/hooks/useCallHandlingErrors.js.html +166 -0
  153. package/coverage/rabbit-ui-kit/src/ui-kit/hooks/useIsHydrated.js.html +121 -0
  154. package/coverage/rabbit-ui-kit/src/ui-kit/hooks/useReferredState.js.html +157 -0
  155. package/coverage/rabbit-ui-kit/src/ui-kit/utils/index.html +176 -0
  156. package/coverage/rabbit-ui-kit/src/ui-kit/utils/inputValueProviders.js.html +235 -0
  157. package/coverage/rabbit-ui-kit/src/ui-kit/utils/searchCoins.js.html +259 -0
  158. package/coverage/rabbit-ui-kit/src/ui-kit/utils/textUtils.js.html +139 -0
  159. package/coverage/rabbit-ui-kit/src/ui-kit/utils/uiUtils.js.html +121 -0
  160. package/coverage/rabbit-ui-kit/src/ui-kit/utils/urlQueryUtils.js.html +271 -0
  161. package/coverage/rabbit-ui-kit/stories/atoms/BackgroundTitle.stories.jsx.html +202 -0
  162. package/coverage/rabbit-ui-kit/stories/atoms/LinesOfText.stories.jsx.html +283 -0
  163. package/coverage/rabbit-ui-kit/stories/atoms/LoadingDots.stories.jsx.html +226 -0
  164. package/coverage/rabbit-ui-kit/stories/atoms/QrCode.stories.jsx.html +175 -0
  165. package/coverage/rabbit-ui-kit/stories/atoms/RateSelector.stories.jsx.html +136 -0
  166. package/coverage/rabbit-ui-kit/stories/atoms/Validation.stories.jsx.html +178 -0
  167. package/coverage/rabbit-ui-kit/stories/atoms/buttons/Button.stories.jsx.html +883 -0
  168. package/coverage/rabbit-ui-kit/stories/atoms/buttons/Close.stories.jsx.html +211 -0
  169. package/coverage/rabbit-ui-kit/stories/atoms/buttons/LinkButton.stories.jsx.html +301 -0
  170. package/coverage/rabbit-ui-kit/stories/atoms/buttons/index.html +146 -0
  171. package/coverage/rabbit-ui-kit/stories/atoms/index.html +191 -0
  172. package/coverage/rabbit-ui-kit/stories/molecules/AmountInput.stories.jsx.html +289 -0
  173. package/coverage/rabbit-ui-kit/stories/molecules/CoinPicker.stories.jsx.html +322 -0
  174. package/coverage/rabbit-ui-kit/stories/molecules/ColoredNotice.stories.jsx.html +178 -0
  175. package/coverage/rabbit-ui-kit/stories/molecules/LineWithIconLink.stories.jsx.html +154 -0
  176. package/coverage/rabbit-ui-kit/stories/molecules/LogoCarousel.stories.jsx.html +235 -0
  177. package/coverage/rabbit-ui-kit/stories/molecules/TitledLineWithIconLink.stories.jsx.html +160 -0
  178. package/coverage/rabbit-ui-kit/stories/molecules/index.html +191 -0
  179. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/Dialog.stories.jsx.html +523 -0
  180. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogButtons/DialogButtons.stories.jsx.html +328 -0
  181. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogButtons/index.html +116 -0
  182. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogStep/DialogStep.stories.jsx.html +337 -0
  183. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/DialogStep/index.html +116 -0
  184. package/coverage/rabbit-ui-kit/stories/organisms/Dialog/index.html +116 -0
  185. package/coverage/rabbit-ui-kit/stories/organisms/WaitlistSubscription.stories.jsx.html +151 -0
  186. package/coverage/rabbit-ui-kit/stories/organisms/index.html +116 -0
  187. package/coverage/rabbit-ui-kit/stories/stubs/coins.jsx.html +6880 -0
  188. package/coverage/rabbit-ui-kit/stories/stubs/exampleContent.jsx.html +145 -0
  189. package/coverage/rabbit-ui-kit/stories/stubs/index.html +131 -0
  190. package/coverage/rabbit-ui-kit/stories/templates/DeterminedErrorDialogStep.stories.jsx.html +190 -0
  191. package/coverage/rabbit-ui-kit/stories/templates/index.html +116 -0
  192. package/coverage/sort-arrow-sprite.png +0 -0
  193. package/coverage/sorter.js +196 -0
  194. package/dist/global.css +197 -0
  195. package/dist/global.css.map +1 -0
  196. package/dist/index.cjs +13003 -1052
  197. package/dist/index.cjs.map +1 -1
  198. package/dist/index.css +2350 -8491
  199. package/dist/index.css.map +1 -1
  200. package/dist/index.modern.js +9951 -847
  201. package/dist/index.modern.js.map +1 -1
  202. package/dist/index.module.js +12930 -1066
  203. package/dist/index.module.js.map +1 -1
  204. package/dist/index.umd.js +12994 -1055
  205. package/dist/index.umd.js.map +1 -1
  206. package/package.json +35 -9
  207. package/raw +1000 -0
  208. package/src/common-apis/adapters/analyticsAdapters/googleAnalyticsAdapter.js +22 -0
  209. package/src/common-apis/adapters/analyticsAdapters/metrikaAdapter.js +29 -0
  210. package/src/common-apis/adapters/analyticsAdapters/mixpanelAdapter.js +38 -0
  211. package/src/common-apis/adapters/axiosAdapter.js +35 -0
  212. package/src/common-apis/adapters/qrUtils.js +18 -0
  213. package/src/common-apis/external-apis/apiGroups.js +56 -0
  214. package/src/common-apis/external-apis/emailAPI.js +16 -0
  215. package/src/common-apis/external-apis/ipAddressProviders.js +102 -0
  216. package/src/common-apis/globalConstants.jsx +3 -0
  217. package/src/{common → common-apis}/models/coin.js +98 -7
  218. package/src/{common → common-apis/services}/fiatCurrenciesService.js +4 -12
  219. package/src/common-apis/tests/integration/external-apis/ipAddressProviders/getClientIpAddress.test.js +18 -0
  220. package/src/common-apis/tests/units/utils/amountUtils/composeRateText.test.js +152 -0
  221. package/src/{common → common-apis/utils}/amountUtils.js +100 -140
  222. package/src/{common → common-apis}/utils/cache.js +15 -41
  223. package/src/{common → common-apis/utils}/errorUtils.js +15 -0
  224. package/src/{common → common-apis}/utils/logging/logger.js +7 -13
  225. package/src/common-apis/utils/postponeExecution.js +11 -0
  226. package/src/common-apis/utils/rabbitTicker.js +24 -0
  227. package/src/index.js +90 -14
  228. package/src/robust-api-caller/cacheAndConcurrentRequestsResolver.js +525 -0
  229. package/src/robust-api-caller/cachedRobustExternalApiCallerService.js +147 -0
  230. package/src/robust-api-caller/cancelProcessing.js +29 -0
  231. package/src/robust-api-caller/concurrentCalculationsMetadataHolder.js +75 -0
  232. package/src/robust-api-caller/externalApiProvider.js +156 -0
  233. package/src/robust-api-caller/externalServicesStatsCollector.js +78 -0
  234. package/src/robust-api-caller/robustExternalAPICallerService.js +304 -0
  235. package/src/robust-api-caller/tests/robustExternalAPICallerService/robustExternalAPICallerService/callExternalAPI/_performCallAttempt.test.js +533 -0
  236. package/src/robust-api-caller/tests/robustExternalAPICallerService/robustExternalAPICallerService/callExternalAPI/callExternalAPI.test.js +532 -0
  237. package/src/robust-api-caller/tests/robustExternalAPICallerService/robustExternalAPICallerService/constructor.test.js +19 -0
  238. package/src/swaps-lib/external-apis/exolixSwapProvider.js +602 -0
  239. package/src/swaps-lib/external-apis/goexmeSwapProvider.js +664 -0
  240. package/src/swaps-lib/external-apis/letsExchangeSwapProvider.js +516 -0
  241. package/src/swaps-lib/external-apis/swapProvider.js +435 -24
  242. package/src/swaps-lib/external-apis/swapspaceSwapProvider.js +613 -0
  243. package/src/swaps-lib/external-apis/utils.js +26 -0
  244. package/src/swaps-lib/models/baseSwapCreationInfo.js +78 -0
  245. package/src/swaps-lib/models/existingSwap.js +101 -16
  246. package/src/swaps-lib/models/existingSwapWithFiatData.js +148 -0
  247. package/src/swaps-lib/models/partner.js +27 -0
  248. package/src/swaps-lib/models/swapProviderCoinInfo.js +82 -0
  249. package/src/swaps-lib/services/publicSwapService.js +495 -0
  250. package/src/swaps-lib/test/external-apis/exolixSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +34 -0
  251. package/src/swaps-lib/test/external-apis/exolixSwapProvider/createSwap.test.js +1043 -0
  252. package/src/swaps-lib/test/external-apis/exolixSwapProvider/getSwapInfo.test.js +611 -0
  253. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +148 -0
  254. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/createSwap.test.js +115 -0
  255. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/getSwapInfo.test.js +149 -0
  256. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/PairSupport.int.test.js +97 -0
  257. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/_fetchSupportedCurrenciesIfNeeded.int.test.js +171 -0
  258. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/createSwap.int.test.js +239 -0
  259. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/getSwapInfo.int.test.js +141 -0
  260. package/src/swaps-lib/test/external-apis/swapProvider/getAllSupportedCurrencies.test.js +63 -0
  261. package/src/swaps-lib/test/external-apis/swapProvider/getDepositCurrencies.test.js +73 -0
  262. package/src/swaps-lib/test/external-apis/swapProvider/getWithdrawalCurrencies.test.js +102 -0
  263. package/src/swaps-lib/test/external-apis/swapProvider/removeProtocolNameFromCoinName.test.js +152 -0
  264. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +536 -0
  265. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/createSwap.test.js +1214 -0
  266. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/getSwapInfo.test.js +1743 -0
  267. package/src/swaps-lib/test/utils/swapUtils/safeHandleRequestsLimitExceeding.test.js +80 -0
  268. package/src/swaps-lib/utils/swapUtils.js +207 -0
  269. package/{styles → src/ui-kit/assets/styles}/_functions.scss +5 -0
  270. package/{styles → src/ui-kit/assets/styles}/_mixins.scss +2 -2
  271. package/{styles → src/ui-kit/assets/styles}/_placeholder.scss +3 -3
  272. package/{styles → src/ui-kit/assets/styles}/_variables.scss +17 -15
  273. package/src/ui-kit/assets/styles/fonts/NunitoSans-Bold.ttf +0 -0
  274. package/src/ui-kit/assets/styles/fonts/NunitoSans-ExtraBold.ttf +0 -0
  275. package/src/ui-kit/assets/styles/fonts/NunitoSans-Light.ttf +0 -0
  276. package/src/ui-kit/assets/styles/fonts/NunitoSans-Regular.ttf +0 -0
  277. package/src/ui-kit/assets/styles/fonts/NunitoSans-SemiBold.ttf +0 -0
  278. package/src/ui-kit/assets/styles/global.scss +171 -0
  279. package/src/ui-kit/assets/styles/index.scss +10 -0
  280. package/src/ui-kit/assets/wrappedImages/arrowIcon.jsx +13 -0
  281. package/src/ui-kit/assets/wrappedImages/arrowTosca.jsx +14 -0
  282. package/src/ui-kit/assets/wrappedImages/arrowWhite.jsx +14 -0
  283. package/src/ui-kit/assets/wrappedImages/darkRectangle.jsx +7 -0
  284. package/src/ui-kit/assets/wrappedImages/determinedError.jsx +118 -0
  285. package/src/ui-kit/assets/wrappedImages/failedValidationIcon.jsx +39 -0
  286. package/src/ui-kit/assets/wrappedImages/infoIcon.jsx +16 -0
  287. package/src/ui-kit/assets/wrappedImages/messageIcon.jsx +87 -0
  288. package/src/ui-kit/assets/wrappedImages/noticeQuestionIcon.jsx +54 -0
  289. package/src/ui-kit/assets/wrappedImages/successfulValidationIcon.jsx +26 -0
  290. package/src/ui-kit/assets/wrappedImages/supportDialogImage.jsx +61 -0
  291. package/src/ui-kit/assets/wrappedImages/walletIcon.jsx +22 -0
  292. package/src/{components → ui-kit/components}/atoms/AssetIcon/AssetIcon.jsx +16 -14
  293. package/src/{components → ui-kit/components}/atoms/AssetIcon/asset-icon.module.scss +1 -1
  294. package/src/ui-kit/components/atoms/AssetSelection/AssetSelection.jsx +68 -0
  295. package/src/ui-kit/components/atoms/AssetSelection/asset-selection.module.scss +56 -0
  296. package/src/ui-kit/components/atoms/BackgroundTitle/BackgroundTitle.jsx +34 -0
  297. package/src/ui-kit/components/atoms/BackgroundTitle/background-title.module.scss +52 -0
  298. package/src/ui-kit/components/atoms/InformationMessage/InformationMessage.jsx +51 -0
  299. package/src/ui-kit/components/atoms/InformationMessage/information-message.module.scss +38 -0
  300. package/src/ui-kit/components/atoms/Input/Input.jsx +183 -0
  301. package/src/ui-kit/components/atoms/Input/input.module.scss +107 -0
  302. package/src/{components → ui-kit/components}/atoms/LoadingDots/LoadingDots.jsx +8 -28
  303. package/src/{components → ui-kit/components}/atoms/LoadingDots/LoadingDots.module.scss +3 -2
  304. package/src/ui-kit/components/atoms/NoticeIcon/NoticeIcon.jsx +64 -0
  305. package/src/ui-kit/components/atoms/NoticeIcon/notice-icon.module.scss +14 -0
  306. package/src/ui-kit/components/atoms/QrCode/QrCode.jsx +38 -0
  307. package/src/ui-kit/components/atoms/QrCode/qr-code.module.scss +8 -0
  308. package/src/ui-kit/components/atoms/RateSelector/RateSelector.jsx +30 -0
  309. package/src/ui-kit/components/atoms/RateSelector/rate-selector.module.scss +47 -0
  310. package/src/{components → ui-kit/components}/atoms/SupportChat/SupportChat.jsx +5 -1
  311. package/src/ui-kit/components/atoms/Textarea/Textarea.jsx +148 -0
  312. package/src/ui-kit/components/atoms/Textarea/textarea.module.scss +71 -0
  313. package/src/ui-kit/components/atoms/TitleBox/TitleBox.jsx +141 -0
  314. package/src/ui-kit/components/atoms/TitleBox/title-box.module.scss +32 -0
  315. package/src/ui-kit/components/atoms/Tooltip/Tooltip.jsx +77 -0
  316. package/src/ui-kit/components/atoms/Tooltip/tooltip.module.scss +237 -0
  317. package/src/ui-kit/components/atoms/TwoLinesOfText/LinesOfText.jsx +76 -0
  318. package/src/ui-kit/components/atoms/TwoLinesOfText/lines-of-text.module.scss +65 -0
  319. package/src/ui-kit/components/atoms/Validation/Validation.jsx +39 -0
  320. package/src/ui-kit/components/atoms/Validation/validation.module.scss +19 -0
  321. package/src/{components → ui-kit/components}/atoms/buttons/Button/Button.jsx +26 -45
  322. package/src/{components → ui-kit/components}/atoms/buttons/Button/Button.module.scss +1 -1
  323. package/src/ui-kit/components/atoms/buttons/Close/Close.jsx +58 -0
  324. package/src/ui-kit/components/atoms/buttons/Close/close.module.scss +75 -0
  325. package/src/ui-kit/components/atoms/buttons/LinkButton/LinkButton.jsx +116 -0
  326. package/src/ui-kit/components/atoms/buttons/LinkButton/link-button.module.scss +53 -0
  327. package/src/ui-kit/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx +110 -0
  328. package/src/ui-kit/components/atoms/buttons/RadioButtonWithText/radio-button-with-text.module.scss +86 -0
  329. package/src/ui-kit/components/molecules/AmountInput/AmountInput.jsx +448 -0
  330. package/src/ui-kit/components/molecules/AmountInput/amount-input.module.scss +233 -0
  331. package/src/ui-kit/components/molecules/CoinPicker/CoinPicker.jsx +463 -0
  332. package/src/ui-kit/components/molecules/CoinPicker/coin-picker.module.scss +207 -0
  333. package/src/ui-kit/components/molecules/ColoredNotice/ColoredNotice.jsx +52 -0
  334. package/src/ui-kit/components/molecules/ColoredNotice/colored-notice.module.scss +36 -0
  335. package/src/ui-kit/components/molecules/LineWithIconLink/LineWithIconLink.jsx +35 -0
  336. package/src/ui-kit/components/molecules/LineWithIconLink/line-with-icon-link.module.scss +25 -0
  337. package/src/ui-kit/components/molecules/LogoCarousel/LogoCarousel.jsx +74 -0
  338. package/src/ui-kit/components/molecules/LogoCarousel/logo-carousel.module.scss +106 -0
  339. package/src/ui-kit/components/molecules/SearchableCoinsList/SearchableCoinsList.jsx +114 -0
  340. package/src/ui-kit/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx +32 -0
  341. package/src/ui-kit/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx +66 -0
  342. package/src/ui-kit/components/organisms/Dialog/Dialog.jsx +494 -0
  343. package/src/ui-kit/components/organisms/Dialog/DialogButtons/DialogButtons.jsx +132 -0
  344. package/src/ui-kit/components/organisms/Dialog/DialogButtons/dialog-buttons.module.scss +25 -0
  345. package/src/ui-kit/components/organisms/Dialog/DialogStep/DialogStep.jsx +554 -0
  346. package/src/ui-kit/components/organisms/Dialog/DialogStep/dialog-step.module.scss +382 -0
  347. package/src/ui-kit/components/organisms/Dialog/dialog.module.scss +226 -0
  348. package/src/ui-kit/components/organisms/SwapForm/SwapForm.jsx +1381 -0
  349. package/src/ui-kit/components/organisms/SwapForm/swap-form.module.scss +134 -0
  350. package/src/ui-kit/components/organisms/WaitlistSubscription/WaitlistSubscription.jsx +158 -0
  351. package/src/ui-kit/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx +77 -0
  352. package/src/ui-kit/hooks/useCallHandlingErrors.js +27 -0
  353. package/src/ui-kit/hooks/useIsHydrated.js +12 -0
  354. package/src/ui-kit/hooks/useReferredState.js +24 -0
  355. package/src/ui-kit/tests/utils/inputValueProviders/provideFormatOfFloatValueByInputString.test.js +146 -0
  356. package/src/ui-kit/tests/utils/urlQueryUtils/getQueryParameterValues.test.js +65 -0
  357. package/src/ui-kit/tests/utils/urlQueryUtils/saveQueryParameterAndValues.test.js +104 -0
  358. package/src/ui-kit/utils/inputValueProviders.js +50 -0
  359. package/src/ui-kit/utils/searchCoins.js +58 -0
  360. package/src/ui-kit/utils/textUtils.js +18 -0
  361. package/src/ui-kit/utils/uiUtils.js +12 -0
  362. package/src/ui-kit/utils/urlQueryUtils.js +62 -0
  363. package/stories/font.scss +40 -0
  364. package/stories/stubs/coins.jsx +2266 -0
  365. package/stories/stubs/exampleContent.jsx +20 -0
  366. package/styles/_global-classes.scss +0 -433
  367. package/styles/fonts/NunitoSans-Bold.ttf +0 -0
  368. package/styles/fonts/NunitoSans-ExtraBold.ttf +0 -0
  369. package/styles/fonts/NunitoSans-Light.ttf +0 -0
  370. package/styles/fonts/NunitoSans-Regular.ttf +0 -0
  371. package/styles/fonts/NunitoSans-SemiBold.ttf +0 -0
  372. package/styles/global-styles-index.scss +0 -74
  373. package/styles/index.scss +0 -33
  374. /package/src/{common → common-apis}/models/blockchain.js +0 -0
  375. /package/src/{common → common-apis}/models/protocol.js +0 -0
  376. /package/src/{common → common-apis}/utils/logging/logsStorage.js +0 -0
  377. /package/src/{common → common-apis}/utils/safeStringify.js +0 -0
  378. /package/{styles → src/ui-kit/assets/styles}/colors/_light-colors.scss +0 -0
  379. /package/{styles → src/ui-kit/assets/styles}/colors/_solid-colors.scss +0 -0
  380. /package/{styles → src/ui-kit/assets/styles}/size/_margin-size.scss +0 -0
  381. /package/{styles → src/ui-kit/assets/styles}/size/_padding-size.scss +0 -0
@@ -0,0 +1,602 @@
1
+ import axios from "axios";
2
+ import BigNumber from "bignumber.js";
3
+
4
+ import { improveAndRethrow } from "../../common-apis/utils/errorUtils";
5
+ import { DEFAULT_CRYPTO_DECIMAL_COUNT, FALLBACK_ASSET_ICON_URL } from "../../common-apis/globalConstants";
6
+ import { Logger } from "../../common-apis/utils/logging/logger";
7
+ import { Coin } from "../../common-apis/models/coin";
8
+ import { Protocol } from "../../common-apis/models/protocol";
9
+ import { safeStringify } from "../../common-apis/utils/safeStringify";
10
+ import { AmountUtils } from "../../common-apis/utils/amountUtils";
11
+ import { toRabbitTicker } from "../../common-apis/utils/rabbitTicker";
12
+
13
+ import { SwapProvider } from "./swapProvider";
14
+ import { ExistingSwap } from "../models/existingSwap";
15
+ import { Partner } from "../models/partner";
16
+ import { SwapProviderCoinInfo } from "../models/swapProviderCoinInfo";
17
+ import { createRobustTimeoutSetupForAxios } from "./utils.js";
18
+
19
+ export class ExolixSwapProvider extends SwapProvider {
20
+ constructor(
21
+ apiKeysProxyUrl,
22
+ cache,
23
+ customCoinBuilder = (coin, network) => null,
24
+ useRestrictedCoinsSet = true,
25
+ apiKey = ""
26
+ ) {
27
+ super("exolix", cache, customCoinBuilder, useRestrictedCoinsSet, false, true);
28
+
29
+ const headers = apiKey ? { Authorization: "Bearer " + apiKey } : {};
30
+
31
+ this._partners = [];
32
+ this._URL = apiKey ? "https://exolix.com/api/v2" : `${apiKeysProxyUrl}/${this.id}`;
33
+ this.COINS_EXPIRATION_TIME_MS = 5 * 60 * 1000;
34
+ this.coinsLastUpdateTimestamp = null;
35
+ this.headers = headers;
36
+ this.axiosGetPreset = {
37
+ headers: headers,
38
+ validateStatus: responseCode => [200, 201, 404].find(code => code === responseCode),
39
+ };
40
+ }
41
+
42
+ getSwapCreationInfoTtlMs() {
43
+ return 110000;
44
+ }
45
+
46
+ async _fetchSupportedCurrenciesIfNeeded() {
47
+ const loggerSource = "_fetchSupportedCurrenciesIfNeeded";
48
+ const pageSize = 100;
49
+ try {
50
+ if (this._shouldCoinsListBeLoaded()) {
51
+ let page = 1;
52
+ let allCoins = [];
53
+
54
+ while (true) {
55
+ const responseRaw = await axios.get(this._URL + "/currencies", {
56
+ ...this.axiosGetPreset,
57
+ params: { withNetworks: true, page: page, size: pageSize },
58
+ ...createRobustTimeoutSetupForAxios(),
59
+ });
60
+
61
+ const response = responseRaw?.data;
62
+
63
+ // Validating the response
64
+ if (
65
+ responseRaw.status !== 200 ||
66
+ !response ||
67
+ typeof response?.data !== "object" ||
68
+ typeof response?.count !== "number" ||
69
+ response?.count < 1 ||
70
+ response?.count > 10000 ||
71
+ typeof response?.errors === "object"
72
+ ) {
73
+ const errorMessages = response?.errors
74
+ ? ". Errors - " +
75
+ Object.keys(response?.errors)
76
+ .map(errorCode => errorCode + ": " + response?.errors[errorCode])
77
+ .join(", ")
78
+ : "";
79
+ throw new Error("Failed to load the currencies list for Exolix" + errorMessages);
80
+ }
81
+
82
+ allCoins.push(...response.data);
83
+
84
+ if (page >= Math.floor(response.count / pageSize)) break;
85
+ page++;
86
+ }
87
+
88
+ this._supportedCoins = allCoins
89
+ .map(item => {
90
+ const code = item.code.toUpperCase();
91
+
92
+ if (!Array.isArray(item.networks)) return [];
93
+
94
+ return item.networks.map(networkDetails => {
95
+ const network = networkDetails.network;
96
+ const networkShortAdaptive =
97
+ networkDetails.shortName === "" || !networkDetails?.shortName
98
+ ? networkDetails.network
99
+ : networkDetails.shortName;
100
+ let coin =
101
+ this._customCoinBuilder != null
102
+ ? this._customCoinBuilder(code, code !== network ? networkShortAdaptive : "")
103
+ : null;
104
+ if (!coin && !this.useRestrictedCoinsSet) {
105
+ const name = item.name;
106
+ const ticker = toRabbitTicker(code, code === network ? "" : networkShortAdaptive);
107
+ const defaultDecimalPlacesForCoinNotSupportedOOB = DEFAULT_CRYPTO_DECIMAL_COUNT;
108
+ const defaultMinConfirmationsForCoinNotSupportedOOB = 1;
109
+ coin = new Coin(
110
+ name,
111
+ ticker,
112
+ code,
113
+ defaultDecimalPlacesForCoinNotSupportedOOB,
114
+ null,
115
+ "",
116
+ null,
117
+ null,
118
+ defaultMinConfirmationsForCoinNotSupportedOOB,
119
+ null,
120
+ [],
121
+ 60000,
122
+ null,
123
+ code !== network ? new Protocol(networkShortAdaptive) : null,
124
+ null,
125
+ false
126
+ );
127
+ }
128
+ if (coin) {
129
+ return new SwapProviderCoinInfo(
130
+ coin,
131
+ item.code,
132
+ network,
133
+ !!networkDetails.memoNeeded,
134
+ networkDetails.memoName ?? null,
135
+ 0,
136
+ item.icon ? item.icon : FALLBACK_ASSET_ICON_URL,
137
+ true,
138
+ true,
139
+ networkDetails.addressRegex ?? null,
140
+ true
141
+ );
142
+ }
143
+ return [];
144
+ });
145
+ })
146
+ .flat();
147
+ this._supportedCoinsLastUpdateTimestamp = Date.now();
148
+ this._putPopularCoinsFirst();
149
+ await super._fetchSupportedCurrenciesIfNeeded();
150
+ }
151
+ } catch (e) {
152
+ improveAndRethrow(e, loggerSource);
153
+ }
154
+ }
155
+
156
+ async getSwapInfo(
157
+ fromCoin,
158
+ toCoin,
159
+ amountCoins,
160
+ fixed = false,
161
+ fromCoinToUsdRate = null,
162
+ amountIsToReceive = false,
163
+ bannedPartners = []
164
+ ) {
165
+ const loggerSource = "getSwapInfo";
166
+
167
+ const validateAndProcessLimits = (
168
+ fromAmount,
169
+ toAmount,
170
+ fromCoin,
171
+ toCoin,
172
+ amountCoins,
173
+ amountIsToReceive,
174
+ minAmount,
175
+ maxAmount,
176
+ rate,
177
+ status
178
+ ) => {
179
+ let min;
180
+ let max;
181
+ let returnObject;
182
+
183
+ if (typeof minAmount === "number" && minAmount > 0)
184
+ min = AmountUtils.trim(minAmount, amountIsToReceive ? toCoin.digits : fromCoin.digits);
185
+ if (typeof maxAmount === "number" && maxAmount > 0)
186
+ max = AmountUtils.trim(maxAmount, amountIsToReceive ? toCoin.digits : fromCoin.digits);
187
+
188
+ if (
189
+ status !== 200 ||
190
+ typeof fromAmount !== "number" ||
191
+ typeof toAmount !== "number" ||
192
+ typeof minAmount !== "number" ||
193
+ typeof maxAmount !== "number" ||
194
+ BigNumber(rate).lte("0") ||
195
+ BigNumber(fromAmount).lte("0") ||
196
+ BigNumber(toAmount).lte("0")
197
+ ) {
198
+ let reason = SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED;
199
+
200
+ if (min && BigNumber(amountCoins).lt(min)) {
201
+ reason = SwapProvider.NO_SWAPS_REASONS.TOO_LOW;
202
+ } else if (max && BigNumber(amountCoins).gt(max)) {
203
+ reason = SwapProvider.NO_SWAPS_REASONS.TOO_HIGH;
204
+ }
205
+
206
+ Logger.log(
207
+ `Inconsistent exolix data forces us to return NOT_SUPPORTED ${status} ${fromAmount} ${toAmount} ${maxAmount} ${minAmount} ${rate}`
208
+ );
209
+
210
+ returnObject = {
211
+ result: false,
212
+ reason: reason,
213
+ smallestMin: min,
214
+ greatestMax: max,
215
+ };
216
+ }
217
+
218
+ return [returnObject, min, max];
219
+ };
220
+
221
+ try {
222
+ if (
223
+ !(fromCoin instanceof Coin) ||
224
+ !(toCoin instanceof Coin) ||
225
+ typeof amountCoins !== "string" ||
226
+ BigNumber(amountCoins).lt("0") ||
227
+ (fixed !== null && typeof fixed !== "boolean")
228
+ ) {
229
+ throw new Error(
230
+ `Wrong input params: ${amountCoins} ${fromCoin.ticker} -> ${toCoin.ticker}, ${
231
+ fromCoin instanceof Coin
232
+ }, ${toCoin instanceof Coin}, ${typeof fixed} ${fixed}, ${amountIsToReceive}`
233
+ );
234
+ }
235
+ const fromCoinDetails = this._supportedCoins.find(i => i.coin?.ticker === fromCoin?.ticker);
236
+ const toCoinDetails = this._supportedCoins.find(i => i.coin?.ticker === toCoin?.ticker);
237
+ if (
238
+ !fromCoinDetails ||
239
+ !toCoinDetails ||
240
+ !fromCoinDetails.deposit ||
241
+ !fromCoinDetails.isAvailable ||
242
+ !toCoinDetails.withdrawal ||
243
+ !toCoinDetails.isAvailable
244
+ ) {
245
+ return {
246
+ result: false,
247
+ reason: SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED,
248
+ };
249
+ }
250
+
251
+ const response = await axios.get(this._URL + "/rate", {
252
+ ...this.axiosGetPreset,
253
+ ...createRobustTimeoutSetupForAxios(),
254
+ params: {
255
+ coinFrom: fromCoinDetails.code,
256
+ networkFrom: fromCoinDetails.network,
257
+ coinTo: toCoinDetails.code,
258
+ networkTo: toCoinDetails.network,
259
+ amount: amountIsToReceive ? undefined : amountCoins,
260
+ withdrawalAmount: amountIsToReceive ? amountCoins : undefined,
261
+ rateType: fixed ? "fixed" : "float",
262
+ },
263
+ });
264
+ Logger.log(`Retrieved ${response?.data}`, loggerSource);
265
+ if (typeof response?.data !== "object") {
266
+ Logger.log(
267
+ `Swap response didn't include the data object ${safeStringify(response?.data)}`,
268
+ loggerSource
269
+ );
270
+ return { result: false, reason: SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED };
271
+ }
272
+
273
+ const data = response?.data;
274
+ const [returnObject, min, max] = validateAndProcessLimits(
275
+ data?.fromAmount,
276
+ data?.toAmount,
277
+ fromCoin,
278
+ toCoin,
279
+ amountCoins,
280
+ amountIsToReceive,
281
+ data?.minAmount,
282
+ data?.maxAmount,
283
+ data?.rate,
284
+ response?.status
285
+ );
286
+ if (returnObject) return returnObject;
287
+
288
+ if (min && max & BigNumber(max).lt(min)) {
289
+ Logger.log(
290
+ `Exolix swap info failed, max limit is below the min one. ${safeStringify(response)}`,
291
+ loggerSource
292
+ );
293
+ return { result: false, reason: SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED };
294
+ }
295
+
296
+ const rate = amountIsToReceive
297
+ ? BigNumber(amountCoins).div(data.fromAmount)
298
+ : BigNumber(data.toAmount).div(amountCoins);
299
+
300
+ return {
301
+ result: true,
302
+ min: min ?? null,
303
+ max: max ?? null,
304
+ smallestMin: min ?? null,
305
+ greatestMax: max ?? null,
306
+ rate: AmountUtils.trim(rate, this._maxRateDigits),
307
+ durationMinutesRange: null,
308
+ fixed: fixed,
309
+ rawSwapData: data,
310
+ isRefundAddressRequired: false,
311
+ };
312
+ } catch (e) {
313
+ const status = e?.response?.status;
314
+ const data = e?.response?.data;
315
+ if (status === 429) {
316
+ return {
317
+ result: false,
318
+ reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,
319
+ };
320
+ }
321
+
322
+ const [returnObject, min, max] = validateAndProcessLimits(
323
+ data?.fromAmount,
324
+ data?.toAmount,
325
+ fromCoin,
326
+ toCoin,
327
+ amountCoins,
328
+ amountIsToReceive,
329
+ data?.minAmount,
330
+ data?.maxAmount,
331
+ data?.rate,
332
+ e?.response?.status
333
+ );
334
+ if (returnObject) return returnObject;
335
+
336
+ if (e?.response?.status === 400 || e?.response?.data?.error || e?.response?.data?.errors) {
337
+ const errorMessages = e?.response?.data?.errors
338
+ ? ". Errors - " +
339
+ Object.keys(e?.response?.data?.errors)
340
+ .map(errorCode => errorCode + ": " + e?.response?.data?.errors[errorCode])
341
+ .join(", ")
342
+ : "";
343
+ Logger.log(
344
+ "Failed to estimate swap for Exolix (" +
345
+ e?.response?.status +
346
+ ")" +
347
+ errorMessages +
348
+ ` ${safeStringify(e)}`,
349
+ loggerSource
350
+ );
351
+ } else {
352
+ Logger.log(`Internal error when getting swap options ${safeStringify(e)}`, loggerSource);
353
+ }
354
+ improveAndRethrow(e, loggerSource);
355
+ }
356
+ }
357
+
358
+ async createSwap(
359
+ fromCoin,
360
+ toCoin,
361
+ amount,
362
+ toAddress,
363
+ refundAddress,
364
+ proprietarySwapEstimationData,
365
+ clientIpAddress,
366
+ fixed,
367
+ toCurrencyExtraId = "",
368
+ refundExtraId = "",
369
+ amountIsToReceive = false
370
+ ) {
371
+ const loggerSource = "createSwap";
372
+
373
+ try {
374
+ if (
375
+ !(fromCoin instanceof Coin) ||
376
+ !(toCoin instanceof Coin) ||
377
+ typeof amount !== "string" ||
378
+ typeof toAddress !== "string" ||
379
+ typeof refundAddress !== "string" ||
380
+ typeof fixed != "boolean"
381
+ ) {
382
+ throw new Error(
383
+ `Invalid input: ${fromCoin} ${toCoin} ${amount} ${toAddress} ${refundAddress} ${fixed}`
384
+ );
385
+ }
386
+ await this._fetchSupportedCurrenciesIfNeeded();
387
+ const fromCoinExtended = this._supportedCoins.find(item => item.coin.ticker == fromCoin.ticker);
388
+ const toCoinExtended = this._supportedCoins.find(item => item.coin.ticker == toCoin.ticker);
389
+ if (!fromCoinExtended || !toCoinExtended) {
390
+ throw new Error("Failed to find coin details for: " + fromCoin.ticker + " -> " + toCoin.ticker);
391
+ }
392
+ const fromCurrencyHasExtraId = fromCoinExtended.hasExtraId;
393
+ const toCurrencyHasExtraId = toCoinExtended.hasExtraId;
394
+ const requestData = {
395
+ coinFrom: fromCoinExtended.code,
396
+ networkFrom: fromCoinExtended.network,
397
+ coinTo: toCoinExtended.code,
398
+ networkTo: toCoinExtended.network,
399
+ amount: amountIsToReceive ? undefined : amount,
400
+ withdrawalAmount: amountIsToReceive ? amount : undefined,
401
+ withdrawalAddress: toAddress,
402
+ withdrawalExtraId: toCurrencyHasExtraId ? toCurrencyExtraId ?? "" : "",
403
+ refundAddress: refundAddress,
404
+ refundExtraId: fromCurrencyHasExtraId ? refundExtraId ?? "" : "",
405
+ rateType: fixed ? "fixed" : "float",
406
+ };
407
+
408
+ Logger.log(`Sending create request: ${safeStringify(requestData)}`, loggerSource);
409
+ const response = await axios.post(this._URL + "/transactions", requestData, {
410
+ ...this.axiosGetPreset,
411
+ ...createRobustTimeoutSetupForAxios(),
412
+ });
413
+
414
+ const result = response?.data;
415
+ Logger.log(`Creation result ${safeStringify(result)}`, loggerSource);
416
+
417
+ if (
418
+ !result?.id ||
419
+ typeof result?.id !== "string" ||
420
+ typeof result?.amount !== "number" ||
421
+ typeof result?.amountTo !== "number" ||
422
+ typeof result?.depositAddress !== "string" ||
423
+ typeof result?.withdrawalAddress !== "string" ||
424
+ !(result?.rateType === "fixed" || result?.rateType === "float")
425
+ ) {
426
+ let errorMessage;
427
+ errorMessage = result?.id
428
+ ? "Swap was created but the data was incorrect: " + safeStringify(response)
429
+ : "Swap creation failed, API response: " + safeStringify(response);
430
+
431
+ Logger.log(errorMessage, loggerSource);
432
+ throw new Error(errorMessage);
433
+ }
434
+
435
+ let rate;
436
+ if (typeof rate !== "number" || BigNumber(result?.rate).isZero()) {
437
+ rate = BigNumber(result?.amountTo).div(result?.amount);
438
+ } else {
439
+ rate = BigNumber(result?.rate);
440
+ }
441
+
442
+ return {
443
+ result: true,
444
+ swapId: result?.id,
445
+ fromCoin: fromCoin,
446
+ fromAmount: AmountUtils.trim(result?.amount, fromCoin.digits),
447
+ fromAddress: result?.depositAddress,
448
+ toCoin: toCoin,
449
+ toAmount: AmountUtils.trim(result?.amountTo, toCoin.digits),
450
+ toAddress: result?.withdrawalAddress,
451
+ fromCurrencyExtraId: result?.withdrawalExtraId ?? "",
452
+ rate: AmountUtils.trim(rate, this._maxRateDigits),
453
+ fixed: result?.rateType === "fixed",
454
+ };
455
+ } catch (e) {
456
+ const composeFailResult = reason => ({
457
+ result: false,
458
+ reason: reason,
459
+ });
460
+ if (
461
+ e?.response?.status === 400 ||
462
+ e?.response?.data?.message?.includes("Amount to exchange is higher") ||
463
+ e?.response?.data?.message?.includes("Amount to exchange is below")
464
+ ) {
465
+ return composeFailResult(SwapProvider.CREATION_FAIL_REASONS.RETRIABLE_FAIL);
466
+ }
467
+ if (e?.response?.status === 422 && e?.response?.data.error === "Such exchange pair is not available") {
468
+ Logger.log(`Unable to create a swap with a not available currency ${e?.response?.data}`, loggerSource);
469
+ return composeFailResult(SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED);
470
+ }
471
+ if (e?.response?.status === 429) {
472
+ Logger.log(`Returning fail - RPS limit exceeded ${e?.response?.data}`, loggerSource);
473
+ return composeFailResult(SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED);
474
+ }
475
+ Logger.log(`Internal error for swap: ${safeStringify(e)}`, loggerSource);
476
+ improveAndRethrow(e, loggerSource);
477
+ }
478
+ }
479
+
480
+ async getExistingSwapsDetailsAndStatus(swapIds) {
481
+ const loggerSource = "getExistingSwapsDetailsAndStatus";
482
+ try {
483
+ if (swapIds.find(id => typeof id !== "string")) {
484
+ throw new Error("Swap id is not string: " + safeStringify(swapIds));
485
+ }
486
+ const getSwap = async swapId => {
487
+ try {
488
+ return await axios.get(this._URL + "/transactions/" + swapId, {
489
+ ...this.axiosGetPreset,
490
+ ...createRobustTimeoutSetupForAxios(),
491
+ });
492
+ } catch (error) {
493
+ if (error?.response?.status === 404) return [];
494
+ throw error;
495
+ }
496
+ };
497
+ const responses = await Promise.all(swapIds.map(swapId => getSwap(swapId)));
498
+ const fetchedSwaps = responses.flat();
499
+ Logger.log("All swaps RAW: " + JSON.stringify(fetchedSwaps.map(r => r.data)), loggerSource);
500
+
501
+ const swaps = fetchedSwaps
502
+ .map(r => r.data)
503
+ .map((swap, index) => {
504
+ try {
505
+ const fromCoin = this._supportedCoins.find(
506
+ i => i.code === swap.coinFrom.coinCode && i.network === swap.coinFrom.network
507
+ )?.coin ?? { ticker: toRabbitTicker(swap.coinFrom.coinCode, swap.coinFrom.network), digits: 8 };
508
+ const toCoin = this._supportedCoins.find(
509
+ i => i.code === swap.coinTo.coinCode && i.network === swap.coinTo.network
510
+ )?.coin ?? { ticker: toRabbitTicker(swap.coinTo.coinCode, swap.coinTo.network), digits: 8 };
511
+ if (!fromCoin || !toCoin) {
512
+ return []; // We skip swaps with not supported coins for now
513
+ }
514
+
515
+ const toUtcTimestamp = timeStr =>
516
+ Date.parse(timeStr.match(/.+[Zz]$/) ? timeStr : `${timeStr}Z`);
517
+ const createdAt = toUtcTimestamp(swap.createdAt);
518
+ const expiresAt = createdAt + 25 * 60 * 1000; // Hack with hard-coded 25 minutes
519
+ const isExpiredByTime = expiresAt < Date.now();
520
+ const status = this._mapExolixStatusToRabbitStatus(swap.status, isExpiredByTime);
521
+ const toDigits =
522
+ status === SwapProvider.SWAP_STATUSES.REFUNDED ? fromCoin.digits : toCoin.digits;
523
+ return new ExistingSwap(
524
+ swapIds[index],
525
+ status,
526
+ createdAt,
527
+ expiresAt,
528
+ -1,
529
+ AmountUtils.trim(swap.rate, this._maxRateDigits),
530
+ swap?.rateType === "fixed",
531
+ swap.refundAddress,
532
+ swap.depositAddress,
533
+ fromCoin,
534
+ AmountUtils.trim(swap.amount, fromCoin.digits),
535
+ swap.hashIn.hash,
536
+ swap.hashIn.link,
537
+ toCoin,
538
+ AmountUtils.trim(swap.amountTo, toDigits),
539
+ swap.hashOut.hash,
540
+ swap.hashOut.link,
541
+ swap.withdrawalAddress,
542
+ this.id,
543
+ swap.depositExtraId ?? null,
544
+ swap.withdrawalExtraId ?? null,
545
+ swap.refundExtraId ?? null
546
+ );
547
+ } catch (e) {
548
+ console.log("Failed to parse loaded swap", e);
549
+ return [];
550
+ }
551
+ })
552
+ .flat();
553
+ Logger.log(`Swap details result ${safeStringify(swaps)}`, loggerSource);
554
+ return { result: true, swaps: swaps };
555
+ } catch (e) {
556
+ Logger.logError(e, loggerSource, `Failed to get swap details. Error is: ${safeStringify(e)}`);
557
+ const composeFailResult = reason => ({
558
+ result: false,
559
+ reason: reason,
560
+ });
561
+ const status = e?.response?.status;
562
+ const data = e?.response?.data;
563
+ if (status === 429) {
564
+ Logger.log(`Returning fail - RPS limit exceeded ${data}`, loggerSource);
565
+ return composeFailResult(SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED);
566
+ }
567
+ improveAndRethrow(e, loggerSource);
568
+ }
569
+ }
570
+
571
+ _mapExolixStatusToRabbitStatus(status, isExpiredByTime) {
572
+ switch (status) {
573
+ case "wait":
574
+ if (isExpiredByTime) {
575
+ return SwapProvider.SWAP_STATUSES.EXPIRED;
576
+ }
577
+ return SwapProvider.SWAP_STATUSES.WAITING_FOR_PAYMENT;
578
+ case "confirmation":
579
+ return SwapProvider.SWAP_STATUSES.CONFIRMING;
580
+ case "confirmed":
581
+ return SwapProvider.SWAP_STATUSES.PAYMENT_RECEIVED;
582
+ case "exchanging":
583
+ return SwapProvider.SWAP_STATUSES.EXCHANGING;
584
+ case "sending":
585
+ return SwapProvider.SWAP_STATUSES.EXCHANGING;
586
+ case "success":
587
+ return SwapProvider.SWAP_STATUSES.COMPLETED;
588
+ case "overdue":
589
+ return SwapProvider.SWAP_STATUSES.EXPIRED;
590
+ case "refunded":
591
+ return SwapProvider.SWAP_STATUSES.REFUNDED;
592
+ default:
593
+ throw new Error(`Unknown Exolix status: ${status}`);
594
+ }
595
+ }
596
+
597
+ async getPartnersList() {
598
+ return [
599
+ new Partner(this.id, "Exolix", "https://storage.swapspace.co/static/9WRkfc_QCUUmOBTcvgC9p57l9.svg", null),
600
+ ];
601
+ }
602
+ }