Skip to content

Conversation

@TaprootFreak
Copy link
Collaborator

Release Checklist

Pre-Release

  • Check migrations
    • No database related infos (sqldb-xxx)
    • Impact on GS (new/removed columns)
  • Check for linter errors (in PR)
  • Test basic user operations (on DFX services)
    • Login/logout
    • Buy/sell payment request
    • KYC page

Post-Release

  • Test basic user operations
  • Monitor application insights log

- KYC Level 20 is now sufficient for amounts up to 1000 CHF
- KYC Level 50 is still required for amounts above 1000 CHF
- EUR amounts are converted to CHF for the limit check
- Uses existing Config.tradingLimits.monthlyDefaultWoKyc threshold
…ion (#2772)

- KYC Level 20 is now sufficient for amounts up to 1000 CHF
- KYC Level 50 is still required for amounts above 1000 CHF
- EUR amounts are converted to CHF for the limit check
- RealUnit registration now sets KYC Level 20 when completed
- Added @ispositive validator to prevent zero/negative amounts
After signing in via email link, users are now redirected to /account
instead of /kyc, which provides a better default landing page for
authenticated users without specific KYC context.
TaprootFreak and others added 16 commits January 1, 2026 15:53
* Add vIBAN search to compliance endpoint

- Add VIBAN to ComplianceSearchType enum
- Extend support service to search in VirtualIban table
- Add search in BankTx.virtualIban column
- Include unassigned BankTx for vIBAN results

* [NOTASK] Refactoring

---------

Co-authored-by: Yannick1712 <52333989+Yannick1712@users.noreply.github.com>
Currently, emails display the URL link first, followed by the button.
This creates a poor user experience as most users can see buttons,
making the link redundant for the majority.

Changes:
- Reorder email content to show button first, then link
- Update all translations (de/en/pt) to reflect new order
- Add "or" prefix to link text to indicate it's a fallback option

Affected emails:
- Login email (auth.service.ts)
- KYC reminder, failed, and missing data emails (kyc-notification.service.ts)
- Account merge request email (account-merge.service.ts)

This improves UX by prioritizing the primary action (button) and
making the plain-text link available only for clients that don't
support buttons.
…ays (#2779)

* Add Liechtenstein bank holidays 2026 and prevent fiat output on holidays

- Add liechtenstein-bank-holiday.config.ts with 2026 holidays
- Update fiat-output-job.service to check for LI/CH bank holidays
- Block isReadyDate on bank holidays and day before after 16:00

* Restrict bank holiday check to LI IBANs only

- Bank holiday blocking now only applies to Liechtenstein IBANs
- CH and other IBANs are not affected by holiday checks
- Remove unused isBankHoliday import

* Restrict bank holiday check to LiqManagement type only

- Bank holiday blocking now only applies to FiatOutputs with type LiqManagement
- Other types (BuyFiat, BuyCryptoFail, etc.) are not affected

* Improve bank holiday check implementation

- Add verbose logging when FiatOutput is blocked due to bank holiday
- Use early return (continue) for better readability
- Only calculate isAfter16 when actually needed (performance)
- Clearer variable scoping and logic flow

* Address PR review comments

- Remove unused getLiechtensteinBankHolidayInfoBanner function and import
- Simplify holiday check: combine conditions with || operator
- Remove unnecessary intermediate variables (isLiIban, isLiqManagement, etc.)
- Use single logger.verbose message for bank holiday blocking

* [NOTASK] Refactoring

---------

Co-authored-by: Yannick1712 <52333989+Yannick1712@users.noreply.github.com>
…lation (#2785)

Two bugs were causing 'Failed to create deposit transaction: invalid address or ENS name':

1. In toPaymentInfoDto(): The transactionRequest only contained user: { id: userId }
   without the address field. Fixed by explicitly passing user.address.

2. In depositTx controller endpoint: getById() did not load the deposit relation,
   so route.deposit was undefined. Fixed by adding relations: { deposit: true }.

Also added validation to throw clear errors if address or deposit is missing.
- Add npm cache to GitHub Actions workflows (api-pr, api-dev, api-prd)
  for faster CI builds
- Add new npm scripts:
  - type-check: Run tsc --noEmit for type validation without build
  - format:check: Check formatting without modifying files
- Add forceConsistentCasingInFileNames to tsconfig.json
- Upgrade @typescript-eslint/no-floating-promises from warn to error
Enable users to sell and swap tokens without holding ETH for gas.
The backend relayer covers gas costs through MetaMask's delegation contract.

Changes:
- Add EIP7702DelegationService for gasless transaction preparation
- Add EIP-7702 delegation DTOs for frontend communication
- Add DELEGATION_TRANSFER PayInType enum value
- Update Sell/Swap services to detect zero-balance users
- Add depositTx endpoint to Swap controller (parity with Sell)
- Add ?includeTx parameter to Swap for optional TX data
- Improve gas estimation with fallback for EIP-7702 delegated addresses
- Use StaticJsonRpcProvider for better performance

Contracts:
- MetaMask Delegator: 0x63c0c19a282a1b52b07dd5a65b58948a07dae32b
- DelegationManager: 0xdb9B1e94B5b69Df7e401DDbedE43491141047dB3
Add isAvailable() check to PayInBitcoinService to prevent errors
when Bitcoin node is not configured (e.g., local development).
The BitcoinStrategy cron job and unconfirmed UTXO processing now
gracefully skip when the service is unavailable.
Return early from checkTransactions() if no Olky bank is found
in the database, preventing null pointer errors in local development.
- FrankencoinService: Skip processLogInfo when xchf contract not configured
- DEuroService: Skip processLogInfo when graphUrl not configured
- PaymentLinkFeeService: Skip updateFees in local environment

Prevents errors in local development when external services are not configured.
Log a warning when config is missing instead of silently skipping
or throwing errors. Simple and consistent approach.

Affected services:
- BitcoinStrategy: warns if Bitcoin node not configured
- PayInService: warns if Bitcoin service unavailable
- BankTxService: warns if Olky bank not found
- FrankencoinService: warns if xchf contract not configured
- DEuroService: warns if graphUrl not configured
* feat: create different exceptions for buy endpoint.

* chore: status codes.

* chore: comments.
* Log missing config warnings only once

Prevent log spam by tracking if warning was already logged.
Affects high-frequency cron jobs:
- BitcoinStrategy (every second)
- BankTxService (every 30 seconds)

* Skip services gracefully when dependencies are unavailable

- Add isAvailable() check to CheckoutService
- Add availability check to CheckoutObserver with warning-once pattern
- Add availability check to FiatPayInSyncService with warning-once pattern
- Change ExchangeTxService to warn-once on sync failures
- Add null check for client in TransactionHelper.getNetworkStartFee
- Add null check for client in LogJobService.getAssetLog
- Fix PaymentObserver to use optional chaining for outputDate

* Add missing null checks for graceful degradation

- Add null checks for client and targetAddress in PaymentBalanceService
- Also check for coin existence before setting balance
- Extend CheckoutService.isAvailable() to also check Config.checkout.entityId

* Make warning-once pattern consistent across all services

- Add warning-once with Set<Blockchain> to PaymentBalanceService
- Add warning-once with Set<Blockchain> to LogJobService
- Add warning-once with Set<Blockchain> to TransactionHelper

All services now consistently log warnings only once when
blockchain clients are not configured.

* Add readonly to syncWarningsLogged Set for consistency

* Add missing blank line after early return for consistency
* fix(swap): correct misleading includeTx default value

The controller always passes an explicit boolean via `includeTx === 'true'`,
so the service default was never used. Change from `true` to `false` to
accurately reflect the actual behavior (depositTx is only included when
explicitly requested via ?includeTx=true).

* fix(custody): pass explicit includeTx=false to swap service

Make custody order swap calls explicit about not including depositTx,
matching the pattern used for sell orders. This ensures the default
value change in swap.service.ts has no functional impact.

Affected calls:
- CustodyOrderType.SWAP
- CustodyOrderType.SEND
- CustodyOrderType.RECEIVE
Replace timing-based test with Promise-based synchronization.
The original test used setTimeout without delay causing race conditions.
The new test uses explicit Promise signaling for deterministic behavior.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants