PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-rpc-wrapper/src
Просмотр файла: evmRPCWrapper.ts
import { EVMRPCRequest, EVMRPCResult, EVMRPCTransactionOptions } from './types';
import {
Wallet,
WalletSignMessageOptions,
WalletSignTypedDataOptions,
SignTypedDataVersion,
SendManyOptions,
} from '@bitgo/sdk-core';
import { hexStringToNumber } from '@bitgo/sdk-coin-eth';
import { personal_sign, eth_signTypedData, eth_sendTransaction } from './constants';
export class EvmRPCWrapper {
private wallet: Wallet;
constructor(wallet: Wallet) {
if (!wallet.baseCoin.isEVM()) {
throw new Error(`${wallet.coin()} is not an EVM coin.`);
}
this.wallet = wallet;
}
/**
* Handles RPC call from an EVM provider and invokes the appropriate BitGo SDK wallet method.
*
* @evmrpcRequest request
* @evmrpcRequest walletPassphrase
*/
async handleRPCCall(request: EVMRPCRequest, walletPassphrase: string): Promise<EVMRPCResult> {
const { method, id, jsonrpc, params } = request;
let result;
switch (method) {
case personal_sign:
const walletSignMessageOptions: WalletSignMessageOptions = {
message: {
messageRaw: params[0],
},
walletPassphrase,
};
result = await this.wallet.signMessage(walletSignMessageOptions);
break;
case eth_signTypedData:
const walletSignTypedDataOptions: WalletSignTypedDataOptions = {
walletPassphrase,
typedData: {
typedDataRaw: params[0],
version: SignTypedDataVersion.V4,
},
};
result = await this.wallet.signTypedData(walletSignTypedDataOptions);
break;
case eth_sendTransaction:
let option = params[0];
if (this.isString(params[0])) {
option = JSON.parse(params[0]);
}
result = await this.sendTransaction(option as unknown as EVMRPCTransactionOptions);
break;
default:
throw new Error(`method '${method}' not yet implemented`);
}
return {
id,
jsonrpc,
result,
};
}
private async sendTransaction(options: EVMRPCTransactionOptions): Promise<any> {
const { to, data, gasPrice, gasLimit, value } = options;
const sendManyOptions: SendManyOptions = {
recipients: [
{
address: to,
amount: value,
data,
},
],
gasPrice: hexStringToNumber(gasPrice),
gasLimit: hexStringToNumber(gasLimit),
};
return await this.wallet.sendMany(sendManyOptions);
}
private isString(str: string): boolean {
if (str != null && typeof str.valueOf() === 'string') {
return true;
}
return false;
}
}
Выполнить команду
Для локальной разработки. Не используйте в интернете!