@metamask/snaps-rpc-methods 15.1.0 → 16.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -4
- package/dist/endowments/keyring.cjs +2 -5
- package/dist/endowments/keyring.cjs.map +1 -1
- package/dist/endowments/keyring.d.cts +0 -2
- package/dist/endowments/keyring.d.cts.map +1 -1
- package/dist/endowments/keyring.d.mts +0 -2
- package/dist/endowments/keyring.d.mts.map +1 -1
- package/dist/endowments/keyring.mjs +3 -6
- package/dist/endowments/keyring.mjs.map +1 -1
- package/dist/index.cjs +1 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -2
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -2
- package/dist/index.mjs.map +1 -1
- package/dist/permissions.cjs +18 -8
- package/dist/permissions.cjs.map +1 -1
- package/dist/permissions.d.cts +3 -2
- package/dist/permissions.d.cts.map +1 -1
- package/dist/permissions.d.mts +3 -2
- package/dist/permissions.d.mts.map +1 -1
- package/dist/permissions.mjs +17 -7
- package/dist/permissions.mjs.map +1 -1
- package/dist/permitted/cancelBackgroundEvent.cjs +10 -14
- package/dist/permitted/cancelBackgroundEvent.cjs.map +1 -1
- package/dist/permitted/cancelBackgroundEvent.d.cts +9 -12
- package/dist/permitted/cancelBackgroundEvent.d.cts.map +1 -1
- package/dist/permitted/cancelBackgroundEvent.d.mts +9 -12
- package/dist/permitted/cancelBackgroundEvent.d.mts.map +1 -1
- package/dist/permitted/cancelBackgroundEvent.mjs +10 -14
- package/dist/permitted/cancelBackgroundEvent.mjs.map +1 -1
- package/dist/permitted/clearState.cjs +10 -16
- package/dist/permitted/clearState.cjs.map +1 -1
- package/dist/permitted/clearState.d.cts +9 -23
- package/dist/permitted/clearState.d.cts.map +1 -1
- package/dist/permitted/clearState.d.mts +9 -23
- package/dist/permitted/clearState.d.mts.map +1 -1
- package/dist/permitted/clearState.mjs +10 -16
- package/dist/permitted/clearState.mjs.map +1 -1
- package/dist/permitted/closeWebSocket.cjs +7 -14
- package/dist/permitted/closeWebSocket.cjs.map +1 -1
- package/dist/permitted/closeWebSocket.d.cts +9 -12
- package/dist/permitted/closeWebSocket.d.cts.map +1 -1
- package/dist/permitted/closeWebSocket.d.mts +9 -12
- package/dist/permitted/closeWebSocket.d.mts.map +1 -1
- package/dist/permitted/closeWebSocket.mjs +7 -14
- package/dist/permitted/closeWebSocket.mjs.map +1 -1
- package/dist/permitted/createInterface.cjs +11 -15
- package/dist/permitted/createInterface.cjs.map +1 -1
- package/dist/permitted/createInterface.d.cts +23 -37
- package/dist/permitted/createInterface.d.cts.map +1 -1
- package/dist/permitted/createInterface.d.mts +23 -37
- package/dist/permitted/createInterface.d.mts.map +1 -1
- package/dist/permitted/createInterface.mjs +11 -15
- package/dist/permitted/createInterface.mjs.map +1 -1
- package/dist/permitted/endTrace.cjs +4 -6
- package/dist/permitted/endTrace.cjs.map +1 -1
- package/dist/permitted/endTrace.d.cts +8 -11
- package/dist/permitted/endTrace.d.cts.map +1 -1
- package/dist/permitted/endTrace.d.mts +8 -11
- package/dist/permitted/endTrace.d.mts.map +1 -1
- package/dist/permitted/endTrace.mjs +4 -6
- package/dist/permitted/endTrace.mjs.map +1 -1
- package/dist/permitted/getAllSnaps.cjs +5 -11
- package/dist/permitted/getAllSnaps.cjs.map +1 -1
- package/dist/permitted/getAllSnaps.d.cts +10 -14
- package/dist/permitted/getAllSnaps.d.cts.map +1 -1
- package/dist/permitted/getAllSnaps.d.mts +10 -14
- package/dist/permitted/getAllSnaps.d.mts.map +1 -1
- package/dist/permitted/getAllSnaps.mjs +5 -11
- package/dist/permitted/getAllSnaps.mjs.map +1 -1
- package/dist/permitted/getBackgroundEvents.cjs +8 -15
- package/dist/permitted/getBackgroundEvents.cjs.map +1 -1
- package/dist/permitted/getBackgroundEvents.d.cts +10 -13
- package/dist/permitted/getBackgroundEvents.d.cts.map +1 -1
- package/dist/permitted/getBackgroundEvents.d.mts +10 -13
- package/dist/permitted/getBackgroundEvents.d.mts.map +1 -1
- package/dist/permitted/getBackgroundEvents.mjs +8 -15
- package/dist/permitted/getBackgroundEvents.mjs.map +1 -1
- package/dist/permitted/getClientStatus.cjs +5 -6
- package/dist/permitted/getClientStatus.cjs.map +1 -1
- package/dist/permitted/getClientStatus.d.cts +17 -18
- package/dist/permitted/getClientStatus.d.cts.map +1 -1
- package/dist/permitted/getClientStatus.d.mts +17 -18
- package/dist/permitted/getClientStatus.d.mts.map +1 -1
- package/dist/permitted/getClientStatus.mjs +5 -6
- package/dist/permitted/getClientStatus.mjs.map +1 -1
- package/dist/permitted/getFile.cjs +7 -11
- package/dist/permitted/getFile.cjs.map +1 -1
- package/dist/permitted/getFile.d.cts +8 -10
- package/dist/permitted/getFile.d.cts.map +1 -1
- package/dist/permitted/getFile.d.mts +8 -10
- package/dist/permitted/getFile.d.mts.map +1 -1
- package/dist/permitted/getFile.mjs +7 -11
- package/dist/permitted/getFile.mjs.map +1 -1
- package/dist/permitted/getInterfaceContext.cjs +12 -15
- package/dist/permitted/getInterfaceContext.cjs.map +1 -1
- package/dist/permitted/getInterfaceContext.d.cts +9 -21
- package/dist/permitted/getInterfaceContext.d.cts.map +1 -1
- package/dist/permitted/getInterfaceContext.d.mts +9 -21
- package/dist/permitted/getInterfaceContext.d.mts.map +1 -1
- package/dist/permitted/getInterfaceContext.mjs +12 -15
- package/dist/permitted/getInterfaceContext.mjs.map +1 -1
- package/dist/permitted/getInterfaceState.cjs +11 -15
- package/dist/permitted/getInterfaceState.cjs.map +1 -1
- package/dist/permitted/getInterfaceState.d.cts +9 -21
- package/dist/permitted/getInterfaceState.d.cts.map +1 -1
- package/dist/permitted/getInterfaceState.d.mts +9 -21
- package/dist/permitted/getInterfaceState.d.mts.map +1 -1
- package/dist/permitted/getInterfaceState.mjs +11 -15
- package/dist/permitted/getInterfaceState.mjs.map +1 -1
- package/dist/permitted/getSnaps.cjs +6 -12
- package/dist/permitted/getSnaps.cjs.map +1 -1
- package/dist/permitted/getSnaps.d.cts +11 -14
- package/dist/permitted/getSnaps.d.cts.map +1 -1
- package/dist/permitted/getSnaps.d.mts +11 -14
- package/dist/permitted/getSnaps.d.mts.map +1 -1
- package/dist/permitted/getSnaps.mjs +6 -12
- package/dist/permitted/getSnaps.mjs.map +1 -1
- package/dist/permitted/getState.cjs +9 -11
- package/dist/permitted/getState.cjs.map +1 -1
- package/dist/permitted/getState.d.cts +17 -28
- package/dist/permitted/getState.d.cts.map +1 -1
- package/dist/permitted/getState.d.mts +17 -28
- package/dist/permitted/getState.d.mts.map +1 -1
- package/dist/permitted/getState.mjs +9 -11
- package/dist/permitted/getState.mjs.map +1 -1
- package/dist/permitted/getWebSockets.cjs +11 -14
- package/dist/permitted/getWebSockets.cjs.map +1 -1
- package/dist/permitted/getWebSockets.d.cts +10 -13
- package/dist/permitted/getWebSockets.d.cts.map +1 -1
- package/dist/permitted/getWebSockets.d.mts +10 -13
- package/dist/permitted/getWebSockets.d.mts.map +1 -1
- package/dist/permitted/getWebSockets.mjs +11 -14
- package/dist/permitted/getWebSockets.mjs.map +1 -1
- package/dist/permitted/index.cjs +0 -1
- package/dist/permitted/index.cjs.map +1 -1
- package/dist/permitted/index.d.cts +29 -25
- package/dist/permitted/index.d.cts.map +1 -1
- package/dist/permitted/index.d.mts +29 -25
- package/dist/permitted/index.d.mts.map +1 -1
- package/dist/permitted/index.mjs +0 -1
- package/dist/permitted/index.mjs.map +1 -1
- package/dist/permitted/invokeKeyring.cjs +12 -13
- package/dist/permitted/invokeKeyring.cjs.map +1 -1
- package/dist/permitted/invokeKeyring.d.cts +17 -16
- package/dist/permitted/invokeKeyring.d.cts.map +1 -1
- package/dist/permitted/invokeKeyring.d.mts +17 -16
- package/dist/permitted/invokeKeyring.d.mts.map +1 -1
- package/dist/permitted/invokeKeyring.mjs +12 -13
- package/dist/permitted/invokeKeyring.mjs.map +1 -1
- package/dist/permitted/invokeSnapSugar.cjs +6 -10
- package/dist/permitted/invokeSnapSugar.cjs.map +1 -1
- package/dist/permitted/invokeSnapSugar.d.cts +9 -12
- package/dist/permitted/invokeSnapSugar.d.cts.map +1 -1
- package/dist/permitted/invokeSnapSugar.d.mts +9 -12
- package/dist/permitted/invokeSnapSugar.d.mts.map +1 -1
- package/dist/permitted/invokeSnapSugar.mjs +6 -10
- package/dist/permitted/invokeSnapSugar.mjs.map +1 -1
- package/dist/permitted/listEntropySources.cjs +28 -12
- package/dist/permitted/listEntropySources.cjs.map +1 -1
- package/dist/permitted/listEntropySources.d.cts +12 -23
- package/dist/permitted/listEntropySources.d.cts.map +1 -1
- package/dist/permitted/listEntropySources.d.mts +12 -23
- package/dist/permitted/listEntropySources.d.mts.map +1 -1
- package/dist/permitted/listEntropySources.mjs +28 -12
- package/dist/permitted/listEntropySources.mjs.map +1 -1
- package/dist/permitted/middleware.cjs +70 -20
- package/dist/permitted/middleware.cjs.map +1 -1
- package/dist/permitted/middleware.d.cts +5 -2
- package/dist/permitted/middleware.d.cts.map +1 -1
- package/dist/permitted/middleware.d.mts +5 -2
- package/dist/permitted/middleware.d.mts.map +1 -1
- package/dist/permitted/middleware.mjs +70 -20
- package/dist/permitted/middleware.mjs.map +1 -1
- package/dist/permitted/openWebSocket.cjs +7 -14
- package/dist/permitted/openWebSocket.cjs.map +1 -1
- package/dist/permitted/openWebSocket.d.cts +9 -12
- package/dist/permitted/openWebSocket.d.cts.map +1 -1
- package/dist/permitted/openWebSocket.d.mts +9 -12
- package/dist/permitted/openWebSocket.d.mts.map +1 -1
- package/dist/permitted/openWebSocket.mjs +7 -14
- package/dist/permitted/openWebSocket.mjs.map +1 -1
- package/dist/permitted/requestSnaps.cjs +14 -19
- package/dist/permitted/requestSnaps.cjs.map +1 -1
- package/dist/permitted/requestSnaps.d.cts +9 -36
- package/dist/permitted/requestSnaps.d.cts.map +1 -1
- package/dist/permitted/requestSnaps.d.mts +9 -36
- package/dist/permitted/requestSnaps.d.mts.map +1 -1
- package/dist/permitted/requestSnaps.mjs +15 -20
- package/dist/permitted/requestSnaps.mjs.map +1 -1
- package/dist/permitted/resolveInterface.cjs +11 -15
- package/dist/permitted/resolveInterface.cjs.map +1 -1
- package/dist/permitted/resolveInterface.d.cts +12 -24
- package/dist/permitted/resolveInterface.d.cts.map +1 -1
- package/dist/permitted/resolveInterface.d.mts +12 -24
- package/dist/permitted/resolveInterface.d.mts.map +1 -1
- package/dist/permitted/resolveInterface.mjs +11 -15
- package/dist/permitted/resolveInterface.mjs.map +1 -1
- package/dist/permitted/scheduleBackgroundEvent.cjs +11 -14
- package/dist/permitted/scheduleBackgroundEvent.cjs.map +1 -1
- package/dist/permitted/scheduleBackgroundEvent.d.cts +10 -17
- package/dist/permitted/scheduleBackgroundEvent.d.cts.map +1 -1
- package/dist/permitted/scheduleBackgroundEvent.d.mts +10 -17
- package/dist/permitted/scheduleBackgroundEvent.d.mts.map +1 -1
- package/dist/permitted/scheduleBackgroundEvent.mjs +11 -14
- package/dist/permitted/scheduleBackgroundEvent.mjs.map +1 -1
- package/dist/permitted/sendWebSocketMessage.cjs +10 -14
- package/dist/permitted/sendWebSocketMessage.cjs.map +1 -1
- package/dist/permitted/sendWebSocketMessage.d.cts +9 -12
- package/dist/permitted/sendWebSocketMessage.d.cts.map +1 -1
- package/dist/permitted/sendWebSocketMessage.d.mts +9 -12
- package/dist/permitted/sendWebSocketMessage.d.mts.map +1 -1
- package/dist/permitted/sendWebSocketMessage.mjs +10 -14
- package/dist/permitted/sendWebSocketMessage.mjs.map +1 -1
- package/dist/permitted/setState.cjs +18 -21
- package/dist/permitted/setState.cjs.map +1 -1
- package/dist/permitted/setState.d.cts +18 -45
- package/dist/permitted/setState.d.cts.map +1 -1
- package/dist/permitted/setState.d.mts +18 -45
- package/dist/permitted/setState.d.mts.map +1 -1
- package/dist/permitted/setState.mjs +18 -21
- package/dist/permitted/setState.mjs.map +1 -1
- package/dist/permitted/startTrace.cjs +4 -6
- package/dist/permitted/startTrace.cjs.map +1 -1
- package/dist/permitted/startTrace.d.cts +8 -11
- package/dist/permitted/startTrace.d.cts.map +1 -1
- package/dist/permitted/startTrace.d.mts +8 -11
- package/dist/permitted/startTrace.d.mts.map +1 -1
- package/dist/permitted/startTrace.mjs +4 -6
- package/dist/permitted/startTrace.mjs.map +1 -1
- package/dist/permitted/trackError.cjs +4 -6
- package/dist/permitted/trackError.cjs.map +1 -1
- package/dist/permitted/trackError.d.cts +8 -11
- package/dist/permitted/trackError.d.cts.map +1 -1
- package/dist/permitted/trackError.d.mts +8 -11
- package/dist/permitted/trackError.d.mts.map +1 -1
- package/dist/permitted/trackError.mjs +4 -6
- package/dist/permitted/trackError.mjs.map +1 -1
- package/dist/permitted/trackEvent.cjs +4 -6
- package/dist/permitted/trackEvent.cjs.map +1 -1
- package/dist/permitted/trackEvent.d.cts +8 -11
- package/dist/permitted/trackEvent.d.cts.map +1 -1
- package/dist/permitted/trackEvent.d.mts +8 -11
- package/dist/permitted/trackEvent.d.mts.map +1 -1
- package/dist/permitted/trackEvent.mjs +4 -6
- package/dist/permitted/trackEvent.mjs.map +1 -1
- package/dist/permitted/updateInterface.cjs +11 -15
- package/dist/permitted/updateInterface.cjs.map +1 -1
- package/dist/permitted/updateInterface.d.cts +9 -22
- package/dist/permitted/updateInterface.d.cts.map +1 -1
- package/dist/permitted/updateInterface.d.mts +9 -22
- package/dist/permitted/updateInterface.d.mts.map +1 -1
- package/dist/permitted/updateInterface.mjs +11 -15
- package/dist/permitted/updateInterface.mjs.map +1 -1
- package/dist/restricted/dialog.cjs +23 -30
- package/dist/restricted/dialog.cjs.map +1 -1
- package/dist/restricted/dialog.d.cts +10 -58
- package/dist/restricted/dialog.d.cts.map +1 -1
- package/dist/restricted/dialog.d.mts +10 -58
- package/dist/restricted/dialog.d.mts.map +1 -1
- package/dist/restricted/dialog.mjs +23 -30
- package/dist/restricted/dialog.mjs.map +1 -1
- package/dist/restricted/getBip32Entropy.cjs +15 -12
- package/dist/restricted/getBip32Entropy.cjs.map +1 -1
- package/dist/restricted/getBip32Entropy.d.cts +11 -24
- package/dist/restricted/getBip32Entropy.d.cts.map +1 -1
- package/dist/restricted/getBip32Entropy.d.mts +11 -24
- package/dist/restricted/getBip32Entropy.d.mts.map +1 -1
- package/dist/restricted/getBip32Entropy.mjs +16 -13
- package/dist/restricted/getBip32Entropy.mjs.map +1 -1
- package/dist/restricted/getBip32PublicKey.cjs +15 -12
- package/dist/restricted/getBip32PublicKey.cjs.map +1 -1
- package/dist/restricted/getBip32PublicKey.d.cts +11 -24
- package/dist/restricted/getBip32PublicKey.d.cts.map +1 -1
- package/dist/restricted/getBip32PublicKey.d.mts +11 -24
- package/dist/restricted/getBip32PublicKey.d.mts.map +1 -1
- package/dist/restricted/getBip32PublicKey.mjs +16 -13
- package/dist/restricted/getBip32PublicKey.mjs.map +1 -1
- package/dist/restricted/getBip44Entropy.cjs +14 -10
- package/dist/restricted/getBip44Entropy.cjs.map +1 -1
- package/dist/restricted/getBip44Entropy.d.cts +11 -15
- package/dist/restricted/getBip44Entropy.d.cts.map +1 -1
- package/dist/restricted/getBip44Entropy.d.mts +11 -15
- package/dist/restricted/getBip44Entropy.d.mts.map +1 -1
- package/dist/restricted/getBip44Entropy.mjs +15 -11
- package/dist/restricted/getBip44Entropy.mjs.map +1 -1
- package/dist/restricted/getEntropy.cjs +10 -10
- package/dist/restricted/getEntropy.cjs.map +1 -1
- package/dist/restricted/getEntropy.d.cts +11 -15
- package/dist/restricted/getEntropy.d.cts.map +1 -1
- package/dist/restricted/getEntropy.d.mts +11 -15
- package/dist/restricted/getEntropy.d.mts.map +1 -1
- package/dist/restricted/getEntropy.mjs +11 -11
- package/dist/restricted/getEntropy.mjs.map +1 -1
- package/dist/restricted/index.cjs.map +1 -1
- package/dist/restricted/index.d.cts +20 -160
- package/dist/restricted/index.d.cts.map +1 -1
- package/dist/restricted/index.d.mts +20 -160
- package/dist/restricted/index.d.mts.map +1 -1
- package/dist/restricted/index.mjs.map +1 -1
- package/dist/restricted/invokeSnap.cjs +11 -12
- package/dist/restricted/invokeSnap.cjs.map +1 -1
- package/dist/restricted/invokeSnap.d.cts +9 -13
- package/dist/restricted/invokeSnap.d.cts.map +1 -1
- package/dist/restricted/invokeSnap.d.mts +9 -13
- package/dist/restricted/invokeSnap.d.mts.map +1 -1
- package/dist/restricted/invokeSnap.mjs +11 -12
- package/dist/restricted/invokeSnap.mjs.map +1 -1
- package/dist/restricted/manageState.cjs +21 -20
- package/dist/restricted/manageState.cjs.map +1 -1
- package/dist/restricted/manageState.d.cts +12 -34
- package/dist/restricted/manageState.d.cts.map +1 -1
- package/dist/restricted/manageState.d.mts +12 -34
- package/dist/restricted/manageState.d.mts.map +1 -1
- package/dist/restricted/manageState.mjs +21 -20
- package/dist/restricted/manageState.mjs.map +1 -1
- package/dist/restricted/notify.cjs +31 -24
- package/dist/restricted/notify.cjs.map +1 -1
- package/dist/restricted/notify.d.cts +16 -25
- package/dist/restricted/notify.d.cts.map +1 -1
- package/dist/restricted/notify.d.mts +16 -25
- package/dist/restricted/notify.d.mts.map +1 -1
- package/dist/restricted/notify.mjs +32 -25
- package/dist/restricted/notify.mjs.map +1 -1
- package/dist/types.cjs +3 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +155 -0
- package/dist/types.d.cts.map +1 -0
- package/dist/types.d.mts +155 -0
- package/dist/types.d.mts.map +1 -0
- package/dist/types.mjs +2 -0
- package/dist/types.mjs.map +1 -0
- package/dist/utils.cjs +78 -24
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.cts +21 -13
- package/dist/utils.d.cts.map +1 -1
- package/dist/utils.d.mts +21 -13
- package/dist/utils.d.mts.map +1 -1
- package/dist/utils.mjs +75 -22
- package/dist/utils.mjs.map +1 -1
- package/package.json +6 -6
- package/dist/permitted/handlers.cjs +0 -63
- package/dist/permitted/handlers.cjs.map +0 -1
- package/dist/permitted/handlers.d.cts +0 -299
- package/dist/permitted/handlers.d.cts.map +0 -1
- package/dist/permitted/handlers.d.mts +0 -299
- package/dist/permitted/handlers.d.mts.map +0 -1
- package/dist/permitted/handlers.mjs +0 -60
- package/dist/permitted/handlers.mjs.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
|
+
import type { Messenger } from "@metamask/messenger";
|
|
1
2
|
import type { PermissionSpecificationBuilder, RestrictedMethodOptions, PermissionValidatorConstraint, PermissionSideEffect } from "@metamask/permission-controller";
|
|
2
3
|
import { PermissionType } from "@metamask/permission-controller";
|
|
3
4
|
import type { InvokeSnapParams, InvokeSnapResult, RequestSnapsParams, RequestSnapsResult } from "@metamask/snaps-sdk";
|
|
4
|
-
import type { SnapRpcHookArgs } from "@metamask/snaps-utils";
|
|
5
5
|
import type { NonEmptyArray } from "@metamask/utils";
|
|
6
|
-
import type {
|
|
6
|
+
import type { SnapControllerHandleRequestAction } from "../types.mjs";
|
|
7
7
|
export declare const WALLET_SNAP_PERMISSION_KEY = "wallet_snap";
|
|
8
8
|
export type SnapControllerInstallSnapsAction = {
|
|
9
9
|
type: `SnapController:installSnaps`;
|
|
@@ -14,14 +14,10 @@ export type SnapControllerGetPermittedSnapsAction = {
|
|
|
14
14
|
handler: (origin: string) => RequestSnapsResult;
|
|
15
15
|
};
|
|
16
16
|
type AllowedActions = SnapControllerInstallSnapsAction | SnapControllerGetPermittedSnapsAction;
|
|
17
|
-
export type
|
|
18
|
-
handleSnapRpcRequest: ({ snapId, origin, handler, request, }: SnapRpcHookArgs & {
|
|
19
|
-
snapId: string;
|
|
20
|
-
}) => Promise<unknown>;
|
|
21
|
-
};
|
|
17
|
+
export type InvokeSnapMessengerActions = SnapControllerHandleRequestAction;
|
|
22
18
|
type InvokeSnapSpecificationBuilderOptions = {
|
|
23
19
|
allowedCaveats?: Readonly<NonEmptyArray<string>> | null;
|
|
24
|
-
|
|
20
|
+
messenger: Messenger<string, InvokeSnapMessengerActions>;
|
|
25
21
|
};
|
|
26
22
|
/**
|
|
27
23
|
* The side-effect method to handle the snap install.
|
|
@@ -66,16 +62,16 @@ export declare const invokeSnapBuilder: Readonly<{
|
|
|
66
62
|
onPermitted: PermissionSideEffect<AllowedActions, never>['onPermitted'];
|
|
67
63
|
};
|
|
68
64
|
}>;
|
|
69
|
-
readonly
|
|
65
|
+
readonly actionNames: readonly ["SnapController:handleRequest"];
|
|
70
66
|
}>;
|
|
71
67
|
/**
|
|
72
68
|
* Builds the method implementation for `wallet_snap_*`.
|
|
73
69
|
*
|
|
74
|
-
* @param
|
|
75
|
-
* @param
|
|
76
|
-
* @returns The method implementation which returns the result of `
|
|
70
|
+
* @param options - The options.
|
|
71
|
+
* @param options.messenger - The messenger.
|
|
72
|
+
* @returns The method implementation which returns the result of `SnapController:handleRequest`.
|
|
77
73
|
* @throws If the params are invalid.
|
|
78
74
|
*/
|
|
79
|
-
export declare function getInvokeSnapImplementation({
|
|
75
|
+
export declare function getInvokeSnapImplementation({ messenger, }: InvokeSnapSpecificationBuilderOptions): (options: RestrictedMethodOptions<InvokeSnapParams>) => Promise<InvokeSnapResult>;
|
|
80
76
|
export {};
|
|
81
77
|
//# sourceMappingURL=invokeSnap.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invokeSnap.d.mts","sourceRoot":"","sources":["../../src/restricted/invokeSnap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,8BAA8B,EAC9B,uBAAuB,EAEvB,6BAA6B,EAC7B,oBAAoB,EACrB,wCAAwC;AACzC,OAAO,EAAE,cAAc,EAAE,wCAAwC;AAEjE,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EACnB,4BAA4B;
|
|
1
|
+
{"version":3,"file":"invokeSnap.d.mts","sourceRoot":"","sources":["../../src/restricted/invokeSnap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EACV,8BAA8B,EAC9B,uBAAuB,EAEvB,6BAA6B,EAC7B,oBAAoB,EACrB,wCAAwC;AACzC,OAAO,EAAE,cAAc,EAAE,wCAAwC;AAEjE,OAAO,KAAK,EACV,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,kBAAkB,EACnB,4BAA4B;AAE7B,OAAO,KAAK,EAAQ,aAAa,EAAE,wBAAwB;AAE3D,OAAO,KAAK,EAAE,iCAAiC,EAAE,qBAAiB;AAElE,eAAO,MAAM,0BAA0B,gBAAgB,CAAC;AAGxD,MAAM,MAAM,gCAAgC,GAAG;IAC7C,IAAI,EAAE,6BAA6B,CAAC;IACpC,OAAO,EAAE,CACP,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,kBAAkB,KAC/B,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,qCAAqC,GAAG;IAClD,IAAI,EAAE,kCAAkC,CAAC;IACzC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,kBAAkB,CAAC;CACjD,CAAC;AAEF,KAAK,cAAc,GACf,gCAAgC,GAChC,qCAAqC,CAAC;AAE1C,MAAM,MAAM,0BAA0B,GAAG,iCAAiC,CAAC;AAE3E,KAAK,qCAAqC,GAAG;IAC3C,cAAc,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;IACxD,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAAC;CAC1D,CAAC;AAaF;;;;;;;GAOG;AACH,eAAO,MAAM,iBAAiB,EAAE,oBAAoB,CAClD,cAAc,EACd,KAAK,CACN,CAAC,aAAa,CAwBd,CAAC;AAsCF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,iBAAiB;;;wBAzGZ,eAAe,gBAAgB;oBACnC,iCAAiC;8BACvB,WAAW,kCAAkC,CAAC;wBACpD,SAAS,cAAc,MAAM,CAAC,CAAC,GAAG,IAAI;mBAC3C,6BAA6B;oBAC5B;YACV,WAAW,EAAE,qBAAqB,cAAc,EAAE,KAAK,CAAC,CAAC,aAAa,CAAC,CAAC;SACzE;;;EAsGQ,CAAC;AAEZ;;;;;;;GAOG;AACH,wBAAgB,2BAA2B,CAAC,EAC1C,SAAS,GACV,EAAE,qCAAqC,aAE3B,wBAAwB,gBAAgB,CAAC,KACjD,QAAQ,gBAAgB,CAAC,CAc7B"}
|
|
@@ -31,15 +31,17 @@ export const handleSnapInstall = async ({ requestData, messenger }) => {
|
|
|
31
31
|
* and install it if it's not available yet.
|
|
32
32
|
*
|
|
33
33
|
* @param options - The specification builder options.
|
|
34
|
-
* @param options.
|
|
34
|
+
* @param options.messenger - The messenger.
|
|
35
35
|
* @returns The specification for the `wallet_snap_*` permission.
|
|
36
36
|
*/
|
|
37
|
-
const specificationBuilder = ({
|
|
37
|
+
const specificationBuilder = ({ messenger }) => {
|
|
38
38
|
return {
|
|
39
39
|
permissionType: PermissionType.RestrictedMethod,
|
|
40
40
|
targetName: WALLET_SNAP_PERMISSION_KEY,
|
|
41
41
|
allowedCaveats: [SnapCaveatType.SnapIds],
|
|
42
|
-
methodImplementation: getInvokeSnapImplementation(
|
|
42
|
+
methodImplementation: getInvokeSnapImplementation({
|
|
43
|
+
messenger,
|
|
44
|
+
}),
|
|
43
45
|
validator: ({ caveats }) => {
|
|
44
46
|
if (caveats?.length !== 1 || caveats[0].type !== SnapCaveatType.SnapIds) {
|
|
45
47
|
throw rpcErrors.invalidParams({
|
|
@@ -52,9 +54,6 @@ const specificationBuilder = ({ methodHooks }) => {
|
|
|
52
54
|
},
|
|
53
55
|
};
|
|
54
56
|
};
|
|
55
|
-
const methodHooks = {
|
|
56
|
-
handleSnapRpcRequest: true,
|
|
57
|
-
};
|
|
58
57
|
/**
|
|
59
58
|
* Calls the specified JSON-RPC API method of the specified Snap. The Snap
|
|
60
59
|
* must be installed and the dapp must have permission to communicate with the
|
|
@@ -80,22 +79,22 @@ const methodHooks = {
|
|
|
80
79
|
export const invokeSnapBuilder = Object.freeze({
|
|
81
80
|
targetName: WALLET_SNAP_PERMISSION_KEY,
|
|
82
81
|
specificationBuilder,
|
|
83
|
-
|
|
82
|
+
actionNames: ['SnapController:handleRequest'],
|
|
84
83
|
});
|
|
85
84
|
/**
|
|
86
85
|
* Builds the method implementation for `wallet_snap_*`.
|
|
87
86
|
*
|
|
88
|
-
* @param
|
|
89
|
-
* @param
|
|
90
|
-
* @returns The method implementation which returns the result of `
|
|
87
|
+
* @param options - The options.
|
|
88
|
+
* @param options.messenger - The messenger.
|
|
89
|
+
* @returns The method implementation which returns the result of `SnapController:handleRequest`.
|
|
91
90
|
* @throws If the params are invalid.
|
|
92
91
|
*/
|
|
93
|
-
export function getInvokeSnapImplementation({
|
|
92
|
+
export function getInvokeSnapImplementation({ messenger, }) {
|
|
94
93
|
return async function invokeSnap(options) {
|
|
95
94
|
const { params = {}, context } = options;
|
|
96
95
|
const { snapId, request } = params;
|
|
97
96
|
const { origin } = context;
|
|
98
|
-
return (await
|
|
97
|
+
return (await messenger.call('SnapController:handleRequest', {
|
|
99
98
|
snapId,
|
|
100
99
|
origin,
|
|
101
100
|
request,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invokeSnap.mjs","sourceRoot":"","sources":["../../src/restricted/invokeSnap.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"invokeSnap.mjs","sourceRoot":"","sources":["../../src/restricted/invokeSnap.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,wCAAwC;AACjE,OAAO,EAAE,SAAS,EAAE,6BAA6B;AAOjD,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,8BAA8B;AAKpE,MAAM,CAAC,MAAM,0BAA0B,GAAG,aAAa,CAAC;AAsCxD;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAGX,KAAK,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE;IACtD,MAAM,KAAK,GAAG,WAAW,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;SAC3E,KAA2B,CAAC;IAE/B,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CACnC,kCAAkC,EAClC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAC5B,CAAC;IAEF,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAC5C,CAAC,aAAa,EAAE,IAAI,EAAE,EAAE;QACtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,aAAa,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,aAAa,CAAC;IACvB,CAAC,EACD,EAAE,CACH,CAAC;IAEF,OAAO,SAAS,CAAC,IAAI,CACnB,6BAA6B,EAC7B,WAAW,CAAC,QAAQ,CAAC,MAAM,EAC3B,YAAY,CACb,CAAC;AACJ,CAAC,CAAC;AACF;;;;;;;;;;;GAWG;AACH,MAAM,oBAAoB,GAItB,CAAC,EAAE,SAAS,EAAyC,EAAE,EAAE;IAC3D,OAAO;QACL,cAAc,EAAE,cAAc,CAAC,gBAAgB;QAC/C,UAAU,EAAE,0BAA0B;QACtC,cAAc,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC;QACxC,oBAAoB,EAAE,2BAA2B,CAAC;YAChD,SAAS;SACV,CAAC;QACF,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;YACzB,IAAI,OAAO,EAAE,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,cAAc,CAAC,OAAO,EAAE,CAAC;gBACxE,MAAM,SAAS,CAAC,aAAa,CAAC;oBAC5B,OAAO,EAAE,sBAAsB,cAAc,CAAC,OAAO,WAAW;iBACjE,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,UAAU,EAAE;YACV,WAAW,EAAE,iBAAiB;SAC/B;KACF,CAAC;AACJ,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7C,UAAU,EAAE,0BAA0B;IACtC,oBAAoB;IACpB,WAAW,EAAE,CAAC,8BAA8B,CAAC;CACrC,CAAC,CAAC;AAEZ;;;;;;;GAOG;AACH,MAAM,UAAU,2BAA2B,CAAC,EAC1C,SAAS,GAC6B;IACtC,OAAO,KAAK,UAAU,UAAU,CAC9B,OAAkD;QAElD,MAAM,EAAE,MAAM,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAEzC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,MAA0B,CAAC;QAEvD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;QAE3B,OAAO,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,8BAA8B,EAAE;YAC3D,MAAM;YACN,MAAM;YACN,OAAO;YACP,OAAO,EAAE,WAAW,CAAC,YAAY;SAClC,CAAC,CAAS,CAAC;IACd,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { Messenger } from '@metamask/messenger';\nimport type {\n PermissionSpecificationBuilder,\n RestrictedMethodOptions,\n ValidPermissionSpecification,\n PermissionValidatorConstraint,\n PermissionSideEffect,\n} from '@metamask/permission-controller';\nimport { PermissionType } from '@metamask/permission-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type {\n InvokeSnapParams,\n InvokeSnapResult,\n RequestSnapsParams,\n RequestSnapsResult,\n} from '@metamask/snaps-sdk';\nimport { HandlerType, SnapCaveatType } from '@metamask/snaps-utils';\nimport type { Json, NonEmptyArray } from '@metamask/utils';\n\nimport type { SnapControllerHandleRequestAction } from '../types';\n\nexport const WALLET_SNAP_PERMISSION_KEY = 'wallet_snap';\n\n// Redeclare installSnaps action type to avoid circular dependencies\nexport type SnapControllerInstallSnapsAction = {\n type: `SnapController:installSnaps`;\n handler: (\n origin: string,\n requestedSnaps: RequestSnapsParams,\n ) => Promise<RequestSnapsResult>;\n};\n\nexport type SnapControllerGetPermittedSnapsAction = {\n type: `SnapController:getPermittedSnaps`;\n handler: (origin: string) => RequestSnapsResult;\n};\n\ntype AllowedActions =\n | SnapControllerInstallSnapsAction\n | SnapControllerGetPermittedSnapsAction;\n\nexport type InvokeSnapMessengerActions = SnapControllerHandleRequestAction;\n\ntype InvokeSnapSpecificationBuilderOptions = {\n allowedCaveats?: Readonly<NonEmptyArray<string>> | null;\n messenger: Messenger<string, InvokeSnapMessengerActions>;\n};\n\ntype InvokeSnapSpecification = ValidPermissionSpecification<{\n permissionType: PermissionType.RestrictedMethod;\n targetName: typeof WALLET_SNAP_PERMISSION_KEY;\n methodImplementation: ReturnType<typeof getInvokeSnapImplementation>;\n allowedCaveats: Readonly<NonEmptyArray<string>> | null;\n validator: PermissionValidatorConstraint;\n sideEffect: {\n onPermitted: PermissionSideEffect<AllowedActions, never>['onPermitted'];\n };\n}>;\n\n/**\n * The side-effect method to handle the snap install.\n *\n * @param params - The side-effect params.\n * @param params.requestData - The request data associated to the requested permission.\n * @param params.messenger - The messenger to call an action.\n * @returns The result of the Snap installation.\n */\nexport const handleSnapInstall: PermissionSideEffect<\n AllowedActions,\n never\n>['onPermitted'] = async ({ requestData, messenger }) => {\n const snaps = requestData.permissions[WALLET_SNAP_PERMISSION_KEY].caveats?.[0]\n .value as RequestSnapsParams;\n\n const permittedSnaps = messenger.call(\n `SnapController:getPermittedSnaps`,\n requestData.metadata.origin,\n );\n\n const dedupedSnaps = Object.keys(snaps).reduce<RequestSnapsParams>(\n (filteredSnaps, snap) => {\n if (!permittedSnaps[snap]) {\n filteredSnaps[snap] = snaps[snap];\n }\n return filteredSnaps;\n },\n {},\n );\n\n return messenger.call(\n `SnapController:installSnaps`,\n requestData.metadata.origin,\n dedupedSnaps,\n );\n};\n/**\n * The specification builder for the `wallet_snap_*` permission.\n *\n * `wallet_snap_*` attempts to invoke an RPC method of the specified Snap.\n *\n * Requesting its corresponding permission will attempt to connect to the Snap,\n * and install it if it's not available yet.\n *\n * @param options - The specification builder options.\n * @param options.messenger - The messenger.\n * @returns The specification for the `wallet_snap_*` permission.\n */\nconst specificationBuilder: PermissionSpecificationBuilder<\n PermissionType.RestrictedMethod,\n InvokeSnapSpecificationBuilderOptions,\n InvokeSnapSpecification\n> = ({ messenger }: InvokeSnapSpecificationBuilderOptions) => {\n return {\n permissionType: PermissionType.RestrictedMethod,\n targetName: WALLET_SNAP_PERMISSION_KEY,\n allowedCaveats: [SnapCaveatType.SnapIds],\n methodImplementation: getInvokeSnapImplementation({\n messenger,\n }),\n validator: ({ caveats }) => {\n if (caveats?.length !== 1 || caveats[0].type !== SnapCaveatType.SnapIds) {\n throw rpcErrors.invalidParams({\n message: `Expected a single \"${SnapCaveatType.SnapIds}\" caveat.`,\n });\n }\n },\n sideEffect: {\n onPermitted: handleSnapInstall,\n },\n };\n};\n\n/**\n * Calls the specified JSON-RPC API method of the specified Snap. The Snap\n * must be installed and the dapp must have permission to communicate with the\n * Snap, or the request is rejected. The dapp can install the Snap and request\n * permission to communicate with it using\n * [`wallet_requestSnaps`](http://docs.metamask.io/snaps/reference/snaps-api/wallet_requestsnaps).\n *\n * @example\n * ```ts\n * const result = await ethereum.request({\n * method: 'wallet_snap',\n * params: {\n * snapId: 'npm:my-snap',\n * request: {\n * method: 'hello',\n * params: { name: 'world' },\n * },\n * },\n * });\n * console.log(result); // \"Hello, world!\"\n * ```\n */\nexport const invokeSnapBuilder = Object.freeze({\n targetName: WALLET_SNAP_PERMISSION_KEY,\n specificationBuilder,\n actionNames: ['SnapController:handleRequest'],\n} as const);\n\n/**\n * Builds the method implementation for `wallet_snap_*`.\n *\n * @param options - The options.\n * @param options.messenger - The messenger.\n * @returns The method implementation which returns the result of `SnapController:handleRequest`.\n * @throws If the params are invalid.\n */\nexport function getInvokeSnapImplementation({\n messenger,\n}: InvokeSnapSpecificationBuilderOptions) {\n return async function invokeSnap(\n options: RestrictedMethodOptions<InvokeSnapParams>,\n ): Promise<InvokeSnapResult> {\n const { params = {}, context } = options;\n\n const { snapId, request } = params as InvokeSnapParams;\n\n const { origin } = context;\n\n return (await messenger.call('SnapController:handleRequest', {\n snapId,\n origin,\n request,\n handler: HandlerType.OnRpcRequest,\n })) as Json;\n };\n}\n"]}
|
|
@@ -17,25 +17,25 @@ const methodName = 'snap_manageState';
|
|
|
17
17
|
*
|
|
18
18
|
* @param options - The specification builder options.
|
|
19
19
|
* @param options.allowedCaveats - The optional allowed caveats for the permission.
|
|
20
|
+
* @param options.messenger - The messenger.
|
|
20
21
|
* @param options.methodHooks - The RPC method hooks needed by the method implementation.
|
|
21
22
|
* @returns The specification for the `snap_manageState` permission.
|
|
22
23
|
*/
|
|
23
|
-
const specificationBuilder = ({ allowedCaveats = null, methodHooks, }) => {
|
|
24
|
+
const specificationBuilder = ({ allowedCaveats = null, methodHooks, messenger, }) => {
|
|
24
25
|
return {
|
|
25
26
|
permissionType: permission_controller_1.PermissionType.RestrictedMethod,
|
|
26
27
|
targetName: methodName,
|
|
27
28
|
allowedCaveats,
|
|
28
|
-
methodImplementation: getManageStateImplementation(
|
|
29
|
+
methodImplementation: getManageStateImplementation({
|
|
30
|
+
methodHooks,
|
|
31
|
+
messenger,
|
|
32
|
+
}),
|
|
29
33
|
subjectTypes: [permission_controller_1.SubjectType.Snap],
|
|
30
34
|
};
|
|
31
35
|
};
|
|
32
36
|
exports.specificationBuilder = specificationBuilder;
|
|
33
37
|
const methodHooks = {
|
|
34
38
|
getUnlockPromise: true,
|
|
35
|
-
clearSnapState: true,
|
|
36
|
-
getSnapState: true,
|
|
37
|
-
updateSnapState: true,
|
|
38
|
-
getSnap: true,
|
|
39
39
|
};
|
|
40
40
|
/**
|
|
41
41
|
* Allow the Snap to persist up to 64 MB of data to disk and retrieve it at
|
|
@@ -83,6 +83,12 @@ exports.manageStateBuilder = Object.freeze({
|
|
|
83
83
|
targetName: methodName,
|
|
84
84
|
specificationBuilder: exports.specificationBuilder,
|
|
85
85
|
methodHooks,
|
|
86
|
+
actionNames: [
|
|
87
|
+
'SnapController:clearSnapState',
|
|
88
|
+
'SnapController:getSnap',
|
|
89
|
+
'SnapController:getSnapState',
|
|
90
|
+
'SnapController:updateSnapState',
|
|
91
|
+
],
|
|
86
92
|
});
|
|
87
93
|
exports.STORAGE_SIZE_LIMIT = 64000000; // In bytes (64 MB)
|
|
88
94
|
/**
|
|
@@ -113,26 +119,21 @@ exports.getEncryptionEntropy = getEncryptionEntropy;
|
|
|
113
119
|
/**
|
|
114
120
|
* Builds the method implementation for `snap_manageState`.
|
|
115
121
|
*
|
|
116
|
-
* @param
|
|
117
|
-
* @param
|
|
118
|
-
*
|
|
119
|
-
* @param
|
|
120
|
-
* state for a snap.
|
|
121
|
-
* @param hooks.updateSnapState - A function that updates the state stored for a
|
|
122
|
-
* snap.
|
|
123
|
-
* @param hooks.getUnlockPromise - A function that resolves once the MetaMask
|
|
122
|
+
* @param options - The options.
|
|
123
|
+
* @param options.messenger - The messenger.
|
|
124
|
+
* @param options.methodHooks - The RPC method hooks.
|
|
125
|
+
* @param options.methodHooks.getUnlockPromise - A function that resolves once the MetaMask
|
|
124
126
|
* extension is unlocked and prompts the user to unlock their MetaMask if it is
|
|
125
127
|
* locked.
|
|
126
|
-
* @param hooks.getSnap - The hook function to get Snap metadata.
|
|
127
128
|
* @returns The method implementation which either returns `null` for a
|
|
128
129
|
* successful state update/deletion or returns the decrypted state.
|
|
129
130
|
* @throws If the params are invalid.
|
|
130
131
|
*/
|
|
131
|
-
function getManageStateImplementation({
|
|
132
|
+
function getManageStateImplementation({ methodHooks: { getUnlockPromise }, messenger, }) {
|
|
132
133
|
return async function manageState(options) {
|
|
133
134
|
const { params = {}, method, context: { origin }, } = options;
|
|
134
135
|
const validatedParams = getValidatedParams(params, method);
|
|
135
|
-
const snap = getSnap
|
|
136
|
+
const snap = messenger.call('SnapController:getSnap', origin);
|
|
136
137
|
if (!snap?.preinstalled &&
|
|
137
138
|
validatedParams.operation === snaps_sdk_1.ManageStateOperation.UpdateState) {
|
|
138
139
|
const size = (0, snaps_utils_1.getJsonSizeUnsafe)(validatedParams.newState, true);
|
|
@@ -152,13 +153,13 @@ function getManageStateImplementation({ getUnlockPromise, clearSnapState, getSna
|
|
|
152
153
|
}
|
|
153
154
|
switch (validatedParams.operation) {
|
|
154
155
|
case snaps_sdk_1.ManageStateOperation.ClearState:
|
|
155
|
-
clearSnapState
|
|
156
|
+
messenger.call('SnapController:clearSnapState', origin, shouldEncrypt);
|
|
156
157
|
return null;
|
|
157
158
|
case snaps_sdk_1.ManageStateOperation.GetState: {
|
|
158
|
-
return await getSnapState
|
|
159
|
+
return await messenger.call('SnapController:getSnapState', origin, shouldEncrypt);
|
|
159
160
|
}
|
|
160
161
|
case snaps_sdk_1.ManageStateOperation.UpdateState: {
|
|
161
|
-
await updateSnapState
|
|
162
|
+
await messenger.call('SnapController:updateSnapState', origin, validatedParams.newState, shouldEncrypt);
|
|
162
163
|
return null;
|
|
163
164
|
}
|
|
164
165
|
/* istanbul ignore next */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manageState.cjs","sourceRoot":"","sources":["../../src/restricted/manageState.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CryptographicFunctions } from '@metamask/key-tree';\nimport type {\n PermissionSpecificationBuilder,\n RestrictedMethodOptions,\n ValidPermissionSpecification,\n} from '@metamask/permission-controller';\nimport { PermissionType, SubjectType } from '@metamask/permission-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { ManageStateParams, ManageStateResult } from '@metamask/snaps-sdk';\nimport { ManageStateOperation } from '@metamask/snaps-sdk';\nimport type { Snap } from '@metamask/snaps-utils';\nimport {\n getJsonSizeUnsafe,\n STATE_ENCRYPTION_MAGIC_VALUE,\n} from '@metamask/snaps-utils';\nimport type { Json, NonEmptyArray } from '@metamask/utils';\nimport { isObject, isValidJson } from '@metamask/utils';\n\nimport type { MethodHooksObject } from '../utils';\nimport { deriveEntropyFromSeed } from '../utils';\n\n// The salt used for SIP-6-based entropy derivation.\nexport const STATE_ENCRYPTION_SALT = 'snap_manageState encryption';\n\nconst methodName = 'snap_manageState';\n\nexport type ManageStateMethodHooks = {\n /**\n * Waits for the extension to be unlocked.\n *\n * @returns A promise that resolves once the extension is unlocked.\n */\n getUnlockPromise: (shouldShowUnlockRequest: boolean) => Promise<void>;\n\n /**\n * A function that clears the state of the requesting Snap.\n */\n clearSnapState: (snapId: string, encrypted: boolean) => void;\n\n /**\n * A function that gets the encrypted state of the requesting Snap.\n *\n * @returns The current state of the Snap.\n */\n getSnapState: (\n snapId: string,\n encrypted: boolean,\n ) => Promise<Record<string, Json>>;\n\n /**\n * A function that updates the state of the requesting Snap.\n *\n * @param newState - The new state of the Snap.\n */\n updateSnapState: (\n snapId: string,\n newState: Record<string, Json>,\n encrypted: boolean,\n ) => Promise<void>;\n\n /**\n * Get Snap metadata.\n *\n * @param snapId - The ID of a Snap.\n */\n getSnap: (snapId: string) => Snap | undefined;\n};\n\ntype ManageStateSpecificationBuilderOptions = {\n allowedCaveats?: Readonly<NonEmptyArray<string>> | null;\n methodHooks: ManageStateMethodHooks;\n};\n\ntype ManageStateSpecification = ValidPermissionSpecification<{\n permissionType: PermissionType.RestrictedMethod;\n targetName: typeof methodName;\n methodImplementation: ReturnType<typeof getManageStateImplementation>;\n allowedCaveats: Readonly<NonEmptyArray<string>> | null;\n}>;\n\n/**\n * The specification builder for the `snap_manageState` permission.\n * `snap_manageState` lets the Snap store and manage some of its state on\n * your device.\n *\n * @param options - The specification builder options.\n * @param options.allowedCaveats - The optional allowed caveats for the permission.\n * @param options.methodHooks - The RPC method hooks needed by the method implementation.\n * @returns The specification for the `snap_manageState` permission.\n */\nexport const specificationBuilder: PermissionSpecificationBuilder<\n PermissionType.RestrictedMethod,\n ManageStateSpecificationBuilderOptions,\n ManageStateSpecification\n> = ({\n allowedCaveats = null,\n methodHooks,\n}: ManageStateSpecificationBuilderOptions) => {\n return {\n permissionType: PermissionType.RestrictedMethod,\n targetName: methodName,\n allowedCaveats,\n methodImplementation: getManageStateImplementation(methodHooks),\n subjectTypes: [SubjectType.Snap],\n };\n};\n\nconst methodHooks: MethodHooksObject<ManageStateMethodHooks> = {\n getUnlockPromise: true,\n clearSnapState: true,\n getSnapState: true,\n updateSnapState: true,\n getSnap: true,\n};\n\n/**\n * Allow the Snap to persist up to 64 MB of data to disk and retrieve it at\n * will. By default, the data is automatically encrypted using a Snap-specific\n * key and automatically decrypted when retrieved. You can set `encrypted` to\n * `false` to use unencrypted storage (available when the client is locked).\n *\n * @example\n * ```json name=\"Manifest\"\n * {\n * \"initialPermissions\": {\n * \"snap_manageState\": {}\n * }\n * }\n * ```\n * ```ts name=\"Usage\"\n * // Persist some data.\n * await snap.request({\n * method: 'snap_manageState',\n * params: {\n * operation: 'update',\n * newState: { hello: 'world' },\n * },\n * })\n *\n * // At a later time, get the stored data.\n * const persistedData = await snap.request({\n * method: 'snap_manageState',\n * params: { operation: 'get' },\n * })\n *\n * console.log(persistedData)\n * // { hello: 'world' }\n *\n * // If there's no need to store data anymore, clear it out.\n * await snap.request({\n * method: 'snap_manageState',\n * params: {\n * operation: 'clear',\n * },\n * })\n * ```\n */\nexport const manageStateBuilder = Object.freeze({\n targetName: methodName,\n specificationBuilder,\n methodHooks,\n} as const);\n\nexport const STORAGE_SIZE_LIMIT = 64_000_000; // In bytes (64 MB)\n\ntype GetEncryptionKeyArgs = {\n snapId: string;\n seed: Uint8Array;\n cryptographicFunctions?: CryptographicFunctions | undefined;\n};\n\n/**\n * Get a deterministic encryption key to use for encrypting and decrypting the\n * state.\n *\n * This key should only be used for state encryption using `snap_manageState`.\n * To get other encryption keys, a different salt can be used.\n *\n * @param args - The encryption key args.\n * @param args.snapId - The ID of the snap to get the encryption key for.\n * @param args.seed - The mnemonic seed to derive the encryption key\n * from.\n * @param args.cryptographicFunctions - The cryptographic functions to use for\n * the client.\n * @returns The state encryption key.\n */\nexport async function getEncryptionEntropy({\n seed,\n snapId,\n cryptographicFunctions,\n}: GetEncryptionKeyArgs) {\n return await deriveEntropyFromSeed({\n seed,\n input: snapId,\n salt: STATE_ENCRYPTION_SALT,\n magic: STATE_ENCRYPTION_MAGIC_VALUE,\n cryptographicFunctions,\n });\n}\n\n/**\n * Builds the method implementation for `snap_manageState`.\n *\n * @param hooks - The RPC method hooks.\n * @param hooks.clearSnapState - A function that clears the state stored for a\n * snap.\n * @param hooks.getSnapState - A function that fetches the persisted decrypted\n * state for a snap.\n * @param hooks.updateSnapState - A function that updates the state stored for a\n * snap.\n * @param hooks.getUnlockPromise - A function that resolves once the MetaMask\n * extension is unlocked and prompts the user to unlock their MetaMask if it is\n * locked.\n * @param hooks.getSnap - The hook function to get Snap metadata.\n * @returns The method implementation which either returns `null` for a\n * successful state update/deletion or returns the decrypted state.\n * @throws If the params are invalid.\n */\nexport function getManageStateImplementation({\n getUnlockPromise,\n clearSnapState,\n getSnapState,\n updateSnapState,\n getSnap,\n}: ManageStateMethodHooks) {\n return async function manageState(\n options: RestrictedMethodOptions<ManageStateParams>,\n ): Promise<ManageStateResult> {\n const {\n params = {},\n method,\n context: { origin },\n } = options;\n const validatedParams = getValidatedParams(params, method);\n\n const snap = getSnap(origin);\n\n if (\n !snap?.preinstalled &&\n validatedParams.operation === ManageStateOperation.UpdateState\n ) {\n const size = getJsonSizeUnsafe(validatedParams.newState, true);\n\n if (size > STORAGE_SIZE_LIMIT) {\n throw rpcErrors.invalidParams({\n message: `Invalid ${method} \"newState\" parameter: The new state must not exceed ${\n STORAGE_SIZE_LIMIT / 1_000_000\n } MB in size.`,\n });\n }\n }\n\n // If the encrypted param is undefined or null we default to true.\n const shouldEncrypt = validatedParams.encrypted ?? true;\n\n // We only need to prompt the user when the mnemonic is needed\n // which it isn't for the clear operation or unencrypted storage.\n if (\n shouldEncrypt &&\n validatedParams.operation !== ManageStateOperation.ClearState\n ) {\n await getUnlockPromise(true);\n }\n\n switch (validatedParams.operation) {\n case ManageStateOperation.ClearState:\n clearSnapState(origin, shouldEncrypt);\n return null;\n\n case ManageStateOperation.GetState: {\n return await getSnapState(origin, shouldEncrypt);\n }\n\n case ManageStateOperation.UpdateState: {\n await updateSnapState(origin, validatedParams.newState, shouldEncrypt);\n return null;\n }\n\n /* istanbul ignore next */\n default:\n throw rpcErrors.invalidParams(\n `Invalid ${method} operation: \"${\n validatedParams.operation as string\n }\"`,\n );\n }\n };\n}\n\n/**\n * Validates the manageState method `params` and returns them cast to the correct\n * type. Throws if validation fails.\n *\n * @param params - The unvalidated params object from the method request.\n * @param method - RPC method name used for debugging errors.\n * @returns The validated method parameter object.\n */\nexport function getValidatedParams(\n params: unknown,\n method: string,\n): ManageStateParams {\n if (!isObject(params)) {\n throw rpcErrors.invalidParams({\n message: 'Expected params to be a single object.',\n });\n }\n\n const { operation, newState, encrypted } = params;\n\n if (\n !operation ||\n typeof operation !== 'string' ||\n !Object.values(ManageStateOperation).includes(\n operation as ManageStateOperation,\n )\n ) {\n throw rpcErrors.invalidParams({\n message: 'Must specify a valid manage state \"operation\".',\n });\n }\n\n if (encrypted !== undefined && typeof encrypted !== 'boolean') {\n throw rpcErrors.invalidParams({\n message: '\"encrypted\" parameter must be a boolean if specified.',\n });\n }\n\n if (operation === ManageStateOperation.UpdateState) {\n if (!isObject(newState)) {\n throw rpcErrors.invalidParams({\n message: `Invalid ${method} \"newState\" parameter: The new state must be a plain object.`,\n });\n }\n\n if (!isValidJson(newState)) {\n throw rpcErrors.invalidParams({\n message: `Invalid ${method} \"newState\" parameter: The new state must be JSON serializable.`,\n });\n }\n }\n\n return params as ManageStateParams;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"manageState.cjs","sourceRoot":"","sources":["../../src/restricted/manageState.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CryptographicFunctions } from '@metamask/key-tree';\nimport type { Messenger } from '@metamask/messenger';\nimport type {\n PermissionSpecificationBuilder,\n RestrictedMethodOptions,\n ValidPermissionSpecification,\n} from '@metamask/permission-controller';\nimport { PermissionType, SubjectType } from '@metamask/permission-controller';\nimport { rpcErrors } from '@metamask/rpc-errors';\nimport type { ManageStateParams, ManageStateResult } from '@metamask/snaps-sdk';\nimport { ManageStateOperation } from '@metamask/snaps-sdk';\nimport {\n getJsonSizeUnsafe,\n STATE_ENCRYPTION_MAGIC_VALUE,\n} from '@metamask/snaps-utils';\nimport type { NonEmptyArray } from '@metamask/utils';\nimport { isObject, isValidJson } from '@metamask/utils';\n\nimport type {\n SnapControllerClearSnapStateAction,\n SnapControllerGetSnapAction,\n SnapControllerGetSnapStateAction,\n SnapControllerUpdateSnapStateAction,\n} from '../types';\nimport type { MethodHooksObject } from '../utils';\nimport { deriveEntropyFromSeed } from '../utils';\n\n// The salt used for SIP-6-based entropy derivation.\nexport const STATE_ENCRYPTION_SALT = 'snap_manageState encryption';\n\nconst methodName = 'snap_manageState';\n\nexport type ManageStateMethodHooks = {\n /**\n * Waits for the extension to be unlocked.\n *\n * @returns A promise that resolves once the extension is unlocked.\n */\n getUnlockPromise: (shouldShowUnlockRequest: boolean) => Promise<void>;\n};\n\nexport type ManageStateMessengerActions =\n | SnapControllerClearSnapStateAction\n | SnapControllerGetSnapAction\n | SnapControllerGetSnapStateAction\n | SnapControllerUpdateSnapStateAction;\n\ntype ManageStateSpecificationBuilderOptions = {\n allowedCaveats?: Readonly<NonEmptyArray<string>> | null;\n methodHooks: ManageStateMethodHooks;\n messenger: Messenger<string, ManageStateMessengerActions>;\n};\n\ntype ManageStateSpecification = ValidPermissionSpecification<{\n permissionType: PermissionType.RestrictedMethod;\n targetName: typeof methodName;\n methodImplementation: ReturnType<typeof getManageStateImplementation>;\n allowedCaveats: Readonly<NonEmptyArray<string>> | null;\n}>;\n\n/**\n * The specification builder for the `snap_manageState` permission.\n * `snap_manageState` lets the Snap store and manage some of its state on\n * your device.\n *\n * @param options - The specification builder options.\n * @param options.allowedCaveats - The optional allowed caveats for the permission.\n * @param options.messenger - The messenger.\n * @param options.methodHooks - The RPC method hooks needed by the method implementation.\n * @returns The specification for the `snap_manageState` permission.\n */\nexport const specificationBuilder: PermissionSpecificationBuilder<\n PermissionType.RestrictedMethod,\n ManageStateSpecificationBuilderOptions,\n ManageStateSpecification\n> = ({\n allowedCaveats = null,\n methodHooks,\n messenger,\n}: ManageStateSpecificationBuilderOptions) => {\n return {\n permissionType: PermissionType.RestrictedMethod,\n targetName: methodName,\n allowedCaveats,\n methodImplementation: getManageStateImplementation({\n methodHooks,\n messenger,\n }),\n subjectTypes: [SubjectType.Snap],\n };\n};\n\nconst methodHooks: MethodHooksObject<ManageStateMethodHooks> = {\n getUnlockPromise: true,\n};\n\n/**\n * Allow the Snap to persist up to 64 MB of data to disk and retrieve it at\n * will. By default, the data is automatically encrypted using a Snap-specific\n * key and automatically decrypted when retrieved. You can set `encrypted` to\n * `false` to use unencrypted storage (available when the client is locked).\n *\n * @example\n * ```json name=\"Manifest\"\n * {\n * \"initialPermissions\": {\n * \"snap_manageState\": {}\n * }\n * }\n * ```\n * ```ts name=\"Usage\"\n * // Persist some data.\n * await snap.request({\n * method: 'snap_manageState',\n * params: {\n * operation: 'update',\n * newState: { hello: 'world' },\n * },\n * })\n *\n * // At a later time, get the stored data.\n * const persistedData = await snap.request({\n * method: 'snap_manageState',\n * params: { operation: 'get' },\n * })\n *\n * console.log(persistedData)\n * // { hello: 'world' }\n *\n * // If there's no need to store data anymore, clear it out.\n * await snap.request({\n * method: 'snap_manageState',\n * params: {\n * operation: 'clear',\n * },\n * })\n * ```\n */\nexport const manageStateBuilder = Object.freeze({\n targetName: methodName,\n specificationBuilder,\n methodHooks,\n actionNames: [\n 'SnapController:clearSnapState',\n 'SnapController:getSnap',\n 'SnapController:getSnapState',\n 'SnapController:updateSnapState',\n ],\n} as const);\n\nexport const STORAGE_SIZE_LIMIT = 64_000_000; // In bytes (64 MB)\n\ntype GetEncryptionKeyArgs = {\n snapId: string;\n seed: Uint8Array;\n cryptographicFunctions?: CryptographicFunctions | undefined;\n};\n\n/**\n * Get a deterministic encryption key to use for encrypting and decrypting the\n * state.\n *\n * This key should only be used for state encryption using `snap_manageState`.\n * To get other encryption keys, a different salt can be used.\n *\n * @param args - The encryption key args.\n * @param args.snapId - The ID of the snap to get the encryption key for.\n * @param args.seed - The mnemonic seed to derive the encryption key\n * from.\n * @param args.cryptographicFunctions - The cryptographic functions to use for\n * the client.\n * @returns The state encryption key.\n */\nexport async function getEncryptionEntropy({\n seed,\n snapId,\n cryptographicFunctions,\n}: GetEncryptionKeyArgs) {\n return await deriveEntropyFromSeed({\n seed,\n input: snapId,\n salt: STATE_ENCRYPTION_SALT,\n magic: STATE_ENCRYPTION_MAGIC_VALUE,\n cryptographicFunctions,\n });\n}\n\n/**\n * Builds the method implementation for `snap_manageState`.\n *\n * @param options - The options.\n * @param options.messenger - The messenger.\n * @param options.methodHooks - The RPC method hooks.\n * @param options.methodHooks.getUnlockPromise - A function that resolves once the MetaMask\n * extension is unlocked and prompts the user to unlock their MetaMask if it is\n * locked.\n * @returns The method implementation which either returns `null` for a\n * successful state update/deletion or returns the decrypted state.\n * @throws If the params are invalid.\n */\nexport function getManageStateImplementation({\n methodHooks: { getUnlockPromise },\n messenger,\n}: ManageStateSpecificationBuilderOptions) {\n return async function manageState(\n options: RestrictedMethodOptions<ManageStateParams>,\n ): Promise<ManageStateResult> {\n const {\n params = {},\n method,\n context: { origin },\n } = options;\n const validatedParams = getValidatedParams(params, method);\n\n const snap = messenger.call('SnapController:getSnap', origin);\n\n if (\n !snap?.preinstalled &&\n validatedParams.operation === ManageStateOperation.UpdateState\n ) {\n const size = getJsonSizeUnsafe(validatedParams.newState, true);\n\n if (size > STORAGE_SIZE_LIMIT) {\n throw rpcErrors.invalidParams({\n message: `Invalid ${method} \"newState\" parameter: The new state must not exceed ${\n STORAGE_SIZE_LIMIT / 1_000_000\n } MB in size.`,\n });\n }\n }\n\n // If the encrypted param is undefined or null we default to true.\n const shouldEncrypt = validatedParams.encrypted ?? true;\n\n // We only need to prompt the user when the mnemonic is needed\n // which it isn't for the clear operation or unencrypted storage.\n if (\n shouldEncrypt &&\n validatedParams.operation !== ManageStateOperation.ClearState\n ) {\n await getUnlockPromise(true);\n }\n\n switch (validatedParams.operation) {\n case ManageStateOperation.ClearState:\n messenger.call('SnapController:clearSnapState', origin, shouldEncrypt);\n return null;\n\n case ManageStateOperation.GetState: {\n return await messenger.call(\n 'SnapController:getSnapState',\n origin,\n shouldEncrypt,\n );\n }\n\n case ManageStateOperation.UpdateState: {\n await messenger.call(\n 'SnapController:updateSnapState',\n origin,\n validatedParams.newState,\n shouldEncrypt,\n );\n return null;\n }\n\n /* istanbul ignore next */\n default:\n throw rpcErrors.invalidParams(\n `Invalid ${method} operation: \"${\n validatedParams.operation as string\n }\"`,\n );\n }\n };\n}\n\n/**\n * Validates the manageState method `params` and returns them cast to the correct\n * type. Throws if validation fails.\n *\n * @param params - The unvalidated params object from the method request.\n * @param method - RPC method name used for debugging errors.\n * @returns The validated method parameter object.\n */\nexport function getValidatedParams(\n params: unknown,\n method: string,\n): ManageStateParams {\n if (!isObject(params)) {\n throw rpcErrors.invalidParams({\n message: 'Expected params to be a single object.',\n });\n }\n\n const { operation, newState, encrypted } = params;\n\n if (\n !operation ||\n typeof operation !== 'string' ||\n !Object.values(ManageStateOperation).includes(\n operation as ManageStateOperation,\n )\n ) {\n throw rpcErrors.invalidParams({\n message: 'Must specify a valid manage state \"operation\".',\n });\n }\n\n if (encrypted !== undefined && typeof encrypted !== 'boolean') {\n throw rpcErrors.invalidParams({\n message: '\"encrypted\" parameter must be a boolean if specified.',\n });\n }\n\n if (operation === ManageStateOperation.UpdateState) {\n if (!isObject(newState)) {\n throw rpcErrors.invalidParams({\n message: `Invalid ${method} \"newState\" parameter: The new state must be a plain object.`,\n });\n }\n\n if (!isValidJson(newState)) {\n throw rpcErrors.invalidParams({\n message: `Invalid ${method} \"newState\" parameter: The new state must be JSON serializable.`,\n });\n }\n }\n\n return params as ManageStateParams;\n}\n"]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { CryptographicFunctions } from "@metamask/key-tree";
|
|
2
|
+
import type { Messenger } from "@metamask/messenger";
|
|
2
3
|
import type { PermissionSpecificationBuilder, RestrictedMethodOptions, ValidPermissionSpecification } from "@metamask/permission-controller";
|
|
3
4
|
import { PermissionType } from "@metamask/permission-controller";
|
|
4
5
|
import type { ManageStateParams, ManageStateResult } from "@metamask/snaps-sdk";
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
6
|
+
import type { NonEmptyArray } from "@metamask/utils";
|
|
7
|
+
import type { SnapControllerClearSnapStateAction, SnapControllerGetSnapAction, SnapControllerGetSnapStateAction, SnapControllerUpdateSnapStateAction } from "../types.cjs";
|
|
7
8
|
import type { MethodHooksObject } from "../utils.cjs";
|
|
8
9
|
export declare const STATE_ENCRYPTION_SALT = "snap_manageState encryption";
|
|
9
10
|
declare const methodName = "snap_manageState";
|
|
@@ -14,32 +15,12 @@ export type ManageStateMethodHooks = {
|
|
|
14
15
|
* @returns A promise that resolves once the extension is unlocked.
|
|
15
16
|
*/
|
|
16
17
|
getUnlockPromise: (shouldShowUnlockRequest: boolean) => Promise<void>;
|
|
17
|
-
/**
|
|
18
|
-
* A function that clears the state of the requesting Snap.
|
|
19
|
-
*/
|
|
20
|
-
clearSnapState: (snapId: string, encrypted: boolean) => void;
|
|
21
|
-
/**
|
|
22
|
-
* A function that gets the encrypted state of the requesting Snap.
|
|
23
|
-
*
|
|
24
|
-
* @returns The current state of the Snap.
|
|
25
|
-
*/
|
|
26
|
-
getSnapState: (snapId: string, encrypted: boolean) => Promise<Record<string, Json>>;
|
|
27
|
-
/**
|
|
28
|
-
* A function that updates the state of the requesting Snap.
|
|
29
|
-
*
|
|
30
|
-
* @param newState - The new state of the Snap.
|
|
31
|
-
*/
|
|
32
|
-
updateSnapState: (snapId: string, newState: Record<string, Json>, encrypted: boolean) => Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
* Get Snap metadata.
|
|
35
|
-
*
|
|
36
|
-
* @param snapId - The ID of a Snap.
|
|
37
|
-
*/
|
|
38
|
-
getSnap: (snapId: string) => Snap | undefined;
|
|
39
18
|
};
|
|
19
|
+
export type ManageStateMessengerActions = SnapControllerClearSnapStateAction | SnapControllerGetSnapAction | SnapControllerGetSnapStateAction | SnapControllerUpdateSnapStateAction;
|
|
40
20
|
type ManageStateSpecificationBuilderOptions = {
|
|
41
21
|
allowedCaveats?: Readonly<NonEmptyArray<string>> | null;
|
|
42
22
|
methodHooks: ManageStateMethodHooks;
|
|
23
|
+
messenger: Messenger<string, ManageStateMessengerActions>;
|
|
43
24
|
};
|
|
44
25
|
type ManageStateSpecification = ValidPermissionSpecification<{
|
|
45
26
|
permissionType: PermissionType.RestrictedMethod;
|
|
@@ -54,6 +35,7 @@ type ManageStateSpecification = ValidPermissionSpecification<{
|
|
|
54
35
|
*
|
|
55
36
|
* @param options - The specification builder options.
|
|
56
37
|
* @param options.allowedCaveats - The optional allowed caveats for the permission.
|
|
38
|
+
* @param options.messenger - The messenger.
|
|
57
39
|
* @param options.methodHooks - The RPC method hooks needed by the method implementation.
|
|
58
40
|
* @returns The specification for the `snap_manageState` permission.
|
|
59
41
|
*/
|
|
@@ -109,6 +91,7 @@ export declare const manageStateBuilder: Readonly<{
|
|
|
109
91
|
allowedCaveats: Readonly<NonEmptyArray<string>> | null;
|
|
110
92
|
}>;
|
|
111
93
|
readonly methodHooks: MethodHooksObject<ManageStateMethodHooks>;
|
|
94
|
+
readonly actionNames: readonly ["SnapController:clearSnapState", "SnapController:getSnap", "SnapController:getSnapState", "SnapController:updateSnapState"];
|
|
112
95
|
}>;
|
|
113
96
|
export declare const STORAGE_SIZE_LIMIT = 64000000;
|
|
114
97
|
type GetEncryptionKeyArgs = {
|
|
@@ -135,22 +118,17 @@ export declare function getEncryptionEntropy({ seed, snapId, cryptographicFuncti
|
|
|
135
118
|
/**
|
|
136
119
|
* Builds the method implementation for `snap_manageState`.
|
|
137
120
|
*
|
|
138
|
-
* @param
|
|
139
|
-
* @param
|
|
140
|
-
*
|
|
141
|
-
* @param
|
|
142
|
-
* state for a snap.
|
|
143
|
-
* @param hooks.updateSnapState - A function that updates the state stored for a
|
|
144
|
-
* snap.
|
|
145
|
-
* @param hooks.getUnlockPromise - A function that resolves once the MetaMask
|
|
121
|
+
* @param options - The options.
|
|
122
|
+
* @param options.messenger - The messenger.
|
|
123
|
+
* @param options.methodHooks - The RPC method hooks.
|
|
124
|
+
* @param options.methodHooks.getUnlockPromise - A function that resolves once the MetaMask
|
|
146
125
|
* extension is unlocked and prompts the user to unlock their MetaMask if it is
|
|
147
126
|
* locked.
|
|
148
|
-
* @param hooks.getSnap - The hook function to get Snap metadata.
|
|
149
127
|
* @returns The method implementation which either returns `null` for a
|
|
150
128
|
* successful state update/deletion or returns the decrypted state.
|
|
151
129
|
* @throws If the params are invalid.
|
|
152
130
|
*/
|
|
153
|
-
export declare function getManageStateImplementation({
|
|
131
|
+
export declare function getManageStateImplementation({ methodHooks: { getUnlockPromise }, messenger, }: ManageStateSpecificationBuilderOptions): (options: RestrictedMethodOptions<ManageStateParams>) => Promise<ManageStateResult>;
|
|
154
132
|
/**
|
|
155
133
|
* Validates the manageState method `params` and returns them cast to the correct
|
|
156
134
|
* type. Throws if validation fails.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manageState.d.cts","sourceRoot":"","sources":["../../src/restricted/manageState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,2BAA2B;AACjE,OAAO,KAAK,EACV,8BAA8B,EAC9B,uBAAuB,EACvB,4BAA4B,EAC7B,wCAAwC;AACzC,OAAO,EAAE,cAAc,EAAe,wCAAwC;AAE9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,4BAA4B;
|
|
1
|
+
{"version":3,"file":"manageState.d.cts","sourceRoot":"","sources":["../../src/restricted/manageState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,2BAA2B;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EACV,8BAA8B,EAC9B,uBAAuB,EACvB,4BAA4B,EAC7B,wCAAwC;AACzC,OAAO,EAAE,cAAc,EAAe,wCAAwC;AAE9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,4BAA4B;AAMhF,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAGrD,OAAO,KAAK,EACV,kCAAkC,EAClC,2BAA2B,EAC3B,gCAAgC,EAChC,mCAAmC,EACpC,qBAAiB;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAiB;AAIlD,eAAO,MAAM,qBAAqB,gCAAgC,CAAC;AAEnE,QAAA,MAAM,UAAU,qBAAqB,CAAC;AAEtC,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,uBAAuB,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE,CAAC;AAEF,MAAM,MAAM,2BAA2B,GACnC,kCAAkC,GAClC,2BAA2B,GAC3B,gCAAgC,GAChC,mCAAmC,CAAC;AAExC,KAAK,sCAAsC,GAAG;IAC5C,cAAc,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;IACxD,WAAW,EAAE,sBAAsB,CAAC;IACpC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;CAC3D,CAAC;AAEF,KAAK,wBAAwB,GAAG,4BAA4B,CAAC;IAC3D,cAAc,EAAE,cAAc,CAAC,gBAAgB,CAAC;IAChD,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,oBAAoB,EAAE,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC;IACtE,cAAc,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;CACxD,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,EAAE,8BAA8B,CAC/D,cAAc,CAAC,gBAAgB,EAC/B,sCAAsC,EACtC,wBAAwB,CAgBzB,CAAC;AAMF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,eAAO,MAAM,kBAAkB;;;wBApFb,eAAe,gBAAgB;oBACnC,iBAAiB;8BACP,WAAW,mCAAmC,CAAC;wBACrD,SAAS,cAAc,MAAM,CAAC,CAAC,GAAG,IAAI;;;;EA2F7C,CAAC;AAEZ,eAAO,MAAM,kBAAkB,WAAa,CAAC;AAE7C,KAAK,oBAAoB,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;IACjB,sBAAsB,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;CAC7D,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,oBAAoB,CAAC,EACzC,IAAI,EACJ,MAAM,EACN,sBAAsB,GACvB,EAAE,oBAAoB,0BAQtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAAC,EAC3C,WAAW,EAAE,EAAE,gBAAgB,EAAE,EACjC,SAAS,GACV,EAAE,sCAAsC,aAE5B,wBAAwB,iBAAiB,CAAC,KAClD,QAAQ,iBAAiB,CAAC,CAqE9B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GACb,iBAAiB,CA0CnB"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import type { CryptographicFunctions } from "@metamask/key-tree";
|
|
2
|
+
import type { Messenger } from "@metamask/messenger";
|
|
2
3
|
import type { PermissionSpecificationBuilder, RestrictedMethodOptions, ValidPermissionSpecification } from "@metamask/permission-controller";
|
|
3
4
|
import { PermissionType } from "@metamask/permission-controller";
|
|
4
5
|
import type { ManageStateParams, ManageStateResult } from "@metamask/snaps-sdk";
|
|
5
|
-
import type {
|
|
6
|
-
import type {
|
|
6
|
+
import type { NonEmptyArray } from "@metamask/utils";
|
|
7
|
+
import type { SnapControllerClearSnapStateAction, SnapControllerGetSnapAction, SnapControllerGetSnapStateAction, SnapControllerUpdateSnapStateAction } from "../types.mjs";
|
|
7
8
|
import type { MethodHooksObject } from "../utils.mjs";
|
|
8
9
|
export declare const STATE_ENCRYPTION_SALT = "snap_manageState encryption";
|
|
9
10
|
declare const methodName = "snap_manageState";
|
|
@@ -14,32 +15,12 @@ export type ManageStateMethodHooks = {
|
|
|
14
15
|
* @returns A promise that resolves once the extension is unlocked.
|
|
15
16
|
*/
|
|
16
17
|
getUnlockPromise: (shouldShowUnlockRequest: boolean) => Promise<void>;
|
|
17
|
-
/**
|
|
18
|
-
* A function that clears the state of the requesting Snap.
|
|
19
|
-
*/
|
|
20
|
-
clearSnapState: (snapId: string, encrypted: boolean) => void;
|
|
21
|
-
/**
|
|
22
|
-
* A function that gets the encrypted state of the requesting Snap.
|
|
23
|
-
*
|
|
24
|
-
* @returns The current state of the Snap.
|
|
25
|
-
*/
|
|
26
|
-
getSnapState: (snapId: string, encrypted: boolean) => Promise<Record<string, Json>>;
|
|
27
|
-
/**
|
|
28
|
-
* A function that updates the state of the requesting Snap.
|
|
29
|
-
*
|
|
30
|
-
* @param newState - The new state of the Snap.
|
|
31
|
-
*/
|
|
32
|
-
updateSnapState: (snapId: string, newState: Record<string, Json>, encrypted: boolean) => Promise<void>;
|
|
33
|
-
/**
|
|
34
|
-
* Get Snap metadata.
|
|
35
|
-
*
|
|
36
|
-
* @param snapId - The ID of a Snap.
|
|
37
|
-
*/
|
|
38
|
-
getSnap: (snapId: string) => Snap | undefined;
|
|
39
18
|
};
|
|
19
|
+
export type ManageStateMessengerActions = SnapControllerClearSnapStateAction | SnapControllerGetSnapAction | SnapControllerGetSnapStateAction | SnapControllerUpdateSnapStateAction;
|
|
40
20
|
type ManageStateSpecificationBuilderOptions = {
|
|
41
21
|
allowedCaveats?: Readonly<NonEmptyArray<string>> | null;
|
|
42
22
|
methodHooks: ManageStateMethodHooks;
|
|
23
|
+
messenger: Messenger<string, ManageStateMessengerActions>;
|
|
43
24
|
};
|
|
44
25
|
type ManageStateSpecification = ValidPermissionSpecification<{
|
|
45
26
|
permissionType: PermissionType.RestrictedMethod;
|
|
@@ -54,6 +35,7 @@ type ManageStateSpecification = ValidPermissionSpecification<{
|
|
|
54
35
|
*
|
|
55
36
|
* @param options - The specification builder options.
|
|
56
37
|
* @param options.allowedCaveats - The optional allowed caveats for the permission.
|
|
38
|
+
* @param options.messenger - The messenger.
|
|
57
39
|
* @param options.methodHooks - The RPC method hooks needed by the method implementation.
|
|
58
40
|
* @returns The specification for the `snap_manageState` permission.
|
|
59
41
|
*/
|
|
@@ -109,6 +91,7 @@ export declare const manageStateBuilder: Readonly<{
|
|
|
109
91
|
allowedCaveats: Readonly<NonEmptyArray<string>> | null;
|
|
110
92
|
}>;
|
|
111
93
|
readonly methodHooks: MethodHooksObject<ManageStateMethodHooks>;
|
|
94
|
+
readonly actionNames: readonly ["SnapController:clearSnapState", "SnapController:getSnap", "SnapController:getSnapState", "SnapController:updateSnapState"];
|
|
112
95
|
}>;
|
|
113
96
|
export declare const STORAGE_SIZE_LIMIT = 64000000;
|
|
114
97
|
type GetEncryptionKeyArgs = {
|
|
@@ -135,22 +118,17 @@ export declare function getEncryptionEntropy({ seed, snapId, cryptographicFuncti
|
|
|
135
118
|
/**
|
|
136
119
|
* Builds the method implementation for `snap_manageState`.
|
|
137
120
|
*
|
|
138
|
-
* @param
|
|
139
|
-
* @param
|
|
140
|
-
*
|
|
141
|
-
* @param
|
|
142
|
-
* state for a snap.
|
|
143
|
-
* @param hooks.updateSnapState - A function that updates the state stored for a
|
|
144
|
-
* snap.
|
|
145
|
-
* @param hooks.getUnlockPromise - A function that resolves once the MetaMask
|
|
121
|
+
* @param options - The options.
|
|
122
|
+
* @param options.messenger - The messenger.
|
|
123
|
+
* @param options.methodHooks - The RPC method hooks.
|
|
124
|
+
* @param options.methodHooks.getUnlockPromise - A function that resolves once the MetaMask
|
|
146
125
|
* extension is unlocked and prompts the user to unlock their MetaMask if it is
|
|
147
126
|
* locked.
|
|
148
|
-
* @param hooks.getSnap - The hook function to get Snap metadata.
|
|
149
127
|
* @returns The method implementation which either returns `null` for a
|
|
150
128
|
* successful state update/deletion or returns the decrypted state.
|
|
151
129
|
* @throws If the params are invalid.
|
|
152
130
|
*/
|
|
153
|
-
export declare function getManageStateImplementation({
|
|
131
|
+
export declare function getManageStateImplementation({ methodHooks: { getUnlockPromise }, messenger, }: ManageStateSpecificationBuilderOptions): (options: RestrictedMethodOptions<ManageStateParams>) => Promise<ManageStateResult>;
|
|
154
132
|
/**
|
|
155
133
|
* Validates the manageState method `params` and returns them cast to the correct
|
|
156
134
|
* type. Throws if validation fails.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manageState.d.mts","sourceRoot":"","sources":["../../src/restricted/manageState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,2BAA2B;AACjE,OAAO,KAAK,EACV,8BAA8B,EAC9B,uBAAuB,EACvB,4BAA4B,EAC7B,wCAAwC;AACzC,OAAO,EAAE,cAAc,EAAe,wCAAwC;AAE9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,4BAA4B;
|
|
1
|
+
{"version":3,"file":"manageState.d.mts","sourceRoot":"","sources":["../../src/restricted/manageState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,2BAA2B;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,4BAA4B;AACrD,OAAO,KAAK,EACV,8BAA8B,EAC9B,uBAAuB,EACvB,4BAA4B,EAC7B,wCAAwC;AACzC,OAAO,EAAE,cAAc,EAAe,wCAAwC;AAE9E,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,4BAA4B;AAMhF,OAAO,KAAK,EAAE,aAAa,EAAE,wBAAwB;AAGrD,OAAO,KAAK,EACV,kCAAkC,EAClC,2BAA2B,EAC3B,gCAAgC,EAChC,mCAAmC,EACpC,qBAAiB;AAClB,OAAO,KAAK,EAAE,iBAAiB,EAAE,qBAAiB;AAIlD,eAAO,MAAM,qBAAqB,gCAAgC,CAAC;AAEnE,QAAA,MAAM,UAAU,qBAAqB,CAAC;AAEtC,MAAM,MAAM,sBAAsB,GAAG;IACnC;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,uBAAuB,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACvE,CAAC;AAEF,MAAM,MAAM,2BAA2B,GACnC,kCAAkC,GAClC,2BAA2B,GAC3B,gCAAgC,GAChC,mCAAmC,CAAC;AAExC,KAAK,sCAAsC,GAAG;IAC5C,cAAc,CAAC,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;IACxD,WAAW,EAAE,sBAAsB,CAAC;IACpC,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,2BAA2B,CAAC,CAAC;CAC3D,CAAC;AAEF,KAAK,wBAAwB,GAAG,4BAA4B,CAAC;IAC3D,cAAc,EAAE,cAAc,CAAC,gBAAgB,CAAC;IAChD,UAAU,EAAE,OAAO,UAAU,CAAC;IAC9B,oBAAoB,EAAE,UAAU,CAAC,OAAO,4BAA4B,CAAC,CAAC;IACtE,cAAc,EAAE,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC;CACxD,CAAC,CAAC;AAEH;;;;;;;;;;GAUG;AACH,eAAO,MAAM,oBAAoB,EAAE,8BAA8B,CAC/D,cAAc,CAAC,gBAAgB,EAC/B,sCAAsC,EACtC,wBAAwB,CAgBzB,CAAC;AAMF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,eAAO,MAAM,kBAAkB;;;wBApFb,eAAe,gBAAgB;oBACnC,iBAAiB;8BACP,WAAW,mCAAmC,CAAC;wBACrD,SAAS,cAAc,MAAM,CAAC,CAAC,GAAG,IAAI;;;;EA2F7C,CAAC;AAEZ,eAAO,MAAM,kBAAkB,WAAa,CAAC;AAE7C,KAAK,oBAAoB,GAAG;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,UAAU,CAAC;IACjB,sBAAsB,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;CAC7D,CAAC;AAEF;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,oBAAoB,CAAC,EACzC,IAAI,EACJ,MAAM,EACN,sBAAsB,GACvB,EAAE,oBAAoB,0BAQtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,4BAA4B,CAAC,EAC3C,WAAW,EAAE,EAAE,gBAAgB,EAAE,EACjC,SAAS,GACV,EAAE,sCAAsC,aAE5B,wBAAwB,iBAAiB,CAAC,KAClD,QAAQ,iBAAiB,CAAC,CAqE9B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,MAAM,GACb,iBAAiB,CA0CnB"}
|