diff --git a/src/config/chains.config.ts b/src/config/chains.config.ts index 17fd434be2..86ef8869b9 100644 --- a/src/config/chains.config.ts +++ b/src/config/chains.config.ts @@ -56,7 +56,11 @@ export const EVM_CHAINS = { }, citreaTestnet: { chainId: 5115, - gatewayUrl: 'https://rpc.testnet.citrea.xyz', + gatewayUrl: 'http://10.0.1.6:8085', + }, + citrea: { + chainId: 4114, + gatewayUrl: 'http://10.0.1.6:8085', }, } satisfies Record; diff --git a/src/config/config.ts b/src/config/config.ts index 73478a7f0e..a445dc34e9 100644 --- a/src/config/config.ts +++ b/src/config/config.ts @@ -797,6 +797,14 @@ export class Configuration { bscApiKey: process.env.ALCHEMY_API_KEY, gasPrice: process.env.BSC_GAS_PRICE, }, + citrea: { + ...EVM_CHAINS.citrea, + citreaGatewayUrl: EVM_CHAINS.citrea.gatewayUrl, + citreaChainId: EVM_CHAINS.citrea.chainId, + citreaWalletAddress: process.env.CITREA_WALLET_ADDRESS, + citreaWalletPrivateKey: process.env.CITREA_WALLET_PRIVATE_KEY, + citreaApiKey: process.env.CITREA_API_KEY, + }, citreaTestnet: { ...EVM_CHAINS.citreaTestnet, citreaTestnetGatewayUrl: EVM_CHAINS.citreaTestnet.gatewayUrl, diff --git a/src/integration/bank/services/iso20022.service.ts b/src/integration/bank/services/iso20022.service.ts index a232d633d7..cad6e14687 100644 --- a/src/integration/bank/services/iso20022.service.ts +++ b/src/integration/bank/services/iso20022.service.ts @@ -253,9 +253,6 @@ export class Iso20022Service { const bookingDate = bookingDateStr ? this.parseDate(bookingDateStr) : new Date(); const valueDate = valueDateStr ? this.parseDate(valueDateStr) : bookingDate; - // reference - const accountServiceRef = entry.NtryRef || entry.AcctSvcrRef || Util.createUniqueId(accountIban); - // transaction details const entryDtls = entry.NtryDtls; const txDtlsArray = Array.isArray(entryDtls) ? entryDtls : entryDtls ? [entryDtls] : []; @@ -298,6 +295,14 @@ export class Iso20022Service { remittanceInfo = entry.AddtlNtryInf; } + // reference - check transaction-level refs first (matches camt.054), then entry-level AcctSvcrRef + const accountServiceRef = + txDtls.Refs?.AcctSvcrRef || + txDtls.Refs?.TxId || + entry.AcctSvcrRef || + entry.NtryRef || + Util.createUniqueId(accountIban); + // end-to-end ID const endToEndId = txDtls.Refs?.EndToEndId || ''; diff --git a/src/integration/blockchain/bitcoin/services/__tests__/crypto.service.spec.ts b/src/integration/blockchain/bitcoin/services/__tests__/crypto.service.spec.ts index 9e7c5a491d..65813a1cde 100644 --- a/src/integration/blockchain/bitcoin/services/__tests__/crypto.service.spec.ts +++ b/src/integration/blockchain/bitcoin/services/__tests__/crypto.service.spec.ts @@ -132,6 +132,7 @@ describe('CryptoService', () => { Blockchain.BASE, Blockchain.GNOSIS, Blockchain.HAQQ, + Blockchain.CITREA, Blockchain.CITREA_TESTNET, ]); }); diff --git a/src/integration/blockchain/shared/enums/blockchain.enum.ts b/src/integration/blockchain/shared/enums/blockchain.enum.ts index 1654284e84..4bedf2b868 100644 --- a/src/integration/blockchain/shared/enums/blockchain.enum.ts +++ b/src/integration/blockchain/shared/enums/blockchain.enum.ts @@ -20,6 +20,7 @@ export enum Blockchain { SOLANA = 'Solana', GNOSIS = 'Gnosis', TRON = 'Tron', + CITREA = 'Citrea', CITREA_TESTNET = 'CitreaTestnet', // Payment Provider diff --git a/src/integration/blockchain/shared/evm/__tests__/evm.util.spec.ts b/src/integration/blockchain/shared/evm/__tests__/evm.util.spec.ts index 915d5e3c43..1fa433f01f 100644 --- a/src/integration/blockchain/shared/evm/__tests__/evm.util.spec.ts +++ b/src/integration/blockchain/shared/evm/__tests__/evm.util.spec.ts @@ -15,6 +15,7 @@ describe('EvmUtil', () => { base: { baseChainId: 8453 }, gnosis: { gnosisChainId: 100 }, bsc: { bscChainId: 56 }, + citrea: { citreaChainId: 4114 }, citreaTestnet: { citreaTestnetChainId: 5115 }, }, }; diff --git a/src/integration/blockchain/shared/evm/evm.util.ts b/src/integration/blockchain/shared/evm/evm.util.ts index 42fe1c77b6..149b749fde 100644 --- a/src/integration/blockchain/shared/evm/evm.util.ts +++ b/src/integration/blockchain/shared/evm/evm.util.ts @@ -35,6 +35,7 @@ export class EvmUtil { [Blockchain.BASE, this.blockchainConfig.base.baseChainId], [Blockchain.GNOSIS, this.blockchainConfig.gnosis.gnosisChainId], [Blockchain.BINANCE_SMART_CHAIN, this.blockchainConfig.bsc.bscChainId], + [Blockchain.CITREA, this.blockchainConfig.citrea.citreaChainId], [Blockchain.CITREA_TESTNET, this.blockchainConfig.citreaTestnet.citreaTestnetChainId], ]); diff --git a/src/integration/blockchain/shared/services/crypto.service.ts b/src/integration/blockchain/shared/services/crypto.service.ts index 8691cdb491..ef050fe1e1 100644 --- a/src/integration/blockchain/shared/services/crypto.service.ts +++ b/src/integration/blockchain/shared/services/crypto.service.ts @@ -77,6 +77,7 @@ export class CryptoService { case Blockchain.GNOSIS: case Blockchain.HAQQ: case Blockchain.BINANCE_SMART_CHAIN: + case Blockchain.CITREA: case Blockchain.CITREA_TESTNET: return EvmUtil.getPaymentRequest(address, asset, amount); @@ -125,6 +126,7 @@ export class CryptoService { case Blockchain.BASE: case Blockchain.GNOSIS: case Blockchain.HAQQ: + case Blockchain.CITREA: case Blockchain.CITREA_TESTNET: return UserAddressType.EVM; diff --git a/src/integration/blockchain/shared/util/blockchain.util.ts b/src/integration/blockchain/shared/util/blockchain.util.ts index 8d879de52b..7a3f46e4d1 100644 --- a/src/integration/blockchain/shared/util/blockchain.util.ts +++ b/src/integration/blockchain/shared/util/blockchain.util.ts @@ -14,6 +14,7 @@ export const EvmBlockchains = [ Blockchain.BASE, Blockchain.GNOSIS, Blockchain.HAQQ, + Blockchain.CITREA, Blockchain.CITREA_TESTNET, ]; @@ -79,6 +80,7 @@ const BlockchainExplorerUrls: { [b in Blockchain]: string } = { [Blockchain.GNOSIS]: 'https://gnosisscan.io', [Blockchain.SOLANA]: 'https://solscan.io', [Blockchain.TRON]: 'https://tronscan.org/#', + [Blockchain.CITREA]: 'https://citreascan.com', [Blockchain.CITREA_TESTNET]: 'https://testnet.citreascan.com', [Blockchain.HAQQ]: 'https://explorer.haqq.network', [Blockchain.LIQUID]: 'https://blockstream.info/liquid', @@ -115,6 +117,7 @@ const TxPaths: { [b in Blockchain]: string } = { [Blockchain.GNOSIS]: 'tx', [Blockchain.SOLANA]: 'tx', [Blockchain.TRON]: 'transaction', + [Blockchain.CITREA]: 'tx', [Blockchain.CITREA_TESTNET]: 'tx', [Blockchain.HAQQ]: 'tx', [Blockchain.LIQUID]: 'tx', @@ -154,6 +157,7 @@ function assetPaths(asset: Asset): string | undefined { case Blockchain.POLYGON: case Blockchain.BASE: case Blockchain.GNOSIS: + case Blockchain.CITREA: case Blockchain.CITREA_TESTNET: case Blockchain.SOLANA: case Blockchain.HAQQ: @@ -181,6 +185,7 @@ function addressPaths(blockchain: Blockchain): string | undefined { case Blockchain.POLYGON: case Blockchain.BASE: case Blockchain.GNOSIS: + case Blockchain.CITREA: case Blockchain.CITREA_TESTNET: case Blockchain.TRON: case Blockchain.HAQQ: diff --git a/src/integration/exchange/services/__tests__/exchange.test.ts b/src/integration/exchange/services/__tests__/exchange.test.ts index cada645b5c..5a06c52011 100644 --- a/src/integration/exchange/services/__tests__/exchange.test.ts +++ b/src/integration/exchange/services/__tests__/exchange.test.ts @@ -36,6 +36,7 @@ export class TestExchangeService extends ExchangeService { KucoinPay: undefined, Solana: undefined, Tron: undefined, + Citrea: undefined, CitreaTestnet: undefined, Kraken: undefined, Binance: undefined, diff --git a/src/integration/exchange/services/binance.service.ts b/src/integration/exchange/services/binance.service.ts index 73ca59ccae..9aeb37ea7b 100644 --- a/src/integration/exchange/services/binance.service.ts +++ b/src/integration/exchange/services/binance.service.ts @@ -33,6 +33,7 @@ export class BinanceService extends ExchangeService { KucoinPay: undefined, Solana: 'SOL', Tron: 'TRX', + Citrea: undefined, CitreaTestnet: undefined, Kraken: undefined, Binance: undefined, diff --git a/src/integration/exchange/services/bitstamp.service.ts b/src/integration/exchange/services/bitstamp.service.ts index 5f7949b42f..514d32b55b 100644 --- a/src/integration/exchange/services/bitstamp.service.ts +++ b/src/integration/exchange/services/bitstamp.service.ts @@ -33,6 +33,7 @@ export class BitstampService extends ExchangeService { KucoinPay: undefined, Solana: undefined, Tron: undefined, + Citrea: undefined, CitreaTestnet: undefined, Kraken: undefined, Binance: undefined, diff --git a/src/integration/exchange/services/kraken.service.ts b/src/integration/exchange/services/kraken.service.ts index dc846f3c2a..97c08470a6 100644 --- a/src/integration/exchange/services/kraken.service.ts +++ b/src/integration/exchange/services/kraken.service.ts @@ -40,6 +40,7 @@ export class KrakenService extends ExchangeService { KucoinPay: undefined, Solana: false, Tron: undefined, + Citrea: undefined, CitreaTestnet: undefined, Kraken: undefined, Binance: undefined, diff --git a/src/integration/exchange/services/kucoin.service.ts b/src/integration/exchange/services/kucoin.service.ts index 4ec4a24b55..ce720a22e0 100644 --- a/src/integration/exchange/services/kucoin.service.ts +++ b/src/integration/exchange/services/kucoin.service.ts @@ -33,6 +33,7 @@ export class KucoinService extends ExchangeService { KucoinPay: undefined, Solana: undefined, Tron: undefined, + Citrea: undefined, CitreaTestnet: undefined, Kraken: undefined, Binance: undefined, diff --git a/src/integration/exchange/services/mexc.service.ts b/src/integration/exchange/services/mexc.service.ts index d2bbf65fe4..06d72769aa 100644 --- a/src/integration/exchange/services/mexc.service.ts +++ b/src/integration/exchange/services/mexc.service.ts @@ -37,6 +37,7 @@ export class MexcService extends ExchangeService { KucoinPay: undefined, Solana: 'SOL', Tron: 'TRX', + Citrea: undefined, CitreaTestnet: undefined, Kraken: undefined, Binance: undefined, diff --git a/src/integration/exchange/services/xt.service.ts b/src/integration/exchange/services/xt.service.ts index fb06b93f00..ea1bf5f47e 100644 --- a/src/integration/exchange/services/xt.service.ts +++ b/src/integration/exchange/services/xt.service.ts @@ -33,6 +33,7 @@ export class XtService extends ExchangeService { KucoinPay: undefined, Solana: undefined, Tron: undefined, + Citrea: undefined, CitreaTestnet: undefined, Kraken: undefined, Binance: undefined, diff --git a/src/shared/models/asset/asset.service.ts b/src/shared/models/asset/asset.service.ts index 79f1c28715..5a36cc9aae 100644 --- a/src/shared/models/asset/asset.service.ts +++ b/src/shared/models/asset/asset.service.ts @@ -229,6 +229,14 @@ export class AssetService { }); } + async getCitreaCoin(): Promise { + return this.getAssetByQuery({ + name: 'cBTC', + blockchain: Blockchain.CITREA, + type: AssetType.COIN, + }); + } + async getCitreaTestnetCoin(): Promise { return this.getAssetByQuery({ name: 'cBTC', diff --git a/src/subdomains/core/custody/services/custody-order.service.ts b/src/subdomains/core/custody/services/custody-order.service.ts index 5eba45ff65..8b6c3569c5 100644 --- a/src/subdomains/core/custody/services/custody-order.service.ts +++ b/src/subdomains/core/custody/services/custody-order.service.ts @@ -37,7 +37,7 @@ import { CustodyService } from './custody.service'; @Injectable() export class CustodyOrderService { - private readonly CustodyChains = [Blockchain.ETHEREUM]; + private readonly CustodyChains = [Blockchain.ETHEREUM, Blockchain.CITREA]; constructor( private readonly userService: UserService, diff --git a/src/subdomains/core/history/controllers/transaction.controller.ts b/src/subdomains/core/history/controllers/transaction.controller.ts index f59d90d8bd..6b050012df 100644 --- a/src/subdomains/core/history/controllers/transaction.controller.ts +++ b/src/subdomains/core/history/controllers/transaction.controller.ts @@ -46,6 +46,7 @@ import { BankService } from 'src/subdomains/supporting/bank/bank/bank.service'; import { CardBankName } from 'src/subdomains/supporting/bank/bank/dto/bank.dto'; import { VirtualIbanService } from 'src/subdomains/supporting/bank/virtual-iban/virtual-iban.service'; import { PayInType } from 'src/subdomains/supporting/payin/entities/crypto-input.entity'; +import { FiatPaymentMethod } from 'src/subdomains/supporting/payment/dto/payment-method.enum'; import { TxStatementType } from 'src/subdomains/supporting/payment/dto/transaction-helper/tx-statement-details.dto'; import { TransactionRequest } from 'src/subdomains/supporting/payment/entities/transaction-request.entity'; import { Transaction, TransactionTypeInternal } from 'src/subdomains/supporting/payment/entities/transaction.entity'; @@ -436,6 +437,51 @@ export class TransactionController { @ApiOkResponse({ type: PdfDto }) async generateInvoiceFromTransaction(@GetJwt() jwt: JwtPayload, @Param('id') id: string): Promise { const txIdOrUid = isNaN(+id) ? id : +id; + + // For string UIDs, first try to find a TransactionRequest (for pending transactions) + if (typeof txIdOrUid === 'string') { + const request = await this.transactionRequestService.getTransactionRequestByUid(txIdOrUid, { + user: { userData: { organization: true }, wallet: true }, + }); + + if (request) { + // Validate ownership and state + if (request.user.userData.id !== jwt.account) throw new ForbiddenException('Not your transaction request'); + if (!request.userData.isDataComplete) throw new BadRequestException('User data is not complete'); + if (!request.isValid) throw new BadRequestException('Transaction request is not valid'); + + // Generate invoice from request (pending transaction) + const currency = await this.fiatService.getFiat(request.sourceId); + if (!Config.invoice.currencies.includes(currency.name)) { + throw new Error('PDF invoice is only available for CHF and EUR transactions'); + } + + const buy = await this.buyService.get(jwt.account, request.routeId); + const bankInfo = await this.buyService.getBankInfo( + { + amount: request.amount, + currency: currency.name, + paymentMethod: request.sourcePaymentMethod as FiatPaymentMethod, + userData: request.userData, + }, + buy, + buy?.asset, + buy?.user?.wallet, + ); + + return { + pdfData: await this.swissQrService.createInvoiceFromRequest( + request.amount, + currency.name, + bankInfo.reference, + bankInfo, + request, + ), + }; + } + } + + // Try to find a completed Transaction const txStatementDetails = await this.transactionHelper.getTxStatementDetails( jwt.account, txIdOrUid, diff --git a/src/subdomains/core/liquidity-management/adapters/balances/blockchain.adapter.ts b/src/subdomains/core/liquidity-management/adapters/balances/blockchain.adapter.ts index 712f876f45..d7106efc6d 100644 --- a/src/subdomains/core/liquidity-management/adapters/balances/blockchain.adapter.ts +++ b/src/subdomains/core/liquidity-management/adapters/balances/blockchain.adapter.ts @@ -113,6 +113,7 @@ export class BlockchainAdapter implements LiquidityBalanceIntegration { case Blockchain.BASE: case Blockchain.GNOSIS: case Blockchain.BINANCE_SMART_CHAIN: + case Blockchain.CITREA: case Blockchain.CITREA_TESTNET: await this.updateEvmBalance(assets); break; diff --git a/src/subdomains/core/referral/reward/services/ref-reward.service.ts b/src/subdomains/core/referral/reward/services/ref-reward.service.ts index 81cd63b810..79c816d167 100644 --- a/src/subdomains/core/referral/reward/services/ref-reward.service.ts +++ b/src/subdomains/core/referral/reward/services/ref-reward.service.ts @@ -45,6 +45,7 @@ const PayoutLimits: { [k in Blockchain]: number } = { [Blockchain.KUCOIN_PAY]: undefined, [Blockchain.GNOSIS]: undefined, [Blockchain.TRON]: undefined, + [Blockchain.CITREA]: undefined, [Blockchain.CITREA_TESTNET]: undefined, [Blockchain.KRAKEN]: undefined, [Blockchain.BINANCE]: undefined, diff --git a/src/subdomains/supporting/payment/dto/transaction-helper/tx-statement-details.dto.ts b/src/subdomains/supporting/payment/dto/transaction-helper/tx-statement-details.dto.ts index a7e5098271..10e65fee78 100644 --- a/src/subdomains/supporting/payment/dto/transaction-helper/tx-statement-details.dto.ts +++ b/src/subdomains/supporting/payment/dto/transaction-helper/tx-statement-details.dto.ts @@ -1,4 +1,5 @@ import { BankInfoDto } from 'src/subdomains/core/buy-crypto/routes/buy/dto/buy-payment-info.dto'; +import { TransactionRequest } from '../../entities/transaction-request.entity'; import { Transaction } from '../../entities/transaction.entity'; import { TransactionType } from '../transaction.dto'; @@ -14,4 +15,5 @@ export interface TxStatementDetails { currency: string; bankInfo?: BankInfoDto; reference?: string; + request?: TransactionRequest; } diff --git a/src/subdomains/supporting/payment/services/swiss-qr.service.ts b/src/subdomains/supporting/payment/services/swiss-qr.service.ts index 35dc122690..8a99487818 100644 --- a/src/subdomains/supporting/payment/services/swiss-qr.service.ts +++ b/src/subdomains/supporting/payment/services/swiss-qr.service.ts @@ -81,7 +81,7 @@ export class SwissQRService { } async createTxStatement( - { statementType, transactionType, transaction, currency, bankInfo, reference }: TxStatementDetails, + { statementType, transactionType, transaction, currency, bankInfo, reference, request }: TxStatementDetails, brand: PdfBrand = PdfBrand.DFX, ): Promise { const debtor = this.getDebtor(transaction.userData); @@ -94,14 +94,15 @@ export class SwissQRService { const userLanguage = transaction.userData.language.symbol.toUpperCase(); const language = this.isSupportedInvoiceLanguage(userLanguage) ? userLanguage : 'EN'; - const tableData = await this.getTableData(statementType, transactionType, transaction, currency); + const tableData = await this.getTableData(statementType, transactionType, transaction, currency, request); const defaultCreditor = brand === PdfBrand.REALUNIT ? this.realunitCreditor() : this.dfxCreditor(); + const amount = request?.amount ?? transaction.buyCrypto?.inputAmount; const billData: QrBillData = { creditor: (bankInfo && this.getCreditor(bankInfo)) || (defaultCreditor as unknown as Creditor), debtor, currency, - amount: bankInfo && transaction.buyCrypto?.inputAmount, + amount: bankInfo && amount, message: reference, }; @@ -396,6 +397,7 @@ export class SwissQRService { statementType: TxStatementType, transactionType: TransactionType, transaction: Transaction, + request?: TransactionRequest, ): string { let titleKey: string; @@ -407,8 +409,10 @@ export class SwissQRService { titleKey = 'invoice.title'; } + const invoiceId = request?.id ?? transaction.id; + return this.translate(titleKey, transaction.userData.language.symbol.toLowerCase(), { - invoiceId: transaction.id, + invoiceId, }); } @@ -453,14 +457,30 @@ export class SwissQRService { transactionType: TransactionType, transaction: Transaction, currency: string, + request?: TransactionRequest, ): Promise { const titleAndDate = { - title: this.getStatementTitle(statementType, transactionType, transaction), + title: this.getStatementTitle(statementType, transactionType, transaction, request), date: this.getStatementDate(statementType, transaction), }; switch (transactionType) { case TransactionType.BUY: { + // Handle pending transactions with request data + if (request) { + const asset = await this.assetService.getAssetById(request.targetId); + return { + quantity: request.estimatedAmount, + description: { + assetDescription: asset.description ?? asset.name, + assetName: asset.name, + assetBlockchain: asset.blockchain, + }, + fiatAmount: request.amount, + ...titleAndDate, + }; + } + const outputAsset = transaction.buyCrypto?.outputAsset; return { diff --git a/src/subdomains/supporting/payment/services/transaction-helper.ts b/src/subdomains/supporting/payment/services/transaction-helper.ts index 1dd035d634..8d58aac16f 100644 --- a/src/subdomains/supporting/payment/services/transaction-helper.ts +++ b/src/subdomains/supporting/payment/services/transaction-helper.ts @@ -47,6 +47,7 @@ import { TxStatementDetails, TxStatementType } from '../dto/transaction-helper/t import { TransactionType } from '../dto/transaction.dto'; import { TransactionDirection, TransactionSpecification } from '../entities/transaction-specification.entity'; import { TransactionSpecificationRepository } from '../repositories/transaction-specification.repository'; +import { Transaction } from '../entities/transaction.entity'; import { TransactionService } from './transaction.service'; @Injectable() @@ -501,6 +502,7 @@ export class TransactionHelper implements OnModuleInit { buyCrypto: { buy: { user: { wallet: true } }, cryptoRoute: true, cryptoInput: true }, buyFiat: { sell: true, cryptoInput: true }, refReward: { user: { userData: true } }, + request: true, }; const transaction = @@ -508,12 +510,20 @@ export class TransactionHelper implements OnModuleInit { ? await this.transactionService.getTransactionById(txIdOrUid, relations) : await this.transactionService.getTransactionByUid(txIdOrUid, relations); - if (!transaction || !transaction.targetEntity || transaction.targetEntity instanceof BankTxReturn) - throw new BadRequestException('Transaction not found'); + if (!transaction) throw new BadRequestException('Transaction not found'); if (!transaction.userData.isDataComplete) throw new BadRequestException('User data is not complete'); + if (transaction.userData.id !== userDataId) throw new ForbiddenException('Not your transaction'); + + // Handle pending transactions (no targetEntity yet, but has request) + if (!transaction.targetEntity || transaction.targetEntity instanceof BankTxReturn) { + if (statementType === TxStatementType.RECEIPT) + throw new BadRequestException('Receipt not available for pending transactions'); + if (!transaction.request) throw new BadRequestException('Transaction not found'); + return this.getTxStatementDetailsFromRequest(transaction, statementType); + } + if (statementType === TxStatementType.RECEIPT && !transaction.targetEntity.isComplete) throw new BadRequestException('Transaction not completed'); - if (transaction.userData.id !== userDataId) throw new ForbiddenException('Not your transaction'); if (transaction.buyCrypto && !transaction.buyCrypto.isCryptoCryptoTransaction) { const fiat = await this.fiatService.getFiatByName(transaction.buyCrypto.inputAsset); @@ -572,6 +582,38 @@ export class TransactionHelper implements OnModuleInit { throw new BadRequestException('Transaction type not supported for invoice generation'); } + private async getTxStatementDetailsFromRequest( + transaction: Transaction, + statementType: TxStatementType, + ): Promise { + const request = transaction.request; + if (!request.isValid) throw new BadRequestException('Transaction request is not valid'); + + const currency = await this.fiatService.getFiat(request.sourceId); + const buy = await this.buyService.get(transaction.userData.id, request.routeId); + const bankInfo = await this.buyService.getBankInfo( + { + amount: request.amount, + currency: currency.name, + paymentMethod: request.sourcePaymentMethod as FiatPaymentMethod, + userData: transaction.userData, + }, + buy, + buy?.asset, + buy?.user?.wallet, + ); + + return { + statementType, + transactionType: TransactionType.BUY, + transaction, + currency: currency.name, + bankInfo, + reference: bankInfo?.reference, + request, + }; + } + async getRefundActive(refundEntity: BankTx | BuyCrypto | BuyFiat | BankTxReturn): Promise { if (refundEntity instanceof BankTxReturn) return this.fiatService.getFiatByName(refundEntity.bankTx.currency); if (refundEntity instanceof BankTx) return this.fiatService.getFiatByName(refundEntity.currency); diff --git a/src/subdomains/supporting/realunit/__tests__/realunit-dev.service.spec.ts b/src/subdomains/supporting/realunit/__tests__/realunit-dev.service.spec.ts index 6df4881e3e..78658278bb 100644 --- a/src/subdomains/supporting/realunit/__tests__/realunit-dev.service.spec.ts +++ b/src/subdomains/supporting/realunit/__tests__/realunit-dev.service.spec.ts @@ -37,6 +37,7 @@ jest.mock('src/config/config', () => ({ base: { baseChainId: 8453 }, gnosis: { gnosisChainId: 100 }, bsc: { bscChainId: 56 }, + citrea: { citreaChainId: 4114 }, citreaTestnet: { citreaTestnetChainId: 5115 }, }, payment: {