diff --git a/.vscode/extensions.json b/.vscode/extensions.json index fde9874a2..68abade5f 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,8 +1,8 @@ { "recommendations": [ "angular.ng-template", + "esbenp.prettier-vscode", "firsttris.vscode-jest-runner", - "nrwl.angular-console", - "prettier.prettier-vscode" + "nrwl.angular-console" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index 36091af85..9bf4d12b5 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,4 +1,4 @@ { - "editor.defaultFormatter": "prettier.prettier-vscode", + "editor.defaultFormatter": "esbenp.prettier-vscode", "editor.formatOnSave": true } diff --git a/CHANGELOG.md b/CHANGELOG.md index 1773a62ed..9415e3dbd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,10 +11,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Migrated from _Material Design_ 2 to _Material Design_ 3 -## Unreleased +## 2.233.0 - 2026-01-23 ### Changed +- Deprecated `firstBuyDate` in favor of `dateOfFirstActivity` in the portfolio calculator +- Deprecated `transactionCount` in favor of `activitiesCount` in the portfolio calculator and service +- Removed the deprecated `firstBuyDate` from the endpoint `GET api/v1/portfolio/holding/:dataSource/:symbol` +- Refreshed the cryptocurrencies list +- Upgraded `prettier` from version `3.7.4` to `3.8.0` + +## 2.232.0 - 2026-01-19 + +### Added + +- Extended the analysis page to include the total amount, change and performance with currency effects (experimental) + +### Changed + +- Deprecated `firstBuyDate` in favor of `dateOfFirstActivity` in the endpoint `GET api/v1/portfolio/holding/:dataSource/:symbol` +- Improved the language localization for German (`de`) - Upgraded `countries-list` from version `3.2.0` to `3.2.2` ## 2.231.0 - 2026-01-17 diff --git a/README.md b/README.md index 8b6fe2296..03566b2dd 100644 --- a/README.md +++ b/README.md @@ -318,12 +318,9 @@ If you like to support this project, become a [**Sponsor**](https://github.com/s ## Sponsors
-

- Browser testing via
- - LambdaTest Logo - -

+ + TestMu AI Logo +
## Analytics diff --git a/apps/api/src/app/import/import.service.ts b/apps/api/src/app/import/import.service.ts index 3f8bd2cde..7e8e333b9 100644 --- a/apps/api/src/app/import/import.service.ts +++ b/apps/api/src/app/import/import.service.ts @@ -82,7 +82,7 @@ export class ImportService { filterBySymbol: symbol }); - const { firstBuyDate, historicalData } = holding; + const { dateOfFirstActivity, historicalData } = holding; const [{ accounts }, { activities }, [assetProfile], dividends] = await Promise.all([ @@ -95,7 +95,7 @@ export class ImportService { filters, userCurrency, userId, - startDate: parseDate(firstBuyDate) + startDate: parseDate(dateOfFirstActivity) }), this.symbolProfileService.getSymbolProfiles([ { @@ -106,7 +106,7 @@ export class ImportService { await this.dataProviderService.getDividends({ dataSource, symbol, - from: parseDate(firstBuyDate), + from: parseDate(dateOfFirstActivity), granularity: 'day', to: new Date() }) diff --git a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts index 8fee1957c..b3b1d3410 100644 --- a/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts +++ b/apps/api/src/app/portfolio/calculator/portfolio-calculator.ts @@ -407,9 +407,11 @@ export abstract class PortfolioCalculator { includeInTotalAssetValue, timeWeightedInvestment, timeWeightedInvestmentWithCurrencyEffect, + activitiesCount: item.activitiesCount, averagePrice: item.averagePrice, currency: item.currency, dataSource: item.dataSource, + dateOfFirstActivity: item.dateOfFirstActivity, dividend: totalDividend, dividendInBaseCurrency: totalDividendInBaseCurrency, fee: item.fee, @@ -993,9 +995,11 @@ export abstract class PortfolioCalculator { investment, skipErrors, symbol, + activitiesCount: oldAccumulatedSymbol.activitiesCount + 1, averagePrice: newQuantity.eq(0) ? new Big(0) : investment.div(newQuantity).abs(), + dateOfFirstActivity: oldAccumulatedSymbol.dateOfFirstActivity, dividend: new Big(0), fee: oldAccumulatedSymbol.fee.plus(fee), feeInBaseCurrency: @@ -1016,7 +1020,9 @@ export abstract class PortfolioCalculator { skipErrors, symbol, tags, + activitiesCount: 1, averagePrice: unitPrice, + dateOfFirstActivity: date, dividend: new Big(0), firstBuyDate: date, includeInHoldings: INVESTMENT_ACTIVITY_TYPES.includes(type), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts index 6b56b39a2..a1021a57b 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-buy.spec.ts @@ -133,15 +133,22 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('595.6'), errors: [], hasErrors: false, positions: [ { + activitiesCount: 2, averagePrice: new Big('139.75'), currency: 'CHF', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-11-22', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('3.2'), @@ -202,6 +209,10 @@ describe('PortfolioCalculator', () => { { date: '2021-11-01', investment: 559 }, { date: '2021-12-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2021-01-01', investment: 559 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts index 2aad0cb26..002730e32 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell-in-two-activities.spec.ts @@ -149,15 +149,22 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('0'), errors: [], hasErrors: false, positions: [ { + activitiesCount: 3, averagePrice: new Big('0'), currency: 'CHF', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-11-22', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('3.2'), @@ -216,6 +223,10 @@ describe('PortfolioCalculator', () => { { date: '2021-11-01', investment: 0 }, { date: '2021-12-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2021-01-01', investment: 0 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts index 35e4309eb..e4ba70158 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy-and-sell.spec.ts @@ -133,15 +133,22 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('0'), errors: [], hasErrors: false, positions: [ { + activitiesCount: 2, averagePrice: new Big('0'), currency: 'CHF', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-11-22', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('3.2'), @@ -200,6 +207,10 @@ describe('PortfolioCalculator', () => { { date: '2021-11-01', investment: 0 }, { date: '2021-12-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2021-01-01', investment: 0 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts index ebce2ac1c..e6cae7865 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-baln-buy.spec.ts @@ -123,15 +123,22 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('297.8'), errors: [], hasErrors: false, positions: [ { + activitiesCount: 1, averagePrice: new Big('136.6'), currency: 'CHF', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-11-30', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('1.55'), @@ -199,6 +206,10 @@ describe('PortfolioCalculator', () => { { date: '2021-11-01', investment: 273.2 }, { date: '2021-12-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2021-01-01', investment: 273.2 } + ]); }); it.only('with BALN.SW buy (with unit price lower than closing price)', async () => { diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts index 9ca8b2d36..6cc58a70f 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btceur.spec.ts @@ -132,6 +132,11 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot.historicalData[0]).toEqual({ date: '2021-12-11', investmentValueWithCurrencyEffect: 0, @@ -190,9 +195,11 @@ describe('PortfolioCalculator', () => { hasErrors: false, positions: [ { + activitiesCount: 1, averagePrice: new Big('44558.42'), currency: 'USD', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-12-12', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('4.46'), @@ -245,6 +252,11 @@ describe('PortfolioCalculator', () => { { date: '2021-12-01', investment: 44558.42 }, { date: '2022-01-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2021-01-01', investment: 44558.42 }, + { date: '2022-01-01', investment: 0 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts index 3648eb84b..41f1d80a8 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd-buy-and-sell-partially.spec.ts @@ -146,6 +146,11 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('13298.425356'), errors: [], @@ -153,9 +158,11 @@ describe('PortfolioCalculator', () => { hasErrors: false, positions: [ { + activitiesCount: 2, averagePrice: new Big('320.43'), currency: 'USD', dataSource: 'YAHOO', + dateOfFirstActivity: '2015-01-01', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('0'), @@ -253,6 +260,13 @@ describe('PortfolioCalculator', () => { { date: '2017-12-01', investment: -318.54266729999995 }, { date: '2018-01-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2015-01-01', investment: 637.0853345999999 }, + { date: '2016-01-01', investment: 0 }, + { date: '2017-01-01', investment: -318.54266729999995 }, + { date: '2018-01-01', investment: 0 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts index 5179fdaa6..b8cecb350 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-btcusd.spec.ts @@ -132,6 +132,11 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot.historicalData[0]).toEqual({ date: '2021-12-11', investmentValueWithCurrencyEffect: 0, @@ -190,9 +195,11 @@ describe('PortfolioCalculator', () => { hasErrors: false, positions: [ { + activitiesCount: 1, averagePrice: new Big('44558.42'), currency: 'USD', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-12-12', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('4.46'), @@ -245,6 +252,11 @@ describe('PortfolioCalculator', () => { { date: '2021-12-01', investment: 44558.42 }, { date: '2022-01-01', investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2021-01-01', investment: 44558.42 }, + { date: '2022-01-01', investment: 0 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts index c9adebc44..bbcaba294 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts @@ -230,9 +230,11 @@ describe('PortfolioCalculator', () => { * Value in base currency: 2000 USD * 0.91 = 1820 CHF */ expect(position).toMatchObject({ + activitiesCount: 2, averagePrice: new Big(1), currency: 'USD', dataSource: DataSource.YAHOO, + dateOfFirstActivity: '2023-12-31', dividend: new Big(0), dividendInBaseCurrency: new Big(0), fee: new Big(0), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts index fa38d0030..e438d9c6d 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-googl-buy.spec.ts @@ -129,15 +129,22 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('103.10483'), errors: [], hasErrors: false, positions: [ { + activitiesCount: 1, averagePrice: new Big('89.12'), currency: 'USD', dataSource: 'YAHOO', + dateOfFirstActivity: '2023-01-03', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('1'), @@ -218,6 +225,10 @@ describe('PortfolioCalculator', () => { investment: 0 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2023-01-01', investment: 82.329056 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts index ab7480bbf..88895b8c6 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-msft-buy-with-dividend.spec.ts @@ -131,9 +131,11 @@ describe('PortfolioCalculator', () => { hasErrors: false, positions: [ { + activitiesCount: 2, averagePrice: new Big('298.58'), currency: 'USD', dataSource: 'YAHOO', + dateOfFirstActivity: '2021-09-16', dividend: new Big('0.62'), dividendInBaseCurrency: new Big('0.62'), fee: new Big('19'), diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts index fdd9e4718..6c47af7ca 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-no-orders.spec.ts @@ -93,6 +93,11 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big(0), hasErrors: false, @@ -108,6 +113,8 @@ describe('PortfolioCalculator', () => { expect(investments).toEqual([]); expect(investmentsByMonth).toEqual([]); + + expect(investmentsByYear).toEqual([]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts index 32a1b02f3..8c0b1af6a 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell-partially.spec.ts @@ -129,15 +129,22 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot).toMatchObject({ currentValueInBaseCurrency: new Big('87.8'), errors: [], hasErrors: false, positions: [ { + activitiesCount: 2, averagePrice: new Big('75.80'), currency: 'CHF', dataSource: 'YAHOO', + dateOfFirstActivity: '2022-03-07', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('4.25'), @@ -198,6 +205,10 @@ describe('PortfolioCalculator', () => { { date: '2022-03-01', investment: 151.6 }, { date: '2022-04-01', investment: -75.8 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2022-01-01', investment: 75.8 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts index f2903f3cd..c4850db66 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-novn-buy-and-sell.spec.ts @@ -129,6 +129,11 @@ describe('PortfolioCalculator', () => { groupBy: 'month' }); + const investmentsByYear = portfolioCalculator.getInvestmentsByGroup({ + data: portfolioSnapshot.historicalData, + groupBy: 'year' + }); + expect(portfolioSnapshot.historicalData[0]).toEqual({ date: '2022-03-06', investmentValueWithCurrencyEffect: 0, @@ -188,9 +193,11 @@ describe('PortfolioCalculator', () => { hasErrors: false, positions: [ { + activitiesCount: 2, averagePrice: new Big('0'), currency: 'CHF', dataSource: 'YAHOO', + dateOfFirstActivity: '2022-03-07', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('0'), @@ -249,6 +256,10 @@ describe('PortfolioCalculator', () => { { date: '2022-03-01', investment: 151.6 }, { date: '2022-04-01', investment: -151.6 } ]); + + expect(investmentsByYear).toEqual([ + { date: '2022-01-01', investment: 0 } + ]); }); }); }); diff --git a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts index 3a00c022c..5e73841ce 100644 --- a/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts +++ b/apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-valuable.spec.ts @@ -116,9 +116,11 @@ describe('PortfolioCalculator', () => { hasErrors: false, positions: [ { + activitiesCount: 1, averagePrice: new Big('500000'), currency: 'USD', dataSource: 'MANUAL', + dateOfFirstActivity: '2022-01-01', dividend: new Big('0'), dividendInBaseCurrency: new Big('0'), fee: new Big('0'), diff --git a/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts b/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts index 1c43508dd..ab2351f11 100644 --- a/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts +++ b/apps/api/src/app/portfolio/interfaces/transaction-point-symbol.interface.ts @@ -2,19 +2,26 @@ import { AssetSubClass, DataSource, Tag } from '@prisma/client'; import { Big } from 'big.js'; export interface TransactionPointSymbol { + activitiesCount: number; assetSubClass: AssetSubClass; averagePrice: Big; currency: string; dataSource: DataSource; + dateOfFirstActivity: string; dividend: Big; fee: Big; feeInBaseCurrency: Big; + + /** @deprecated use dateOfFirstActivity instead */ firstBuyDate: string; + includeInHoldings: boolean; investment: Big; quantity: Big; skipErrors: boolean; symbol: string; tags?: Tag[]; + + /** @deprecated use activitiesCount instead */ transactionCount: number; } diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 5fc2224eb..20016e67f 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -179,9 +179,9 @@ export class PortfolioService { return Promise.all( accounts.map(async (account) => { + let activitiesCount = 0; let dividendInBaseCurrency = 0; let interestInBaseCurrency = 0; - let transactionCount = 0; for (const { currency, @@ -214,7 +214,7 @@ export class PortfolioService { } if (!isDraft) { - transactionCount += 1; + activitiesCount += 1; } } @@ -223,9 +223,9 @@ export class PortfolioService { const result = { ...account, + activitiesCount, dividendInBaseCurrency, interestInBaseCurrency, - transactionCount, valueInBaseCurrency, allocationInPercentage: 0, balanceInBaseCurrency: this.exchangeRateDataService.toCurrency( @@ -233,6 +233,7 @@ export class PortfolioService { account.currency, userCurrency ), + transactionCount: activitiesCount, value: this.exchangeRateDataService.toCurrency( valueInBaseCurrency, userCurrency, @@ -262,6 +263,8 @@ export class PortfolioService { withExcludedAccounts }); + let activitiesCount = 0; + const searchQuery = filters.find(({ type }) => { return type === 'SEARCH_QUERY'; })?.id; @@ -284,6 +287,8 @@ export class PortfolioService { let transactionCount = 0; for (const account of accounts) { + activitiesCount += account.activitiesCount; + totalBalanceInBaseCurrency = totalBalanceInBaseCurrency.plus( account.balanceInBaseCurrency ); @@ -296,6 +301,7 @@ export class PortfolioService { totalValueInBaseCurrency = totalValueInBaseCurrency.plus( account.valueInBaseCurrency ); + transactionCount += account.transactionCount; } @@ -310,6 +316,7 @@ export class PortfolioService { return { accounts, + activitiesCount, transactionCount, totalBalanceInBaseCurrency: totalBalanceInBaseCurrency.toNumber(), totalDividendInBaseCurrency: totalDividendInBaseCurrency.toNumber(), @@ -567,6 +574,7 @@ export class PortfolioService { } for (const { + activitiesCount, currency, dividend, firstBuyDate, @@ -610,6 +618,7 @@ export class PortfolioService { } holdings[symbol] = { + activitiesCount, currency, markets, marketsAdvanced, @@ -789,6 +798,7 @@ export class PortfolioService { } const { + activitiesCount, averagePrice, currency, dividendInBaseCurrency, @@ -807,8 +817,7 @@ export class PortfolioService { quantity, tags, timeWeightedInvestment, - timeWeightedInvestmentWithCurrencyEffect, - transactionCount + timeWeightedInvestmentWithCurrencyEffect } = holding; const activitiesOfHolding = activities.filter(({ SymbolProfile }) => { @@ -914,15 +923,15 @@ export class PortfolioService { ); return { - firstBuyDate, + activitiesCount, marketPrice, marketPriceMax, marketPriceMin, SymbolProfile, tags, - activitiesCount: transactionCount, averagePrice: averagePrice.toNumber(), dataProviderInfo: portfolioCalculator.getDataProviderInfos()?.[0], + dateOfFirstActivity: firstBuyDate, dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), dividendYieldPercent: dividendYieldPercent.toNumber(), dividendYieldPercentWithCurrencyEffect: @@ -1657,6 +1666,7 @@ export class PortfolioService { }): PortfolioPosition { return { currency, + activitiesCount: 0, allocationInPercentage: 0, assetClass: AssetClass.LIQUIDITY, assetSubClass: AssetSubClass.CASH, diff --git a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json index 5becbf2f9..6806bb8ff 100644 --- a/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json +++ b/apps/api/src/assets/cryptocurrencies/cryptocurrencies.json @@ -56,6 +56,7 @@ "10SET": "Tenset", "1ART": "ArtWallet", "1CAT": "Bitcoin Cats", + "1COIN": "1 coin can change your life", "1CR": "1Credit", "1EARTH": "EarthFund", "1ECO": "1eco", @@ -153,6 +154,7 @@ "8PAY": "8Pay", "8X8": "8X8 Protocol", "99BTC": "99 Bitcoins", + "9BIT": "The9bit", "9DOGS": "NINE DOGS", "9GAG": "9GAG", "9MM": "Shigure UI", @@ -177,6 +179,7 @@ "AAC": "Double-A Chain", "AAG": "AAG Ventures", "AAI": "AutoAir AI", + "AAPLON": "Apple (Ondo Tokenized)", "AAPLX": "Apple xStock", "AAPX": "AMPnet", "AARBWBTC": "Aave Arbitrum WBTC", @@ -435,6 +438,7 @@ "AIAI": "All In AI", "AIAKITA": "AiAkita", "AIAT": "AI Analysis Token", + "AIAV": "AI AVatar", "AIB": "AdvancedInternetBlock", "AIBABYDOGE": "AIBabyDoge", "AIBB": "AiBB", @@ -508,6 +512,7 @@ "AIPAD": "AIPAD", "AIPE": "AI Prediction Ecosystem", "AIPEPE": "AI PEPE KING", + "AIPF": "AI Powered Finance", "AIPG": "AI Power Grid", "AIPIN": "AI PIN", "AIPO": "Aipocalypto", @@ -552,7 +557,7 @@ "AIVV1": "AIVille Governance Token", "AIWALLET": "AiWallet Token", "AIWS": "AIWS", - "AIX": "ALIENX", + "AIX": "Ai Xovia", "AIX9": "AthenaX9", "AIXBT": "aixbt by Virtuals", "AIXCB": "aixCB by Virtuals", @@ -625,6 +630,7 @@ "ALIEN": "AlienCoin", "ALIENPEP": "Alien Pepe", "ALIENS": "Aliens", + "ALIENX": "ALIENX", "ALIF": " ALIF COIN", "ALINK": "Aave LINK v1", "ALIS": "ALISmedia", @@ -1358,6 +1364,7 @@ "BABI": "Babylons", "BABL": "Babylon Finance", "BABY": "Babylon", + "BABY4": "Baby 4", "BABYANDY": "Baby Andy", "BABYASTER": "Baby Aster", "BABYB": "Baby Bali", @@ -1372,6 +1379,7 @@ "BABYBOME": "Book of Baby Memes", "BABYBOMEOW": "Baby of BOMEOW", "BABYBONK": "Baby Bonk", + "BABYBOOM": "BabyBoomToken", "BABYBOSS": "Baby Boss", "BABYBROC": "Baby Broccoli", "BABYBROCCOL": "Baby Broccoli", @@ -1618,6 +1626,7 @@ "BB": "BounceBit", "BB1": "Bitbond", "BBADGER": "Badger Sett Badger", + "BBAION": "BigBear.ai Holdings (Ondo Tokenized)", "BBANK": "BlockBank", "BBB": "BitBullBot", "BBBTC": "Big Back Bitcoin", @@ -1651,7 +1660,7 @@ "BBS": "BBSCoin", "BBSNEK": "BabySNEK", "BBSOL": "Bybit Staked SOL", - "BBT": "BabyBoomToken", + "BBT": "BurgerBlastToken", "BBTC": "Binance Wrapped BTC", "BBTF": "Block Buster Tech Inc", "BBUSD": "BounceBit USD", @@ -1748,8 +1757,9 @@ "BEAMMW": "Beam", "BEAN": "Bean", "BEANS": "SUNBEANS (BEANS)", - "BEAR": "Bear Inu", + "BEAR": "3X Short Bitcoin Token", "BEARIN": "Bear in Bathrobe", + "BEARINU": "Bear Inu", "BEAST": "MrBeast", "BEAT": "Beat Token", "BEATAI": "eBeat AI", @@ -1837,7 +1847,7 @@ "BES": "battle esports coin", "BESA": "Besa Gaming", "BESHARE": "Beshare Token", - "BEST": "Bitpanda Ecosystem Token", + "BEST": "Best Wallet Token", "BESTC": "BestChain", "BETA": "Beta Finance", "BETACOIN": "BetaCoin", @@ -2060,6 +2070,7 @@ "BITOK": "BitOKX", "BITONE": "BITONE", "BITORB": "BitOrbit", + "BITPANDA": "Bitpanda Ecosystem Token", "BITRA": "Bitratoken", "BITRADIO": "Bitradio", "BITREWARDS": "BitRewards", @@ -2542,6 +2553,7 @@ "BPD": "Beautiful Princess Disorder", "BPDAI": "Binance-Peg Dai (Binance Bridge)", "BPDOGE": "Binance-Peg DogeZilla (Binance Bridge)", + "BPEPE": "BABY PEPE", "BPEPEF": "Baby Pepe Floki", "BPET": "BPET", "BPINKY": "BPINKY", @@ -2780,6 +2792,7 @@ "BTCHD": "Bitcoin HD", "BTCINU": "Bitcoin Inu", "BTCIX": "BITCOLOJIX", + "BTCJ": "Bitcoin (JustCrypto)", "BTCK": "Bitcoin Turbo Koin", "BTCL": "BTC Lite", "BTCM": "BTCMoon", @@ -2798,7 +2811,7 @@ "BTCS": "Bitcoin Scrypt", "BTCSR": "BTC Strategic Reserve", "BTCST": "BTC Standard Hashrate Token", - "BTCT": "Bitcoin Token", + "BTCTOKEN": "Bitcoin Token", "BTCUS": "Bitcoinus", "BTCV": "Bitcoin Vault", "BTCVB": "BitcoinVB", @@ -2955,6 +2968,7 @@ "BURRRD": "BURRRD", "BURT": "BURT", "BUSD": "Binance USD", + "BUSD0": "Bond USD0", "BUSDC": "BUSD", "BUSY": "Busy DAO", "BUT": "Bucket Token", @@ -3058,7 +3072,7 @@ "CAG": "Change", "CAGA": "Crypto Asset Governance Alliance", "CAH": "Moon Tropica", - "CAI": "Chasm", + "CAI": "CharacterX", "CAID": "ClearAid", "CAILA": "Caila", "CAIR": "Crypto-AI-Robo.com", @@ -3415,12 +3429,14 @@ "CHARGED": "GoCharge Tech", "CHARIZARD": "Charizard Inu", "CHARL": "Charlie", + "CHARLI": "Charlie Trump Dog", "CHARLIE": "Charlie Kirk", "CHARM": "Charm Coin", "CHARS": "CHARS", "CHART": "BetOnChart", "CHARTA": "CHARTAI", "CHARTIQ": "ChartIQ", + "CHAS": "Chasm", "CHASH": "CleverHash", "CHAT": "Solchat", "CHATAI": "ChatAI Token", @@ -3527,6 +3543,7 @@ "CHR": "Chroma", "CHRETT": "Chinese BRETT", "CHRISPUMP": "Christmas Pump", + "CHRONOEFFE": "Chronoeffector", "CHRP": "Chirpley", "CHS": "Chainsquare", "CHSB": "SwissBorg", @@ -3576,6 +3593,7 @@ "CIX100": "Cryptoindex", "CJ": "CryptoJacks", "CJC": "CryptoJournal", + "CJL": "Cjournal", "CJR": "Conjure", "CJT": "ConnectJob Token", "CKB": "Nervos Network", @@ -3761,6 +3779,7 @@ "COINBANK": "CoinBank", "COINBT": "CoinBot", "COINBUCK": "Coinbuck", + "COINCOLLECT": "CoinCollect", "COINDEALTOKEN": "CoinDeal Token", "COINDEFI": "Coin", "COINDEPO": "CoinDepo Token", @@ -3770,6 +3789,7 @@ "COINLION": "CoinLion", "COINM": "CoinMarketPrime", "COINONAT": "Coinonat", + "COINRADR": "CoinRadr", "COINSCOPE": "Coinscope", "COINSL": "CoinsLoot", "COINVEST": "Coinvest", @@ -3788,7 +3808,7 @@ "COLLAT": "Collaterize", "COLLE": "Collective Care", "COLLEA": "Colle AI", - "COLLECT": "CoinCollect", + "COLLECT": "Collect on Fanable", "COLLG": "Collateral Pay Governance", "COLON": "Colon", "COLR": "colR Coin", @@ -4900,6 +4920,7 @@ "DMTR": "Dimitra", "DMX": "Dymmax", "DMZ": "DeMon Token", + "DN": "DeepNode", "DN8": "Pldgr", "DNA": "Metaverse", "DNAPEPE": "DNA PEPE", @@ -4909,6 +4930,7 @@ "DNFLX": "Netflix Tokenized Stock Defichain", "DNFT": "DareNFT", "DNN": "DNN Token", + "DNNON": "Denison Mines (Ondo Tokenized)", "DNO": "Denaro", "DNODE": "DecentraNode", "DNOTES": "Dnotes", @@ -4984,6 +5006,7 @@ "DOGEIN": "Doge In Glasses", "DOGEINU": "Doge Inu", "DOGEIUS": "DOGEIUS", + "DOGEJ": "Dogecoin (JustCrypto)", "DOGEKING": "DogeKing", "DOGELEGION": "DOGE LEGION", "DOGEM": "Doge Matrix", @@ -5630,6 +5653,7 @@ "ELONTRUMP": "ELON TRUMP", "ELP": "Ellerium", "ELS": "Ethlas", + "ELSA": "Elsa", "ELT": "Element Black", "ELTC2": "eLTC", "ELTCOIN": "ELTCOIN", @@ -5700,6 +5724,7 @@ "ENEDEX": "Enedex", "ENERGYLEDGER": "Energy Ledger", "ENERGYX": "Safe Energy", + "ENEXSPACE": "ENEX", "ENF": "enfineo", "ENG": "Enigma", "ENGT": "Engagement Token", @@ -5722,6 +5747,7 @@ "ENTER": "EnterCoin", "ENTR": "EnterDAO", "ENTRC": "ENTER COIN", + "ENTROPY": "Entropy", "ENTRP": "Hut34 Project", "ENTRY": "ENTRY", "ENTS": "Ents", @@ -5731,7 +5757,7 @@ "ENVIENTA": "Envienta", "ENVION": "Envion", "ENVOY": "Envoy A.I", - "ENX": "ENEX", + "ENX": "Enigma", "EOC": "EveryonesCoin", "EON": "Exscudo", "EONC": "Dimension", @@ -5783,6 +5809,7 @@ "ERA7": "Era Token", "ERASWAP": "Era Swap Token", "ERB": "ERBCoin", + "ERBB": "Exchange Request for Bitbon", "ERC": "EuropeCoin", "ERC20": "ERC20", "ERC20V1": "ERC20 v1", @@ -5821,7 +5848,7 @@ "ESGC": "ESG Chain", "ESH": "Switch", "ESHIB": "Euro Shiba Inu", - "ESIM": "EvoSimGame", + "ESIM": "DEPINSIM Token", "ESM": "EL SALVADOR MEME", "ESN": "Ethersocial", "ESNC": "Galaxy Arena Metaverse", @@ -5882,6 +5909,7 @@ "ETHFI": "Ether.fi", "ETHI": "Ethical Finance", "ETHIX": "EthicHub", + "ETHJ": "Ethereum (JustCrypto)", "ETHM": "Ethereum Meta", "ETHO": "The Etho Protocol", "ETHOS": "Ethos Project", @@ -5954,6 +5982,7 @@ "EURU": "Upper Euro", "EURX": "eToro Euro", "EUSD": "Egoras Dollar", + "EUSX": "eUSX", "EUT": "EarnUp Token", "EUTBL": "Spiko EU T-Bills Money Market Fund", "EV": "EVAI", @@ -5992,6 +6021,7 @@ "EVOC": "EVOCPLUS", "EVOL": "EVOL NETWORK", "EVOS": "EVOS", + "EVOSIM": "EvoSimGame", "EVOVERSES": "EvoVerses", "EVR": "Everus", "EVRICE": "Evrice", @@ -6106,6 +6136,7 @@ "FAN": "Fanadise", "FAN360": "Fan360", "FANC": "fanC", + "FANCYTHATTOKEN": "Fancy That", "FAND": "Fandomdao", "FANG": "FANG Token", "FANS": "Fantasy Cash", @@ -6328,6 +6359,7 @@ "FK": "FK Coin", "FKBIDEN": "Fkbiden", "FKGARY": "Fuck Gary Gensler", + "FKH": "Flying Ketamine Horse", "FKPEPE": "Fuck Pepe", "FKR": "Flicker", "FKRPRO": "FlickerPro", @@ -6453,7 +6485,7 @@ "FNB": "FNB protocol", "FNC": "Fancy Games", "FNCT": "Financie Token", - "FNCY": "Fancy That", + "FNCY": "FNCY", "FND": "Rare FND", "FNDZ": "FNDZ Token", "FNF": "FunFi", @@ -6483,6 +6515,7 @@ "FOFOTOKEN": "FOFO Token", "FOG": "FOGnet", "FOGE": "Fat Doge", + "FOGO": "Fogo", "FOGV1": "FOGnet v1", "FOIN": "Foin", "FOL": "Folder Protocol", @@ -6509,6 +6542,7 @@ "FORA": "UFORIKA", "FORCE": "TriForce Tokens", "FORCEC": "Force Coin", + "FORDON": "Ford Motor (Ondo Tokenized)", "FORE": "FORE Protocol", "FOREFRONT": "Forefront", "FOREST": "Forest", @@ -6868,6 +6902,7 @@ "GASP": "GASP", "GASPCOIN": "gAsp", "GASS": "Gasspas", + "GAST": "Gas Town", "GASTRO": "GastroCoin", "GAT": "Gather", "GATA": "Gata", @@ -7368,6 +7403,7 @@ "GQ": "Galactic Quadrant", "GR": "GROM", "GRAB": "GRABWAY", + "GRABON": "Grab Holdings (Ondo Tokenized)", "GRACY": "Gracy", "GRAI": "Gravita Protocol", "GRAIL": "Camelot Token", @@ -7376,6 +7412,7 @@ "GRAND": "Grand Theft Ape", "GRANDCOIN": "GrandCoin", "GRANDMA": "Grandma", + "GRANT": "GrantiX Token", "GRAPE": "GrapeCoin", "GRAPHGRAIAI": "GraphGrail AI", "GRASS": "Grass", @@ -7618,6 +7655,7 @@ "HALF": "0.5X Long Bitcoin Token", "HALFP": "Half Pizza", "HALFSHIT": "0.5X Long Shitcoin Index Token", + "HALIS": "Halis", "HALLO": "Halloween Coin", "HALLOWEEN": "HALLOWEEN", "HALO": "Halo Coin", @@ -7883,7 +7921,7 @@ "HLP": "Purpose Coin", "HLPR": "HELPER COIN", "HLPT": "HLP Token", - "HLS": "Halis", + "HLS": "Helios", "HLT": "HyperLoot", "HLTC": "Huobi LTC", "HLX": "Helex", @@ -8229,6 +8267,7 @@ "IDLE": "IDLE", "IDM": "IDM", "IDNA": "Idena", + "IDNG": "IDNGold", "IDO": "Idexo", "IDOL": "MEET48 Token", "IDOLINU": "IDOLINU", @@ -8392,12 +8431,14 @@ "INSPI": "InspireAI", "INSR": "Insurabler", "INSTAMINE": "Instamine Nuggets", + "INSTANTSPONSOR": "Instant Sponsor Token", "INSTAR": "Insights Network", "INSUR": "InsurAce", "INSURANCE": "insurance", "INSURC": "InsurChain Coin", "INSUREDFIN": "Insured Finance", "INT": "Internet Node token", + "INTCON": "Intel (Ondo Tokenized)", "INTCX": "Intel xStock", "INTD": "INTDESTCOIN", "INTE": "InteractWith", @@ -8578,6 +8619,7 @@ "J9BC": "J9CASINO", "JACK": "Jack Token", "JACKPOT": "Solana Jackpot", + "JACKSON": "Jackson", "JACS": "JACS", "JACY": "JACY", "JADE": "Jade Protocol", @@ -8704,6 +8746,7 @@ "JNX": "Janex", "JNY": "JNY", "JOB": "Jobchain", + "JOBCOIN": "buy instead of getting a job", "JOBIESS": "JobIess", "JOBS": "JobsCoin", "JOBSEEK": "JobSeek AI", @@ -8719,7 +8762,8 @@ "JOHNNY": "Johnny The Bull", "JOINCOIN": "JoinCoin", "JOINT": "Joint Ventures", - "JOJO": "JOJO", + "JOJO": "JOJOWORLD", + "JOJOSCLUB": "JOJO", "JOJOTOKEN": "JOJO", "JOK": "JokInTheBox", "JOKER": "JOKER", @@ -9613,10 +9657,11 @@ "LISTA": "Lista DAO", "LISTEN": "Listen", "LISUSD": "lisUSD", - "LIT": "Litentry", + "LIT": "Lighter", "LITE": "Lite USD", "LITEBTC": "LiteBitcoin", "LITENETT": "Litenett", + "LITENTRY": "Litentry", "LITH": "Lithium Finance", "LITHIUM": "Lithium", "LITHO": "Lithosphere", @@ -9748,7 +9793,7 @@ "LORY": "Yield Parrot", "LOS": "Lord Of SOL", "LOST": "Lost Worlds", - "LOT": "Lukki Operating Token", + "LOT": "League of Traders", "LOTES": "Loteo", "LOTEU": "Loteo", "LOTT": "Beauty bakery lott", @@ -9824,6 +9869,7 @@ "LTCC": "Listerclassic Coin", "LTCD": "LitecoinDark", "LTCH": "Litecoin Cash", + "LTCJ": "Litecoin (JustCrypto)", "LTCP": "LitecoinPro", "LTCR": "LiteCreed", "LTCU": "LiteCoin Ultra", @@ -9875,6 +9921,7 @@ "LUFFYV1": "Luffy v1", "LUIGI": "Luigi Inu", "LUIS": "Tongue Cat", + "LUKKI": "Lukki Operating Token", "LULU": "LULU", "LUM": "Luminous", "LUMA": "LUMA Token", @@ -10068,8 +10115,7 @@ "MANUSAI": "Manus AI Agent", "MANYU": "Manyu", "MANYUDOG": "MANYU", - "MAO": "MAO", - "MAOMEME": "Mao", + "MAO": "Mao", "MAOW": "MAOW", "MAP": "MAP Protocol", "MAPC": "MapCoin", @@ -10105,6 +10151,7 @@ "MARSMI": "MarsMi", "MARSO": "Marso.Tech", "MARSRISE": "MarsRise", + "MARSTOKEN": "Mars Token", "MARSUPILAMI": "MARSUPILAMI INU", "MARSW": "Marswap", "MART": "ArtMeta", @@ -10240,6 +10287,7 @@ "MCIV": "Mars Civ Project", "MCL": "McLaren F1", "MCLB": "Millennium Club Coin", + "MCM": "Mochimo", "MCN": "mCoin", "MCO": "Crypto.com", "MCO2": "Moss Carbon Credit", @@ -10310,6 +10358,7 @@ "MEF": "MEFLEX", "MEFA": "Metaverse Face", "MEFAI": "META FINANCIAL AI", + "MEFI": "Meo Finance", "MEGA": "MegaFlash", "MEGABOT": "Megabot", "MEGAD": "Mega Dice Casino", @@ -10953,6 +11002,7 @@ "MOTIONCOIN": "Motion", "MOTO": "Motocoin", "MOUND": "Mound Token", + "MOUNTA": "Mountain Protocol", "MOUTAI": "Moutai", "MOV": "MovieCoin", "MOVD": "MOVE Network", @@ -11137,6 +11187,7 @@ "MUNITY": "Metahorse Unity", "MUNK": "Dramatic Chipmunk", "MUNSUN": "MUNSUN", + "MUON": "Micron Technology (Ondo Tokenized)", "MURA": "Murasaki", "MURATIAI": "MuratiAI", "MUSCAT": "MusCat", @@ -11184,9 +11235,11 @@ "MWD": "MEW WOOF DAO", "MWETH": "Moonwell Flagship ETH (Morpho Vault)", "MWH": "Melania Wif Hat", + "MWT": "Mountain Wolf Token", "MWXT": "MWX Token", "MX": "MX Token", - "MXC": "Machine Xchange Coin", + "MXC": "MXC Token", + "MXCV1": "Machine Xchange Coin v1", "MXD": "Denarius", "MXGP": "MXGP Fan Token", "MXM": "Maximine", @@ -11455,6 +11508,7 @@ "NEWSTOKENS": "NewsTokens", "NEWT": "Newton Protocol", "NEWTON": "Newtonium", + "NEWYORKCOIN": "NewYorkCoin", "NEX": "Nash Exchange", "NEXA": "Nexa", "NEXAI": "NexAI", @@ -11482,6 +11536,7 @@ "NFCR": "NFCore", "NFD": "Feisty Doge NFT", "NFE": "Edu3Labs", + "NFLXON": "Netflix (Ondo Tokenized)", "NFLXX": "Netflix xStock", "NFM": "NFMart", "NFN": "Nafen", @@ -11519,6 +11574,7 @@ "NGL": "Entangle", "NGM": "e-Money", "NGMI": "NGMI Coin", + "NGNT": "Naira Token", "NGTG": "NUGGET TRAP", "NHCT": "Nano Healthcare Token", "NHI": "Non Human Intelligence", @@ -11616,6 +11672,7 @@ "NOBS": "No BS Crypto", "NOC": "Nono Coin", "NOCHILL": "AVAX HAS NO CHILL", + "NOCK": "Nockchain", "NODE": "NodeOps", "NODELYAI": "NodelyAI", "NODESYNAPSE": "NodeSynapse", @@ -11661,7 +11718,9 @@ "NOTDOG": "NOTDOG", "NOTE": "Republic Note", "NOTECANTO": "Note", - "NOTHING": "NOTHING", + "NOTHING": "Youll own nothing & be happy", + "NOTHINGCASH": "NOTHING", + "NOTIFAI": "NotifAi News", "NOTINU": "NOTCOIN INU", "NOTIONAL": "Notional Finance", "NOV": "Novara Calcio Fan Token", @@ -11677,6 +11736,7 @@ "NPER": "NPER", "NPICK": "NPICK BLOCK", "NPLC": "Plus Coin", + "NPLCV1": "PlusCoin v1", "NPM": "Neptune Mutual", "NPRO": "NPRO", "NPT": "Neopin", @@ -11769,6 +11829,7 @@ "NVA": "Neeva Defi", "NVB": "NovaBank", "NVC": "NovaCoin", + "NVDAON": "NVIDIA (Ondo Tokenized)", "NVDAX": "NVIDIA xStock", "NVDX": "Nodvix", "NVG": "NightVerse Game", @@ -11810,7 +11871,7 @@ "NYANDOGE": "NyanDOGE International", "NYANTE": "Nyantereum International", "NYBBLE": "Nybble", - "NYC": "NewYorkCoin", + "NYC": "NYC", "NYCREC": "NYCREC", "NYE": "NewYork Exchange", "NYEX": "Nyerium", @@ -11866,6 +11927,7 @@ "OCE": "OceanEX Token", "OCEAN": "Ocean Protocol", "OCEANT": "Poseidon Foundation", + "OCEANV1": "Ocean Protocol v1", "OCH": "Orchai", "OCICAT": "OciCat", "OCL": "Oceanlab", @@ -12013,7 +12075,7 @@ "OMNIXIO": "OMNIX", "OMNOM": "Doge Eat Doge", "OMNOMN": "Omega Network", - "OMT": "Mars Token", + "OMT": "Oracle Meta Technologies", "OMV1": "OM Token (v1)", "OMX": "Project Shivom", "OMZ": "Open Meta City", @@ -12023,6 +12085,7 @@ "ONCH": "OnchainPoints.xyz", "ONDO": "Ondo", "ONDOAI": "Ondo DeFAI", + "ONDSON": "Ondas Holdings (Ondo Tokenized)", "ONE": "Harmony", "ONEROOT": "OneRoot Network", "ONES": "OneSwap DAO", @@ -12080,6 +12143,7 @@ "OPENCUSTODY": "Open Custody Protocol", "OPENDAO": "OpenDAO", "OPENGO": "OPEN Governance Token", + "OPENON": "Opendoor Technologies (Ondo Tokenized)", "OPENP": "Open Platform", "OPENRI": "Open Rights Exchange", "OPENSOURCE": "Open Source Network", @@ -12244,7 +12308,7 @@ "OWB": "OWB", "OWC": "Oduwa", "OWD": "Owlstand", - "OWL": "OWL Token", + "OWLTOKEN": "OWL Token", "OWN": "OTHERWORLD", "OWNDATA": "OWNDATA", "OWNLY": "Ownly", @@ -12268,6 +12332,7 @@ "OZG": "Ozagold", "OZK": "OrdiZK", "OZMPC": "Ozempic", + "OZNI": "Ni Token", "OZO": "Ozone Chain", "OZONE": "Ozone metaverse", "OZONEC": "Ozonechain", @@ -12292,6 +12357,7 @@ "PACOCA": "Pacoca", "PACP": "PAC Protocol", "PACT": "impactMarket", + "PACTTOKEN": "PACT community token", "PACTV1": "impactMarket v1", "PAD": "NearPad", "PAF": "Pacific", @@ -12335,6 +12401,7 @@ "PANGEA": "PANGEA", "PANIC": "PanicSwap", "PANO": "PanoVerse", + "PANTHER": "Panther Protocol", "PANTOS": "Pantos", "PAO": "South Pao", "PAPA": "Papa Bear", @@ -12447,10 +12514,12 @@ "PCN": "PeepCoin", "PCNT": "Playcent", "PCO": "Pecunio", + "PCOCK": "PulseChain Peacock", "PCOIN": "Pioneer Coin", "PCR": "Paycer Protocol", "PCS": "Pabyosi Coin", "PCSP": "GenomicDao G-Stroke", + "PCT": "PET CASH TOKEN", "PCW": "Power Crypto World", "PCX": "ChainX", "PD": "PUDEL", @@ -12461,6 +12530,7 @@ "PDD": "PDDOLLAR", "PDEX": "Polkadex", "PDF": "Port of DeFi Network", + "PDI": "Phuture DeFi Index", "PDJT": "President Donald J. Trump", "PDOG": "Polkadog", "PDOGE": "PolkaDoge", @@ -12583,6 +12653,7 @@ "PEPEMO": "PepeMo", "PEPEMOON": "PEPEMOON", "PEPEMUSK": "pepemusk", + "PEPENODE": "PEPENODE", "PEPEOFSOL": "Pepe of Solana", "PEPEPI": "PEPEPi", "PEPER": "Baby Pepe", @@ -12618,6 +12689,7 @@ "PERC": "Perion", "PERCY": "Percy Verence", "PERI": "PERI Finance", + "PERKSCOIN": "PerksCoin ", "PERL": "PERL.eco", "PERMIAN": "Permian", "PERP": "Perpetual Protocol", @@ -12645,7 +12717,9 @@ "PEUSD": "peg-eUSD", "PEW": "pepe in a memes world", "PEX": "Pexcoin", + "PF": "Purple Frog", "PFEX": "Pfizer xStock", + "PFF": "PumpFunFloki", "PFI": "PrimeFinance", "PFID": "Pofid Dao", "PFL": "Professional Fighters League Fan Token", @@ -12835,7 +12909,7 @@ "PLAYCOIN": "PlayCoin", "PLAYFUN": "PLAYFUN", "PLAYKEY": "Playkey", - "PLAYSOL": "Play Solana", + "PLAYSOLANA": "Play Solana", "PLAYTOKEN": "Play Token", "PLB": "Paladeum", "PLBT": "Polybius", @@ -12884,6 +12958,7 @@ "PLU": "Pluton", "PLUG": "PL^Gnet", "PLUGCN": "Plug Chain", + "PLUGON": "Plug Power (Ondo Tokenized)", "PLUME": "Plume", "PLUP": "PoolUp", "PLURA": "PluraCoin", @@ -12978,7 +13053,7 @@ "POLLEN": "Beraborrow", "POLLUK": "Jasse Polluk", "POLLUX": "Pollux Coin", - "POLLY": "Polynetica", + "POLLY": "Polly Penguin", "POLNX": "eToro Polish Zloty", "POLO": "NftyPlay", "POLS": "Polkastarter", @@ -12987,6 +13062,7 @@ "POLY": "Polymath Network", "POLYCUB": "PolyCub", "POLYDOGE": "PolyDoge", + "POLYN": "Polynetica", "POLYPAD": "PolyPad", "POLYX": "Polymesh", "POM": "Proof Of Memes", @@ -13114,6 +13190,7 @@ "PREAI": "Predict Crypto", "PREC": "Precipitate.AI", "PRED": "Predictcoin", + "PREDIC": "PredicTools", "PREM": "Premium", "PREME": "PREME Token", "PREMIA": "Premia", @@ -13221,6 +13298,7 @@ "PSWAP": "Polkaswap", "PSY": "PsyOptions", "PSYOP": "PSYOP", + "PSYOPANIME": "PsyopAnime", "PT": "Phemex", "PTA": "PentaCoin", "PTAS": "La Peseta", @@ -13319,8 +13397,9 @@ "PUX": "pukkamex", "PVC": "PVC Meta", "PVFYBO": "JRVGCUPVSC", - "PVP": "PvP", + "PVP": "Pvpfun", "PVPCHAIN": "PVPChain", + "PVPGAME": "PvP", "PVT": "Punkvism Token", "PVU": "Plant vs Undead Token", "PWAR": "PolkaWar", @@ -13333,9 +13412,10 @@ "PWR": "MaxxChain", "PWRC": "PWR Coin", "PWT": "PANDAINU", - "PX": "PXcoin", + "PX": "Not Pixel", "PXB": "PixelBit", "PXC": "PhoenixCoin", + "PXCOIN": "PXcoin", "PXG": "PlayGame", "PXI": "Prime-X1", "PXL": "PIXEL", @@ -13519,7 +13599,7 @@ "RADAR": "DappRadar", "RADI": "RadicalCoin", "RADIO": "RadioShack", - "RADR": "CoinRadr", + "RADR": "RADR", "RADX": "Radx AI", "RAFF": "Ton Raffles", "RAFFLES": "Degen Raffles", @@ -13582,6 +13662,7 @@ "RAYS": "Rays Network", "RAZE": "Raze Network", "RAZOR": "Razor Network", + "RAZORCOIN": "RazorCoin", "RB": "REBorn", "RBBT": "RabbitCoin", "RBC": "Rubic", @@ -13928,6 +14009,7 @@ "RNDR": "Render Token", "RNDX": "Round X", "RNEAR": "Near (Rainbow Bridge)", + "RNGR": "Ranger", "RNS": "RenosCoin", "RNT": "REAL NIGGER TATE", "RNTB": "BitRent", @@ -13966,6 +14048,7 @@ "ROK": "Rockchain", "ROKM": "Rocket Ma", "ROKO": "Roko", + "ROLL": "Roll", "ROLLSROYCE": "RollsRoyce", "ROLS": "RollerSwap", "ROM": "ROMCOIN", @@ -14158,7 +14241,7 @@ "RYT": "Real Yield Token", "RYU": "The Blue Dragon", "RYZ": "Anryze", - "RZR": "RazorCoin", + "RZR": "Rezor", "RZTO": "RZTO Token", "RZUSD": "RZUSD", "RedFlokiCEO": "Red Floki CEO", @@ -14220,6 +14303,7 @@ "SAKAI": "Sakai Vault", "SAKATA": "Sakata Inu", "SAKE": "SakeToken", + "SAKURACOIN": "Sakuracoin", "SAL": "Salvium", "SALD": "Salad", "SALE": "DxSale Network", @@ -14423,6 +14507,7 @@ "SEAM": "Seamless Protocol", "SEAMLESS": "SeamlessSwap", "SEAN": "Starfish Finance", + "SEAS": "Seasons", "SEAT": "Seamans Token", "SEATLABNFT": "SeatlabNFT", "SEBA": "Seba", @@ -14498,6 +14583,7 @@ "SETH": "sETH", "SETH2": "sETH2", "SETHER": "Sether", + "SETHH": "Staked ETH Harbour", "SETS": "Sensitrust", "SEUR": "Synth sEUR", "SEW": "simpson in a memes world", @@ -14608,6 +14694,7 @@ "SHIBACASH": "ShibaCash", "SHIBADOG": "Shiba San", "SHIBAI": "AiShiba", + "SHIBAINU": "SHIBA INU", "SHIBAKEN": "Shibaken Finance", "SHIBAMOM": "Shiba Mom", "SHIBANCE": "Shibance Token", @@ -14678,6 +14765,7 @@ "SHOKI": "Shoki", "SHON": "ShonToken", "SHONG": "Shong Inu", + "SHOOK": "SHOOK", "SHOOT": "Mars Battle", "SHOOTER": "Top Down Survival Shooter", "SHOP": "Shoppi Coin", @@ -14727,6 +14815,7 @@ "SIFT": "Smart Investment Fund Token", "SIFU": "SIFU", "SIG": "Signal", + "SIGHT": "Empire of Sight", "SIGM": "Sigma", "SIGMA": "SIGMA", "SIGN": "Sign", @@ -14735,6 +14824,7 @@ "SIGNMETA": "Sign Token", "SIGT": "Signatum", "SIGU": "Singular", + "SIH": "Salient Investment Holding", "SIKA": "SikaSwap", "SIL": "SIL Finance Token V2", "SILENTIS": "Silentis", @@ -14772,6 +14862,7 @@ "SINE": "Sinelock", "SING": "SingularFarm", "SINGLE": "Single Finance", + "SINGULARRY": "SINGULARRY", "SINK": "Let that sink in", "SINS": "SafeInsure", "SINSO": "SINSO", @@ -14828,7 +14919,7 @@ "SKO": "Sugar Kingdom Odyssey", "SKOP": "Skulls of Pepe Token", "SKPEPE": "Sheikh Pepe", - "SKR": "Sakuracoin", + "SKR": "Seeker", "SKRB": "Sakura Bloom", "SKRIMP": "Skrimples", "SKRP": "Skraps", @@ -14885,6 +14976,7 @@ "SLOKI": "Super Floki", "SLOP": "Slop", "SLORK": "SLORK", + "SLOT": "Alphaslot", "SLOTH": "Sloth", "SLOTHA": "Slothana", "SLP": "Smooth Love Potion", @@ -14898,6 +14990,7 @@ "SLUGDENG": "SLUG DENG", "SLUMBO": "SLUMBO", "SLVLUSD": "Staked Level USD", + "SLVON": "iShares Silver Trust (Ondo Tokenized)", "SLVX": "eToro Silver", "SLX": "SLIMEX", "SMA": "Soma Network", @@ -14922,6 +15015,7 @@ "SMBR": "Sombra", "SMBSWAP": "SimbCoin Swap", "SMC": "SmartCoin", + "SMCION": "Super Micro Computer (Ondo Tokenized)", "SMCW": "Space Misfits", "SMD": "SMD Coin", "SMETA": "StarkMeta", @@ -15024,7 +15118,7 @@ "SNPT": "SNPIT TOKEN", "SNRG": "Synergy", "SNRK": "Snark Launch", - "SNS": "Synesis One", + "SNS": "Solana Name Service", "SNST": "Smooth Network Solutions Token", "SNSY": "Sensay", "SNT": "Status Network Token", @@ -15062,6 +15156,7 @@ "SOGNI": "Sogni AI", "SOGUR": "Sogur Currency", "SOH": "Stohn Coin", + "SOHMV1": "Staked Olympus v1", "SOHOT": "SOHOTRN", "SOIL": "Soil", "SOILCOIN": "SoilCoin", @@ -15290,6 +15385,7 @@ "SPO": "Spores Network", "SPOK": "Spock", "SPOL": "Starterpool", + "SPON": "Spheron Network", "SPONG": "Spongebob", "SPONGE": "Sponge", "SPONGEBOB": "Spongebob Squarepants", @@ -15298,6 +15394,7 @@ "SPOOL": "Spool DAO Token", "SPORE": "Spore", "SPORT": "SportsCoin", + "SPORTFUN": "Sport.fun", "SPORTS": "ZenSports", "SPORTSFIX": "SportsFix", "SPORTSP": "SportsPie", @@ -15326,6 +15423,7 @@ "SPX6969": "SPX 6969", "SPXC": "SpaceXCoin", "SPY": "Smarty Pay", + "SPYON": "SPDR S&P 500 ETF (Ondo Tokenized)", "SPYRO": "SPYRO", "SPYX": "SP500 xStock", "SQ3": "Squad3", @@ -15351,6 +15449,8 @@ "SQUIDGROWV1": "SquidGrow v1", "SQUIDV1": "Squid Game v1", "SQUIDW": "Squidward Coin", + "SQUIG": "Squiggle DAO Token", + "SQUIGDAO": "SquiggleDAO ERC20", "SQUIRT": "SQUIRTLE", "SQUOGE": "DogeSquatch", "SR30": "SatsRush", @@ -15424,13 +15524,14 @@ "STAN": "Stank Memes", "STANDARD": "Stakeborg DAO", "STAPT": "Ditto Staked Aptos", - "STAR": "StarHeroes", + "STAR": "Starpower Network Token", "STAR10": "Ronaldinho Coin", "STARAMBA": "Staramba", "STARBASE": "Starbase", "STARC": "StarChain", "STARDOGE": "StarDOGE", "STARGATEAI": "Stargate AI Agent", + "STARHEROES": "StarHeroes", "STARL": "StarLink", "STARLAUNCH": "StarLaunch", "STARLY": "Starly", @@ -15818,6 +15919,7 @@ "SYNCO": "Synco", "SYND": "Syndicate", "SYNDOG": "Synthesizer Dog", + "SYNESIS": "Synesis One", "SYNK": "Synk", "SYNLEV": "SynLev", "SYNO": "Synonym Finance", @@ -15918,6 +16020,7 @@ "TATSU": "Taτsu", "TAU": "Lamden Tau", "TAUC": "Taurus Coin", + "TAUD": "TrueAUD", "TAUM": "Orbitau Taureum", "TAUR": "Marnotaur", "TAVA": "ALTAVA", @@ -16117,6 +16220,7 @@ "THEPLAY": "PLAY", "THEREALCHAIN": "REAL", "THERESAMAY": "Theresa May Coin", + "THEROS": "THEROS", "THES": "The Standard Protocol (USDS)", "THESTANDARD": "Standard Token", "THETA": "Theta Network", @@ -16201,9 +16305,10 @@ "TIPS": "FedoraCoin", "TIPSX": "WisdomTree TIPS Digital Fund", "TIPSY": "TipsyCoin", - "TIT": "TittieCoin", + "TIT": "TITANIUM", "TITA": "Titan Hunters", "TITAN": "SATOSHI•RUNE•TITAN (Runes)", + "TITANCOIN": "Titan Coin", "TITANO": "Titano", "TITANSWAP": "TitanSwap", "TITANX": "TitanX", @@ -16212,6 +16317,7 @@ "TITI": "TiTi Protocol", "TITN": "Titan", "TITS": "We Love Tits", + "TITTIECOIN": "TittieCoin", "TITTY": "TamaKitty", "TIUSD": "TiUSD", "TIX": "Blocktix", @@ -16226,6 +16332,7 @@ "TKMK": "TOKAMAK", "TKMN": "Tokemon", "TKN": "Token Name Service", + "TKNT": "TKN Token", "TKO": "Tokocrypto", "TKP": "TOKPIE", "TKR": "CryptoInsight", @@ -16239,6 +16346,7 @@ "TLN": "Trustlines Network", "TLOS": "Telos", "TLP": "TulipCoin", + "TLTON": "iShares 20+ Year Treasury Bond ETF (Ondo Tokenized)", "TLW": "TILWIKI", "TMAGA": "THE MAGA MOVEMENT", "TMAI": "Token Metrics AI", @@ -16393,6 +16501,7 @@ "TPV": "TravGoPV", "TPY": "Thrupenny", "TQ": "TonQuestion", + "TQQQON": "ProShares UltraPro QQQ (Ondo Tokenized)", "TQQQX": "TQQQ xStock", "TQRT": "TokoQrt", "TR3": "Tr3zor", @@ -16595,6 +16704,7 @@ "TSHARE": "Tomb Shares", "TSHP": "12Ships", "TSL": "Energo", + "TSLAON": "Tesla (Ondo Tokenized)", "TSLAX": "Tesla xStock", "TSLT": "Tamkin", "TSN": "Tsunami Exchange Token", @@ -16616,7 +16726,7 @@ "TTF": "TurboTrix Finance", "TTK": "The Three Kingdoms", "TTM": "Tradetomato", - "TTN": "Titan Coin", + "TTN": "TTN", "TTNT": "TITA Project", "TTT": "TRUMPETTOKEN", "TTTU": "T-Project", @@ -16633,7 +16743,8 @@ "TUKI": "Tuki", "TUKIV1": "Tuki v1", "TULIP": "Tulip Protocol", - "TUNA": "TUNACOIN", + "TUNA": "DefiTuna", + "TUNACOIN": "TUNACOIN", "TUNE": "Bitune", "TUNETRADEX": "TuneTrade", "TUP": "Tenup", @@ -16710,7 +16821,7 @@ "TZKI": "Tsuzuki Inu", "TZPEPE": "Tezos Pepe", "TZU": "Sun Tzu", - "U": "Union", + "U": "United Stables", "U2U": "U2U Network", "U8D": "Universal Dollar", "UA1": "UA1", @@ -16737,6 +16848,7 @@ "UBXT": "UpBots", "UC": "YouLive Coin", "UCA": "UCA Coin", + "UCANFIX": "Ucan fix life in1day", "UCAP": "Unicap.finance", "UCASH": "U.CASH", "UCCOIN": "UC Coin", @@ -16858,6 +16970,7 @@ "UNIL": "UniLayer", "UNIM": "Unicorn Milk", "UNIO": "Unio Coin", + "UNION": "Union", "UNIPOWER": "UniPower", "UNIPT": "Universal Protocol Token", "UNIQ": "Uniqredit", @@ -16934,6 +17047,7 @@ "US": "Talus Token", "USA": "Based USA", "USACOIN": "American Coin", + "USAGIBNB": "U", "USAT": "USAT", "USBT": "Universal Blockchain", "USC": "Ultimate Secure Cash", @@ -16980,7 +17094,7 @@ "USDK": "USDK", "USDKG": "USDKG", "USDL": "Lift Dollar", - "USDM": "Mountain Protocol", + "USDM": "USDM", "USDMA": "USD mars", "USDN": "Neutral AI", "USDO": "USD Open Dollar", @@ -17021,6 +17135,7 @@ "USN": "USN", "USNBT": "NuBits", "USNOTA": "NOTA", + "USOR": "U.S Oil", "USP": "USP Token", "USPEPE": "American pepe", "USPLUS": "Fluent Finance", @@ -17038,7 +17153,8 @@ "USUALX": "USUALx", "USUD": "USUD", "USV": "Universal Store of Value", - "USX": "USX Quantum", + "USX": "USX", + "USXQ": "USX Quantum", "USYC": "Hashnote USYC", "UT": "Ulord", "UTBAI": "UTB.ai", @@ -17193,6 +17309,7 @@ "VEO": "Amoveo", "VER": "VersalNFT", "VERA": "Vera", + "VEREM": "Verified Emeralds", "VERI": "Veritaseum", "VERIC": "VeriCoin", "VERIFY": "Verify", @@ -17391,6 +17508,7 @@ "VRC": "Virtual Coin", "VRFY": "VERIFY", "VRGW": "Virtual Reality Game World", + "VRGX": "VROOMGO", "VRH": "Versailles Heroes", "VRL": "Virtual X", "VRM": "Verium", @@ -17456,6 +17574,7 @@ "VVS": "VVS Finance", "VVV": "Venice Token", "VX": "Visa xStock", + "VXC": "VINX COIN", "VXL": "Voxel X Network", "VXR": "Vox Royale", "VXRP": "Venus XRP", @@ -17594,6 +17713,7 @@ "WCFGV1": "Wrapped Centrifuge", "WCFX": "Wrapped Conflux", "WCG": "World Crypto Gold", + "WCHZ": "Chiliz (Portal Bridge)", "WCKB": "Wrapped Nervos Network", "WCOIN": "WCoin", "WCORE": "Wrapped Core", @@ -17685,6 +17805,7 @@ "WFIL": "Wrapped Filecoin", "WFLAMA": "WIFLAMA", "WFLOW": "Wrapped Flow", + "WFLR": "Wrapped Flare", "WFO": "WoofOracle", "WFRAGSOL": "Wrapped fragSOL", "WFT": "Windfall Token", @@ -17721,6 +17842,7 @@ "WHISKEY": "WHISKEY", "WHITE": "WhiteRock", "WHITEHEART": "Whiteheart", + "WHITEPEPE": "The White Pepe", "WHITEWHALE": "The White Whale", "WHL": "WhaleCoin", "WHO": "Truwho", @@ -17838,6 +17960,7 @@ "WMNT": "Wrapped Mantle", "WMOXY": "Moxy", "WMT": "World Mobile Token v1", + "WMTON": "Walmart (Ondo Tokenized)", "WMTX": "World Mobile Token", "WMW": "WoopMoney", "WMX": "Wombex Finance", @@ -18161,6 +18284,7 @@ "XENO": "Xeno", "XENOVERSE": "Xenoverse", "XEP": "Electra Protocol", + "XERA": "XERA", "XERS": "X Project", "XES": "Proxeus", "XET": "Xfinite Entertainment Token", @@ -18340,6 +18464,7 @@ "XRPCV1": "XRP Classic v1", "XRPEPE": "XRPEPE", "XRPH": "XRP Healthcare", + "XRPHEDGE": "1X Short XRP Token", "XRS": "Xrius", "XRT": "Robonomics Network", "XRUN": "XRun", @@ -18607,6 +18732,7 @@ "ZAIF": "Zaif Token", "ZAIFIN": "Zero Collateral Dai", "ZAM": "Zamio", + "ZAMA": "Zama", "ZAMZAM": "ZAMZAM", "ZANO": "Zano", "ZAO": "zkTAO", @@ -18652,8 +18778,7 @@ "ZEBU": "ZEBU", "ZEC": "ZCash", "ZECD": "ZCashDarkCoin", - "ZED": "ZED Token", - "ZEDCOIN": "ZedCoin", + "ZED": "ZedCoins", "ZEDD": "ZedDex", "ZEDTOKEN": "Zed Token", "ZEDX": "ZEDX Сoin", @@ -18679,6 +18804,7 @@ "ZENPROTOCOL": "Zen Protocol", "ZENQ": "Zenqira", "ZENT": "Zentry", + "ZENV1": "Horizen v1", "ZEON": "Zeon Network", "ZEP": "Zeppelin Dao", "ZEPH": "Zephyr Protocol", @@ -18696,12 +18822,14 @@ "ZET2": "Zeta2Coin", "ZETA": "ZetaChain", "ZETH": "Zethan", + "ZETO": "ZeTo", "ZETRIX": "Zetrix", "ZEUM": "Colizeum", "ZEUS": "Zeus Network", "ZEUSPEPES": "Zeus", "ZEX": "Zeta", "ZEXI": "ZEXICON", + "ZEXX": "ZEXXCOIN", "ZEXY": "ZEXY", "ZF": "zkSwap Finance ", "ZFI": "Zyfi", @@ -18748,6 +18876,7 @@ "ZKEVM": "zkEVMChain (BSC)", "ZKEX": "zkExchange", "ZKF": "ZKFair", + "ZKFG": "ZKFG", "ZKGPT": "ZKGPT", "ZKGROK": "ZKGROK", "ZKGUN": "zkGUN", @@ -18759,7 +18888,7 @@ "ZKLAB": "zkSync Labs", "ZKLK": "ZkLock", "ZKML": "zKML", - "ZKP": "Panther Protocol", + "ZKP": "zkPass", "ZKPAD": "zkLaunchpad", "ZKPEPE": "ZKPEPEs", "ZKS": "ZKSpace", @@ -18830,8 +18959,9 @@ "ZSD": "Zephyr Protocol Stable Dollar", "ZSE": "ZSEcoin", "ZSH": "Ziesha", + "ZSWAP": "ZygoSwap", "ZT": "ZBG Token", - "ZTC": "ZeTo", + "ZTC": "Zenchain", "ZTG": "Zeitgeist", "ZTK": "Zefi", "ZTX": "ZTX", diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts index 95c58d35a..427386796 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts @@ -116,11 +116,11 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { }; public dataProviderInfo: DataProviderInfo; public dataSource: MatTableDataSource; + public dateOfFirstActivity: string; public dividendInBaseCurrency: number; public dividendInBaseCurrencyPrecision = 2; public dividendYieldPercentWithCurrencyEffect: number; public feeInBaseCurrency: number; - public firstBuyDate: string; public hasPermissionToCreateOwnTag: boolean; public hasPermissionToReadMarketDataOfOwnAssetProfile: boolean; public historicalDataItems: LineChartItem[]; @@ -267,10 +267,10 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { activitiesCount, averagePrice, dataProviderInfo, + dateOfFirstActivity, dividendInBaseCurrency, dividendYieldPercentWithCurrencyEffect, feeInBaseCurrency, - firstBuyDate, historicalData, investmentInBaseCurrencyWithCurrencyEffect, marketPrice, @@ -298,6 +298,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { this.benchmarkDataItems = []; this.countries = {}; this.dataProviderInfo = dataProviderInfo; + this.dateOfFirstActivity = dateOfFirstActivity; this.dividendInBaseCurrency = dividendInBaseCurrency; if ( @@ -312,7 +313,6 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { dividendYieldPercentWithCurrencyEffect; this.feeInBaseCurrency = feeInBaseCurrency; - this.firstBuyDate = firstBuyDate; this.hasPermissionToReadMarketDataOfOwnAssetProfile = hasPermission( @@ -461,16 +461,16 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { } } - if (isToday(parseISO(this.firstBuyDate))) { + if (isToday(parseISO(this.dateOfFirstActivity))) { // Add average price this.historicalDataItems.push({ - date: this.firstBuyDate, + date: this.dateOfFirstActivity, value: this.averagePrice }); // Add benchmark 1 this.benchmarkDataItems.push({ - date: this.firstBuyDate, + date: this.dateOfFirstActivity, value: averagePrice }); @@ -501,7 +501,7 @@ export class GfHoldingDetailDialogComponent implements OnDestroy, OnInit { if ( this.benchmarkDataItems[0]?.value === undefined && - isSameMonth(parseISO(this.firstBuyDate), new Date()) + isSameMonth(parseISO(this.dateOfFirstActivity), new Date()) ) { this.benchmarkDataItems[0].value = this.averagePrice; } diff --git a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html index f52286160..f9329dbfb 100644 --- a/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html +++ b/apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.html @@ -215,7 +215,7 @@ [deviceType]="data.deviceType" [isDate]="true" [locale]="data.locale" - [value]="firstBuyDate" + [value]="dateOfFirstActivity" >First Activity @@ -400,7 +400,7 @@

Sponsors

- Browser testing via -
+
Browser testing via
LambdaTest Logo
diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts index ec872c770..5cd24777c 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts @@ -2,6 +2,7 @@ import { GfBenchmarkComparatorComponent } from '@ghostfolio/client/components/be import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { UserService } from '@ghostfolio/client/services/user/user.service'; +import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config'; import { HistoricalDataItem, InvestmentItem, @@ -94,6 +95,7 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit { public performanceDataItems: HistoricalDataItem[]; public performanceDataItemsInPercentage: HistoricalDataItem[]; public portfolioEvolutionDataLabel = $localize`Investment`; + public precision = 2; public streaks: PortfolioInvestmentsResponse['streaks']; public top3: PortfolioPosition[]; public unitCurrentStreak: string; @@ -317,12 +319,21 @@ export class GfAnalysisPageComponent implements OnDestroy, OnInit { : valueInPercentage }); } + this.performanceDataItemsInPercentage.push({ date, value: netPerformanceInPercentageWithCurrencyEffect }); } + if ( + this.deviceType === 'mobile' && + this.performance.currentValueInBaseCurrency >= + NUMERICAL_PRECISION_THRESHOLD_6_FIGURES + ) { + this.precision = 0; + } + this.isLoadingInvestmentChart = false; this.updateBenchmarkDataItems(); diff --git a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html index 150caa7d8..517ad7101 100644 --- a/apps/client/src/app/pages/portfolio/analysis/analysis-page.html +++ b/apps/client/src/app/pages/portfolio/analysis/analysis-page.html @@ -74,6 +74,72 @@ } + + @if (user?.settings?.isExperimentalFeatures) { +
+
+ + + Total amount + + +
+
+ + + Change with currency effect + + +
+
+ + + Performance with currency effect + + +
+
+ } +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/client/src/assets/images/sponsors/logo-testmu-light.svg b/apps/client/src/assets/images/sponsors/logo-testmu-light.svg new file mode 100644 index 000000000..e925efd5e --- /dev/null +++ b/apps/client/src/assets/images/sponsors/logo-testmu-light.svg @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/client/src/environments/environment.prod.ts b/apps/client/src/environments/environment.prod.ts index 4ee0d508b..f3ded619e 100644 --- a/apps/client/src/environments/environment.prod.ts +++ b/apps/client/src/environments/environment.prod.ts @@ -2,6 +2,5 @@ import type { GfEnvironment } from '@ghostfolio/ui/environment'; export const environment: GfEnvironment = { lastPublish: '{BUILD_TIMESTAMP}', - production: true, - stripePublicKey: '' + production: true }; diff --git a/apps/client/src/environments/environment.ts b/apps/client/src/environments/environment.ts index ccedf6738..1b9efe2be 100644 --- a/apps/client/src/environments/environment.ts +++ b/apps/client/src/environments/environment.ts @@ -6,8 +6,7 @@ import type { GfEnvironment } from '@ghostfolio/ui/environment'; export const environment: GfEnvironment = { lastPublish: null, - production: false, - stripePublicKey: '' + production: false }; /* diff --git a/apps/client/src/locales/messages.ca.xlf b/apps/client/src/locales/messages.ca.xlf index e48a2ad47..fc8a326c3 100644 --- a/apps/client/src/locales/messages.ca.xlf +++ b/apps/client/src/locales/messages.ca.xlf @@ -2123,7 +2123,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -2135,7 +2135,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -2394,6 +2394,14 @@ 409 + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max Màx @@ -4500,7 +4508,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -4520,11 +4528,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -4544,7 +4552,7 @@ Mensualment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -4552,7 +4560,7 @@ Anualment apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4568,7 +4576,7 @@ Rendiment absolut dels actius apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -4576,7 +4584,7 @@ Rendiment de l’actiu apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 @@ -4584,7 +4592,7 @@ Rendiment absolut de la moneda apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -4592,7 +4600,7 @@ Rendiment de la moneda apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -4600,7 +4608,7 @@ A dalt apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 @@ -4608,7 +4616,7 @@ A baix apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 @@ -4616,7 +4624,7 @@ Evolució de la cartera apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 @@ -4624,7 +4632,7 @@ Cronologia de la inversió apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 @@ -4632,7 +4640,7 @@ Ratxa actual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 @@ -4640,7 +4648,7 @@ Ratxa més llarga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 @@ -4648,7 +4656,7 @@ Cronologia de dividends apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -7366,12 +7374,20 @@ 146 + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7451,7 +7467,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7522,6 +7538,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia Armenia diff --git a/apps/client/src/locales/messages.de.xlf b/apps/client/src/locales/messages.de.xlf index d70c2ad1d..6c2bd7900 100644 --- a/apps/client/src/locales/messages.de.xlf +++ b/apps/client/src/locales/messages.de.xlf @@ -926,7 +926,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -938,7 +938,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -1117,6 +1117,14 @@ 409 + + Performance with currency effect + Performance mit Währungseffekt + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max Max @@ -1854,7 +1862,7 @@ Zeitstrahl der Investitionen apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 @@ -1862,7 +1870,7 @@ Gewinner apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 @@ -1870,7 +1878,7 @@ Verlierer apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 @@ -2526,7 +2534,7 @@ Monatlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -2754,7 +2762,7 @@ Portfolio Wertentwicklung apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 @@ -3130,7 +3138,7 @@ Zeitstrahl der Dividenden apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -3166,7 +3174,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3290,7 +3298,7 @@ Jährlich apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4026,7 +4034,7 @@ Aktueller Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 @@ -4034,7 +4042,7 @@ Längster Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 @@ -5876,11 +5884,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5908,7 +5916,7 @@ Absolute Anlage Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -5916,7 +5924,7 @@ Anlage Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 @@ -5924,7 +5932,7 @@ Absolute Währungsperformance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -5932,7 +5940,7 @@ Währungsperformance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -7390,12 +7398,20 @@ 146 + + Change with currency effect + Änderung mit Währungseffekt + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard KI-Anweisung wurde in die Zwischenablage kopiert apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7475,7 +7491,7 @@ Öffne Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7546,6 +7562,14 @@ 67 + + Total amount + Gesamtbetrag + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia Armenien diff --git a/apps/client/src/locales/messages.es.xlf b/apps/client/src/locales/messages.es.xlf index 89e67975f..a1b6e45e4 100644 --- a/apps/client/src/locales/messages.es.xlf +++ b/apps/client/src/locales/messages.es.xlf @@ -911,7 +911,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -923,7 +923,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -1102,6 +1102,14 @@ 409 + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max Máximo @@ -1839,7 +1847,7 @@ Cronología de la inversión apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 @@ -1847,7 +1855,7 @@ Lo mejor apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 @@ -1855,7 +1863,7 @@ Lo peor apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 @@ -2555,7 +2563,7 @@ Mensual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -2739,7 +2747,7 @@ Evolución cartera apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 @@ -3143,7 +3151,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3155,7 +3163,7 @@ Calendario de dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -3275,7 +3283,7 @@ Anual apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4003,7 +4011,7 @@ Racha actual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 @@ -4011,7 +4019,7 @@ Racha más larga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 @@ -5853,11 +5861,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5885,7 +5893,7 @@ Rendimiento absoluto de los activos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -5893,7 +5901,7 @@ Rendimiento de activos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 @@ -5901,7 +5909,7 @@ Rendimiento absoluto de divisas apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -5909,7 +5917,7 @@ Rendimiento de la moneda apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -7367,12 +7375,20 @@ 146 + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard El aviso de IA ha sido copiado al portapapeles apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7452,7 +7468,7 @@ Abrir Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7523,6 +7539,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia Armenia diff --git a/apps/client/src/locales/messages.fr.xlf b/apps/client/src/locales/messages.fr.xlf index dc25b2c05..05dc0f7e3 100644 --- a/apps/client/src/locales/messages.fr.xlf +++ b/apps/client/src/locales/messages.fr.xlf @@ -1194,7 +1194,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -1206,7 +1206,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -1349,6 +1349,14 @@ 409 + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max Max @@ -2414,7 +2422,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -2442,7 +2450,7 @@ Mensuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -2450,7 +2458,7 @@ Haut apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 @@ -2458,7 +2466,7 @@ Bas apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 @@ -2466,7 +2474,7 @@ Évolution du Portefeuille apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 @@ -2474,7 +2482,7 @@ Historique des Investissements apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 @@ -2482,7 +2490,7 @@ Historique des Dividendes apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -3274,7 +3282,7 @@ Annuel apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4002,7 +4010,7 @@ Série en cours apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 @@ -4010,7 +4018,7 @@ Série la plus longue apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 @@ -5852,11 +5860,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5884,7 +5892,7 @@ Performance des Actifs en valeur absolue apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -5892,7 +5900,7 @@ Performance des Actifs apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 @@ -5900,7 +5908,7 @@ Performance des devises en valeur absolue apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -5908,7 +5916,7 @@ Performance des devises apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -7366,12 +7374,20 @@ 146 + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard Le prompt IA a été copié dans le presse-papiers apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7451,7 +7467,7 @@ Ouvrir Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7522,6 +7538,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia Arménie diff --git a/apps/client/src/locales/messages.it.xlf b/apps/client/src/locales/messages.it.xlf index c021470ef..26545f435 100644 --- a/apps/client/src/locales/messages.it.xlf +++ b/apps/client/src/locales/messages.it.xlf @@ -911,7 +911,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -923,7 +923,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -1102,6 +1102,14 @@ 409 + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max Massimo @@ -1839,7 +1847,7 @@ Cronologia degli investimenti apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 @@ -1847,7 +1855,7 @@ In alto apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 @@ -1855,7 +1863,7 @@ In basso apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 @@ -2555,7 +2563,7 @@ Mensile apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -2739,7 +2747,7 @@ Evoluzione del portafoglio apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 @@ -3143,7 +3151,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3155,7 +3163,7 @@ Cronologia dei dividendi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -3275,7 +3283,7 @@ Annuale apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4003,7 +4011,7 @@ Serie attuale apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 @@ -4011,7 +4019,7 @@ Serie più lunga apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 @@ -5853,11 +5861,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5885,7 +5893,7 @@ Rendimento assoluto dell’Asset apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -5893,7 +5901,7 @@ Rendimento dell’Asset apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 @@ -5901,7 +5909,7 @@ Rendimento assoluto della Valuta apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -5909,7 +5917,7 @@ Rendimento della Valuta apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -7367,12 +7375,20 @@ 146 + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard L’AI prompt è stato copiato negli appunti apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7452,7 +7468,7 @@ Apri Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7523,6 +7539,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia Armenia diff --git a/apps/client/src/locales/messages.ko.xlf b/apps/client/src/locales/messages.ko.xlf index 133425cab..05f02c87b 100644 --- a/apps/client/src/locales/messages.ko.xlf +++ b/apps/client/src/locales/messages.ko.xlf @@ -1840,7 +1840,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -1852,7 +1852,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -2183,6 +2183,14 @@ 409 + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max 맥스 @@ -4144,7 +4152,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -4172,7 +4180,7 @@ 월간 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -4180,7 +4188,7 @@ 매년 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4188,7 +4196,7 @@ 상위 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 @@ -4196,7 +4204,7 @@ 하위 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 @@ -4204,7 +4212,7 @@ 포트폴리오 진화 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 @@ -4212,7 +4220,7 @@ 투자 일정 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 @@ -4220,7 +4228,7 @@ 현재 연속 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 @@ -4228,7 +4236,7 @@ 최장 연속 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 @@ -4236,7 +4244,7 @@ 배당 일정 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -5869,7 +5877,7 @@ 절대적인 통화 성과 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -5885,7 +5893,7 @@ 절대자산성과 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -5901,11 +5909,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5925,7 +5933,7 @@ 자산 성과 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 @@ -5933,7 +5941,7 @@ 통화 성과 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -7391,12 +7399,20 @@ 146 + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard AI 프롬프트가 클립보드에 복사되었습니다. apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7476,7 +7492,7 @@ 오픈 Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7547,6 +7563,14 @@ 97 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia 아르메니아 diff --git a/apps/client/src/locales/messages.nl.xlf b/apps/client/src/locales/messages.nl.xlf index 18e271b0d..773937956 100644 --- a/apps/client/src/locales/messages.nl.xlf +++ b/apps/client/src/locales/messages.nl.xlf @@ -910,7 +910,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -922,7 +922,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -1101,6 +1101,14 @@ 409 + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max Max @@ -1838,7 +1846,7 @@ Tijdlijn investeringen apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 @@ -1846,7 +1854,7 @@ Winnaars apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 @@ -1854,7 +1862,7 @@ Verliezers apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 @@ -2554,7 +2562,7 @@ Maandelijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -2738,7 +2746,7 @@ Waardeontwikkeling van portefeuille apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 @@ -3142,7 +3150,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3154,7 +3162,7 @@ Tijdlijn dividend apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -3274,7 +3282,7 @@ Jaarlijks apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4002,7 +4010,7 @@ Huidige reeks apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 @@ -4010,7 +4018,7 @@ Langste reeks apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 @@ -5852,11 +5860,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5884,7 +5892,7 @@ Absolute Activaprestaties apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -5892,7 +5900,7 @@ Activaprestaties apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 @@ -5900,7 +5908,7 @@ Absolute Valutaprestaties apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -5908,7 +5916,7 @@ Valutaprestaties apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -7366,12 +7374,20 @@ 146 + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard AI-prompt is naar het klembord gekopieerd apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7451,7 +7467,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7522,6 +7538,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia Armenië diff --git a/apps/client/src/locales/messages.pl.xlf b/apps/client/src/locales/messages.pl.xlf index 8cb13184b..f4d14b81e 100644 --- a/apps/client/src/locales/messages.pl.xlf +++ b/apps/client/src/locales/messages.pl.xlf @@ -1807,7 +1807,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -1819,7 +1819,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -2150,6 +2150,14 @@ 409 + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max Maksimum @@ -4111,7 +4119,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -4139,7 +4147,7 @@ Miesięcznie apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -4147,7 +4155,7 @@ Rocznie apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4155,7 +4163,7 @@ Największe wzrosty apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 @@ -4163,7 +4171,7 @@ Największy spadek apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 @@ -4171,7 +4179,7 @@ Rozwój portfela apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 @@ -4179,7 +4187,7 @@ Oś czasu inwestycji apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 @@ -4187,7 +4195,7 @@ Obecna passa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 @@ -4195,7 +4203,7 @@ Najdłuższa passa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 @@ -4203,7 +4211,7 @@ Oś czasu dywidend apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -5852,11 +5860,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5884,7 +5892,7 @@ Łączny wynik aktywów apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -5892,7 +5900,7 @@ Wyniki aktywów apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 @@ -5900,7 +5908,7 @@ Łączny wynik walut apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -5908,7 +5916,7 @@ Wynik walut apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -7366,12 +7374,20 @@ 146 + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard Prompt AI został skopiowany do schowka apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7451,7 +7467,7 @@ Otwórz Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7522,6 +7538,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia Armenia diff --git a/apps/client/src/locales/messages.pt.xlf b/apps/client/src/locales/messages.pt.xlf index 562e5db2a..1e92933dc 100644 --- a/apps/client/src/locales/messages.pt.xlf +++ b/apps/client/src/locales/messages.pt.xlf @@ -1078,7 +1078,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -1090,7 +1090,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -1345,6 +1345,14 @@ 409 + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max Máx @@ -2358,7 +2366,7 @@ Mensalmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -2366,7 +2374,7 @@ Topo apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 @@ -2374,7 +2382,7 @@ Fundo apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 @@ -2382,7 +2390,7 @@ Evolução do Portefólio apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 @@ -2390,7 +2398,7 @@ Cronograma de Investimento apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 @@ -3206,7 +3214,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3218,7 +3226,7 @@ Cronograma de Dividendos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -3274,7 +3282,7 @@ Anualmente apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4002,7 +4010,7 @@ Série Atual apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 @@ -4010,7 +4018,7 @@ Série mais Longa apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 @@ -5852,11 +5860,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5884,7 +5892,7 @@ Desempenho absoluto de ativos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -5892,7 +5900,7 @@ Desempenho de ativos apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 @@ -5900,7 +5908,7 @@ Desempenho absoluto da moeda apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -5908,7 +5916,7 @@ Desempenho da moeda apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -7366,12 +7374,20 @@ 146 + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7451,7 +7467,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7522,6 +7538,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia Armenia diff --git a/apps/client/src/locales/messages.tr.xlf b/apps/client/src/locales/messages.tr.xlf index bd1389a49..cdbfaec8f 100644 --- a/apps/client/src/locales/messages.tr.xlf +++ b/apps/client/src/locales/messages.tr.xlf @@ -1663,7 +1663,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -1675,7 +1675,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -2018,6 +2018,14 @@ 409 + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max Maks. @@ -3595,7 +3603,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3623,7 +3631,7 @@ Aylık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -3631,7 +3639,7 @@ Yıllık apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -3639,7 +3647,7 @@ Üst apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 @@ -3647,7 +3655,7 @@ Alt apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 @@ -3655,7 +3663,7 @@ Portföyün Gelişimi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 @@ -3663,7 +3671,7 @@ Yatırım Zaman Çizelgesi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 @@ -3671,7 +3679,7 @@ Güncel Seri apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 @@ -3679,7 +3687,7 @@ En Uzun Seri apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 @@ -3687,7 +3695,7 @@ Temettü Zaman Çizelgesi apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -5852,11 +5860,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5884,7 +5892,7 @@ Mutlak Varlık Performansı apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -5892,7 +5900,7 @@ Varlık Performansı apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 @@ -5900,7 +5908,7 @@ Mutlak Para Performansı apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -5908,7 +5916,7 @@ Para Performansı apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -7366,12 +7374,20 @@ 146 + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard Yapay zeka istemi panoya kopyalandı apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7451,7 +7467,7 @@ Duck.ai’yi aç apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7522,6 +7538,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia Ermenistan diff --git a/apps/client/src/locales/messages.uk.xlf b/apps/client/src/locales/messages.uk.xlf index 7ad8133b3..a7d0d1ca3 100644 --- a/apps/client/src/locales/messages.uk.xlf +++ b/apps/client/src/locales/messages.uk.xlf @@ -2215,7 +2215,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -2227,7 +2227,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -2606,6 +2606,14 @@ 409 + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max Максимум @@ -4816,7 +4824,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -4836,11 +4844,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -4860,7 +4868,7 @@ Щомісячно apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -4868,7 +4876,7 @@ Щорічно apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4884,7 +4892,7 @@ Абсолютна прибутковість активів apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -4892,7 +4900,7 @@ Прибутковість активів apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 @@ -4900,7 +4908,7 @@ Абсолютна прибутковість валюти apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -4908,7 +4916,7 @@ Прибутковість валюти apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -4916,7 +4924,7 @@ Топ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 @@ -4924,7 +4932,7 @@ Низ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 @@ -4932,7 +4940,7 @@ Еволюція портфеля apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 @@ -4940,7 +4948,7 @@ Інвестиційний графік apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 @@ -4948,7 +4956,7 @@ Поточна серія apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 @@ -4956,7 +4964,7 @@ Найдовша серія apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 @@ -4964,7 +4972,7 @@ Графік дивідендів apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -7374,12 +7382,20 @@ 174 + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard Запит AI скопійовано в буфер обміну apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7451,7 +7467,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7522,6 +7538,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia Armenia diff --git a/apps/client/src/locales/messages.xlf b/apps/client/src/locales/messages.xlf index d91a8d438..f339f807e 100644 --- a/apps/client/src/locales/messages.xlf +++ b/apps/client/src/locales/messages.xlf @@ -1689,7 +1689,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -1700,7 +1700,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -2004,6 +2004,13 @@ 409 + + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max @@ -3786,7 +3793,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -3811,63 +3818,63 @@ Monthly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 Yearly apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 Top apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 Bottom apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 Portfolio Evolution apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 Investment Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 Current Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 Longest Streak apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 Dividend Timeline apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -5341,7 +5348,7 @@ Absolute Currency Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -5355,7 +5362,7 @@ Absolute Asset Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -5370,11 +5377,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5392,14 +5399,14 @@ Asset Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 Currency Performance apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -6712,11 +6719,18 @@ 146 + + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -6786,7 +6800,7 @@ Open Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -6851,6 +6865,13 @@ 97 + + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia diff --git a/apps/client/src/locales/messages.zh.xlf b/apps/client/src/locales/messages.zh.xlf index f8af582de..c941fa2f2 100644 --- a/apps/client/src/locales/messages.zh.xlf +++ b/apps/client/src/locales/messages.zh.xlf @@ -1816,7 +1816,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 193 + 257 @@ -1828,7 +1828,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 212 + 276 @@ -2159,6 +2159,14 @@ 409 + + Performance with currency effect + Performance with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 134 + + Max 最大限度 @@ -4120,7 +4128,7 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 75 + 76 libs/ui/src/lib/i18n.ts @@ -4148,7 +4156,7 @@ 每月 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 90 + 91 @@ -4156,7 +4164,7 @@ 每年 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 91 + 92 @@ -4164,7 +4172,7 @@ 顶部 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 239 + 303 @@ -4172,7 +4180,7 @@ 底部 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 288 + 352 @@ -4180,7 +4188,7 @@ 投资组合演变 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 341 + 405 @@ -4188,7 +4196,7 @@ 投资时间表 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 368 + 432 @@ -4196,7 +4204,7 @@ 当前连胜 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 389 + 453 @@ -4204,7 +4212,7 @@ 最长连续纪录 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 398 + 462 @@ -4212,7 +4220,7 @@ 股息时间表 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 425 + 489 @@ -5845,7 +5853,7 @@ 绝对货币表现 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 145 + 209 @@ -5861,7 +5869,7 @@ 绝对资产回报 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 102 + 166 @@ -5877,11 +5885,11 @@ apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 80 + 81 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 96 + 97 apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts @@ -5901,7 +5909,7 @@ 资产回报 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 124 + 188 @@ -5909,7 +5917,7 @@ 货币表现 apps/client/src/app/pages/portfolio/analysis/analysis-page.html - 170 + 234 @@ -7367,12 +7375,20 @@ 146 + + Change with currency effect + Change with currency effect + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 115 + + AI prompt has been copied to the clipboard AI 提示已复制到剪贴板 apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 199 + 201 @@ -7452,7 +7468,7 @@ 打开 Duck.ai apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts - 200 + 202 @@ -7523,6 +7539,14 @@ 67 + + Total amount + Total amount + + apps/client/src/app/pages/portfolio/analysis/analysis-page.html + 94 + + Armenia 亚美尼亚 diff --git a/libs/common/src/lib/interfaces/index.ts b/libs/common/src/lib/interfaces/index.ts index 7cf93691c..ad747d94e 100644 --- a/libs/common/src/lib/interfaces/index.ts +++ b/libs/common/src/lib/interfaces/index.ts @@ -34,7 +34,6 @@ import type { PortfolioPerformance } from './portfolio-performance.interface'; import type { PortfolioPosition } from './portfolio-position.interface'; import type { PortfolioReportRule } from './portfolio-report-rule.interface'; import type { PortfolioSummary } from './portfolio-summary.interface'; -import type { Position } from './position.interface'; import type { Product } from './product'; import type { AccessTokenResponse } from './responses/access-token-response.interface'; import type { AccountBalancesResponse } from './responses/account-balances-response.interface'; @@ -172,7 +171,6 @@ export { PortfolioReportResponse, PortfolioReportRule, PortfolioSummary, - Position, Product, PublicKeyCredentialCreationOptionsJSON, PublicKeyCredentialRequestOptionsJSON, diff --git a/libs/common/src/lib/interfaces/portfolio-position.interface.ts b/libs/common/src/lib/interfaces/portfolio-position.interface.ts index e277ba468..67a2f3e77 100644 --- a/libs/common/src/lib/interfaces/portfolio-position.interface.ts +++ b/libs/common/src/lib/interfaces/portfolio-position.interface.ts @@ -7,6 +7,7 @@ import { Holding } from './holding.interface'; import { Sector } from './sector.interface'; export interface PortfolioPosition { + activitiesCount: number; allocationInPercentage: number; assetClass?: AssetClass; assetClassLabel?: string; @@ -38,7 +39,10 @@ export interface PortfolioPosition { sectors: Sector[]; symbol: string; tags?: Tag[]; + + /** @deprecated use activitiesCount instead */ transactionCount: number; + type?: string; url?: string; valueInBaseCurrency?: number; diff --git a/libs/common/src/lib/interfaces/position.interface.ts b/libs/common/src/lib/interfaces/position.interface.ts deleted file mode 100644 index d1f74380b..000000000 --- a/libs/common/src/lib/interfaces/position.interface.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { MarketState } from '@ghostfolio/common/types'; - -import { AssetClass, AssetSubClass, DataSource } from '@prisma/client'; - -export interface Position { - assetClass: AssetClass; - assetSubClass: AssetSubClass; - averagePrice: number; - currency: string; - dataSource: DataSource; - firstBuyDate: string; - grossPerformance?: number; - grossPerformancePercentage?: number; - investment: number; - investmentInOriginalCurrency?: number; - marketPrice?: number; - marketState?: MarketState; - name?: string; - netPerformance?: number; - netPerformancePercentage?: number; - netPerformancePercentageWithCurrencyEffect?: number; - netPerformanceWithCurrencyEffect?: number; - quantity: number; - symbol: string; - transactionCount: number; - url?: string; -} diff --git a/libs/common/src/lib/interfaces/responses/accounts-response.interface.ts b/libs/common/src/lib/interfaces/responses/accounts-response.interface.ts index 0a6af978f..1891b9cbb 100644 --- a/libs/common/src/lib/interfaces/responses/accounts-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/accounts-response.interface.ts @@ -2,9 +2,12 @@ import { AccountWithValue } from '@ghostfolio/common/types'; export interface AccountsResponse { accounts: AccountWithValue[]; + activitiesCount: number; totalBalanceInBaseCurrency: number; totalDividendInBaseCurrency: number; totalInterestInBaseCurrency: number; totalValueInBaseCurrency: number; + + /** @deprecated use activitiesCount instead */ transactionCount: number; } diff --git a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts index 95c1c3689..76bc7dc02 100644 --- a/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts @@ -11,11 +11,11 @@ export interface PortfolioHoldingResponse { activitiesCount: number; averagePrice: number; dataProviderInfo: DataProviderInfo; + dateOfFirstActivity: string; dividendInBaseCurrency: number; dividendYieldPercent: number; dividendYieldPercentWithCurrencyEffect: number; feeInBaseCurrency: number; - firstBuyDate: string; grossPerformance: number; grossPerformancePercent: number; grossPerformancePercentWithCurrencyEffect: number; diff --git a/libs/common/src/lib/models/timeline-position.ts b/libs/common/src/lib/models/timeline-position.ts index 8eae56cf7..244d6595e 100644 --- a/libs/common/src/lib/models/timeline-position.ts +++ b/libs/common/src/lib/models/timeline-position.ts @@ -9,12 +9,15 @@ import { Big } from 'big.js'; import { Transform, Type } from 'class-transformer'; export class TimelinePosition { + activitiesCount: number; + @Transform(transformToBig, { toClassOnly: true }) @Type(() => Big) averagePrice: Big; currency: string; dataSource: DataSource; + dateOfFirstActivity: string; @Transform(transformToBig, { toClassOnly: true }) @Type(() => Big) @@ -32,6 +35,7 @@ export class TimelinePosition { @Type(() => Big) feeInBaseCurrency: Big; + /** @deprecated use dateOfFirstActivity instead */ firstBuyDate: string; @Transform(transformToBig, { toClassOnly: true }) @@ -92,6 +96,7 @@ export class TimelinePosition { @Type(() => Big) timeWeightedInvestmentWithCurrencyEffect: Big; + /** @deprecated use activitiesCount instead */ transactionCount: number; @Transform(transformToBig, { toClassOnly: true }) diff --git a/libs/common/src/lib/types/account-with-value.type.ts b/libs/common/src/lib/types/account-with-value.type.ts index 08af86454..7f5fe79ba 100644 --- a/libs/common/src/lib/types/account-with-value.type.ts +++ b/libs/common/src/lib/types/account-with-value.type.ts @@ -1,12 +1,16 @@ import { Account as AccountModel, Platform } from '@prisma/client'; export type AccountWithValue = AccountModel & { + activitiesCount: number; allocationInPercentage: number; balanceInBaseCurrency: number; dividendInBaseCurrency: number; interestInBaseCurrency: number; platform?: Platform; + + /** @deprecated use activitiesCount instead */ transactionCount: number; + value: number; valueInBaseCurrency: number; }; diff --git a/libs/ui/src/lib/environment/environment.interface.ts b/libs/ui/src/lib/environment/environment.interface.ts index 9cb279515..bdd867324 100644 --- a/libs/ui/src/lib/environment/environment.interface.ts +++ b/libs/ui/src/lib/environment/environment.interface.ts @@ -1,5 +1,4 @@ export interface GfEnvironment { lastPublish: string | null; production: boolean; - stripePublicKey: string; } diff --git a/libs/ui/src/lib/mocks/holdings.ts b/libs/ui/src/lib/mocks/holdings.ts index 6e8485c82..0f30b3e6f 100644 --- a/libs/ui/src/lib/mocks/holdings.ts +++ b/libs/ui/src/lib/mocks/holdings.ts @@ -2,6 +2,7 @@ import { PortfolioPosition } from '@ghostfolio/common/interfaces'; export const holdings: PortfolioPosition[] = [ { + activitiesCount: 1, allocationInPercentage: 0.042990776363386086, assetClass: 'EQUITY' as any, assetClassLabel: 'Equity', @@ -45,6 +46,7 @@ export const holdings: PortfolioPosition[] = [ valueInBaseCurrency: 12230 }, { + activitiesCount: 2, allocationInPercentage: 0.02377401948293552, assetClass: 'EQUITY' as any, assetClassLabel: 'Equity', @@ -88,6 +90,7 @@ export const holdings: PortfolioPosition[] = [ valueInBaseCurrency: 6763.224181360202 }, { + activitiesCount: 1, allocationInPercentage: 0.08038536990007467, assetClass: 'EQUITY' as any, assetClassLabel: 'Equity', @@ -131,6 +134,7 @@ export const holdings: PortfolioPosition[] = [ valueInBaseCurrency: 22868 }, { + activitiesCount: 1, allocationInPercentage: 0.19216416482928922, assetClass: 'LIQUIDITY' as any, assetClassLabel: 'Liquidity', @@ -162,6 +166,7 @@ export const holdings: PortfolioPosition[] = [ valueInBaseCurrency: 54666.7898248 }, { + activitiesCount: 1, allocationInPercentage: 0.04307127421937313, assetClass: 'EQUITY' as any, assetClassLabel: 'Equity', @@ -205,6 +210,7 @@ export const holdings: PortfolioPosition[] = [ valueInBaseCurrency: 12252.9 }, { + activitiesCount: 1, allocationInPercentage: 0.18762679306394897, assetClass: 'EQUITY' as any, assetClassLabel: 'Equity', @@ -248,6 +254,7 @@ export const holdings: PortfolioPosition[] = [ valueInBaseCurrency: 53376 }, { + activitiesCount: 5, allocationInPercentage: 0.053051250766657634, assetClass: 'EQUITY' as any, assetClassLabel: 'Equity', diff --git a/package-lock.json b/package-lock.json index b8e9295ed..f863292cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ghostfolio", - "version": "2.231.0", + "version": "2.233.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ghostfolio", - "version": "2.231.0", + "version": "2.233.0", "hasInstallScript": true, "license": "AGPL-3.0", "dependencies": { @@ -141,7 +141,7 @@ "jest-environment-jsdom": "30.2.0", "jest-preset-angular": "16.0.0", "nx": "22.3.3", - "prettier": "3.7.4", + "prettier": "3.8.0", "prettier-plugin-organize-attributes": "1.0.0", "prisma": "6.19.0", "react": "18.2.0", @@ -28255,9 +28255,9 @@ } }, "node_modules/prettier": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", - "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.0.tgz", + "integrity": "sha512-yEPsovQfpxYfgWNhCfECjG5AQaO+K3dp6XERmOepyPDVqcJm+bjyCVO3pmU+nAPe0N5dDvekfGezt/EIiRe1TA==", "dev": true, "license": "MIT", "bin": { diff --git a/package.json b/package.json index 0b5a28deb..940c674c6 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ghostfolio", - "version": "2.231.0", + "version": "2.233.0", "homepage": "https://ghostfol.io", "license": "AGPL-3.0", "repository": "https://github.com/ghostfolio/ghostfolio", @@ -185,7 +185,7 @@ "jest-environment-jsdom": "30.2.0", "jest-preset-angular": "16.0.0", "nx": "22.3.3", - "prettier": "3.7.4", + "prettier": "3.8.0", "prettier-plugin-organize-attributes": "1.0.0", "prisma": "6.19.0", "react": "18.2.0",