diff --git a/packages/shared/src/blockchain/alchemy.ts b/packages/shared/src/blockchain/alchemy.ts index 009e464..0eeba92 100644 --- a/packages/shared/src/blockchain/alchemy.ts +++ b/packages/shared/src/blockchain/alchemy.ts @@ -4,31 +4,40 @@ import { logger } from "../lib"; import type { NetworkLayer } from "../types"; export class Alchemy { - private static instance: Alchemy | undefined; + private static instances: Map = new Map(); private alchemy: AlchemyInstance; - public static getInstance(networkLayer: NetworkLayer) { - if (!this.instance) { - this.instance = new Alchemy(networkLayer); + public static getInstance(networkLayer: NetworkLayer): Alchemy { + if (!this.instances.has(networkLayer)) { + this.instances.set(networkLayer, new Alchemy(networkLayer)); } - return this.instance; + return this.instances.get(networkLayer)!; } - constructor(networkLayer: NetworkLayer) { + private constructor(networkLayer: NetworkLayer) { logger.debug(`Attempting to get alchemy network for: "${networkLayer}"`); - const network = - networkLayer === "l1" - ? Network[config.ALCHEMY_L1_NETWORK as keyof typeof Network] - : Network[config.ALCHEMY_L2_NETWORK as keyof typeof Network]; + const network = this.getNetworkConfig(networkLayer); const settings = { apiKey: config.ALCHEMY_API_KEY, network, maxRetries: 5, }; + this.alchemy = new AlchemyInstance({ ...settings }); } + private getNetworkConfig(networkLayer: NetworkLayer): Network { + switch (networkLayer) { + case "l1": + return Network[config.ALCHEMY_L1_NETWORK as keyof typeof Network]; + case "l2": + return Network[config.ALCHEMY_L2_NETWORK as keyof typeof Network]; + default: + throw new Error(`Unsupported network layer: ${networkLayer}`); + } + } + async getBlock(blockNumber: bigint) { const blockHashOrBlockTag = `0x${Number(blockNumber).toString(16)}`; return this.alchemy.core.getBlock(blockHashOrBlockTag);