diff --git a/packages/blockchain-link-types/src/common.ts b/packages/blockchain-link-types/src/common.ts index 1f6967b0fa..b21f7cd22d 100644 --- a/packages/blockchain-link-types/src/common.ts +++ b/packages/blockchain-link-types/src/common.ts @@ -1,5 +1,7 @@ import type tls from 'tls'; +import type { BaseCurrencyCode } from '@suite-common/suite-config'; + import type { Transaction as BlockbookTransaction, VinVout } from './blockbook'; import type { AddressAlias, @@ -116,9 +118,9 @@ export type TransactionDetail = { totalOutput: string; }; -export interface FiatRatesBySymbol { - [symbol: string]: number | undefined; -} +export type FiatRatesBySymbol = { + [K in BaseCurrencyCode]?: number | undefined; +}; export interface AccountBalanceHistory { time: number; diff --git a/packages/suite/src/utils/wallet/graph/utilsWorker.ts b/packages/suite/src/utils/wallet/graph/utilsWorker.ts index bd746b7ccd..df9e360bc4 100644 --- a/packages/suite/src/utils/wallet/graph/utilsWorker.ts +++ b/packages/suite/src/utils/wallet/graph/utilsWorker.ts @@ -1,7 +1,9 @@ import { fromUnixTime, getUnixTime, startOfMonth } from 'date-fns'; +import { BaseCurrencyCode } from '@suite-common/suite-config'; import { toFiatCurrency } from '@suite-common/wallet-utils'; import type { FiatRatesBySymbol } from '@trezor/connect'; +import { typedObjectFromEntries, typedObjectKeys } from '@trezor/utils'; import { BigNumber } from '@trezor/utils/src/bigNumber'; import { @@ -15,14 +17,13 @@ import { ObjectType, TypeName, sumFiatValueMapInPlace } from './utilsShared'; const calcFiatValueMap = ( amount: string, rates: FiatRatesBySymbol, -): { [k: string]: string | undefined } => { - const fiatValueMap: { [k: string]: string | undefined } = {}; - Object.keys(rates).forEach(fiatSymbol => { - fiatValueMap[fiatSymbol] = toFiatCurrency(amount, rates?.[fiatSymbol]) ?? '0'; - }); - - return fiatValueMap; -}; +): { [K in BaseCurrencyCode]?: string | undefined } => + typedObjectFromEntries( + typedObjectKeys(rates).map(fiatSymbol => [ + fiatSymbol, + toFiatCurrency(amount, rates[fiatSymbol]) ?? '0', + ]), + ); const isAccountAggregatedHistory = ( history: AggregatedAccountHistory | AggregatedDashboardHistory, diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index f2e826fa90..b808d65f2d 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -55,6 +55,7 @@ export * from './throttler'; export * from './throwError'; export * from './topologicalSort'; export * from './typedEventEmitter'; +export * from './typedObjectFromEntries'; export * from './typedObjectKeys'; export * from './urlToOnion'; export * from './zip'; diff --git a/packages/utils/src/typedObjectFromEntries.ts b/packages/utils/src/typedObjectFromEntries.ts new file mode 100644 index 0000000000..5745411062 --- /dev/null +++ b/packages/utils/src/typedObjectFromEntries.ts @@ -0,0 +1,5 @@ +export function typedObjectFromEntries( + entries: T, +): { [K in T[number] as K[0]]: K[1] } { + return Object.fromEntries(entries) as any; +} diff --git a/packages/utils/tests/typedObjectFromEntries.type-test.ts b/packages/utils/tests/typedObjectFromEntries.type-test.ts new file mode 100644 index 0000000000..637d775947 --- /dev/null +++ b/packages/utils/tests/typedObjectFromEntries.type-test.ts @@ -0,0 +1,21 @@ +import { typedObjectFromEntries } from '../src/typedObjectFromEntries'; +import { typedObjectKeys } from '../src/typedObjectKeys'; + +const map = { + a: 1, + b: 2, +}; + +export const _test: { [K in keyof typeof map]: number } = typedObjectFromEntries([ + ['a', 10], + ['b', 20], +] as const); + +export const _test2: { [K in keyof typeof map]: number } = typedObjectFromEntries( + typedObjectKeys(map).map(k => [k, map[k] * 2]), +); + +// @ts-expect-error String cannot be assigned to number as map-value +export const _test3: { [K in keyof typeof map]: number } = typedObjectFromEntries( + typedObjectKeys(map).map(k => [k, '']), +); diff --git a/packages/utils/tests/typedObjectKeys.type-test.ts b/packages/utils/tests/typedObjectKeys.type-test.ts new file mode 100644 index 0000000000..253702f341 --- /dev/null +++ b/packages/utils/tests/typedObjectKeys.type-test.ts @@ -0,0 +1,6 @@ +import { typedObjectKeys } from '../src/typedObjectKeys'; + +type AB = { a: number; b: number } | { b: string }; +const ab: AB = { b: 'B' }; + +export const _test: 'b'[] = typedObjectKeys(ab); diff --git a/suite-common/fiat-services/src/coingecko.ts b/suite-common/fiat-services/src/coingecko.ts index ce43f53b73..dd6802a850 100644 --- a/suite-common/fiat-services/src/coingecko.ts +++ b/suite-common/fiat-services/src/coingecko.ts @@ -122,6 +122,7 @@ export const findClosestTimestampValue = ( * * @param {TickerId} ticker * @param {number[]} timestamps + * @param {BaseCurrencyCode} fiatCurrencyCode */ export const getFiatRatesForTimestamps = async ( ticker: TickerId,