Browse Source

Merge branch 'main' into task/upgrade-to-prisma-7

pull/6027/head
Kenrick Tandrian 5 days ago
committed by GitHub
parent
commit
ffe54c4fa7
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 22
      CHANGELOG.md
  2. 1
      apps/api/src/app/import/import.controller.ts
  3. 2
      apps/api/src/app/import/import.module.ts
  4. 73
      apps/api/src/app/import/import.service.ts
  5. 21
      apps/api/src/app/order/order.service.ts
  6. 34
      apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts
  7. 13
      apps/api/src/app/portfolio/portfolio.service.ts
  8. 152
      apps/api/src/assets/cryptocurrencies/cryptocurrencies.json
  9. 2
      apps/client/src/app/app.component.ts
  10. 2
      apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts
  11. 2
      apps/client/src/app/components/admin-jobs/admin-jobs.component.ts
  12. 3
      apps/client/src/app/components/admin-market-data/admin-market-data.component.ts
  13. 2
      apps/client/src/app/components/admin-market-data/admin-market-data.service.ts
  14. 3
      apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts
  15. 3
      apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts
  16. 3
      apps/client/src/app/components/admin-overview/admin-overview.component.ts
  17. 3
      apps/client/src/app/components/admin-platform/admin-platform.component.ts
  18. 3
      apps/client/src/app/components/admin-settings/admin-settings.component.ts
  19. 2
      apps/client/src/app/components/admin-tag/admin-tag.component.ts
  20. 3
      apps/client/src/app/components/admin-users/admin-users.component.ts
  21. 2
      apps/client/src/app/components/data-provider-status/data-provider-status.component.ts
  22. 2
      apps/client/src/app/components/header/header.component.ts
  23. 2
      apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts
  24. 2
      apps/client/src/app/components/home-holdings/home-holdings.component.ts
  25. 2
      apps/client/src/app/components/home-market/home-market.component.ts
  26. 2
      apps/client/src/app/components/home-overview/home-overview.component.ts
  27. 2
      apps/client/src/app/components/home-summary/home-summary.component.ts
  28. 2
      apps/client/src/app/components/home-watchlist/home-watchlist.component.ts
  29. 2
      apps/client/src/app/components/markets/markets.component.ts
  30. 2
      apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts
  31. 2
      apps/client/src/app/components/user-account-access/user-account-access.component.ts
  32. 2
      apps/client/src/app/components/user-account-membership/user-account-membership.component.ts
  33. 2
      apps/client/src/app/components/user-account-settings/user-account-settings.component.ts
  34. 2
      apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts
  35. 2
      apps/client/src/app/core/auth.guard.ts
  36. 2
      apps/client/src/app/core/http-response.interceptor.ts
  37. 2
      apps/client/src/app/pages/about/about-page.component.ts
  38. 2
      apps/client/src/app/pages/about/overview/about-overview-page.component.ts
  39. 2
      apps/client/src/app/pages/accounts/accounts-page.component.ts
  40. 2
      apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts
  41. 2
      apps/client/src/app/pages/blog/blog-page.component.ts
  42. 2
      apps/client/src/app/pages/demo/demo-page.component.ts
  43. 2
      apps/client/src/app/pages/faq/faq-page.component.ts
  44. 2
      apps/client/src/app/pages/features/features-page.component.ts
  45. 2
      apps/client/src/app/pages/landing/landing-page.component.ts
  46. 2
      apps/client/src/app/pages/open/open-page.component.ts
  47. 2
      apps/client/src/app/pages/portfolio/activities/activities-page.component.ts
  48. 2
      apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts
  49. 2
      apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts
  50. 2
      apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts
  51. 2
      apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts
  52. 2
      apps/client/src/app/pages/portfolio/fire/fire-page.component.ts
  53. 2
      apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts
  54. 2
      apps/client/src/app/pages/pricing/pricing-page.component.ts
  55. 2
      apps/client/src/app/pages/public/public-page.component.ts
  56. 2
      apps/client/src/app/pages/register/register-page.component.ts
  57. 2
      apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts
  58. 2
      apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts
  59. 2
      apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts
  60. 4
      apps/client/src/environments/environment.prod.ts
  61. 4
      apps/client/src/environments/environment.ts
  62. 5
      apps/client/src/main.ts
  63. 4
      eslint.config.cjs
  64. 2
      libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts
  65. 11
      libs/ui/src/lib/accounts-table/accounts-table.component.html
  66. 4
      libs/ui/src/lib/assistant/assistant.component.ts
  67. 3
      libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts
  68. 5
      libs/ui/src/lib/environment/environment.interface.ts
  69. 7
      libs/ui/src/lib/environment/environment.token.ts
  70. 2
      libs/ui/src/lib/environment/index.ts
  71. 4
      libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts
  72. 3
      libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts
  73. 12
      libs/ui/src/lib/services/admin.service.ts
  74. 0
      libs/ui/src/lib/services/data.service.ts
  75. 2
      libs/ui/src/lib/services/index.ts
  76. 3
      libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts
  77. 20
      package-lock.json
  78. 6
      package.json

22
CHANGELOG.md

@ -7,6 +7,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## Unreleased ## Unreleased
### Changed
- Set the active sort column in the accounts table component
- Deprecated `activities` in the endpoint `GET api/v1/portfolio/holding/:dataSource/:symbol`
- Moved the admin service to `@ghostfolio/ui/services`
- Moved the data service to `@ghostfolio/ui/services`
- Refactored the dividend import
- Refreshed the cryptocurrencies list
- Upgraded `prisma` from version `6.19.0` to `7.2.0`
### Fixed
- Fixed the filtering by asset class in the endpoint `GET api/v1/portfolio/holdings`
## 2.228.0 - 2026-01-03
### Added ### Added
- Extended the portfolio holdings to include performance with currency effects for cash positions - Extended the portfolio holdings to include performance with currency effects for cash positions
@ -16,7 +32,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- Integrated the endpoint to get all platforms (`GET api/v1/platforms`) into the create or update account dialog - Integrated the endpoint to get all platforms (`GET api/v1/platforms`) into the create or update account dialog
- Extracted the scraper configuration to a dedicated tab in the asset profile details dialog of the admin control panel - Extracted the scraper configuration to a dedicated tab in the asset profile details dialog of the admin control panel
- Improved the language localization for German (`de`) - Improved the language localization for German (`de`)
- Upgraded `prisma` from version `6.19.0` to `7.2.0` - Upgraded `@date-fns/utc` from version `2.1.0` to `2.1.1`
### Fixed
- Improved the table headers’ alignment of the accounts table on mobile
## 2.227.0 - 2026-01-02 ## 2.227.0 - 2026-01-02

1
apps/api/src/app/import/import.controller.ts

@ -103,6 +103,7 @@ export class ImportController {
const activities = await this.importService.getDividends({ const activities = await this.importService.getDividends({
dataSource, dataSource,
symbol, symbol,
userCurrency: this.request.user.settings.settings.baseCurrency,
userId: this.request.user.id userId: this.request.user.id
}); });

2
apps/api/src/app/import/import.module.ts

@ -6,6 +6,7 @@ import { PortfolioModule } from '@ghostfolio/api/app/portfolio/portfolio.module'
import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module'; import { RedisCacheModule } from '@ghostfolio/api/app/redis-cache/redis-cache.module';
import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module'; import { TransformDataSourceInRequestModule } from '@ghostfolio/api/interceptors/transform-data-source-in-request/transform-data-source-in-request.module';
import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module'; import { TransformDataSourceInResponseModule } from '@ghostfolio/api/interceptors/transform-data-source-in-response/transform-data-source-in-response.module';
import { ApiModule } from '@ghostfolio/api/services/api/api.module';
import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module'; import { ConfigurationModule } from '@ghostfolio/api/services/configuration/configuration.module';
import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module'; import { DataProviderModule } from '@ghostfolio/api/services/data-provider/data-provider.module';
import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module'; import { ExchangeRateDataModule } from '@ghostfolio/api/services/exchange-rate-data/exchange-rate-data.module';
@ -24,6 +25,7 @@ import { ImportService } from './import.service';
controllers: [ImportController], controllers: [ImportController],
imports: [ imports: [
AccountModule, AccountModule,
ApiModule,
CacheModule, CacheModule,
ConfigurationModule, ConfigurationModule,
DataGatheringModule, DataGatheringModule,

73
apps/api/src/app/import/import.service.ts

@ -2,6 +2,7 @@ import { AccountService } from '@ghostfolio/api/app/account/account.service';
import { OrderService } from '@ghostfolio/api/app/order/order.service'; import { OrderService } from '@ghostfolio/api/app/order/order.service';
import { PlatformService } from '@ghostfolio/api/app/platform/platform.service'; import { PlatformService } from '@ghostfolio/api/app/platform/platform.service';
import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service'; import { PortfolioService } from '@ghostfolio/api/app/portfolio/portfolio.service';
import { ApiService } from '@ghostfolio/api/services/api/api.service';
import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service'; import { ConfigurationService } from '@ghostfolio/api/services/configuration/configuration.service';
import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service'; import { DataProviderService } from '@ghostfolio/api/services/data-provider/data-provider.service';
import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service'; import { MarketDataService } from '@ghostfolio/api/services/market-data/market-data.service';
@ -25,7 +26,7 @@ import {
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { import {
AccountWithPlatform, AccountWithValue,
OrderWithAccount, OrderWithAccount,
UserWithSettings UserWithSettings
} from '@ghostfolio/common/types'; } from '@ghostfolio/common/types';
@ -43,6 +44,7 @@ import { ImportDataDto } from './import-data.dto';
export class ImportService { export class ImportService {
public constructor( public constructor(
private readonly accountService: AccountService, private readonly accountService: AccountService,
private readonly apiService: ApiService,
private readonly configurationService: ConfigurationService, private readonly configurationService: ConfigurationService,
private readonly dataGatheringService: DataGatheringService, private readonly dataGatheringService: DataGatheringService,
private readonly dataProviderService: DataProviderService, private readonly dataProviderService: DataProviderService,
@ -57,8 +59,12 @@ export class ImportService {
public async getDividends({ public async getDividends({
dataSource, dataSource,
symbol, symbol,
userCurrency,
userId userId
}: AssetProfileIdentifier & { userId: string }): Promise<Activity[]> { }: AssetProfileIdentifier & {
userCurrency: string;
userId: string;
}): Promise<Activity[]> {
try { try {
const holding = await this.portfolioService.getHolding({ const holding = await this.portfolioService.getHolding({
dataSource, dataSource,
@ -71,36 +77,45 @@ export class ImportService {
return []; return [];
} }
const { activities, firstBuyDate, historicalData } = holding; const filters = this.apiService.buildFiltersFromQueryParams({
filterByDataSource: dataSource,
filterBySymbol: symbol
});
const [[assetProfile], dividends] = await Promise.all([ const { firstBuyDate, historicalData } = holding;
this.symbolProfileService.getSymbolProfiles([
{
dataSource,
symbol
}
]),
await this.dataProviderService.getDividends({
dataSource,
symbol,
from: parseDate(firstBuyDate),
granularity: 'day',
to: new Date()
})
]);
const accounts = activities const [{ accounts }, { activities }, [assetProfile], dividends] =
.filter(({ account }) => { await Promise.all([
return !!account; this.portfolioService.getAccountsWithAggregations({
}) filters,
.map(({ account }) => { userId,
return account; withExcludedAccounts: true
}); }),
this.orderService.getOrders({
filters,
userCurrency,
userId,
startDate: parseDate(firstBuyDate)
}),
this.symbolProfileService.getSymbolProfiles([
{
dataSource,
symbol
}
]),
await this.dataProviderService.getDividends({
dataSource,
symbol,
from: parseDate(firstBuyDate),
granularity: 'day',
to: new Date()
})
]);
const account = this.isUniqueAccount(accounts) ? accounts[0] : undefined; const account = this.isUniqueAccount(accounts) ? accounts[0] : undefined;
return await Promise.all( return await Promise.all(
Object.entries(dividends).map(async ([dateString, { marketPrice }]) => { Object.entries(dividends).map(([dateString, { marketPrice }]) => {
const quantity = const quantity =
historicalData.find((historicalDataItem) => { historicalData.find((historicalDataItem) => {
return historicalDataItem.date === dateString; return historicalDataItem.date === dateString;
@ -695,11 +710,11 @@ export class ImportService {
); );
} }
private isUniqueAccount(accounts: AccountWithPlatform[]) { private isUniqueAccount(accounts: AccountWithValue[]) {
const uniqueAccountIds = new Set<string>(); const uniqueAccountIds = new Set<string>();
for (const account of accounts) { for (const { id } of accounts) {
uniqueAccountIds.add(account.id); uniqueAccountIds.add(id);
} }
return uniqueAccountIds.size === 1; return uniqueAccountIds.size === 1;

21
apps/api/src/app/order/order.service.ts

@ -329,19 +329,39 @@ export class OrderService {
* performance tracking based on exchange rate fluctuations. * performance tracking based on exchange rate fluctuations.
* *
* @param cashDetails - The cash balance details. * @param cashDetails - The cash balance details.
* @param filters - Optional filters to apply.
* @param userCurrency - The base currency of the user. * @param userCurrency - The base currency of the user.
* @param userId - The ID of the user. * @param userId - The ID of the user.
* @returns A response containing the list of synthetic cash activities. * @returns A response containing the list of synthetic cash activities.
*/ */
public async getCashOrders({ public async getCashOrders({
cashDetails, cashDetails,
filters = [],
userCurrency, userCurrency,
userId userId
}: { }: {
cashDetails: CashDetails; cashDetails: CashDetails;
filters?: Filter[];
userCurrency: string; userCurrency: string;
userId: string; userId: string;
}): Promise<ActivitiesResponse> { }): Promise<ActivitiesResponse> {
const filtersByAssetClass = filters.filter(({ type }) => {
return type === 'ASSET_CLASS';
});
if (
filtersByAssetClass.length > 0 &&
!filtersByAssetClass.find(({ id }) => {
return id === AssetClass.LIQUIDITY;
})
) {
// If asset class filters are present and none of them is liquidity, return an empty response
return {
activities: [],
count: 0
};
}
const activities: Activity[] = []; const activities: Activity[] = [];
for (const account of cashDetails.accounts) { for (const account of cashDetails.accounts) {
@ -755,6 +775,7 @@ export class OrderService {
const cashOrders = await this.getCashOrders({ const cashOrders = await this.getCashOrders({
cashDetails, cashDetails,
filters,
userCurrency, userCurrency,
userId userId
}); });

34
apps/api/src/app/portfolio/calculator/roai/portfolio-calculator-cash.spec.ts

@ -18,6 +18,7 @@ import { HistoricalDataItem } from '@ghostfolio/common/interfaces';
import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type'; import { PerformanceCalculationType } from '@ghostfolio/common/types/performance-calculation-type.type';
import { DataSource } from '@prisma/client'; import { DataSource } from '@prisma/client';
import { Big } from 'big.js';
import { randomUUID } from 'node:crypto'; import { randomUUID } from 'node:crypto';
jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => { jest.mock('@ghostfolio/api/app/portfolio/current-rate.service', () => {
@ -207,17 +208,23 @@ describe('PortfolioCalculator', () => {
userId: userDummyData.id userId: userDummyData.id
}); });
const { historicalData } = await portfolioCalculator.computeSnapshot(); const portfolioSnapshot = await portfolioCalculator.computeSnapshot();
const historicalData20231231 = historicalData.find(({ date }) => { const historicalData20231231 = portfolioSnapshot.historicalData.find(
return date === '2023-12-31'; ({ date }) => {
}); return date === '2023-12-31';
const historicalData20240101 = historicalData.find(({ date }) => { }
return date === '2024-01-01'; );
}); const historicalData20240101 = portfolioSnapshot.historicalData.find(
const historicalData20241231 = historicalData.find(({ date }) => { ({ date }) => {
return date === '2024-12-31'; return date === '2024-01-01';
}); }
);
const historicalData20241231 = portfolioSnapshot.historicalData.find(
({ date }) => {
return date === '2024-12-31';
}
);
/** /**
* Investment value with currency effect: 1000 USD * 0.85 = 850 CHF * Investment value with currency effect: 1000 USD * 0.85 = 850 CHF
@ -285,6 +292,13 @@ describe('PortfolioCalculator', () => {
value: 1820, value: 1820,
valueWithCurrencyEffect: 1800 valueWithCurrencyEffect: 1800
}); });
expect(portfolioSnapshot).toMatchObject({
hasErrors: false,
totalFeesWithCurrencyEffect: new Big('0'),
totalInterestWithCurrencyEffect: new Big('0'),
totalLiabilitiesWithCurrencyEffect: new Big('0')
});
}); });
}); });
}); });

13
apps/api/src/app/portfolio/portfolio.service.ts

@ -1872,18 +1872,17 @@ export class PortfolioService {
netPerformanceWithCurrencyEffect netPerformanceWithCurrencyEffect
} = performance; } = performance;
const dividendInBaseCurrency =
await portfolioCalculator.getDividendInBaseCurrency();
const totalEmergencyFund = this.getTotalEmergencyFund({ const totalEmergencyFund = this.getTotalEmergencyFund({
emergencyFundHoldingsValueInBaseCurrency, emergencyFundHoldingsValueInBaseCurrency,
userSettings: user.settings?.settings as UserSettings userSettings: user.settings?.settings as UserSettings
}); });
const fees = await portfolioCalculator.getFeesInBaseCurrency(); const dateOfFirstActivity = portfolioCalculator.getStartDate();
const firstOrderDate = portfolioCalculator.getStartDate(); const dividendInBaseCurrency =
await portfolioCalculator.getDividendInBaseCurrency();
const fees = await portfolioCalculator.getFeesInBaseCurrency();
const interest = await portfolioCalculator.getInterestInBaseCurrency(); const interest = await portfolioCalculator.getInterestInBaseCurrency();
const liabilities = const liabilities =
@ -1941,7 +1940,7 @@ export class PortfolioService {
.minus(liabilities) .minus(liabilities)
.toNumber(); .toNumber();
const daysInMarket = differenceInDays(new Date(), firstOrderDate); const daysInMarket = differenceInDays(new Date(), dateOfFirstActivity);
const annualizedPerformancePercent = getAnnualizedPerformancePercent({ const annualizedPerformancePercent = getAnnualizedPerformancePercent({
daysInMarket, daysInMarket,
@ -1960,6 +1959,7 @@ export class PortfolioService {
annualizedPerformancePercent, annualizedPerformancePercent,
annualizedPerformancePercentWithCurrencyEffect, annualizedPerformancePercentWithCurrencyEffect,
cash, cash,
dateOfFirstActivity,
excludedAccountsAndActivities, excludedAccountsAndActivities,
netPerformance, netPerformance,
netPerformancePercentage, netPerformancePercentage,
@ -1972,7 +1972,6 @@ export class PortfolioService {
}).length, }).length,
committedFunds: committedFunds.toNumber(), committedFunds: committedFunds.toNumber(),
currentValueInBaseCurrency: currentValueInBaseCurrency.toNumber(), currentValueInBaseCurrency: currentValueInBaseCurrency.toNumber(),
dateOfFirstActivity: firstOrderDate,
dividendInBaseCurrency: dividendInBaseCurrency.toNumber(), dividendInBaseCurrency: dividendInBaseCurrency.toNumber(),
emergencyFund: { emergencyFund: {
assets: emergencyFundHoldingsValueInBaseCurrency, assets: emergencyFundHoldingsValueInBaseCurrency,

152
apps/api/src/assets/cryptocurrencies/cryptocurrencies.json

@ -22,6 +22,7 @@
"2015": "2015 coin", "2015": "2015 coin",
"2024": "2024", "2024": "2024",
"2025": "2025 TOKEN", "2025": "2025 TOKEN",
"2026": "2026",
"2049": "TOKEN 2049", "2049": "TOKEN 2049",
"2192": "LERNITAS", "2192": "LERNITAS",
"4444": "4444 Meme", "4444": "4444 Meme",
@ -83,6 +84,7 @@
"1UP": "Uptrennd", "1UP": "Uptrennd",
"1WO": "1World", "1WO": "1World",
"2022M": "2022MOON", "2022M": "2022MOON",
"2026MEMECLUB": "2026",
"20EX": "20ex", "20EX": "20ex",
"21BTC": "21.co Wrapped BTC", "21BTC": "21.co Wrapped BTC",
"21X": "21X", "21X": "21X",
@ -177,11 +179,13 @@
"AAI": "AutoAir AI", "AAI": "AutoAir AI",
"AAPLX": "Apple xStock", "AAPLX": "Apple xStock",
"AAPX": "AMPnet", "AAPX": "AMPnet",
"AARBWBTC": "Aave Arbitrum WBTC",
"AARDY": "Baby Aardvark", "AARDY": "Baby Aardvark",
"AARK": "Aark", "AARK": "Aark",
"AART": "ALL.ART", "AART": "ALL.ART",
"AAST": "AASToken", "AAST": "AASToken",
"AAT": "Agricultural Trade Chain", "AAT": "Agricultural Trade Chain",
"AAVAWBTC": "Aave aWBTC",
"AAVE": "Aave", "AAVE": "Aave",
"AAVEE": "AAVE.e (Avalanche Bride)", "AAVEE": "AAVE.e (Avalanche Bride)",
"AAVEGOTCHIFOMO": "Aavegotchi FOMO", "AAVEGOTCHIFOMO": "Aavegotchi FOMO",
@ -295,7 +299,8 @@
"ADEL": "Akropolis Delphi", "ADEL": "Akropolis Delphi",
"ADF": "Art de Finance", "ADF": "Art de Finance",
"ADH": "Adhive", "ADH": "Adhive",
"ADI": "Aditus", "ADI": "ADI",
"ADITUS": "Aditus",
"ADIX": "Adix Token", "ADIX": "Adix Token",
"ADK": "Aidos Kuneen", "ADK": "Aidos Kuneen",
"ADL": "Adel", "ADL": "Adel",
@ -412,6 +417,7 @@
"AGVC": "AgaveCoin", "AGVC": "AgaveCoin",
"AGVE": "Agave", "AGVE": "Agave",
"AGX": "Agricoin", "AGX": "Agricoin",
"AHARWBTC": "Aave Harmony WBTC",
"AHOO": "Ahoolee", "AHOO": "Ahoolee",
"AHT": "AhaToken", "AHT": "AhaToken",
"AI": "Sleepless", "AI": "Sleepless",
@ -626,6 +632,7 @@
"ALITA": "Alita Network", "ALITA": "Alita Network",
"ALITATOKEN": "Alita Token", "ALITATOKEN": "Alita Token",
"ALIX": "AlinX", "ALIX": "AlinX",
"ALK": "Alkemi Network DAO Token",
"ALKI": "Alkimi", "ALKI": "Alkimi",
"ALKIMI": "ALKIMI", "ALKIMI": "ALKIMI",
"ALLBI": "ALL BEST ICO", "ALLBI": "ALL BEST ICO",
@ -639,6 +646,7 @@
"ALMANAK": "Almanak", "ALMANAK": "Almanak",
"ALMC": "Awkward Look Monkey Club", "ALMC": "Awkward Look Monkey Club",
"ALME": "Alita", "ALME": "Alita",
"ALMEELA": "Almeela",
"ALMOND": "Almond", "ALMOND": "Almond",
"ALN": "Aluna", "ALN": "Aluna",
"ALNV1": "Aluna v1", "ALNV1": "Aluna v1",
@ -690,6 +698,7 @@
"AMAL": "AMAL", "AMAL": "AMAL",
"AMAPT": "Amnis Finance", "AMAPT": "Amnis Finance",
"AMATEN": "Amaten", "AMATEN": "Amaten",
"AMATO": "AMATO",
"AMAZINGTEAM": "AmazingTeamDAO", "AMAZINGTEAM": "AmazingTeamDAO",
"AMB": "AirDAO", "AMB": "AirDAO",
"AMBER": "AmberCoin", "AMBER": "AmberCoin",
@ -825,6 +834,7 @@
"AOK": "AOK", "AOK": "AOK",
"AOL": "AOL (America Online)", "AOL": "AOL (America Online)",
"AOP": "Ark Of Panda", "AOP": "Ark Of Panda",
"AOPTWBTC": "Aave Optimism WBTC",
"AOS": "AOS", "AOS": "AOS",
"AOT": "Age of Tanks", "AOT": "Age of Tanks",
"AP": "America Party", "AP": "America Party",
@ -861,6 +871,7 @@
"APOL": "Apollo FTW", "APOL": "Apollo FTW",
"APOLL": "Apollon Limassol", "APOLL": "Apollon Limassol",
"APOLLO": "Apollo Crypto", "APOLLO": "Apollo Crypto",
"APOLWBTC": "Aave Polygon WBTC",
"APP": "Moon App", "APP": "Moon App",
"APPA": "Dappad", "APPA": "Dappad",
"APPC": "AppCoins", "APPC": "AppCoins",
@ -914,6 +925,7 @@
"ARAW": "Araw", "ARAW": "Araw",
"ARB": "Arbitrum", "ARB": "Arbitrum",
"ARBI": "Arbipad", "ARBI": "Arbipad",
"ARBINU": "ArbInu",
"ARBIT": "Arbit Coin", "ARBIT": "Arbit Coin",
"ARBP": "ARB Protocol", "ARBP": "ARB Protocol",
"ARBS": "Arbswap", "ARBS": "Arbswap",
@ -1041,6 +1053,7 @@
"ASBNB": "Astherus Staked BNB", "ASBNB": "Astherus Staked BNB",
"ASC": "All InX SMART CHAIN", "ASC": "All InX SMART CHAIN",
"ASCEND": "Ascend", "ASCEND": "Ascend",
"ASCN": "AlphaScan",
"ASD": "AscendEX Token", "ASD": "AscendEX Token",
"ASDEX": "AstraDEX", "ASDEX": "AstraDEX",
"ASEED": "aUSD SEED (Acala)", "ASEED": "aUSD SEED (Acala)",
@ -1133,6 +1146,7 @@
"ATLA": "Atleta Network", "ATLA": "Atleta Network",
"ATLAS": "Star Atlas", "ATLAS": "Star Atlas",
"ATLASD": "Atlas DEX", "ATLASD": "Atlas DEX",
"ATLASOFUSA": "Atlas",
"ATLX": "Atlantis Loans Polygon", "ATLX": "Atlantis Loans Polygon",
"ATM": "Atletico de Madrid Fan Token", "ATM": "Atletico de Madrid Fan Token",
"ATMA": "ATMA", "ATMA": "ATMA",
@ -1173,6 +1187,7 @@
"AUCO": "Advanced United Continent", "AUCO": "Advanced United Continent",
"AUCTION": "Bounce", "AUCTION": "Bounce",
"AUDC": "Aussie Digital", "AUDC": "Aussie Digital",
"AUDD": "Australian Digital Dollar",
"AUDF": "Forte AUD", "AUDF": "Forte AUD",
"AUDIO": "Audius", "AUDIO": "Audius",
"AUDM": "Macropod Stablecoin", "AUDM": "Macropod Stablecoin",
@ -1260,6 +1275,7 @@
"AWARE": "ChainAware.ai", "AWARE": "ChainAware.ai",
"AWARETOKEN": "AWARE", "AWARETOKEN": "AWARE",
"AWAX": "AWAX", "AWAX": "AWAX",
"AWBTC": "Aave interest bearing WBTC",
"AWC": "Atomic Wallet Coin", "AWC": "Atomic Wallet Coin",
"AWE": "AWE Network", "AWE": "AWE Network",
"AWK": "Awkward Monkey Base", "AWK": "Awkward Monkey Base",
@ -1302,6 +1318,7 @@
"AXT": "AIX", "AXT": "AIX",
"AXYS": "Axys", "AXYS": "Axys",
"AYA": "Aryacoin", "AYA": "Aryacoin",
"AYFI": "Aave YFI",
"AYNI": "Ayni Gold", "AYNI": "Ayni Gold",
"AZ": "Azbit", "AZ": "Azbit",
"AZA": "Kaliza", "AZA": "Kaliza",
@ -1314,6 +1331,7 @@
"AZR": "Azure", "AZR": "Azure",
"AZU": "Azultec", "AZU": "Azultec",
"AZUKI": "Azuki", "AZUKI": "Azuki",
"AZUKI2": "AZUKI 2.0",
"AZUKIDAO": "AzukiDAO", "AZUKIDAO": "AzukiDAO",
"AZUM": "Azuma Coin", "AZUM": "Azuma Coin",
"AZUR": "Azuro Protocol", "AZUR": "Azuro Protocol",
@ -1535,6 +1553,7 @@
"BAOM": "Battle of Memes", "BAOM": "Battle of Memes",
"BAOS": "BaoBaoSol", "BAOS": "BaoBaoSol",
"BAOV1": "BaoToken v1", "BAOV1": "BaoToken v1",
"BAP3X": "bAP3X",
"BAR": "FC Barcelona Fan Token", "BAR": "FC Barcelona Fan Token",
"BARA": "Capybara", "BARA": "Capybara",
"BARAKATUH": "Barakatuh", "BARAKATUH": "Barakatuh",
@ -1678,6 +1697,7 @@
"BCOINM": "Bomb Crypto (MATIC)", "BCOINM": "Bomb Crypto (MATIC)",
"BCOINSOL": "Bomb Crypto (SOL)", "BCOINSOL": "Bomb Crypto (SOL)",
"BCOINTON": "Bomb Crypto (TON)", "BCOINTON": "Bomb Crypto (TON)",
"BCONG": "BabyCong",
"BCOQ": "BLACK COQINU", "BCOQ": "BLACK COQINU",
"BCP": "BlockChainPeople", "BCP": "BlockChainPeople",
"BCPAY": "Bitcashpay", "BCPAY": "Bitcashpay",
@ -1735,6 +1755,7 @@
"BEATAI": "eBeat AI", "BEATAI": "eBeat AI",
"BEATLES": "JohnLennonC0IN", "BEATLES": "JohnLennonC0IN",
"BEATS": "Sol Beats", "BEATS": "Sol Beats",
"BEATSWAP": "BeatSwap",
"BEATTOKEN": "BEAT Token", "BEATTOKEN": "BEAT Token",
"BEAVER": "beaver", "BEAVER": "beaver",
"BEB1M": "BeB", "BEB1M": "BeB",
@ -1851,6 +1872,7 @@
"BFLOKI": "BurnFloki", "BFLOKI": "BurnFloki",
"BFLY": "Butterfly Protocol", "BFLY": "Butterfly Protocol",
"BFM": "BenefitMine", "BFM": "BenefitMine",
"BFR": "Buffer Token",
"BFT": "BF Token", "BFT": "BF Token",
"BFTB": "Brazil Fan Token", "BFTB": "Brazil Fan Token",
"BFTC": "BITS FACTOR", "BFTC": "BITS FACTOR",
@ -2098,6 +2120,7 @@
"BLACKSALE": "Black Sale", "BLACKSALE": "Black Sale",
"BLACKST": "Black Stallion", "BLACKST": "Black Stallion",
"BLACKSWAN": "BlackSwan AI", "BLACKSWAN": "BlackSwan AI",
"BLACKWHALE": "The Black Whale",
"BLADE": "BladeGames", "BLADE": "BladeGames",
"BLADEW": "BladeWarrior", "BLADEW": "BladeWarrior",
"BLAKEBTC": "BlakeBitcoin", "BLAKEBTC": "BlakeBitcoin",
@ -2143,7 +2166,8 @@
"BLOB": "B.O.B the Blob", "BLOB": "B.O.B the Blob",
"BLOBERC20": "Blob", "BLOBERC20": "Blob",
"BLOC": "Blockcloud", "BLOC": "Blockcloud",
"BLOCK": "Blockasset", "BLOCK": "Block",
"BLOCKASSET": "Blockasset",
"BLOCKB": "Block Browser", "BLOCKB": "Block Browser",
"BLOCKBID": "Blockbid", "BLOCKBID": "Blockbid",
"BLOCKF": "Block Farm Club", "BLOCKF": "Block Farm Club",
@ -2218,6 +2242,7 @@
"BM": "BitMoon", "BM": "BitMoon",
"BMAGA": "Baby Maga", "BMAGA": "Baby Maga",
"BMARS": "Binamars", "BMARS": "Binamars",
"BMAX": "BMAX",
"BMB": "Beamable Network Token", "BMB": "Beamable Network Token",
"BMBO": "Bamboo Coin", "BMBO": "Bamboo Coin",
"BMC": "Blackmoon Crypto", "BMC": "Blackmoon Crypto",
@ -2495,6 +2520,7 @@
"BOWSC": "BowsCoin", "BOWSC": "BowsCoin",
"BOWSER": "Bowser", "BOWSER": "Bowser",
"BOX": "DeBoxToken", "BOX": "DeBoxToken",
"BOXABL": "BOXABL",
"BOXCAT": "BOXCAT", "BOXCAT": "BOXCAT",
"BOXETH": "Cat-in-a-Box Ether", "BOXETH": "Cat-in-a-Box Ether",
"BOXT": "BOX Token", "BOXT": "BOX Token",
@ -2579,6 +2605,7 @@
"BRETTGOLD": "Brett Gold", "BRETTGOLD": "Brett Gold",
"BRETTONETH": "Brett ETH", "BRETTONETH": "Brett ETH",
"BRETTSUI": "Brett (brettsui.com)", "BRETTSUI": "Brett (brettsui.com)",
"BREV": "Brevis Token",
"BREW": "CafeSwap Token", "BREW": "CafeSwap Token",
"BREWERY": "Brewery Consortium Coin", "BREWERY": "Brewery Consortium Coin",
"BREWLABS": "Brewlabs", "BREWLABS": "Brewlabs",
@ -2737,6 +2764,7 @@
"BTCAS": "BitcoinAsia", "BTCAS": "BitcoinAsia",
"BTCAT": "Bitcoin Cat", "BTCAT": "Bitcoin Cat",
"BTCB": "Bitcoin BEP2", "BTCB": "Bitcoin BEP2",
"BTCBAM": "BitCoin Bam",
"BTCBASE": "Bitcoin on Base", "BTCBASE": "Bitcoin on Base",
"BTCBR": "Bitcoin BR", "BTCBR": "Bitcoin BR",
"BTCBRV1": "Bitcoin BR v1", "BTCBRV1": "Bitcoin BR v1",
@ -3126,7 +3154,8 @@
"CASPER": "Casper DeFi", "CASPER": "Casper DeFi",
"CASPERTOKEN": "Casper Token", "CASPERTOKEN": "Casper Token",
"CASPUR": "Caspur Zoomies", "CASPUR": "Caspur Zoomies",
"CAST": "Castello Coin", "CAST": "CAST ORACLES",
"CASTELLOCOIN": "Castello Coin",
"CASTLE": "bitCastle", "CASTLE": "bitCastle",
"CAT": "Simon's Cat", "CAT": "Simon's Cat",
"CATA": "CATAMOTO", "CATA": "CATAMOTO",
@ -3236,6 +3265,7 @@
"CBX": "CropBytes", "CBX": "CropBytes",
"CBXRP": "Coinbase Wrapped XRP", "CBXRP": "Coinbase Wrapped XRP",
"CBY": "Carbify", "CBY": "Carbify",
"CBYTE": "CBYTE",
"CC": "Canton Coin", "CC": "Canton Coin",
"CC10": "Cryptocurrency Top 10 Tokens Index", "CC10": "Cryptocurrency Top 10 Tokens Index",
"CCA": "CCA", "CCA": "CCA",
@ -3310,6 +3340,7 @@
"CENTRA": "Centra", "CENTRA": "Centra",
"CENTS": "Centience", "CENTS": "Centience",
"CENX": "Centcex", "CENX": "Centcex",
"CEO": "CEO",
"CEODOGE": "CEO DOGE", "CEODOGE": "CEO DOGE",
"CERBER": "CERBEROGE", "CERBER": "CERBEROGE",
"CERE": "Cere Network", "CERE": "Cere Network",
@ -3695,7 +3726,8 @@
"COC": "Coin of the champions", "COC": "Coin of the champions",
"COCAINE": "THE GOOD STUFF", "COCAINE": "THE GOOD STUFF",
"COCK": "Shibacock", "COCK": "Shibacock",
"COCO": "COCO COIN", "COCO": "coco",
"COCOCOIN": "COCO COIN",
"COCONUT": "Coconut", "COCONUT": "Coconut",
"COCOR": "Cocoro", "COCOR": "Cocoro",
"COCORO": "Cocoro", "COCORO": "Cocoro",
@ -3726,6 +3758,7 @@
"COI": "Coinnec", "COI": "Coinnec",
"COINAI": "Coinbase AI Agent", "COINAI": "Coinbase AI Agent",
"COINB": "Coinbidex", "COINB": "Coinbidex",
"COINBANK": "CoinBank",
"COINBT": "CoinBot", "COINBT": "CoinBot",
"COINBUCK": "Coinbuck", "COINBUCK": "Coinbuck",
"COINDEALTOKEN": "CoinDeal Token", "COINDEALTOKEN": "CoinDeal Token",
@ -3750,6 +3783,7 @@
"COLA": "Cola", "COLA": "Cola",
"COLISEUM": "Coliseum", "COLISEUM": "Coliseum",
"COLL": "Collateral Pay", "COLL": "Collateral Pay",
"COLLAB": "Collab.Land",
"COLLAR": "PolyPup Finance", "COLLAR": "PolyPup Finance",
"COLLAT": "Collaterize", "COLLAT": "Collaterize",
"COLLE": "Collective Care", "COLLE": "Collective Care",
@ -3970,6 +4004,7 @@
"CREPECOIN": "Crepe Coin", "CREPECOIN": "Crepe Coin",
"CRES": "Cresio", "CRES": "Cresio",
"CRESV1": "Cresio v1", "CRESV1": "Cresio v1",
"CRETA": "Creta World",
"CREV": "CryptoRevolution", "CREV": "CryptoRevolution",
"CREVA": "Creva Coin", "CREVA": "Creva Coin",
"CREW": "CREW INU", "CREW": "CREW INU",
@ -4778,8 +4813,10 @@
"DINGER": "Dinger Token", "DINGER": "Dinger Token",
"DINGO": "Dingocoin", "DINGO": "Dingocoin",
"DINNER": "Trump Dinner", "DINNER": "Trump Dinner",
"DINO": "DinoLFG", "DINO": "DINO",
"DINOLFG": "DinoLFG",
"DINOS": "Dinosaur Inu", "DINOS": "Dinosaur Inu",
"DINOSOL": "DINOSOL",
"DINOSWAP": "DinoSwap", "DINOSWAP": "DinoSwap",
"DINT": "DinarTether", "DINT": "DinarTether",
"DINU": "Dogey-Inu", "DINU": "Dogey-Inu",
@ -4974,6 +5011,7 @@
"DOGEZILLA": "DogeZilla", "DOGEZILLA": "DogeZilla",
"DOGEZILLAV1": "DogeZilla v1", "DOGEZILLAV1": "DogeZilla v1",
"DOGG": "Doggo", "DOGG": "Doggo",
"DOGGO": "DOGGO",
"DOGGS": "Doggensnout", "DOGGS": "Doggensnout",
"DOGGY": "Doggy", "DOGGY": "Doggy",
"DOGGYCOIN": "DOGGY", "DOGGYCOIN": "DOGGY",
@ -5487,6 +5525,7 @@
"EGGC": "EggCoin", "EGGC": "EggCoin",
"EGGMAN": "Eggman Inu", "EGGMAN": "Eggman Inu",
"EGGP": "Eggplant Finance", "EGGP": "Eggplant Finance",
"EGGT": "Egg N Partners",
"EGGY": "EGGY", "EGGY": "EGGY",
"EGI": "eGame", "EGI": "eGame",
"EGL": "The Eagle Of Truth", "EGL": "The Eagle Of Truth",
@ -5711,6 +5750,7 @@
"EPETS": "Etherpets", "EPETS": "Etherpets",
"EPIC": "Epic Chain", "EPIC": "Epic Chain",
"EPICCASH": "Epic Cash", "EPICCASH": "Epic Cash",
"EPICV1": "Ethernity Chain",
"EPIK": "EPIK Token", "EPIK": "EPIK Token",
"EPIKO": "Epiko", "EPIKO": "Epiko",
"EPIX": "Byepix", "EPIX": "Byepix",
@ -6140,6 +6180,7 @@
"FCTC": "FaucetCoin", "FCTC": "FaucetCoin",
"FCTR": "FactorDAO", "FCTR": "FactorDAO",
"FDC": "Fidance", "FDC": "Fidance",
"FDGC": "FINTECH DIGITAL GOLD COIN",
"FDLS": "FIDELIS", "FDLS": "FIDELIS",
"FDM": "Fandom", "FDM": "Fandom",
"FDO": "Firdaos", "FDO": "Firdaos",
@ -6440,7 +6481,9 @@
"FOFARIO": "Fofar", "FOFARIO": "Fofar",
"FOFO": "FOFO", "FOFO": "FOFO",
"FOFOTOKEN": "FOFO Token", "FOFOTOKEN": "FOFO Token",
"FOG": "FOGnet",
"FOGE": "Fat Doge", "FOGE": "Fat Doge",
"FOGV1": "FOGnet v1",
"FOIN": "Foin", "FOIN": "Foin",
"FOL": "Folder Protocol", "FOL": "Folder Protocol",
"FOLD": "Manifold Finance", "FOLD": "Manifold Finance",
@ -6709,6 +6752,7 @@
"FWB": "Friends With Benefits Pro", "FWB": "Friends With Benefits Pro",
"FWBV1": "Friends With Benefits Pro v1", "FWBV1": "Friends With Benefits Pro v1",
"FWC": "Qatar 2022", "FWC": "Qatar 2022",
"FWCL": "Legends",
"FWH": "FigureWifHat", "FWH": "FigureWifHat",
"FWOG": "Fwog", "FWOG": "Fwog",
"FWT": "Freeway Token", "FWT": "Freeway Token",
@ -7042,6 +7086,7 @@
"GIGASWAP": "GigaSwap", "GIGASWAP": "GigaSwap",
"GIGGLE": "Giggle Fund", "GIGGLE": "Giggle Fund",
"GIGGLEACADEMY": "Giggle Academy", "GIGGLEACADEMY": "Giggle Academy",
"GIGL": "GIGGLE PANDA",
"GIGS": "Climate101", "GIGS": "Climate101",
"GIGX": "GigXCoin", "GIGX": "GigXCoin",
"GIKO": "Giko Cat", "GIKO": "Giko Cat",
@ -7558,6 +7603,7 @@
"HACHIKO": "Hachiko Inu Token", "HACHIKO": "Hachiko Inu Token",
"HACHIONB": "Hachi On Base", "HACHIONB": "Hachi On Base",
"HACK": "HACK", "HACK": "HACK",
"HADES": "Hades",
"HAEDAL": "Haedal Protocol", "HAEDAL": "Haedal Protocol",
"HAGGIS": "New Born Haggis Pygmy Hippo", "HAGGIS": "New Born Haggis Pygmy Hippo",
"HAHA": "Hasaki", "HAHA": "Hasaki",
@ -7772,6 +7818,7 @@
"HIENS3": "hiENS3", "HIENS3": "hiENS3",
"HIENS4": "hiENS4", "HIENS4": "hiENS4",
"HIFI": "Hifi Finance", "HIFI": "Hifi Finance",
"HIFIDENZA": "hiFIDENZA",
"HIFLUF": "hiFLUF", "HIFLUF": "hiFLUF",
"HIFRIENDS": "hiFRIENDS", "HIFRIENDS": "hiFRIENDS",
"HIGAZERS": "hiGAZERS", "HIGAZERS": "hiGAZERS",
@ -7811,6 +7858,7 @@
"HITBTC": "HitBTC Token", "HITBTC": "HitBTC Token",
"HITOP": "Hitop", "HITOP": "Hitop",
"HIUNDEAD": "hiUNDEAD", "HIUNDEAD": "hiUNDEAD",
"HIVALHALLA": "hiVALHALLA",
"HIVE": "Hive", "HIVE": "Hive",
"HIVP": "HiveSwap", "HIVP": "HiveSwap",
"HIX": "HELIX Orange", "HIX": "HELIX Orange",
@ -7984,6 +8032,7 @@
"HSN": "Hyper Speed Network", "HSN": "Hyper Speed Network",
"HSOL": "Helius Staked SOL", "HSOL": "Helius Staked SOL",
"HSP": "Horse Power", "HSP": "Horse Power",
"HSR": "Hshare",
"HSS": "Hashshare", "HSS": "Hashshare",
"HST": "Decision Token", "HST": "Decision Token",
"HSUI": "Suicune", "HSUI": "Suicune",
@ -8005,6 +8054,7 @@
"HTN": "Hoosat Network", "HTN": "Hoosat Network",
"HTO": "Heavenland HTO", "HTO": "Heavenland HTO",
"HTR": "Hathor", "HTR": "Hathor",
"HTS": "Home3",
"HTT": "Hello Art", "HTT": "Hello Art",
"HTX": "HTX", "HTX": "HTX",
"HTZ": "Hertz Network", "HTZ": "Hertz Network",
@ -8427,6 +8477,7 @@
"IQN": "IQeon", "IQN": "IQeon",
"IQQ": "Iqoniq", "IQQ": "Iqoniq",
"IQT": "IQ Protocol", "IQT": "IQ Protocol",
"IR": "Infrared Governance Token",
"IRA": "Diligence", "IRA": "Diligence",
"IRC": "IRIS", "IRC": "IRIS",
"IRENA": "Irena Coin Apps", "IRENA": "Irena Coin Apps",
@ -8558,6 +8609,7 @@
"JAWN": "Long Jawn Silvers", "JAWN": "Long Jawn Silvers",
"JAWS": "AutoShark", "JAWS": "AutoShark",
"JAY": "Jaypeggers", "JAY": "Jaypeggers",
"JBC": "Japan Brand Coin",
"JBO": "JBOX", "JBO": "JBOX",
"JBOT": "JACKBOT", "JBOT": "JACKBOT",
"JBS": "JumBucks Coin", "JBS": "JumBucks Coin",
@ -8596,6 +8648,7 @@
"JERRYINUCOM": "Jerry Inu", "JERRYINUCOM": "Jerry Inu",
"JES": "Jesus", "JES": "Jesus",
"JESSE": "jesse", "JESSE": "jesse",
"JESSECOIN": "jesse",
"JEST": "Jester", "JEST": "Jester",
"JESUS": "Jesus Coin", "JESUS": "Jesus Coin",
"JET": "Jet Protocol", "JET": "Jet Protocol",
@ -8624,6 +8677,7 @@
"JIM": "Jim", "JIM": "Jim",
"JIN": "JinPeng", "JIN": "JinPeng",
"JIND": "JINDO INU", "JIND": "JINDO INU",
"JINDO": "JINDOGE",
"JINDOGE": "Jindoge", "JINDOGE": "Jindoge",
"JIO": "JIO Token", "JIO": "JIO Token",
"JITOSOL": "Jito Staked SOL", "JITOSOL": "Jito Staked SOL",
@ -8865,6 +8919,7 @@
"KDC": "Klondike Coin", "KDC": "Klondike Coin",
"KDG": "Kingdom Game 4.0", "KDG": "Kingdom Game 4.0",
"KDIA": "KDIA COIN", "KDIA": "KDIA COIN",
"KDK": "Kodiak Token",
"KDOE": "Kudoe", "KDOE": "Kudoe",
"KDOGE": "KingDoge", "KDOGE": "KingDoge",
"KDT": "Kenyan Digital Token", "KDT": "Kenyan Digital Token",
@ -8926,6 +8981,7 @@
"KGC": "Krypton Galaxy Coin", "KGC": "Krypton Galaxy Coin",
"KGEN": "KGeN", "KGEN": "KGeN",
"KGO": "Kiwigo", "KGO": "Kiwigo",
"KGST": "KGST",
"KGT": "Kaby Gaming Token", "KGT": "Kaby Gaming Token",
"KHAI": "khai", "KHAI": "khai",
"KHEOWZOO": "khaokheowzoo", "KHEOWZOO": "khaokheowzoo",
@ -9074,6 +9130,7 @@
"KNUT": "Knut From Zoo", "KNUT": "Knut From Zoo",
"KNUXX": "Knuxx Bully of ETH", "KNUXX": "Knuxx Bully of ETH",
"KNW": "Knowledge", "KNW": "Knowledge",
"KO": "Kyuzo's Friends",
"KOAI": "KOI", "KOAI": "KOI",
"KOALA": "KOALA", "KOALA": "KOALA",
"KOBAN": "KOBAN", "KOBAN": "KOBAN",
@ -9089,6 +9146,7 @@
"KOII": "Koii", "KOII": "Koii",
"KOIN": "Koinos", "KOIN": "Koinos",
"KOINB": "KoinBülteni Token", "KOINB": "KoinBülteni Token",
"KOINDEX": "KOIN",
"KOINETWORK": "Koi Network", "KOINETWORK": "Koi Network",
"KOIP": "KoiPond", "KOIP": "KoiPond",
"KOJI": "Koji", "KOJI": "Koji",
@ -9548,8 +9606,9 @@
"LIQUIDIUM": "LIQUIDIUM•TOKEN", "LIQUIDIUM": "LIQUIDIUM•TOKEN",
"LIR": "Let it Ride", "LIR": "Let it Ride",
"LIS": "Realis Network", "LIS": "Realis Network",
"LISA": "Lisa Simpson", "LISA": "LISA Token",
"LISAS": "Lisa Simpson", "LISAS": "Lisa Simpson",
"LISASIMPSONCLUB": "Lisa Simpson",
"LIST": "KList Protocol", "LIST": "KList Protocol",
"LISTA": "Lista DAO", "LISTA": "Lista DAO",
"LISTEN": "Listen", "LISTEN": "Listen",
@ -9732,6 +9791,7 @@
"LQT": "Lifty", "LQT": "Lifty",
"LQTY": "Liquity", "LQTY": "Liquity",
"LRC": "Loopring", "LRC": "Loopring",
"LRCV1": "Loopring v1",
"LRDS": "BLOCKLORDS", "LRDS": "BLOCKLORDS",
"LRG": "Largo Coin", "LRG": "Largo Coin",
"LRN": "Loopring [NEO]", "LRN": "Loopring [NEO]",
@ -9950,6 +10010,7 @@
"MAGICK": "Cosmic Universe Magick", "MAGICK": "Cosmic Universe Magick",
"MAGICV": "Magicverse", "MAGICV": "Magicverse",
"MAGIK": "Magik Finance", "MAGIK": "Magik Finance",
"MAGMA": "MAGMA",
"MAGN": "Magnate Finance", "MAGN": "Magnate Finance",
"MAGNE": "Magnetix", "MAGNE": "Magnetix",
"MAGNET": "Yield Magnet", "MAGNET": "Yield Magnet",
@ -10198,6 +10259,7 @@
"MCU": "MediChain", "MCU": "MediChain",
"MCUSD": "Moola Celo USD", "MCUSD": "Moola Celo USD",
"MCV": "MCV Token", "MCV": "MCV Token",
"MCX": "MachiX Token",
"MD": "MetaDeck", "MD": "MetaDeck",
"MDA": "Moeda", "MDA": "Moeda",
"MDAI": "MindAI", "MDAI": "MindAI",
@ -10366,6 +10428,7 @@
"METANIAV1": "METANIAGAMES", "METANIAV1": "METANIAGAMES",
"METANO": "Metano", "METANO": "Metano",
"METAPK": "Metapocket", "METAPK": "Metapocket",
"METAPLACE": "Metaplace",
"METAQ": "MetaQ", "METAQ": "MetaQ",
"METAS": "Metaseer", "METAS": "Metaseer",
"METAT": "MetaTrace", "METAT": "MetaTrace",
@ -10510,6 +10573,7 @@
"MIMO": "MIMO Parallel Governance Token", "MIMO": "MIMO Parallel Governance Token",
"MIN": "MINDOL", "MIN": "MINDOL",
"MINA": "Mina Protocol", "MINA": "Mina Protocol",
"MINAR": "Miner Arena",
"MINC": "MinCoin", "MINC": "MinCoin",
"MIND": "Morpheus Labs", "MIND": "Morpheus Labs",
"MINDBODY": "Mind Body Soul", "MINDBODY": "Mind Body Soul",
@ -10911,7 +10975,7 @@
"MPAA": "MPAA", "MPAA": "MPAA",
"MPAD": "MultiPad", "MPAD": "MultiPad",
"MPAY": "Menapay", "MPAY": "Menapay",
"MPC": "Metaplace", "MPC": "Partisia Blockchain",
"MPD": "Metapad", "MPD": "Metapad",
"MPG": "Max Property Group", "MPG": "Max Property Group",
"MPH": "Morpher", "MPH": "Morpher",
@ -11010,6 +11074,7 @@
"MTHB": "MTHAIBAHT", "MTHB": "MTHAIBAHT",
"MTHD": "Method Finance", "MTHD": "Method Finance",
"MTHN": "MTH Network", "MTHN": "MTH Network",
"MTHT": "MetaHint",
"MTIK": "MatikaToken", "MTIK": "MatikaToken",
"MTIX": "Matrix Token", "MTIX": "Matrix Token",
"MTK": "Moya Token", "MTK": "Moya Token",
@ -11175,6 +11240,7 @@
"N3": "Network3", "N3": "Network3",
"N3DR": "NeorderDAO ", "N3DR": "NeorderDAO ",
"N3ON": "N3on", "N3ON": "N3on",
"N4T": "Nobel For Trump",
"N64": "N64", "N64": "N64",
"N7": "Number7", "N7": "Number7",
"N8V": "NativeCoin", "N8V": "NativeCoin",
@ -11722,6 +11788,7 @@
"NWIF": "neirowifhat", "NWIF": "neirowifhat",
"NWP": "NWPSolution", "NWP": "NWPSolution",
"NWS": "Nodewaves", "NWS": "Nodewaves",
"NXA": "NEXA Agent",
"NXC": "Nexium", "NXC": "Nexium",
"NXD": "Nexus Dubai", "NXD": "Nexus Dubai",
"NXDT": "NXD Next", "NXDT": "NXD Next",
@ -11766,7 +11833,8 @@
"OAS": "Oasis City", "OAS": "Oasis City",
"OASC": "Oasis City", "OASC": "Oasis City",
"OASI": "Oasis Metaverse", "OASI": "Oasis Metaverse",
"OASIS": "Oasis", "OASIS": "OASIS",
"OASISPLATFORM": "Oasis",
"OAT": "OAT Network", "OAT": "OAT Network",
"OATH": "OATH Protocol", "OATH": "OATH Protocol",
"OAX": "Oax", "OAX": "Oax",
@ -11983,12 +12051,14 @@
"ONUS": "ONUS", "ONUS": "ONUS",
"ONX": "OnX.finance", "ONX": "OnX.finance",
"OOB": "Oobit", "OOB": "Oobit",
"OOBV1": "Oobit",
"OOE": "OpenOcean", "OOE": "OpenOcean",
"OOFP": "OOFP", "OOFP": "OOFP",
"OOGI": "OOGI", "OOGI": "OOGI",
"OOKI": "Ooki", "OOKI": "Ooki",
"OOKS": "Onooks", "OOKS": "Onooks",
"OOM": "OomerBot", "OOM": "OomerBot",
"OOOO": "oooo",
"OOPS": "OOPS", "OOPS": "OOPS",
"OORC": "Orbit Bridge Klaytn Orbit Chain", "OORC": "Orbit Bridge Klaytn Orbit Chain",
"OORT": "OORT", "OORT": "OORT",
@ -12838,7 +12908,7 @@
"PMOON": "Pookimoon", "PMOON": "Pookimoon",
"PMPY": "Prometheum Prodigy", "PMPY": "Prometheum Prodigy",
"PMR": "Pomerium Utility Token", "PMR": "Pomerium Utility Token",
"PMT": "POWER MARKET", "PMT": "Public Masterpiece Token",
"PMTN": "Peer Mountain", "PMTN": "Peer Mountain",
"PMX": "Phillip Morris xStock", "PMX": "Phillip Morris xStock",
"PNB": "Pink BNB", "PNB": "Pink BNB",
@ -13001,7 +13071,9 @@
"POUW": "Pouwifhat", "POUW": "Pouwifhat",
"POW": "PowBlocks", "POW": "PowBlocks",
"POWELL": "Jerome Powell", "POWELL": "Jerome Powell",
"POWER": "Powerloom Token", "POWER": "Power",
"POWERLOOM": "Powerloom Token",
"POWERMARKET": "POWER MARKET",
"POWR": "Power Ledger", "POWR": "Power Ledger",
"POWSCHE": "Powsche", "POWSCHE": "Powsche",
"POX": "Monkey Pox", "POX": "Monkey Pox",
@ -13269,6 +13341,7 @@
"PXL": "PIXEL", "PXL": "PIXEL",
"PXP": "PointPay", "PXP": "PointPay",
"PXT": "Pixer Eternity", "PXT": "Pixer Eternity",
"PYBOBO": "Capybobo",
"PYC": "PayCoin", "PYC": "PayCoin",
"PYE": "CreamPYE", "PYE": "CreamPYE",
"PYI": "PYRIN", "PYI": "PYRIN",
@ -13470,6 +13543,7 @@
"RAIREFLEX": "Rai Reflex Index", "RAIREFLEX": "Rai Reflex Index",
"RAISE": "Raise Token", "RAISE": "Raise Token",
"RAIT": "Rabbitgame", "RAIT": "Rabbitgame",
"RAITOKEN": "RAI",
"RAIZER": "RAIZER", "RAIZER": "RAIZER",
"RAK": "Rake Finance", "RAK": "Rake Finance",
"RAKE": "Rake Coin", "RAKE": "Rake Coin",
@ -13497,10 +13571,11 @@
"RATOTHERAT": "Rato The Rat", "RATOTHERAT": "Rato The Rat",
"RATS": "Rats", "RATS": "Rats",
"RATWIF": "RatWifHat", "RATWIF": "RatWifHat",
"RAVE": "Ravendex", "RAVE": "RaveDAO",
"RAVELOUS": "Ravelous", "RAVELOUS": "Ravelous",
"RAVEN": "Raven Protocol", "RAVEN": "Raven Protocol",
"RAVENCOINC": "Ravencoin Classic", "RAVENCOINC": "Ravencoin Classic",
"RAVENDEX": "Ravendex",
"RAWDOG": "RawDog", "RAWDOG": "RawDog",
"RAWG": "RAWG", "RAWG": "RAWG",
"RAY": "Raydium", "RAY": "Raydium",
@ -13810,7 +13885,8 @@
"RIVUS": "RivusDAO", "RIVUS": "RivusDAO",
"RIYA": "Etheriya", "RIYA": "Etheriya",
"RIZ": "Rivalz Network", "RIZ": "Rivalz Network",
"RIZE": "Rizespor Token", "RIZE": "RIZE",
"RIZESPOR": "Rizespor Token",
"RIZO": "HahaYes", "RIZO": "HahaYes",
"RIZOLOL": "Rizo", "RIZOLOL": "Rizo",
"RIZZ": "Rizz", "RIZZ": "Rizz",
@ -13856,6 +13932,7 @@
"RNT": "REAL NIGGER TATE", "RNT": "REAL NIGGER TATE",
"RNTB": "BitRent", "RNTB": "BitRent",
"RNX": "ROONEX", "RNX": "ROONEX",
"ROA": "ROA CORE",
"ROAD": "ROAD", "ROAD": "ROAD",
"ROAM": "Roam Token", "ROAM": "Roam Token",
"ROAR": "Alpha DEX", "ROAR": "Alpha DEX",
@ -13993,6 +14070,7 @@
"RTM": "Raptoreum", "RTM": "Raptoreum",
"RTR": "Restore The Republic", "RTR": "Restore The Republic",
"RTT": "Restore Truth Token", "RTT": "Restore Truth Token",
"RTX": "RateX",
"RU": "RIFI United", "RU": "RIFI United",
"RUBB": "Rubber Ducky Cult", "RUBB": "Rubber Ducky Cult",
"RUBCASH": "RUBCASH", "RUBCASH": "RUBCASH",
@ -14283,7 +14361,7 @@
"SCOIN": "ShinCoin", "SCOIN": "ShinCoin",
"SCONE": "Sportcash One", "SCONE": "Sportcash One",
"SCOOBY": "Scooby coin", "SCOOBY": "Scooby coin",
"SCOR": "Scorista", "SCOR": "Scor",
"SCORE": "Scorecoin", "SCORE": "Scorecoin",
"SCOT": "Scotcoin", "SCOT": "Scotcoin",
"SCOTT": "Scottish", "SCOTT": "Scottish",
@ -14377,6 +14455,7 @@
"SELFIEC": "Selfie Cat", "SELFIEC": "Selfie Cat",
"SELFT": "SelfToken", "SELFT": "SelfToken",
"SELLC": "Sell Token", "SELLC": "Sell Token",
"SELO": "SELO+",
"SEM": "Semux", "SEM": "Semux",
"SEN": "Sentaro", "SEN": "Sentaro",
"SENA": "Ethena Staked ENA", "SENA": "Ethena Staked ENA",
@ -14482,7 +14561,6 @@
"SHANG": "Shanghai Inu", "SHANG": "Shanghai Inu",
"SHAR": "Shark Cat", "SHAR": "Shark Cat",
"SHARBI": "SHARBI", "SHARBI": "SHARBI",
"SHARD": "ShardCoin",
"SHARDS": "WorldShards", "SHARDS": "WorldShards",
"SHARE": "Seigniorage Shares", "SHARE": "Seigniorage Shares",
"SHARECHAIN": "ShareChain", "SHARECHAIN": "ShareChain",
@ -14580,6 +14658,7 @@
"SHIRO": "Shiro Neko", "SHIRO": "Shiro Neko",
"SHIROSOL": "Shiro Neko (shirosol.online)", "SHIROSOL": "Shiro Neko (shirosol.online)",
"SHIRYOINU": "Shiryo-Inu", "SHIRYOINU": "Shiryo-Inu",
"SHISA": "SHISA",
"SHISHA": "Shisha Coin", "SHISHA": "Shisha Coin",
"SHIT": "I will poop it NFT", "SHIT": "I will poop it NFT",
"SHITC": "Shitcoin", "SHITC": "Shitcoin",
@ -14628,9 +14707,11 @@
"SHUFFLE": "SHUFFLE!", "SHUFFLE": "SHUFFLE!",
"SHVR": "Shivers", "SHVR": "Shivers",
"SHX": "Stronghold Token", "SHX": "Stronghold Token",
"SHXV1": "Stronghold Token v1",
"SHY": "Shytoshi Kusama", "SHY": "Shytoshi Kusama",
"SHYTCOIN": "ShytCoin", "SHYTCOIN": "ShytCoin",
"SI": "Siren", "SI": "Siren",
"SI14": "Si14",
"SIACLASSIC": "SiaClassic", "SIACLASSIC": "SiaClassic",
"SIB": "SibCoin", "SIB": "SibCoin",
"SIBA": "SibaInu", "SIBA": "SibaInu",
@ -14831,6 +14912,7 @@
"SMARTLOX": "SmartLOX", "SMARTLOX": "SmartLOX",
"SMARTM": "SmartMesh", "SMARTM": "SmartMesh",
"SMARTMEME": "SmartMEME", "SMARTMEME": "SmartMEME",
"SMARTMFG": "Smart MFG",
"SMARTNFT": "SmartNFT", "SMARTNFT": "SmartNFT",
"SMARTO": "smARTOFGIVING", "SMARTO": "smARTOFGIVING",
"SMARTSHARE": "Smartshare", "SMARTSHARE": "Smartshare",
@ -15040,6 +15122,7 @@
"SOLNAV": "SOLNAV AI", "SOLNAV": "SOLNAV AI",
"SOLNIC": "Solnic", "SOLNIC": "Solnic",
"SOLO": "Sologenic", "SOLO": "Sologenic",
"SOLOM": "Solomon",
"SOLOR": "Solordi", "SOLOR": "Solordi",
"SOLP": "SolPets", "SOLP": "SolPets",
"SOLPAD": "Solpad Finance", "SOLPAD": "Solpad Finance",
@ -15332,6 +15415,7 @@
"STACS": "STACS Token", "STACS": "STACS Token",
"STAFIRETH": "StaFi Staked ETH", "STAFIRETH": "StaFi Staked ETH",
"STAGE": "Stage", "STAGE": "Stage",
"STAI": "StereoAI",
"STAK": "Jigstack", "STAK": "Jigstack",
"STAKE": "xDai Chain", "STAKE": "xDai Chain",
"STAKEDETH": "StakeHound Staked Ether", "STAKEDETH": "StakeHound Staked Ether",
@ -15422,6 +15506,7 @@
"STIMA": "STIMA", "STIMA": "STIMA",
"STING": "Sting", "STING": "Sting",
"STINJ": "Stride Staked INJ", "STINJ": "Stride Staked INJ",
"STIPS": "Stips",
"STITCH": "Stitch", "STITCH": "Stitch",
"STIX": "STIX", "STIX": "STIX",
"STJUNO": "Stride Staked JUNO", "STJUNO": "Stride Staked JUNO",
@ -15597,6 +15682,7 @@
"SUPERBONK": "SUPER BONK", "SUPERBONK": "SUPER BONK",
"SUPERC": "SuperCoin", "SUPERC": "SuperCoin",
"SUPERCAT": "SUPERCAT", "SUPERCAT": "SUPERCAT",
"SUPERCYCLE": "Crypto SuperCycle",
"SUPERDAPP": "SuperDapp", "SUPERDAPP": "SuperDapp",
"SUPERF": "SUPER FLOKI", "SUPERF": "SUPER FLOKI",
"SUPERGROK": "SuperGrok", "SUPERGROK": "SuperGrok",
@ -15855,6 +15941,7 @@
"TBILL": "OpenEden T-Bills", "TBILL": "OpenEden T-Bills",
"TBILLV1": "OpenEden T-Bills v1", "TBILLV1": "OpenEden T-Bills v1",
"TBIS": "TBIS token", "TBIS": "TBIS token",
"TBK": "TBK Token",
"TBL": "Tombola", "TBL": "Tombola",
"TBLLX": "TBLL xStock", "TBLLX": "TBLL xStock",
"TBR": "Tuebor", "TBR": "Tuebor",
@ -15902,7 +15989,8 @@
"TDROP": "ThetaDrop", "TDROP": "ThetaDrop",
"TDS": "TokenDesk", "TDS": "TokenDesk",
"TDX": "Tidex Token", "TDX": "Tidex Token",
"TEA": "TeaDAO", "TEA": "TeaFi Token",
"TEADAO": "TeaDAO",
"TEAM": "TeamUP", "TEAM": "TeamUP",
"TEARS": "Liberals Tears", "TEARS": "Liberals Tears",
"TEC": "TeCoin", "TEC": "TeCoin",
@ -15933,7 +16021,7 @@
"TEMM": "TEM MARKET", "TEMM": "TEM MARKET",
"TEMP": "Tempus", "TEMP": "Tempus",
"TEMPLE": "TempleDAO", "TEMPLE": "TempleDAO",
"TEN": "Tokenomy", "TEN": "TEN",
"TEND": "Tendies", "TEND": "Tendies",
"TENDIE": "TendieSwap", "TENDIE": "TendieSwap",
"TENET": "TENET", "TENET": "TENET",
@ -15947,8 +16035,8 @@
"TEQ": "Teq Network", "TEQ": "Teq Network",
"TER": "TerraNovaCoin", "TER": "TerraNovaCoin",
"TERA": "TERA", "TERA": "TERA",
"TERA2": "Terareum",
"TERADYNE": "Teradyne", "TERADYNE": "Teradyne",
"TERAR": "Terareum",
"TERAV1": "Terareum v1", "TERAV1": "Terareum v1",
"TERAWATT": "Terawatt", "TERAWATT": "Terawatt",
"TERM": "Terminal of Simpson", "TERM": "Terminal of Simpson",
@ -15975,6 +16063,7 @@
"TETSUO": "Tetsuo Coin", "TETSUO": "Tetsuo Coin",
"TETU": "TETU", "TETU": "TETU",
"TEVA": "Tevaera", "TEVA": "Tevaera",
"TEVI": "TEVI Coin",
"TEW": "Trump in a memes world", "TEW": "Trump in a memes world",
"TEX": "Terrax", "TEX": "Terrax",
"TF47": "Trump Force 47", "TF47": "Trump Force 47",
@ -15988,7 +16077,7 @@
"TFT": "The Famous Token", "TFT": "The Famous Token",
"TFUEL": "Theta Fuel", "TFUEL": "Theta Fuel",
"TGAME": "TrueGame", "TGAME": "TrueGame",
"TGC": "TigerCoin", "TGC": "TG.Casino",
"TGCC": "TheGCCcoin", "TGCC": "TheGCCcoin",
"TGPT": "Trading GPT", "TGPT": "Trading GPT",
"TGRAM": "TG20 TGram", "TGRAM": "TG20 TGram",
@ -16026,6 +16115,7 @@
"THEOS": "Theos", "THEOS": "Theos",
"THEP": "The Protocol", "THEP": "The Protocol",
"THEPLAY": "PLAY", "THEPLAY": "PLAY",
"THEREALCHAIN": "REAL",
"THERESAMAY": "Theresa May Coin", "THERESAMAY": "Theresa May Coin",
"THES": "The Standard Protocol (USDS)", "THES": "The Standard Protocol (USDS)",
"THESTANDARD": "Standard Token", "THESTANDARD": "Standard Token",
@ -16051,6 +16141,7 @@
"THOR": "THORSwap", "THOR": "THORSwap",
"THOREUM": "Thoreum V3", "THOREUM": "Thoreum V3",
"THP": "TurboHigh Performance", "THP": "TurboHigh Performance",
"THQ": "Theoriq Token",
"THR": "Thorecoin", "THR": "Thorecoin",
"THREE": "Three Protocol Token ", "THREE": "Three Protocol Token ",
"THRT": "ThriveToken", "THRT": "ThriveToken",
@ -16078,6 +16169,7 @@
"TIG": "Tigereum", "TIG": "Tigereum",
"TIGER": "TIGER", "TIGER": "TIGER",
"TIGERC": "TigerCash", "TIGERC": "TigerCash",
"TIGERCOIN": "TigerCoin",
"TIGERCV1": "TigerCash v1", "TIGERCV1": "TigerCash v1",
"TIGERMOON": "TigerMoon", "TIGERMOON": "TigerMoon",
"TIGERSHARK": "Tiger Shark", "TIGERSHARK": "Tiger Shark",
@ -16154,6 +16246,7 @@
"TME": "Timereum", "TME": "Timereum",
"TMED": "MDsquare", "TMED": "MDsquare",
"TMFT": "Turkish Motorcycle Federation", "TMFT": "Turkish Motorcycle Federation",
"TMG": "T-mac DAO",
"TMN": "TranslateMe", "TMN": "TranslateMe",
"TMNG": "TMN Global", "TMNG": "TMN Global",
"TMNT": "TMNT", "TMNT": "TMNT",
@ -16193,6 +16286,7 @@
"TOKC": "Tokyo Coin", "TOKC": "Tokyo Coin",
"TOKE": "Tokemak", "TOKE": "Tokemak",
"TOKEN": "TokenFi", "TOKEN": "TokenFi",
"TOKENOMY": "Tokenomy",
"TOKENPLACE": "Tokenplace", "TOKENPLACE": "Tokenplace",
"TOKENSTARS": "TokenStars", "TOKENSTARS": "TokenStars",
"TOKERO": "TOKERO LevelUP Token", "TOKERO": "TOKERO LevelUP Token",
@ -16312,6 +16406,7 @@
"TRADE": "Polytrade", "TRADE": "Polytrade",
"TRADEBOT": "TradeBot", "TRADEBOT": "TradeBot",
"TRADECHAIN": "Trade Chain", "TRADECHAIN": "Trade Chain",
"TRADETIDE": "Trade Tide Token",
"TRADEX": "TradeX AI", "TRADEX": "TradeX AI",
"TRADOOR": "Tradoor", "TRADOOR": "Tradoor",
"TRAI": "Trackgood AI", "TRAI": "Trackgood AI",
@ -16361,6 +16456,7 @@
"TRIAS": "Trias", "TRIAS": "Trias",
"TRIBE": "Tribe", "TRIBE": "Tribe",
"TRIBETOKEN": "TribeToken", "TRIBETOKEN": "TribeToken",
"TRIBEX": "Tribe Token",
"TRIBL": "Tribal Token", "TRIBL": "Tribal Token",
"TRICK": "TrickyCoin", "TRICK": "TrickyCoin",
"TRICKLE": "Trickle", "TRICKLE": "Trickle",
@ -16882,6 +16978,7 @@
"USDI": "Interest Protocol USDi", "USDI": "Interest Protocol USDi",
"USDJ": "USDJ", "USDJ": "USDJ",
"USDK": "USDK", "USDK": "USDK",
"USDKG": "USDKG",
"USDL": "Lift Dollar", "USDL": "Lift Dollar",
"USDM": "Mountain Protocol", "USDM": "Mountain Protocol",
"USDMA": "USD mars", "USDMA": "USD mars",
@ -16946,6 +17043,7 @@
"UT": "Ulord", "UT": "Ulord",
"UTBAI": "UTB.ai", "UTBAI": "UTB.ai",
"UTC": "UltraCoin", "UTC": "UltraCoin",
"UTED": "United",
"UTG": "UltronGlow", "UTG": "UltronGlow",
"UTH": "Uther", "UTH": "Uther",
"UTHR": "Utherverse Xaeon", "UTHR": "Utherverse Xaeon",
@ -16998,6 +17096,7 @@
"VALU": "Value", "VALU": "Value",
"VALUE": "Value Liquidity", "VALUE": "Value Liquidity",
"VALYR": "Valyr", "VALYR": "Valyr",
"VAM": "Vitalum",
"VAMPIRE": "Vampire Inu", "VAMPIRE": "Vampire Inu",
"VAN": "Vanspor Token", "VAN": "Vanspor Token",
"VANA": "Vana", "VANA": "Vana",
@ -17206,6 +17305,7 @@
"VIZ": "VIZ Token", "VIZ": "VIZ Token",
"VIZION": "ViZion Protocol", "VIZION": "ViZion Protocol",
"VIZSLASWAP": "VizslaSwap", "VIZSLASWAP": "VizslaSwap",
"VK": "VK Token",
"VKNF": "VKENAF", "VKNF": "VKENAF",
"VLC": "Volcano Uni", "VLC": "Volcano Uni",
"VLDY": "Validity", "VLDY": "Validity",
@ -17263,6 +17363,7 @@
"VON": "Vameon", "VON": "Vameon",
"VONE": "Vone", "VONE": "Vone",
"VONSPEED": "Andrea Von Speed", "VONSPEED": "Andrea Von Speed",
"VOOI": "VOOI",
"VOOT": "VootCoin", "VOOT": "VootCoin",
"VOOZ": "Vooz Coin", "VOOZ": "Vooz Coin",
"VOPO": "VOPO", "VOPO": "VOPO",
@ -17443,6 +17544,7 @@
"WATCH": "Yieldwatch", "WATCH": "Yieldwatch",
"WATER": "Waterfall", "WATER": "Waterfall",
"WATERCOIN": "WATER", "WATERCOIN": "WATER",
"WATLAS": "Wrapped Star Atlas (Portal Bridge)",
"WATT": "WATTTON", "WATT": "WATTTON",
"WAVAX": "Wrapped AVAX", "WAVAX": "Wrapped AVAX",
"WAVES": "Waves", "WAVES": "Waves",
@ -17524,6 +17626,7 @@
"WEBSIM": "The Css God by Virtuals", "WEBSIM": "The Css God by Virtuals",
"WEBSS": "Websser", "WEBSS": "Websser",
"WEC": "Whole Earth Coin", "WEC": "Whole Earth Coin",
"WECAN": "Wecan Group",
"WECO": "WECOIN", "WECO": "WECOIN",
"WED": "Wednesday Inu", "WED": "Wednesday Inu",
"WEEBS": "Weebs", "WEEBS": "Weebs",
@ -17561,8 +17664,9 @@
"WEPC": "World Earn & Play Community", "WEPC": "World Earn & Play Community",
"WEPE": "Wall Street Pepe", "WEPE": "Wall Street Pepe",
"WERK": "Werk Family", "WERK": "Werk Family",
"WESHOWTOKEN": "WeShow Token",
"WEST": "Waves Enterprise", "WEST": "Waves Enterprise",
"WET": "WeShow Token", "WET": "HumidiFi Token",
"WETH": "WETH", "WETH": "WETH",
"WETHV1": "WETH v1", "WETHV1": "WETH v1",
"WETHW": "Wrapped EthereumPoW", "WETHW": "Wrapped EthereumPoW",
@ -17617,6 +17721,7 @@
"WHISKEY": "WHISKEY", "WHISKEY": "WHISKEY",
"WHITE": "WhiteRock", "WHITE": "WhiteRock",
"WHITEHEART": "Whiteheart", "WHITEHEART": "Whiteheart",
"WHITEWHALE": "The White Whale",
"WHL": "WhaleCoin", "WHL": "WhaleCoin",
"WHO": "Truwho", "WHO": "Truwho",
"WHOLE": "Whole Network", "WHOLE": "Whole Network",
@ -17827,6 +17932,7 @@
"WPP": "Green Energy Token", "WPP": "Green Energy Token",
"WPR": "WePower", "WPR": "WePower",
"WQT": "Work Quest", "WQT": "Work Quest",
"WR": "White Rat",
"WRC": "Worldcore", "WRC": "Worldcore",
"WREACT": "Wrapped REACT", "WREACT": "Wrapped REACT",
"WRK": "BlockWRK", "WRK": "BlockWRK",
@ -18005,6 +18111,7 @@
"XCHF": "CryptoFranc", "XCHF": "CryptoFranc",
"XCHNG": "Chainge Finance", "XCHNG": "Chainge Finance",
"XCI": "Cannabis Industry Coin", "XCI": "Cannabis Industry Coin",
"XCL": "Xcellar",
"XCLR": "ClearCoin", "XCLR": "ClearCoin",
"XCM": "CoinMetro", "XCM": "CoinMetro",
"XCN": "Onyxcoin", "XCN": "Onyxcoin",
@ -18043,7 +18150,8 @@
"XEC": "eCash", "XEC": "eCash",
"XED": "Exeedme", "XED": "Exeedme",
"XEDO": "XedoAI", "XEDO": "XedoAI",
"XEL": "Xel", "XEL": "XELIS",
"XELCOIN": "Xel",
"XELS": "XELS Coin", "XELS": "XELS Coin",
"XEM": "NEM", "XEM": "NEM",
"XEN": "XEN Crypto", "XEN": "XEN Crypto",
@ -18361,13 +18469,15 @@
"YEAI": "YE AI Agent", "YEAI": "YE AI Agent",
"YEARN": "YearnTogether", "YEARN": "YearnTogether",
"YEC": "Ycash", "YEC": "Ycash",
"YEE": "Yeeco", "YEE": "Yee Token",
"YEECO": "Yeeco",
"YEED": "Yggdrash", "YEED": "Yggdrash",
"YEEHAW": "YEEHAW", "YEEHAW": "YEEHAW",
"YEET": "Yeet", "YEET": "Yeet",
"YEETI": "YEETI 液体", "YEETI": "YEETI 液体",
"YEFI": "YeFi", "YEFI": "YeFi",
"YEL": "Yel.Finance", "YEL": "Yel.Finance",
"YELLOWWHALE": "The Yellow Whale",
"YELP": "Yelpro", "YELP": "Yelpro",
"YEON": "Yeon", "YEON": "Yeon",
"YEPE": "Yellow Pepe", "YEPE": "Yellow Pepe",

2
apps/client/src/app/app.component.ts

@ -4,6 +4,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes'; import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes';
import { ColorScheme } from '@ghostfolio/common/types'; import { ColorScheme } from '@ghostfolio/common/types';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { DataService } from '@ghostfolio/ui/services';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,
@ -36,7 +37,6 @@ import { GfFooterComponent } from './components/footer/footer.component';
import { GfHeaderComponent } from './components/header/header.component'; import { GfHeaderComponent } from './components/header/header.component';
import { GfHoldingDetailDialogComponent } from './components/holding-detail-dialog/holding-detail-dialog.component'; import { GfHoldingDetailDialogComponent } from './components/holding-detail-dialog/holding-detail-dialog.component';
import { HoldingDetailDialogParams } from './components/holding-detail-dialog/interfaces/interfaces'; import { HoldingDetailDialogParams } from './components/holding-detail-dialog/interfaces/interfaces';
import { DataService } from './services/data.service';
import { ImpersonationStorageService } from './services/impersonation-storage.service'; import { ImpersonationStorageService } from './services/impersonation-storage.service';
import { TokenStorageService } from './services/token-storage.service'; import { TokenStorageService } from './services/token-storage.service';
import { UserService } from './services/user/user.service'; import { UserService } from './services/user/user.service';

2
apps/client/src/app/components/account-detail-dialog/account-detail-dialog.component.ts

@ -1,5 +1,4 @@
import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component'; import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config'; import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config';
import { CreateAccountBalanceDto } from '@ghostfolio/common/dtos'; import { CreateAccountBalanceDto } from '@ghostfolio/common/dtos';
@ -19,6 +18,7 @@ import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table';
import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer'; import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer';
import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header'; import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header';
import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table'; import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table';
import { DataService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';

2
apps/client/src/app/components/admin-jobs/admin-jobs.component.ts

@ -1,4 +1,3 @@
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { import {
DATA_GATHERING_QUEUE_PRIORITY_HIGH, DATA_GATHERING_QUEUE_PRIORITY_HIGH,
@ -9,6 +8,7 @@ import {
import { getDateWithTimeFormatString } from '@ghostfolio/common/helper'; import { getDateWithTimeFormatString } from '@ghostfolio/common/helper';
import { AdminJobs, User } from '@ghostfolio/common/interfaces'; import { AdminJobs, User } from '@ghostfolio/common/interfaces';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { AdminService } from '@ghostfolio/ui/services';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { import {

3
apps/client/src/app/components/admin-market-data/admin-market-data.component.ts

@ -1,5 +1,3 @@
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { import {
DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE,
@ -18,6 +16,7 @@ import { GfSymbolPipe } from '@ghostfolio/common/pipes';
import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter'; import { GfActivitiesFilterComponent } from '@ghostfolio/ui/activities-filter';
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { AdminService, DataService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { SelectionModel } from '@angular/cdk/collections'; import { SelectionModel } from '@angular/cdk/collections';

2
apps/client/src/app/components/admin-market-data/admin-market-data.service.ts

@ -1,4 +1,3 @@
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { ghostfolioScraperApiSymbolPrefix } from '@ghostfolio/common/config'; import { ghostfolioScraperApiSymbolPrefix } from '@ghostfolio/common/config';
import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { ConfirmationDialogType } from '@ghostfolio/common/enums';
import { import {
@ -11,6 +10,7 @@ import {
AdminMarketDataItem AdminMarketDataItem
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { AdminService } from '@ghostfolio/ui/services';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { EMPTY, catchError, finalize, forkJoin } from 'rxjs'; import { EMPTY, catchError, finalize, forkJoin } from 'rxjs';

3
apps/client/src/app/components/admin-market-data/asset-profile-dialog/asset-profile-dialog.component.ts

@ -1,6 +1,4 @@
import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service'; import { AdminMarketDataService } from '@ghostfolio/client/components/admin-market-data/admin-market-data.service';
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { import {
ASSET_CLASS_MAPPING, ASSET_CLASS_MAPPING,
@ -25,6 +23,7 @@ import { translate } from '@ghostfolio/ui/i18n';
import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { GfLineChartComponent } from '@ghostfolio/ui/line-chart';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart';
import { AdminService, DataService } from '@ghostfolio/ui/services';
import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';

3
apps/client/src/app/components/admin-market-data/create-asset-profile-dialog/create-asset-profile-dialog.component.ts

@ -1,10 +1,9 @@
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { import {
DEFAULT_CURRENCY, DEFAULT_CURRENCY,
ghostfolioPrefix, ghostfolioPrefix,
PROPERTY_CURRENCIES PROPERTY_CURRENCIES
} from '@ghostfolio/common/config'; } from '@ghostfolio/common/config';
import { AdminService, DataService } from '@ghostfolio/ui/services';
import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete';
import { import {

3
apps/client/src/app/components/admin-overview/admin-overview.component.ts

@ -1,6 +1,4 @@
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { CacheService } from '@ghostfolio/client/services/cache.service'; import { CacheService } from '@ghostfolio/client/services/cache.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { import {
PROPERTY_COUPONS, PROPERTY_COUPONS,
@ -20,6 +18,7 @@ import {
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { AdminService, DataService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';

3
apps/client/src/app/components/admin-platform/admin-platform.component.ts

@ -1,10 +1,9 @@
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos'; import { CreatePlatformDto, UpdatePlatformDto } from '@ghostfolio/common/dtos';
import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { ConfirmationDialogType } from '@ghostfolio/common/enums';
import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { AdminService, DataService } from '@ghostfolio/ui/services';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,

3
apps/client/src/app/components/admin-settings/admin-settings.component.ts

@ -1,8 +1,6 @@
import { GfAdminPlatformComponent } from '@ghostfolio/client/components/admin-platform/admin-platform.component'; import { GfAdminPlatformComponent } from '@ghostfolio/client/components/admin-platform/admin-platform.component';
import { GfAdminTagComponent } from '@ghostfolio/client/components/admin-tag/admin-tag.component'; import { GfAdminTagComponent } from '@ghostfolio/client/components/admin-tag/admin-tag.component';
import { GfDataProviderStatusComponent } from '@ghostfolio/client/components/data-provider-status/data-provider-status.component'; import { GfDataProviderStatusComponent } from '@ghostfolio/client/components/data-provider-status/data-provider-status.component';
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { PROPERTY_API_KEY_GHOSTFOLIO } from '@ghostfolio/common/config'; import { PROPERTY_API_KEY_GHOSTFOLIO } from '@ghostfolio/common/config';
import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { ConfirmationDialogType } from '@ghostfolio/common/enums';
@ -16,6 +14,7 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { AdminService, DataService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';

2
apps/client/src/app/components/admin-tag/admin-tag.component.ts

@ -1,8 +1,8 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos'; import { CreateTagDto, UpdateTagDto } from '@ghostfolio/common/dtos';
import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { ConfirmationDialogType } from '@ghostfolio/common/enums';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { DataService } from '@ghostfolio/ui/services';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,

3
apps/client/src/app/components/admin-users/admin-users.component.ts

@ -1,7 +1,5 @@
import { UserDetailDialogParams } from '@ghostfolio/client/components/user-detail-dialog/interfaces/interfaces'; import { UserDetailDialogParams } from '@ghostfolio/client/components/user-detail-dialog/interfaces/interfaces';
import { GfUserDetailDialogComponent } from '@ghostfolio/client/components/user-detail-dialog/user-detail-dialog.component'; import { GfUserDetailDialogComponent } from '@ghostfolio/client/components/user-detail-dialog/user-detail-dialog.component';
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
@ -21,6 +19,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { internalRoutes } from '@ghostfolio/common/routes/routes';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { AdminService, DataService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';

2
apps/client/src/app/components/data-provider-status/data-provider-status.component.ts

@ -1,4 +1,4 @@
import { DataService } from '@ghostfolio/client/services/data.service'; import { DataService } from '@ghostfolio/ui/services';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { import {

2
apps/client/src/app/components/header/header.component.ts

@ -1,7 +1,6 @@
import { LoginWithAccessTokenDialogParams } from '@ghostfolio/client/components/login-with-access-token-dialog/interfaces/interfaces'; import { LoginWithAccessTokenDialogParams } from '@ghostfolio/client/components/login-with-access-token-dialog/interfaces/interfaces';
import { GfLoginWithAccessTokenDialogComponent } from '@ghostfolio/client/components/login-with-access-token-dialog/login-with-access-token-dialog.component'; import { GfLoginWithAccessTokenDialogComponent } from '@ghostfolio/client/components/login-with-access-token-dialog/login-with-access-token-dialog.component';
import { LayoutService } from '@ghostfolio/client/core/layout.service'; import { LayoutService } from '@ghostfolio/client/core/layout.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { import {
KEY_STAY_SIGNED_IN, KEY_STAY_SIGNED_IN,
@ -18,6 +17,7 @@ import { GfAssistantComponent } from '@ghostfolio/ui/assistant/assistant.compone
import { GfLogoComponent } from '@ghostfolio/ui/logo'; import { GfLogoComponent } from '@ghostfolio/ui/logo';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { import {

2
apps/client/src/app/components/holding-detail-dialog/holding-detail-dialog.component.ts

@ -1,4 +1,3 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { import {
NUMERICAL_PRECISION_THRESHOLD_3_FIGURES, NUMERICAL_PRECISION_THRESHOLD_3_FIGURES,
@ -26,6 +25,7 @@ import { GfHistoricalMarketDataEditorComponent } from '@ghostfolio/ui/historical
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { GfLineChartComponent } from '@ghostfolio/ui/line-chart';
import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart';
import { DataService } from '@ghostfolio/ui/services';
import { GfTagsSelectorComponent } from '@ghostfolio/ui/tags-selector'; import { GfTagsSelectorComponent } from '@ghostfolio/ui/tags-selector';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';

2
apps/client/src/app/components/home-holdings/home-holdings.component.ts

@ -1,4 +1,3 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { import {
@ -11,6 +10,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { internalRoutes } from '@ghostfolio/common/routes/routes';
import { HoldingType, HoldingsViewMode } from '@ghostfolio/common/types'; import { HoldingType, HoldingsViewMode } from '@ghostfolio/common/types';
import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table'; import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table';
import { DataService } from '@ghostfolio/ui/services';
import { GfToggleComponent } from '@ghostfolio/ui/toggle'; import { GfToggleComponent } from '@ghostfolio/ui/toggle';
import { GfTreemapChartComponent } from '@ghostfolio/ui/treemap-chart'; import { GfTreemapChartComponent } from '@ghostfolio/ui/treemap-chart';

2
apps/client/src/app/components/home-market/home-market.component.ts

@ -1,5 +1,4 @@
import { GfFearAndGreedIndexComponent } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.component'; import { GfFearAndGreedIndexComponent } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.component';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { ghostfolioFearAndGreedIndexSymbol } from '@ghostfolio/common/config'; import { ghostfolioFearAndGreedIndexSymbol } from '@ghostfolio/common/config';
import { resetHours } from '@ghostfolio/common/helper'; import { resetHours } from '@ghostfolio/common/helper';
@ -12,6 +11,7 @@ import {
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark';
import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { GfLineChartComponent } from '@ghostfolio/ui/line-chart';
import { DataService } from '@ghostfolio/ui/services';
import { import {
ChangeDetectorRef, ChangeDetectorRef,

2
apps/client/src/app/components/home-overview/home-overview.component.ts

@ -1,6 +1,5 @@
import { GfPortfolioPerformanceComponent } from '@ghostfolio/client/components/portfolio-performance/portfolio-performance.component'; import { GfPortfolioPerformanceComponent } from '@ghostfolio/client/components/portfolio-performance/portfolio-performance.component';
import { LayoutService } from '@ghostfolio/client/core/layout.service'; import { LayoutService } from '@ghostfolio/client/core/layout.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config'; import { NUMERICAL_PRECISION_THRESHOLD_6_FIGURES } from '@ghostfolio/common/config';
@ -13,6 +12,7 @@ import {
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { internalRoutes } from '@ghostfolio/common/routes/routes';
import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { GfLineChartComponent } from '@ghostfolio/ui/line-chart';
import { DataService } from '@ghostfolio/ui/services';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { import {

2
apps/client/src/app/components/home-summary/home-summary.component.ts

@ -1,5 +1,4 @@
import { GfPortfolioSummaryComponent } from '@ghostfolio/client/components/portfolio-summary/portfolio-summary.component'; import { GfPortfolioSummaryComponent } from '@ghostfolio/client/components/portfolio-summary/portfolio-summary.component';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { import {
@ -8,6 +7,7 @@ import {
User User
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { DataService } from '@ghostfolio/ui/services';
import { import {
ChangeDetectorRef, ChangeDetectorRef,

2
apps/client/src/app/components/home-watchlist/home-watchlist.component.ts

@ -1,4 +1,3 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { import {
@ -9,6 +8,7 @@ import {
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,

2
apps/client/src/app/components/markets/markets.component.ts

@ -1,5 +1,4 @@
import { GfFearAndGreedIndexComponent } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.component'; import { GfFearAndGreedIndexComponent } from '@ghostfolio/client/components/fear-and-greed-index/fear-and-greed-index.component';
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { resetHours } from '@ghostfolio/common/helper'; import { resetHours } from '@ghostfolio/common/helper';
import { import {
@ -12,6 +11,7 @@ import {
import { FearAndGreedIndexMode } from '@ghostfolio/common/types'; import { FearAndGreedIndexMode } from '@ghostfolio/common/types';
import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark'; import { GfBenchmarkComponent } from '@ghostfolio/ui/benchmark';
import { GfLineChartComponent } from '@ghostfolio/ui/line-chart'; import { GfLineChartComponent } from '@ghostfolio/ui/line-chart';
import { DataService } from '@ghostfolio/ui/services';
import { GfToggleComponent } from '@ghostfolio/ui/toggle'; import { GfToggleComponent } from '@ghostfolio/ui/toggle';
import { import {

2
apps/client/src/app/components/user-account-access/create-or-update-access-dialog/create-or-update-access-dialog.component.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { CreateAccessDto, UpdateAccessDto } from '@ghostfolio/common/dtos'; import { CreateAccessDto, UpdateAccessDto } from '@ghostfolio/common/dtos';
import { validateObjectForForm } from '@ghostfolio/common/utils'; import { validateObjectForForm } from '@ghostfolio/common/utils';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { DataService } from '@ghostfolio/ui/services';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,

2
apps/client/src/app/components/user-account-access/user-account-access.component.ts

@ -1,5 +1,4 @@
import { GfAccessTableComponent } from '@ghostfolio/client/components/access-table/access-table.component'; import { GfAccessTableComponent } from '@ghostfolio/client/components/access-table/access-table.component';
import { DataService } from '@ghostfolio/client/services/data.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { CreateAccessDto } from '@ghostfolio/common/dtos'; import { CreateAccessDto } from '@ghostfolio/common/dtos';
@ -8,6 +7,7 @@ import { Access, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,

2
apps/client/src/app/components/user-account-membership/user-account-membership.component.ts

@ -1,4 +1,3 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { ConfirmationDialogType } from '@ghostfolio/common/enums'; import { ConfirmationDialogType } from '@ghostfolio/common/enums';
import { getDateFormatString } from '@ghostfolio/common/helper'; import { getDateFormatString } from '@ghostfolio/common/helper';
@ -8,6 +7,7 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { GfMembershipCardComponent } from '@ghostfolio/ui/membership-card'; import { GfMembershipCardComponent } from '@ghostfolio/ui/membership-card';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { import {

2
apps/client/src/app/components/user-account-settings/user-account-settings.component.ts

@ -1,4 +1,3 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { import {
KEY_STAY_SIGNED_IN, KEY_STAY_SIGNED_IN,
KEY_TOKEN, KEY_TOKEN,
@ -13,6 +12,7 @@ import { User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { internalRoutes } from '@ghostfolio/common/routes/routes';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { DataService } from '@ghostfolio/ui/services';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,

2
apps/client/src/app/components/user-detail-dialog/user-detail-dialog.component.ts

@ -1,7 +1,7 @@
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { AdminUserResponse } from '@ghostfolio/common/interfaces'; import { AdminUserResponse } from '@ghostfolio/common/interfaces';
import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer'; import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer';
import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header'; import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header';
import { AdminService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { import {

2
apps/client/src/app/core/auth.guard.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service'; import { SettingsStorageService } from '@ghostfolio/client/services/settings-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes'; import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes';
import { DataService } from '@ghostfolio/ui/services';
import { Injectable } from '@angular/core'; import { Injectable } from '@angular/core';
import { import {

2
apps/client/src/app/core/http-response.interceptor.ts

@ -1,8 +1,8 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service'; import { WebAuthnService } from '@ghostfolio/client/services/web-authn.service';
import { InfoItem } from '@ghostfolio/common/interfaces'; import { InfoItem } from '@ghostfolio/common/interfaces';
import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes'; import { internalRoutes, publicRoutes } from '@ghostfolio/common/routes/routes';
import { DataService } from '@ghostfolio/ui/services';
import { import {
HTTP_INTERCEPTORS, HTTP_INTERCEPTORS,

2
apps/client/src/app/pages/about/about-page.component.ts

@ -1,8 +1,8 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { TabConfiguration, User } from '@ghostfolio/common/interfaces'; import { TabConfiguration, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { DataService } from '@ghostfolio/ui/services';
import { import {
ChangeDetectorRef, ChangeDetectorRef,

2
apps/client/src/app/pages/about/overview/about-overview-page.component.ts

@ -1,8 +1,8 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { User } from '@ghostfolio/common/interfaces'; import { User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { DataService } from '@ghostfolio/ui/services';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { import {

2
apps/client/src/app/pages/accounts/accounts-page.component.ts

@ -1,6 +1,5 @@
import { GfAccountDetailDialogComponent } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.component'; import { GfAccountDetailDialogComponent } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.component';
import { AccountDetailDialogParams } from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces'; import { AccountDetailDialogParams } from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { import {
@ -12,6 +11,7 @@ import { User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfAccountsTableComponent } from '@ghostfolio/ui/accounts-table'; import { GfAccountsTableComponent } from '@ghostfolio/ui/accounts-table';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { DataService } from '@ghostfolio/ui/services';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';

2
apps/client/src/app/pages/accounts/create-or-update-account-dialog/create-or-update-account-dialog.component.ts

@ -1,8 +1,8 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { CreateAccountDto, UpdateAccountDto } from '@ghostfolio/common/dtos'; import { CreateAccountDto, UpdateAccountDto } from '@ghostfolio/common/dtos';
import { validateObjectForForm } from '@ghostfolio/common/utils'; import { validateObjectForForm } from '@ghostfolio/common/utils';
import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector'; import { GfCurrencySelectorComponent } from '@ghostfolio/ui/currency-selector';
import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
import { DataService } from '@ghostfolio/ui/services';
import { CommonModule, NgClass } from '@angular/common'; import { CommonModule, NgClass } from '@angular/common';
import { import {

2
apps/client/src/app/pages/blog/blog-page.component.ts

@ -1,5 +1,5 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { DataService } from '@ghostfolio/ui/services';
import { Component, CUSTOM_ELEMENTS_SCHEMA, OnDestroy } from '@angular/core'; import { Component, CUSTOM_ELEMENTS_SCHEMA, OnDestroy } from '@angular/core';
import { MatCardModule } from '@angular/material/card'; import { MatCardModule } from '@angular/material/card';

2
apps/client/src/app/pages/demo/demo-page.component.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { InfoItem } from '@ghostfolio/common/interfaces'; import { InfoItem } from '@ghostfolio/common/interfaces';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { DataService } from '@ghostfolio/ui/services';
import { Component, OnDestroy } from '@angular/core'; import { Component, OnDestroy } from '@angular/core';
import { Router } from '@angular/router'; import { Router } from '@angular/router';

2
apps/client/src/app/pages/faq/faq-page.component.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { TabConfiguration } from '@ghostfolio/common/interfaces'; import { TabConfiguration } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { DataService } from '@ghostfolio/ui/services';
import { import {
CUSTOM_ELEMENTS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA,

2
apps/client/src/app/pages/features/features-page.component.ts

@ -1,9 +1,9 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { InfoItem, User } from '@ghostfolio/common/interfaces'; import { InfoItem, User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';

2
apps/client/src/app/pages/landing/landing-page.component.ts

@ -1,10 +1,10 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { Statistics } from '@ghostfolio/common/interfaces'; import { Statistics } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { GfCarouselComponent } from '@ghostfolio/ui/carousel'; import { GfCarouselComponent } from '@ghostfolio/ui/carousel';
import { GfLogoComponent } from '@ghostfolio/ui/logo'; import { GfLogoComponent } from '@ghostfolio/ui/logo';
import { GfLogoCarouselComponent } from '@ghostfolio/ui/logo-carousel'; import { GfLogoCarouselComponent } from '@ghostfolio/ui/logo-carousel';
import { DataService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart'; import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart';

2
apps/client/src/app/pages/open/open-page.component.ts

@ -1,6 +1,6 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { Statistics, User } from '@ghostfolio/common/interfaces'; import { Statistics, User } from '@ghostfolio/common/interfaces';
import { DataService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { import {

2
apps/client/src/app/pages/portfolio/activities/activities-page.component.ts

@ -1,4 +1,3 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { IcsService } from '@ghostfolio/client/services/ics/ics.service'; import { IcsService } from '@ghostfolio/client/services/ics/ics.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
@ -12,6 +11,7 @@ import {
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table';
import { DataService } from '@ghostfolio/ui/services';
import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';

2
apps/client/src/app/pages/portfolio/activities/create-or-update-activity-dialog/create-or-update-activity-dialog.component.ts

@ -10,6 +10,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { validateObjectForForm } from '@ghostfolio/common/utils'; import { validateObjectForForm } from '@ghostfolio/common/utils';
import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo'; import { GfEntityLogoComponent } from '@ghostfolio/ui/entity-logo';
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { DataService } from '@ghostfolio/ui/services';
import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete'; import { GfSymbolAutocompleteComponent } from '@ghostfolio/ui/symbol-autocomplete';
import { GfTagsSelectorComponent } from '@ghostfolio/ui/tags-selector'; import { GfTagsSelectorComponent } from '@ghostfolio/ui/tags-selector';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
@ -48,7 +49,6 @@ import { calendarClearOutline, refreshOutline } from 'ionicons/icons';
import { EMPTY, Subject } from 'rxjs'; import { EMPTY, Subject } from 'rxjs';
import { catchError, delay, takeUntil } from 'rxjs/operators'; import { catchError, delay, takeUntil } from 'rxjs/operators';
import { DataService } from '../../../../services/data.service';
import { CreateOrUpdateActivityDialogParams } from './interfaces/interfaces'; import { CreateOrUpdateActivityDialogParams } from './interfaces/interfaces';
import { ActivityType } from './types/activity-type.type'; import { ActivityType } from './types/activity-type.type';

2
apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts

@ -1,5 +1,4 @@
import { GfFileDropDirective } from '@ghostfolio/client/directives/file-drop/file-drop.directive'; import { GfFileDropDirective } from '@ghostfolio/client/directives/file-drop/file-drop.directive';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service'; import { ImportActivitiesService } from '@ghostfolio/client/services/import-activities.service';
import { import {
CreateAccountWithBalancesDto, CreateAccountWithBalancesDto,
@ -11,6 +10,7 @@ import { GfSymbolPipe } from '@ghostfolio/common/pipes';
import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table';
import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer'; import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer';
import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header'; import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header';
import { DataService } from '@ghostfolio/ui/services';
import { import {
StepperOrientation, StepperOrientation,

2
apps/client/src/app/pages/portfolio/allocations/allocations-page.component.ts

@ -1,6 +1,5 @@
import { GfAccountDetailDialogComponent } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.component'; import { GfAccountDetailDialogComponent } from '@ghostfolio/client/components/account-detail-dialog/account-detail-dialog.component';
import { AccountDetailDialogParams } from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces'; import { AccountDetailDialogParams } from '@ghostfolio/client/components/account-detail-dialog/interfaces/interfaces';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { MAX_TOP_HOLDINGS, UNKNOWN_KEY } from '@ghostfolio/common/config'; import { MAX_TOP_HOLDINGS, UNKNOWN_KEY } from '@ghostfolio/common/config';
@ -17,6 +16,7 @@ import { Market, MarketAdvanced } from '@ghostfolio/common/types';
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
import { GfTopHoldingsComponent } from '@ghostfolio/ui/top-holdings'; import { GfTopHoldingsComponent } from '@ghostfolio/ui/top-holdings';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart'; import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart';

2
apps/client/src/app/pages/portfolio/analysis/analysis-page.component.ts

@ -1,6 +1,5 @@
import { GfBenchmarkComparatorComponent } from '@ghostfolio/client/components/benchmark-comparator/benchmark-comparator.component'; import { GfBenchmarkComparatorComponent } from '@ghostfolio/client/components/benchmark-comparator/benchmark-comparator.component';
import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component'; import { GfInvestmentChartComponent } from '@ghostfolio/client/components/investment-chart/investment-chart.component';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { import {
@ -16,6 +15,7 @@ import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import type { AiPromptMode, GroupBy } from '@ghostfolio/common/types'; import type { AiPromptMode, GroupBy } from '@ghostfolio/common/types';
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
import { GfToggleComponent } from '@ghostfolio/ui/toggle'; import { GfToggleComponent } from '@ghostfolio/ui/toggle';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';

2
apps/client/src/app/pages/portfolio/fire/fire-page.component.ts

@ -1,4 +1,3 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { import {
@ -9,6 +8,7 @@ import {
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfFireCalculatorComponent } from '@ghostfolio/ui/fire-calculator'; import { GfFireCalculatorComponent } from '@ghostfolio/ui/fire-calculator';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { CommonModule, NgStyle } from '@angular/common'; import { CommonModule, NgStyle } from '@angular/common';

2
apps/client/src/app/pages/portfolio/x-ray/x-ray-page.component.ts

@ -1,5 +1,4 @@
import { GfRulesComponent } from '@ghostfolio/client/components/rules/rules.component'; import { GfRulesComponent } from '@ghostfolio/client/components/rules/rules.component';
import { DataService } from '@ghostfolio/client/services/data.service';
import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service'; import { ImpersonationStorageService } from '@ghostfolio/client/services/impersonation-storage.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { UpdateUserSettingDto } from '@ghostfolio/common/dtos'; import { UpdateUserSettingDto } from '@ghostfolio/common/dtos';
@ -10,6 +9,7 @@ import {
import { User } from '@ghostfolio/common/interfaces/user.interface'; import { User } from '@ghostfolio/common/interfaces/user.interface';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
import { NgClass } from '@angular/common'; import { NgClass } from '@angular/common';
import { ChangeDetectorRef, Component } from '@angular/core'; import { ChangeDetectorRef, Component } from '@angular/core';

2
apps/client/src/app/pages/pricing/pricing-page.component.ts

@ -1,4 +1,3 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { UserService } from '@ghostfolio/client/services/user/user.service'; import { UserService } from '@ghostfolio/client/services/user/user.service';
import { User } from '@ghostfolio/common/interfaces'; import { User } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
@ -6,6 +5,7 @@ import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { NotificationService } from '@ghostfolio/ui/notifications'; import { NotificationService } from '@ghostfolio/ui/notifications';
import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator'; import { GfPremiumIndicatorComponent } from '@ghostfolio/ui/premium-indicator';
import { DataService } from '@ghostfolio/ui/services';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { import {

2
apps/client/src/app/pages/public/public-page.component.ts

@ -1,4 +1,3 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { UNKNOWN_KEY } from '@ghostfolio/common/config'; import { UNKNOWN_KEY } from '@ghostfolio/common/config';
import { prettifySymbol } from '@ghostfolio/common/helper'; import { prettifySymbol } from '@ghostfolio/common/helper';
import { import {
@ -11,6 +10,7 @@ import { Market } from '@ghostfolio/common/types';
import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table/activities-table.component'; import { GfActivitiesTableComponent } from '@ghostfolio/ui/activities-table/activities-table.component';
import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table/holdings-table.component'; import { GfHoldingsTableComponent } from '@ghostfolio/ui/holdings-table/holdings-table.component';
import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.component'; import { GfPortfolioProportionChartComponent } from '@ghostfolio/ui/portfolio-proportion-chart/portfolio-proportion-chart.component';
import { DataService } from '@ghostfolio/ui/services';
import { GfValueComponent } from '@ghostfolio/ui/value'; import { GfValueComponent } from '@ghostfolio/ui/value';
import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart'; import { GfWorldMapChartComponent } from '@ghostfolio/ui/world-map-chart';

2
apps/client/src/app/pages/register/register-page.component.ts

@ -1,8 +1,8 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service'; import { TokenStorageService } from '@ghostfolio/client/services/token-storage.service';
import { InfoItem, LineChartItem } from '@ghostfolio/common/interfaces'; import { InfoItem, LineChartItem } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { GfLogoComponent } from '@ghostfolio/ui/logo'; import { GfLogoComponent } from '@ghostfolio/ui/logo';
import { DataService } from '@ghostfolio/ui/services';
import { import {
Component, Component,

2
apps/client/src/app/pages/register/user-account-registration-dialog/user-account-registration-dialog.component.ts

@ -1,5 +1,5 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { DataService } from '@ghostfolio/ui/services';
import { ClipboardModule } from '@angular/cdk/clipboard'; import { ClipboardModule } from '@angular/cdk/clipboard';
import { TextFieldModule } from '@angular/cdk/text-field'; import { TextFieldModule } from '@angular/cdk/text-field';

2
apps/client/src/app/pages/resources/glossary/resources-glossary.component.ts

@ -1,7 +1,7 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { InfoItem } from '@ghostfolio/common/interfaces'; import { InfoItem } from '@ghostfolio/common/interfaces';
import { hasPermission, permissions } from '@ghostfolio/common/permissions'; import { hasPermission, permissions } from '@ghostfolio/common/permissions';
import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { DataService } from '@ghostfolio/ui/services';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { RouterModule } from '@angular/router'; import { RouterModule } from '@angular/router';

2
apps/client/src/app/pages/resources/personal-finance-tools/product-page.component.ts

@ -1,8 +1,8 @@
import { DataService } from '@ghostfolio/client/services/data.service';
import { Product } from '@ghostfolio/common/interfaces'; import { Product } from '@ghostfolio/common/interfaces';
import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools'; import { personalFinanceTools } from '@ghostfolio/common/personal-finance-tools';
import { publicRoutes } from '@ghostfolio/common/routes/routes'; import { publicRoutes } from '@ghostfolio/common/routes/routes';
import { translate } from '@ghostfolio/ui/i18n'; import { translate } from '@ghostfolio/ui/i18n';
import { DataService } from '@ghostfolio/ui/services';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';

4
apps/client/src/environments/environment.prod.ts

@ -1,4 +1,6 @@
export const environment = { import type { GfEnvironment } from '@ghostfolio/ui/environment';
export const environment: GfEnvironment = {
lastPublish: '{BUILD_TIMESTAMP}', lastPublish: '{BUILD_TIMESTAMP}',
production: true, production: true,
stripePublicKey: '' stripePublicKey: ''

4
apps/client/src/environments/environment.ts

@ -1,8 +1,10 @@
import type { GfEnvironment } from '@ghostfolio/ui/environment';
// This file can be replaced during build by using the `fileReplacements` array. // This file can be replaced during build by using the `fileReplacements` array.
// `ng build --prod` replaces `environment.ts` with `environment.prod.ts`. // `ng build --prod` replaces `environment.ts` with `environment.prod.ts`.
// The list of file replacements can be found in `angular.json`. // The list of file replacements can be found in `angular.json`.
export const environment = { export const environment: GfEnvironment = {
lastPublish: null, lastPublish: null,
production: false, production: false,
stripePublicKey: '' stripePublicKey: ''

5
apps/client/src/main.ts

@ -1,5 +1,6 @@
import { InfoResponse } from '@ghostfolio/common/interfaces'; import { InfoResponse } from '@ghostfolio/common/interfaces';
import { filterGlobalPermissions } from '@ghostfolio/common/permissions'; import { filterGlobalPermissions } from '@ghostfolio/common/permissions';
import { GF_ENVIRONMENT } from '@ghostfolio/ui/environment';
import { GfNotificationModule } from '@ghostfolio/ui/notifications'; import { GfNotificationModule } from '@ghostfolio/ui/notifications';
import { Platform } from '@angular/cdk/platform'; import { Platform } from '@angular/cdk/platform';
@ -89,6 +90,10 @@ import { environment } from './environments/environment';
provide: DateAdapter, provide: DateAdapter,
useClass: CustomDateAdapter useClass: CustomDateAdapter
}, },
{
provide: GF_ENVIRONMENT,
useValue: environment
},
{ {
provide: MAT_DATE_FORMATS, provide: MAT_DATE_FORMATS,
useValue: DateFormats useValue: DateFormats

4
eslint.config.cjs

@ -28,9 +28,7 @@ module.exports = [
onlyDependOnLibsWithTags: ['*'] onlyDependOnLibsWithTags: ['*']
} }
], ],
enforceBuildableLibDependency: true, enforceBuildableLibDependency: true
// Temporary fix, should be removed eventually
ignoredCircularDependencies: [['client', 'ui']]
} }
], ],
'@typescript-eslint/no-extra-semi': 'error', '@typescript-eslint/no-extra-semi': 'error',

2
libs/common/src/lib/interfaces/responses/portfolio-holding-response.interface.ts

@ -9,7 +9,9 @@ import {
import { Tag } from '@prisma/client'; import { Tag } from '@prisma/client';
export interface PortfolioHoldingResponse { export interface PortfolioHoldingResponse {
/** @deprecated */
activities: Activity[]; activities: Activity[];
activitiesCount: number; activitiesCount: number;
averagePrice: number; averagePrice: number;
dataProviderInfo: DataProviderInfo; dataProviderInfo: DataProviderInfo;

11
libs/ui/src/lib/accounts-table/accounts-table.component.html

@ -13,7 +13,14 @@
} }
<div class="overflow-x-auto"> <div class="overflow-x-auto">
<table class="gf-table w-100" mat-table matSort [dataSource]="dataSource"> <table
class="gf-table w-100"
mat-table
matSort
matSortActive="name"
matSortDirection="asc"
[dataSource]="dataSource"
>
<ng-container matColumnDef="status"> <ng-container matColumnDef="status">
<th <th
*matHeaderCellDef *matHeaderCellDef
@ -199,7 +206,7 @@
<ng-container matColumnDef="valueInBaseCurrency"> <ng-container matColumnDef="valueInBaseCurrency">
<th <th
*matHeaderCellDef *matHeaderCellDef
class="d-lg-none d-xl-none px-1 text-right" class="d-lg-none d-xl-none justify-content-end px-1"
mat-header-cell mat-header-cell
mat-sort-header mat-sort-header
> >

4
libs/ui/src/lib/assistant/assistant.component.ts

@ -1,11 +1,9 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { getAssetProfileIdentifier } from '@ghostfolio/common/helper'; import { getAssetProfileIdentifier } from '@ghostfolio/common/helper';
import { Filter, PortfolioPosition, User } from '@ghostfolio/common/interfaces'; import { Filter, PortfolioPosition, User } from '@ghostfolio/common/interfaces';
import { InternalRoute } from '@ghostfolio/common/routes/interfaces/internal-route.interface'; import { InternalRoute } from '@ghostfolio/common/routes/interfaces/internal-route.interface';
import { internalRoutes } from '@ghostfolio/common/routes/routes'; import { internalRoutes } from '@ghostfolio/common/routes/routes';
import { AccountWithPlatform, DateRange } from '@ghostfolio/common/types'; import { AccountWithPlatform, DateRange } from '@ghostfolio/common/types';
import { AdminService, DataService } from '@ghostfolio/ui/services';
import { FocusKeyManager } from '@angular/cdk/a11y'; import { FocusKeyManager } from '@angular/cdk/a11y';
import { import {

3
libs/ui/src/lib/benchmark/benchmark-detail-dialog/benchmark-detail-dialog.component.ts

@ -1,5 +1,3 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { DataService } from '@ghostfolio/client/services/data.service';
import { DATE_FORMAT } from '@ghostfolio/common/helper'; import { DATE_FORMAT } from '@ghostfolio/common/helper';
import { import {
AdminMarketDataDetails, AdminMarketDataDetails,
@ -7,6 +5,7 @@ import {
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer'; import { GfDialogFooterComponent } from '@ghostfolio/ui/dialog-footer';
import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header'; import { GfDialogHeaderComponent } from '@ghostfolio/ui/dialog-header';
import { DataService } from '@ghostfolio/ui/services';
import { import {
CUSTOM_ELEMENTS_SCHEMA, CUSTOM_ELEMENTS_SCHEMA,

5
libs/ui/src/lib/environment/environment.interface.ts

@ -0,0 +1,5 @@
export interface GfEnvironment {
lastPublish: string | null;
production: boolean;
stripePublicKey: string;
}

7
libs/ui/src/lib/environment/environment.token.ts

@ -0,0 +1,7 @@
import { InjectionToken } from '@angular/core';
import { GfEnvironment } from './environment.interface';
export const GF_ENVIRONMENT = new InjectionToken<GfEnvironment>(
'GF_ENVIRONMENT'
);

2
libs/ui/src/lib/environment/index.ts

@ -0,0 +1,2 @@
export * from './environment.interface';
export * from './environment.token';

4
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor-dialog/historical-market-data-editor-dialog.component.ts

@ -1,6 +1,4 @@
/* eslint-disable @nx/enforce-module-boundaries */ import { AdminService, DataService } from '@ghostfolio/ui/services';
import { AdminService } from '@ghostfolio/client/services/admin.service';
import { DataService } from '@ghostfolio/client/services/data.service';
import { import {
ChangeDetectionStrategy, ChangeDetectionStrategy,

3
libs/ui/src/lib/historical-market-data-editor/historical-market-data-editor.component.ts

@ -1,5 +1,3 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { DataService } from '@ghostfolio/client/services/data.service';
import { UpdateMarketDataDto } from '@ghostfolio/common/dtos'; import { UpdateMarketDataDto } from '@ghostfolio/common/dtos';
import { import {
DATE_FORMAT, DATE_FORMAT,
@ -7,6 +5,7 @@ import {
getLocale getLocale
} from '@ghostfolio/common/helper'; } from '@ghostfolio/common/helper';
import { LineChartItem, User } from '@ghostfolio/common/interfaces'; import { LineChartItem, User } from '@ghostfolio/common/interfaces';
import { DataService } from '@ghostfolio/ui/services';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { import {

12
apps/client/src/app/services/admin.service.ts → libs/ui/src/lib/services/admin.service.ts

@ -21,22 +21,22 @@ import {
Filter Filter
} from '@ghostfolio/common/interfaces'; } from '@ghostfolio/common/interfaces';
import { DateRange } from '@ghostfolio/common/types'; import { DateRange } from '@ghostfolio/common/types';
import { GF_ENVIRONMENT, GfEnvironment } from '@ghostfolio/ui/environment';
import { DataService } from '@ghostfolio/ui/services';
import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'; import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http';
import { Injectable } from '@angular/core'; import { Inject, Injectable } from '@angular/core';
import { SortDirection } from '@angular/material/sort'; import { SortDirection } from '@angular/material/sort';
import { DataSource, MarketData, Platform } from '@prisma/client'; import { DataSource, MarketData, Platform } from '@prisma/client';
import { JobStatus } from 'bull'; import { JobStatus } from 'bull';
import { environment } from '../../environments/environment';
import { DataService } from './data.service';
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class AdminService { export class AdminService {
public constructor( public constructor(
private dataService: DataService, private dataService: DataService,
@Inject(GF_ENVIRONMENT) private environment: GfEnvironment,
private http: HttpClient private http: HttpClient
) {} ) {}
@ -124,7 +124,7 @@ export class AdminService {
}); });
return this.http.get<DataProviderGhostfolioStatusResponse>( return this.http.get<DataProviderGhostfolioStatusResponse>(
`${environment.production ? 'https://ghostfol.io' : ''}/api/v2/data-providers/ghostfolio/status`, `${this.environment.production ? 'https://ghostfol.io' : ''}/api/v2/data-providers/ghostfolio/status`,
{ headers } { headers }
); );
} }
@ -276,7 +276,7 @@ export class AdminService {
scraperConfiguration, scraperConfiguration,
symbol symbol
}: AssetProfileIdentifier & UpdateAssetProfileDto['scraperConfiguration']) { }: AssetProfileIdentifier & UpdateAssetProfileDto['scraperConfiguration']) {
return this.http.post<any>( return this.http.post<{ price: number }>(
`/api/v1/admin/market-data/${dataSource}/${symbol}/test`, `/api/v1/admin/market-data/${dataSource}/${symbol}/test`,
{ {
scraperConfiguration scraperConfiguration

0
apps/client/src/app/services/data.service.ts → libs/ui/src/lib/services/data.service.ts

2
libs/ui/src/lib/services/index.ts

@ -0,0 +1,2 @@
export * from './admin.service';
export * from './data.service';

3
libs/ui/src/lib/symbol-autocomplete/symbol-autocomplete.component.ts

@ -1,7 +1,6 @@
/* eslint-disable @nx/enforce-module-boundaries */
import { DataService } from '@ghostfolio/client/services/data.service';
import { LookupItem } from '@ghostfolio/common/interfaces'; import { LookupItem } from '@ghostfolio/common/interfaces';
import { GfSymbolPipe } from '@ghostfolio/common/pipes'; import { GfSymbolPipe } from '@ghostfolio/common/pipes';
import { DataService } from '@ghostfolio/ui/services';
import { FocusMonitor } from '@angular/cdk/a11y'; import { FocusMonitor } from '@angular/cdk/a11y';
import { import {

20
package-lock.json

@ -1,12 +1,12 @@
{ {
"name": "ghostfolio", "name": "ghostfolio",
"version": "2.227.0", "version": "2.228.0",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "ghostfolio", "name": "ghostfolio",
"version": "2.227.0", "version": "2.228.0",
"hasInstallScript": true, "hasInstallScript": true,
"license": "AGPL-3.0", "license": "AGPL-3.0",
"dependencies": { "dependencies": {
@ -22,7 +22,7 @@
"@angular/router": "21.0.6", "@angular/router": "21.0.6",
"@angular/service-worker": "21.0.6", "@angular/service-worker": "21.0.6",
"@codewithdan/observable-store": "2.2.15", "@codewithdan/observable-store": "2.2.15",
"@date-fns/utc": "2.1.0", "@date-fns/utc": "2.1.1",
"@internationalized/number": "3.6.5", "@internationalized/number": "3.6.5",
"@ionic/angular": "8.7.8", "@ionic/angular": "8.7.8",
"@keyv/redis": "4.4.0", "@keyv/redis": "4.4.0",
@ -126,7 +126,7 @@
"@types/google-spreadsheet": "3.1.5", "@types/google-spreadsheet": "3.1.5",
"@types/jest": "30.0.0", "@types/jest": "30.0.0",
"@types/jsonpath": "0.2.4", "@types/jsonpath": "0.2.4",
"@types/lodash": "4.17.20", "@types/lodash": "4.17.21",
"@types/node": "22.15.17", "@types/node": "22.15.17",
"@types/papaparse": "5.3.7", "@types/papaparse": "5.3.7",
"@types/passport-google-oauth20": "2.0.16", "@types/passport-google-oauth20": "2.0.16",
@ -3816,9 +3816,9 @@
} }
}, },
"node_modules/@date-fns/utc": { "node_modules/@date-fns/utc": {
"version": "2.1.0", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/@date-fns/utc/-/utc-2.1.0.tgz", "resolved": "https://registry.npmjs.org/@date-fns/utc/-/utc-2.1.1.tgz",
"integrity": "sha512-176grgAgU2U303rD2/vcOmNg0kGPbhzckuH1TEP2al7n0AQipZIy9P15usd2TKQCG1g+E1jX/ZVQSzs4sUDwgA==", "integrity": "sha512-SlJDfG6RPeEX8wEVv6ZB3kak4MmbtyiI2qX/5zuKdordbrhB/iaJ58GVMZgJ6P1sJaM1gMgENFYYeg1JWrCFrA==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/@deno/shim-deno": { "node_modules/@deno/shim-deno": {
@ -12674,9 +12674,9 @@
} }
}, },
"node_modules/@types/lodash": { "node_modules/@types/lodash": {
"version": "4.17.20", "version": "4.17.21",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", "integrity": "sha512-FOvQ0YPD5NOfPgMzJihoT+Za5pdkDJWcbpuj1DjaKZIr/gxodQjY/uWEFlTNqW2ugXHUiL8lRQgw63dzKHZdeQ==",
"dev": true, "dev": true,
"license": "MIT" "license": "MIT"
}, },

6
package.json

@ -1,6 +1,6 @@
{ {
"name": "ghostfolio", "name": "ghostfolio",
"version": "2.227.0", "version": "2.228.0",
"homepage": "https://ghostfol.io", "homepage": "https://ghostfol.io",
"license": "AGPL-3.0", "license": "AGPL-3.0",
"repository": "https://github.com/ghostfolio/ghostfolio", "repository": "https://github.com/ghostfolio/ghostfolio",
@ -66,7 +66,7 @@
"@angular/router": "21.0.6", "@angular/router": "21.0.6",
"@angular/service-worker": "21.0.6", "@angular/service-worker": "21.0.6",
"@codewithdan/observable-store": "2.2.15", "@codewithdan/observable-store": "2.2.15",
"@date-fns/utc": "2.1.0", "@date-fns/utc": "2.1.1",
"@internationalized/number": "3.6.5", "@internationalized/number": "3.6.5",
"@ionic/angular": "8.7.8", "@ionic/angular": "8.7.8",
"@keyv/redis": "4.4.0", "@keyv/redis": "4.4.0",
@ -170,7 +170,7 @@
"@types/google-spreadsheet": "3.1.5", "@types/google-spreadsheet": "3.1.5",
"@types/jest": "30.0.0", "@types/jest": "30.0.0",
"@types/jsonpath": "0.2.4", "@types/jsonpath": "0.2.4",
"@types/lodash": "4.17.20", "@types/lodash": "4.17.21",
"@types/node": "22.15.17", "@types/node": "22.15.17",
"@types/papaparse": "5.3.7", "@types/papaparse": "5.3.7",
"@types/passport-google-oauth20": "2.0.16", "@types/passport-google-oauth20": "2.0.16",

Loading…
Cancel
Save