import { ethers } from 'ethers'; import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { ChainId } from '@/types'; import { CONTRACT_NETWORKS, OFF_CHAIN_ORACLE, RPC_LIST } from '@/constants'; import { TornadoPool__factory as TornadoPool, OffchainOracle__factory as OffchainOracle } from '@/artifacts'; @Injectable() export class ProviderService { private readonly chainId: number; private readonly providers: Map = new Map(); constructor(private configService: ConfigService) { this.chainId = this.configService.get('base.chainId'); } get provider() { return this.getProvider(this.chainId); } getProvider(chainId: ChainId) { if (!this.providers.has(chainId)) { this.providers.set(chainId, new ethers.providers.StaticJsonRpcProvider(RPC_LIST[chainId], chainId)); } // eslint-disable-next-line @typescript-eslint/no-non-null-assertion return this.providers.get(chainId)!; } getTornadoPool() { return TornadoPool.connect(CONTRACT_NETWORKS[this.chainId], this.provider); } getOffChainOracle() { const provider = this.getProvider(ChainId.MAINNET); return OffchainOracle.connect(OFF_CHAIN_ORACLE, provider); } async checkSenderBalance() { try { const balance = await this.getBalance(this.configService.get('base.address')); return balance.gt(ethers.utils.parseEther(this.configService.get('base.minimumBalance'))); } catch { return false; } } async getBalance(address: string) { return await this.provider.getBalance(address); } }