diff --git a/src/config/config.ts b/src/config/config.ts index 648a3c851e..80bbb1ab88 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -271,6 +271,11 @@ export class Configuration { customAddresses: process.env.CUSTOM_BALANCE_ADDRESSES?.split(';') ?? [], }; + liqManagement = { + minLiqAmount: 60000, + maxLiqAmount: 500000, + }; + payment = { timeoutDelay: +(process.env.PAYMENT_TIMEOUT_DELAY ?? 0), evmSeed: process.env.PAYMENT_EVM_SEED, diff --git a/src/subdomains/supporting/fiat-output/fiat-output.service.ts b/src/subdomains/supporting/fiat-output/fiat-output.service.ts index f11e1b3787..7eb6266126 100644 --- a/src/subdomains/supporting/fiat-output/fiat-output.service.ts +++ b/src/subdomains/supporting/fiat-output/fiat-output.service.ts @@ -128,6 +128,14 @@ export class FiatOutputService { .getOne(); } + async getUncompletedFiatOutputs(): Promise { + return this.fiatOutputRepo.findBy({ isComplete: false }); + } + + async getLastFiatOutput(type: string): Promise { + return this.fiatOutputRepo.findOne({ where: { type }, order: { id: 'DESC' } }); + } + private async getMatchingBankTx(entity: FiatOutput): Promise { if (!entity.remittanceInfo) return undefined; diff --git a/src/subdomains/supporting/log/log-job.module.ts b/src/subdomains/supporting/log/log-job.module.ts index 62cdef3c40..6cfa2c974d 100644 --- a/src/subdomains/supporting/log/log-job.module.ts +++ b/src/subdomains/supporting/log/log-job.module.ts @@ -9,10 +9,11 @@ import { SellCryptoModule } from 'src/subdomains/core/sell-crypto/sell-crypto.mo import { TradingModule } from 'src/subdomains/core/trading/trading.module'; import { BankTxModule } from '../bank-tx/bank-tx.module'; import { BankModule } from '../bank/bank.module'; +import { FiatOutputModule } from '../fiat-output/fiat-output.module'; import { PayInModule } from '../payin/payin.module'; +import { PayoutModule } from '../payout/payout.module'; import { LogJobService } from './log-job.service'; import { LogModule } from './log.module'; -import { PayoutModule } from '../payout/payout.module'; @Module({ imports: [ @@ -29,6 +30,7 @@ import { PayoutModule } from '../payout/payout.module'; BlockchainModule, ReferralModule, PayoutModule, + FiatOutputModule, ], controllers: [], providers: [LogJobService], diff --git a/src/subdomains/supporting/log/log-job.service.ts b/src/subdomains/supporting/log/log-job.service.ts index a6a1016dcc..9548692fda 100644 --- a/src/subdomains/supporting/log/log-job.service.ts +++ b/src/subdomains/supporting/log/log-job.service.ts @@ -35,6 +35,7 @@ import { BankTx, BankTxIndicator, BankTxType } from '../bank-tx/bank-tx/entities import { BankTxService } from '../bank-tx/bank-tx/services/bank-tx.service'; import { BankService } from '../bank/bank/bank.service'; import { IbanBankName } from '../bank/bank/dto/bank.dto'; +import { FiatOutputService } from '../fiat-output/fiat-output.service'; import { CryptoInput } from '../payin/entities/crypto-input.entity'; import { PayInService } from '../payin/services/payin.service'; import { PayoutOrder, PayoutOrderContext } from '../payout/entities/payout-order.entity'; @@ -73,6 +74,7 @@ export class LogJobService { private readonly refRewardService: RefRewardService, private readonly tradingOrderService: TradingOrderService, private readonly payoutService: PayoutService, + private readonly fiatOutputService: FiatOutputService, ) {} @Cron(CronExpression.EVERY_MINUTE) @@ -89,6 +91,9 @@ export class LogJobService { // asset log const assetLog = await this.getAssetLog(assets); + // liq management + await this.liqManagement(assets, assetLog); + // balances grouped by financialType const balancesByFinancialType = this.getBalancesByFinancialType(assets, assetLog); @@ -477,6 +482,48 @@ export class LogJobService { }, {}); } + private async liqManagement(assets: Asset[], assetLog: AssetLog): Promise { + const liqManagementAssets = assets.filter( + (a) => (a.blockchain as string) === 'MaerkiBaumann' && a.dexName !== 'USD', + ); + + const uncompletedFiatOutputs = await this.fiatOutputService.getUncompletedFiatOutputs(); + + for (const asset of liqManagementAssets) { + const log = assetLog[asset.id]; + const accountIban = asset.dexName === 'EUR' ? 'CH6808573177975201814' : 'CH3408573177975200001'; + const iban = asset.dexName === 'EUR' ? 'LI29088110104623K003E' : 'LI67088110104623K002C'; + const fiatOutputAmount = Util.sumObjValue( + uncompletedFiatOutputs.filter((f) => f.accountIban === accountIban), + 'amount', + ); + const currentLiq = (log.plusBalance.liquidity ?? 0) - log.minusBalance.total - fiatOutputAmount; + + if (currentLiq > Config.liqManagement.minLiqAmount && currentLiq < Config.liqManagement.maxLiqAmount) { + const entityId = await this.fiatOutputService + .getLastFiatOutput('LiqManagement') + .then((f) => f.originEntityId + 1); + const valutaDate = new Date(); + valutaDate.setHours(0, 0, 0, 0); + + await this.fiatOutputService.create({ + type: 'LiqManagement', + originEntityId: entityId, + amount: 9500, + currency: asset.dexName, + name: 'Payward Trading Ltd.', + address: '2429, Wickhams Cay II', + city: 'Tortola, VG1110, British Virgin Islands', + remittanceInfo: `AA46 N84G V443 TDXA DFX-Pay-${entityId}`, + accountIban, + iban, + bic: 'BFRILI22XXX', + valutaDate, + }); + } + } + } + private async getChangeLog(): Promise { const firstDayOfMonth = Util.firstDayOfMonth();