PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-rpc-wrapper/test/unit
Просмотр файла: evmRPCWrapper.ts
import { TestBitGo } from '@bitgo/sdk-test';
import { BitGoAPI } from '@bitgo/sdk-api';
import { EvmRPCWrapper } from '../../src/evmRPCWrapper';
import {
Wallet,
common,
ECDSAUtils,
Keychains,
Ecdsa,
SignedMessage,
SignTypedDataVersion,
SendManyOptions,
} from '@bitgo/sdk-core';
import { EVMRPCRequest } from '../../src/types';
import { Hteth } from '@bitgo/sdk-coin-eth';
import * as sinon from 'sinon';
import {
ethWalletData,
txRequestForMessageSigning,
reqId,
typedMessage,
txRequestForTypedDataSigning,
transactionOptions,
} from '../fixtures/evmRPCWrapperFixtures';
import nock = require('nock');
import { personal_sign, eth_signTypedData, eth_sendTransaction } from '../../src/constants';
describe('EVMRPCWrapper handleRPCCall', function () {
const bitgo = TestBitGo.decorate(BitGoAPI, { env: 'test' });
const coin = 'gteth';
let params: EVMRPCRequest;
let txHash;
const sandbox = sinon.createSandbox();
let bgUrl;
const walletPassphrase = 'bitGo';
let wallet;
let evmRPCWrapper;
let signTxRequestForMessage;
before(function () {
bitgo.initializeTestVars();
bitgo.safeRegister(coin, Hteth.createInstance);
wallet = new Wallet(bitgo, bitgo.coin(coin), ethWalletData);
bgUrl = common.Environments[bitgo.getEnv()].uri;
evmRPCWrapper = new EvmRPCWrapper(wallet);
sandbox
.stub(Keychains.prototype, 'getKeysForSigning')
.resolves([{ commonKeychain: 'test', id: '', pub: '', type: 'independent' }]);
sinon.stub(Ecdsa.prototype, 'verify').resolves(true);
signTxRequestForMessage = sandbox.stub(ECDSAUtils.EcdsaUtils.prototype, 'signTxRequestForMessage');
nock.cleanAll();
});
after(function () {
nock.cleanAll();
});
it('should throw for unknown method', async function () {
const badMethod = 'bad_method';
params = {
method: badMethod,
params: [''],
};
await evmRPCWrapper
.handleRPCCall(params, walletPassphrase)
.should.be.rejectedWith(`method '${badMethod}' not yet implemented`);
});
it('personal_sign should call wallet signMessage', async function () {
signTxRequestForMessage.resolves(txRequestForMessageSigning);
const messageRaw = 'test message';
params = {
method: personal_sign,
params: [messageRaw],
};
const expected: SignedMessage = { txRequestId: reqId.toString(), txHash, messageRaw, coin };
const signStub = sandbox.stub(Wallet.prototype, 'signMessage').resolves(expected);
nock(bgUrl)
.get(
`/api/v2/wallet/${wallet.id()}/txrequests?txRequestIds=${txRequestForMessageSigning.txRequestId}&latest=true`
)
.reply(200, { txRequests: [txRequestForMessageSigning] });
const actual = await evmRPCWrapper.handleRPCCall(params, walletPassphrase);
signStub.calledOnceWith({ message: { messageRaw }, walletPassphrase });
actual.result.should.deepEqual(expected);
});
it('eth_signTypedData should call wallet signTypedData', async function () {
signTxRequestForMessage.resolves(txRequestForTypedDataSigning);
params = {
method: eth_signTypedData,
params: [JSON.stringify(typedMessage)],
};
const messageRaw = JSON.stringify(typedMessage);
const expected: SignedMessage = {
txRequestId: reqId.toString(),
messageRaw,
txHash,
coin,
};
const signStub = sandbox.stub(Wallet.prototype, 'signTypedData').resolves(expected);
nock(bgUrl)
.get(
`/api/v2/wallet/${wallet.id()}/txrequests?txRequestIds=${txRequestForTypedDataSigning.txRequestId}&latest=true`
)
.reply(200, { txRequests: [txRequestForTypedDataSigning] });
const actual = await evmRPCWrapper.handleRPCCall(params, walletPassphrase);
signStub.calledOnceWith({
typedData: { typedDataRaw: messageRaw, version: SignTypedDataVersion.V4 },
walletPassphrase,
});
actual.result.should.deepEqual(expected);
});
it('eth_sendTransaction should call wallet sendMany', async function () {
params = {
method: eth_sendTransaction,
params: [JSON.stringify(transactionOptions)],
};
const expected = 'sendTxRequest';
const sendManyStub = sandbox.stub(Wallet.prototype, 'sendMany').resolves(expected);
const actual = await evmRPCWrapper.handleRPCCall(params, walletPassphrase);
sendManyStub.calledOnceWith(transactionOptions as unknown as SendManyOptions);
actual.result.should.equal(expected);
});
});
Выполнить команду
Для локальной разработки. Не используйте в интернете!