@rabbitio/ui-kit 1.0.0-beta.112 → 1.0.0-beta.113

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 (198) hide show
  1. package/coverage/clover.xml +1226 -1255
  2. package/coverage/coverage-final.json +13 -13
  3. package/coverage/index.html +18 -18
  4. package/coverage/ui-kit/index.html +1 -1
  5. package/coverage/ui-kit/index.js.html +1 -1
  6. package/coverage/ui-kit/src/common-apis/adapters/analyticsAdapters/googleAnalyticsAdapter.js.html +1 -1
  7. package/coverage/ui-kit/src/common-apis/adapters/analyticsAdapters/index.html +1 -1
  8. package/coverage/ui-kit/src/common-apis/adapters/analyticsAdapters/metrikaAdapter.js.html +1 -1
  9. package/coverage/ui-kit/src/common-apis/adapters/analyticsAdapters/mixpanelAdapter.js.html +1 -1
  10. package/coverage/ui-kit/src/common-apis/adapters/axiosAdapter.js.html +1 -1
  11. package/coverage/ui-kit/src/common-apis/adapters/index.html +1 -1
  12. package/coverage/ui-kit/src/common-apis/adapters/qrUtils.js.html +1 -1
  13. package/coverage/ui-kit/src/common-apis/external-apis/apiGroups.js.html +1 -1
  14. package/coverage/ui-kit/src/common-apis/external-apis/emailAPI.js.html +1 -1
  15. package/coverage/ui-kit/src/common-apis/external-apis/index.html +1 -1
  16. package/coverage/ui-kit/src/common-apis/external-apis/ipAddressProviders.js.html +1 -1
  17. package/coverage/ui-kit/src/common-apis/globalConstants.jsx.html +1 -1
  18. package/coverage/ui-kit/src/common-apis/index.html +1 -1
  19. package/coverage/ui-kit/src/common-apis/models/blockchain.js.html +1 -1
  20. package/coverage/ui-kit/src/common-apis/models/coin.js.html +221 -221
  21. package/coverage/ui-kit/src/common-apis/models/index.html +1 -1
  22. package/coverage/ui-kit/src/common-apis/models/protocol.js.html +3 -3
  23. package/coverage/ui-kit/src/common-apis/services/fiatCurrenciesService.js.html +1 -1
  24. package/coverage/ui-kit/src/common-apis/services/index.html +1 -1
  25. package/coverage/ui-kit/src/common-apis/utils/amountUtils.js.html +21 -21
  26. package/coverage/ui-kit/src/common-apis/utils/cache.js.html +6 -6
  27. package/coverage/ui-kit/src/common-apis/utils/errorUtils.js.html +13 -13
  28. package/coverage/ui-kit/src/common-apis/utils/index.html +1 -1
  29. package/coverage/ui-kit/src/common-apis/utils/logging/index.html +1 -1
  30. package/coverage/ui-kit/src/common-apis/utils/logging/logger.js.html +22 -22
  31. package/coverage/ui-kit/src/common-apis/utils/logging/logsStorage.js.html +3 -3
  32. package/coverage/ui-kit/src/common-apis/utils/postponeExecution.js.html +1 -1
  33. package/coverage/ui-kit/src/common-apis/utils/rabbitTicker.js.html +10 -10
  34. package/coverage/ui-kit/src/common-apis/utils/safeStringify.js.html +25 -25
  35. package/coverage/ui-kit/src/index.html +1 -1
  36. package/coverage/ui-kit/src/index.js.html +1 -1
  37. package/coverage/ui-kit/src/robust-api-caller/cacheAndConcurrentRequestsResolver.js.html +1 -1
  38. package/coverage/ui-kit/src/robust-api-caller/cachedRobustExternalApiCallerService.js.html +1 -1
  39. package/coverage/ui-kit/src/robust-api-caller/cancelProcessing.js.html +1 -1
  40. package/coverage/ui-kit/src/robust-api-caller/concurrentCalculationsMetadataHolder.js.html +1 -1
  41. package/coverage/ui-kit/src/robust-api-caller/externalApiProvider.js.html +1 -1
  42. package/coverage/ui-kit/src/robust-api-caller/externalServicesStatsCollector.js.html +1 -1
  43. package/coverage/ui-kit/src/robust-api-caller/index.html +1 -1
  44. package/coverage/ui-kit/src/robust-api-caller/robustExternalAPICallerService.js.html +1 -1
  45. package/coverage/ui-kit/src/swaps-lib/external-apis/exolixSwapProvider.js.html +1 -1
  46. package/coverage/ui-kit/src/swaps-lib/external-apis/goexmeSwapProvider.js.html +241 -328
  47. package/coverage/ui-kit/src/swaps-lib/external-apis/index.html +19 -19
  48. package/coverage/ui-kit/src/swaps-lib/external-apis/letsExchangeSwapProvider.js.html +1 -1
  49. package/coverage/ui-kit/src/swaps-lib/external-apis/swapProvider.js.html +284 -284
  50. package/coverage/ui-kit/src/swaps-lib/external-apis/swapspaceSwapProvider.js.html +1 -1
  51. package/coverage/ui-kit/src/swaps-lib/external-apis/utils.js.html +14 -14
  52. package/coverage/ui-kit/src/swaps-lib/models/baseSwapCreationInfo.js.html +1 -1
  53. package/coverage/ui-kit/src/swaps-lib/models/existingSwap.js.html +1 -1
  54. package/coverage/ui-kit/src/swaps-lib/models/existingSwapWithFiatData.js.html +1 -1
  55. package/coverage/ui-kit/src/swaps-lib/models/index.html +1 -1
  56. package/coverage/ui-kit/src/swaps-lib/models/partner.js.html +1 -1
  57. package/coverage/ui-kit/src/swaps-lib/models/swapProviderCoinInfo.js.html +73 -73
  58. package/coverage/ui-kit/src/swaps-lib/services/index.html +1 -1
  59. package/coverage/ui-kit/src/swaps-lib/services/publicSwapService.js.html +1 -1
  60. package/coverage/ui-kit/src/swaps-lib/utils/index.html +1 -1
  61. package/coverage/ui-kit/src/swaps-lib/utils/swapUtils.js.html +1 -1
  62. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/arrowIcon.jsx.html +1 -1
  63. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/arrowTosca.jsx.html +1 -1
  64. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/arrowWhite.jsx.html +1 -1
  65. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/darkRectangle.jsx.html +1 -1
  66. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/determinedError.jsx.html +1 -1
  67. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/failedValidationIcon.jsx.html +1 -1
  68. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/index.html +1 -1
  69. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/infoIcon.jsx.html +1 -1
  70. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/messageIcon.jsx.html +1 -1
  71. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/noticeQuestionIcon.jsx.html +1 -1
  72. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/successfulValidationIcon.jsx.html +1 -1
  73. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/supportDialogImage.jsx.html +1 -1
  74. package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/walletIcon.jsx.html +1 -1
  75. package/coverage/ui-kit/src/ui-kit/components/atoms/AssetIcon/AssetIcon.jsx.html +1 -1
  76. package/coverage/ui-kit/src/ui-kit/components/atoms/AssetIcon/index.html +1 -1
  77. package/coverage/ui-kit/src/ui-kit/components/atoms/AssetSelection/AssetSelection.jsx.html +1 -1
  78. package/coverage/ui-kit/src/ui-kit/components/atoms/AssetSelection/index.html +1 -1
  79. package/coverage/ui-kit/src/ui-kit/components/atoms/BackgroundTitle/BackgroundTitle.jsx.html +1 -1
  80. package/coverage/ui-kit/src/ui-kit/components/atoms/BackgroundTitle/index.html +1 -1
  81. package/coverage/ui-kit/src/ui-kit/components/atoms/InformationMessage/InformationMessage.jsx.html +1 -1
  82. package/coverage/ui-kit/src/ui-kit/components/atoms/InformationMessage/index.html +1 -1
  83. package/coverage/ui-kit/src/ui-kit/components/atoms/Input/Input.jsx.html +1 -1
  84. package/coverage/ui-kit/src/ui-kit/components/atoms/Input/index.html +1 -1
  85. package/coverage/ui-kit/src/ui-kit/components/atoms/LoadingDots/LoadingDots.jsx.html +1 -1
  86. package/coverage/ui-kit/src/ui-kit/components/atoms/LoadingDots/index.html +1 -1
  87. package/coverage/ui-kit/src/ui-kit/components/atoms/NoticeIcon/NoticeIcon.jsx.html +1 -1
  88. package/coverage/ui-kit/src/ui-kit/components/atoms/NoticeIcon/index.html +1 -1
  89. package/coverage/ui-kit/src/ui-kit/components/atoms/QrCode/QrCode.jsx.html +1 -1
  90. package/coverage/ui-kit/src/ui-kit/components/atoms/QrCode/index.html +1 -1
  91. package/coverage/ui-kit/src/ui-kit/components/atoms/RateSelector/RateSelector.jsx.html +1 -1
  92. package/coverage/ui-kit/src/ui-kit/components/atoms/RateSelector/index.html +1 -1
  93. package/coverage/ui-kit/src/ui-kit/components/atoms/SupportChat/SupportChat.jsx.html +1 -1
  94. package/coverage/ui-kit/src/ui-kit/components/atoms/SupportChat/index.html +1 -1
  95. package/coverage/ui-kit/src/ui-kit/components/atoms/Textarea/Textarea.jsx.html +1 -1
  96. package/coverage/ui-kit/src/ui-kit/components/atoms/Textarea/index.html +1 -1
  97. package/coverage/ui-kit/src/ui-kit/components/atoms/TitleBox/TitleBox.jsx.html +1 -1
  98. package/coverage/ui-kit/src/ui-kit/components/atoms/TitleBox/index.html +1 -1
  99. package/coverage/ui-kit/src/ui-kit/components/atoms/Tooltip/Tooltip.jsx.html +1 -1
  100. package/coverage/ui-kit/src/ui-kit/components/atoms/Tooltip/index.html +1 -1
  101. package/coverage/ui-kit/src/ui-kit/components/atoms/TwoLinesOfText/LinesOfText.jsx.html +1 -1
  102. package/coverage/ui-kit/src/ui-kit/components/atoms/TwoLinesOfText/index.html +1 -1
  103. package/coverage/ui-kit/src/ui-kit/components/atoms/Validation/Validation.jsx.html +1 -1
  104. package/coverage/ui-kit/src/ui-kit/components/atoms/Validation/index.html +1 -1
  105. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/Button/Button.jsx.html +1 -1
  106. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/Button/index.html +1 -1
  107. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/Close/Close.jsx.html +1 -1
  108. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/Close/index.html +1 -1
  109. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/LinkButton/LinkButton.jsx.html +1 -1
  110. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/LinkButton/index.html +1 -1
  111. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx.html +1 -1
  112. package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/RadioButtonWithText/index.html +1 -1
  113. package/coverage/ui-kit/src/ui-kit/components/molecules/AmountInput/AmountInput.jsx.html +1 -1
  114. package/coverage/ui-kit/src/ui-kit/components/molecules/AmountInput/index.html +1 -1
  115. package/coverage/ui-kit/src/ui-kit/components/molecules/CoinPicker/CoinPicker.jsx.html +1 -1
  116. package/coverage/ui-kit/src/ui-kit/components/molecules/CoinPicker/index.html +1 -1
  117. package/coverage/ui-kit/src/ui-kit/components/molecules/ColoredNotice/ColoredNotice.jsx.html +1 -1
  118. package/coverage/ui-kit/src/ui-kit/components/molecules/ColoredNotice/index.html +1 -1
  119. package/coverage/ui-kit/src/ui-kit/components/molecules/LineWithIconLink/LineWithIconLink.jsx.html +1 -1
  120. package/coverage/ui-kit/src/ui-kit/components/molecules/LineWithIconLink/index.html +1 -1
  121. package/coverage/ui-kit/src/ui-kit/components/molecules/LogoCarousel/LogoCarousel.jsx.html +1 -1
  122. package/coverage/ui-kit/src/ui-kit/components/molecules/LogoCarousel/index.html +1 -1
  123. package/coverage/ui-kit/src/ui-kit/components/molecules/SearchableCoinsList/SearchableCoinsList.jsx.html +1 -1
  124. package/coverage/ui-kit/src/ui-kit/components/molecules/SearchableCoinsList/index.html +1 -1
  125. package/coverage/ui-kit/src/ui-kit/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx.html +1 -1
  126. package/coverage/ui-kit/src/ui-kit/components/molecules/TitledLineWithIconLink/index.html +1 -1
  127. package/coverage/ui-kit/src/ui-kit/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx.html +1 -1
  128. package/coverage/ui-kit/src/ui-kit/components/organisms/CoinPickerDialogStep/index.html +1 -1
  129. package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/Dialog.jsx.html +1 -1
  130. package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/DialogButtons/DialogButtons.jsx.html +1 -1
  131. package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/DialogButtons/index.html +1 -1
  132. package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/DialogStep/DialogStep.jsx.html +1 -1
  133. package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/DialogStep/index.html +1 -1
  134. package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/index.html +1 -1
  135. package/coverage/ui-kit/src/ui-kit/components/organisms/SwapForm/SwapForm.jsx.html +1 -1
  136. package/coverage/ui-kit/src/ui-kit/components/organisms/SwapForm/index.html +1 -1
  137. package/coverage/ui-kit/src/ui-kit/components/organisms/WaitlistSubscription/WaitlistSubscription.jsx.html +1 -1
  138. package/coverage/ui-kit/src/ui-kit/components/organisms/WaitlistSubscription/index.html +1 -1
  139. package/coverage/ui-kit/src/ui-kit/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx.html +1 -1
  140. package/coverage/ui-kit/src/ui-kit/components/templates/DeterminedErrorDialogStep/index.html +1 -1
  141. package/coverage/ui-kit/src/ui-kit/hooks/index.html +1 -1
  142. package/coverage/ui-kit/src/ui-kit/hooks/useCallHandlingErrors.js.html +1 -1
  143. package/coverage/ui-kit/src/ui-kit/hooks/useIsHydrated.js.html +1 -1
  144. package/coverage/ui-kit/src/ui-kit/hooks/useReferredState.js.html +1 -1
  145. package/coverage/ui-kit/src/ui-kit/utils/index.html +1 -1
  146. package/coverage/ui-kit/src/ui-kit/utils/inputValueProviders.js.html +1 -1
  147. package/coverage/ui-kit/src/ui-kit/utils/searchCoins.js.html +1 -1
  148. package/coverage/ui-kit/src/ui-kit/utils/textUtils.js.html +1 -1
  149. package/coverage/ui-kit/src/ui-kit/utils/uiUtils.js.html +1 -1
  150. package/coverage/ui-kit/src/ui-kit/utils/urlQueryUtils.js.html +1 -1
  151. package/coverage/ui-kit/stories/atoms/BackgroundTitle.stories.jsx.html +1 -1
  152. package/coverage/ui-kit/stories/atoms/LinesOfText.stories.jsx.html +1 -1
  153. package/coverage/ui-kit/stories/atoms/LoadingDots.stories.jsx.html +1 -1
  154. package/coverage/ui-kit/stories/atoms/QrCode.stories.jsx.html +1 -1
  155. package/coverage/ui-kit/stories/atoms/RateSelector.stories.jsx.html +1 -1
  156. package/coverage/ui-kit/stories/atoms/Validation.stories.jsx.html +1 -1
  157. package/coverage/ui-kit/stories/atoms/buttons/Button.stories.jsx.html +1 -1
  158. package/coverage/ui-kit/stories/atoms/buttons/Close.stories.jsx.html +1 -1
  159. package/coverage/ui-kit/stories/atoms/buttons/LinkButton.stories.jsx.html +1 -1
  160. package/coverage/ui-kit/stories/atoms/buttons/index.html +1 -1
  161. package/coverage/ui-kit/stories/atoms/index.html +1 -1
  162. package/coverage/ui-kit/stories/molecules/AmountInput.stories.jsx.html +1 -1
  163. package/coverage/ui-kit/stories/molecules/CoinPicker.stories.jsx.html +1 -1
  164. package/coverage/ui-kit/stories/molecules/ColoredNotice.stories.jsx.html +1 -1
  165. package/coverage/ui-kit/stories/molecules/LineWithIconLink.stories.jsx.html +1 -1
  166. package/coverage/ui-kit/stories/molecules/LogoCarousel.stories.jsx.html +1 -1
  167. package/coverage/ui-kit/stories/molecules/TitledLineWithIconLink.stories.jsx.html +1 -1
  168. package/coverage/ui-kit/stories/molecules/index.html +1 -1
  169. package/coverage/ui-kit/stories/organisms/Dialog/Dialog.stories.jsx.html +1 -1
  170. package/coverage/ui-kit/stories/organisms/Dialog/DialogButtons/DialogButtons.stories.jsx.html +1 -1
  171. package/coverage/ui-kit/stories/organisms/Dialog/DialogButtons/index.html +1 -1
  172. package/coverage/ui-kit/stories/organisms/Dialog/DialogStep/DialogStep.stories.jsx.html +1 -1
  173. package/coverage/ui-kit/stories/organisms/Dialog/DialogStep/index.html +1 -1
  174. package/coverage/ui-kit/stories/organisms/Dialog/index.html +1 -1
  175. package/coverage/ui-kit/stories/organisms/WaitlistSubscription.stories.jsx.html +1 -1
  176. package/coverage/ui-kit/stories/organisms/index.html +1 -1
  177. package/coverage/ui-kit/stories/stubs/coins.jsx.html +1 -1
  178. package/coverage/ui-kit/stories/stubs/exampleContent.jsx.html +1 -1
  179. package/coverage/ui-kit/stories/stubs/index.html +1 -1
  180. package/coverage/ui-kit/stories/templates/DeterminedErrorDialogStep.stories.jsx.html +1 -1
  181. package/coverage/ui-kit/stories/templates/index.html +1 -1
  182. package/dist/index.cjs +93 -129
  183. package/dist/index.cjs.map +1 -1
  184. package/dist/index.modern.js +8 -31
  185. package/dist/index.modern.js.map +1 -1
  186. package/dist/index.module.js +93 -129
  187. package/dist/index.module.js.map +1 -1
  188. package/dist/index.umd.js +93 -129
  189. package/dist/index.umd.js.map +1 -1
  190. package/package.json +1 -1
  191. package/src/swaps-lib/external-apis/goexmeSwapProvider.js +15 -44
  192. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/createSwap.test.js +0 -7
  193. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/getSwapInfo.test.js +0 -15
  194. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/PairSupport.int.test.js +1 -30
  195. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/_fetchSupportedCurrenciesIfNeeded.int.test.js +0 -28
  196. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/createSwap.int.test.js +0 -1
  197. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/getSwapInfo.int.test.js +0 -1
  198. package/src/swaps-lib/test/external-apis/goexmeSwapProvider/_ensurePairsLoaded.test.js +0 -77
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rabbitio/ui-kit",
3
- "version": "1.0.0-beta.112",
3
+ "version": "1.0.0-beta.113",
4
4
  "description": "Rabbit.io react.js components kit",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -89,25 +89,13 @@ export class GoexmeSwapProvider extends SwapProvider {
89
89
  };
90
90
 
91
91
  this.COINS_EXPIRATION_TIME_MS = 5 * 60 * 1000;
92
- this.PAIRS_EXPIRATION_TIME_MS = 5 * 60 * 1000;
93
92
  this.SWAP_EXPIRATION_TIME_MS = 4 * 60 * 60 * 1000;
94
-
95
- this._pairsCache = null;
96
- this._pairsCacheTimestamp = 0;
97
93
  }
98
94
 
99
95
  getSwapCreationInfoTtlMs() {
100
96
  return 30000;
101
97
  }
102
98
 
103
- _isPairSupported(fromInfo, toInfo) {
104
- if (!this._pairsCache || !this._pairsCache[fromInfo.code]) return false;
105
- const toSet = this._pairsCache[fromInfo.code];
106
- /* GoExme may list either the raw provider code **or**
107
- * the “pretty” Rabbit ticker in `/pairs`, so we test both. */
108
- return toSet.has(toInfo.code) || toSet.has(toInfo.coin.ticker);
109
- }
110
-
111
99
  _findInfoByTicker(ticker) {
112
100
  return this._supportedCoins.find(i => i.coin.ticker === ticker) || null;
113
101
  }
@@ -196,33 +184,6 @@ export class GoexmeSwapProvider extends SwapProvider {
196
184
  );
197
185
  }
198
186
 
199
- async _ensurePairsLoaded() {
200
- const loggerSource = "Goexme._ensurePairsLoaded";
201
- try {
202
- if (this._pairsCache && Date.now() - this._pairsCacheTimestamp < this.PAIRS_EXPIRATION_TIME_MS) return;
203
-
204
- const response = await axios.get(`${this._URL}/pairs`, {
205
- ...this.axiosPreset,
206
- ...createRobustTimeoutSetupForAxios(),
207
- params: { key: this._apiKey },
208
- });
209
-
210
- if (response.status !== 200 || typeof response.data !== "object") {
211
- throw new Error("Failed to load /pairs");
212
- }
213
-
214
- this._pairsCache = Object.fromEntries(
215
- Object.entries(response.data).map(([from, arr]) => [
216
- from.toUpperCase(),
217
- new Set(arr.map(v => v.toUpperCase())),
218
- ])
219
- );
220
- this._pairsCacheTimestamp = Date.now();
221
- } catch (e) {
222
- improveAndRethrow(e, loggerSource);
223
- }
224
- }
225
-
226
187
  _mapGoexmeStatus(status) {
227
188
  switch (status) {
228
189
  case "new":
@@ -303,12 +264,11 @@ export class GoexmeSwapProvider extends SwapProvider {
303
264
  throw new Error("Invalid params for getSwapInfo");
304
265
 
305
266
  await this._fetchSupportedCurrenciesIfNeeded();
306
- await this._ensurePairsLoaded();
307
267
 
308
268
  const fromCoinInfo = this._findInfoByTicker(fromCoin.ticker);
309
269
  const toCoinInfo = this._findInfoByTicker(toCoin.ticker);
310
270
 
311
- if (!fromCoinInfo || !toCoinInfo || !this._isPairSupported(fromCoinInfo, toCoinInfo)) {
271
+ if (!fromCoinInfo || !toCoinInfo) {
312
272
  return {
313
273
  result: false,
314
274
  reason: SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED,
@@ -361,7 +321,18 @@ export class GoexmeSwapProvider extends SwapProvider {
361
321
  };
362
322
  }
363
323
 
364
- // Convert amountTo → ratio so that downstream code can do amountFrom * rate === amountTo
324
+ if (
325
+ response.data.rate == null ||
326
+ BigNumber(response.data.rate).isNaN() ||
327
+ BigNumber(response.data.rate).lte(0)
328
+ ) {
329
+ return {
330
+ result: false,
331
+ reason: SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED,
332
+ };
333
+ }
334
+
335
+ // Convert amountTo → ratio so that downstream code can do amountFrom * rate === amountTo
365
336
  let rateRatio = null;
366
337
  if (response.data.rate != null && BigNumber(amountCoins).gt(0)) {
367
338
  rateRatio = AmountUtils.trim(
@@ -445,7 +416,7 @@ export class GoexmeSwapProvider extends SwapProvider {
445
416
  const fromCoinInfo = this._findInfoByTicker(fromCoin.ticker);
446
417
  const toCoinInfo = this._findInfoByTicker(toCoin.ticker);
447
418
 
448
- if (!fromCoinInfo || !toCoinInfo || !this._isPairSupported(fromCoinInfo, toCoinInfo)) {
419
+ if (!fromCoinInfo || !toCoinInfo) {
449
420
  throw new Error(`Unsupported pair ${fromCoin.ticker} -> ${toCoin.ticker}`);
450
421
  }
451
422
 
@@ -505,7 +476,7 @@ export class GoexmeSwapProvider extends SwapProvider {
505
476
 
506
477
  const toAmountCalculated = AmountUtils.trim(amountToCandidate, toCoin.digits);
507
478
 
508
- // Derive ratio so that amountFrom * ratio = amountTo.
479
+ // Derive ratio so that amountFrom * ratio = amountTo.
509
480
  const rateRatio = AmountUtils.trim(
510
481
  BigNumber(toAmountCalculated).div(amount).toString(),
511
482
  this._maxRateDigits
@@ -124,13 +124,6 @@ describe("goexmeSwapProvider", function () {
124
124
  .should.be.rejectedWith(/Goexme createSwap failed/);
125
125
  });
126
126
 
127
- it("Should throw for unsupported coins or pairs", async () => {
128
- provider._pairsCache = {};
129
- await provider
130
- .createSwap(BTC, ETH, "1", "dest", "", ESTIMATION_STUB, null, false, "memo")
131
- .should.be.rejectedWith(/Unsupported pair/);
132
- });
133
-
134
127
  it("Should copy fixed flag from request", async () => {
135
128
  const dto = await provider.createSwap(BTC, ETH, "1", "dest-addr", "", ESTIMATION_STUB, null, true, "memo");
136
129
  dto.fixed.should.be.true();
@@ -49,12 +49,6 @@ describe("goexmeSwapProvider", function () {
49
49
 
50
50
  afterEach(() => sinon.restore());
51
51
 
52
- it("Should return NOT_SUPPORTED if pair absent", async () => {
53
- axiosStub.withArgs(sinon.match(/\/pairs/)).resolves({ status: 200, data: { BTC: ["USDT"] } });
54
- const info = await provider.getSwapInfo(BTC, ETH, "1");
55
- info.reason.should.equal(SwapProvider.NO_SWAPS_REASONS.NOT_SUPPORTED);
56
- });
57
-
58
52
  it("Should return TOO_LOW and TOO_HIGH against min/max", async () => {
59
53
  let info = await provider.getSwapInfo(BTC, ETH, "0.001");
60
54
  info.reason.should.equal(SwapProvider.NO_SWAPS_REASONS.TOO_LOW);
@@ -130,15 +124,6 @@ describe("goexmeSwapProvider", function () {
130
124
  await provider.getSwapInfo(BTC, ETH, "1", false, null, true).should.be.rejected();
131
125
  });
132
126
 
133
- it("Should set rate=null when provider omits the rate field", async () => {
134
- axiosStub.withArgs(sinon.match(/\/rate/)).resolves({
135
- status: 200,
136
- data: { result: true, minamount: "0.1" },
137
- });
138
- const info = await provider.getSwapInfo(BTC, ETH, "1");
139
- should(info.rate).be.null();
140
- });
141
-
142
127
  it("Should return NOT_SUPPORTED when either fromCoin or toCoin is unsupported", async () => {
143
128
  const unsupported = new Coin(
144
129
  "Unsupported",
@@ -23,7 +23,7 @@ const ALLOWED_RABBIT_TICKERS = [
23
23
  "USDTERC20",
24
24
  "USDTSOL",
25
25
  "USDTTRC20",
26
- "XMR",
26
+ // "XMR", // XMR is not supported by Goexme (04.08.2025)
27
27
  "XRP",
28
28
  ];
29
29
 
@@ -41,7 +41,6 @@ maybeDescribe("external-apis/goexmeSwapProvider integration", function () {
41
41
  beforeAll(async function () {
42
42
  provider = new GoexmeSwapProvider("/", new Cache(), () => null, false, GOEXME_API_KEY);
43
43
  await provider._fetchSupportedCurrenciesIfNeeded();
44
- await provider._ensurePairsLoaded();
45
44
  });
46
45
 
47
46
  ALLOWED_RABBIT_TICKERS.forEach(fromTicker => {
@@ -66,32 +65,4 @@ maybeDescribe("external-apis/goexmeSwapProvider integration", function () {
66
65
  });
67
66
  });
68
67
  });
69
-
70
- describe("_ensurePairsLoaded error propagation (live)", function () {
71
- let providerInstance;
72
- let axiosOriginalGet;
73
-
74
- beforeAll(function () {
75
- providerInstance = new GoexmeSwapProvider("/", new Cache(), () => null, false, GOEXME_API_KEY);
76
- axiosOriginalGet = axios.get;
77
- });
78
-
79
- afterEach(function () {
80
- if (axios.get.restore) {
81
- axios.get.restore();
82
- } else {
83
- axios.get = axiosOriginalGet;
84
- }
85
- });
86
-
87
- it("Should propagate network error from /pairs", async function () {
88
- const networkError = new Error("net-boom");
89
- sinon.stub(axios, "get").callsFake((url, cfg = {}) => {
90
- if (url.includes("/pairs")) return Promise.reject(networkError);
91
- return axiosOriginalGet(url, cfg);
92
- });
93
-
94
- await providerInstance._ensurePairsLoaded().should.be.rejectedWith(networkError);
95
- });
96
- });
97
68
  });
@@ -278,34 +278,6 @@ maybeDescribe("external-apis/goexmeSwapProvider integration", function () {
278
278
  nonPopularTickers.should.eql(sorted);
279
279
  });
280
280
 
281
- it("Should use pairs cache within TTL", async () => {
282
- let calls = 0;
283
- sinon.stub(axios, "get").callsFake((url, opts) => {
284
- if (url.includes("/pairs")) calls += 1;
285
- return axiosGetOriginal(url, opts);
286
- });
287
-
288
- await provider._ensurePairsLoaded();
289
- provider._pairsCacheTimestamp -= 4 * 60 * 1000;
290
- await provider._ensurePairsLoaded();
291
-
292
- calls.should.equal(1);
293
- });
294
-
295
- it("Should reload pairs cache after TTL expiry", async () => {
296
- let calls = 0;
297
- sinon.stub(axios, "get").callsFake((url, opts) => {
298
- if (url.includes("/pairs")) calls += 1;
299
- return axiosGetOriginal(url, opts);
300
- });
301
-
302
- await provider._ensurePairsLoaded();
303
- provider._pairsCacheTimestamp -= 10 * 60 * 1000;
304
- await provider._ensurePairsLoaded();
305
-
306
- calls.should.equal(2);
307
- });
308
-
309
281
  it("Should keep cache consistent under concurrent calls", async () => {
310
282
  await Promise.all([
311
283
  provider._fetchSupportedCurrenciesIfNeeded(),
@@ -19,7 +19,6 @@ maybeDescribe("external-apis/goexmeSwapProvider integration", function () {
19
19
  beforeEach(async () => {
20
20
  provider = new GoexmeSwapProvider("/", new Cache(), () => null, false, GOEXME_API_KEY);
21
21
  await provider._fetchSupportedCurrenciesIfNeeded();
22
- await provider._ensurePairsLoaded();
23
22
  axiosOriginalGet = axios.get;
24
23
  });
25
24
 
@@ -19,7 +19,6 @@ maybeDescribe("external-apis/goexmeSwapProvider integration", function () {
19
19
  beforeEach(async function () {
20
20
  provider = new GoexmeSwapProvider("/", new Cache(), () => null, false, GOEXME_API_KEY);
21
21
  await provider._fetchSupportedCurrenciesIfNeeded();
22
- await provider._ensurePairsLoaded();
23
22
  axiosOriginalGet = axios.get;
24
23
  });
25
24
 
@@ -1,77 +0,0 @@
1
- import sinon from "sinon";
2
- import axios from "axios";
3
- import should from "should";
4
- import { beforeEach, afterEach, describe, it } from "vitest";
5
-
6
- import { GoexmeSwapProvider } from "../../../external-apis/goexmeSwapProvider.js";
7
- import { Cache } from "../../../../common-apis/utils/cache.js";
8
-
9
- describe("goexmeSwapProvider", function () {
10
- describe("_ensurePairsLoaded", function () {
11
- let provider, axiosGetStub;
12
-
13
- beforeEach(() => {
14
- provider = new GoexmeSwapProvider("/", new Cache(), () => null, false);
15
- axiosGetStub = sinon.stub(axios, "get").callsFake(url => {
16
- if (url.includes("/pairs")) {
17
- return Promise.resolve({
18
- status: 200,
19
- data: { btc: ["eth", "ETH"] },
20
- });
21
- }
22
- return Promise.resolve({ status: 200, data: {} });
23
- });
24
- });
25
-
26
- afterEach(() => {
27
- axiosGetStub.restore();
28
- });
29
-
30
- it("Should normalise codes to upper‑case", async () => {
31
- await provider._ensurePairsLoaded();
32
- provider._pairsCache.should.have.property("BTC");
33
- });
34
-
35
- it("Should remove duplicate tickers", async () => {
36
- await provider._ensurePairsLoaded();
37
- Array.from(provider._pairsCache.BTC).should.eql(["ETH"]);
38
- });
39
-
40
- it("Should not call axios again while pairs cache is fresh", async () => {
41
- await provider._ensurePairsLoaded();
42
- const calls = axiosGetStub.callCount;
43
- await provider._ensurePairsLoaded();
44
- axiosGetStub.callCount.should.equal(calls);
45
- });
46
-
47
- it("Should refresh pairs after expiration", async () => {
48
- await provider._ensurePairsLoaded();
49
- const calls = axiosGetStub.callCount;
50
-
51
- provider._pairsCacheTimestamp -= provider.PAIRS_EXPIRATION_TIME_MS + 1;
52
-
53
- await provider._ensurePairsLoaded();
54
- axiosGetStub.callCount.should.equal(calls + 1);
55
- });
56
-
57
- it("Should reject when response status is not 200", async () => {
58
- axiosGetStub.resetBehavior();
59
- axiosGetStub.resolves({ status: 400, data: {} });
60
-
61
- return provider._ensurePairsLoaded().should.be.rejected();
62
- });
63
-
64
- it("Should reject when data is not an object", async () => {
65
- axiosGetStub.resetBehavior();
66
- axiosGetStub.resolves({ status: 200, data: "not‑object" });
67
-
68
- return provider._ensurePairsLoaded().should.be.rejected();
69
- });
70
-
71
- it("Should propagate axios error", async () => {
72
- axiosGetStub.resetBehavior();
73
- axiosGetStub.rejects(new Error("network"));
74
- return provider._ensurePairsLoaded().should.be.rejectedWith(/network/);
75
- });
76
- });
77
- });