Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ export class BuyController {
userId,
FiatPaymentMethod.BANK,
CryptoPaymentMethod.CRYPTO,
TransactionHelper.getDefaultBankByPaymentMethod(FiatPaymentMethod.BANK),
await this.transactionHelper.getDefaultBank(FiatPaymentMethod.BANK, 'EUR'),
undefined,
await this.fiatService.getFiatByName('EUR'),
buy.asset,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { createDefaultUserData } from 'src/subdomains/generic/user/models/user-d
import { WalletService } from 'src/subdomains/generic/user/models/wallet/wallet.service';
import { createDefaultBankTx } from 'src/subdomains/supporting/bank-tx/bank-tx/__mocks__/bank-tx.entity.mock';
import { CardBankName, IbanBankName } from 'src/subdomains/supporting/bank/bank/dto/bank.dto';
import { BankService } from 'src/subdomains/supporting/bank/bank/bank.service';
import { createDefaultCheckoutTx } from 'src/subdomains/supporting/fiat-payin/__mocks__/checkout-tx.entity.mock';
import { createDefaultCryptoInput } from 'src/subdomains/supporting/payin/entities/__mocks__/crypto-input.entity.mock';
import {
Expand Down Expand Up @@ -46,6 +47,7 @@ describe('TransactionHelper', () => {
let buyService: BuyService;
let assetService: AssetService;
let countryService: CountryService;
let bankService: BankService;

beforeEach(async () => {
specRepo = createMock<TransactionSpecificationRepository>();
Expand All @@ -60,6 +62,7 @@ describe('TransactionHelper', () => {
buyService = createMock<BuyService>();
assetService = createMock<AssetService>();
countryService = createMock<CountryService>();
bankService = createMock<BankService>();

const module: TestingModule = await Test.createTestingModule({
imports: [TestSharedModule],
Expand All @@ -77,6 +80,7 @@ describe('TransactionHelper', () => {
{ provide: BuyService, useValue: buyService },
{ provide: AssetService, useValue: assetService },
{ provide: CountryService, useValue: countryService },
{ provide: BankService, useValue: bankService },
TestUtil.provideConfig(),
],
}).compile();
Expand Down
2 changes: 1 addition & 1 deletion src/subdomains/core/sell-crypto/route/sell.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -246,7 +246,7 @@ export class SellController {
CryptoPaymentMethod.CRYPTO,
FiatPaymentMethod.BANK,
undefined,
TransactionHelper.getDefaultBankByPaymentMethod(FiatPaymentMethod.BANK),
await this.transactionHelper.getDefaultBank(FiatPaymentMethod.BANK, sell.fiat.name),
await this.assetService.getNativeAsset(defaultBlockchain),
sell.fiat,
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ import { FeeService, UserFeeRequest } from 'src/subdomains/supporting/payment/se
import { Price } from 'src/subdomains/supporting/pricing/domain/entities/price';
import { BankTxReturn } from '../../bank-tx/bank-tx-return/bank-tx-return.entity';
import { BankTx } from '../../bank-tx/bank-tx/entities/bank-tx.entity';
import { BankService } from '../../bank/bank/bank.service';
import { CardBankName, IbanBankName } from '../../bank/bank/dto/bank.dto';
import { CryptoInput, PayInConfirmationType } from '../../payin/entities/crypto-input.entity';
import { PriceCurrency, PriceValidity, PricingService } from '../../pricing/services/pricing.service';
Expand Down Expand Up @@ -77,6 +78,7 @@ export class TransactionHelper implements OnModuleInit {
private readonly buyService: BuyService,
private readonly assetService: AssetService,
private readonly countryService: CountryService,
private readonly bankService: BankService,
) {}

onModuleInit() {
Expand Down Expand Up @@ -269,8 +271,8 @@ export class TransactionHelper implements OnModuleInit {
const chfPrice = await this.pricingService.getPrice(txAsset, PriceCurrency.CHF, PriceValidity.ANY);
const txAmountChf = chfPrice.convert(txAmount);

const bankIn = TransactionHelper.getDefaultBankByPaymentMethod(paymentMethodIn);
const bankOut = TransactionHelper.getDefaultBankByPaymentMethod(paymentMethodOut);
const bankIn = await this.getDefaultBank(paymentMethodIn, from.name);
const bankOut = await this.getDefaultBank(paymentMethodOut, isFiat(to) ? to.name : undefined);

const wallet = walletName ? await this.walletService.getByIdOrName(undefined, walletName) : undefined;

Expand Down Expand Up @@ -853,17 +855,20 @@ export class TransactionHelper implements OnModuleInit {

static getDefaultBankByPaymentMethod(paymentMethod: PaymentMethod): CardBankName | IbanBankName {
switch (paymentMethod) {
case FiatPaymentMethod.BANK:
return IbanBankName.YAPEAL;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This fix corrects the bank name, but getDefaultBankByPaymentMethod still uses a hardcoded constant while BankService.getBank(selector) dynamically matches the actual receiving bank from the DB. When the next EUR bank is added, this default will be stale again.

Could instead call bankService.getBank({ currency, paymentMethod }) for BANK and INSTANT cases — all the needed info (from/currency, paymentMethodIn) is already available at each call site. The CARD case would stay hardcoded since Checkout is a card processor, not a bank entity.

case FiatPaymentMethod.CARD:
return CardBankName.CHECKOUT;
case FiatPaymentMethod.INSTANT:
return IbanBankName.OLKY;
default:
return undefined;
}
}

async getDefaultBank(paymentMethod: PaymentMethod, currency: string): Promise<IbanBankName> {
if (![FiatPaymentMethod.BANK, FiatPaymentMethod.INSTANT].includes(paymentMethod as FiatPaymentMethod))
return undefined;
const bank = await this.bankService.getBank({ amount: 0, currency, paymentMethod: paymentMethod as FiatPaymentMethod });
return bank?.name as IbanBankName;
}

private async getSourceSpecs(from: Active, { fee, volume }: TxSpec, priceValidity: PriceValidity): Promise<TxSpec> {
const price = await this.pricingService.getPrice(from, PriceCurrency.CHF, priceValidity).then((p) => p.invert());

Expand Down
Loading