gcx/blockchain/enterprise-api/src/modules/rpc/rpc.service.ts

38 lines
1.1 KiB
TypeScript

import { Injectable, BadRequestException } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
const ALLOWED_METHODS = [
'eth_blockNumber', 'eth_getBlockByNumber', 'eth_getBlockByHash',
'eth_getTransactionByHash', 'eth_getTransactionReceipt', 'eth_call',
'eth_estimateGas', 'eth_sendRawTransaction', 'eth_getBalance',
'eth_getCode', 'eth_getLogs', 'eth_chainId', 'net_version',
];
@Injectable()
export class RpcService {
private rpcUrl: string;
constructor(private config: ConfigService) {
this.rpcUrl = this.config.get('rpcUrl')!;
}
async proxy(request: { jsonrpc: string; method: string; params: any[]; id: number }) {
if (!ALLOWED_METHODS.includes(request.method)) {
throw new BadRequestException(`Method ${request.method} not allowed`);
}
const response = await fetch(this.rpcUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
jsonrpc: '2.0',
method: request.method,
params: request.params || [],
id: request.id || 1,
}),
});
return response.json();
}
}