diff --git a/package-lock.json b/package-lock.json index 88241217a8..3e0669c832 100644 --- a/package-lock.json +++ b/package-lock.json @@ -58,7 +58,7 @@ "alchemy-sdk": "^3.6.5", "applicationinsights": "^2.9.8", "arweave": "^1.15.7", - "axios": "^1.13.1", + "axios": "^1.15.0", "basic-ftp": "^5.0.5", "bcrypt": "^5.1.1", "bech32": "^2.0.0", @@ -3048,15 +3048,6 @@ "node": ">=10" } }, - "node_modules/@dhedge/v2-sdk/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, "node_modules/@dhedge/v2-sdk/node_modules/bech32": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/bech32/-/bech32-1.1.4.tgz", @@ -9361,17 +9352,6 @@ "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "license": "MIT" }, - "node_modules/@tatumio/tron-wallet-provider/node_modules/axios": { - "version": "1.13.6", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", - "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.11", - "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/@tatumio/tron-wallet-provider/node_modules/bignumber.js": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.1.tgz", @@ -10523,15 +10503,6 @@ "jsbi": "^3.2.0" } }, - "node_modules/@uniswap/smart-order-router/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, "node_modules/@uniswap/smart-order-router/node_modules/form-data": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", @@ -11056,15 +11027,6 @@ "rimraf": "^3.0.2" } }, - "node_modules/@zano-project/zano-utils-js/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, "node_modules/@zano-project/zano-utils-js/node_modules/big.js": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.2.tgz", @@ -11928,9 +11890,9 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz", - "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.15.0.tgz", + "integrity": "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==", "license": "MIT", "dependencies": { "follow-redirects": "^1.15.11", @@ -13492,17 +13454,6 @@ "node-fetch": "^2.6.12" } }, - "node_modules/checkout-sdk-node/node_modules/axios": { - "version": "0.30.3", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.30.3.tgz", - "integrity": "sha512-5/tmEb6TmE/ax3mdXBc/Mi6YdPGxQsv+0p5YlciXWt3PHIn0VamqCXhRMtScnwY3lbgSXLneOuXAKUhgmSRpwg==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.4", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/cheerio": { "version": "1.0.0-rc.12", "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", @@ -24769,12 +24720,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, "node_modules/psl": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", @@ -28907,17 +28852,6 @@ "integrity": "sha512-G965FqalsNyrPqgEGON7nIx1e/OVENSgiEIzyC63haUMuvNnwIgIjMs52hlTCKhkBny7A2ORNlfY9Zu+jmGk1Q==", "license": "MIT" }, - "node_modules/tronweb/node_modules/axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.11", - "form-data": "^4.0.5", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/tronweb/node_modules/bignumber.js": { "version": "9.1.2", "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", diff --git a/package.json b/package.json index e5616de190..3e7c9f105a 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "alchemy-sdk": "^3.6.5", "applicationinsights": "^2.9.8", "arweave": "^1.15.7", - "axios": "^1.13.1", + "axios": "^1.15.0", "basic-ftp": "^5.0.5", "bcrypt": "^5.1.1", "bech32": "^2.0.0", @@ -197,6 +197,7 @@ "multer": "^2.0.0", "uuid": "^9.0.0", "semver": "^7.6.0", - "fast-xml-parser": "$fast-xml-parser" + "fast-xml-parser": "$fast-xml-parser", + "axios": "$axios" } } diff --git a/src/integration/blockchain/shared/evm/interfaces/index.ts b/src/integration/blockchain/shared/evm/interfaces/index.ts index de5a19677b..a2843fad8c 100644 --- a/src/integration/blockchain/shared/evm/interfaces/index.ts +++ b/src/integration/blockchain/shared/evm/interfaces/index.ts @@ -23,6 +23,9 @@ export interface EvmTokenHistoryEntry { } export interface L2BridgeEvmClient { + getNativeCoinBalance(): Promise; + getTokenBalance(asset: Asset): Promise; + depositCoinOnDex(amount: number): Promise; withdrawCoinOnDex(amount: number): Promise; diff --git a/src/integration/blockchain/spark/spark-client.ts b/src/integration/blockchain/spark/spark-client.ts index 3c7ea607f6..df4e07859a 100644 --- a/src/integration/blockchain/spark/spark-client.ts +++ b/src/integration/blockchain/spark/spark-client.ts @@ -61,13 +61,6 @@ export class SparkClient extends BlockchainClient { this.startTokenOptimization(); } - resetWallet(): void { - this.logger.warn('Spark wallet reset triggered externally'); - this.wallet.reset(); - this.cachedAddress.reset(); - this.reconnectWallet(); - } - private async call(operation: (wallet: SparkWallet) => Promise): Promise { try { const wallet = await this.wallet; diff --git a/src/subdomains/core/liquidity-management/adapters/actions/base/evm-l2-bridge.adapter.ts b/src/subdomains/core/liquidity-management/adapters/actions/base/evm-l2-bridge.adapter.ts index 5f052afbf2..cfd1addff5 100644 --- a/src/subdomains/core/liquidity-management/adapters/actions/base/evm-l2-bridge.adapter.ts +++ b/src/subdomains/core/liquidity-management/adapters/actions/base/evm-l2-bridge.adapter.ts @@ -4,6 +4,7 @@ import { L2BridgeEvmClient } from 'src/integration/blockchain/shared/evm/interfa import { isAsset } from 'src/shared/models/active'; import { AssetType } from 'src/shared/models/asset/asset.entity'; import { AssetService } from 'src/shared/models/asset/asset.service'; +import { Util } from 'src/shared/utils/util'; import { LiquidityManagementOrder } from '../../../entities/liquidity-management-order.entity'; import { LiquidityManagementSystem } from '../../../enums'; import { OrderFailedException } from '../../../exceptions/order-failed.exception'; @@ -111,7 +112,7 @@ export abstract class EvmL2BridgeAdapter extends LiquidityActionAdapter { `Not enough liquidity on L1 blockchain for ${name} (balance: ${l1Liquidity}, min. requested: ${minAmount}, max. requested: ${maxAmount})`, ); - const amount = Math.min(maxAmount, l1Liquidity); + const amount = Util.floor(Math.min(maxAmount, l1Liquidity), 8); order.inputAmount = amount; order.inputAsset = l1Asset.name; @@ -143,7 +144,8 @@ export abstract class EvmL2BridgeAdapter extends LiquidityActionAdapter { pipeline: { rule: { targetAsset: l2Asset }, }, - maxAmount: amount, + minAmount, + maxAmount, } = order; const { type, name } = l2Asset; @@ -155,6 +157,18 @@ export abstract class EvmL2BridgeAdapter extends LiquidityActionAdapter { ); } + // verify L2 liquidity + const l2Liquidity = + type === AssetType.COIN + ? await this.l2Client.getNativeCoinBalance() + : await this.l2Client.getTokenBalance(l2Asset); + if (l2Liquidity < minAmount) + throw new OrderNotProcessableException( + `Not enough liquidity on L2 blockchain for ${name} (balance: ${l2Liquidity}, min. requested: ${minAmount}, max. requested: ${maxAmount})`, + ); + + const amount = Util.floor(Math.min(maxAmount, l2Liquidity), 8); + order.inputAmount = amount; order.inputAsset = l2Asset.name; order.outputAmount = amount; diff --git a/src/subdomains/generic/kyc/services/kyc.service.ts b/src/subdomains/generic/kyc/services/kyc.service.ts index 9e61799fa8..fa8e4c1407 100644 --- a/src/subdomains/generic/kyc/services/kyc.service.ts +++ b/src/subdomains/generic/kyc/services/kyc.service.ts @@ -407,10 +407,10 @@ export class KycService { missingCompletedSteps[0] === KycStepName.DFX_APPROVAL && (!kycStep || kycStep.name !== KycStepName.DFX_APPROVAL)) ) { - const approvalStep = userData.kycSteps.find((s) => s.name === KycStepName.DFX_APPROVAL); + const approvalStep = userData.kycSteps.find((s) => s.name === KycStepName.DFX_APPROVAL && s.isOnHold); if (approvalStep?.isOnHold) { await this.kycStepRepo.update(...approvalStep.manualReview()); - } else if (!approvalStep) { + } else if (!approvalStep && !userData.kycSteps.find((s) => s.name === KycStepName.DFX_APPROVAL && s.isInReview)) { const newStep = await this.initiateStep(userData, KycStepName.DFX_APPROVAL).catch((e) => { if (e.message.includes('Cannot insert duplicate key')) return this.kycStepRepo.findOneBy({ @@ -1101,7 +1101,6 @@ export class KycService { kycHash?: string, type?: KycStepType, sequence?: number, - restartCompletedSteps = false, ): Promise<{ user: UserData; step: KycStep }> { user = user ?? (await this.getUser(kycHash)); @@ -1110,7 +1109,7 @@ export class KycService { ? user.getStepsWith(name, type, sequence)[0] : user .getStepsWith(name, type) - .find((s) => s.isInProgress || s.isInReview || (!restartCompletedSteps && s.isCompleted)); + .find((s) => s.isInProgress || s.isInReview || (!KycStepCancelable.includes(name) && s.isCompleted)); if (!step) { step = await this.initiateStep(user, name, type, true); user.kycSteps.push(step); @@ -1130,7 +1129,7 @@ export class KycService { const type = Object.values(KycStepType).find((t) => t.toLowerCase() === stepType?.toLowerCase()); if (!name) throw new BadRequestException('Invalid step name'); - const { user, step } = await this.getOrCreateStepInternal(name, undefined, kycHash, type, sequence, true); + const { user, step } = await this.getOrCreateStepInternal(name, undefined, kycHash, type, sequence); await this.verify2faIfRequired(user, ip);