@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.
- package/coverage/clover.xml +1226 -1255
- package/coverage/coverage-final.json +13 -13
- package/coverage/index.html +18 -18
- package/coverage/ui-kit/index.html +1 -1
- package/coverage/ui-kit/index.js.html +1 -1
- package/coverage/ui-kit/src/common-apis/adapters/analyticsAdapters/googleAnalyticsAdapter.js.html +1 -1
- package/coverage/ui-kit/src/common-apis/adapters/analyticsAdapters/index.html +1 -1
- package/coverage/ui-kit/src/common-apis/adapters/analyticsAdapters/metrikaAdapter.js.html +1 -1
- package/coverage/ui-kit/src/common-apis/adapters/analyticsAdapters/mixpanelAdapter.js.html +1 -1
- package/coverage/ui-kit/src/common-apis/adapters/axiosAdapter.js.html +1 -1
- package/coverage/ui-kit/src/common-apis/adapters/index.html +1 -1
- package/coverage/ui-kit/src/common-apis/adapters/qrUtils.js.html +1 -1
- package/coverage/ui-kit/src/common-apis/external-apis/apiGroups.js.html +1 -1
- package/coverage/ui-kit/src/common-apis/external-apis/emailAPI.js.html +1 -1
- package/coverage/ui-kit/src/common-apis/external-apis/index.html +1 -1
- package/coverage/ui-kit/src/common-apis/external-apis/ipAddressProviders.js.html +1 -1
- package/coverage/ui-kit/src/common-apis/globalConstants.jsx.html +1 -1
- package/coverage/ui-kit/src/common-apis/index.html +1 -1
- package/coverage/ui-kit/src/common-apis/models/blockchain.js.html +1 -1
- package/coverage/ui-kit/src/common-apis/models/coin.js.html +221 -221
- package/coverage/ui-kit/src/common-apis/models/index.html +1 -1
- package/coverage/ui-kit/src/common-apis/models/protocol.js.html +3 -3
- package/coverage/ui-kit/src/common-apis/services/fiatCurrenciesService.js.html +1 -1
- package/coverage/ui-kit/src/common-apis/services/index.html +1 -1
- package/coverage/ui-kit/src/common-apis/utils/amountUtils.js.html +21 -21
- package/coverage/ui-kit/src/common-apis/utils/cache.js.html +6 -6
- package/coverage/ui-kit/src/common-apis/utils/errorUtils.js.html +13 -13
- package/coverage/ui-kit/src/common-apis/utils/index.html +1 -1
- package/coverage/ui-kit/src/common-apis/utils/logging/index.html +1 -1
- package/coverage/ui-kit/src/common-apis/utils/logging/logger.js.html +22 -22
- package/coverage/ui-kit/src/common-apis/utils/logging/logsStorage.js.html +3 -3
- package/coverage/ui-kit/src/common-apis/utils/postponeExecution.js.html +1 -1
- package/coverage/ui-kit/src/common-apis/utils/rabbitTicker.js.html +10 -10
- package/coverage/ui-kit/src/common-apis/utils/safeStringify.js.html +25 -25
- package/coverage/ui-kit/src/index.html +1 -1
- package/coverage/ui-kit/src/index.js.html +1 -1
- package/coverage/ui-kit/src/robust-api-caller/cacheAndConcurrentRequestsResolver.js.html +1 -1
- package/coverage/ui-kit/src/robust-api-caller/cachedRobustExternalApiCallerService.js.html +1 -1
- package/coverage/ui-kit/src/robust-api-caller/cancelProcessing.js.html +1 -1
- package/coverage/ui-kit/src/robust-api-caller/concurrentCalculationsMetadataHolder.js.html +1 -1
- package/coverage/ui-kit/src/robust-api-caller/externalApiProvider.js.html +1 -1
- package/coverage/ui-kit/src/robust-api-caller/externalServicesStatsCollector.js.html +1 -1
- package/coverage/ui-kit/src/robust-api-caller/index.html +1 -1
- package/coverage/ui-kit/src/robust-api-caller/robustExternalAPICallerService.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/external-apis/exolixSwapProvider.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/external-apis/goexmeSwapProvider.js.html +241 -328
- package/coverage/ui-kit/src/swaps-lib/external-apis/index.html +19 -19
- package/coverage/ui-kit/src/swaps-lib/external-apis/letsExchangeSwapProvider.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/external-apis/swapProvider.js.html +284 -284
- package/coverage/ui-kit/src/swaps-lib/external-apis/swapspaceSwapProvider.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/external-apis/utils.js.html +14 -14
- package/coverage/ui-kit/src/swaps-lib/models/baseSwapCreationInfo.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/models/existingSwap.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/models/existingSwapWithFiatData.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/models/index.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/models/partner.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/models/swapProviderCoinInfo.js.html +73 -73
- package/coverage/ui-kit/src/swaps-lib/services/index.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/services/publicSwapService.js.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/utils/index.html +1 -1
- package/coverage/ui-kit/src/swaps-lib/utils/swapUtils.js.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/arrowIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/arrowTosca.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/arrowWhite.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/darkRectangle.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/determinedError.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/failedValidationIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/infoIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/messageIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/noticeQuestionIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/successfulValidationIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/supportDialogImage.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/assets/wrappedImages/walletIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/AssetIcon/AssetIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/AssetIcon/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/AssetSelection/AssetSelection.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/AssetSelection/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/BackgroundTitle/BackgroundTitle.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/BackgroundTitle/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/InformationMessage/InformationMessage.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/InformationMessage/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/Input/Input.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/Input/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/LoadingDots/LoadingDots.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/LoadingDots/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/NoticeIcon/NoticeIcon.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/NoticeIcon/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/QrCode/QrCode.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/QrCode/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/RateSelector/RateSelector.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/RateSelector/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/SupportChat/SupportChat.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/SupportChat/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/Textarea/Textarea.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/Textarea/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/TitleBox/TitleBox.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/TitleBox/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/Tooltip/Tooltip.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/Tooltip/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/TwoLinesOfText/LinesOfText.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/TwoLinesOfText/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/Validation/Validation.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/Validation/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/Button/Button.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/Button/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/Close/Close.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/Close/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/LinkButton/LinkButton.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/LinkButton/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/RadioButtonWithText/RadioButtonWithText.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/atoms/buttons/RadioButtonWithText/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/AmountInput/AmountInput.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/AmountInput/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/CoinPicker/CoinPicker.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/CoinPicker/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/ColoredNotice/ColoredNotice.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/ColoredNotice/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/LineWithIconLink/LineWithIconLink.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/LineWithIconLink/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/LogoCarousel/LogoCarousel.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/LogoCarousel/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/SearchableCoinsList/SearchableCoinsList.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/SearchableCoinsList/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/TitledLineWithIconLink/TitledLineWithIconLink.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/molecules/TitledLineWithIconLink/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/organisms/CoinPickerDialogStep/CoinPickerDialogStep.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/organisms/CoinPickerDialogStep/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/Dialog.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/DialogButtons/DialogButtons.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/DialogButtons/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/DialogStep/DialogStep.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/DialogStep/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/organisms/Dialog/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/organisms/SwapForm/SwapForm.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/organisms/SwapForm/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/organisms/WaitlistSubscription/WaitlistSubscription.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/organisms/WaitlistSubscription/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/templates/DeterminedErrorDialogStep/DeterminedErrorDialogStep.jsx.html +1 -1
- package/coverage/ui-kit/src/ui-kit/components/templates/DeterminedErrorDialogStep/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/hooks/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/hooks/useCallHandlingErrors.js.html +1 -1
- package/coverage/ui-kit/src/ui-kit/hooks/useIsHydrated.js.html +1 -1
- package/coverage/ui-kit/src/ui-kit/hooks/useReferredState.js.html +1 -1
- package/coverage/ui-kit/src/ui-kit/utils/index.html +1 -1
- package/coverage/ui-kit/src/ui-kit/utils/inputValueProviders.js.html +1 -1
- package/coverage/ui-kit/src/ui-kit/utils/searchCoins.js.html +1 -1
- package/coverage/ui-kit/src/ui-kit/utils/textUtils.js.html +1 -1
- package/coverage/ui-kit/src/ui-kit/utils/uiUtils.js.html +1 -1
- package/coverage/ui-kit/src/ui-kit/utils/urlQueryUtils.js.html +1 -1
- package/coverage/ui-kit/stories/atoms/BackgroundTitle.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/LinesOfText.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/LoadingDots.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/QrCode.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/RateSelector.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/Validation.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/buttons/Button.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/buttons/Close.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/buttons/LinkButton.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/atoms/buttons/index.html +1 -1
- package/coverage/ui-kit/stories/atoms/index.html +1 -1
- package/coverage/ui-kit/stories/molecules/AmountInput.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/molecules/CoinPicker.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/molecules/ColoredNotice.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/molecules/LineWithIconLink.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/molecules/LogoCarousel.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/molecules/TitledLineWithIconLink.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/molecules/index.html +1 -1
- package/coverage/ui-kit/stories/organisms/Dialog/Dialog.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/organisms/Dialog/DialogButtons/DialogButtons.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/organisms/Dialog/DialogButtons/index.html +1 -1
- package/coverage/ui-kit/stories/organisms/Dialog/DialogStep/DialogStep.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/organisms/Dialog/DialogStep/index.html +1 -1
- package/coverage/ui-kit/stories/organisms/Dialog/index.html +1 -1
- package/coverage/ui-kit/stories/organisms/WaitlistSubscription.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/organisms/index.html +1 -1
- package/coverage/ui-kit/stories/stubs/coins.jsx.html +1 -1
- package/coverage/ui-kit/stories/stubs/exampleContent.jsx.html +1 -1
- package/coverage/ui-kit/stories/stubs/index.html +1 -1
- package/coverage/ui-kit/stories/templates/DeterminedErrorDialogStep.stories.jsx.html +1 -1
- package/coverage/ui-kit/stories/templates/index.html +1 -1
- package/dist/index.cjs +93 -129
- package/dist/index.cjs.map +1 -1
- package/dist/index.modern.js +8 -31
- package/dist/index.modern.js.map +1 -1
- package/dist/index.module.js +93 -129
- package/dist/index.module.js.map +1 -1
- package/dist/index.umd.js +93 -129
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/swaps-lib/external-apis/goexmeSwapProvider.js +15 -44
- package/src/swaps-lib/test/external-apis/goexmeSwapProvider/createSwap.test.js +0 -7
- package/src/swaps-lib/test/external-apis/goexmeSwapProvider/getSwapInfo.test.js +0 -15
- package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/PairSupport.int.test.js +1 -30
- package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/_fetchSupportedCurrenciesIfNeeded.int.test.js +0 -28
- package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/createSwap.int.test.js +0 -1
- package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/getSwapInfo.int.test.js +0 -1
- package/src/swaps-lib/test/external-apis/goexmeSwapProvider/_ensurePairsLoaded.test.js +0 -77
package/package.json
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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",
|
package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/PairSupport.int.test.js
CHANGED
|
@@ -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(),
|
package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/createSwap.int.test.js
CHANGED
|
@@ -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
|
|
package/src/swaps-lib/test/external-apis/goexmeSwapProvider/integration/getSwapInfo.int.test.js
CHANGED
|
@@ -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
|
-
});
|