Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,47 @@ import type {
PermissionTypes,
Rule,
} from '@metamask/7715-permission-types';
import { isHex, toHex, type Address } from 'viem';
import { isHex, toHex } from 'viem';
import type {
Client,
Account,
RpcSchema,
Transport,
Chain,
Address,
} from 'viem';

/**
* RPC schema for MetaMask related methods.
*
* Extends the base RPC schema with methods specific to interacting with EIP-7715:
* - `wallet_invokeSnap`: Invokes a method on a specific Snap.
*/
export type MetaMaskExtensionSchema = RpcSchema &
[
{
// eslint-disable-next-line @typescript-eslint/naming-convention
Method: 'wallet_requestExecutionPermissions';
// eslint-disable-next-line @typescript-eslint/naming-convention
Params: PermissionRequest<AccountSigner, PermissionTypes>[];
// eslint-disable-next-line @typescript-eslint/naming-convention
ReturnType: PermissionResponse<AccountSigner, PermissionTypes>[];
},
];

import type { SnapClient } from './snapsAuthorization.js';
/**
* A Viem client extended with MetaMask Snap-specific RPC methods.
*
* This client type allows for interaction with MetaMask Snaps through
* the standard Viem client interface, with added type safety for
* Snap-specific methods.
*/
export type MetaMaskExtensionClient = Client<
Transport,
Chain | undefined,
Account | undefined,
MetaMaskExtensionSchema
>;

type PermissionParameter = {
type: string;
Expand Down Expand Up @@ -125,38 +163,30 @@ export type RequestExecutionPermissionsReturnType = PermissionResponse<
* @template Signer - The type of the signer, either an Address or Account.
* @param client - The client to use for the request.
* @param parameters - The permissions requests to grant.
* @param kernelSnapId - The ID of the kernel snap to invoke, defaults to 'npm:@metamask/permissions-kernel-snap'.
* @returns A promise that resolves to the permission responses.
* @description
* This function formats the permissions requests and invokes the wallet snap to grant permissions.
* This function formats the permissions requests and invokes the wallet method to grant permissions.
* It will throw an error if the permissions could not be granted.
*/
export async function erc7715RequestExecutionPermissionsAction(
client: SnapClient,
client: MetaMaskExtensionClient,
parameters: RequestExecutionPermissionsParameters,
kernelSnapId = 'npm:@metamask/permissions-kernel-snap',
): Promise<RequestExecutionPermissionsReturnType> {
const formattedParameters = parameters.map(formatPermissionsRequest);
const formattedPermissionRequest = parameters.map(formatPermissionsRequest);

const result = await client.request(
{
method: 'wallet_invokeSnap',
params: {
snapId: kernelSnapId,
request: {
method: 'wallet_requestExecutionPermissions',
params: formattedParameters,
},
},
method: 'wallet_requestExecutionPermissions',
params: formattedPermissionRequest,
},
{ retryCount: 0 },
);

if (result === null) {
if (!result) {
throw new Error('Failed to grant permissions');
}

return result as any as RequestExecutionPermissionsReturnType;
return result;
}

/**
Expand Down
36 changes: 16 additions & 20 deletions packages/delegation-toolkit/src/experimental/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,15 @@ import {
sendUserOperationWithDelegationAction,
} from './erc7710RedeemDelegationAction';
import { erc7715RequestExecutionPermissionsAction } from './erc7715RequestExecutionPermissionsAction';
import type { RequestExecutionPermissionsParameters } from './erc7715RequestExecutionPermissionsAction';
import { ensureSnapsAuthorized } from './snapsAuthorization';
import type { SnapClient } from './snapsAuthorization';
import type {
MetaMaskExtensionClient,
RequestExecutionPermissionsParameters,
} from './erc7715RequestExecutionPermissionsAction';

export {
erc7715RequestExecutionPermissionsAction as requestExecutionPermissions,
type MetaMaskExtensionClient,
type MetaMaskExtensionSchema,
type RequestExecutionPermissionsParameters,
type RequestExecutionPermissionsReturnType,
} from './erc7715RequestExecutionPermissionsAction';
Expand All @@ -27,23 +30,16 @@ export {
type DelegationStorageConfig,
} from './delegationStorage';

export const erc7715ProviderActions =
(snapIds?: { kernelSnapId: string; providerSnapId: string }) =>
(client: Client) => ({
requestExecutionPermissions: async (
parameters: RequestExecutionPermissionsParameters,
) => {
if (!(await ensureSnapsAuthorized(client as SnapClient, snapIds))) {
throw new Error('Snaps not authorized');
}

return erc7715RequestExecutionPermissionsAction(
client as SnapClient,
parameters,
snapIds?.kernelSnapId,
);
},
});
export const erc7715ProviderActions = () => (client: Client) => ({
requestExecutionPermissions: async (
parameters: RequestExecutionPermissionsParameters,
) => {
return erc7715RequestExecutionPermissionsAction(
client as MetaMaskExtensionClient,
parameters,
);
},
});

export const erc7710WalletActions = () => (client: WalletClient) => ({
sendTransactionWithDelegation: async (
Expand Down
39 changes: 39 additions & 0 deletions packages/delegation-toolkit/src/experimental/metaMaskExtension.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import type {
AccountSigner,
PermissionRequest,
PermissionResponse,
PermissionTypes,
} from '@metamask/7715-permission-types';
import type { Account, Chain, Client, RpcSchema, Transport } from 'viem';

/**
* RPC schema for MetaMask related methods.
*
* Extends the base RPC schema with methods specific to interacting with EIP-7715:
* - `wallet_invokeSnap`: Invokes a method on a specific Snap.
*/
export type MetaMaskExtensionSchema = RpcSchema &
[
{
// eslint-disable-next-line @typescript-eslint/naming-convention
Method: 'wallet_requestExecutionPermissions';
// eslint-disable-next-line @typescript-eslint/naming-convention
Params: PermissionRequest<AccountSigner, PermissionTypes>[];
// eslint-disable-next-line @typescript-eslint/naming-convention
ReturnType: PermissionResponse<AccountSigner, PermissionTypes>[];
},
];

/**
* A Viem client extended with MetaMask Snap-specific RPC methods.
*
* This client type allows for interaction with MetaMask Snaps through
* the standard Viem client interface, with added type safety for
* Snap-specific methods.
*/
export type MetaMaskExtensionClient = Client<
Transport,
Chain | undefined,
Account | undefined,
MetaMaskExtensionSchema
>;
149 changes: 0 additions & 149 deletions packages/delegation-toolkit/src/experimental/snapsAuthorization.ts

This file was deleted.

Loading
Loading