43 lines
1.4 KiB
TypeScript
43 lines
1.4 KiB
TypeScript
import { Injectable } from '@nestjs/common';
|
|
import { ConfigService } from '@nestjs/config';
|
|
import { JsonRpcProvider, Contract } from 'ethers';
|
|
import { COUPON_FACTORY_ABI } from '../../contracts/abis/coupon.abi';
|
|
import { CONTRACT_ADDRESSES } from '../../contracts/addresses';
|
|
|
|
@Injectable()
|
|
export class StatsService {
|
|
private provider: JsonRpcProvider;
|
|
private factoryContract: Contract;
|
|
|
|
constructor(private config: ConfigService) {
|
|
this.provider = new JsonRpcProvider(this.config.get('rpcUrl'));
|
|
this.factoryContract = new Contract(CONTRACT_ADDRESSES.couponFactory, COUPON_FACTORY_ABI, this.provider);
|
|
}
|
|
|
|
async getStats() {
|
|
const [latestBlock, totalBatches] = await Promise.all([
|
|
this.provider.getBlock('latest'),
|
|
this.factoryContract.totalBatches().catch(() => 0n),
|
|
]);
|
|
|
|
// 计算近100个区块的TPS
|
|
let tps = 0;
|
|
if (latestBlock && latestBlock.number > 100) {
|
|
const oldBlock = await this.provider.getBlock(latestBlock.number - 100);
|
|
if (oldBlock) {
|
|
const timeDiff = latestBlock.timestamp - oldBlock.timestamp;
|
|
tps = timeDiff > 0 ? Math.round((100 * latestBlock.transactions.length) / timeDiff) : 0;
|
|
}
|
|
}
|
|
|
|
return {
|
|
blockHeight: latestBlock?.number || 0,
|
|
blockHash: latestBlock?.hash,
|
|
timestamp: latestBlock?.timestamp,
|
|
tps,
|
|
chainId: this.config.get('chainId'),
|
|
totalCouponBatches: Number(totalBatches),
|
|
};
|
|
}
|
|
}
|