From 7f95092023986bdb4a8a76ea527a26f7edeba32b Mon Sep 17 00:00:00 2001 From: Kevin Dave Date: Thu, 3 Oct 2024 13:57:09 +0700 Subject: [PATCH 1/2] chore(currency): cache .fromId result --- packages/currency/src/currencyManager.ts | 16 +++++++++++++++- packages/currency/test/currencyManager.test.ts | 13 +++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/packages/currency/src/currencyManager.ts b/packages/currency/src/currencyManager.ts index 3bc12f63d5..1a1c2e4910 100644 --- a/packages/currency/src/currencyManager.ts +++ b/packages/currency/src/currencyManager.ts @@ -20,6 +20,9 @@ export class CurrencyManager implements CurrencyTypes.ICurrency private readonly legacyTokens: CurrencyTypes.LegacyTokenMap; private readonly conversionPairs: CurrencyTypes.AggregatorsMap; + private readonly knownCurrenciesById: Map> = + new Map(); + private static defaultInstance: CurrencyManager; /** @@ -84,7 +87,18 @@ export class CurrencyManager implements CurrencyTypes.ICurrency * Gets a supported currency from its CurrencyTypes.CurrencyDefinition id */ fromId(id: string): CurrencyTypes.CurrencyDefinition | undefined { - return this.knownCurrencies.find((knownCurrency) => knownCurrency.id === id); + const cachedCurrency = this.knownCurrenciesById.get(id); + if (cachedCurrency) { + return cachedCurrency; + } + + const currency = this.knownCurrencies.find((knownCurrency) => knownCurrency.id === id); + if (!currency) { + return undefined; + } + + this.knownCurrenciesById.set(id, currency); + return currency; } /** diff --git a/packages/currency/test/currencyManager.test.ts b/packages/currency/test/currencyManager.test.ts index 7f2f02177f..0f6b0b8f05 100644 --- a/packages/currency/test/currencyManager.test.ts +++ b/packages/currency/test/currencyManager.test.ts @@ -153,6 +153,19 @@ describe('CurrencyManager', () => { }); describe('Accessing currencies', () => { + it('access a common token by its id', () => { + expect(currencyManager.fromId('USDC-multichain-moonbeam')).toMatchObject({ + symbol: 'USDC-multichain', + decimals: 6, + }); + + // Run the test twice to ensure caching result don't break things. + expect(currencyManager.fromId('USDC-multichain-moonbeam')).toMatchObject({ + symbol: 'USDC-multichain', + decimals: 6, + }); + }); + it('access a common token by its symbol', () => { expect(currencyManager.from('DAI')).toMatchObject({ symbol: 'DAI', From 282a30b831341885beef0ced31e9b31f074f8d10 Mon Sep 17 00:00:00 2001 From: Kevin Dave Date: Thu, 3 Oct 2024 14:12:01 +0700 Subject: [PATCH 2/2] apply suggestion from CodeRabbit to initialize Map in constructor --- packages/currency/src/currencyManager.ts | 20 ++++++------------- .../currency/test/currencyManager.test.ts | 6 ------ 2 files changed, 6 insertions(+), 20 deletions(-) diff --git a/packages/currency/src/currencyManager.ts b/packages/currency/src/currencyManager.ts index 1a1c2e4910..e697228670 100644 --- a/packages/currency/src/currencyManager.ts +++ b/packages/currency/src/currencyManager.ts @@ -20,8 +20,7 @@ export class CurrencyManager implements CurrencyTypes.ICurrency private readonly legacyTokens: CurrencyTypes.LegacyTokenMap; private readonly conversionPairs: CurrencyTypes.AggregatorsMap; - private readonly knownCurrenciesById: Map> = - new Map(); + private readonly knownCurrenciesById: Map>; private static defaultInstance: CurrencyManager; @@ -44,6 +43,10 @@ export class CurrencyManager implements CurrencyTypes.ICurrency } this.knownCurrencies.push(currency); } + + this.knownCurrenciesById = new Map( + this.knownCurrencies.map((knownCurrency) => [knownCurrency.id, knownCurrency]), + ); this.legacyTokens = legacyTokens || CurrencyManager.getDefaultLegacyTokens(); this.conversionPairs = conversionPairs || CurrencyManager.getDefaultConversionPairs(); } @@ -87,18 +90,7 @@ export class CurrencyManager implements CurrencyTypes.ICurrency * Gets a supported currency from its CurrencyTypes.CurrencyDefinition id */ fromId(id: string): CurrencyTypes.CurrencyDefinition | undefined { - const cachedCurrency = this.knownCurrenciesById.get(id); - if (cachedCurrency) { - return cachedCurrency; - } - - const currency = this.knownCurrencies.find((knownCurrency) => knownCurrency.id === id); - if (!currency) { - return undefined; - } - - this.knownCurrenciesById.set(id, currency); - return currency; + return this.knownCurrenciesById.get(id); } /** diff --git a/packages/currency/test/currencyManager.test.ts b/packages/currency/test/currencyManager.test.ts index 0f6b0b8f05..26a0819a39 100644 --- a/packages/currency/test/currencyManager.test.ts +++ b/packages/currency/test/currencyManager.test.ts @@ -158,12 +158,6 @@ describe('CurrencyManager', () => { symbol: 'USDC-multichain', decimals: 6, }); - - // Run the test twice to ensure caching result don't break things. - expect(currencyManager.fromId('USDC-multichain-moonbeam')).toMatchObject({ - symbol: 'USDC-multichain', - decimals: 6, - }); }); it('access a common token by its symbol', () => {