evm-blockchain-tools
Version:
This is a collection of resuseable tools to support development for EVM-powered blockchains
103 lines (80 loc) • 2.58 kB
text/typescript
import { ethers, Signer, Wallet } from "ethers";
import Web3 from "web3";
import { hashMessage } from "@ethersproject/hash";
import { EvmGatewayConfig, IWeb3Gateway } from "../common/interfaces";
import { APP_NETWORK } from "../common/constants";
import { isValidEvmTxFormat } from "../utils";
import pino from "pino";
export class EvmGateway implements IWeb3Gateway {
protected web3: Web3;
protected keepAliveInterval: NodeJS.Timeout;
protected logger = pino();
public provider: ethers.providers.JsonRpcProvider;
public wallet: Wallet;
public network = APP_NETWORK.BINANCE;
constructor(protected config: EvmGatewayConfig) {
this.connect();
}
protected async checkConnection(): Promise<void> {
try {
await this.provider.getNetwork();
await this.provider.getBlockNumber();
} catch (error) {
this.logger.error(`error checking connection: ${error.message}`);
this.connect();
}
}
public connect(): void {
if (this.keepAliveInterval) {
clearInterval(this.keepAliveInterval);
}
const provider = new ethers.providers.JsonRpcProvider(
this.config.httpsUrl,
{
name: this.config.name,
chainId: this.config.chainId,
}
);
provider.on("error", (err) => {
this.logger.error(`http connection error: ${err.message}`);
this.connect();
});
this.provider = provider;
this.keepAliveInterval = setInterval(
this.checkConnection.bind(this),
1000 * 60 * 3
); // polls every 3 mins
}
public get signer(): Promise<Signer> {
return Promise.resolve(
new ethers.Wallet(this.config.privateKey, this.provider)
);
}
public async getGasPrice(): Promise<string> {
const gasPrice = await this.provider.getGasPrice();
return gasPrice.toString();
}
public isValidTxFormat(txHash: string): boolean {
return isValidEvmTxFormat(txHash);
}
public async getBlock(blockNumber: number): Promise<any> {
const block = await this.provider.getBlock(blockNumber);
return block;
}
public async recoverSigner(
message: string,
signedMessage: string
): Promise<string> {
return ethers.utils.recoverAddress(hashMessage(message), signedMessage);
}
public getCurrentBlock(): Promise<number> {
return this.provider.getBlockNumber();
}
public async getSignerAddress(): Promise<string> {
const signer = await this.signer;
return signer.getAddress();
}
public getTransactionByID(txID: string): Promise<any> {
return this.provider.getTransaction(txID);
}
}