@rabbitio/ui-kit 1.0.0-beta.72 → 1.0.0-beta.73

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 (253) hide show
  1. package/coverage/clover.xml +6428 -1864
  2. package/coverage/coverage-final.json +157 -95
  3. package/coverage/index.html +339 -84
  4. package/coverage/{rabbit-ui-kit → ui-kit}/index.html +3 -3
  5. package/coverage/{rabbit-ui-kit → ui-kit}/index.js.html +3 -3
  6. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/adapters/axiosAdapter.js.html +3 -3
  7. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/adapters/index.html +3 -3
  8. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/adapters/qrUtils.js.html +3 -3
  9. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/amountUtils.js.html +3 -3
  10. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/errorUtils.js.html +3 -3
  11. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/external-apis/apiGroups.js.html +3 -3
  12. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/external-apis/index.html +3 -3
  13. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/external-apis/ipAddressProviders.js.html +3 -3
  14. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/fiatCurrenciesService.js.html +3 -3
  15. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/globalConstants.jsx.html +3 -3
  16. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/index.html +3 -3
  17. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/models/blockchain.js.html +3 -3
  18. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/models/coin.js.html +3 -3
  19. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/models/index.html +3 -3
  20. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/models/protocol.js.html +3 -3
  21. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/utils/cache.js.html +8 -8
  22. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/utils/emailAPI.js.html +3 -3
  23. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/utils/index.html +3 -3
  24. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/utils/logging/index.html +3 -3
  25. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/utils/logging/logger.js.html +3 -3
  26. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/utils/logging/logsStorage.js.html +3 -3
  27. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/utils/postponeExecution.js.html +3 -3
  28. package/coverage/{rabbit-ui-kit → ui-kit}/src/common-apis/utils/safeStringify.js.html +3 -3
  29. package/coverage/{rabbit-ui-kit → ui-kit}/src/index.html +3 -3
  30. package/coverage/{rabbit-ui-kit → ui-kit}/src/index.js.html +3 -3
  31. package/coverage/{rabbit-ui-kit → ui-kit}/src/robust-api-caller/cacheAndConcurrentRequestsResolver.js.html +3 -3
  32. package/coverage/{rabbit-ui-kit → ui-kit}/src/robust-api-caller/cachedRobustExternalApiCallerService.js.html +3 -3
  33. package/coverage/{rabbit-ui-kit → ui-kit}/src/robust-api-caller/cancelProcessing.js.html +3 -3
  34. package/coverage/{rabbit-ui-kit → ui-kit}/src/robust-api-caller/concurrentCalculationsMetadataHolder.js.html +3 -3
  35. package/coverage/{rabbit-ui-kit → ui-kit}/src/robust-api-caller/externalApiProvider.js.html +3 -3
  36. package/coverage/{rabbit-ui-kit → ui-kit}/src/robust-api-caller/externalServicesStatsCollector.js.html +3 -3
  37. package/coverage/{rabbit-ui-kit → ui-kit}/src/robust-api-caller/index.html +3 -3
  38. package/coverage/{rabbit-ui-kit → ui-kit}/src/robust-api-caller/robustExternalAPICallerService.js.html +3 -3
  39. package/coverage/ui-kit/src/swaps-lib/external-apis/index.html +146 -0
  40. package/coverage/ui-kit/src/swaps-lib/external-apis/letsExchangeSwapProvider.js.html +1456 -0
  41. package/coverage/ui-kit/src/swaps-lib/external-apis/swapProvider.js.html +1390 -0
  42. package/coverage/{rabbit-ui-kit → ui-kit}/src/swaps-lib/external-apis/swapspaceSwapProvider.js.html +45 -585
  43. package/coverage/{rabbit-ui-kit → ui-kit}/src/swaps-lib/models/baseSwapCreationInfo.js.html +3 -3
  44. package/coverage/{rabbit-ui-kit → ui-kit}/src/swaps-lib/models/existingSwap.js.html +3 -3
  45. package/coverage/{rabbit-ui-kit → ui-kit}/src/swaps-lib/models/existingSwapWithFiatData.js.html +3 -3
  46. package/coverage/{rabbit-ui-kit → ui-kit}/src/swaps-lib/models/index.html +3 -3
  47. package/coverage/{rabbit-ui-kit → ui-kit}/src/swaps-lib/services/index.html +7 -7
  48. package/coverage/{rabbit-ui-kit → ui-kit}/src/swaps-lib/services/publicSwapService.js.html +233 -50
  49. package/coverage/{rabbit-ui-kit → ui-kit}/src/swaps-lib/utils/index.html +13 -13
  50. package/coverage/{rabbit-ui-kit → ui-kit}/src/swaps-lib/utils/swapUtils.js.html +121 -46
  51. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/assets/wrappedImages/arrowIcon.jsx.html +3 -3
  52. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/assets/wrappedImages/arrowTosca.jsx.html +3 -3
  53. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/assets/wrappedImages/arrowWhite.jsx.html +3 -3
  54. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/assets/wrappedImages/darkRectangle.jsx.html +3 -3
  55. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/assets/wrappedImages/determinedError.jsx.html +3 -3
  56. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/assets/wrappedImages/failedValidationIcon.jsx.html +3 -3
  57. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/assets/wrappedImages/index.html +3 -3
  58. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/assets/wrappedImages/infoIcon.jsx.html +3 -3
  59. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/assets/wrappedImages/noticeQuestionIcon.jsx.html +3 -3
  60. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/assets/wrappedImages/successfulValidationIcon.jsx.html +3 -3
  61. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/assets/wrappedImages/walletIcon.jsx.html +3 -3
  62. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/AssetIcon/AssetIcon.jsx.html +3 -3
  63. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/AssetIcon/index.html +3 -3
  64. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/AssetSelection/AssetSelection.jsx.html +3 -3
  65. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/AssetSelection/index.html +3 -3
  66. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/BackgroundTitle/BackgroundTitle.jsx.html +3 -3
  67. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/BackgroundTitle/index.html +3 -3
  68. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/InformationMessage/InformationMessage.jsx.html +3 -3
  69. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/InformationMessage/index.html +3 -3
  70. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/Input/Input.jsx.html +3 -3
  71. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/Input/index.html +3 -3
  72. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/LoadingDots/LoadingDots.jsx.html +3 -3
  73. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/LoadingDots/index.html +3 -3
  74. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/NoticeIcon/NoticeIcon.jsx.html +3 -3
  75. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/NoticeIcon/index.html +3 -3
  76. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/QrCode/QrCode.jsx.html +52 -7
  77. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/QrCode/index.html +7 -7
  78. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/RateSelector/RateSelector.jsx.html +3 -3
  79. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/RateSelector/index.html +3 -3
  80. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/SupportChat/SupportChat.jsx.html +3 -3
  81. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/SupportChat/index.html +3 -3
  82. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/Textarea/Textarea.jsx.html +3 -3
  83. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/Textarea/index.html +3 -3
  84. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/TitleBox/TitleBox.jsx.html +3 -3
  85. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/TitleBox/index.html +3 -3
  86. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/Tooltip/Tooltip.jsx.html +3 -3
  87. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/Tooltip/index.html +3 -3
  88. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/TwoLinesOfText/LinesOfText.jsx.html +3 -3
  89. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/TwoLinesOfText/index.html +3 -3
  90. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/Validation/Validation.jsx.html +3 -3
  91. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/Validation/index.html +3 -3
  92. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/buttons/Button/Button.jsx.html +3 -3
  93. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/buttons/Button/index.html +3 -3
  94. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/buttons/Close/Close.jsx.html +3 -3
  95. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/buttons/Close/index.html +3 -3
  96. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/buttons/LinkButton/LinkButton.jsx.html +3 -3
  97. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/buttons/LinkButton/index.html +3 -3
  98. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx.html +3 -3
  99. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/atoms/buttons/RadioButtonWithText/index.html +3 -3
  100. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/molecules/AmountInput/AmountInput.jsx.html +3 -3
  101. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/molecules/AmountInput/index.html +3 -3
  102. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/molecules/CoinPicker/CoinPicker.jsx.html +3 -3
  103. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/molecules/CoinPicker/index.html +3 -3
  104. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/molecules/LineWithIconLink/LineWithIconLink.jsx.html +3 -3
  105. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/molecules/LineWithIconLink/index.html +3 -3
  106. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx.html +3 -3
  107. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/molecules/TitledLineWithIconLink/index.html +3 -3
  108. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx.html +3 -3
  109. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/organisms/CoinPickerDialogStep/index.html +3 -3
  110. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/organisms/Dialog/Dialog.jsx.html +3 -3
  111. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/organisms/Dialog/DialogButtons/DialogButtons.jsx.html +3 -3
  112. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/organisms/Dialog/DialogButtons/index.html +3 -3
  113. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/organisms/Dialog/DialogStep/DialogStep.jsx.html +3 -3
  114. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/organisms/Dialog/DialogStep/index.html +3 -3
  115. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/organisms/Dialog/index.html +3 -3
  116. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/organisms/SwapForm/SwapForm.jsx.html +129 -36
  117. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/organisms/SwapForm/index.html +7 -7
  118. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx.html +3 -3
  119. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/components/templates/DeterminedErrorDialogStep/index.html +3 -3
  120. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/hooks/index.html +3 -3
  121. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/hooks/useCallHandlingErrors.js.html +3 -3
  122. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/hooks/useIsHydrated.js.html +3 -3
  123. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/hooks/useReferredState.js.html +3 -3
  124. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/utils/index.html +3 -3
  125. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/utils/inputValueProviders.js.html +3 -3
  126. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/utils/textUtils.js.html +3 -3
  127. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/utils/uiUtils.js.html +3 -3
  128. package/coverage/{rabbit-ui-kit → ui-kit}/src/ui-kit/utils/urlQueryUtils.js.html +3 -3
  129. package/coverage/{rabbit-ui-kit → ui-kit}/stories/atoms/BackgroundTitle.stories.jsx.html +3 -3
  130. package/coverage/{rabbit-ui-kit → ui-kit}/stories/atoms/LinesOfText.stories.jsx.html +3 -3
  131. package/coverage/{rabbit-ui-kit → ui-kit}/stories/atoms/LoadingDots.stories.jsx.html +3 -3
  132. package/coverage/{rabbit-ui-kit → ui-kit}/stories/atoms/QrCode.stories.jsx.html +3 -3
  133. package/coverage/{rabbit-ui-kit → ui-kit}/stories/atoms/RateSelector.stories.jsx.html +3 -3
  134. package/coverage/{rabbit-ui-kit → ui-kit}/stories/atoms/Validation.stories.jsx.html +3 -3
  135. package/coverage/{rabbit-ui-kit → ui-kit}/stories/atoms/buttons/Button.stories.jsx.html +3 -3
  136. package/coverage/{rabbit-ui-kit → ui-kit}/stories/atoms/buttons/Close.stories.jsx.html +3 -3
  137. package/coverage/{rabbit-ui-kit → ui-kit}/stories/atoms/buttons/LinkButton.stories.jsx.html +3 -3
  138. package/coverage/{rabbit-ui-kit → ui-kit}/stories/atoms/buttons/index.html +3 -3
  139. package/coverage/{rabbit-ui-kit → ui-kit}/stories/atoms/index.html +3 -3
  140. package/coverage/{rabbit-ui-kit → ui-kit}/stories/molecules/LineWithIconLink.stories.jsx.html +3 -3
  141. package/coverage/{rabbit-ui-kit → ui-kit}/stories/molecules/TitledLineWithIconLink.stories.jsx.html +3 -3
  142. package/coverage/{rabbit-ui-kit → ui-kit}/stories/molecules/index.html +3 -3
  143. package/coverage/{rabbit-ui-kit → ui-kit}/stories/organisms/Dialog/Dialog.stories.jsx.html +3 -3
  144. package/coverage/{rabbit-ui-kit → ui-kit}/stories/organisms/Dialog/DialogButtons/DialogButtons.stories.jsx.html +3 -3
  145. package/coverage/{rabbit-ui-kit → ui-kit}/stories/organisms/Dialog/DialogButtons/index.html +3 -3
  146. package/coverage/{rabbit-ui-kit → ui-kit}/stories/organisms/Dialog/DialogStep/DialogStep.stories.jsx.html +3 -3
  147. package/coverage/{rabbit-ui-kit → ui-kit}/stories/organisms/Dialog/DialogStep/index.html +3 -3
  148. package/coverage/{rabbit-ui-kit → ui-kit}/stories/organisms/Dialog/index.html +3 -3
  149. package/coverage/{rabbit-ui-kit → ui-kit}/stories/stubs/exampleContent.jsx.html +3 -3
  150. package/coverage/{rabbit-ui-kit → ui-kit}/stories/stubs/index.html +3 -3
  151. package/coverage/{rabbit-ui-kit → ui-kit}/stories/templates/DeterminedErrorDialogStep.stories.jsx.html +3 -3
  152. package/coverage/{rabbit-ui-kit → ui-kit}/stories/templates/index.html +3 -3
  153. package/coverage/ui-kit/storybook-static/124.c2d01e5e.iframe.bundle.js.html +85 -0
  154. package/coverage/ui-kit/storybook-static/138.56b7edc4.iframe.bundle.js.html +85 -0
  155. package/coverage/ui-kit/storybook-static/312.6f62bbd9.iframe.bundle.js.html +85 -0
  156. package/coverage/ui-kit/storybook-static/341.57a15f57.iframe.bundle.js.html +85 -0
  157. package/coverage/ui-kit/storybook-static/370.73bb343e.iframe.bundle.js.html +85 -0
  158. package/coverage/ui-kit/storybook-static/595.2e40d981.iframe.bundle.js.html +85 -0
  159. package/coverage/ui-kit/storybook-static/607.3ea32459.iframe.bundle.js.html +85 -0
  160. package/coverage/ui-kit/storybook-static/609.8c79ec77.iframe.bundle.js.html +85 -0
  161. package/coverage/ui-kit/storybook-static/666.09fdc1d7.iframe.bundle.js.html +85 -0
  162. package/coverage/ui-kit/storybook-static/797.c87cdf19.iframe.bundle.js.html +85 -0
  163. package/coverage/ui-kit/storybook-static/822.4bc0ebce.iframe.bundle.js.html +85 -0
  164. package/coverage/ui-kit/storybook-static/833.08e3ebb6.iframe.bundle.js.html +85 -0
  165. package/coverage/ui-kit/storybook-static/862.bf6bfe62.iframe.bundle.js.html +85 -0
  166. package/coverage/ui-kit/storybook-static/87.0a1bfeb1.iframe.bundle.js.html +85 -0
  167. package/coverage/ui-kit/storybook-static/893.4b09f929.iframe.bundle.js.html +85 -0
  168. package/coverage/ui-kit/storybook-static/996.846a677b.iframe.bundle.js.html +85 -0
  169. package/coverage/ui-kit/storybook-static/atoms-BackgroundTitle-stories.1a5386a1.iframe.bundle.js.html +85 -0
  170. package/coverage/ui-kit/storybook-static/atoms-LinesOfText-stories.7043a48b.iframe.bundle.js.html +85 -0
  171. package/coverage/ui-kit/storybook-static/atoms-LoadingDots-stories.091245c7.iframe.bundle.js.html +85 -0
  172. package/coverage/ui-kit/storybook-static/atoms-QrCode-stories.e10363b6.iframe.bundle.js.html +85 -0
  173. package/coverage/ui-kit/storybook-static/atoms-RateSelector-stories.af208e9a.iframe.bundle.js.html +85 -0
  174. package/coverage/ui-kit/storybook-static/atoms-Validation-stories.d561b311.iframe.bundle.js.html +85 -0
  175. package/coverage/ui-kit/storybook-static/atoms-buttons-Button-stories.e8e6b930.iframe.bundle.js.html +85 -0
  176. package/coverage/ui-kit/storybook-static/atoms-buttons-Close-stories.0a902a7c.iframe.bundle.js.html +85 -0
  177. package/coverage/ui-kit/storybook-static/atoms-buttons-LinkButton-stories.ca93ab6b.iframe.bundle.js.html +85 -0
  178. package/coverage/ui-kit/storybook-static/index.html +596 -0
  179. package/coverage/ui-kit/storybook-static/main.41f410f2.iframe.bundle.js.html +85 -0
  180. package/coverage/ui-kit/storybook-static/molecules-LineWithIconLink-stories.9721a18c.iframe.bundle.js.html +85 -0
  181. package/coverage/ui-kit/storybook-static/molecules-TitledLineWithIconLink-stories.1383fe3f.iframe.bundle.js.html +85 -0
  182. package/coverage/ui-kit/storybook-static/organisms-Dialog-Dialog-stories.4e6da717.iframe.bundle.js.html +85 -0
  183. package/coverage/ui-kit/storybook-static/organisms-Dialog-DialogButtons-DialogButtons-stories.6f45ae6e.iframe.bundle.js.html +85 -0
  184. package/coverage/ui-kit/storybook-static/organisms-Dialog-DialogStep-DialogStep-stories.74896048.iframe.bundle.js.html +85 -0
  185. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/@storybook/addon-backgrounds/dist/index.html +116 -0
  186. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/@storybook/addon-backgrounds/dist/preview.js.html +118 -0
  187. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/@storybook/components/dist/formatter-SWP5E3XI.mjs.html +118 -0
  188. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/@storybook/components/dist/index.html +116 -0
  189. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/buffer/index.html +116 -0
  190. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/buffer/index.js.html +118 -0
  191. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/markdown-to-jsx/dist/index.html +116 -0
  192. package/coverage/ui-kit/storybook-static/rabbitio/ui-kit/node_modules/markdown-to-jsx/dist/index.modern.js.html +118 -0
  193. package/coverage/ui-kit/storybook-static/runtime~main.ad918f38.iframe.bundle.js.html +85 -0
  194. package/coverage/ui-kit/storybook-static/sb-addons/actions-9/index.html +116 -0
  195. package/coverage/ui-kit/storybook-static/sb-addons/actions-9/manager-bundle.js.html +94 -0
  196. package/coverage/ui-kit/storybook-static/sb-addons/essentials-backgrounds-2/index.html +116 -0
  197. package/coverage/ui-kit/storybook-static/sb-addons/essentials-backgrounds-2/manager-bundle.js.html +121 -0
  198. package/coverage/ui-kit/storybook-static/sb-addons/essentials-controls-1/index.html +116 -0
  199. package/coverage/ui-kit/storybook-static/sb-addons/essentials-controls-1/manager-bundle.js.html +274 -0
  200. package/coverage/ui-kit/storybook-static/sb-addons/essentials-measure-4/index.html +116 -0
  201. package/coverage/ui-kit/storybook-static/sb-addons/essentials-measure-4/manager-bundle.js.html +94 -0
  202. package/coverage/ui-kit/storybook-static/sb-addons/essentials-outline-5/index.html +116 -0
  203. package/coverage/ui-kit/storybook-static/sb-addons/essentials-outline-5/manager-bundle.js.html +94 -0
  204. package/coverage/ui-kit/storybook-static/sb-addons/essentials-toolbars-3/index.html +116 -0
  205. package/coverage/ui-kit/storybook-static/sb-addons/essentials-toolbars-3/manager-bundle.js.html +94 -0
  206. package/coverage/ui-kit/storybook-static/sb-addons/interactions-7/index.html +116 -0
  207. package/coverage/ui-kit/storybook-static/sb-addons/interactions-7/manager-bundle.js.html +121 -0
  208. package/coverage/ui-kit/storybook-static/sb-addons/links-0/index.html +116 -0
  209. package/coverage/ui-kit/storybook-static/sb-addons/links-0/manager-bundle.js.html +94 -0
  210. package/coverage/ui-kit/storybook-static/sb-addons/onboarding-6/index.html +116 -0
  211. package/coverage/ui-kit/storybook-static/sb-addons/onboarding-6/manager-bundle.js.html +1588 -0
  212. package/coverage/ui-kit/storybook-static/sb-addons/viewport-8/index.html +116 -0
  213. package/coverage/ui-kit/storybook-static/sb-addons/viewport-8/manager-bundle.js.html +94 -0
  214. package/coverage/ui-kit/storybook-static/sb-manager/WithTooltip-V3YHNWJZ-LVYLGZW2.js.html +88 -0
  215. package/coverage/ui-kit/storybook-static/sb-manager/chunk-2IXBUOFS.js.html +106 -0
  216. package/coverage/ui-kit/storybook-static/sb-manager/chunk-INSKDKQB.js.html +1129 -0
  217. package/coverage/ui-kit/storybook-static/sb-manager/chunk-NGTUFCUO.js.html +112 -0
  218. package/coverage/ui-kit/storybook-static/sb-manager/chunk-UUEAOBSN.js.html +1303 -0
  219. package/coverage/ui-kit/storybook-static/sb-manager/chunk-ZEU7PDD3.js.html +88 -0
  220. package/coverage/ui-kit/storybook-static/sb-manager/formatter-SWP5E3XI-7BGIK6BL.js.html +553 -0
  221. package/coverage/ui-kit/storybook-static/sb-manager/globals-module-info.js.html +88 -0
  222. package/coverage/ui-kit/storybook-static/sb-manager/globals.js.html +88 -0
  223. package/coverage/ui-kit/storybook-static/sb-manager/index.html +281 -0
  224. package/coverage/ui-kit/storybook-static/sb-manager/index.js.html +88 -0
  225. package/coverage/ui-kit/storybook-static/sb-manager/runtime.js.html +88 -0
  226. package/coverage/ui-kit/storybook-static/sb-manager/syntaxhighlighter-V7JZZA35-DXZCI2WR.js.html +88 -0
  227. package/coverage/ui-kit/storybook-static/sb-preview/globals.js.html +88 -0
  228. package/coverage/ui-kit/storybook-static/sb-preview/index.html +131 -0
  229. package/coverage/ui-kit/storybook-static/sb-preview/runtime.js.html +421 -0
  230. package/coverage/ui-kit/storybook-static/templates-DeterminedErrorDialogStep-stories.3cc14214.iframe.bundle.js.html +85 -0
  231. package/dist/index.cjs +1156 -571
  232. package/dist/index.cjs.map +1 -1
  233. package/dist/index.css +1 -1
  234. package/dist/index.css.map +1 -1
  235. package/dist/index.modern.js +775 -328
  236. package/dist/index.modern.js.map +1 -1
  237. package/dist/index.module.js +1156 -571
  238. package/dist/index.module.js.map +1 -1
  239. package/dist/index.umd.js +1156 -571
  240. package/dist/index.umd.js.map +1 -1
  241. package/package.json +1 -1
  242. package/src/swaps-lib/external-apis/letsExchangeSwapProvider.js +457 -0
  243. package/src/swaps-lib/external-apis/swapProvider.js +246 -20
  244. package/src/swaps-lib/external-apis/swapspaceSwapProvider.js +20 -200
  245. package/src/swaps-lib/services/publicSwapService.js +105 -44
  246. package/src/swaps-lib/test/external-apis/swapProvider/removeProtocolNameFromCoinName.test.js +142 -0
  247. package/src/swaps-lib/test/external-apis/swapspaceSwapProvider/_fetchSupportedCurrenciesIfNeeded.test.js +2 -2
  248. package/src/swaps-lib/utils/swapUtils.js +63 -38
  249. package/src/ui-kit/components/atoms/QrCode/QrCode.jsx +16 -1
  250. package/src/ui-kit/components/organisms/SwapForm/SwapForm.jsx +61 -30
  251. package/src/ui-kit/components/organisms/SwapForm/swap-form.module.scss +1 -1
  252. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/index.html +0 -131
  253. package/coverage/rabbit-ui-kit/src/swaps-lib/external-apis/swapProvider.js.html +0 -712
@@ -4122,6 +4122,15 @@ function useIsHydrated() {
4122
4122
  * @return {string|null}
4123
4123
  */
4124
4124
 
4125
+ /**
4126
+ * Callback to handle isFixed flag change.
4127
+ *
4128
+ * @function
4129
+ * @name onIsFixedChange
4130
+ * @param {boolean} isFixedNewValue - new value
4131
+ * @return {void}
4132
+ */
4133
+
4125
4134
  /**
4126
4135
  * Function validating addresses.
4127
4136
  * By default, will treat any addresses as valid.
@@ -4131,6 +4140,7 @@ function useIsHydrated() {
4131
4140
  * @name validateAddressByTicker
4132
4141
  * @param {string} ticker - Ticker symbol of the asset.
4133
4142
  * @param {string} address - Address to be validated
4143
+ * @param {boolean} isFixed - Is swap rate mode = fixed
4134
4144
  * @return {Promise<boolean>}
4135
4145
  */
4136
4146
 
@@ -4178,11 +4188,13 @@ function useIsHydrated() {
4178
4188
  * @param {boolean} [props.formHasFiat] - Indicates if the form supports fiat currency.
4179
4189
  * @param {string|null} [props.termsOfUseUrl] - Terms of use URL, shown only if both terms & privacy policy passed.
4180
4190
  * @param {string|null} [props.privacyPolicyUrl] - Privacy policy of use URL, shown only if both terms & privacy policy passed.
4191
+ * @param {string} props.recipientAddressExtraIdName - Extra ID name for the recipient address.
4192
+ * @param {string} props.refundAddressExtraIdName - Extra ID name for the refund address.
4181
4193
  * @param {object} [props.translations] - Object containing translations, default English texts will be used if omitted.
4182
4194
  * @param {string} props.swapSeparatorIconSrc - Source URL for the swap separator icon.
4183
4195
  * @param {boolean} props.swapButtonAlwaysActive - Setting that allows the form state to proceed to the next step regardless of validity.
4184
- * @param {getExtraIdNameByTicker} props.getExtraIdNameByTicker - Function returning extraId name for asset
4185
4196
  * @param {validateAddressByTicker} [props.validateAddressByTicker] - Function validating address
4197
+ * @param {onIsFixedChange} [props.onIsFixedChange] - callback for changed isFixed
4186
4198
  * @return {JSX.Element} Rendered SwapForm component.
4187
4199
  * @constructor
4188
4200
  */
@@ -4213,7 +4225,7 @@ const SwapForm = ({
4213
4225
  preservedAmount: _preservedAmount = null,
4214
4226
  handleSwapServiceError: _handleSwapServiceError = (errorCode, setValidationContent, setBalanceValid, setMinimalAmountValid, setMaximumAmountValid, setIsPairSupported, setIsSameCoins) => {},
4215
4227
  formHasBalance: _formHasBalance = false,
4216
- retrieveSwapDetails: _retrieveSwapDetails = async (sendingAssetTicker, receivingAssetTicker, amount, isSwapAll = false) => {},
4228
+ retrieveSwapDetails: _retrieveSwapDetails = async (sendingAssetTicker, receivingAssetTicker, amount, isSwapAll = false, editedLastInput = false) => {},
4217
4229
  retrieveInitialSwapData: _retrieveInitialSwapData = async (sendingAssetTicker, receivingAssetTicker) => {},
4218
4230
  triggerDataUpdateResetting: _triggerDataUpdateResetting = 0,
4219
4231
  fromAssetSelectionButtonRef: _fromAssetSelectionButtonRef = null,
@@ -4226,9 +4238,12 @@ const SwapForm = ({
4226
4238
  termsOfUseUrl: _termsOfUseUrl = null,
4227
4239
  privacyPolicyUrl: _privacyPolicyUrl = null,
4228
4240
  getExtraIdNameByTicker: _getExtraIdNameByTicker = ticker => null,
4229
- validateAddressByTicker: _validateAddressByTicker = ticker => false,
4241
+ validateAddressByTicker: _validateAddressByTicker = () => false,
4230
4242
  swapSeparatorIconSrc,
4231
4243
  swapButtonAlwaysActive: _swapButtonAlwaysActive = false,
4244
+ onIsFixedChange: _onIsFixedChange = () => {},
4245
+ recipientAddressExtraIdName,
4246
+ refundAddressExtraIdName,
4232
4247
  translations: _translations = {
4233
4248
  swapAllButtonTitles: {
4234
4249
  enable: "Swap all",
@@ -4258,7 +4273,9 @@ const SwapForm = ({
4258
4273
  addressTitle: "Recepient address",
4259
4274
  refundAddressTitle: "Refund address",
4260
4275
  extraIdPlaceholder: "(optional)",
4276
+ refundAddressExtraIdTitle: "Refund extra ID (MEMO):",
4261
4277
  refundAddressExtraIdNotice: "Please check if your address requires additional identifier (sometimes called a Memo, Destination Tag, Tag, ID, Label or Note). Including this identifier is crucial when required, as omitting or misentering it can result in lost assets.",
4278
+ receivingAddressExtraIdTitle: "Destination extra ID (MEMO):",
4262
4279
  receivingAddressExtraIdNotice: "Please check if your address requires additional identifier (sometimes called a Memo, Destination Tag, Tag, ID, Label or Note). Including this identifier is crucial when required, as omitting or misentering it can result in lost assets."
4263
4280
  },
4264
4281
  rateSelector: {
@@ -4268,11 +4285,9 @@ const SwapForm = ({
4268
4285
  confirmButtonText: "Swap"
4269
4286
  }
4270
4287
  }) => {
4271
- var _isFixedRate$current2, _maximumAmount$curren4, _maximumAmount$curren5, _maximumAmount$curren6, _minimalAmount$curren5, _isFixedRate$current3;
4288
+ var _isFixedRate$current2, _isFixedRate$current3, _maximumAmount$curren4, _maximumAmount$curren5, _maximumAmount$curren6, _minimalAmount$curren5;
4272
4289
  const DETAIL_REFRESH_INTERVAL_MS = 1.5 * 60000;
4273
4290
  const IS_FIXED_BY_DEFAULT = false;
4274
-
4275
- // Updating the states below will insert the new value into the send or receive input field
4276
4291
  const [updateSendInputTo, setUpdateSendInputTo] = useState(_preservedAmount != null ? _preservedAmount : null);
4277
4292
  const [updateReceiveInputTo, setUpdateReceiveInputTo] = useState(null);
4278
4293
  const [sendAssetAmount, setSendAssetAmount] = useReferredState(_preservedAmount == null || _preservedAmount === "" ? null : _preservedAmount);
@@ -4286,11 +4301,10 @@ const SwapForm = ({
4286
4301
  const [isSameCoins, setIsSameCoins] = useState(false);
4287
4302
  const [isSwapCalculated, setIsSwapCalculated] = useState(false);
4288
4303
  const [readyToSwap, setReadyToSwap] = useState(false); // Basically a param that enables/disables the "Next" button
4289
- // TODO: [refactoring, moderate] instead of handling preservedAmount at a lot of cases below, just
4290
- // write single useEffect setting sendAssetAmount to the=is passed value and simplify the logic below. task_id=6453251e49b04c5e88a3cc771479ffb5
4291
4304
  const [isAmountZero, setIsAmountZero] = useState(_preservedAmount == null || String(_preservedAmount) === "0");
4292
4305
  const [isLoading, setIsLoading] = useReferredState(false); // Whether the form is in the progress of loading some data (new rates, for example)
4293
4306
  const [isFixedRate, setIsFixedRate] = useReferredState(null);
4307
+ const [isLastEditedReceiving, setIsLastEditedReceiving] = useState(false);
4294
4308
  const [confirmButtonTo, setConfirmButtonTo] = useState(_composeConfirmButtonTo(sendingAssetTicker, receivingAssetTicker, _preservedAmount));
4295
4309
  const [transactionFee, setTransactionFee] = useState();
4296
4310
  const [balanceValid, setBalanceValid] = useState(true); // Whether the amount is less than total balance
@@ -4310,9 +4324,8 @@ const SwapForm = ({
4310
4324
  const recalculationDelayOnTyping = 1000;
4311
4325
  const isAddressFieldEnabled = !_formHasBalance;
4312
4326
  const displayRateSelector = !_formHasBalance;
4313
- const recipientAddressExtraIdName = _getExtraIdNameByTicker(receivingAssetTicker);
4314
- const refundAddressExtraIdName = _getExtraIdNameByTicker(sendingAssetTicker);
4315
4327
  const handleSendAssetAmountChange = amount => {
4328
+ setIsLastEditedReceiving(false);
4316
4329
  if (amount != null && amount !== "") {
4317
4330
  setUpdateReceiveInputTo(AmountUtils.trim(BigNumber(amount).times(swapRate), _receivingAssetDecimalCount));
4318
4331
  } else {
@@ -4321,6 +4334,7 @@ const SwapForm = ({
4321
4334
  setSendAssetAmount(amount);
4322
4335
  };
4323
4336
  const handleReceiveAssetAmountChange = amount => {
4337
+ setIsLastEditedReceiving(true);
4324
4338
  let sendAssetAmount = "";
4325
4339
  if (amount != null && amount !== "") {
4326
4340
  sendAssetAmount = AmountUtils.trim(BigNumber(amount).div(swapRate), _sendingAssetDecimalCount);
@@ -4425,7 +4439,7 @@ const SwapForm = ({
4425
4439
  setIsSameCoins(false);
4426
4440
  setIsPairSupported(true);
4427
4441
  setIsSwapCalculated(false);
4428
- const response = await _retrieveSwapDetails(sendingAssetTicker, receivingAssetTicker, amount, isSwapAll.current, (_isFixedRate$current = isFixedRate.current) != null ? _isFixedRate$current : IS_FIXED_BY_DEFAULT);
4442
+ const response = await _retrieveSwapDetails(sendingAssetTicker, receivingAssetTicker, amount, isSwapAll.current, (_isFixedRate$current = isFixedRate.current) != null ? _isFixedRate$current : IS_FIXED_BY_DEFAULT, isFixedRate.current ? isLastEditedReceiving : false);
4429
4443
  if (!isSwapAll.current && String(amount) !== String(isForPreserved && sendAssetAmount.current == null ? _preservedAmount : sendAssetAmount.current)) {
4430
4444
  // Means amount changed and we no more need to do this exact calculation
4431
4445
  return;
@@ -4511,6 +4525,10 @@ const SwapForm = ({
4511
4525
  }
4512
4526
  // eslint-disable-next-line react-hooks/exhaustive-deps
4513
4527
  }, [isSwapAll.current]);
4528
+ useEffect(() => {
4529
+ _onIsFixedChange(isFixedRate.current);
4530
+ // eslint-disable-next-line react-hooks/exhaustive-deps
4531
+ }, [isFixedRate.current]);
4514
4532
  useEffect(() => {
4515
4533
  setConfirmButtonTo(_composeConfirmButtonTo(sendingAssetTicker, receivingAssetTicker, sendAssetAmount.current || _preservedAmount || null));
4516
4534
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -4554,14 +4572,14 @@ const SwapForm = ({
4554
4572
  useEffect(() => {
4555
4573
  (async () => {
4556
4574
  if (!receivingAssetTicker) return;
4557
- setIsRecipientAddressValid(recipientAddress.current === "" ? false : await _validateAddressByTicker(receivingAssetTicker, recipientAddress.current));
4575
+ setIsRecipientAddressValid(recipientAddress.current === "" ? false : await _validateAddressByTicker(receivingAssetTicker, recipientAddress.current, isFixedRate.current));
4558
4576
  })();
4559
4577
  // eslint-disable-next-line react-hooks/exhaustive-deps
4560
4578
  }, [recipientAddress.current, recipientAddressExtraId.current, receivingAssetTicker]);
4561
4579
  useEffect(() => {
4562
4580
  (async () => {
4563
4581
  if (!sendingAssetTicker || !isRefundAddressRequired) return;
4564
- setIsRefundAddressValid(refundAddress.current === "" ? false : await _validateAddressByTicker(sendingAssetTicker, refundAddress.current));
4582
+ setIsRefundAddressValid(refundAddress.current === "" ? false : await _validateAddressByTicker(sendingAssetTicker, refundAddress.current, isFixedRate.current));
4565
4583
  })();
4566
4584
  // eslint-disable-next-line react-hooks/exhaustive-deps
4567
4585
  }, [refundAddress.current, refundAddressExtraId.current, sendingAssetTicker, isRefundAddressRequired]);
@@ -4583,8 +4601,6 @@ const SwapForm = ({
4583
4601
  };
4584
4602
  // eslint-disable-next-line react-hooks/exhaustive-deps
4585
4603
  }, [readyToSwap]);
4586
-
4587
- // TODO: [refactoring, critical] this code looks like a hack related to task_id=6e328d39063142b7b9fa01d497e616da
4588
4604
  useEffect(() => {
4589
4605
  if (_triggerDataUpdateResetting) {
4590
4606
  clearTimeout(dataUpdateTimeoutId.current);
@@ -4594,8 +4610,6 @@ const SwapForm = ({
4594
4610
  }
4595
4611
  // eslint-disable-next-line react-hooks/exhaustive-deps
4596
4612
  }, [_triggerDataUpdateResetting]);
4597
-
4598
- // Resets the passed "set value to" param to null, so it can be used multiple times with any value
4599
4613
  useEffect(() => {
4600
4614
  if (!!updateSendInputTo) setUpdateSendInputTo(null);
4601
4615
  if (!!updateReceiveInputTo) setUpdateReceiveInputTo(null);
@@ -4614,8 +4628,6 @@ const SwapForm = ({
4614
4628
  }
4615
4629
  // eslint-disable-next-line react-hooks/exhaustive-deps
4616
4630
  }, [isLoading.current, swapAllButtonLoaderReSetter]);
4617
-
4618
- // Handlers upon changing the asset amount
4619
4631
  useEffect(() => {
4620
4632
  setConfirmButtonTo(_composeConfirmButtonTo(sendingAssetTicker, receivingAssetTicker, sendAssetAmount.current));
4621
4633
  if (sendAssetAmount.current == null) return;
@@ -4633,7 +4645,13 @@ const SwapForm = ({
4633
4645
  linkText: !_formHasBalance ? "" : isSwapAll.current ? _translations.swapAllButtonTitles.cancel : _translations.swapAllButtonTitles.enable,
4634
4646
  linkButtonLoader: true,
4635
4647
  isLinkButtonDisabled: isLoading.current || sendingAssetTicker === receivingAssetTicker || BigNumber(sendingAssetBalance == null ? void 0 : sendingAssetBalance.assetAmount).eq(0)
4636
- }, /*#__PURE__*/React.createElement("div", {
4648
+ }, displayRateSelector ? /*#__PURE__*/React.createElement("div", {
4649
+ className: s$9["swap-form-rate-selector"]
4650
+ }, /*#__PURE__*/React.createElement(RateSelector, {
4651
+ isFixed: (_isFixedRate$current2 = isFixedRate.current) != null ? _isFixedRate$current2 : IS_FIXED_BY_DEFAULT,
4652
+ setIsFixed: handleRateModeChanged,
4653
+ translations: _translations.rateSelector
4654
+ })) : "", /*#__PURE__*/React.createElement("div", {
4637
4655
  className: s$9["swap-form-inputs"]
4638
4656
  }, /*#__PURE__*/React.createElement(AmountInput, {
4639
4657
  ticker: sendingAssetTicker,
@@ -4677,7 +4695,7 @@ const SwapForm = ({
4677
4695
  assetIconProtocolSrc: _receivingAssetProtocolIconSrc,
4678
4696
  fallbackAssetIconSrc: _fallBackAssetIconSrc,
4679
4697
  disabled: isSwapAll.current || sendingAssetTicker === null || receivingAssetTicker === null,
4680
- locked: !_formHasBalance,
4698
+ locked: !_formHasBalance && !isFixedRate.current,
4681
4699
  handleCoinAmountChange: handleReceiveAssetAmountChange,
4682
4700
  handleChangeAssetClick: handleChangeReceivingAssetClick,
4683
4701
  updateAssetInputTo: updateReceiveInputTo,
@@ -4697,7 +4715,7 @@ const SwapForm = ({
4697
4715
  className: s$9["swap-form-information-field"]
4698
4716
  }, /*#__PURE__*/React.createElement("p", null, !isPairSupported ? _translations.informationBlock.pairNotAvailable : transactionFee && minimalAmountValid ? /*#__PURE__*/React.createElement(React.Fragment, null, _translations.informationBlock.transactionFee, /*#__PURE__*/React.createElement("span", null, AmountUtils.crypto(transactionFee == null ? void 0 : transactionFee.crypto, sendingAssetFeeCoinTickerPrintable)), (transactionFee == null ? void 0 : transactionFee.fiat) != null && (transactionFee == null ? void 0 : transactionFee.fiat) !== "" ? /*#__PURE__*/React.createElement("span", {
4699
4717
  className: s$9["semi-transparent"]
4700
- }, " ~ " + AmountUtils.fiat(transactionFee == null ? void 0 : transactionFee.fiat, _fiatCurrencyCode)) : "") : !isLoading.current && (isSwapCalculated || !minimalAmount.current && swapRate) ? /*#__PURE__*/React.createElement(React.Fragment, null, _translations.informationBlock.swapRate, /*#__PURE__*/React.createElement("span", null, AmountUtils.composeRateText(sendingAssetTickerPrintable, receivingAssetTickerPrintable, swapRate, _receivingAssetDecimalCount, (_isFixedRate$current2 = isFixedRate.current) != null ? _isFixedRate$current2 : IS_FIXED_BY_DEFAULT))) : minimalAmount.current || maximumAmount.current ? !maximumAmountValid && maximumAmount.current != null ? /*#__PURE__*/React.createElement(React.Fragment, null, _translations.informationBlock.maximumAmount, /*#__PURE__*/React.createElement("span", {
4718
+ }, " ~ " + AmountUtils.fiat(transactionFee == null ? void 0 : transactionFee.fiat, _fiatCurrencyCode)) : "") : !isLoading.current && (isSwapCalculated || !minimalAmount.current && swapRate) ? /*#__PURE__*/React.createElement(React.Fragment, null, _translations.informationBlock.swapRate, /*#__PURE__*/React.createElement("span", null, AmountUtils.composeRateText(sendingAssetTickerPrintable, receivingAssetTickerPrintable, swapRate, _receivingAssetDecimalCount, (_isFixedRate$current3 = isFixedRate.current) != null ? _isFixedRate$current3 : IS_FIXED_BY_DEFAULT))) : minimalAmount.current || maximumAmount.current ? !maximumAmountValid && maximumAmount.current != null ? /*#__PURE__*/React.createElement(React.Fragment, null, _translations.informationBlock.maximumAmount, /*#__PURE__*/React.createElement("span", {
4701
4719
  className: s$9["interactable"] + " " + s$9["red"],
4702
4720
  onClick: isLoading.current ? () => {} : e => callHandlingErrors(handleMaximumAmountClick, e)
4703
4721
  }, AmountUtils.crypto((_maximumAmount$curren4 = maximumAmount.current) == null ? void 0 : _maximumAmount$curren4.crypto, sendingAssetTickerPrintable)), ((_maximumAmount$curren5 = maximumAmount.current) == null ? void 0 : _maximumAmount$curren5.fiat) != null && ((_maximumAmount$curren6 = maximumAmount.current) == null ? void 0 : _maximumAmount$curren6.fiat) !== "" ? /*#__PURE__*/React.createElement("span", {
@@ -4718,7 +4736,7 @@ const SwapForm = ({
4718
4736
  adaptiveHeight: true,
4719
4737
  errorEncountered: recipientAddress.current !== "" && !isRecipientAddressValid.current
4720
4738
  })), isHydrated && recipientAddressExtraIdName ? /*#__PURE__*/React.createElement(TitleBox, {
4721
- title: recipientAddressExtraIdName,
4739
+ title: _translations.addressFields.receivingAddressExtraIdTitle,
4722
4740
  titleNoticeText: _translations.addressFields.receivingAddressExtraIdNotice,
4723
4741
  titleNoticePosition: TOOLTIP_POSITIONS.TOP_LEFT
4724
4742
  }, /*#__PURE__*/React.createElement(Textarea, {
@@ -4736,7 +4754,7 @@ const SwapForm = ({
4736
4754
  adaptiveHeight: true,
4737
4755
  errorEncountered: refundAddress.current !== "" && !isRefundAddressValid.current
4738
4756
  })), refundAddressExtraIdName ? /*#__PURE__*/React.createElement(TitleBox, {
4739
- title: refundAddressExtraIdName,
4757
+ title: _translations.addressFields.refundAddressExtraIdTitle,
4740
4758
  titleNoticeText: _translations.addressFields.refundAddressExtraIdNotice,
4741
4759
  titleNoticePosition: TOOLTIP_POSITIONS.TOP_LEFT
4742
4760
  }, /*#__PURE__*/React.createElement(Textarea, {
@@ -4745,13 +4763,7 @@ const SwapForm = ({
4745
4763
  value: refundAddressExtraId.current,
4746
4764
  adaptiveHeight: true,
4747
4765
  placeholder: _translations.addressFields.extraIdPlaceholder
4748
- })) : null) : null) : null, displayRateSelector ? /*#__PURE__*/React.createElement("div", {
4749
- className: s$9["swap-form-rate-selector"]
4750
- }, /*#__PURE__*/React.createElement(RateSelector, {
4751
- isFixed: (_isFixedRate$current3 = isFixedRate.current) != null ? _isFixedRate$current3 : IS_FIXED_BY_DEFAULT,
4752
- setIsFixed: !isLoading.current ? handleRateModeChanged : () => {},
4753
- translations: _translations.rateSelector
4754
- })) : "", validationContent ? /*#__PURE__*/React.createElement("div", {
4766
+ })) : null) : null) : null, validationContent ? /*#__PURE__*/React.createElement("div", {
4755
4767
  className: s$9["swap-form-validation-text"]
4756
4768
  }, /*#__PURE__*/React.createElement(Validation, {
4757
4769
  text: validationContent
@@ -4816,7 +4828,12 @@ SwapForm.propTypes = {
4816
4828
  fiatCurrencyCode: PropTypes.oneOfType([PropTypes.string, null]),
4817
4829
  fiatCurrencyDecimals: PropTypes.oneOfType([PropTypes.number, null]),
4818
4830
  formHasFiat: PropTypes.bool,
4831
+ termsOfUseUrl: PropTypes.oneOfType([PropTypes.string, null]),
4832
+ privacyPolicyUrl: PropTypes.oneOfType([PropTypes.string, null]),
4833
+ recipientAddressExtraIdName: PropTypes.string,
4834
+ refundAddressExtraIdName: PropTypes.string,
4819
4835
  translations: PropTypes.object,
4836
+ validateAddressByTicker: PropTypes.func,
4820
4837
  swapSeparatorIconSrc: PropTypes.string.isRequired,
4821
4838
  swapButtonAlwaysActive: PropTypes.bool
4822
4839
  };
@@ -4843,6 +4860,9 @@ SwapForm.defaultProps = {
4843
4860
  fiatCurrencyCode: null,
4844
4861
  fiatCurrencyDecimals: null,
4845
4862
  formHasFiat: true,
4863
+ termsOfUseUrl: null,
4864
+ privacyPolicyUrl: null,
4865
+ validateAddressByTicker: ticker => false,
4846
4866
  swapButtonAlwaysActive: false
4847
4867
  };
4848
4868
 
@@ -4865,7 +4885,21 @@ async function generateQrAndShowInCanvas(encodingString) {
4865
4885
 
4866
4886
  var s$6 = {"container":"_cTbW4","m-0":"_pa1z9","p-0":"_JFpOp","m-1":"_iRmOW","p-1":"_0sPGn","m-2":"_cX5Pd","p-2":"_2cKLW","m-3":"_lsOKS","p-3":"_MDp97","m-4":"_tiugy","p-4":"_lcNdz","m-5":"_ph3Rl","p-5":"_8Oxt6","m-6":"_LQvZy","p-6":"_RqY7F","m-7":"_K6wVB","p-7":"_aqQmY","m-8":"_AvgKS","p-8":"_-THq-","m-9":"_fLxYO","p-9":"_wNjdw","m-10":"_CVvN9","p-10":"_W0zcC","ml-0":"_lOxDW","pl-0":"_AZ4Gk","ml-1":"_PfYJJ","pl-1":"_ha7hP","ml-2":"_8HztG","pl-2":"_SB-3g","ml-3":"_udBJe","pl-3":"_EYbrF","ml-4":"_zSB90","pl-4":"_bGSY-","ml-5":"_vCg0l","pl-5":"_-hUSk","ml-6":"_wpvsa","pl-6":"_Po4yI","ml-7":"_Rv-mI","pl-7":"_rHVBB","ml-8":"_zYMBf","pl-8":"_BSAmk","ml-9":"_KE07p","pl-9":"_Bhlol","ml-10":"_iG9RV","pl-10":"_syE5i","mr-0":"_Z0qEx","pr-0":"_lV0Ms","mr-1":"_gO4IU","pr-1":"_CvRZh","mr-2":"_xy-oI","pr-2":"_vihQM","mr-3":"_eJ7bJ","pr-3":"_bmsh0","mr-4":"_EoFmR","pr-4":"_fVbSK","mr-5":"_tdfPe","pr-5":"_MNash","mr-6":"_haTqx","pr-6":"_YIf0P","mr-7":"_pooWd","pr-7":"_7MZOB","mr-8":"_bS7iD","pr-8":"_JRieo","mr-9":"_f6Phu","pr-9":"_mlqUy","mr-10":"_PPXXJ","pr-10":"_abKOE","mt-0":"_ItCpw","pt-0":"_zpY0G","mt-1":"_8TETK","pt-1":"_ANVw2","mt-2":"_s2Ox7","pt-2":"_L2yLo","mt-3":"_e2KDJ","pt-3":"_QfoJy","mt-4":"_O-rrM","pt-4":"_2USiC","mt-5":"_7Kzdb","pt-5":"_l3KrZ","mt-6":"_vgOok","pt-6":"_ng-zC","mt-7":"_nTMsZ","pt-7":"_KGp6z","mt-8":"_XANFt","pt-8":"_o3eiw","mt-9":"_l3H4r","pt-9":"_CRSXn","mt-10":"_ftQLu","pt-10":"_ikh2T","mb-0":"_jg4Jh","pb-0":"_sEOhP","mb-1":"_A9pLc","pb-1":"_O3GpB","mb-2":"_Ko-ls","pb-2":"_Nh0Vh","mb-3":"_APbRY","pb-3":"_tWmjY","mb-4":"_XUlFk","pb-4":"_ZvsvW","mb-5":"_n5nhM","pb-5":"_-tSIX","mb-6":"_QtZDL","pb-6":"_-39t0","mb-7":"_D0Dpl","pb-7":"_45Xmr","mb-8":"_GqsvX","pb-8":"_6CQop","mb-9":"_Z4Ivt","pb-9":"_veodh","mb-10":"_L3rOe","pb-10":"_YRD2e","mx-0":"_bzM7J","px-0":"_8ogz0","mx-1":"_XyVmJ","px-1":"_X9KHo","mx-2":"_R6tXp","px-2":"_Zja9K","mx-3":"_vdTzJ","px-3":"_9O9dG","mx-4":"_mcsEY","px-4":"_HuOg7","mx-5":"_Q96D3","px-5":"_gwh60","mx-6":"_Tli0m","px-6":"_znyER","mx-7":"_WNYMW","px-7":"_r1il4","mx-8":"_vMRfR","px-8":"_SYdPJ","mx-9":"_3mTwX","px-9":"_XqzX6","mx-10":"_ZAjnm","px-10":"_vYiab","my-0":"_DTi5m","py-0":"_NhBC-","my-1":"_lYPq3","py-1":"_LsZYc","my-2":"_ie-4q","py-2":"_-8kuS","my-3":"_PcwSW","py-3":"_9SVW-","my-4":"_HM-DC","py-4":"_cBLeY","my-5":"_iFfyB","py-5":"_cFMUa","my-6":"_uxMHp","py-6":"_OeII-","my-7":"_Y-LlZ","py-7":"_3ydPM","my-8":"_ifpwB","py-8":"_nPGL9","my-9":"_9XS-9","py-9":"_HRWBM","my-10":"_r-9W3","py-10":"_G5SRo","m-sm-0":"_XQBmN","p-sm-0":"_s9MHP","m-sm-1":"_e6dLK","p-sm-1":"_47tQJ","m-sm-2":"_Sq84f","p-sm-2":"_7T9oC","m-sm-3":"_6DK-C","p-sm-3":"_1mWwA","m-sm-4":"_jephJ","p-sm-4":"_8isN2","m-sm-5":"_Qj6AO","p-sm-5":"_dc7y9","m-sm-6":"_TPeN7","p-sm-6":"_2rG8f","m-sm-7":"_MfYlH","p-sm-7":"_6zVKJ","m-sm-8":"_QlZvU","p-sm-8":"_tx9ap","m-sm-9":"_rLz-E","p-sm-9":"_q06Mz","m-sm-10":"_3uSku","p-sm-10":"_Hc-5n","ml-sm-0":"_1UbDf","pl-sm-0":"_touOJ","ml-sm-1":"_1bN5I","pl-sm-1":"_bQHcU","ml-sm-2":"_i8oPe","pl-sm-2":"_Vtfxf","ml-sm-3":"_CBcsQ","pl-sm-3":"_SzmcT","ml-sm-4":"_6qcw8","pl-sm-4":"_vbSGm","ml-sm-5":"_n-zBA","pl-sm-5":"_Q9Q9i","ml-sm-6":"_2o7ve","pl-sm-6":"_UPjnI","ml-sm-7":"_NeEAG","pl-sm-7":"_ngtJ-","ml-sm-8":"_-Z2Hf","pl-sm-8":"_VQpYs","ml-sm-9":"_Sla3G","pl-sm-9":"_9WquO","ml-sm-10":"_kuYOg","pl-sm-10":"_mf-JK","mr-sm-0":"_D-am2","pr-sm-0":"_Z4QgH","mr-sm-1":"_JNB16","pr-sm-1":"_1nuYG","mr-sm-2":"_JSz3T","pr-sm-2":"_VIVsb","mr-sm-3":"_hf2wL","pr-sm-3":"_U27cs","mr-sm-4":"_fphSG","pr-sm-4":"_oan05","mr-sm-5":"_-q4eR","pr-sm-5":"_1z6Az","mr-sm-6":"_ex6FB","pr-sm-6":"_4B5XH","mr-sm-7":"_AhvSF","pr-sm-7":"_98YQI","mr-sm-8":"_ukGgp","pr-sm-8":"_i1l6d","mr-sm-9":"_R-dZ7","pr-sm-9":"_rq-kd","mr-sm-10":"_dVc4S","pr-sm-10":"_X-WfK","mt-sm-0":"_gYF9v","pt-sm-0":"_EA2Ki","mt-sm-1":"_B1K8h","pt-sm-1":"_ug-cq","mt-sm-2":"_SVe1c","pt-sm-2":"_kAto4","mt-sm-3":"_zvT2b","pt-sm-3":"_eaLRc","mt-sm-4":"_2dFgE","pt-sm-4":"_tweF5","mt-sm-5":"_KlgR2","pt-sm-5":"_BwPt9","mt-sm-6":"_FVlah","pt-sm-6":"_HZ-1-","mt-sm-7":"_-usQF","pt-sm-7":"_NvK9x","mt-sm-8":"_VjH2p","pt-sm-8":"_G1yH9","mt-sm-9":"_u4fMt","pt-sm-9":"_tw7GS","mt-sm-10":"_ymkT3","pt-sm-10":"_yJhls","mb-sm-0":"_lGkDj","pb-sm-0":"_HHf7Y","mb-sm-1":"_1I2Vs","pb-sm-1":"_i3RzV","mb-sm-2":"_BIWVv","pb-sm-2":"_4tkvJ","mb-sm-3":"_FwyAM","pb-sm-3":"_abS24","mb-sm-4":"_dqY3O","pb-sm-4":"_b--2r","mb-sm-5":"_I4bmd","pb-sm-5":"_tzrqS","mb-sm-6":"_pgsKQ","pb-sm-6":"_cpvrM","mb-sm-7":"_-Rr98","pb-sm-7":"_KBGRo","mb-sm-8":"_Zl7om","pb-sm-8":"_LWOz1","mb-sm-9":"_vo0F-","pb-sm-9":"_O2BEY","mb-sm-10":"_F-Lhx","pb-sm-10":"_6AZ0T","mx-sm-0":"_Y0X-J","px-sm-0":"_HcvBd","mx-sm-1":"_X3Fb3","px-sm-1":"_-JfYt","mx-sm-2":"_1x4W2","px-sm-2":"_qydtY","mx-sm-3":"_XUuRa","px-sm-3":"_eBVc0","mx-sm-4":"_63l4w","px-sm-4":"_k3SYD","mx-sm-5":"_5i7KK","px-sm-5":"_XDYJN","mx-sm-6":"_w8TjD","px-sm-6":"_5ol5V","mx-sm-7":"_Ot40y","px-sm-7":"_oV5-L","mx-sm-8":"_a8L2h","px-sm-8":"_wi0TE","mx-sm-9":"_v7kEh","px-sm-9":"_0-HhG","mx-sm-10":"_1okBb","px-sm-10":"_95N84","my-sm-0":"_lie2G","py-sm-0":"_ouOvB","my-sm-1":"_ohdC7","py-sm-1":"_aMnh9","my-sm-2":"_7xHoJ","py-sm-2":"_0ug55","my-sm-3":"_U2pB2","py-sm-3":"_4cGIX","my-sm-4":"_ZdqXJ","py-sm-4":"_WxW7n","my-sm-5":"_oVJaN","py-sm-5":"_AWbwx","my-sm-6":"_TBmmo","py-sm-6":"_KwGcy","my-sm-7":"_o3VYk","py-sm-7":"_ci94b","my-sm-8":"_GvBdM","py-sm-8":"_SIEyA","my-sm-9":"_sq-Bc","py-sm-9":"_RahCO","my-sm-10":"_Y22he","py-sm-10":"_zgeqj","m-lg-0":"_hfSrX","p-lg-0":"_pn8y2","m-lg-1":"_LfWT0","p-lg-1":"_QVlAL","m-lg-2":"_1icWB","p-lg-2":"_dl4cc","m-lg-3":"_CMQ3-","p-lg-3":"_zrs1N","m-lg-4":"_x0g6f","p-lg-4":"_Os9NS","m-lg-5":"_U9MlN","p-lg-5":"_jFWCr","m-lg-6":"_tLOlh","p-lg-6":"_42qu5","m-lg-7":"_Aro8c","p-lg-7":"_-uOsA","m-lg-8":"_Au56y","p-lg-8":"_2Oyz7","m-lg-9":"_Osk7K","p-lg-9":"_lXQ8x","m-lg-10":"_dllSC","p-lg-10":"_Tm67i","ml-lg-0":"_Znqug","pl-lg-0":"_454P-","ml-lg-1":"_kUu3E","pl-lg-1":"_w89ET","ml-lg-2":"_WmVQL","pl-lg-2":"_kR-EV","ml-lg-3":"_k5kWU","pl-lg-3":"_-Kb0x","ml-lg-4":"_KKFXp","pl-lg-4":"_-fkcR","ml-lg-5":"_yS-Tb","pl-lg-5":"_O-1Va","ml-lg-6":"_p-vq5","pl-lg-6":"_JMyQH","ml-lg-7":"_k7-ti","pl-lg-7":"_qEF3U","ml-lg-8":"_4Hiwo","pl-lg-8":"_i0YLE","ml-lg-9":"_E7-Mc","pl-lg-9":"_tR6Ca","ml-lg-10":"_XJWn-","pl-lg-10":"_lMFa-","mr-lg-0":"_-5re8","pr-lg-0":"_frmaO","mr-lg-1":"_V7Qjd","pr-lg-1":"_RfFWZ","mr-lg-2":"_zovH5","pr-lg-2":"_I0DtE","mr-lg-3":"_R1FBX","pr-lg-3":"_UGURA","mr-lg-4":"_A91bo","pr-lg-4":"_OC0rQ","mr-lg-5":"_UuInF","pr-lg-5":"_o6Z7k","mr-lg-6":"_2WcKB","pr-lg-6":"_hb6AF","mr-lg-7":"_7zOUh","pr-lg-7":"_ISeQS","mr-lg-8":"_XB-jo","pr-lg-8":"_WH43T","mr-lg-9":"_3Z5tO","pr-lg-9":"_KDtmP","mr-lg-10":"_YWWDg","pr-lg-10":"_3jxch","mt-lg-0":"_NpdpZ","pt-lg-0":"_G3CYP","mt-lg-1":"_rBTNB","pt-lg-1":"_oP3bL","mt-lg-2":"_7k4z7","pt-lg-2":"_W-jQH","mt-lg-3":"_g3B6v","pt-lg-3":"_VJ1Ff","mt-lg-4":"_KMnJN","pt-lg-4":"_ZD8Fa","mt-lg-5":"_b5cHq","pt-lg-5":"_dg5j0","mt-lg-6":"_-Cpwd","pt-lg-6":"_THSdM","mt-lg-7":"_Z3s1F","pt-lg-7":"_lYEdd","mt-lg-8":"_Aqcim","pt-lg-8":"_layfK","mt-lg-9":"_PODRQ","pt-lg-9":"_Jwmvr","mt-lg-10":"_oE-Es","pt-lg-10":"_iqMxI","mb-lg-0":"_0ouBF","pb-lg-0":"_pY5e-","mb-lg-1":"_6UkMv","pb-lg-1":"_rTQpv","mb-lg-2":"_QdezS","pb-lg-2":"_bKRvY","mb-lg-3":"_9kRgX","pb-lg-3":"_0rDFg","mb-lg-4":"_raL2S","pb-lg-4":"_g1goH","mb-lg-5":"_ZYlhK","pb-lg-5":"_xEjIS","mb-lg-6":"_2Bqs7","pb-lg-6":"_0-ck4","mb-lg-7":"_I-Q95","pb-lg-7":"_eBNa3","mb-lg-8":"_jynhW","pb-lg-8":"_N4X7K","mb-lg-9":"_V0gnd","pb-lg-9":"_30KI-","mb-lg-10":"_u7LJD","pb-lg-10":"_0rvxP","mx-lg-0":"_eJDxo","px-lg-0":"_foMtX","mx-lg-1":"_ahZeW","px-lg-1":"_1EJE3","mx-lg-2":"_VsP4e","px-lg-2":"_ZkXCK","mx-lg-3":"_IiuAl","px-lg-3":"_ALX0f","mx-lg-4":"_jPo2Y","px-lg-4":"_iJZSC","mx-lg-5":"_uAU0P","px-lg-5":"_z75CM","mx-lg-6":"_ZiYYZ","px-lg-6":"_-wNvd","mx-lg-7":"_3W1xI","px-lg-7":"_EGCYr","mx-lg-8":"_IKuC1","px-lg-8":"_CsKA7","mx-lg-9":"_y5S5T","px-lg-9":"_pSFpC","mx-lg-10":"_X8XlP","px-lg-10":"_UFRIe","my-lg-0":"_W1tUz","py-lg-0":"_jfJjF","my-lg-1":"_nIUQq","py-lg-1":"_iG2bO","my-lg-2":"_GCiW7","py-lg-2":"_f2j4U","my-lg-3":"_a1kEm","py-lg-3":"_vucDB","my-lg-4":"_6W-Ov","py-lg-4":"_2ktTG","my-lg-5":"_O4LLf","py-lg-5":"_Hcb15","my-lg-6":"_CSfmZ","py-lg-6":"_CPuhc","my-lg-7":"_3mH-z","py-lg-7":"_X6-mZ","my-lg-8":"_asmPC","py-lg-8":"_TTf47","my-lg-9":"_mC-i2","py-lg-9":"_iFSI7","my-lg-10":"_2BFm0","py-lg-10":"_bfNEm","m-md-0":"_-spRI","p-md-0":"_LK8-A","m-md-1":"_zjpam","p-md-1":"_wv8PD","m-md-2":"_06GpP","p-md-2":"_zdlRp","m-md-3":"_sNmTl","p-md-3":"_Yo2qI","m-md-4":"_eHYDi","p-md-4":"_b0S-l","m-md-5":"_U15c8","p-md-5":"_5tzlt","m-md-6":"_ZGL7n","p-md-6":"_5wNZQ","m-md-7":"_a0fPA","p-md-7":"_QQVBX","m-md-8":"_9-xcZ","p-md-8":"_RW3k1","m-md-9":"_rDAcs","p-md-9":"_k1xXG","m-md-10":"_RbEPp","p-md-10":"_hSl5q","ml-md-0":"_JaAa5","pl-md-0":"_eC-r7","ml-md-1":"_TiFFz","pl-md-1":"_tOXmv","ml-md-2":"_9mF2Z","pl-md-2":"_vwsKB","ml-md-3":"_15YPO","pl-md-3":"_XPkcU","ml-md-4":"_boTLY","pl-md-4":"_SFsKJ","ml-md-5":"_3axKI","pl-md-5":"_D2sbk","ml-md-6":"_e7bnL","pl-md-6":"_NQ2Nm","ml-md-7":"_rBXtE","pl-md-7":"_NeI-O","ml-md-8":"_XwNPD","pl-md-8":"_SbqlX","ml-md-9":"_Y-58E","pl-md-9":"_6cNCb","ml-md-10":"_JX9Cq","pl-md-10":"_uEAJa","mr-md-0":"_Jx5kC","pr-md-0":"_9FxwM","mr-md-1":"_iy6Yx","pr-md-1":"_RTwZ-","mr-md-2":"_Sm2g4","pr-md-2":"_mZS-2","mr-md-3":"_xKF1D","pr-md-3":"_okrlw","mr-md-4":"_bSzPv","pr-md-4":"_lahnF","mr-md-5":"_p5D7E","pr-md-5":"_RYFzr","mr-md-6":"_7DOT6","pr-md-6":"_aOldY","mr-md-7":"_GfYE-","pr-md-7":"_DNhH5","mr-md-8":"_eW2PP","pr-md-8":"_fteCN","mr-md-9":"_dyAiH","pr-md-9":"_xabgi","mr-md-10":"_PHePp","pr-md-10":"_qoP00","mt-md-0":"_05YBn","pt-md-0":"_yrlcd","mt-md-1":"_yFl6Y","pt-md-1":"_6b-mC","mt-md-2":"_G7jGU","pt-md-2":"_6GZzc","mt-md-3":"_ufBby","pt-md-3":"_qbnV7","mt-md-4":"_q7LKH","pt-md-4":"_hJCP8","mt-md-5":"_qtf2d","pt-md-5":"_aRWST","mt-md-6":"_TeL7T","pt-md-6":"_ZNePu","mt-md-7":"_jl4lr","pt-md-7":"_IlTFc","mt-md-8":"_a24kO","pt-md-8":"_-zvRb","mt-md-9":"_WXX3L","pt-md-9":"_2EEJ4","mt-md-10":"_X18TD","pt-md-10":"_MVooa","mb-md-0":"_DHwvN","pb-md-0":"_Uw70J","mb-md-1":"_v4jX-","pb-md-1":"_gJHwB","mb-md-2":"_boWJw","pb-md-2":"_j5kJT","mb-md-3":"_IZI-P","pb-md-3":"_LGchh","mb-md-4":"_R0Ont","pb-md-4":"_HYfpq","mb-md-5":"_ized0","pb-md-5":"_vTIf8","mb-md-6":"_zWpdC","pb-md-6":"_WEEGo","mb-md-7":"_1f-FE","pb-md-7":"_kfQzs","mb-md-8":"_j2X9B","pb-md-8":"_yRenj","mb-md-9":"_vnyNi","pb-md-9":"_JoD-h","mb-md-10":"_M-UM-","pb-md-10":"_L6x5K","mx-md-0":"_Vb8-P","px-md-0":"_4oZZN","mx-md-1":"_x42Ry","px-md-1":"_nR54S","mx-md-2":"_sBxfn","px-md-2":"_316Hu","mx-md-3":"_Hlimc","px-md-3":"_xIOYB","mx-md-4":"_9mXFC","px-md-4":"_-Fr6a","mx-md-5":"_Iv-gL","px-md-5":"_BqRA8","mx-md-6":"_7KKoC","px-md-6":"_32kSW","mx-md-7":"_qDWiW","px-md-7":"_vFnpw","mx-md-8":"_W4giE","px-md-8":"_4xRbP","mx-md-9":"_27uMt","px-md-9":"_7JLvO","mx-md-10":"_WyzX-","px-md-10":"_rzIDq","my-md-0":"_V28a9","py-md-0":"_znJMr","my-md-1":"_-3O4g","py-md-1":"_20sBd","my-md-2":"_O-A1l","py-md-2":"_5QSZG","my-md-3":"_QzjlZ","py-md-3":"_MILKq","my-md-4":"_O6rPK","py-md-4":"_KG0dA","my-md-5":"_0OhYl","py-md-5":"_KvUZf","my-md-6":"_rpwnV","py-md-6":"_yesTR","my-md-7":"_-WMtU","py-md-7":"_Ozuan","my-md-8":"_1gsdT","py-md-8":"_Zaqjb","my-md-9":"_nBoFu","py-md-9":"_ATTX2","my-md-10":"_LmCyF","py-md-10":"_FRV8s","m-xl-0":"_vfL3y","p-xl-0":"_EAyFx","m-xl-1":"_9Ru5u","p-xl-1":"_F2FfD","m-xl-2":"_uZD3X","p-xl-2":"_X9oXS","m-xl-3":"_D4N3Z","p-xl-3":"_zDeYX","m-xl-4":"_yHbfy","p-xl-4":"_6BvXQ","m-xl-5":"_gxlNl","p-xl-5":"_pCCVG","m-xl-6":"_qya4B","p-xl-6":"_QvUyx","m-xl-7":"_eJCt5","p-xl-7":"_p6XPi","m-xl-8":"_0THjs","p-xl-8":"_cC5TI","m-xl-9":"_k0QDj","p-xl-9":"_zwxO-","m-xl-10":"_4W0VS","p-xl-10":"_Xqjzh","ml-xl-0":"_jV-29","pl-xl-0":"_yy22x","ml-xl-1":"_T5fSu","pl-xl-1":"_93-K3","ml-xl-2":"_3zBLT","pl-xl-2":"_zjoAh","ml-xl-3":"_fz6la","pl-xl-3":"_UyWvU","ml-xl-4":"_rWYaL","pl-xl-4":"_9bQv0","ml-xl-5":"_0sArB","pl-xl-5":"_7o4Af","ml-xl-6":"_Y2eGT","pl-xl-6":"_xWqqk","ml-xl-7":"_YKpXT","pl-xl-7":"_g80UK","ml-xl-8":"_4cajU","pl-xl-8":"_h9QHX","ml-xl-9":"_oOpVP","pl-xl-9":"_ZXrhV","ml-xl-10":"_WJTHf","pl-xl-10":"_IZnPI","mr-xl-0":"_TB1mj","pr-xl-0":"_E3W1c","mr-xl-1":"_8EyKO","pr-xl-1":"_eaU7V","mr-xl-2":"_aCAu-","pr-xl-2":"_Fpj5l","mr-xl-3":"_GsiAJ","pr-xl-3":"_w-FUl","mr-xl-4":"_WXA1T","pr-xl-4":"_DbO3B","mr-xl-5":"_RtwaI","pr-xl-5":"_nwxwr","mr-xl-6":"_w9wUn","pr-xl-6":"_RBEVT","mr-xl-7":"_h4yUW","pr-xl-7":"_yzODd","mr-xl-8":"_HGkda","pr-xl-8":"_NR7L2","mr-xl-9":"_DKcGP","pr-xl-9":"_vfynG","mr-xl-10":"_klfNs","pr-xl-10":"_Olvpu","mt-xl-0":"_orHon","pt-xl-0":"_pqwts","mt-xl-1":"_OH3oL","pt-xl-1":"_QKjE8","mt-xl-2":"_8D31l","pt-xl-2":"_1l79D","mt-xl-3":"_kzbfM","pt-xl-3":"_wT--w","mt-xl-4":"_r8VYm","pt-xl-4":"_DgPY3","mt-xl-5":"_LF4aG","pt-xl-5":"_vD44v","mt-xl-6":"_c4BLJ","pt-xl-6":"_ElVvf","mt-xl-7":"_GxjHg","pt-xl-7":"_230T2","mt-xl-8":"_aCStj","pt-xl-8":"_vCtDV","mt-xl-9":"_Bo25T","pt-xl-9":"_kKkav","mt-xl-10":"_koZP7","pt-xl-10":"_dsMYs","mb-xl-0":"_C-FbO","pb-xl-0":"_3Nq0y","mb-xl-1":"_XrrZu","pb-xl-1":"_bV14o","mb-xl-2":"_uMcoW","pb-xl-2":"_sreSu","mb-xl-3":"_LcyMS","pb-xl-3":"_tU2l3","mb-xl-4":"_-OT5O","pb-xl-4":"_9HkKs","mb-xl-5":"_bHipN","pb-xl-5":"_DPjem","mb-xl-6":"_hifEE","pb-xl-6":"_RIEji","mb-xl-7":"_Oa7hP","pb-xl-7":"_vzsdg","mb-xl-8":"_pkI29","pb-xl-8":"_0jC5o","mb-xl-9":"_H4C-y","pb-xl-9":"_E9bOZ","mb-xl-10":"_ZVWPI","pb-xl-10":"_-u5jh","mx-xl-0":"_zXDFY","px-xl-0":"_-1-bs","mx-xl-1":"_Tb7NK","px-xl-1":"_xsfgY","mx-xl-2":"_EIQON","px-xl-2":"_Yzt4Z","mx-xl-3":"_LT9ms","px-xl-3":"_jHgj2","mx-xl-4":"_2SbJZ","px-xl-4":"_V-Y3l","mx-xl-5":"_-G8hg","px-xl-5":"_eycX1","mx-xl-6":"_dDxDv","px-xl-6":"_TgE5t","mx-xl-7":"_9CKTr","px-xl-7":"_I-zZG","mx-xl-8":"_SyFyQ","px-xl-8":"_Hyq-2","mx-xl-9":"_LAJdn","px-xl-9":"_ng4Ed","mx-xl-10":"_lp88j","px-xl-10":"_vmD8P","my-xl-0":"_eMXwe","py-xl-0":"_aETwB","my-xl-1":"_dS2Zm","py-xl-1":"_pHxI3","my-xl-2":"_kPY2w","py-xl-2":"_sPtzJ","my-xl-3":"_g1gY4","py-xl-3":"_OUmMw","my-xl-4":"_mLo8K","py-xl-4":"_wkW-B","my-xl-5":"_6P91L","py-xl-5":"_i3OCk","my-xl-6":"_cqBd2","py-xl-6":"_fZ8e0","my-xl-7":"_saauK","py-xl-7":"_wrgof","my-xl-8":"_5m8Th","py-xl-8":"_tlMWT","my-xl-9":"_HxjEh","py-xl-9":"_l-MtD","my-xl-10":"_dJDVj","py-xl-10":"_uEjIR","background-shine":"_O8uMC","path":"_WiuLg","line":"_fS3dR","skeleton":"_Z4CzX","skeleton-animate":"_-W0Ni","skeleton-dark":"_IoNbr","skeleton-dark-animate":"_7W6h3","skeleton-transparent":"_l3AMk","skeleton-transparent-animate":"_r77sc","semi-transparent":"_ci4Xo","qr-code":"_VZ0dT","fill":"_hFE1l"};
4867
4887
 
4868
- // TODO: [dev] add JSDoc
4888
+ /**
4889
+ * QrCode component renders a QR code for a provided crypto address.
4890
+ *
4891
+ * @component
4892
+ * @example
4893
+ * const address = "0x123456789abcdef";
4894
+ * const fill = true;
4895
+ * return <QrCode address={address} fill={fill} />;
4896
+ *
4897
+ * @param {Object} props - The props for the component.
4898
+ * @param {string} props.address - The crypto address to generate the QR code for.
4899
+ * @param {boolean} [props.fill=false] - If true, applies additional CSS class to fill the container.
4900
+ *
4901
+ * @returns {JSX.Element} A div containing the generated QR code.
4902
+ */
4869
4903
  const QrCode = ({
4870
4904
  address,
4871
4905
  fill: _fill = false
@@ -4892,7 +4926,8 @@ QrCode.propTypes = {
4892
4926
  fill: PropTypes.bool
4893
4927
  };
4894
4928
  QrCode.defaultProps = {
4895
- address: ""
4929
+ address: "",
4930
+ fill: false
4896
4931
  };
4897
4932
 
4898
4933
  var s$5 = {"container":"_NaTd2","m-0":"_YHORQ","p-0":"_vFwmg","m-1":"_XJaHq","p-1":"_hIM3t","m-2":"_WgBak","p-2":"_QbcpO","m-3":"_-S6sq","p-3":"_jOOQ0","m-4":"_znEJf","p-4":"_Lg8C3","m-5":"_qp5LK","p-5":"_5czqM","m-6":"_274as","p-6":"_Xl4AT","m-7":"_Zm2L-","p-7":"_apGWT","m-8":"_C94JK","p-8":"_-ZZwv","m-9":"_wCPNe","p-9":"_8AlLB","m-10":"_LkyIb","p-10":"_wmhyI","ml-0":"_X2MXW","pl-0":"_zLOyd","ml-1":"_Bt-i6","pl-1":"_btKpD","ml-2":"_4Bwl5","pl-2":"_pfI2U","ml-3":"_dkGsO","pl-3":"_Bxv71","ml-4":"_UwipE","pl-4":"_earg6","ml-5":"_F5beh","pl-5":"_0UFA4","ml-6":"_8JK7d","pl-6":"_D4Q-L","ml-7":"_xD22L","pl-7":"_x7e5C","ml-8":"_FHYzO","pl-8":"_pA0Gs","ml-9":"_beftM","pl-9":"_lygHM","ml-10":"_hxaQQ","pl-10":"_AQhiw","mr-0":"_FPd0G","pr-0":"_kzAQL","mr-1":"_3huZS","pr-1":"_QXzb1","mr-2":"_Rz58G","pr-2":"_yMW65","mr-3":"_MXmu7","pr-3":"_IDswm","mr-4":"_IcYbX","pr-4":"_x-YXe","mr-5":"_NYlLE","pr-5":"_4l555","mr-6":"_UjOdV","pr-6":"_SE5we","mr-7":"_AlzPK","pr-7":"_hUHaY","mr-8":"_-gsnW","pr-8":"_IP34z","mr-9":"_UmWyx","pr-9":"_MzrNl","mr-10":"_ds0Ix","pr-10":"_AYlq-","mt-0":"_7qyuy","pt-0":"_nIHOM","mt-1":"_6RqW-","pt-1":"_4-OC1","mt-2":"_rcUWP","pt-2":"_fkjUO","mt-3":"_S7R9D","pt-3":"_j5tAQ","mt-4":"_TUqA4","pt-4":"_vVsJ-","mt-5":"_sHshm","pt-5":"_B-zUI","mt-6":"_0cWsK","pt-6":"_9bfIn","mt-7":"_fjL9E","pt-7":"_NTUdY","mt-8":"_HasBT","pt-8":"_mVF0B","mt-9":"_-u5T1","pt-9":"_ExDUQ","mt-10":"_9pUY-","pt-10":"_eiVcd","mb-0":"_03MFB","pb-0":"_-KrHh","mb-1":"_wev0C","pb-1":"_wtVjK","mb-2":"_gprlv","pb-2":"_J2Q09","mb-3":"_RhXyK","pb-3":"_12ip-","mb-4":"_z5dvT","pb-4":"_Go5-i","mb-5":"_-KBHs","pb-5":"_E3y4V","mb-6":"_yaPh3","pb-6":"_tdi0b","mb-7":"_tv-DY","pb-7":"_fm9Cu","mb-8":"_oBOhs","pb-8":"_cplbD","mb-9":"_WLAwt","pb-9":"_Au3aP","mb-10":"_s2hC1","pb-10":"_L1xED","mx-0":"_AoX5Q","px-0":"_bNNCF","mx-1":"_h8MO1","px-1":"_AJV5c","mx-2":"_QS9LF","px-2":"_hjDVm","mx-3":"_s-SQj","px-3":"_NGiEN","mx-4":"_M6wbK","px-4":"_KCPtZ","mx-5":"_inpZ7","px-5":"_Fr1vd","mx-6":"_BZCXr","px-6":"_zX70b","mx-7":"_XS9X0","px-7":"_E-fbe","mx-8":"_1bVOE","px-8":"_q0UF1","mx-9":"_cWIFa","px-9":"_gJSuV","mx-10":"_wwZlY","px-10":"_eFX6M","my-0":"_jYkDW","py-0":"_ypkZR","my-1":"_1O4Zz","py-1":"_2yJ0B","my-2":"_s180c","py-2":"_-TKas","my-3":"_rbbHu","py-3":"_nEJt6","my-4":"_3X4XE","py-4":"_GLyG-","my-5":"_PPFYe","py-5":"_wj3wh","my-6":"_zxO-F","py-6":"_-Gh70","my-7":"_H7Lx-","py-7":"_ri-zp","my-8":"_kSsB4","py-8":"_DVbNR","my-9":"_VBCoh","py-9":"_7B8Mh","my-10":"_Bs8XQ","py-10":"_pwEBN","m-sm-0":"_oHFJU","p-sm-0":"_6Ukh0","m-sm-1":"_Etjc0","p-sm-1":"_pCMmU","m-sm-2":"_ERgH4","p-sm-2":"_gubJN","m-sm-3":"_3j0mZ","p-sm-3":"_h-278","m-sm-4":"_m25O0","p-sm-4":"_yM2Bk","m-sm-5":"_KR2He","p-sm-5":"_Q3d0A","m-sm-6":"_E1VMD","p-sm-6":"_uh277","m-sm-7":"_pDEm8","p-sm-7":"_efVXx","m-sm-8":"_PFrZ3","p-sm-8":"_qZLnl","m-sm-9":"_mvAgG","p-sm-9":"_F6MJe","m-sm-10":"_076H1","p-sm-10":"_zGVoi","ml-sm-0":"_ht3fQ","pl-sm-0":"_OOKlP","ml-sm-1":"_xyrlV","pl-sm-1":"_6N0PC","ml-sm-2":"_h9adY","pl-sm-2":"_QpEtQ","ml-sm-3":"_CD11L","pl-sm-3":"_PBl7w","ml-sm-4":"_Hfd1V","pl-sm-4":"_n-oVT","ml-sm-5":"_JTt3q","pl-sm-5":"_plbYR","ml-sm-6":"_6eXa4","pl-sm-6":"_UBe72","ml-sm-7":"_Uu42M","pl-sm-7":"_yxNHm","ml-sm-8":"_7ohP7","pl-sm-8":"_11foE","ml-sm-9":"_zRuRz","pl-sm-9":"_YisGl","ml-sm-10":"_Nc8nr","pl-sm-10":"_nyiix","mr-sm-0":"_AmWPq","pr-sm-0":"_6fYUi","mr-sm-1":"_mub2q","pr-sm-1":"_Vgj29","mr-sm-2":"_CIMnU","pr-sm-2":"_ot1oR","mr-sm-3":"_JCTye","pr-sm-3":"_vF9S2","mr-sm-4":"_DK3GL","pr-sm-4":"_xdAgD","mr-sm-5":"_WW9Gf","pr-sm-5":"_wVWX0","mr-sm-6":"_ObyBZ","pr-sm-6":"_QhcRY","mr-sm-7":"_LV5L8","pr-sm-7":"_Y5Gy0","mr-sm-8":"_5g6Dc","pr-sm-8":"_2AqT8","mr-sm-9":"_3sCFZ","pr-sm-9":"_1xGS-","mr-sm-10":"_qz1yf","pr-sm-10":"_JPmov","mt-sm-0":"_Th7pa","pt-sm-0":"_ClkMf","mt-sm-1":"_V27PW","pt-sm-1":"_mtTAL","mt-sm-2":"_Q09QK","pt-sm-2":"_1I3Gw","mt-sm-3":"_govQ3","pt-sm-3":"_tYeBV","mt-sm-4":"_EcCmu","pt-sm-4":"_XMDNY","mt-sm-5":"_PDuEt","pt-sm-5":"_6Vkzk","mt-sm-6":"_0YG19","pt-sm-6":"_2Cgli","mt-sm-7":"_-lWQN","pt-sm-7":"_cEzEZ","mt-sm-8":"_nGa33","pt-sm-8":"_-raau","mt-sm-9":"_PMq4L","pt-sm-9":"_w7zEF","mt-sm-10":"_ehNrF","pt-sm-10":"_jmaO2","mb-sm-0":"_RrFqz","pb-sm-0":"_12i4p","mb-sm-1":"_7Ahx0","pb-sm-1":"_flSBK","mb-sm-2":"_NB4sU","pb-sm-2":"_gPzKo","mb-sm-3":"_TV50u","pb-sm-3":"_bSZaB","mb-sm-4":"_eysFY","pb-sm-4":"_FteNR","mb-sm-5":"_EtHbQ","pb-sm-5":"_qTuR8","mb-sm-6":"_GB6FT","pb-sm-6":"_Py5nK","mb-sm-7":"_uIaBf","pb-sm-7":"_D2bHt","mb-sm-8":"_Q-avy","pb-sm-8":"_gsv-o","mb-sm-9":"_UG-gK","pb-sm-9":"_D9sNH","mb-sm-10":"_m2xUH","pb-sm-10":"_iQbrf","mx-sm-0":"_-L1Tf","px-sm-0":"_iKCny","mx-sm-1":"_75NUT","px-sm-1":"_QhF00","mx-sm-2":"_-LVWC","px-sm-2":"_Tvv1b","mx-sm-3":"_khdAw","px-sm-3":"_PZYyJ","mx-sm-4":"_OyZmA","px-sm-4":"_95e4A","mx-sm-5":"_Vnqmh","px-sm-5":"_eTlqy","mx-sm-6":"_XUY2U","px-sm-6":"_3EpGV","mx-sm-7":"_SHfGI","px-sm-7":"_eI7rR","mx-sm-8":"_zIL2L","px-sm-8":"_9saK-","mx-sm-9":"_H1Fzw","px-sm-9":"_kf1Hf","mx-sm-10":"_P8qDH","px-sm-10":"_gio52","my-sm-0":"_chaCt","py-sm-0":"_O7-z-","my-sm-1":"_LrTqG","py-sm-1":"_pHmaj","my-sm-2":"_oU92I","py-sm-2":"_Mnwns","my-sm-3":"_1C5A9","py-sm-3":"_ImF2o","my-sm-4":"_WbO9H","py-sm-4":"_Z1OmB","my-sm-5":"_EYXZu","py-sm-5":"_vYHEp","my-sm-6":"_g3MSP","py-sm-6":"_2NYDD","my-sm-7":"_2joeb","py-sm-7":"_qd50T","my-sm-8":"_VGpWm","py-sm-8":"_cwG11","my-sm-9":"_ekf8e","py-sm-9":"_cK4PR","my-sm-10":"_cc6Y3","py-sm-10":"_NDKAw","m-lg-0":"_iPRPm","p-lg-0":"_TWGN8","m-lg-1":"_Jb7vd","p-lg-1":"_sn9pN","m-lg-2":"_nqEiy","p-lg-2":"_Gy0Hb","m-lg-3":"_BY1ks","p-lg-3":"_8URKR","m-lg-4":"_2-3-j","p-lg-4":"_uGQk4","m-lg-5":"_-XWs9","p-lg-5":"_OnrIk","m-lg-6":"_qrdeX","p-lg-6":"_nMFGQ","m-lg-7":"_BRNYT","p-lg-7":"_3dEch","m-lg-8":"_MBNzK","p-lg-8":"_C-WZp","m-lg-9":"_dLTQ8","p-lg-9":"_w6ixh","m-lg-10":"_2jd3n","p-lg-10":"_2muU8","ml-lg-0":"_lUZMw","pl-lg-0":"_-KzSM","ml-lg-1":"_YMHZ-","pl-lg-1":"_gomUI","ml-lg-2":"_SL4B8","pl-lg-2":"_cJVO2","ml-lg-3":"_q1dRp","pl-lg-3":"_xwxkL","ml-lg-4":"_C0hXq","pl-lg-4":"_ikIn8","ml-lg-5":"_tgvFs","pl-lg-5":"_eHDg5","ml-lg-6":"_lTdC3","pl-lg-6":"_7HFwm","ml-lg-7":"_2faTD","pl-lg-7":"_jOAoH","ml-lg-8":"_deSOn","pl-lg-8":"_z9y5A","ml-lg-9":"_ws2he","pl-lg-9":"_ui5L7","ml-lg-10":"_oJN2I","pl-lg-10":"_6CRTE","mr-lg-0":"_d1x7e","pr-lg-0":"_reYgy","mr-lg-1":"_j4hAO","pr-lg-1":"_5f30G","mr-lg-2":"_liNod","pr-lg-2":"_IUuhb","mr-lg-3":"_V9TWD","pr-lg-3":"_rliGE","mr-lg-4":"_3z6mJ","pr-lg-4":"_Df6xY","mr-lg-5":"_Rd09K","pr-lg-5":"_cGcMj","mr-lg-6":"_Mwrny","pr-lg-6":"_KuKUQ","mr-lg-7":"_HR1SS","pr-lg-7":"_s2dUf","mr-lg-8":"_SAzax","pr-lg-8":"_cEuIZ","mr-lg-9":"_Ze5-9","pr-lg-9":"_JOVUS","mr-lg-10":"_Uwedj","pr-lg-10":"_ROhQj","mt-lg-0":"_Kjz26","pt-lg-0":"_6Z07U","mt-lg-1":"_aFxMX","pt-lg-1":"_KR6SN","mt-lg-2":"_5i7Rc","pt-lg-2":"_u9KBR","mt-lg-3":"_m5LsE","pt-lg-3":"_t6WGi","mt-lg-4":"_-bb51","pt-lg-4":"_cRc-3","mt-lg-5":"_bnTpD","pt-lg-5":"_hPBHM","mt-lg-6":"_bwpJA","pt-lg-6":"_PMDS2","mt-lg-7":"_hoXBi","pt-lg-7":"_8xjM4","mt-lg-8":"_gZ7--","pt-lg-8":"_BA6wE","mt-lg-9":"_21yv5","pt-lg-9":"_aWyCU","mt-lg-10":"_mGr43","pt-lg-10":"_cSkrF","mb-lg-0":"_WjmMC","pb-lg-0":"_Q1gA2","mb-lg-1":"_WkTBs","pb-lg-1":"_fvTua","mb-lg-2":"_vc-w4","pb-lg-2":"_5HHv6","mb-lg-3":"_l-4sg","pb-lg-3":"_g8uEK","mb-lg-4":"_lD2hM","pb-lg-4":"_3G1cG","mb-lg-5":"_OHyTI","pb-lg-5":"_KeAKX","mb-lg-6":"_c260B","pb-lg-6":"_Ndomr","mb-lg-7":"_BXB-e","pb-lg-7":"_dGq5C","mb-lg-8":"_4AUpv","pb-lg-8":"_npllZ","mb-lg-9":"_L9Rak","pb-lg-9":"_jt9k5","mb-lg-10":"_8RT15","pb-lg-10":"_wjycY","mx-lg-0":"_W0Be1","px-lg-0":"_4uVx8","mx-lg-1":"_i2L9f","px-lg-1":"_ZjJsm","mx-lg-2":"_ZcecZ","px-lg-2":"_hqNB-","mx-lg-3":"_jNUQn","px-lg-3":"_sHebC","mx-lg-4":"_YhUDD","px-lg-4":"_-84UO","mx-lg-5":"_Ph5qw","px-lg-5":"_NR3o7","mx-lg-6":"_9jTBk","px-lg-6":"_82ujL","mx-lg-7":"_IPpAN","px-lg-7":"_C-1sM","mx-lg-8":"_ZphvL","px-lg-8":"_HzdlK","mx-lg-9":"_X8kGx","px-lg-9":"_pXV5r","mx-lg-10":"_HzIMd","px-lg-10":"_u2L1o","my-lg-0":"_Gvgjh","py-lg-0":"_OgT1y","my-lg-1":"_u3Qyn","py-lg-1":"_taLyT","my-lg-2":"_Wy-mG","py-lg-2":"_qownY","my-lg-3":"_HI-Uz","py-lg-3":"_Q6C9n","my-lg-4":"_vOnhn","py-lg-4":"_SFYHT","my-lg-5":"_9BjMz","py-lg-5":"_8JklH","my-lg-6":"_EIbP6","py-lg-6":"_nW9wp","my-lg-7":"_zJIRo","py-lg-7":"_hPFAm","my-lg-8":"_fsnJO","py-lg-8":"_iCENv","my-lg-9":"_HnasH","py-lg-9":"_-hbdR","my-lg-10":"_X1Zxr","py-lg-10":"_H17sM","m-md-0":"_Ujtmy","p-md-0":"_49fa6","m-md-1":"_KbnrJ","p-md-1":"_yM5-R","m-md-2":"_-meNJ","p-md-2":"_Y4UvM","m-md-3":"_OwGHV","p-md-3":"_RBR9C","m-md-4":"_i-AVY","p-md-4":"_WwWmC","m-md-5":"_c1Qr0","p-md-5":"_A3U4m","m-md-6":"_GPcUJ","p-md-6":"_71YbI","m-md-7":"_ikQln","p-md-7":"_wvIwY","m-md-8":"_fT38W","p-md-8":"_9Yg2c","m-md-9":"_zBOP3","p-md-9":"_GFy-1","m-md-10":"_tYxAK","p-md-10":"_kjPhi","ml-md-0":"_quQF3","pl-md-0":"_-OzvZ","ml-md-1":"_wMPHV","pl-md-1":"_41XvH","ml-md-2":"_spwuT","pl-md-2":"_24nw7","ml-md-3":"_41odn","pl-md-3":"_yz4Tk","ml-md-4":"_-2vc6","pl-md-4":"_vvnDT","ml-md-5":"_54Ig3","pl-md-5":"_CG-dk","ml-md-6":"_iVeaz","pl-md-6":"_WXTU-","ml-md-7":"_Dh8xC","pl-md-7":"_kq23e","ml-md-8":"_BJ2fl","pl-md-8":"_MG9ww","ml-md-9":"_sQHE-","pl-md-9":"_6QT8u","ml-md-10":"_NyEZe","pl-md-10":"_ekmYg","mr-md-0":"_mTGTW","pr-md-0":"_hLgfO","mr-md-1":"_Rr3ZO","pr-md-1":"_9TkH0","mr-md-2":"_FdTOQ","pr-md-2":"_neJQM","mr-md-3":"_vBv00","pr-md-3":"_eQSPq","mr-md-4":"_yaN3k","pr-md-4":"_fAvoS","mr-md-5":"_IIII7","pr-md-5":"_NgVq0","mr-md-6":"_GpgeG","pr-md-6":"_xEVGa","mr-md-7":"_9gZpZ","pr-md-7":"_-hI7f","mr-md-8":"_U54Sx","pr-md-8":"_dMcIt","mr-md-9":"_znlEn","pr-md-9":"_2BEP4","mr-md-10":"_IJ0sH","pr-md-10":"_94GCu","mt-md-0":"_5Vn-b","pt-md-0":"_8qH0J","mt-md-1":"_81Va8","pt-md-1":"_qO6aN","mt-md-2":"_PHlw6","pt-md-2":"_mjoLe","mt-md-3":"_0l6tS","pt-md-3":"_GqIf0","mt-md-4":"_63JeO","pt-md-4":"_iETbw","mt-md-5":"_MefCn","pt-md-5":"_Jp-Or","mt-md-6":"_sP1nG","pt-md-6":"_x73S0","mt-md-7":"_DwVeG","pt-md-7":"_eCRBo","mt-md-8":"_1BuEh","pt-md-8":"_gLz6T","mt-md-9":"_TUu8p","pt-md-9":"_Od9Jg","mt-md-10":"_9xo0E","pt-md-10":"_3q9Qs","mb-md-0":"_q1N2O","pb-md-0":"_EfBmm","mb-md-1":"_e6vaB","pb-md-1":"_mPlV1","mb-md-2":"_UPkLS","pb-md-2":"_wx2ox","mb-md-3":"_L4Ru9","pb-md-3":"_U2POK","mb-md-4":"_8xBOI","pb-md-4":"_-E8B-","mb-md-5":"_W-iLG","pb-md-5":"_2QLo6","mb-md-6":"_xq6DM","pb-md-6":"_MJQbH","mb-md-7":"_23LK-","pb-md-7":"_Buv8D","mb-md-8":"_cLEvD","pb-md-8":"_wig0r","mb-md-9":"_zye4T","pb-md-9":"_XqA3E","mb-md-10":"_AHFVl","pb-md-10":"_FiJ-d","mx-md-0":"_iPAbb","px-md-0":"_OI0Hm","mx-md-1":"_9G4QU","px-md-1":"_it3Pu","mx-md-2":"_fWVT6","px-md-2":"_wLA22","mx-md-3":"_r3C2F","px-md-3":"_v1Lv8","mx-md-4":"_Voueh","px-md-4":"_b36iz","mx-md-5":"_As2Gw","px-md-5":"_dQbAe","mx-md-6":"_xcEqD","px-md-6":"_MrAbj","mx-md-7":"_eBuFO","px-md-7":"_xNr13","mx-md-8":"_QPZsY","px-md-8":"_8t2Px","mx-md-9":"_BAyIu","px-md-9":"_00pz1","mx-md-10":"_lO-A1","px-md-10":"_53BzA","my-md-0":"_lh08a","py-md-0":"_kBvO0","my-md-1":"_XTRn4","py-md-1":"_MO6dK","my-md-2":"_fHMgx","py-md-2":"_FXTLg","my-md-3":"_ffpT4","py-md-3":"_22-kw","my-md-4":"_FEg-m","py-md-4":"_ypkOx","my-md-5":"_R1AN7","py-md-5":"_DydJq","my-md-6":"_FXG1K","py-md-6":"_E0BJ-","my-md-7":"_x0N4A","py-md-7":"_WjdDu","my-md-8":"_KDLR1","py-md-8":"_y64sO","my-md-9":"_8eDO2","py-md-9":"_qquBK","my-md-10":"_EwNyz","py-md-10":"_N6I0i","m-xl-0":"_8P5t6","p-xl-0":"_ZpbeQ","m-xl-1":"_Dks6J","p-xl-1":"_mE8iF","m-xl-2":"_el9ru","p-xl-2":"_UTl4r","m-xl-3":"_azB2s","p-xl-3":"_gOS9v","m-xl-4":"_Slcp6","p-xl-4":"_lNxoS","m-xl-5":"_J-0LE","p-xl-5":"_iHe8I","m-xl-6":"_yZepR","p-xl-6":"_rbMpb","m-xl-7":"_-WhgU","p-xl-7":"_mjvu4","m-xl-8":"_1GOfJ","p-xl-8":"_sxTqQ","m-xl-9":"_I4D6b","p-xl-9":"_iVvvh","m-xl-10":"_wg39S","p-xl-10":"_GyDPP","ml-xl-0":"_6gsjS","pl-xl-0":"_JmRU5","ml-xl-1":"_v1VpM","pl-xl-1":"_DEQsB","ml-xl-2":"_9L1JA","pl-xl-2":"_ie1jJ","ml-xl-3":"_zpNcl","pl-xl-3":"_0SKlr","ml-xl-4":"_-REYo","pl-xl-4":"_2lS8e","ml-xl-5":"_2Na2F","pl-xl-5":"_-s-Fm","ml-xl-6":"_pJW1z","pl-xl-6":"_CKN-E","ml-xl-7":"_FgJs7","pl-xl-7":"_j0Erz","ml-xl-8":"_J7vMq","pl-xl-8":"_o2JEq","ml-xl-9":"_drfPx","pl-xl-9":"_jyscO","ml-xl-10":"_5tuQV","pl-xl-10":"_QqMj7","mr-xl-0":"_3s4H3","pr-xl-0":"_-g6oD","mr-xl-1":"_irt5W","pr-xl-1":"_cixdv","mr-xl-2":"_-WyU1","pr-xl-2":"_508yO","mr-xl-3":"_hcmRB","pr-xl-3":"_yv-S6","mr-xl-4":"_Azljg","pr-xl-4":"_iSmGO","mr-xl-5":"_ljdF7","pr-xl-5":"_ExPZ3","mr-xl-6":"_JnJB4","pr-xl-6":"_hqr45","mr-xl-7":"_QHl1W","pr-xl-7":"_NNYAu","mr-xl-8":"_Uvzse","pr-xl-8":"_iXiqD","mr-xl-9":"_7uOKO","pr-xl-9":"_kit7Z","mr-xl-10":"_wAqvW","pr-xl-10":"_6PFk0","mt-xl-0":"_sdtH-","pt-xl-0":"_NCcCs","mt-xl-1":"_DQicu","pt-xl-1":"_4ULM-","mt-xl-2":"_YDSc6","pt-xl-2":"_lIAG5","mt-xl-3":"_TfWVv","pt-xl-3":"_iSTeE","mt-xl-4":"_JM-Od","pt-xl-4":"_k5SO2","mt-xl-5":"_FQRS6","pt-xl-5":"_L0fB3","mt-xl-6":"_eX5qy","pt-xl-6":"_y6uWa","mt-xl-7":"_c2Kgp","pt-xl-7":"_NuKFH","mt-xl-8":"_sKUD0","pt-xl-8":"_SrcyS","mt-xl-9":"_zm1YI","pt-xl-9":"_tCb2k","mt-xl-10":"_5V3Ww","pt-xl-10":"_JI4CW","mb-xl-0":"_werGX","pb-xl-0":"_ElhJG","mb-xl-1":"_RvlfX","pb-xl-1":"_ByoQk","mb-xl-2":"_Be3gd","pb-xl-2":"_FoRlm","mb-xl-3":"_1z4eB","pb-xl-3":"_4mmGN","mb-xl-4":"_ktyWD","pb-xl-4":"_NDUC-","mb-xl-5":"_5vEIK","pb-xl-5":"_ZPRwH","mb-xl-6":"_yfnPa","pb-xl-6":"_u52jn","mb-xl-7":"_y1Puu","pb-xl-7":"_Dt-tw","mb-xl-8":"_uX6MD","pb-xl-8":"_EefsF","mb-xl-9":"_GM91N","pb-xl-9":"_6tOpa","mb-xl-10":"_d9w9L","pb-xl-10":"_qMAiq","mx-xl-0":"_r0ha6","px-xl-0":"_arjXu","mx-xl-1":"_lQe5Y","px-xl-1":"_aFAtc","mx-xl-2":"_qGnkl","px-xl-2":"_r2bDr","mx-xl-3":"_AKBiJ","px-xl-3":"_qidn1","mx-xl-4":"_Xndir","px-xl-4":"_mzK8z","mx-xl-5":"_vuKvl","px-xl-5":"_5eob9","mx-xl-6":"_6zjoG","px-xl-6":"_u2376","mx-xl-7":"_NomJg","px-xl-7":"_cpIVH","mx-xl-8":"_DIbHl","px-xl-8":"_sTwkl","mx-xl-9":"_LJhtb","px-xl-9":"_99ZRS","mx-xl-10":"_RyT0w","px-xl-10":"_NXPYf","my-xl-0":"_4mARD","py-xl-0":"_cZCg4","my-xl-1":"_s65h0","py-xl-1":"_h0IMr","my-xl-2":"_xJjZc","py-xl-2":"_ap-Wz","my-xl-3":"_-nrYV","py-xl-3":"_VoZny","my-xl-4":"_t29x5","py-xl-4":"_yt6Uh","my-xl-5":"_1GB5N","py-xl-5":"_Zfpi1","my-xl-6":"_Z9v80","py-xl-6":"_-Ymwb","my-xl-7":"_TPI94","py-xl-7":"_yDb9i","my-xl-8":"_PG7cx","py-xl-8":"_Au4Oz","my-xl-9":"_NGXXu","py-xl-9":"_q-tXb","my-xl-10":"_g63Xq","py-xl-10":"_dVrmW","background-shine":"_9FSCy","path":"_YSBJs","line":"_MGRy0","skeleton":"_uSX6q","skeleton-animate":"_1JImE","skeleton-dark":"_GoVkE","skeleton-dark-animate":"_W4Xm1","skeleton-transparent":"_miCCb","skeleton-transparent-animate":"_8nUtm","semi-transparent":"_TNpj-","first-line-text":"_IGz2I","wrap":"_eKd8P","break":"_mT5i4","full-text":"_PVKxC","shorted":"_wB5qV","horizontal":"_lqJz-","second-line-text":"_hdF64"};
@@ -7780,12 +7815,21 @@ class BaseSwapCreationInfo {
7780
7815
  }
7781
7816
  }
7782
7817
 
7818
+ // TODO: [refactoring, moderate] extract structure of _supportedCoins into model class
7783
7819
  class SwapProvider {
7820
+ constructor(cache, customCoinBuilder = (coin, network) => null, useRestrictedCoinsSet = true) {
7821
+ this._supportedCoins = [];
7822
+ this._maxRateDigits = 20;
7823
+ this.useRestrictedCoinsSet = useRestrictedCoinsSet;
7824
+ this._customCoinBuilder = customCoinBuilder;
7825
+ this._cache = cache;
7826
+ this.isAggregator = false;
7827
+ }
7784
7828
  /**
7785
7829
  * @return {Promise<void>}
7786
7830
  */
7787
7831
  async initialize() {
7788
- throw new Error("Not implemented in base");
7832
+ await this._fetchSupportedCurrenciesIfNeeded();
7789
7833
  }
7790
7834
 
7791
7835
  /**
@@ -7795,6 +7839,33 @@ class SwapProvider {
7795
7839
  throw new Error("Not implemented in base");
7796
7840
  }
7797
7841
 
7842
+ /**
7843
+ * This method sort internal list putting popular (as provider thinks) coins to the top.
7844
+ * This is just for users of this API if they don't care about the sorting - we just improve a list a bit this way.
7845
+ * @private
7846
+ */
7847
+ _putPopularCoinsFirst() {
7848
+ this._supportedCoins.sort((i1, i2) => {
7849
+ if (i1.isPopular !== i2.isPopular) return i2.isPopular - i1.isPopular;
7850
+ return i1.coin.ticker.localeCompare(i2.coin.ticker);
7851
+ });
7852
+ }
7853
+
7854
+ /**
7855
+ * Should fill _supportedCoins with array of coins.
7856
+ * Coin construction rules:
7857
+ * 1. ticker should be CODEPROTOCOL_CODE e.g. USDTERC20
7858
+ * 2. name should not contain (PROTOCOL_CODE) or just PROTOCOL_CODe
7859
+ * 3. protocol should be null for coins major for their blockchains like BTC, ETH
7860
+ * 4. isPopular should be a number
7861
+ *
7862
+ * @return {Promise<void>}
7863
+ * @private
7864
+ */
7865
+ async _fetchSupportedCurrenciesIfNeeded() {
7866
+ throw new Error("Not implemented in base - _fetchSupportedCurrenciesIfNeeded");
7867
+ }
7868
+
7798
7869
  /**
7799
7870
  * Retrieves all currencies supported by this swap provider.
7800
7871
  * Returns one of SwapProvider.COMMON_ERRORS in case of processable fail.
@@ -7802,7 +7873,25 @@ class SwapProvider {
7802
7873
  * @return {Promise<({ result: true, coins: Coin[] }|{ result: false, reason: string })>}
7803
7874
  */
7804
7875
  async getAllSupportedCurrencies() {
7805
- throw new Error("Not implemented in base");
7876
+ const loggerSource = "getAllSupportedCurrencies";
7877
+ try {
7878
+ var _this$_supportedCoins;
7879
+ await this._fetchSupportedCurrenciesIfNeeded();
7880
+ Logger.log(`We have ${(_this$_supportedCoins = this._supportedCoins) == null ? void 0 : _this$_supportedCoins.length} supported coins returning`, loggerSource);
7881
+ return {
7882
+ result: true,
7883
+ coins: this._supportedCoins.map(item => item.coin)
7884
+ };
7885
+ } catch (e) {
7886
+ var _e$response;
7887
+ if ((e == null || (_e$response = e.response) == null ? void 0 : _e$response.status) === 429) {
7888
+ return {
7889
+ result: false,
7890
+ reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED
7891
+ };
7892
+ }
7893
+ improveAndRethrow(e, loggerSource);
7894
+ }
7806
7895
  }
7807
7896
 
7808
7897
  /**
@@ -7812,7 +7901,25 @@ class SwapProvider {
7812
7901
  * @return {Promise<({ result: true, coins: Coin[] }|{ result: false, reason: string })>}
7813
7902
  */
7814
7903
  async getDepositCurrencies() {
7815
- throw new Error("Not implemented in base");
7904
+ const loggerSource = "getDepositCurrencies";
7905
+ try {
7906
+ var _this$_supportedCoins2;
7907
+ await this._fetchSupportedCurrenciesIfNeeded();
7908
+ Logger.log(`We have ${(_this$_supportedCoins2 = this._supportedCoins) == null ? void 0 : _this$_supportedCoins2.length} supported coins, getting depositable`, loggerSource);
7909
+ return {
7910
+ result: true,
7911
+ coins: this._supportedCoins.filter(item => item.deposit).map(item => item.coin)
7912
+ };
7913
+ } catch (e) {
7914
+ var _e$response2;
7915
+ if ((e == null || (_e$response2 = e.response) == null ? void 0 : _e$response2.status) === 429) {
7916
+ return {
7917
+ result: false,
7918
+ reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED
7919
+ };
7920
+ }
7921
+ improveAndRethrow(e, loggerSource);
7922
+ }
7816
7923
  }
7817
7924
 
7818
7925
  /**
@@ -7823,17 +7930,52 @@ class SwapProvider {
7823
7930
  * @return {Promise<({ result: true, coins: Coin[] }|{ result: false, reason: string })>}
7824
7931
  */
7825
7932
  async getWithdrawalCurrencies(exceptCurrency = null) {
7826
- throw new Error("Not implemented in base");
7933
+ const loggerSource = "getWithdrawalCurrencies";
7934
+ try {
7935
+ var _this$_supportedCoins3;
7936
+ await this._fetchSupportedCurrenciesIfNeeded();
7937
+ Logger.log(`We have ${(_this$_supportedCoins3 = this._supportedCoins) == null ? void 0 : _this$_supportedCoins3.length} supported coins, getting withdrawable`, loggerSource);
7938
+ return {
7939
+ result: true,
7940
+ coins: this._supportedCoins.filter(item => {
7941
+ var _item$coin;
7942
+ return item.withdrawal && (!exceptCurrency || ((_item$coin = item.coin) == null ? void 0 : _item$coin.ticker) !== (exceptCurrency == null ? void 0 : exceptCurrency.ticker));
7943
+ }).map(item => item.coin)
7944
+ };
7945
+ } catch (e) {
7946
+ var _e$response3;
7947
+ if ((e == null || (_e$response3 = e.response) == null ? void 0 : _e$response3.status) === 429) {
7948
+ return {
7949
+ result: false,
7950
+ reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED
7951
+ };
7952
+ }
7953
+ improveAndRethrow(e, loggerSource);
7954
+ }
7827
7955
  }
7828
7956
 
7829
7957
  /**
7830
7958
  * Retrieves URL for coin icon or fallback if not found.
7831
7959
  *
7832
- * @param coin {Coin|string} coin or rabbit-format of coin ticker
7960
+ * @param coinOrTicker {Coin|string} coin or rabbit-format of coin ticker
7833
7961
  * @return {string}
7834
7962
  */
7835
- getIconUrl(coin) {
7836
- throw new Error("Not implemented in base");
7963
+ getIconUrl(coinOrTicker) {
7964
+ const loggerSource = "getIconUrl";
7965
+ try {
7966
+ var _this$_supportedCoins5, _this$_supportedCoins6;
7967
+ let coin = coinOrTicker;
7968
+ if (!(coinOrTicker instanceof Coin)) {
7969
+ var _this$_supportedCoins4;
7970
+ coin = (_this$_supportedCoins4 = this._supportedCoins.find(i => i.coin.ticker === coinOrTicker)) == null ? void 0 : _this$_supportedCoins4.coin;
7971
+ }
7972
+ return (_this$_supportedCoins5 = (_this$_supportedCoins6 = this._supportedCoins.find(item => {
7973
+ var _item$coin2, _coin;
7974
+ return ((_item$coin2 = item.coin) == null ? void 0 : _item$coin2.ticker) === ((_coin = coin) == null ? void 0 : _coin.ticker);
7975
+ })) == null ? void 0 : _this$_supportedCoins6.iconURL) != null ? _this$_supportedCoins5 : FALLBACK_ASSET_ICON_URL;
7976
+ } catch (e) {
7977
+ improveAndRethrow(e, loggerSource);
7978
+ }
7837
7979
  }
7838
7980
 
7839
7981
  /**
@@ -7843,7 +7985,46 @@ class SwapProvider {
7843
7985
  * @return {{result: true, rate: string}|{result: false}}
7844
7986
  */
7845
7987
  async getCoinToUSDTRate(coin) {
7846
- throw new Error("Not implemented in base");
7988
+ const loggerSource = "getCoinToUSDTRate";
7989
+ try {
7990
+ var _this$_supportedCoins7;
7991
+ if (!coin) return null;
7992
+ await this._fetchSupportedCurrenciesIfNeeded();
7993
+
7994
+ // Using USDT TRC20 as usually fee in this network is smaller than ERC20 and this network is widely used for USDT
7995
+ const usdtTrc20 = (_this$_supportedCoins7 = this._supportedCoins.find(i => i.coin.ticker === "USDTTRC20")) == null ? void 0 : _this$_supportedCoins7.coin;
7996
+ if (!usdtTrc20) {
7997
+ return {
7998
+ result: false
7999
+ };
8000
+ }
8001
+ const cached = this._cache.get("swapspace_usdt_rate_" + coin.ticker);
8002
+ if (cached != null) {
8003
+ return {
8004
+ result: true,
8005
+ rate: cached
8006
+ };
8007
+ }
8008
+ Logger.log("Loading USDT->coin rate as not found in cache:", coin == null ? void 0 : coin.ticker);
8009
+ const result = await this.getSwapInfo(usdtTrc20, coin, "5000", false);
8010
+ if (!result.result) {
8011
+ return {
8012
+ result: false
8013
+ };
8014
+ }
8015
+
8016
+ // This calculation is not precise as we cannot recognize the actual fee and network fee. Just approximate.
8017
+ const standardSwapspaceFeeMultiplier = 1.004; // fee is usually 0.4%
8018
+ const rate = BigNumber(1).div(BigNumber(result.rate).times(standardSwapspaceFeeMultiplier)).toString();
8019
+ this._cache.put("swap_usdt_rate_" + coin.ticker, rate, 15 * 60000 // 15 minutes
8020
+ );
8021
+ return {
8022
+ result: true,
8023
+ rate: rate
8024
+ };
8025
+ } catch (e) {
8026
+ improveAndRethrow(e, loggerSource);
8027
+ }
7847
8028
  }
7848
8029
 
7849
8030
  /**
@@ -7858,6 +8039,7 @@ class SwapProvider {
7858
8039
  * @param [fixed=false] {boolean|null} null means fixed or float doesn't matter
7859
8040
  * @param [fromCoinToUsdRate=null] pass if you want to increase the min amount returned
7860
8041
  * by provider with some fixed "insurance" amount to cover min amount fluctuations.
8042
+ * @param [amountIsToReceive=false] {boolean} whether the given amount is receiving amount. False means the amount is the sending amount.
7861
8043
  * @return {Promise<({
7862
8044
  * result: false,
7863
8045
  * reason: string,
@@ -7876,7 +8058,7 @@ class SwapProvider {
7876
8058
  * [rawSwapData]: Object
7877
8059
  * })>}
7878
8060
  */
7879
- async getSwapInfo(fromCoin, toCoin, amountCoins, fixed = false, fromCoinToUsdRate = null) {
8061
+ async getSwapInfo(fromCoin, toCoin, amountCoins, fixed = false, fromCoinToUsdRate = null, amountIsToReceive = false) {
7880
8062
  throw new Error("Not implemented in base");
7881
8063
  }
7882
8064
 
@@ -7893,6 +8075,7 @@ class SwapProvider {
7893
8075
  * @param fixed {boolean}
7894
8076
  * @param [toCurrencyExtraId=""] {string} optional extra ID
7895
8077
  * @param [refundExtraId=""] {string} optional extra ID for refund address
8078
+ * @param [amountIsToReceive=false] {boolean} whether the given amount is receiving amount. False means the amount is the sending amount.
7896
8079
  * @return {Promise<({
7897
8080
  * result: true,
7898
8081
  * swapId: string,
@@ -7911,7 +8094,7 @@ class SwapProvider {
7911
8094
  * partner: string
7912
8095
  * })>}
7913
8096
  */
7914
- async createSwap(fromCoin, toCoin, amount, toAddress, refundAddress, rawSwapData, clientIpAddress, fixed, toCurrencyExtraId = "", refundExtraId = "") {
8097
+ async createSwap(fromCoin, toCoin, amount, toAddress, refundAddress, rawSwapData, clientIpAddress, fixed, toCurrencyExtraId = "", refundExtraId = "", amountIsToReceive = false) {
7915
8098
  throw new Error("Not implemented in base");
7916
8099
  }
7917
8100
 
@@ -7931,7 +8114,13 @@ class SwapProvider {
7931
8114
  * @return {Coin|null}
7932
8115
  */
7933
8116
  getCoinByTickerIfPresent(ticker) {
7934
- throw new Error("Not implemented in base");
8117
+ try {
8118
+ var _item$coin3;
8119
+ const item = this._supportedCoins.find(i => i.coin.ticker === ticker);
8120
+ return (_item$coin3 = item == null ? void 0 : item.coin) != null ? _item$coin3 : null;
8121
+ } catch (e) {
8122
+ improveAndRethrow(e, "getCoinByTickerIfPresent");
8123
+ }
7935
8124
  }
7936
8125
 
7937
8126
  /**
@@ -7940,7 +8129,21 @@ class SwapProvider {
7940
8129
  * @return {boolean}
7941
8130
  */
7942
8131
  isAddressValidForAsset(asset, address) {
7943
- throw new Error("Not implemented in base");
8132
+ try {
8133
+ const assetData = this._supportedCoins.find(i => {
8134
+ var _i$coin;
8135
+ return ((_i$coin = i.coin) == null ? void 0 : _i$coin.ticker) === (asset == null ? void 0 : asset.ticker);
8136
+ });
8137
+ if (assetData) {
8138
+ let corrected = assetData.validationRegexp.trim();
8139
+ corrected = corrected[0] === "/" ? corrected.slice(1) : corrected;
8140
+ corrected = corrected[corrected.length - 1] === "/" ? corrected.slice(0, corrected.length - 1) : corrected;
8141
+ return address.match(corrected) != null;
8142
+ }
8143
+ } catch (e) {
8144
+ Logger.logError(e, "isAddressValidForAsset");
8145
+ }
8146
+ return false;
7944
8147
  }
7945
8148
 
7946
8149
  /**
@@ -7948,7 +8151,42 @@ class SwapProvider {
7948
8151
  * @return {string|null}
7949
8152
  */
7950
8153
  getExtraIdNameIfPresent(asset) {
7951
- throw new Error("Not implemented in base");
8154
+ try {
8155
+ const assetData = this._supportedCoins.find(i => {
8156
+ var _i$coin2;
8157
+ return ((_i$coin2 = i.coin) == null ? void 0 : _i$coin2.ticker) === (asset == null ? void 0 : asset.ticker);
8158
+ });
8159
+ if (assetData != null && assetData.hasExtraId) {
8160
+ if ((assetData == null ? void 0 : assetData.extraIdName) == null || (assetData == null ? void 0 : assetData.extraIdName) === "") {
8161
+ // We return some default name if the extraIdName is empty
8162
+ return "ID";
8163
+ }
8164
+ return assetData == null ? void 0 : assetData.extraIdName;
8165
+ }
8166
+ return null;
8167
+ } catch (e) {
8168
+ improveAndRethrow(e, "getExtraIdNameIfPresent");
8169
+ }
8170
+ }
8171
+ removeProtocolNameFromCoinName(coinName, tickerPrintable, protocolName) {
8172
+ if (coinName) {
8173
+ const originalName = coinName;
8174
+ if (tickerPrintable) {
8175
+ coinName = coinName.replaceAll(new RegExp(`\\(${tickerPrintable}\\)`, "gi"), "");
8176
+ }
8177
+ if (protocolName) {
8178
+ coinName = coinName.replaceAll(new RegExp(`\\(${protocolName}\\)`, "gi"), "").replaceAll(new RegExp(`(?<!on) ${protocolName}$`, "gi"), "").replaceAll(new RegExp(`^${protocolName} `, "gi"), "").replaceAll(new RegExp(`(?<!on) ${protocolName} `, "gi"), " ");
8179
+ }
8180
+ coinName = coinName.replaceAll(/ +/g, " ").trim();
8181
+ const defaultNames = ["token", "network", "protocol", "coin", "mainnet", "chain", "project", "cash", "finance", "wrapped", "blockchain", "network"];
8182
+ const lowerCoinName = coinName.toLowerCase();
8183
+ const isBecameDefaultName = defaultNames.find(defName => lowerCoinName === defName || lowerCoinName === `the ${defName}`);
8184
+ if (coinName === "" || isBecameDefaultName) {
8185
+ // Rolling back to original name if our processing leads in empty name or one of the default words
8186
+ coinName = originalName;
8187
+ }
8188
+ }
8189
+ return coinName;
7952
8190
  }
7953
8191
  }
7954
8192
  SwapProvider.COMMON_ERRORS = {
@@ -7966,129 +8204,33 @@ SwapProvider.CREATION_FAIL_REASONS = {
7966
8204
  };
7967
8205
  SwapProvider.SWAP_STATUSES = {
7968
8206
  WAITING_FOR_PAYMENT: "waiting_for_payment",
7969
- // public +
7970
8207
  CONFIRMING: "confirming",
7971
8208
  PAYMENT_RECEIVED: "payment_received",
7972
- // public +
7973
8209
  EXCHANGING: "exchanging",
7974
- // session full // public +
7975
8210
  COMPLETED: "completed",
7976
- // session full // public +
7977
8211
  REFUNDED: "refunded",
7978
- // session full // public +
7979
8212
  EXPIRED: "expired",
7980
- // public +
7981
- FAILED: "failed" // public +
8213
+ FAILED: "failed"
7982
8214
  };
7983
8215
 
7984
8216
  const BANNED_PARTNERS = ["stealthex", "changee", "coincraddle"];
7985
8217
  class SwapspaceSwapProvider extends SwapProvider {
7986
8218
  constructor(apiKeysProxyUrl, cache, customCoinBuilder = (coin, network) => null, useRestrictedCoinsSet = true) {
7987
- super();
7988
- this._supportedCoins = [];
8219
+ super(cache, customCoinBuilder, useRestrictedCoinsSet);
7989
8220
  this._partners = [];
7990
- this._URL = `${apiKeysProxyUrl}`;
7991
- this._maxRateDigits = 20;
7992
- this.useRestrictedCoinsSet = useRestrictedCoinsSet;
7993
- this._customCoinBuilder = customCoinBuilder;
7994
- this._cache = cache;
8221
+ this._URL = `${apiKeysProxyUrl}/swapspace`;
8222
+ this.isAggregator = true;
7995
8223
  }
7996
8224
  getSwapCreationInfoTtlMs() {
7997
8225
  /* Actually 2 minutes and only relevant for some partners, but we use it
7998
8226
  * (and even a bit smaller value) for better consistency */
7999
8227
  return 110000;
8000
8228
  }
8001
- async getDepositCurrencies() {
8002
- const loggerSource = "getDepositCurrencies";
8229
+ async _fetchSupportedCurrenciesIfNeeded() {
8230
+ const loggerSource = "_fetchSupportedCurrenciesIfNeeded";
8003
8231
  try {
8004
8232
  var _this$_supportedCoins;
8005
- await this._fetchSupportedCurrenciesIfNeeded();
8006
- Logger.log(`We have ${(_this$_supportedCoins = this._supportedCoins) == null ? void 0 : _this$_supportedCoins.length} supported coins, getting depositable`, loggerSource);
8007
- return {
8008
- result: true,
8009
- coins: this._supportedCoins.filter(item => item.deposit).map(item => item.coin)
8010
- };
8011
- } catch (e) {
8012
- var _e$response;
8013
- if ((e == null || (_e$response = e.response) == null ? void 0 : _e$response.status) === 429) {
8014
- return {
8015
- result: false,
8016
- reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED
8017
- };
8018
- }
8019
- improveAndRethrow(e, loggerSource);
8020
- }
8021
- }
8022
- async getAllSupportedCurrencies() {
8023
- const loggerSource = "getAllSupportedCurrencies";
8024
- try {
8025
- var _this$_supportedCoins2;
8026
- await this._fetchSupportedCurrenciesIfNeeded();
8027
- Logger.log(`We have ${(_this$_supportedCoins2 = this._supportedCoins) == null ? void 0 : _this$_supportedCoins2.length} supported coins returning`, loggerSource);
8028
- return {
8029
- result: true,
8030
- coins: this._supportedCoins.map(item => item.coin)
8031
- };
8032
- } catch (e) {
8033
- var _e$response2;
8034
- if ((e == null || (_e$response2 = e.response) == null ? void 0 : _e$response2.status) === 429) {
8035
- return {
8036
- result: false,
8037
- reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED
8038
- };
8039
- }
8040
- improveAndRethrow(e, loggerSource);
8041
- }
8042
- }
8043
- async getWithdrawalCurrencies(exceptCurrency = null) {
8044
- const loggerSource = "getWithdrawalCurrencies";
8045
- try {
8046
- var _this$_supportedCoins3;
8047
- await this._fetchSupportedCurrenciesIfNeeded();
8048
- Logger.log(`We have ${(_this$_supportedCoins3 = this._supportedCoins) == null ? void 0 : _this$_supportedCoins3.length} supported coins, getting withdrawable`, loggerSource);
8049
- return {
8050
- result: true,
8051
- coins: this._supportedCoins.filter(item => {
8052
- var _item$coin;
8053
- return item.withdrawal && (!exceptCurrency || ((_item$coin = item.coin) == null ? void 0 : _item$coin.ticker) !== (exceptCurrency == null ? void 0 : exceptCurrency.ticker));
8054
- }).map(item => item.coin)
8055
- };
8056
- } catch (e) {
8057
- var _e$response3;
8058
- if ((e == null || (_e$response3 = e.response) == null ? void 0 : _e$response3.status) === 429) {
8059
- return {
8060
- result: false,
8061
- reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED
8062
- };
8063
- }
8064
- improveAndRethrow(e, loggerSource);
8065
- }
8066
- }
8067
- async initialize() {
8068
- await this._fetchSupportedCurrenciesIfNeeded();
8069
- }
8070
- getIconUrl(coinOrTicker) {
8071
- const loggerSource = "getIconUrl";
8072
- try {
8073
- var _this$_supportedCoins5, _this$_supportedCoins6;
8074
- let coin = coinOrTicker;
8075
- if (!(coinOrTicker instanceof Coin)) {
8076
- var _this$_supportedCoins4;
8077
- coin = (_this$_supportedCoins4 = this._supportedCoins.find(i => i.coin.ticker === coinOrTicker)) == null ? void 0 : _this$_supportedCoins4.coin;
8078
- }
8079
- return (_this$_supportedCoins5 = (_this$_supportedCoins6 = this._supportedCoins.find(item => {
8080
- var _item$coin2, _coin;
8081
- return ((_item$coin2 = item.coin) == null ? void 0 : _item$coin2.ticker) === ((_coin = coin) == null ? void 0 : _coin.ticker);
8082
- })) == null ? void 0 : _this$_supportedCoins6.iconURL) != null ? _this$_supportedCoins5 : FALLBACK_ASSET_ICON_URL;
8083
- } catch (e) {
8084
- improveAndRethrow(e, loggerSource);
8085
- }
8086
- }
8087
- async _fetchSupportedCurrenciesIfNeeded() {
8088
- const loggerSource = "_fetchSupportedCurrenciesIfNeeded";
8089
- try {
8090
- var _this$_supportedCoins7;
8091
- if (!((_this$_supportedCoins7 = this._supportedCoins) != null && _this$_supportedCoins7.length)) {
8233
+ if (!((_this$_supportedCoins = this._supportedCoins) != null && _this$_supportedCoins.length)) {
8092
8234
  var _rawResponse$data, _rawResponse$data2;
8093
8235
  const rawResponse = await axios.get(`${this._URL}/api/v2/currencies`);
8094
8236
  Logger.log(`Retrieved ${rawResponse == null || (_rawResponse$data = rawResponse.data) == null ? void 0 : _rawResponse$data.length}`, loggerSource);
@@ -8097,7 +8239,6 @@ class SwapspaceSwapProvider extends SwapProvider {
8097
8239
  this._supportedCoins = allowedCoins.map(item => {
8098
8240
  let coin = this._customCoinBuilder(item.code, item.network);
8099
8241
  if (!coin && !this.useRestrictedCoinsSet) {
8100
- var _item$name;
8101
8242
  /** Building coin object for coin that isn't supported OOB in Rabbit.
8102
8243
  * We are doing this way to be able to use extended coins set for swaps.
8103
8244
  * These temporary built coins are only for in-swap use, and we omit some usual
@@ -8111,11 +8252,7 @@ class SwapspaceSwapProvider extends SwapProvider {
8111
8252
  /** Removing ticker and protocol name from coin name as we usually use them explicitly
8112
8253
  * from coin object rather than counting on having it in the coin name itself.
8113
8254
  * This processing is needed due to poor quality of swapspace coins names. */
8114
- let name = ((_item$name = item.name) != null ? _item$name : "").replaceAll(`(${code})`, "").replaceAll(`(${network})`, "").replaceAll(/ +/g, " ").trim();
8115
- if (name === "") {
8116
- // Rolling back to original name if our processing leads in empty name
8117
- name = item.name;
8118
- }
8255
+ let name = this.removeProtocolNameFromCoinName(item.name, code, network);
8119
8256
  const ticker = `${code}${code === network ? "" : network}`;
8120
8257
  const defaultDecimalPlacesForCoinNotSupportedOOB = 8;
8121
8258
  const defaultMinConfirmationsForCoinNotSupportedOOB = 1;
@@ -8131,11 +8268,12 @@ class SwapspaceSwapProvider extends SwapProvider {
8131
8268
  network: item.network,
8132
8269
  hasExtraId: item.hasExtraId,
8133
8270
  extraIdName: item.extraIdName,
8134
- isPopular: !!item.popular,
8271
+ isPopular: item.popular ? 1 : 0,
8135
8272
  iconURL: item.icon ? `https://storage.swapspace.co${item.icon}` : FALLBACK_ASSET_ICON_URL,
8136
8273
  deposit: (_item$deposit = item.deposit) != null ? _item$deposit : false,
8137
8274
  withdrawal: (_item$withdrawal = item.withdrawal) != null ? _item$withdrawal : false,
8138
- validationRegexp: (_item$validationRegex = item.validationRegexp) != null ? _item$validationRegex : null
8275
+ validationRegexp: (_item$validationRegex = item.validationRegexp) != null ? _item$validationRegex : null,
8276
+ isAvailable: true
8139
8277
  };
8140
8278
  }
8141
8279
  return [];
@@ -8160,74 +8298,11 @@ class SwapspaceSwapProvider extends SwapProvider {
8160
8298
  Logger.logError(e, loggerSource, "Failed to fetch partners list from swapspace");
8161
8299
  }
8162
8300
  }
8163
-
8164
- /**
8165
- * This method sort internal list putting popular (as swapspace thinks) coins to the top.
8166
- * This is just for users of this API if they don't care about the sorting - we just improve a list a bit this way.
8167
- * @private
8168
- */
8169
- _putPopularCoinsFirst() {
8170
- this._supportedCoins.sort((i1, i2) => {
8171
- if (i1.isPopular && !i2.isPopular) return -1;
8172
- if (i2.isPopular && !i1.isPopular) return 1;
8173
- return i1.coin.ticker > i2.coin.ticker ? 1 : i1.coin.ticker < i2.coin.ticker ? -1 : 0;
8174
- });
8175
- }
8176
- async getCoinToUSDTRate(coin) {
8177
- const loggerSource = "getCoinToUSDTRate";
8178
- try {
8179
- var _this$_supportedCoins8;
8180
- if (!coin) return null;
8181
- await this._fetchSupportedCurrenciesIfNeeded();
8182
-
8183
- // Using USDT TRC20 as usually fee in this network is smaller than ERC20 and this network is widely used for USDT
8184
- const usdtTrc20 = (_this$_supportedCoins8 = this._supportedCoins.find(i => i.coin.ticker === "USDTTRC20")) == null ? void 0 : _this$_supportedCoins8.coin;
8185
- if (!usdtTrc20) {
8186
- return {
8187
- result: false
8188
- };
8189
- }
8190
- const cached = this._cache.get("swapspace_usdt_rate_" + coin.ticker);
8191
- if (cached != null) {
8192
- return {
8193
- result: true,
8194
- rate: cached
8195
- };
8196
- }
8197
- Logger.log("Loading USDT->coin rate as not found in cache:", coin == null ? void 0 : coin.ticker);
8198
- const result = await this.getSwapInfo(usdtTrc20, coin, "5000", false);
8199
- if (!result.result) {
8200
- return {
8201
- result: false
8202
- };
8203
- }
8204
-
8205
- // This calculation is not precise as we cannot recognize the actual fee and network fee. Just approximate.
8206
- const standardSwapspaceFeeMultiplier = 1.004; // fee is usually 0.4%
8207
- const rate = BigNumber(1).div(BigNumber(result.rate).times(standardSwapspaceFeeMultiplier)).toString();
8208
- this._cache.put("swapspace_usdt_rate_" + coin.ticker, rate, 15 * 60000 // 15 minutes
8209
- );
8210
- return {
8211
- result: true,
8212
- rate: rate
8213
- };
8214
- } catch (e) {
8215
- improveAndRethrow(e, loggerSource);
8216
- }
8217
- }
8218
- getCoinByTickerIfPresent(ticker) {
8219
- try {
8220
- var _item$coin3;
8221
- const item = this._supportedCoins.find(i => i.coin.ticker === ticker);
8222
- return (_item$coin3 = item == null ? void 0 : item.coin) != null ? _item$coin3 : null;
8223
- } catch (e) {
8224
- improveAndRethrow(e, "getCoinByTickerIfPresent");
8225
- }
8226
- }
8227
- async getSwapInfo(fromCoin, toCoin, amountCoins, fixed = false, fromCoinToUsdRate = null) {
8301
+ async getSwapInfo(fromCoin, toCoin, amountCoins, fixed = false, fromCoinToUsdRate = null, amountIsToReceive = false) {
8228
8302
  const loggerSource = "getSwapInfo";
8229
8303
  try {
8230
8304
  var _response$data, _exchangesSupportingT;
8305
+ if (amountIsToReceive) throw new Error("Swapspace doesn't support exchanging to get the exact receiving amount");
8231
8306
  if (!(fromCoin instanceof Coin) || !(toCoin instanceof Coin) || typeof amountCoins !== "string" || BigNumber(amountCoins).lt("0") || fixed !== null && typeof fixed !== "boolean") {
8232
8307
  throw new Error(`Wrong input params: ${amountCoins} ${fromCoin.ticker} -> ${toCoin.ticker}, ${fromCoin instanceof Coin}, ${toCoin instanceof Coin}, ${typeof fixed} ${fixed}`);
8233
8308
  }
@@ -8351,8 +8426,8 @@ class SwapspaceSwapProvider extends SwapProvider {
8351
8426
  Logger.log(`Returning result ${safeStringify(result)}`, loggerSource);
8352
8427
  return result;
8353
8428
  } catch (e) {
8354
- var _e$response4;
8355
- if ((e == null || (_e$response4 = e.response) == null ? void 0 : _e$response4.status) === 429) {
8429
+ var _e$response;
8430
+ if ((e == null || (_e$response = e.response) == null ? void 0 : _e$response.status) === 429) {
8356
8431
  return {
8357
8432
  result: false,
8358
8433
  reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED
@@ -8362,10 +8437,11 @@ class SwapspaceSwapProvider extends SwapProvider {
8362
8437
  improveAndRethrow(e, loggerSource);
8363
8438
  }
8364
8439
  }
8365
- async createSwap(fromCoin, toCoin, amount, toAddress, refundAddress, rawSwapData, clientIpAddress, fixed, toCurrencyExtraId = "", refundExtraId = "") {
8440
+ async createSwap(fromCoin, toCoin, amount, toAddress, refundAddress, rawSwapData, clientIpAddress, fixed, toCurrencyExtraId = "", refundExtraId = "", amountIsToReceive = false) {
8366
8441
  const loggerSource = "createSwap";
8367
8442
  const partner = rawSwapData == null ? void 0 : rawSwapData.partner;
8368
8443
  try {
8444
+ if (amountIsToReceive) throw new Error("Swapspace doesn't support exchanging to get the exact receiving amount");
8369
8445
  if (!(fromCoin instanceof Coin) || !(toCoin instanceof Coin) || typeof amount !== "string" || typeof toAddress !== "string" || typeof refundAddress !== "string" || typeof clientIpAddress != "string" || typeof fixed != "boolean" || clientIpAddress.length === 0) {
8370
8446
  throw new Error(`Invalid input: ${fromCoin} ${toCoin} ${amount} ${toAddress} ${refundAddress} ${clientIpAddress == null ? void 0 : clientIpAddress.length} ${fixed}`);
8371
8447
  }
@@ -8425,15 +8501,15 @@ class SwapspaceSwapProvider extends SwapProvider {
8425
8501
  Logger.log(errorMessage, loggerSource);
8426
8502
  throw new Error(errorMessage);
8427
8503
  } catch (e) {
8428
- var _e$response5, _e$response6;
8504
+ var _e$response2, _e$response3;
8429
8505
  Logger.logError(e, loggerSource, `Failed to create swap. Error is: ${safeStringify(e)}`);
8430
8506
  const composeFailResult = reason => ({
8431
8507
  result: false,
8432
8508
  reason: reason,
8433
8509
  partner: partner
8434
8510
  });
8435
- const status = e == null || (_e$response5 = e.response) == null ? void 0 : _e$response5.status;
8436
- const data = e == null || (_e$response6 = e.response) == null ? void 0 : _e$response6.data;
8511
+ const status = e == null || (_e$response2 = e.response) == null ? void 0 : _e$response2.status;
8512
+ const data = e == null || (_e$response3 = e.response) == null ? void 0 : _e$response3.data;
8437
8513
  if (status === 429) {
8438
8514
  Logger.log(`Returning fail - RPS limit exceeded ${data}`, loggerSource);
8439
8515
  return composeFailResult(SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED);
@@ -8495,9 +8571,9 @@ class SwapspaceSwapProvider extends SwapProvider {
8495
8571
  const wo404 = responses.flat();
8496
8572
  Logger.log("All swaps RAW: " + JSON.stringify(wo404.map(r => r.data)), loggerSource);
8497
8573
  const swaps = wo404.map(r => r.data).map((swap, index) => {
8498
- var _this$_supportedCoins9, _this$_supportedCoins10, _swap$from$extraId, _swap$to$extraId, _swap$refundExtraId;
8499
- const fromCoin = (_this$_supportedCoins9 = this._supportedCoins.find(i => i.code === swap.from.code && i.network === swap.from.network)) == null ? void 0 : _this$_supportedCoins9.coin;
8500
- const toCoin = (_this$_supportedCoins10 = this._supportedCoins.find(i => i.code === swap.to.code && i.network === swap.to.network)) == null ? void 0 : _this$_supportedCoins10.coin;
8574
+ var _this$_supportedCoins2, _this$_supportedCoins3, _swap$from$extraId, _swap$to$extraId, _swap$refundExtraId;
8575
+ const fromCoin = (_this$_supportedCoins2 = this._supportedCoins.find(i => i.code === swap.from.code && i.network === swap.from.network)) == null ? void 0 : _this$_supportedCoins2.coin;
8576
+ const toCoin = (_this$_supportedCoins3 = this._supportedCoins.find(i => i.code === swap.to.code && i.network === swap.to.network)) == null ? void 0 : _this$_supportedCoins3.coin;
8501
8577
  if (!fromCoin || !toCoin) {
8502
8578
  return []; // We skip swaps with not supported coins for now
8503
8579
  }
@@ -8515,14 +8591,14 @@ class SwapspaceSwapProvider extends SwapProvider {
8515
8591
  swaps: swaps
8516
8592
  };
8517
8593
  } catch (e) {
8518
- var _e$response7, _e$response8;
8594
+ var _e$response4, _e$response5;
8519
8595
  Logger.logError(e, loggerSource, `Failed to get swap details. Error is: ${safeStringify(e)}`);
8520
8596
  const composeFailResult = reason => ({
8521
8597
  result: false,
8522
8598
  reason: reason
8523
8599
  });
8524
- const status = e == null || (_e$response7 = e.response) == null ? void 0 : _e$response7.status;
8525
- const data = e == null || (_e$response8 = e.response) == null ? void 0 : _e$response8.data;
8600
+ const status = e == null || (_e$response4 = e.response) == null ? void 0 : _e$response4.status;
8601
+ const data = e == null || (_e$response5 = e.response) == null ? void 0 : _e$response5.data;
8526
8602
  if (status === 429) {
8527
8603
  Logger.log(`Returning fail - RPS limit exceeded ${data}`, loggerSource);
8528
8604
  return composeFailResult(SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED);
@@ -8530,41 +8606,6 @@ class SwapspaceSwapProvider extends SwapProvider {
8530
8606
  improveAndRethrow(e, loggerSource);
8531
8607
  }
8532
8608
  }
8533
- isAddressValidForAsset(asset, address) {
8534
- try {
8535
- const assetData = this._supportedCoins.find(i => {
8536
- var _i$coin3;
8537
- return ((_i$coin3 = i.coin) == null ? void 0 : _i$coin3.ticker) === (asset == null ? void 0 : asset.ticker);
8538
- });
8539
- if (assetData) {
8540
- let corrected = assetData.validationRegexp.trim();
8541
- corrected = corrected[0] === "/" ? corrected.slice(1) : corrected;
8542
- corrected = corrected[corrected.length - 1] === "/" ? corrected.slice(0, corrected.length - 1) : corrected;
8543
- return address.match(corrected) != null;
8544
- }
8545
- } catch (e) {
8546
- Logger.logError(e, "isAddressValidForAsset");
8547
- }
8548
- return false;
8549
- }
8550
- getExtraIdNameIfPresent(asset) {
8551
- try {
8552
- const assetData = this._supportedCoins.find(i => {
8553
- var _i$coin4;
8554
- return ((_i$coin4 = i.coin) == null ? void 0 : _i$coin4.ticker) === (asset == null ? void 0 : asset.ticker);
8555
- });
8556
- if (assetData != null && assetData.hasExtraId) {
8557
- if ((assetData == null ? void 0 : assetData.extraIdName) == null || (assetData == null ? void 0 : assetData.extraIdName) === "") {
8558
- // We return some default name if the extraIdName is empty
8559
- return "ID";
8560
- }
8561
- return assetData == null ? void 0 : assetData.extraIdName;
8562
- }
8563
- return null;
8564
- } catch (e) {
8565
- improveAndRethrow(e, "getExtraIdNameIfPresent");
8566
- }
8567
- }
8568
8609
  }
8569
8610
 
8570
8611
  class SwapUtils {
@@ -8656,8 +8697,8 @@ class SwapUtils {
8656
8697
  /**
8657
8698
  * If some swap is not found by id then there is no item in return list.
8658
8699
  *
8659
- * @param swapProvider {SwapProvider}
8660
- * @param swapIds {string[]}
8700
+ * @param swapProviders {SwapProvider[]} - Array of swap providers
8701
+ * @param swapIds {string[]} - Array of swap IDs
8661
8702
  * @return {Promise<{
8662
8703
  * result: true,
8663
8704
  * swaps: ExistingSwapWithFiatData[]
@@ -8666,80 +8707,467 @@ class SwapUtils {
8666
8707
  * reason: string
8667
8708
  * }>}
8668
8709
  */
8669
- static async getExistingSwapsDetailsWithFiatAmounts(swapProvider, swapIds) {
8710
+ static async getExistingSwapsDetailsWithFiatAmounts(swapProviders, swapIds) {
8670
8711
  try {
8671
- const result = await swapProvider.getExistingSwapsDetailsAndStatus(swapIds);
8672
- if (result.result) {
8673
- const extendedSwaps = [];
8674
- for (let swap of result.swaps) {
8675
- if (swap.status === SwapProvider.SWAP_STATUSES.REFUNDED) {
8676
- const rate = await swapProvider.getCoinToUSDTRate(swap.fromCoin);
8677
- extendedSwaps.push(ExistingSwapWithFiatData.fromExistingSwap(swap, (rate == null ? void 0 : rate.rate) != null ? BigNumber(swap.fromAmount).times(rate.rate).toNumber() : null, (rate == null ? void 0 : rate.rate) != null ? BigNumber(swap.toAmount).times(rate.rate).toNumber() : null, "USD", FiatCurrenciesService.getCurrencyDecimalCountByCode("USD")));
8678
- } else {
8679
- const [fromCoinFiatRate, toConFiatRate] = await Promise.all([swapProvider.getCoinToUSDTRate(swap.fromCoin), swapProvider.getCoinToUSDTRate(swap.toCoin)]);
8680
- extendedSwaps.push(ExistingSwapWithFiatData.fromExistingSwap(swap, (fromCoinFiatRate == null ? void 0 : fromCoinFiatRate.rate) != null ? BigNumber(swap.fromAmount).times(fromCoinFiatRate.rate).toNumber() : null, (toConFiatRate == null ? void 0 : toConFiatRate.rate) != null ? BigNumber(swap.toAmount).times(toConFiatRate.rate).toNumber() : null, "USD", FiatCurrenciesService.getCurrencyDecimalCountByCode("USD")));
8712
+ let allSwaps = [];
8713
+ let remainingSwapIds = new Set(swapIds);
8714
+ const failResults = [];
8715
+ for (let provider of swapProviders) {
8716
+ const result = await provider.getExistingSwapsDetailsAndStatus([...remainingSwapIds]);
8717
+ if (result.result) {
8718
+ const extendedSwaps = [];
8719
+ for (let swap of result.swaps) {
8720
+ if (swap.status === SwapProvider.SWAP_STATUSES.REFUNDED) {
8721
+ const rate = await provider.getCoinToUSDTRate(swap.fromCoin);
8722
+ extendedSwaps.push(ExistingSwapWithFiatData.fromExistingSwap(swap, (rate == null ? void 0 : rate.rate) != null ? BigNumber(swap.fromAmount).times(rate.rate).toNumber() : null, (rate == null ? void 0 : rate.rate) != null ? BigNumber(swap.toAmount).times(rate.rate).toNumber() : null, "USD", FiatCurrenciesService.getCurrencyDecimalCountByCode("USD")));
8723
+ } else {
8724
+ const [fromCoinFiatRate, toCoinFiatRate] = await Promise.all([provider.getCoinToUSDTRate(swap.fromCoin), provider.getCoinToUSDTRate(swap.toCoin)]);
8725
+ extendedSwaps.push(ExistingSwapWithFiatData.fromExistingSwap(swap, (fromCoinFiatRate == null ? void 0 : fromCoinFiatRate.rate) != null ? BigNumber(swap.fromAmount).times(fromCoinFiatRate.rate).toNumber() : null, (toCoinFiatRate == null ? void 0 : toCoinFiatRate.rate) != null ? BigNumber(swap.toAmount).times(toCoinFiatRate.rate).toNumber() : null, "USD", FiatCurrenciesService.getCurrencyDecimalCountByCode("USD")));
8726
+ }
8727
+ remainingSwapIds.delete(swap.id);
8681
8728
  }
8729
+ allSwaps = allSwaps.concat(extendedSwaps);
8730
+
8731
+ // Stop if we have retrieved all swaps
8732
+ if (allSwaps.length >= swapIds.length) {
8733
+ break;
8734
+ }
8735
+ } else {
8736
+ failResults.push(result);
8682
8737
  }
8683
- result.swaps = extendedSwaps;
8684
8738
  }
8685
- return result;
8739
+ if (swapIds.length > 0 && allSwaps.length === 0 && failResults.length > 0) {
8740
+ const failReasons = failResults.map(r => r.reason);
8741
+ return {
8742
+ result: false,
8743
+ reason: failReasons.find(r => r !== SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED) ? failReasons.join("\n") : SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED
8744
+ };
8745
+ }
8746
+ return {
8747
+ result: true,
8748
+ swaps: allSwaps
8749
+ };
8686
8750
  } catch (e) {
8687
8751
  improveAndRethrow(e, "getExistingSwapsDetailsWithFiatAmounts");
8688
8752
  }
8689
8753
  }
8690
8754
  }
8691
8755
 
8756
+ class LetsExchangeSwapProvider extends SwapProvider {
8757
+ constructor(apiKeysProxyUrl, cache, customCoinBuilder = (coin, network) => null, useRestrictedCoinsSet = true) {
8758
+ super(cache, customCoinBuilder, useRestrictedCoinsSet);
8759
+ this._partners = [];
8760
+ this._URL = `${apiKeysProxyUrl}/letsexchange`;
8761
+ this.isAggregator = false;
8762
+ this.COINS_EXPIRATION_TIME_MS = 5 * 60 * 1000;
8763
+ this.coinsLastUpdateTimestamp = null;
8764
+ }
8765
+ getSwapCreationInfoTtlMs() {
8766
+ return 110000;
8767
+ }
8768
+ async _fetchSupportedCurrenciesIfNeeded() {
8769
+ const loggerSource = "_fetchSupportedCurrenciesIfNeeded";
8770
+ try {
8771
+ var _this$_supportedCoins;
8772
+ if (!((_this$_supportedCoins = this._supportedCoins) != null && _this$_supportedCoins.length) || !this.coinsLastUpdateTimestamp || this.coinsLastUpdateTimestamp + this.COINS_EXPIRATION_TIME_MS < Date.now()) {
8773
+ var _rawResponse$data, _rawResponse$data2;
8774
+ const rawResponse = await axios.get(`${this._URL}/v2/coins`);
8775
+ Logger.log(`Retrieved ${rawResponse == null || (_rawResponse$data = rawResponse.data) == null ? void 0 : _rawResponse$data.length}`, loggerSource);
8776
+ let allowedCoins = (_rawResponse$data2 = rawResponse == null ? void 0 : rawResponse.data) != null ? _rawResponse$data2 : [];
8777
+ Logger.log(`Allowed cnt ${allowedCoins.length}`, loggerSource);
8778
+ this._supportedCoins = allowedCoins.map(item => {
8779
+ const code = item.code.toUpperCase();
8780
+ if (!Array.isArray(item.networks)) return [];
8781
+ return item.networks.map(networkDetails => {
8782
+ const network = networkDetails.code.toUpperCase();
8783
+ let coin = this._customCoinBuilder(code, network);
8784
+ if (!coin && !this.useRestrictedCoinsSet) {
8785
+ let name = this.removeProtocolNameFromCoinName(item.name, code, network);
8786
+ const ticker = `${code}${code === network ? "" : network}`;
8787
+ const defaultDecimalPlacesForCoinNotSupportedOOB = DEFAULT_CRYPTO_DECIMAL_COUNT;
8788
+ const defaultMinConfirmationsForCoinNotSupportedOOB = 1;
8789
+ coin = new Coin(name, ticker, code, defaultDecimalPlacesForCoinNotSupportedOOB, null, "", null, null, defaultMinConfirmationsForCoinNotSupportedOOB, null, [], 60000, null, code !== network ? new Protocol(network) : null, item.contract_address || null, false);
8790
+ }
8791
+ if (coin) {
8792
+ var _networkDetails$extra, _networkDetails$valid;
8793
+ return {
8794
+ coin: coin,
8795
+ code: item.code,
8796
+ network: networkDetails.code,
8797
+ hasExtraId: !!networkDetails.has_extra,
8798
+ extraIdName: (_networkDetails$extra = networkDetails.extra_name) != null ? _networkDetails$extra : null,
8799
+ isPopular: item.rating || 0,
8800
+ iconURL: item.icon ? item.icon : FALLBACK_ASSET_ICON_URL,
8801
+ deposit: true,
8802
+ // Letsexchange provide no such details
8803
+ withdrawal: true,
8804
+ // Letsexchange provide no such details
8805
+ validationRegexp: (_networkDetails$valid = networkDetails.validation_address_regex) != null ? _networkDetails$valid : null,
8806
+ isAvailable: (typeof item.is_active !== "number" || item.is_active === 1) && (typeof item.disabled !== "number" || item.disabled === 0) && (typeof networkDetails.is_active !== "number" || networkDetails.is_active === 1)
8807
+ };
8808
+ }
8809
+ return [];
8810
+ });
8811
+ }).flat();
8812
+ this.coinsLastUpdateTimestamp = Date.now();
8813
+ this._putPopularCoinsFirst();
8814
+ }
8815
+ } catch (e) {
8816
+ improveAndRethrow(e, loggerSource);
8817
+ }
8818
+ }
8819
+ async getSwapInfo(fromCoin, toCoin, amountCoins, fixed = false, fromCoinToUsdRate = null, amountIsToReceive = false) {
8820
+ const loggerSource = "getSwapInfo";
8821
+ try {
8822
+ if (!(fromCoin instanceof Coin) || !(toCoin instanceof Coin) || typeof amountCoins !== "string" || BigNumber(amountCoins).lt("0") || fixed !== null && typeof fixed !== "boolean" || amountIsToReceive && !fixed) {
8823
+ throw new Error(`Wrong input params: ${amountCoins} ${fromCoin.ticker} -> ${toCoin.ticker}, ${fromCoin instanceof Coin}, ${toCoin instanceof Coin}, ${typeof fixed} ${fixed}, ${amountIsToReceive}`);
8824
+ }
8825
+ const fromCoinDetails = this._supportedCoins.find(i => {
8826
+ var _i$coin;
8827
+ return ((_i$coin = i.coin) == null ? void 0 : _i$coin.ticker) === (fromCoin == null ? void 0 : fromCoin.ticker);
8828
+ });
8829
+ const toCoinDetails = this._supportedCoins.find(i => {
8830
+ var _i$coin2;
8831
+ return ((_i$coin2 = i.coin) == null ? void 0 : _i$coin2.ticker) === (toCoin == null ? void 0 : toCoin.ticker);
8832
+ });
8833
+ if (!fromCoinDetails || !toCoinDetails) {
8834
+ throw new Error("Failed to find coin details for: " + fromCoin.ticker + " -> " + toCoin.ticker);
8835
+ }
8836
+ if (!fromCoinDetails.deposit || !fromCoinDetails.isAvailable || !toCoinDetails.withdrawal || !toCoinDetails.isAvailable) {
8837
+ return {
8838
+ result: false,
8839
+ reason: SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED
8840
+ };
8841
+ }
8842
+ const pathAndQuery = `/v1/info${amountIsToReceive ? "-revert" : `?float=${!fixed}`}`;
8843
+ const response = await axios.post(`${this._URL}${pathAndQuery}`, {
8844
+ from: fromCoinDetails.code,
8845
+ to: toCoinDetails.code,
8846
+ network_from: fromCoinDetails.network,
8847
+ network_to: toCoinDetails.network,
8848
+ amount: amountCoins,
8849
+ affiliate_id: LetsExchangeSwapProvider.AFFILIATE_ID
8850
+ });
8851
+ Logger.log(`Retrieved ${response == null ? void 0 : response.data}`, loggerSource);
8852
+ const data = response.data;
8853
+
8854
+ // TODO: [dev] add SwapProvider.NO_SWAPS_REASONS.NO_FIXED_BUT_HAVE_FLOATING - request alternative rate. task_id=
8855
+
8856
+ // TODO: [feature, low] implement extra coins to fit min/max if there are frequent errors due to min/max exceeding
8857
+ // let extraCoinsToFitMinMax = "0";
8858
+ // if (typeof fromCoinToUsdRate === "string" && BigNumber(fromCoinToUsdRate).gt("0")) {
8859
+ // const extraUsdToFitMinMax = BigNumber("1"); // We correct the limits as the exact limit can fluctuate and cause failed swap creation
8860
+ // extraCoinsToFitMinMax = AmountUtils.trim(extraUsdToFitMinMax.div(fromCoinToUsdRate), fromCoin.digits);
8861
+ // }
8862
+ let min = null;
8863
+ if (data != null && data.min_amount) {
8864
+ min = AmountUtils.trim(data == null ? void 0 : data.min_amount, amountIsToReceive ? toCoin.digits : fromCoin.digits);
8865
+ }
8866
+ let max = null;
8867
+ if (data != null && data.max_amount) {
8868
+ max = AmountUtils.trim(data == null ? void 0 : data.max_amount, amountIsToReceive ? toCoin.digits : fromCoin.digits);
8869
+ }
8870
+ if (data.success === false && data.error) {
8871
+ // TODO: [dev] waiting for response from letsexchange about their not-documented responses
8872
+ // {
8873
+ // "success": false,
8874
+ // "error": "Internal error"
8875
+ // }
8876
+ throw new Error("Failed to estimate swap letsexchange");
8877
+ }
8878
+ if (BigNumber(data.rate).eq("0") || BigNumber(data.amount).eq("0")) {
8879
+ // TODO actualize according to letsexchage clarification - decide, can we count on min/max abcense? task_id=76512110797f4eab8b37f1bb789825cb
8880
+ // amount: "0", rate: "0", rate_id: ""
8881
+ let reason = SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED;
8882
+ if (min && BigNumber(amountCoins).lt(min)) {
8883
+ reason = SwapProvider.NO_SWAPS_REASONS.TOO_LOW;
8884
+ } else if (max && BigNumber(amountCoins).gt(max)) {
8885
+ reason = SwapProvider.NO_SWAPS_REASONS.TOO_HIGH;
8886
+ } else if (!amountIsToReceive) {
8887
+ // If we are not requesting receiving amount (it cannot be floating-rate)
8888
+ // todo [feature, moderate] request alternative rate. task_id=31884db5392f49738c20a86115c90e1f
8889
+ // const alternativeRate = 1;
8890
+ // const alternativeRateAvailable = alternativeRate;
8891
+ // if (alternativeRateAvailable) {
8892
+ // reason = fixed
8893
+ // ? SwapProvider.NO_SWAPS_REASONS.NO_FIXED_BUT_HAVE_FLOATING
8894
+ // : SwapProvider.NO_SWAPS_REASONS.NO_FLOATING_BUT_HAVE_FIXED;
8895
+ // }
8896
+ }
8897
+ return {
8898
+ result: false,
8899
+ reason: reason,
8900
+ smallestMin: min,
8901
+ greatestMax: max
8902
+ };
8903
+ }
8904
+ const rate = amountIsToReceive ? BigNumber(amountCoins).div(data.amount) : BigNumber(data.amount).div(amountCoins);
8905
+ return {
8906
+ result: true,
8907
+ min: min,
8908
+ max: max,
8909
+ smallestMin: min,
8910
+ greatestMax: max,
8911
+ rate: AmountUtils.trim(rate, this._maxRateDigits),
8912
+ durationMinutesRange: null,
8913
+ fixed: fixed,
8914
+ rawSwapData: data,
8915
+ isRefundAddressRequired: false
8916
+ };
8917
+ } catch (e) {
8918
+ var _e$response;
8919
+ if ((e == null || (_e$response = e.response) == null ? void 0 : _e$response.status) === 429) {
8920
+ return {
8921
+ result: false,
8922
+ reason: SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED
8923
+ };
8924
+ }
8925
+ Logger.log(`Internal error when getting swap options ${safeStringify(e)}`, loggerSource);
8926
+ improveAndRethrow(e, loggerSource);
8927
+ }
8928
+ }
8929
+ async createSwap(fromCoin, toCoin, amount, toAddress, refundAddress, rawSwapData, clientIpAddress, fixed, toCurrencyExtraId = "", refundExtraId = "", amountIsToReceive = false) {
8930
+ const loggerSource = "createSwap";
8931
+ try {
8932
+ if (!(fromCoin instanceof Coin) || !(toCoin instanceof Coin) || typeof amount !== "string" || typeof toAddress !== "string" || typeof refundAddress !== "string" || typeof clientIpAddress != "string" || typeof fixed != "boolean") {
8933
+ throw new Error(`Invalid input: ${fromCoin} ${toCoin} ${amount} ${toAddress} ${refundAddress} ${fixed}`);
8934
+ }
8935
+ if (typeof rawSwapData !== "object" || fixed && !rawSwapData.rate_id) {
8936
+ throw new Error(`Invalid raw swap data: ${safeStringify(rawSwapData)}`);
8937
+ }
8938
+ const fromCoinDetails = this._supportedCoins.find(i => {
8939
+ var _i$coin3;
8940
+ return ((_i$coin3 = i.coin) == null ? void 0 : _i$coin3.ticker) === (fromCoin == null ? void 0 : fromCoin.ticker);
8941
+ });
8942
+ const toCoinDetails = this._supportedCoins.find(i => {
8943
+ var _i$coin4;
8944
+ return ((_i$coin4 = i.coin) == null ? void 0 : _i$coin4.ticker) === (toCoin == null ? void 0 : toCoin.ticker);
8945
+ });
8946
+ if (!fromCoinDetails || !toCoinDetails) {
8947
+ throw new Error("Failed to find coin details for: " + fromCoin.ticker + " -> " + toCoin.ticker);
8948
+ }
8949
+ const requestBody = {
8950
+ coin_from: fromCoinDetails.code,
8951
+ network_from: fromCoinDetails.network,
8952
+ coin_to: toCoinDetails.code,
8953
+ network_to: toCoinDetails.network,
8954
+ withdrawal: toAddress,
8955
+ withdrawal_extra_id: toCurrencyExtraId,
8956
+ return: refundAddress,
8957
+ return_extra_id: refundExtraId,
8958
+ affiliate_id: LetsExchangeSwapProvider.AFFILIATE_ID
8959
+ };
8960
+ if (amountIsToReceive) {
8961
+ requestBody.withdrawal_amount = amount;
8962
+ } else {
8963
+ requestBody.deposit_amount = amount;
8964
+ }
8965
+ if (fixed) {
8966
+ requestBody.rate_id = rawSwapData.rate_id;
8967
+ }
8968
+ const response = await axios.post(`${this._URL}/v1/transaction${amountIsToReceive ? "-revert" : `?float=${!fixed}`}`, requestBody);
8969
+ const result = response.data;
8970
+ Logger.log(`Creation result ${safeStringify(result)}`, loggerSource);
8971
+ if (result != null && result.transaction_id) {
8972
+ var _result$rate, _result$deposit_extra;
8973
+ const rate = BigNumber((_result$rate = result.rate) != null ? _result$rate : 0).isZero() ? BigNumber(result.withdrawal_amount).div(result.deposit_amount) : BigNumber(result.rate);
8974
+ return {
8975
+ result: true,
8976
+ swapId: result.transaction_id,
8977
+ fromCoin: fromCoin,
8978
+ fromAmount: AmountUtils.trim(result.deposit_amount, fromCoin.digits),
8979
+ fromAddress: result.deposit,
8980
+ toCoin: toCoin,
8981
+ toAmount: AmountUtils.trim(result.withdrawal_amount, toCoin.digits),
8982
+ toAddress: result.withdrawal,
8983
+ fromCurrencyExtraId: (_result$deposit_extra = result.deposit_extra_id) != null ? _result$deposit_extra : "",
8984
+ rate: AmountUtils.trim(rate, this._maxRateDigits),
8985
+ fixed: !result.is_float
8986
+ };
8987
+ }
8988
+ const errorMessage = `Swap creation succeeded but the response is wrong: ${safeStringify(response)}`;
8989
+ Logger.log(errorMessage, loggerSource);
8990
+ throw new Error(errorMessage);
8991
+ } catch (e) {
8992
+ var _e$response2, _e$response3;
8993
+ Logger.logError(e, loggerSource, `Failed to create swap. Error is: ${safeStringify(e)}`);
8994
+ const composeFailResult = reason => ({
8995
+ result: false,
8996
+ reason: reason
8997
+ });
8998
+ const status = e == null || (_e$response2 = e.response) == null ? void 0 : _e$response2.status;
8999
+ const data = e == null || (_e$response3 = e.response) == null ? void 0 : _e$response3.data;
9000
+ if (status === 429) {
9001
+ Logger.log(`Returning fail - RPS limit exceeded ${data}`, loggerSource);
9002
+ return composeFailResult(SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED);
9003
+ }
9004
+ // TODO: [feature, low] add custom errors handling - waiting for response from letsexchange. task_id=00d2e435f6df4fb99af912135bd9ee27
9005
+ // 422 - missing params
9006
+ Logger.log(`Internal error for swap: ${safeStringify(e)}`, loggerSource);
9007
+ improveAndRethrow(e, loggerSource);
9008
+ }
9009
+ }
9010
+ async getExistingSwapsDetailsAndStatus(swapIds) {
9011
+ const loggerSource = "getExistingSwapsDetailsAndStatus";
9012
+ try {
9013
+ if (swapIds.find(id => typeof id !== "string")) {
9014
+ throw new Error("Swap id is not string: " + safeStringify(swapIds));
9015
+ }
9016
+ const response = await axios.get(`${this._URL}/v1/transactions-list?ids[]=${swapIds.join("&ids[]=")}`);
9017
+ Logger.log("All swaps RAW: " + safeStringify(response.data), loggerSource);
9018
+ const swaps = response.data.map((swap, index) => {
9019
+ var _this$_supportedCoins2, _this$_supportedCoins3, _swap$deposit_extra_i, _swap$withdrawal_extr, _swap$return_extra_id;
9020
+ const fromCoin = (_this$_supportedCoins2 = this._supportedCoins.find(i => i.code === swap.coin_from && i.network === swap.coin_from_network)) == null ? void 0 : _this$_supportedCoins2.coin;
9021
+ const toCoin = (_this$_supportedCoins3 = this._supportedCoins.find(i => i.code === swap.coin_to && i.network === swap.coin_to_network)) == null ? void 0 : _this$_supportedCoins3.coin;
9022
+ if (!fromCoin || !toCoin) {
9023
+ return []; // We skip swaps with not supported coins for now
9024
+ }
9025
+ const toUtcTimestamp = timeStr => Date.parse(timeStr.match(/.+[Zz]$/) ? timeStr : `${timeStr}Z`);
9026
+ const expiresAt = swap.expired_at ? swap.expired_at * 1000 : null;
9027
+ const createdAt = swap.created_at ? toUtcTimestamp(`${swap.created_at}`) : null;
9028
+ const isExpiredByTime = expiresAt && expiresAt < Date.now();
9029
+ const status = this._mapLetsExchangeStatusToRabbitStatus(swap.status, isExpiredByTime);
9030
+ const toDigits = status === SwapProvider.SWAP_STATUSES.REFUNDED ? fromCoin.digits : toCoin.digits;
9031
+ return new ExistingSwap(swapIds[index], status, createdAt, expiresAt, swap.confirmations, AmountUtils.trim(swap.rate, this._maxRateDigits), swap.is_float != null ? !swap.is_float : false, swap.return, swap.deposit, fromCoin, AmountUtils.trim(swap.deposit_amount, fromCoin.digits), swap.hash_in, swap.hash_in ? `${swap.coin_from_explorer_url}${swap.hash_in}` : null, toCoin, AmountUtils.trim(swap.withdrawal_amount, toDigits), swap.hash_out, swap.hash_out ? `${swap.coin_to_explorer_url}${swap.hash_out}` : null, swap.withdrawal, "letsexchange", (_swap$deposit_extra_i = swap.deposit_extra_id) != null ? _swap$deposit_extra_i : null, (_swap$withdrawal_extr = swap.withdrawal_extra_id) != null ? _swap$withdrawal_extr : null, (_swap$return_extra_id = swap.return_extra_id) != null ? _swap$return_extra_id : null);
9032
+ }).flat();
9033
+ Logger.log(`Swap details result ${safeStringify(swaps)}`, loggerSource);
9034
+ return {
9035
+ result: true,
9036
+ swaps: swaps
9037
+ };
9038
+ } catch (e) {
9039
+ var _e$response4, _e$response5;
9040
+ Logger.logError(e, loggerSource, `Failed to get swap details. Error is: ${safeStringify(e)}`);
9041
+ const composeFailResult = reason => ({
9042
+ result: false,
9043
+ reason: reason
9044
+ });
9045
+ const status = e == null || (_e$response4 = e.response) == null ? void 0 : _e$response4.status;
9046
+ const data = e == null || (_e$response5 = e.response) == null ? void 0 : _e$response5.data;
9047
+ if (status === 429) {
9048
+ Logger.log(`Returning fail - RPS limit exceeded ${data}`, loggerSource);
9049
+ return composeFailResult(SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED);
9050
+ }
9051
+ improveAndRethrow(e, loggerSource);
9052
+ }
9053
+ }
9054
+
9055
+ // TODO: [dev] Serg, please check this during the review to make sure I did no mistakes in statuses mapping.
9056
+ // I will remove these comments after the review. https://api.letsexchange.io/doc
9057
+ // wait The exchange has just been created and it’s waiting for coins to reach the deposit wallet
9058
+ // confirmation The transaction appears in mempool and now it is waiting for necessary network confirmations to start.
9059
+ // confirmed The user’s payment is confirmed, the exchange process is about to start.
9060
+ // exchanging The exchange process is running.
9061
+ // sending Funds are being sent to the recipient`s address.
9062
+ // sending_confirmation The outgoing transaction is waiting for network confirmations.
9063
+ // success The exchange is completed and the funds are successfully sent to the recipient’s address.
9064
+ // aml_check_failed The deposit was marked as risky by AML check service.
9065
+ // overdue The deposit receiving time for this transaction has expired.
9066
+ // error The transaction has failed. In most cases, the amount that was sent differs from the amount that was specified when creating the transaction.
9067
+ // refund The exchange failed and the coins were refunded to the user's wallet.
9068
+ _mapLetsExchangeStatusToRabbitStatus(status, isExpiredByTime) {
9069
+ switch (status) {
9070
+ case "wait":
9071
+ if (isExpiredByTime) {
9072
+ return SwapProvider.SWAP_STATUSES.EXPIRED;
9073
+ }
9074
+ return SwapProvider.SWAP_STATUSES.WAITING_FOR_PAYMENT;
9075
+ case "confirmation":
9076
+ return SwapProvider.SWAP_STATUSES.CONFIRMING;
9077
+ case "confirmed":
9078
+ return SwapProvider.SWAP_STATUSES.PAYMENT_RECEIVED;
9079
+ case "exchanging":
9080
+ return SwapProvider.SWAP_STATUSES.EXCHANGING;
9081
+ case "sending":
9082
+ return SwapProvider.SWAP_STATUSES.PAYMENT_RECEIVED;
9083
+ case "sending_confirmation":
9084
+ return SwapProvider.SWAP_STATUSES.EXCHANGING;
9085
+ case "success":
9086
+ return SwapProvider.SWAP_STATUSES.COMPLETED;
9087
+ case "refund":
9088
+ return SwapProvider.SWAP_STATUSES.REFUNDED;
9089
+ case "overdue":
9090
+ return SwapProvider.SWAP_STATUSES.EXPIRED;
9091
+ case "aml_check_failed":
9092
+ return SwapProvider.SWAP_STATUSES.EXCHANGING;
9093
+ case "error":
9094
+ return SwapProvider.SWAP_STATUSES.FAILED;
9095
+ default:
9096
+ throw new Error(`Unknown LetsExchange status: ${status}`);
9097
+ }
9098
+ }
9099
+ }
9100
+ LetsExchangeSwapProvider.AFFILIATE_ID = "0zbj9hf7xg7jgdgv";
9101
+
8692
9102
  class PublicSwapService {
8693
9103
  constructor(apiKeysProxyUrl, cache) {
8694
9104
  this._swapProvider = new SwapspaceSwapProvider(apiKeysProxyUrl, cache, () => null, false);
9105
+ this._fixedSwapProvider = new LetsExchangeSwapProvider(apiKeysProxyUrl, cache, () => null, false);
8695
9106
  }
8696
9107
  async initialize() {
8697
9108
  try {
8698
- await this._swapProvider.initialize();
9109
+ await Promise.all([this._swapProvider.initialize(), this._fixedSwapProvider.initialize()]);
8699
9110
  } catch (e) {
8700
9111
  Logger.logError(e, "PublicSwapService.initialize");
8701
9112
  }
8702
9113
  }
9114
+
9115
+ /**
9116
+ * Gets all currencies across all partners. Useful for sitemap or supported currencies count/list.
9117
+ *
9118
+ * @return {Promise<{result: boolean, coins: Coin[]}|{result: boolean, reason: string}>}
9119
+ */
8703
9120
  async getAllSupportedCurrenciesListForPublicSwap() {
8704
9121
  const loggerSource = "getAllSupportedCurrenciesListForPublicSwap";
8705
9122
  try {
8706
- var _result$coins;
8707
- const result = await this._swapProvider.getAllSupportedCurrencies();
8708
- if (result.reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED) {
9123
+ var _result$0$coins, _result$1$coins, _result$coins;
9124
+ await this.initialize();
9125
+ const result = await Promise.all([this._fixedSwapProvider.getAllSupportedCurrencies(), this._swapProvider.getAllSupportedCurrencies()]);
9126
+ const allCoins = [...((_result$0$coins = result[0].coins) != null ? _result$0$coins : [])];
9127
+ ((_result$1$coins = result[1].coins) != null ? _result$1$coins : []).forEach(c => {
9128
+ if (!allCoins.find(existingCoin => existingCoin.ticker === c.ticker)) {
9129
+ allCoins.push(c);
9130
+ }
9131
+ });
9132
+ if (result[0].reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED || result[1].reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED) {
8709
9133
  SwapUtils.safeHandleRequestsLimitExceeding();
8710
- return {
8711
- result: false,
8712
- reason: PublicSwapService.PUBLIC_SWAPS_COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED
8713
- };
9134
+ // TODO: [dev] improve this during the whitebit integration. task_id=20e7e41211b540d081bf98f392a34b2c
9135
+ // return {
9136
+ // result: false,
9137
+ // reason: PublicSwapService.PUBLIC_SWAPS_COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED,
9138
+ // };
9139
+ } else if (result[0].reason || result[1].reason) {
9140
+ console.log("Failed to get all supported coins", result[0].reason, result[1].reason);
8714
9141
  }
8715
9142
  Logger.log(`Retrieved ${result == null || (_result$coins = result.coins) == null ? void 0 : _result$coins.length} supported currencies for swap`, loggerSource);
8716
9143
  return {
8717
9144
  result: true,
8718
- coins: result.coins
9145
+ coins: allCoins
8719
9146
  };
8720
9147
  } catch (e) {
8721
- improveAndRethrow(e, "getDepositCurrenciesListForPublicSwap");
9148
+ improveAndRethrow(e, "getAllSupportedCurrenciesListForPublicSwap");
8722
9149
  }
8723
9150
  }
8724
- async getDepositCurrenciesListForPublicSwap() {
9151
+ async getDepositCurrenciesListForPublicSwap(fixed = false) {
8725
9152
  try {
8726
- return await this._getCurrenciesListForPublicSwap(false);
9153
+ return await this._getCurrenciesListForPublicSwap(false, fixed);
8727
9154
  } catch (e) {
8728
9155
  improveAndRethrow(e, "getDepositCurrenciesListForPublicSwap");
8729
9156
  }
8730
9157
  }
8731
- async getWithdrawCurrenciesListForPublicSwap() {
9158
+ async getWithdrawCurrenciesListForPublicSwap(fixed = false) {
8732
9159
  try {
8733
- return await this._getCurrenciesListForPublicSwap(true);
9160
+ return await this._getCurrenciesListForPublicSwap(true, fixed);
8734
9161
  } catch (e) {
8735
9162
  improveAndRethrow(e, "getWithdrawCurrenciesListForPublicSwap");
8736
9163
  }
8737
9164
  }
8738
- async _getCurrenciesListForPublicSwap(withdraw = false) {
9165
+ async _getCurrenciesListForPublicSwap(withdraw = false, fixed = false) {
8739
9166
  const loggerSource = "getCurrenciesListForPublicSwap";
8740
9167
  try {
8741
9168
  var _result$coins2;
8742
- const result = withdraw ? await this._swapProvider.getWithdrawalCurrencies() : await this._swapProvider.getDepositCurrencies();
9169
+ const provider = fixed ? this._fixedSwapProvider : this._swapProvider;
9170
+ const result = withdraw ? await provider.getWithdrawalCurrencies() : await provider.getDepositCurrencies();
8743
9171
  if (result.reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED) {
8744
9172
  SwapUtils.safeHandleRequestsLimitExceeding();
8745
9173
  return {
@@ -8760,6 +9188,9 @@ class PublicSwapService {
8760
9188
  /**
8761
9189
  * Retrieves initial data for swapping two coins.
8762
9190
  *
9191
+ * Always FLOATING rate, FIXED is not supported - if you want to change it the default rate - all
9192
+ * the swaps code logic should be verified to align with this change.
9193
+ *
8763
9194
  * @param fromCoin {Coin}
8764
9195
  * @param toCoin {Coin}
8765
9196
  * @return {Promise<{
@@ -8806,6 +9237,8 @@ class PublicSwapService {
8806
9237
  * @param fromAmountCoins {string}
8807
9238
  * @param [fixed=false] {boolean|null} null means fixed or float doesn't matter
8808
9239
  * @param [withoutFiat=false] {boolean} pass true if you don't need the fiat equivalent - this will diminish requests count
9240
+ * @param [amountIsToReceive=false] {boolean} whether the given amount is receiving amount.
9241
+ * False means the amount is the sending amount.
8809
9242
  * @return {Promise<{
8810
9243
  * result: false,
8811
9244
  * reason: string,
@@ -8819,12 +9252,15 @@ class PublicSwapService {
8819
9252
  * swapCreationInfo: BaseSwapCreationInfo
8820
9253
  * }>}
8821
9254
  */
8822
- async getPublicSwapDetails(fromCoin, toCoin, fromAmountCoins, fixed = false, withoutFiat = false) {
9255
+ async getPublicSwapDetails(fromCoin, toCoin, fromAmountCoins, fixed = false, withoutFiat = false, amountIsToReceive = false) {
8823
9256
  const loggerSource = "getPublicSwapDetails";
8824
9257
  try {
8825
- var _await$this$_swapProv, _await$this$_swapProv2, _result$swapCreationI, _result$swapCreationI2;
8826
- const coinUsdtRate = withoutFiat ? null : (_await$this$_swapProv = (_await$this$_swapProv2 = await this._swapProvider.getCoinToUSDTRate(fromCoin)) == null ? void 0 : _await$this$_swapProv2.rate) != null ? _await$this$_swapProv : null;
8827
- const details = await this._swapProvider.getSwapInfo(fromCoin, toCoin, fromAmountCoins, fixed, coinUsdtRate);
9258
+ var _await$getCoinToUSDTR, _await$getCoinToUSDTR2, _result$swapCreationI, _result$swapCreationI2;
9259
+ if (amountIsToReceive && !fixed) {
9260
+ throw new Error("Estimating allowed only for fixed rate.");
9261
+ }
9262
+ const coinUsdtRate = withoutFiat ? null : (_await$getCoinToUSDTR = (_await$getCoinToUSDTR2 = await (fixed ? this._fixedSwapProvider : this._swapProvider).getCoinToUSDTRate(fromCoin)) == null ? void 0 : _await$getCoinToUSDTR2.rate) != null ? _await$getCoinToUSDTR : null;
9263
+ const details = await (fixed ? this._fixedSwapProvider : this._swapProvider).getSwapInfo(fromCoin, toCoin, fromAmountCoins, fixed, coinUsdtRate, amountIsToReceive);
8828
9264
 
8829
9265
  // eslint-disable-next-line no-console
8830
9266
  console.log("getSwapInfo result: ", details);
@@ -8893,13 +9329,15 @@ class PublicSwapService {
8893
9329
  *
8894
9330
  * @param fromCoin {Coin}
8895
9331
  * @param toCoin {Coin}
8896
- * @param fromAmount {string}
9332
+ * @param amount {string}
8897
9333
  * @param swapCreationInfo {BaseSwapCreationInfo}
8898
9334
  * @param toAddress {string}
8899
9335
  * @param refundAddress {string}
8900
9336
  * @param clientIp {string}
8901
9337
  * @param [toCurrencyExtraId] {string}
8902
9338
  * @param [refundExtraId] {string}
9339
+ * @param [amountIsToReceive=false] {boolean} whether the given amount is receiving amount.
9340
+ * False means the amount is the sending amount.
8903
9341
  * @return {Promise<{
8904
9342
  * result: true,
8905
9343
  * fiatCurrencyCode: string,
@@ -8921,18 +9359,18 @@ class PublicSwapService {
8921
9359
  * reason: string
8922
9360
  * }>}
8923
9361
  */
8924
- async createPublicSwap(fromCoin, toCoin, fromAmount, swapCreationInfo, toAddress, refundAddress, clientIp, toCurrencyExtraId, refundExtraId) {
9362
+ async createPublicSwap(fromCoin, toCoin, amount, swapCreationInfo, toAddress, refundAddress, clientIp, toCurrencyExtraId, refundExtraId, amountIsToReceive = false) {
8925
9363
  const loggerSource = "createPublicSwap";
8926
9364
  try {
8927
9365
  var _swapCreationInfo$fro, _swapCreationInfo$toC;
8928
- if (!(fromCoin instanceof Coin) || !(toCoin instanceof Coin) || typeof fromAmount !== "string" || typeof toAddress !== "string" || typeof refundAddress !== "string" || !(swapCreationInfo instanceof BaseSwapCreationInfo)) {
8929
- throw new Error(`Wrong input: ${fromCoin.ticker} ${toCoin.ticker} ${fromAmount} ${swapCreationInfo}`);
9366
+ if (!(fromCoin instanceof Coin) || !(toCoin instanceof Coin) || typeof amount !== "string" || typeof toAddress !== "string" || swapCreationInfo.isRefundAddressRequired && (typeof refundAddress !== "string" || refundAddress.length === 0) || !(swapCreationInfo instanceof BaseSwapCreationInfo)) {
9367
+ throw new Error(`Wrong input: ${fromCoin.ticker} ${toCoin.ticker} ${amount} ${swapCreationInfo}`);
8930
9368
  }
8931
- Logger.log(`Start: ${fromAmount} ${fromCoin.ticker} -> ${toCoin.ticker}. Details: ${safeStringify(_extends({}, swapCreationInfo, {
9369
+ Logger.log(`Start: ${amount} ${fromCoin.ticker} -> ${toCoin.ticker}. Details: ${safeStringify(_extends({}, swapCreationInfo, {
8932
9370
  fromCoin: swapCreationInfo == null || (_swapCreationInfo$fro = swapCreationInfo.fromCoin) == null ? void 0 : _swapCreationInfo$fro.ticker,
8933
9371
  toCoin: swapCreationInfo == null || (_swapCreationInfo$toC = swapCreationInfo.toCoin) == null ? void 0 : _swapCreationInfo$toC.ticker
8934
9372
  }))}`, loggerSource);
8935
- const result = await this._swapProvider.createSwap(fromCoin, toCoin, fromAmount, toAddress, refundAddress, swapCreationInfo.rawSwapData, clientIp, swapCreationInfo.fixed, toCurrencyExtraId, refundExtraId);
9373
+ const result = await (swapCreationInfo.fixed ? this._fixedSwapProvider : this._swapProvider).createSwap(fromCoin, toCoin, amount, toAddress, refundAddress, swapCreationInfo.rawSwapData, clientIp, swapCreationInfo.fixed, toCurrencyExtraId, refundExtraId, amountIsToReceive);
8936
9374
  Logger.log(`Created:${safeStringify(_extends({}, result, {
8937
9375
  fromCoin: fromCoin == null ? void 0 : fromCoin.ticker,
8938
9376
  toCoin: toCoin == null ? void 0 : toCoin.ticker
@@ -8958,9 +9396,9 @@ class PublicSwapService {
8958
9396
  let fromAmountFiat = null,
8959
9397
  toAmountFiat = null;
8960
9398
  try {
8961
- var _await$this$_swapProv3, _await$this$_swapProv4, _await$this$_swapProv5, _await$this$_swapProv6;
8962
- const fromCoinUsdtRate = (_await$this$_swapProv3 = (_await$this$_swapProv4 = await this._swapProvider.getCoinToUSDTRate(fromCoin)) == null ? void 0 : _await$this$_swapProv4.rate) != null ? _await$this$_swapProv3 : null;
8963
- const toCoinUsdtRate = (_await$this$_swapProv5 = (_await$this$_swapProv6 = await this._swapProvider.getCoinToUSDTRate(fromCoin)) == null ? void 0 : _await$this$_swapProv6.rate) != null ? _await$this$_swapProv5 : null;
9399
+ var _await$this$_swapProv, _await$this$_swapProv2, _await$this$_swapProv3, _await$this$_swapProv4;
9400
+ const fromCoinUsdtRate = (_await$this$_swapProv = (_await$this$_swapProv2 = await this._swapProvider.getCoinToUSDTRate(fromCoin)) == null ? void 0 : _await$this$_swapProv2.rate) != null ? _await$this$_swapProv : null;
9401
+ const toCoinUsdtRate = (_await$this$_swapProv3 = (_await$this$_swapProv4 = await this._swapProvider.getCoinToUSDTRate(fromCoin)) == null ? void 0 : _await$this$_swapProv4.rate) != null ? _await$this$_swapProv3 : null;
8964
9402
  if (fromCoinUsdtRate != null && result.fromAmount != null) {
8965
9403
  fromAmountFiat = BigNumber(result.fromAmount).times(fromCoinUsdtRate).toFixed(PublicSwapService._fiatDecimalsCount);
8966
9404
  }
@@ -8971,7 +9409,7 @@ class PublicSwapService {
8971
9409
  Logger.logError(e, loggerSource, "Failed to calculate fiat amounts for result");
8972
9410
  }
8973
9411
 
8974
- // TODO: feature, cirtical] add GA event. task_id=tbd
9412
+ // TODO: feature, cirtical] add GA event. task_id=091004f1b6b748b29ddece6a130df904
8975
9413
  EventBusInstance.dispatch(PublicSwapService.PUBLIC_SWAP_CREATED_EVENT, null, fromCoin.ticker, toCoin.ticker, fromAmountFiat);
8976
9414
  const toReturn = {
8977
9415
  result: true,
@@ -9021,7 +9459,7 @@ class PublicSwapService {
9021
9459
  async getPublicExistingSwapDetailsAndStatus(swapIds) {
9022
9460
  const loggerSource = "getPublicExistingSwapDetailsAndStatus";
9023
9461
  try {
9024
- const result = await SwapUtils.getExistingSwapsDetailsWithFiatAmounts(this._swapProvider, swapIds);
9462
+ const result = await SwapUtils.getExistingSwapsDetailsWithFiatAmounts([this._swapProvider, this._fixedSwapProvider], swapIds);
9025
9463
  if (!(result != null && result.result)) {
9026
9464
  if (result.reason === SwapProvider.COMMON_ERRORS.REQUESTS_LIMIT_EXCEEDED) {
9027
9465
  SwapUtils.safeHandleRequestsLimitExceeding();
@@ -9098,18 +9536,21 @@ class PublicSwapService {
9098
9536
 
9099
9537
  /**
9100
9538
  * @param coinOrTicker {Coin|string}
9539
+ * @param [isFixed=true] {boolean} rate type
9101
9540
  * @return {string} icon URL (ready to use)
9102
9541
  */
9103
- getAssetIconUrl(coinOrTicker) {
9104
- return this._swapProvider.getIconUrl(coinOrTicker);
9542
+ getAssetIconUrl(coinOrTicker, isFixed = false) {
9543
+ // TODO: [feature, high] improve this logic - currently hacked to show better icons from fixed provider. task_id=3b6b8c2a9df04a86aaff2e070424b64f
9544
+ return this._fixedSwapProvider.getIconUrl(coinOrTicker);
9105
9545
  }
9106
9546
 
9107
9547
  /**
9108
9548
  * @param ticker {string}
9549
+ * @param [fixed=false] {boolean}
9109
9550
  * @return {Coin|null}
9110
9551
  */
9111
- getCoinByTickerIfPresent(ticker) {
9112
- return this._swapProvider.getCoinByTickerIfPresent(ticker);
9552
+ getCoinByTickerIfPresent(ticker, fixed = false) {
9553
+ return !fixed ? this._swapProvider.getCoinByTickerIfPresent(ticker) : this._fixedSwapProvider.getCoinByTickerIfPresent(ticker);
9113
9554
  }
9114
9555
 
9115
9556
  /**
@@ -9119,9 +9560,12 @@ class PublicSwapService {
9119
9560
  */
9120
9561
  async getAssetToUsdtRate(asset) {
9121
9562
  try {
9122
- var _result$rate;
9123
- const result = await this._swapProvider.getCoinToUSDTRate(asset);
9124
- return (_result$rate = result == null ? void 0 : result.rate) != null ? _result$rate : null;
9563
+ var _result, _result$rate, _result2;
9564
+ let result = await this._swapProvider.getCoinToUSDTRate(asset);
9565
+ if (((_result = result) == null ? void 0 : _result.rate) == null) {
9566
+ result = await this._fixedSwapProvider.getCoinToUSDTRate(asset);
9567
+ }
9568
+ return (_result$rate = (_result2 = result) == null ? void 0 : _result2.rate) != null ? _result$rate : null;
9125
9569
  } catch (e) {
9126
9570
  improveAndRethrow(e, "getAssetToUsdtRate");
9127
9571
  }
@@ -9130,11 +9574,12 @@ class PublicSwapService {
9130
9574
  /**
9131
9575
  * @param asset {Coin}
9132
9576
  * @param address {string}
9577
+ * @param [fixed=false] {boolean}
9133
9578
  * @return {boolean}
9134
9579
  */
9135
- isAddressValidForAsset(asset, address) {
9580
+ isAddressValidForAsset(asset, address, fixed = false) {
9136
9581
  try {
9137
- return this._swapProvider.isAddressValidForAsset(asset, address);
9582
+ return !fixed ? this._swapProvider.isAddressValidForAsset(asset, address) : this._fixedSwapProvider.isAddressValidForAsset(asset, address);
9138
9583
  } catch (e) {
9139
9584
  improveAndRethrow(e, "isAddressValidForAsset");
9140
9585
  }
@@ -9144,13 +9589,14 @@ class PublicSwapService {
9144
9589
  * Retrieves token by contract address.
9145
9590
  *
9146
9591
  * @param addressString {string}
9592
+ * @param [fixed=false] {boolean}
9147
9593
  * @return {Promise<Coin|null>}
9148
9594
  */
9149
- async getTokenByContractAddress(addressString) {
9595
+ async getTokenByContractAddress(addressString, fixed = false) {
9150
9596
  try {
9151
9597
  if (!addressString) return null;
9152
9598
  const addressLowerCase = addressString.toLowerCase();
9153
- const allCoins = await this._swapProvider.getAllSupportedCurrencies();
9599
+ const allCoins = await (fixed ? this._fixedSwapProvider : this._swapProvider).getAllSupportedCurrencies();
9154
9600
  if (allCoins.result) {
9155
9601
  return allCoins.coins.find(coin => coin.tokenAddress && coin.tokenAddress.toLowerCase() === addressLowerCase);
9156
9602
  }
@@ -9162,11 +9608,12 @@ class PublicSwapService {
9162
9608
 
9163
9609
  /**
9164
9610
  * @param asset {Coin}
9611
+ * @param [fixed=false] {boolean}
9165
9612
  * @return {string|null}
9166
9613
  */
9167
- getExtraIdNameIfPresentForAsset(asset) {
9614
+ getExtraIdNameIfPresentForAsset(asset, fixed = false) {
9168
9615
  try {
9169
- return this._swapProvider.getExtraIdNameIfPresent(asset);
9616
+ return (fixed ? this._fixedSwapProvider : this._swapProvider).getExtraIdNameIfPresent(asset);
9170
9617
  } catch (e) {
9171
9618
  improveAndRethrow(e, "getExtraIdNameIfPresentForAsset");
9172
9619
  }