Skip to content

Commit

Permalink
wip: update JsonRpcRequest typings
Browse files Browse the repository at this point in the history
  • Loading branch information
legobeat committed Apr 18, 2024
1 parent 1fda0ff commit 53c8a35
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 24 deletions.
21 changes: 12 additions & 9 deletions app/core/RPCMethods/RPCMethodMiddleware.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import {
JsonRpcEngine,
JsonRpcMiddleware,
} from '@metamask/json-rpc-engine';
import type { Json, JsonRpcFailure, JsonRpcParams, JsonRpcRequest, JsonRpcResponse, JsonRpcSuccess, } from '@metamask/utils';
import type { Transaction } from '@metamask/transaction-controller';
import { JsonRpcEngine, JsonRpcMiddleware } from '@metamask/json-rpc-engine';
import type {
Json,
JsonRpcFailure,
JsonRpcParams,
JsonRpcRequest,
JsonRpcResponse,
JsonRpcSuccess,
} from '@metamask/utils';
import type { ProviderConfig } from '@metamask/network-controller';
import { providerErrors, rpcErrors } from '@metamask/rpc-errors';
import Engine from '../Engine';
Expand Down Expand Up @@ -827,7 +830,7 @@ describe('getRpcMethodMiddleware', () => {
it('returns a JSON-RPC error if an error is thrown when adding this transaction', async () => {
// Omit `from` and `chainId` here to skip validation for simplicity
// Downcast needed here because `from` is required by this type
const mockTransactionParameters = {} as JsonRpcParams
const mockTransactionParameters = {} as JsonRpcParams;
// Transaction fails before returning a result
mockAddTransaction.mockImplementation(async () => {
throw new Error('Failed to add transaction');
Expand All @@ -840,7 +843,7 @@ describe('getRpcMethodMiddleware', () => {
jsonrpc,
id: 1,
method: 'eth_sendTransaction',
params: [mockTransactionParameters]
params: [mockTransactionParameters],
};
const expectedError = rpcErrors.internal('Failed to add transaction');

Expand All @@ -857,7 +860,7 @@ describe('getRpcMethodMiddleware', () => {
it('returns a JSON-RPC error if an error is thrown after approval', async () => {
// Omit `from` and `chainId` here to skip validation for simplicity
// Downcast needed here because `from` is required by this type
const mockTransactionParameters = {} as JsonRpcParams
const mockTransactionParameters = {} as JsonRpcParams;
setupGlobalState({
addTransactionResult: Promise.reject(
new Error('Failed to process transaction'),
Expand Down
25 changes: 17 additions & 8 deletions app/core/RPCMethods/eth_sendTransaction.test.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
// eslint-disable-next-line import/no-nodejs-modules
import { inspect } from 'util';
import type { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/utils';
import type {
Transaction,
Json,
JsonRpcParams,
JsonRpcRequest,
PendingJsonRpcResponse,
} from '@metamask/utils';
import type {
TransactionParams,

Check failure on line 10 in app/core/RPCMethods/eth_sendTransaction.test.ts

View workflow job for this annotation

GitHub Actions / scripts (lint:tsc)

Module '"@metamask/transaction-controller"' has no exported member 'TransactionParams'.
TransactionController,
WalletDevice,
} from '@metamask/transaction-controller';
Expand Down Expand Up @@ -40,8 +45,8 @@ jest.mock('../../util/transaction-controller', () => ({
* @returns The JSON-RPC request.
*/
function constructSendTransactionRequest(
params: unknown,
): JsonRpcRequest<unknown> & { method: 'eth_sendTransaction' } {
params: JsonRpcParams,
): JsonRpcRequest<JsonRpcParams> & { method: 'eth_sendTransaction' } {
return {
jsonrpc: '2.0',
id: 1,
Expand All @@ -55,7 +60,7 @@ function constructSendTransactionRequest(
*
* @returns A pending JSON-RPC response.
*/
function constructPendingJsonRpcResponse(): PendingJsonRpcResponse<unknown> {
function constructPendingJsonRpcResponse(): PendingJsonRpcResponse<Json> {
return {
jsonrpc: '2.0',
id: 1,
Expand Down Expand Up @@ -99,7 +104,7 @@ function getMockAddTransaction({

return jest.fn().mockImplementation(
async (
transaction: Transaction,
transaction: TransactionParams,
{
origin,
deviceConfirmedOn,
Expand Down Expand Up @@ -136,13 +141,17 @@ function getMockAddTransaction({
describe('eth_sendTransaction', () => {
it('sends the transaction and returns the resulting hash', async () => {
const mockAddress = '0x0000000000000000000000000000000000000001';
const mockTransactionParameters = { from: mockAddress };
const mockTransactionParameters = {
from: mockAddress,
} as TransactionParams;
const expectedResult = 'fake-hash';
const pendingResult = constructPendingJsonRpcResponse();

await eth_sendTransaction({
hostname: 'example.metamask.io',
req: constructSendTransactionRequest([mockTransactionParameters]),
req: constructSendTransactionRequest([

Check failure on line 152 in app/core/RPCMethods/eth_sendTransaction.test.ts

View workflow job for this annotation

GitHub Actions / scripts (lint:tsc)

Type '{ params?: ((Record<string, import("/home/runner/work/metamask-mobile/metamask-mobile/node_modules/@metamask/assets-controllers/node_modules/@metamask/base-controller/node_modules/@metamask/utils/dist/types/json").Json> | import("/home/runner/work/metamask-mobile/metamask-mobile/node_modules/@metamask/assets-control...' is not assignable to type '{ params?: ((Record<string, import("/home/runner/work/metamask-mobile/metamask-mobile/node_modules/@metamask/assets-controllers/node_modules/@metamask/base-controller/node_modules/@metamask/utils/dist/types/json").Json> | import("/home/runner/work/metamask-mobile/metamask-mobile/node_modules/@metamask/assets-control...'. Two different types with this name exist, but they are unrelated.
mockTransactionParameters as unknown as JsonRpcParams,
]),
res: pendingResult,
sendTransaction: getMockAddTransaction({
expectedTransaction: mockTransactionParameters,
Expand Down
19 changes: 14 additions & 5 deletions app/core/RPCMethods/eth_sendTransaction.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,13 @@
import type { Json, JsonRpcParams, JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/utils';
import type {
Hex,
Json,
JsonRpcParams,
JsonRpcRequest,
PendingJsonRpcResponse,
} from '@metamask/utils';
import {
TransactionController,
TransactionParams,
WalletDevice,
} from '@metamask/transaction-controller';
import { rpcErrors } from '@metamask/rpc-errors';
Expand Down Expand Up @@ -46,10 +53,10 @@ const hasProperty = <
): objectToCheck is ObjectToCheck & Record<Property, unknown> =>
Object.hasOwnProperty.call(objectToCheck, name);

type SendArgs = {
interface SendArgs {
from: string;
chainId?: number;
};
chainId?: Hex;
}

/**
* Handle a `eth_sendTransaction` request.
Expand All @@ -71,7 +78,9 @@ async function eth_sendTransaction({
validateAccountAndChainId,
}: {
hostname: string;
req: JsonRpcRequest<SendArgs[]> & { method: 'eth_sendTransaction' };
req: JsonRpcRequest<[TransactionParams & JsonRpcParams]> & {
method: 'eth_sendTransaction';
};
res: PendingJsonRpcResponse<Json>;
sendTransaction: TransactionController['addTransaction'];
validateAccountAndChainId: (args: SendArgs) => Promise<void>;
Expand Down
5 changes: 4 additions & 1 deletion app/core/RPCMethods/wallet_watchAsset.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,10 @@ import {
} from '../../constants/error';
import { selectChainId } from '../../selectors/networkController';
import { isValidAddress } from 'ethereumjs-util';
import { JsonRpcRequest, PendingJsonRpcResponse } from '@metamask/json-rpc-engine';
import {
JsonRpcRequest,
PendingJsonRpcResponse,
} from '@metamask/json-rpc-engine';

const wallet_watchAsset = async ({
req,
Expand Down
4 changes: 3 additions & 1 deletion app/core/SanitizationMiddleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ export const permittedKeys = [
* @param parameter - The parameter to sanitize.
* @returns The given parameter containing just permitted keys.
*/
function sanitizeRpcParameter(parameter: Record<PropertyKey, unknown>): Record<string, Json> {
function sanitizeRpcParameter(
parameter: Record<PropertyKey, unknown>,
): Record<string, Json> {
return permittedKeys.reduce<Record<string, Json>>((copy, permitted) => {
if (permitted in parameter) {
const value = parameter[permitted];
Expand Down

0 comments on commit 53c8a35

Please sign in to comment.