From 1087aa0f56142798743d0c0e99eb2e33155f1b4f Mon Sep 17 00:00:00 2001 From: MoMannn Date: Mon, 4 Aug 2025 15:03:13 +0200 Subject: [PATCH 1/4] add permission types package --- packages/permission-types/CHANGELOG.md | 10 ++ packages/permission-types/LICENSE.APACHE2 | 201 ++++++++++++++++++++++ packages/permission-types/LICENSE.MIT0 | 16 ++ packages/permission-types/README.md | 21 +++ packages/permission-types/package.json | 59 +++++++ packages/permission-types/src/index.ts | 16 ++ packages/permission-types/src/types.ts | 130 ++++++++++++++ packages/permission-types/tsconfig.json | 14 ++ packages/permission-types/tsup.config.ts | 12 ++ yarn.lock | 11 ++ 10 files changed, 490 insertions(+) create mode 100644 packages/permission-types/CHANGELOG.md create mode 100644 packages/permission-types/LICENSE.APACHE2 create mode 100644 packages/permission-types/LICENSE.MIT0 create mode 100644 packages/permission-types/README.md create mode 100644 packages/permission-types/package.json create mode 100644 packages/permission-types/src/index.ts create mode 100644 packages/permission-types/src/types.ts create mode 100644 packages/permission-types/tsconfig.json create mode 100644 packages/permission-types/tsup.config.ts diff --git a/packages/permission-types/CHANGELOG.md b/packages/permission-types/CHANGELOG.md new file mode 100644 index 00000000..a90f58e9 --- /dev/null +++ b/packages/permission-types/CHANGELOG.md @@ -0,0 +1,10 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +[Unreleased]: https://github.com/metamask/delegation-toolkit/ diff --git a/packages/permission-types/LICENSE.APACHE2 b/packages/permission-types/LICENSE.APACHE2 new file mode 100644 index 00000000..49966a71 --- /dev/null +++ b/packages/permission-types/LICENSE.APACHE2 @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2022 ConsenSys Software Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/packages/permission-types/LICENSE.MIT0 b/packages/permission-types/LICENSE.MIT0 new file mode 100644 index 00000000..74e1d3df --- /dev/null +++ b/packages/permission-types/LICENSE.MIT0 @@ -0,0 +1,16 @@ +MIT No Attribution + +Copyright 2022 ConsenSys Software Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this +software and associated documentation files (the "Software"), to deal in the Software +without restriction, including without limitation the rights to use, copy, modify, +merge, publish, distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/packages/permission-types/README.md b/packages/permission-types/README.md new file mode 100644 index 00000000..db4a6d15 --- /dev/null +++ b/packages/permission-types/README.md @@ -0,0 +1,21 @@ +# Permission types + +Package with types as defined in [ERC-7715](https://eip.tools/eip/7715). This package centrally manages defines types that can be used across multiple packages/repositories. + +## Installation + +This package is normally installed as part of the Delegation Toolkit (@metamask/delegation-toolkit) which is part of this monorepo. + +In order to install this package standalone: + +With yarn: +``` +yarn add @metamask/permission-types +``` + +With npm: +``` +npm install @metamask/permission-types +``` + + diff --git a/packages/permission-types/package.json b/packages/permission-types/package.json new file mode 100644 index 00000000..fa12ceb0 --- /dev/null +++ b/packages/permission-types/package.json @@ -0,0 +1,59 @@ +{ + "name": "@metamask/permission-types", + "version": "0.1.0", + "description": "Permission types for the ERC-7715", + "license": "(MIT-0 OR Apache-2.0)", + "type": "module", + "keywords": [ + "MetaMask", + "Ethereum" + ], + "homepage": "https://github.com/metamask/delegation-toolkit/tree/main/packages/permission-types#readme", + "bugs": { + "url": "https://github.com/metamask/delegation-toolkit/issues" + }, + "repository": { + "type": "git", + "url": "https://github.com/metamask/delegation-toolkit.git" + }, + "main": "./dist/index.cjs", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "dist/**", + "dist/" + ], + "exports": { + ".": { + "require": { + "types": "./dist/index.d.cts", + "default": "./dist/index.cjs" + }, + "import": { + "types": "./dist/index.d.ts", + "default": "./dist/index.mjs" + } + }, + "./package.json": "./package.json" + }, + "engines": { + "node": "^18.18 || >=20" + }, + "sideEffects": false, + "scripts": { + "build": "yarn typecheck && tsup", + "typecheck": "tsc --noEmit", + "changelog:update": "../../scripts/update-changelog.sh @metamask/permission-types", + "changelog:validate": "../../scripts/validate-changelog.sh @metamask/permission-types" + }, + "publishConfig": { + "access": "public", + "registry": "https://registry.npmjs.org/" + }, + "devDependencies": { + "@metamask/auto-changelog": "^5.0.2", + "compare-versions": "^6.1.1", + "tsup": "^8.5.0", + "typescript": "5.0.4" + } +} diff --git a/packages/permission-types/src/index.ts b/packages/permission-types/src/index.ts new file mode 100644 index 00000000..d15b1c49 --- /dev/null +++ b/packages/permission-types/src/index.ts @@ -0,0 +1,16 @@ +// Export all types from types.ts +export type { + Hex, + WalletSigner, + KeyType, + KeySigner, + MultiKeySigner, + AccountSigner, + Signer, + Permission, + Rule, + PermissionRequest, + PermissionResponse, + RevokeExecutionPermissionRequestParams, + RevokeExecutionPermissionResponseResult, +} from './types'; diff --git a/packages/permission-types/src/types.ts b/packages/permission-types/src/types.ts new file mode 100644 index 00000000..9e4209ae --- /dev/null +++ b/packages/permission-types/src/types.ts @@ -0,0 +1,130 @@ +export type Hex = `0x${string}`; + +/** + * A wallet is the signer for these permissions + * `data` is not necessary for this signer type as the wallet is both the signer and grantor of these permissions + */ +export type WalletSigner = { + type: "wallet"; + data: {}; +}; + +/** + * The types of keys that are supported for the following `key` and `keys` signer types. + */ +export type KeyType = "secp256r1" | "secp256k1" | "ed25519" | "schnorr"; + +/** + * A signer representing a single key. + * "Key" types are explicitly secp256r1 (p256) or secp256k1, and the public keys are hex-encoded. + */ +export type KeySigner = { + type: "key"; + data: { + type: KeyType; + publicKey: Hex; + }; +}; + +/** + * A signer representing a multisig signer. + * Each element of `publicKeys` are all explicitly the same `KeyType`, and the public keys are hex-encoded. + */ +export type MultiKeySigner = { + type: "keys"; + data: { + keys: { + type: KeyType; + publicKey: Hex; + }[]; + }; +}; + +/** + * An account that can be granted with permissions as in ERC-7710. + */ +export type AccountSigner = { + type: "account"; + data: { + address: Hex; + }; +}; + +export type Signer = WalletSigner | KeySigner | MultiKeySigner | AccountSigner; + +/** + * A base permission type that all permissions must extend. + * `isAdjustmentAllowed` defines a boolean value that allows DApp to define whether the "permission" can be attenuated–adjusted to meet the user's terms. + * @param type - is an enum defined by the ERCs + * @param isAdjustmentAllowed - is a boolean that indicates whether the permission can be adjusted. + * @param data - is a record of the data that is associated with the permission, and the structure is defined by the ERCs. + */ +export type Permission = { + type: string; // enum defined by ERCs + isAdjustmentAllowed: boolean; // whether the permission can be adjusted + data: Record; // specific to the type, structure defined by ERCs +}; + +/** + * A base rule type that all rules must extend. + * `isAdjustmentAllowed` defines a boolean value that allows DApp to define whether the "rule" can be attenuated–adjusted to meet the user's terms. + * @param type - is an enum defined by the ERCs + * @param isAdjustmentAllowed - is a boolean that indicates whether the rule can be adjusted. + * @param data - is a record of the data that is associated with the rule, and the structure is defined by the ERCs. + */ +export type Rule = { + type: string; // enum defined by ERCs + isAdjustmentAllowed: boolean; // whether the rule can be adjusted + data: Record; // specific to the type, structure defined by ERCs +}; + +/** + * Parameters for the `wallet_requestExecutionPermissions` JSON-RPC method. + * @param chainId - chainId defines the chain with EIP-155 which applies to this permission request and all addresses can be found defined by other parameters. + * @param address - address identifies the account being targetted for this permission request which is useful when a connection has been established and multiple accounts have been exposed. It is optional to let the user choose which account to grant permission for. + * @param signer - signer is a field that identifies the key or account associated with the permission or alternatively the wallet will manage the session. See the "Signers" section for details. + * @param permission - permission defines the allowed behavior the signer can do on behalf of the account. See the "Permission" section for details. + * @param rules - rules defined the restrictions or conditions that a signer MUST abide by when using a permission to act on behalf of an account. See the "Rule" section for details. + */ +export type PermissionRequest = { + chainId: Hex; // hex-encoding of uint256 + address?: Hex; + signer: Signer; + permission: Permission; + rules?: Rule[]; +}[]; + +/** + * Response from the `wallet_requestExecutionPermissions` JSON-RPC method. + * First note that the response contains all of the parameters of the original request and it is not guaranteed that the values received are equivalent to those requested. + * @param context - is a catch-all to identify a permission for revoking permissions or submitting userOps, and can contain non-identifying data as well. It MAY be the `context` as defined in ERC-7679 and ERC-7710. + * @param dependencyInfo - is an array of objects, each containing fields for `factory` and `factoryData` as defined in ERC-4337. Either both `factory` and `factoryData` must be specified in an entry, or neither. This array is used describe accounts that are not yet deployed but MUST be deployed in order for a permission to be successfully redeemed. + * @param signerMeta - is dependent on the account type. If the signer type is `wallet` then it's not required. If the signer type is `key` or `keys` then `userOpBuilder` is required as defined in ERC-7679. If the signer type is `account` then `delegationManager` is required as defined in ERC-7710. + */ +export type PermissionResponse = PermissionRequest & { + context: Hex; + dependencyInfo: { + factory: Hex; + factoryData: Hex; + }[]; + signerMeta?: { + // 7679 userOp building + userOpBuilder?: Hex; + // 7710 delegation + delegationManager?: Hex; + }; +}; + +/** + * Parameters for the `wallet_revokeExecutionPermission` JSON-RPC method. + * @param permissionContext - the context identifier for the permission to be revoked + */ +export type RevokeExecutionPermissionRequestParams = { + permissionContext: Hex; +}; + +/** + * Response from the `wallet_revokeExecutionPermission` JSON-RPC method. + * The wallet will respond with an empty response when successful. + */ +export type RevokeExecutionPermissionResponseResult = {}; diff --git a/packages/permission-types/tsconfig.json b/packages/permission-types/tsconfig.json new file mode 100644 index 00000000..19ae5b69 --- /dev/null +++ b/packages/permission-types/tsconfig.json @@ -0,0 +1,14 @@ +{ + "extends": "../../shared/config/base.tsconfig.json", + "exclude": [ + "./node_modules/**/*", + "./dist/**/*", + "./test/**/*", + "./script/**/*", + "./**/*.test.ts" + ], + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist", + } +} \ No newline at end of file diff --git a/packages/permission-types/tsup.config.ts b/packages/permission-types/tsup.config.ts new file mode 100644 index 00000000..d1d31001 --- /dev/null +++ b/packages/permission-types/tsup.config.ts @@ -0,0 +1,12 @@ +import type { Options } from 'tsup'; +import config from '../../shared/config/base.tsup.config'; + +const options: Options = { + ...config, + entry: ['src/index.ts'], + dts: { + entry: ['src/index.ts'], + }, +}; + +export default options; diff --git a/yarn.lock b/yarn.lock index b1b81e6d..3ed6046c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -683,6 +683,17 @@ __metadata: languageName: node linkType: hard +"@metamask/permission-types@workspace:packages/permission-types": + version: 0.0.0-use.local + resolution: "@metamask/permission-types@workspace:packages/permission-types" + dependencies: + "@metamask/auto-changelog": "npm:^5.0.2" + compare-versions: "npm:^6.1.1" + tsup: "npm:^8.5.0" + typescript: "npm:5.0.4" + languageName: unknown + linkType: soft + "@metamask/superstruct@npm:^3.1.0": version: 3.2.1 resolution: "@metamask/superstruct@npm:3.2.1" From 43099e4e5a72fe29c13d9bbd30ebeb8eae673e53 Mon Sep 17 00:00:00 2001 From: MoMannn Date: Mon, 4 Aug 2025 15:27:36 +0200 Subject: [PATCH 2/4] update permission request --- packages/permission-types/src/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/permission-types/src/types.ts b/packages/permission-types/src/types.ts index 9e4209ae..7f5703a1 100644 --- a/packages/permission-types/src/types.ts +++ b/packages/permission-types/src/types.ts @@ -92,7 +92,7 @@ export type PermissionRequest = { signer: Signer; permission: Permission; rules?: Rule[]; -}[]; +}; /** * Response from the `wallet_requestExecutionPermissions` JSON-RPC method. From 8ba4e7e81dd34aecec4aca62c0d0751428f804e1 Mon Sep 17 00:00:00 2001 From: MoMannn Date: Tue, 5 Aug 2025 15:34:51 +0200 Subject: [PATCH 3/4] Add metamask permissions and better descriptions. --- packages/permission-types/src/index.ts | 8 +- packages/permission-types/src/types.ts | 188 ++++++++++++++++++++----- 2 files changed, 163 insertions(+), 33 deletions(-) diff --git a/packages/permission-types/src/index.ts b/packages/permission-types/src/index.ts index d15b1c49..a89fc569 100644 --- a/packages/permission-types/src/index.ts +++ b/packages/permission-types/src/index.ts @@ -7,7 +7,13 @@ export type { MultiKeySigner, AccountSigner, Signer, - Permission, + BasePermission, + PermissionTypes, + NativeTokenStreamPermission, + NativeTokenPeriodicPermission, + Erc20TokenStreamPermission, + Erc20TokenPeriodicPermission, + CustomPermission, Rule, PermissionRequest, PermissionResponse, diff --git a/packages/permission-types/src/types.ts b/packages/permission-types/src/types.ts index 7f5703a1..8be3cd52 100644 --- a/packages/permission-types/src/types.ts +++ b/packages/permission-types/src/types.ts @@ -1,4 +1,20 @@ +//////////////////////////////////////////////////// +// General Types +//////////////////////////////////////////////////// + +/** + * A hex-encoded string. + */ export type Hex = `0x${string}`; + +/** + * The types of keys that are supported for the following `key` and `keys` signer types. + */ +export type KeyType = "secp256r1" | "secp256k1" | "ed25519" | "schnorr"; + +//////////////////////////////////////////////////// +// Signer Types +//////////////////////////////////////////////////// /** * A wallet is the signer for these permissions @@ -9,11 +25,6 @@ export type WalletSigner = { data: {}; }; -/** - * The types of keys that are supported for the following `key` and `keys` signer types. - */ -export type KeyType = "secp256r1" | "secp256k1" | "ed25519" | "schnorr"; - /** * A signer representing a single key. * "Key" types are explicitly secp256r1 (p256) or secp256k1, and the public keys are hex-encoded. @@ -52,56 +63,169 @@ export type AccountSigner = { export type Signer = WalletSigner | KeySigner | MultiKeySigner | AccountSigner; +//////////////////////////////////////////////////// +// Permission Types +//////////////////////////////////////////////////// + /** * A base permission type that all permissions must extend. * `isAdjustmentAllowed` defines a boolean value that allows DApp to define whether the "permission" can be attenuated–adjusted to meet the user's terms. - * @param type - is an enum defined by the ERCs - * @param isAdjustmentAllowed - is a boolean that indicates whether the permission can be adjusted. - * @param data - is a record of the data that is associated with the permission, and the structure is defined by the ERCs. - */ -export type Permission = { - type: string; // enum defined by ERCs - isAdjustmentAllowed: boolean; // whether the permission can be adjusted - data: Record; // specific to the type, structure defined by ERCs + * @property type - is an enum defined by the ERCs + * @property isAdjustmentAllowed - is a boolean that indicates whether the permission can be adjusted. + * @property data - is a record of the data that is associated with the permission, and the structure is defined by the ERCs. + */ +export type BasePermission = { + type: string; + isAdjustmentAllowed: boolean; + data: Record; }; /** * A base rule type that all rules must extend. * `isAdjustmentAllowed` defines a boolean value that allows DApp to define whether the "rule" can be attenuated–adjusted to meet the user's terms. - * @param type - is an enum defined by the ERCs - * @param isAdjustmentAllowed - is a boolean that indicates whether the rule can be adjusted. - * @param data - is a record of the data that is associated with the rule, and the structure is defined by the ERCs. + * @property type - is an enum defined by the ERCs + * @property isAdjustmentAllowed - is a boolean that indicates whether the rule can be adjusted. + * @property data - is a record of the data that is associated with the rule, and the structure is defined by the ERCs. */ export type Rule = { - type: string; // enum defined by ERCs - isAdjustmentAllowed: boolean; // whether the rule can be adjusted - data: Record; // specific to the type, structure defined by ERCs + type: string; + isAdjustmentAllowed: boolean; + data: Record; +}; + +//////////////////////////////////////////////////// +// MetaMask Permission Types +//////////////////////////////////////////////////// + +/** + * Base data for all MetaMask permissions. + * @property justification - is a human-readable explanation of why the permission is being requested. + */ +export type MetaMaskBasePermissionData = { + justification?: string; }; +/** + * A permission to stream native tokens. + * @property data.initialAmount - is the initial amount of the native token to be streamed. Defaults to 0. + * @property data.maxAmount - is the maximum amount of the native token to be streamed. Defaults to Max Uint256. + * @property data.amountPerSecond - is the amount of the native token to be streamed per second. + * @property data.startTime - is the start time of the stream. Defaults to current time. + */ +export type NativeTokenStreamPermission = BasePermission & { + type: 'native-token-stream'; + data: MetaMaskBasePermissionData & { + initialAmount?: Hex; + maxAmount?: Hex; + amountPerSecond: Hex; + startTime?: number; + }; +}; + +/** + * A permission to stream native tokens periodically. + * @property data.periodAmount - is the amount of the native token to be streamed per period. + * @property data.periodDuration - is the duration of the period in seconds. + * @property data.startTime - is the start time of the stream. Defaults to current time. + */ +export type NativeTokenPeriodicPermission = BasePermission & { + type: 'native-token-periodic'; + data: MetaMaskBasePermissionData & { + periodAmount: Hex; + periodDuration: number; + startTime?: number; + }; +}; + +/** + * A permission to stream ERC20 tokens. + * @property data.initialAmount - is the initial amount of the ERC20 token to be streamed. Defaults to 0. + * @property data.maxAmount - is the maximum amount of the ERC20 token to be streamed. Defaults to Max Uint256. + * @property data.amountPerSecond - is the amount of the ERC20 token to be streamed per second. + * @property data.startTime - is the start time of the stream. Defaults to current time. + * @property data.tokenAddress - is the address of the ERC20 token to be streamed. + */ +export type Erc20TokenStreamPermission = BasePermission & { + type: 'erc20-token-stream'; + data: MetaMaskBasePermissionData & { + initialAmount?: Hex; + maxAmount?: Hex; + amountPerSecond: Hex; + startTime?: number; + tokenAddress: Hex; + }; +}; + +/** + * A permission to stream ERC20 tokens periodically. + * @property data.periodAmount - is the amount of the ERC20 token to be streamed per period. + * @property data.periodDuration - is the duration of the period in seconds. + * @property data.startTime - is the start time of the stream. Defaults to current time. + * @property data.tokenAddress - is the address of the ERC20 token to be streamed per period. + */ +export type Erc20TokenPeriodicPermission = BasePermission & { + type: 'erc20-token-periodic'; + data: MetaMaskBasePermissionData & { + periodAmount: Hex; + periodDuration: number; + startTime?: number; + tokenAddress: Hex; + }; +}; + +/** + * A custom permission. + * @property data - is a record of the data that is associated with the permission, and the structure is defined by the ERCs. + */ +export type CustomPermission = BasePermission & { + type: 'custom'; + data: MetaMaskBasePermissionData & Record; +}; + +/** + * Represents the type of the ERC-7715 permissions that can be granted. + */ +export type PermissionTypes = + | NativeTokenStreamPermission + | NativeTokenPeriodicPermission + | Erc20TokenStreamPermission + | Erc20TokenPeriodicPermission + | CustomPermission; + +//////////////////////////////////////////////////// +// Permission Requests +//////////////////////////////////////////////////// + /** * Parameters for the `wallet_requestExecutionPermissions` JSON-RPC method. - * @param chainId - chainId defines the chain with EIP-155 which applies to this permission request and all addresses can be found defined by other parameters. - * @param address - address identifies the account being targetted for this permission request which is useful when a connection has been established and multiple accounts have been exposed. It is optional to let the user choose which account to grant permission for. - * @param signer - signer is a field that identifies the key or account associated with the permission or alternatively the wallet will manage the session. See the "Signers" section for details. - * @param permission - permission defines the allowed behavior the signer can do on behalf of the account. See the "Permission" section for details. - * @param rules - rules defined the restrictions or conditions that a signer MUST abide by when using a permission to act on behalf of an account. See the "Rule" section for details. + * @property chainId - chainId defines the chain with EIP-155 which applies to this permission request and all addresses can be found defined by other parameters. + * @property address - address identifies the account being targetted for this permission request which is useful when a connection has been established and multiple accounts have been exposed. It is optional to let the user choose which account to grant permission for. + * @property signer - signer is a field that identifies the key or account associated with the permission or alternatively the wallet will manage the session. See the "Signers" section for details. + * @property permission - permission defines the allowed behavior the signer can do on behalf of the account. See the "Permission" section for details. + * @property rules - rules defined the restrictions or conditions that a signer MUST abide by when using a permission to act on behalf of an account. See the "Rule" section for details. */ -export type PermissionRequest = { +export type PermissionRequest< + TSigner extends Signer, + TPermission extends PermissionTypes +> = { chainId: Hex; // hex-encoding of uint256 address?: Hex; - signer: Signer; - permission: Permission; + signer: TSigner; + permission: TPermission; rules?: Rule[]; }; /** * Response from the `wallet_requestExecutionPermissions` JSON-RPC method. * First note that the response contains all of the parameters of the original request and it is not guaranteed that the values received are equivalent to those requested. - * @param context - is a catch-all to identify a permission for revoking permissions or submitting userOps, and can contain non-identifying data as well. It MAY be the `context` as defined in ERC-7679 and ERC-7710. - * @param dependencyInfo - is an array of objects, each containing fields for `factory` and `factoryData` as defined in ERC-4337. Either both `factory` and `factoryData` must be specified in an entry, or neither. This array is used describe accounts that are not yet deployed but MUST be deployed in order for a permission to be successfully redeemed. - * @param signerMeta - is dependent on the account type. If the signer type is `wallet` then it's not required. If the signer type is `key` or `keys` then `userOpBuilder` is required as defined in ERC-7679. If the signer type is `account` then `delegationManager` is required as defined in ERC-7710. + * @property context - is a catch-all to identify a permission for revoking permissions or submitting userOps, and can contain non-identifying data as well. It MAY be the `context` as defined in ERC-7679 and ERC-7710. + * @property dependencyInfo - is an array of objects, each containing fields for `factory` and `factoryData` as defined in ERC-4337. Either both `factory` and `factoryData` must be specified in an entry, or neither. This array is used describe accounts that are not yet deployed but MUST be deployed in order for a permission to be successfully redeemed. + * @property signerMeta - is dependent on the account type. If the signer type is `wallet` then it's not required. If the signer type is `key` or `keys` then `userOpBuilder` is required as defined in ERC-7679. If the signer type is `account` then `delegationManager` is required as defined in ERC-7710. */ -export type PermissionResponse = PermissionRequest & { +export type PermissionResponse< + TSigner extends Signer, + TPermission extends PermissionTypes +> = PermissionRequest & { context: Hex; dependencyInfo: { factory: Hex; @@ -117,7 +241,7 @@ export type PermissionResponse = PermissionRequest & { /** * Parameters for the `wallet_revokeExecutionPermission` JSON-RPC method. - * @param permissionContext - the context identifier for the permission to be revoked + * @property permissionContext - the context identifier for the permission to be revoked */ export type RevokeExecutionPermissionRequestParams = { permissionContext: Hex; From 7ffe726c31d3655fc51d51194b237299251efa23 Mon Sep 17 00:00:00 2001 From: MoMannn Date: Wed, 6 Aug 2025 09:32:09 +0200 Subject: [PATCH 4/4] temporarily remove custom permissions --- packages/permission-types/src/index.ts | 1 - packages/permission-types/src/types.ts | 12 ++++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/permission-types/src/index.ts b/packages/permission-types/src/index.ts index a89fc569..fb2f46ae 100644 --- a/packages/permission-types/src/index.ts +++ b/packages/permission-types/src/index.ts @@ -13,7 +13,6 @@ export type { NativeTokenPeriodicPermission, Erc20TokenStreamPermission, Erc20TokenPeriodicPermission, - CustomPermission, Rule, PermissionRequest, PermissionResponse, diff --git a/packages/permission-types/src/types.ts b/packages/permission-types/src/types.ts index 8be3cd52..edaabcb7 100644 --- a/packages/permission-types/src/types.ts +++ b/packages/permission-types/src/types.ts @@ -177,10 +177,11 @@ export type Erc20TokenPeriodicPermission = BasePermission & { * A custom permission. * @property data - is a record of the data that is associated with the permission, and the structure is defined by the ERCs. */ -export type CustomPermission = BasePermission & { - type: 'custom'; - data: MetaMaskBasePermissionData & Record; -}; +// TODO: Consider openning up permission types with Custom / Unknown permissions in subseqential versions. +// export type CustomPermission = BasePermission & { +// type: 'custom'; +// data: MetaMaskBasePermissionData & Record; +// }; /** * Represents the type of the ERC-7715 permissions that can be granted. @@ -189,8 +190,7 @@ export type PermissionTypes = | NativeTokenStreamPermission | NativeTokenPeriodicPermission | Erc20TokenStreamPermission - | Erc20TokenPeriodicPermission - | CustomPermission; + | Erc20TokenPeriodicPermission; //////////////////////////////////////////////////// // Permission Requests