Skip to content

Feat/534 multi currency display - #568

Open
CHKM001 wants to merge 3 commits into
Neurowealth:mainfrom
CHKM001:feat/534-multi-currency-display
Open

CHKM001 wants to merge 3 commits into
Neurowealth:mainfrom
CHKM001:feat/534-multi-currency-display

Conversation

@CHKM001

@CHKM001 CHKM001 commented Sep 30, 2026

Copy link
Copy Markdown

PR #534 Multi-Currency Portfolio Display & Accounting

Summary

Adds user-preferred display currency with additive displayAmount/displayCurrency fields on portfolio and goals responses. Strictly presentation layer — all internal accounting stays USD/token-native.

What's Included

Data Model

  • User.displayCurrency field (default: "USD") + migration with rollback

FX Utility (src/utils/fxConvert.ts)

  • Static rate table for 15 major currencies
  • convertUsdToCurrency() — returns null when rate unavailable (graceful degradation)
  • withDisplayCurrency() — attaches display fields without replacing canonical USD amount
  • Display rounding to 2 decimal places; canonical figures keep full precision

Settings Endpoint (src/routes/settings.ts)

  • PUT /api/v1/settings — update displayCurrency
  • Validates against supported currency list

Updated Responses

  • GET /api/v1/portfolio/:userId — adds displayTotalBalance, displayTotalEarnings, displayCurrency
  • GET /api/v1/goals/:id/progress — adds displayTargetAmount, displayCurrentAmount, displayCurrency

API Changes

PUT /api/v1/settings

// Request
{ "displayCurrency": "EUR" }

// Response
{ "userId": "...", "displayCurrency": "EUR" }

GET /api/v1/portfolio/:userId (response additions)

{
  "totalBalance": 10000,
  "displayTotalBalance": 9200,
  "displayTotalEarnings": 500,
  "displayCurrency": "EUR"
}

Key Design Decisions

  1. Additive only: amountUsd is never removed or replaced — it stays the source of truth
  2. Graceful degradation: When FX unavailable, displayAmount is omitted; amountUsd always present
  3. No stale caching: Every response converts fresh at request time
  4. Display vs tax currency: Display currency is presentation-only; tax reports use jurisdiction-native currency per Per-Jurisdiction Tax Profiles & Configurable Rule Sets #356
  5. Historical figures: Converted at current rate, clearly documented as such

Supported Currencies

USD, EUR, GBP, JPY, CAD, AUD, CHF, CNY, INR, BRL, MXN, SGD, HKD, KRW

Test Results

  • tests/unit/utils/fxConvert.test.ts — 10 tests covering conversion, rounding, graceful degradation, and field attachment

Documentation

  • docs/MULTI_CURRENCY.md — full documentation including display vs tax currency distinction

Closes #534

…dating Credit Line)

- CollateralLoan model + migration with partial unique index (one active loan per position)
- Origination endpoint with conservative LTV cap, collateral lock, and approval-workflow co-signing
- Interest accrual job (simple rate: underlying borrowApy + platform spread)
- Liquidation monitor (hourly + circuit-breaker-triggered out-of-cycle) with partial-liquidation executor
- Repayment endpoint with proportional collateral unlock
- Bad debt recording for underwater liquidations
- docs/LENDING.md + openapi.yaml updates
- 120 unit tests green
- ProtectionFundBalance, ProtectionFundContribution, CoverageEvent, CoverageClaim models + migration
- Revenue-skim contribution wiring (config-driven, off by default)
- Coverage-event declaration workflow with dual-review requirement
- Automatic per-user claim computation from position history
- Pro-rated payout logic with fund-balance awareness
- minHoldDurationForCoverage anti-gaming protection
- Public status + per-user coverage endpoints
- docs/PROTECTION_FUND.md with coverage terms and exclusions
- Unit tests for service layer
- User.displayCurrency field + migration (defaults to USD)
- src/utils/fxConvert.ts with static rate table and graceful degradation
- PUT /api/v1/settings endpoint for updating display currency
- Portfolio responses gain displayTotalBalance/displayTotalEarnings/displayCurrency
- Graceful omission when FX rate unavailable; amountUsd always present
- docs/MULTI_CURRENCY.md clarifying display vs tax currency distinction
- Unit tests for FX conversion utility
@drips-wave

drips-wave Bot commented Sep 30, 2026

Copy link
Copy Markdown

@CHKM001 Great news! 🎉 Based on an automated assessment of this PR, the linked Wave issue(s) no longer count against your application limits.

You can now already apply to more issues while waiting for a review of this PR. Keep up the great work! 🚀

Learn more about application limits

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.

Multi-Currency Portfolio Display & Accounting

1 participant