2021-07-19 14:50:34 +02:00
|
|
|
import { ethers } from 'ethers';
|
|
|
|
import { Injectable } from '@nestjs/common';
|
|
|
|
import { ConfigService } from '@nestjs/config';
|
|
|
|
|
2021-10-13 17:18:24 +02:00
|
|
|
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';
|
2021-07-19 14:50:34 +02:00
|
|
|
|
|
|
|
@Injectable()
|
|
|
|
export class ProviderService {
|
|
|
|
private readonly chainId: number;
|
2021-10-21 16:45:02 +02:00
|
|
|
private readonly providers: Map<ChainId, ethers.providers.StaticJsonRpcProvider> = new Map();
|
2021-07-19 14:50:34 +02:00
|
|
|
|
|
|
|
constructor(private configService: ConfigService) {
|
2021-07-21 12:37:08 +02:00
|
|
|
this.chainId = this.configService.get<number>('base.chainId');
|
2021-07-19 14:50:34 +02:00
|
|
|
}
|
|
|
|
|
2021-10-21 16:45:02 +02:00
|
|
|
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)!;
|
2021-07-19 14:50:34 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
getTornadoPool() {
|
2021-10-21 16:45:02 +02:00
|
|
|
return TornadoPool.connect(CONTRACT_NETWORKS[this.chainId], this.provider);
|
2021-10-13 17:18:24 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
getOffChainOracle() {
|
2021-10-21 16:45:02 +02:00
|
|
|
const provider = this.getProvider(ChainId.MAINNET);
|
2021-10-13 17:18:24 +02:00
|
|
|
return OffchainOracle.connect(OFF_CHAIN_ORACLE, provider);
|
2021-07-19 14:50:34 +02:00
|
|
|
}
|
2021-07-21 12:37:08 +02:00
|
|
|
|
|
|
|
async checkSenderBalance() {
|
|
|
|
try {
|
|
|
|
const balance = await this.getBalance(this.configService.get<string>('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);
|
|
|
|
}
|
2021-07-19 14:50:34 +02:00
|
|
|
}
|