@metamask-previews/chain-agnostic-permission 0.2.0-preview-8c3b89c → 0.2.0-preview-62c1e797

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.
Files changed (33) hide show
  1. package/dist/adapters/caip-permission-adapter-accounts.cjs +32 -4
  2. package/dist/adapters/caip-permission-adapter-accounts.cjs.map +1 -1
  3. package/dist/adapters/caip-permission-adapter-accounts.d.cts +11 -0
  4. package/dist/adapters/caip-permission-adapter-accounts.d.cts.map +1 -1
  5. package/dist/adapters/caip-permission-adapter-accounts.d.mts +11 -0
  6. package/dist/adapters/caip-permission-adapter-accounts.d.mts.map +1 -1
  7. package/dist/adapters/caip-permission-adapter-accounts.mjs +31 -3
  8. package/dist/adapters/caip-permission-adapter-accounts.mjs.map +1 -1
  9. package/dist/adapters/caip-permission-adapter-permittedChains.cjs +37 -34
  10. package/dist/adapters/caip-permission-adapter-permittedChains.cjs.map +1 -1
  11. package/dist/adapters/caip-permission-adapter-permittedChains.d.cts +9 -7
  12. package/dist/adapters/caip-permission-adapter-permittedChains.d.cts.map +1 -1
  13. package/dist/adapters/caip-permission-adapter-permittedChains.d.mts +9 -7
  14. package/dist/adapters/caip-permission-adapter-permittedChains.d.mts.map +1 -1
  15. package/dist/adapters/caip-permission-adapter-permittedChains.mjs +35 -32
  16. package/dist/adapters/caip-permission-adapter-permittedChains.mjs.map +1 -1
  17. package/dist/caip25Permission.cjs +13 -8
  18. package/dist/caip25Permission.cjs.map +1 -1
  19. package/dist/caip25Permission.d.cts +7 -6
  20. package/dist/caip25Permission.d.cts.map +1 -1
  21. package/dist/caip25Permission.d.mts +7 -6
  22. package/dist/caip25Permission.d.mts.map +1 -1
  23. package/dist/caip25Permission.mjs +13 -8
  24. package/dist/caip25Permission.mjs.map +1 -1
  25. package/dist/scope/types.cjs +1 -0
  26. package/dist/scope/types.cjs.map +1 -1
  27. package/dist/scope/types.d.cts +1 -0
  28. package/dist/scope/types.d.cts.map +1 -1
  29. package/dist/scope/types.d.mts +1 -0
  30. package/dist/scope/types.d.mts.map +1 -1
  31. package/dist/scope/types.mjs +1 -0
  32. package/dist/scope/types.mjs.map +1 -1
  33. package/package.json +1 -1
@@ -107,25 +107,33 @@ export const setPermittedEthChainIds = (caip25CaveatValue, chainIds) => {
107
107
  return updatedCaveatValue;
108
108
  };
109
109
  /**
110
- * Sets the permitted CAIP-2 chainIDs for the required and optional scopes.
111
- * @param caip25CaveatValue - The CAIP-25 caveat value to set the permitted CAIP-2 chainIDs for.
112
- * @param chainIds - The CAIP-2 chainIDs to set as permitted.
113
- * @returns The updated CAIP-25 caveat value with the permitted CAIP-2 chainIDs.
110
+ * Filters the scopes object to only include:
111
+ * - Scopes without references (e.g. "wallet:")
112
+ * - CAIP-2 ChainId scopes for the given chainIDs
113
+ *
114
+ * @param scopesObject - The scopes object to filter.
115
+ * @param chainIds - The CAIP-2 chainIDs to filter for.
116
+ * @returns The filtered scopes object.
114
117
  */
115
- export const setPermittedChainIds = (caip25CaveatValue, chainIds) => {
116
- let updatedCaveatValue = {
117
- ...caip25CaveatValue,
118
- requiredScopes: filterChainScopesObjectByChainId(caip25CaveatValue.requiredScopes, chainIds),
119
- optionalScopes: filterChainScopesObjectByChainId(caip25CaveatValue.optionalScopes, chainIds),
120
- };
121
- chainIds.forEach((chainId) => {
122
- updatedCaveatValue = addPermittedChainId(updatedCaveatValue, chainId);
118
+ const filterChainScopesObjectByChainId = (scopesObject, chainIds) => {
119
+ const updatedScopesObject = {};
120
+ Object.entries(scopesObject).forEach(([key, scopeObject]) => {
121
+ // Cast needed because index type is returned as `string` by `Object.entries`
122
+ const scopeString = key;
123
+ // If its a wallet scope or a wallet:* scope we don't filter it
124
+ if (isWalletScope(scopeString)) {
125
+ updatedScopesObject[scopeString] = scopeObject;
126
+ }
127
+ else if (chainIds.includes(scopeString)) {
128
+ updatedScopesObject[scopeString] = scopeObject;
129
+ }
123
130
  });
124
- return updatedCaveatValue;
131
+ return updatedScopesObject;
125
132
  };
126
133
  /**
127
134
  * Adds a chainID to the optional scopes if it is not already present
128
135
  * in either the pre-existing required or optional scopes.
136
+ *
129
137
  * @param caip25CaveatValue - The CAIP-25 caveat value to add the chainID to.
130
138
  * @param chainId - The chainID to add.
131
139
  * @returns The updated CAIP-25 caveat value with the added chainID.
@@ -146,26 +154,21 @@ export const addPermittedChainId = (caip25CaveatValue, chainId) => {
146
154
  };
147
155
  };
148
156
  /**
149
- * Filters the scopes object to only include:
150
- * - Scopes without references (e.g. "wallet:")
151
- * - CAIP-2 ChainId scopes for the given chainIDs
152
- * @param scopesObject - The scopes object to filter.
153
- * @param chainIds - The CAIP-2 chainIDs to filter for.
154
- * @returns The filtered scopes object.
157
+ * Sets the permitted CAIP-2 chainIDs for the required and optional scopes.
158
+ *
159
+ * @param caip25CaveatValue - The CAIP-25 caveat value to set the permitted CAIP-2 chainIDs for.
160
+ * @param chainIds - The CAIP-2 chainIDs to set as permitted.
161
+ * @returns The updated CAIP-25 caveat value with the permitted CAIP-2 chainIDs.
155
162
  */
156
- const filterChainScopesObjectByChainId = (scopesObject, chainIds) => {
157
- const updatedScopesObject = {};
158
- Object.entries(scopesObject).forEach(([key, scopeObject]) => {
159
- // Cast needed because index type is returned as `string` by `Object.entries`
160
- const scopeString = key;
161
- // If its a wallet scope or a wallet:* scope we don't filter it
162
- if (isWalletScope(scopeString)) {
163
- updatedScopesObject[scopeString] = scopeObject;
164
- }
165
- else if (chainIds.includes(scopeString)) {
166
- updatedScopesObject[scopeString] = scopeObject;
167
- }
163
+ export const setPermittedChainIds = (caip25CaveatValue, chainIds) => {
164
+ let updatedCaveatValue = {
165
+ ...caip25CaveatValue,
166
+ requiredScopes: filterChainScopesObjectByChainId(caip25CaveatValue.requiredScopes, chainIds),
167
+ optionalScopes: filterChainScopesObjectByChainId(caip25CaveatValue.optionalScopes, chainIds),
168
+ };
169
+ chainIds.forEach((chainId) => {
170
+ updatedCaveatValue = addPermittedChainId(updatedCaveatValue, chainId);
168
171
  });
169
- return updatedScopesObject;
172
+ return updatedCaveatValue;
170
173
  };
171
174
  //# sourceMappingURL=caip-permission-adapter-permittedChains.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"caip-permission-adapter-permittedChains.mjs","sourceRoot":"","sources":["../../src/adapters/caip-permission-adapter-permittedChains.ts"],"names":[],"mappings":"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","sourcesContent":["import { toHex } from '@metamask/controller-utils';\nimport type { Hex, CaipChainId } from '@metamask/utils';\nimport { hexToBigInt, KnownCaipNamespace } from '@metamask/utils';\n\nimport type { Caip25CaveatValue } from '../caip25Permission';\nimport { getUniqueArrayItems } from '../scope/transform';\nimport type { InternalScopesObject } from '../scope/types';\nimport { isWalletScope, parseScopeString } from '../scope/types';\n\n/**\n * Gets the Ethereum (EIP155 namespaced) chainIDs from internal scopes.\n *\n * @param scopes - The internal scopes from which to get the Ethereum chainIDs.\n * @returns An array of Ethereum chainIDs.\n */\nconst getPermittedEthChainIdsFromScopes = (scopes: InternalScopesObject) => {\n const ethChainIds: Hex[] = [];\n\n Object.keys(scopes).forEach((scopeString) => {\n const { namespace, reference } = parseScopeString(scopeString);\n if (namespace === KnownCaipNamespace.Eip155 && reference) {\n ethChainIds.push(toHex(reference));\n }\n });\n\n return ethChainIds;\n};\n\n/**\n * Gets the Ethereum (EIP155 namespaced) chainIDs from the required and optional scopes.\n *\n * @param caip25CaveatValue - The CAIP-25 caveat value from which to get the Ethereum chainIDs.\n * @returns An array of Ethereum chainIDs.\n */\nexport const getPermittedEthChainIds = (\n caip25CaveatValue: Pick<\n Caip25CaveatValue,\n 'requiredScopes' | 'optionalScopes'\n >,\n) => {\n const { requiredScopes, optionalScopes } = caip25CaveatValue;\n\n const ethChainIds: Hex[] = [\n ...getPermittedEthChainIdsFromScopes(requiredScopes),\n ...getPermittedEthChainIdsFromScopes(optionalScopes),\n ];\n\n return getUniqueArrayItems(ethChainIds);\n};\n\n/**\n * Adds an Ethereum (EIP155 namespaced) chainID to the optional scopes if it is not already present\n * in either the pre-existing required or optional scopes.\n *\n * @param caip25CaveatValue - The CAIP-25 caveat value to add the Ethereum chainID to.\n * @param chainId - The Ethereum chainID to add.\n * @returns The updated CAIP-25 caveat value with the added Ethereum chainID.\n */\nexport const addPermittedEthChainId = (\n caip25CaveatValue: Caip25CaveatValue,\n chainId: Hex,\n): Caip25CaveatValue => {\n const scopeString = `eip155:${hexToBigInt(chainId).toString(10)}`;\n if (\n Object.keys(caip25CaveatValue.requiredScopes).includes(scopeString) ||\n Object.keys(caip25CaveatValue.optionalScopes).includes(scopeString)\n ) {\n return caip25CaveatValue;\n }\n\n return {\n ...caip25CaveatValue,\n optionalScopes: {\n ...caip25CaveatValue.optionalScopes,\n [scopeString]: {\n accounts: [],\n },\n },\n };\n};\n\n/**\n * Filters the scopes object to only include:\n * - Scopes without references (e.g. \"wallet:\")\n * - EIP155 scopes for the given chainIDs\n * - Non EIP155 scopes (e.g. \"bip122:\" or any other non ethereum namespaces)\n *\n * @param scopesObject - The scopes object to filter.\n * @param chainIds - The chainIDs to filter EIP155 scopes by.\n * @returns The filtered scopes object.\n */\nconst filterEthScopesObjectByChainId = (\n scopesObject: InternalScopesObject,\n chainIds: Hex[],\n): InternalScopesObject => {\n const updatedScopesObject: InternalScopesObject = {};\n\n Object.entries(scopesObject).forEach(([key, scopeObject]) => {\n // Cast needed because index type is returned as `string` by `Object.entries`\n const scopeString = key as keyof typeof scopesObject;\n const { namespace, reference } = parseScopeString(scopeString);\n if (!reference) {\n updatedScopesObject[scopeString] = scopeObject;\n return;\n }\n if (namespace === KnownCaipNamespace.Eip155) {\n const chainId = toHex(reference);\n if (chainIds.includes(chainId)) {\n updatedScopesObject[scopeString] = scopeObject;\n }\n } else {\n updatedScopesObject[scopeString] = scopeObject;\n }\n });\n\n return updatedScopesObject;\n};\n\n/**\n * Sets the permitted Ethereum (EIP155 namespaced) chainIDs for the required and optional scopes.\n *\n * @param caip25CaveatValue - The CAIP-25 caveat value to set the permitted Ethereum chainIDs for.\n * @param chainIds - The Ethereum chainIDs to set as permitted.\n * @returns The updated CAIP-25 caveat value with the permitted Ethereum chainIDs.\n */\nexport const setPermittedEthChainIds = (\n caip25CaveatValue: Caip25CaveatValue,\n chainIds: Hex[],\n): Caip25CaveatValue => {\n let updatedCaveatValue: Caip25CaveatValue = {\n ...caip25CaveatValue,\n requiredScopes: filterEthScopesObjectByChainId(\n caip25CaveatValue.requiredScopes,\n chainIds,\n ),\n optionalScopes: filterEthScopesObjectByChainId(\n caip25CaveatValue.optionalScopes,\n chainIds,\n ),\n };\n\n chainIds.forEach((chainId) => {\n updatedCaveatValue = addPermittedEthChainId(updatedCaveatValue, chainId);\n });\n\n return updatedCaveatValue;\n};\n\n/**\n * Sets the permitted CAIP-2 chainIDs for the required and optional scopes.\n * @param caip25CaveatValue - The CAIP-25 caveat value to set the permitted CAIP-2 chainIDs for.\n * @param chainIds - The CAIP-2 chainIDs to set as permitted.\n * @returns The updated CAIP-25 caveat value with the permitted CAIP-2 chainIDs.\n */\nexport const setPermittedChainIds = (\n caip25CaveatValue: Caip25CaveatValue,\n chainIds: CaipChainId[],\n): Caip25CaveatValue => {\n let updatedCaveatValue: Caip25CaveatValue = {\n ...caip25CaveatValue,\n requiredScopes: filterChainScopesObjectByChainId(\n caip25CaveatValue.requiredScopes,\n chainIds,\n ),\n optionalScopes: filterChainScopesObjectByChainId(\n caip25CaveatValue.optionalScopes,\n chainIds,\n ),\n };\n\n chainIds.forEach((chainId) => {\n updatedCaveatValue = addPermittedChainId(updatedCaveatValue, chainId);\n });\n\n return updatedCaveatValue;\n};\n\n/**\n * Adds a chainID to the optional scopes if it is not already present\n * in either the pre-existing required or optional scopes.\n * @param caip25CaveatValue - The CAIP-25 caveat value to add the chainID to.\n * @param chainId - The chainID to add.\n * @returns The updated CAIP-25 caveat value with the added chainID.\n */\nexport const addPermittedChainId = (\n caip25CaveatValue: Caip25CaveatValue,\n chainId: CaipChainId,\n): Caip25CaveatValue => {\n if (\n Object.keys(caip25CaveatValue.requiredScopes).includes(chainId) ||\n Object.keys(caip25CaveatValue.optionalScopes).includes(chainId)\n ) {\n return caip25CaveatValue;\n }\n\n return {\n ...caip25CaveatValue,\n optionalScopes: {\n ...caip25CaveatValue.optionalScopes,\n [chainId]: {\n accounts: [],\n },\n },\n };\n};\n\n/**\n * Filters the scopes object to only include:\n * - Scopes without references (e.g. \"wallet:\")\n * - CAIP-2 ChainId scopes for the given chainIDs\n * @param scopesObject - The scopes object to filter.\n * @param chainIds - The CAIP-2 chainIDs to filter for.\n * @returns The filtered scopes object.\n */\nconst filterChainScopesObjectByChainId = (\n scopesObject: InternalScopesObject,\n chainIds: CaipChainId[],\n): InternalScopesObject => {\n const updatedScopesObject: InternalScopesObject = {};\n\n Object.entries(scopesObject).forEach(([key, scopeObject]) => {\n // Cast needed because index type is returned as `string` by `Object.entries`\n const scopeString = key as keyof typeof scopesObject;\n // If its a wallet scope or a wallet:* scope we don't filter it\n if (isWalletScope(scopeString)) {\n updatedScopesObject[scopeString] = scopeObject;\n } else if (chainIds.includes(scopeString)) {\n updatedScopesObject[scopeString] = scopeObject;\n }\n });\n\n return updatedScopesObject;\n};\n"]}
1
+ {"version":3,"file":"caip-permission-adapter-permittedChains.mjs","sourceRoot":"","sources":["../../src/adapters/caip-permission-adapter-permittedChains.ts"],"names":[],"mappings":"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","sourcesContent":["import { toHex } from '@metamask/controller-utils';\nimport type { Hex, CaipChainId } from '@metamask/utils';\nimport { hexToBigInt, KnownCaipNamespace } from '@metamask/utils';\n\nimport type { Caip25CaveatValue } from '../caip25Permission';\nimport { getUniqueArrayItems } from '../scope/transform';\nimport type { InternalScopesObject } from '../scope/types';\nimport { isWalletScope, parseScopeString } from '../scope/types';\n\n/**\n * Gets the Ethereum (EIP155 namespaced) chainIDs from internal scopes.\n *\n * @param scopes - The internal scopes from which to get the Ethereum chainIDs.\n * @returns An array of Ethereum chainIDs.\n */\nconst getPermittedEthChainIdsFromScopes = (scopes: InternalScopesObject) => {\n const ethChainIds: Hex[] = [];\n\n Object.keys(scopes).forEach((scopeString) => {\n const { namespace, reference } = parseScopeString(scopeString);\n if (namespace === KnownCaipNamespace.Eip155 && reference) {\n ethChainIds.push(toHex(reference));\n }\n });\n\n return ethChainIds;\n};\n\n/**\n * Gets the Ethereum (EIP155 namespaced) chainIDs from the required and optional scopes.\n *\n * @param caip25CaveatValue - The CAIP-25 caveat value from which to get the Ethereum chainIDs.\n * @returns An array of Ethereum chainIDs.\n */\nexport const getPermittedEthChainIds = (\n caip25CaveatValue: Pick<\n Caip25CaveatValue,\n 'requiredScopes' | 'optionalScopes'\n >,\n) => {\n const { requiredScopes, optionalScopes } = caip25CaveatValue;\n\n const ethChainIds: Hex[] = [\n ...getPermittedEthChainIdsFromScopes(requiredScopes),\n ...getPermittedEthChainIdsFromScopes(optionalScopes),\n ];\n\n return getUniqueArrayItems(ethChainIds);\n};\n\n/**\n * Adds an Ethereum (EIP155 namespaced) chainID to the optional scopes if it is not already present\n * in either the pre-existing required or optional scopes.\n *\n * @param caip25CaveatValue - The CAIP-25 caveat value to add the Ethereum chainID to.\n * @param chainId - The Ethereum chainID to add.\n * @returns The updated CAIP-25 caveat value with the added Ethereum chainID.\n */\nexport const addPermittedEthChainId = (\n caip25CaveatValue: Caip25CaveatValue,\n chainId: Hex,\n): Caip25CaveatValue => {\n const scopeString = `eip155:${hexToBigInt(chainId).toString(10)}`;\n if (\n Object.keys(caip25CaveatValue.requiredScopes).includes(scopeString) ||\n Object.keys(caip25CaveatValue.optionalScopes).includes(scopeString)\n ) {\n return caip25CaveatValue;\n }\n\n return {\n ...caip25CaveatValue,\n optionalScopes: {\n ...caip25CaveatValue.optionalScopes,\n [scopeString]: {\n accounts: [],\n },\n },\n };\n};\n\n/**\n * Filters the scopes object to only include:\n * - Scopes without references (e.g. \"wallet:\")\n * - EIP155 scopes for the given chainIDs\n * - Non EIP155 scopes (e.g. \"bip122:\" or any other non ethereum namespaces)\n *\n * @param scopesObject - The scopes object to filter.\n * @param chainIds - The chainIDs to filter EIP155 scopes by.\n * @returns The filtered scopes object.\n */\nconst filterEthScopesObjectByChainId = (\n scopesObject: InternalScopesObject,\n chainIds: Hex[],\n): InternalScopesObject => {\n const updatedScopesObject: InternalScopesObject = {};\n\n Object.entries(scopesObject).forEach(([key, scopeObject]) => {\n // Cast needed because index type is returned as `string` by `Object.entries`\n const scopeString = key as keyof typeof scopesObject;\n const { namespace, reference } = parseScopeString(scopeString);\n if (!reference) {\n updatedScopesObject[scopeString] = scopeObject;\n return;\n }\n if (namespace === KnownCaipNamespace.Eip155) {\n const chainId = toHex(reference);\n if (chainIds.includes(chainId)) {\n updatedScopesObject[scopeString] = scopeObject;\n }\n } else {\n updatedScopesObject[scopeString] = scopeObject;\n }\n });\n\n return updatedScopesObject;\n};\n\n/**\n * Sets the permitted Ethereum (EIP155 namespaced) chainIDs for the required and optional scopes.\n *\n * @param caip25CaveatValue - The CAIP-25 caveat value to set the permitted Ethereum chainIDs for.\n * @param chainIds - The Ethereum chainIDs to set as permitted.\n * @returns The updated CAIP-25 caveat value with the permitted Ethereum chainIDs.\n */\nexport const setPermittedEthChainIds = (\n caip25CaveatValue: Caip25CaveatValue,\n chainIds: Hex[],\n): Caip25CaveatValue => {\n let updatedCaveatValue: Caip25CaveatValue = {\n ...caip25CaveatValue,\n requiredScopes: filterEthScopesObjectByChainId(\n caip25CaveatValue.requiredScopes,\n chainIds,\n ),\n optionalScopes: filterEthScopesObjectByChainId(\n caip25CaveatValue.optionalScopes,\n chainIds,\n ),\n };\n\n chainIds.forEach((chainId) => {\n updatedCaveatValue = addPermittedEthChainId(updatedCaveatValue, chainId);\n });\n\n return updatedCaveatValue;\n};\n\n/**\n * Filters the scopes object to only include:\n * - Scopes without references (e.g. \"wallet:\")\n * - CAIP-2 ChainId scopes for the given chainIDs\n *\n * @param scopesObject - The scopes object to filter.\n * @param chainIds - The CAIP-2 chainIDs to filter for.\n * @returns The filtered scopes object.\n */\nconst filterChainScopesObjectByChainId = (\n scopesObject: InternalScopesObject,\n chainIds: CaipChainId[],\n): InternalScopesObject => {\n const updatedScopesObject: InternalScopesObject = {};\n\n Object.entries(scopesObject).forEach(([key, scopeObject]) => {\n // Cast needed because index type is returned as `string` by `Object.entries`\n const scopeString = key as keyof typeof scopesObject;\n // If its a wallet scope or a wallet:* scope we don't filter it\n if (isWalletScope(scopeString)) {\n updatedScopesObject[scopeString] = scopeObject;\n } else if (chainIds.includes(scopeString)) {\n updatedScopesObject[scopeString] = scopeObject;\n }\n });\n\n return updatedScopesObject;\n};\n\n/**\n * Adds a chainID to the optional scopes if it is not already present\n * in either the pre-existing required or optional scopes.\n *\n * @param caip25CaveatValue - The CAIP-25 caveat value to add the chainID to.\n * @param chainId - The chainID to add.\n * @returns The updated CAIP-25 caveat value with the added chainID.\n */\nexport const addPermittedChainId = (\n caip25CaveatValue: Caip25CaveatValue,\n chainId: CaipChainId,\n): Caip25CaveatValue => {\n if (\n Object.keys(caip25CaveatValue.requiredScopes).includes(chainId) ||\n Object.keys(caip25CaveatValue.optionalScopes).includes(chainId)\n ) {\n return caip25CaveatValue;\n }\n\n return {\n ...caip25CaveatValue,\n optionalScopes: {\n ...caip25CaveatValue.optionalScopes,\n [chainId]: {\n accounts: [],\n },\n },\n };\n};\n\n/**\n * Sets the permitted CAIP-2 chainIDs for the required and optional scopes.\n *\n * @param caip25CaveatValue - The CAIP-25 caveat value to set the permitted CAIP-2 chainIDs for.\n * @param chainIds - The CAIP-2 chainIDs to set as permitted.\n * @returns The updated CAIP-25 caveat value with the permitted CAIP-2 chainIDs.\n */\nexport const setPermittedChainIds = (\n caip25CaveatValue: Caip25CaveatValue,\n chainIds: CaipChainId[],\n): Caip25CaveatValue => {\n let updatedCaveatValue: Caip25CaveatValue = {\n ...caip25CaveatValue,\n requiredScopes: filterChainScopesObjectByChainId(\n caip25CaveatValue.requiredScopes,\n chainIds,\n ),\n optionalScopes: filterChainScopesObjectByChainId(\n caip25CaveatValue.optionalScopes,\n chainIds,\n ),\n };\n\n chainIds.forEach((chainId) => {\n updatedCaveatValue = addPermittedChainId(updatedCaveatValue, chainId);\n });\n\n return updatedCaveatValue;\n};\n"]}
@@ -4,12 +4,12 @@ exports.generateCaip25Caveat = exports.Caip25CaveatMutators = exports.caip25Endo
4
4
  const permission_controller_1 = require("@metamask/permission-controller");
5
5
  const utils_1 = require("@metamask/utils");
6
6
  const lodash_1 = require("lodash");
7
+ const caip_permission_adapter_accounts_1 = require("./adapters/caip-permission-adapter-accounts.cjs");
8
+ const caip_permission_adapter_permittedChains_1 = require("./adapters/caip-permission-adapter-permittedChains.cjs");
7
9
  const assert_1 = require("./scope/assert.cjs");
8
10
  const supported_1 = require("./scope/supported.cjs");
9
11
  const transform_1 = require("./scope/transform.cjs");
10
12
  const types_1 = require("./scope/types.cjs");
11
- const caip_permission_adapter_permittedChains_1 = require("./adapters/caip-permission-adapter-permittedChains.cjs");
12
- const caip_permission_adapter_accounts_1 = require("./adapters/caip-permission-adapter-accounts.cjs");
13
13
  /**
14
14
  * The name of the CAIP-25 permission caveat.
15
15
  */
@@ -108,6 +108,10 @@ const caip25CaveatBuilder = ({ findNetworkClientIdByChainId, listAccounts, isNon
108
108
  }
109
109
  (0, assert_1.assertIsInternalScopesObject)(requiredScopes);
110
110
  (0, assert_1.assertIsInternalScopesObject)(optionalScopes);
111
+ if (Object.keys(requiredScopes).length === 0 &&
112
+ Object.keys(optionalScopes).length === 0) {
113
+ throw new Error(`${exports.Caip25EndowmentPermissionName} error: Received no scopes requested for caveat of type "${exports.Caip25CaveatType}".`);
114
+ }
111
115
  const isEvmChainIdSupported = (chainId) => {
112
116
  try {
113
117
  findNetworkClientIdByChainId(chainId);
@@ -296,12 +300,13 @@ function removeScope(caip25CaveatValue, targetScopeString) {
296
300
  };
297
301
  }
298
302
  /**
299
- * Modifies the requested CAIP-25 permissions object after UI confirmation.
300
- *
301
- * @param caip25CaveatValue - The requested CAIP-25 caveat value to modify.
302
- * @param accountAddresses - The list of permitted eth addresses.
303
- * @param chainIds - The list of permitted eth chainIds.
304
- */
303
+ * Modifies the requested CAIP-25 permissions object after UI confirmation.
304
+ *
305
+ * @param caip25CaveatValue - The requested CAIP-25 caveat value to modify.
306
+ * @param accountAddresses - The list of permitted eth addresses.
307
+ * @param chainIds - The list of permitted eth chainIds.
308
+ * @returns The updated CAIP-25 caveat value with the permitted accounts and chainIds set.
309
+ */
305
310
  const generateCaip25Caveat = (caip25CaveatValue, accountAddresses, chainIds) => {
306
311
  const caveatValueWithChains = (0, caip_permission_adapter_permittedChains_1.setPermittedChainIds)(caip25CaveatValue, chainIds);
307
312
  const caveatValueWithAccounts = (0, caip_permission_adapter_accounts_1.setPermittedAccounts)(caveatValueWithChains, accountAddresses);
@@ -1 +1 @@
1
- {"version":3,"file":"caip25Permission.cjs","sourceRoot":"","sources":["../src/caip25Permission.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkClientId } from '@metamask/network-controller';\nimport type {\n PermissionSpecificationBuilder,\n EndowmentGetterParams,\n ValidPermissionSpecification,\n PermissionValidatorConstraint,\n PermissionConstraint,\n EndowmentCaveatSpecificationConstraint,\n} from '@metamask/permission-controller';\nimport {\n CaveatMutatorOperation,\n PermissionType,\n} from '@metamask/permission-controller';\nimport type { CaipAccountId, CaipChainId, Json } from '@metamask/utils';\nimport {\n hasProperty,\n KnownCaipNamespace,\n parseCaipAccountId,\n isObject,\n type Hex,\n type NonEmptyArray,\n} from '@metamask/utils';\nimport { cloneDeep, isEqual } from 'lodash';\n\nimport { assertIsInternalScopesObject } from './scope/assert';\nimport {\n isSupportedAccount,\n isSupportedScopeString,\n isSupportedSessionProperty,\n} from './scope/supported';\nimport { mergeInternalScopes } from './scope/transform';\nimport {\n parseScopeString,\n type ExternalScopeString,\n type InternalScopeObject,\n type InternalScopesObject,\n} from './scope/types';\nimport { setPermittedChainIds } from './adapters/caip-permission-adapter-permittedChains';\nimport { setPermittedAccounts } from './adapters/caip-permission-adapter-accounts';\n\n/**\n * The CAIP-25 permission caveat value.\n * This permission contains the required and optional scopes and session properties from the [CAIP-25](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-25.md) request that initiated the permission session.\n * It also contains a boolean (isMultichainOrigin) indicating if the permission session is multichain, which may be needed to determine implicit permissioning.\n */\nexport type Caip25CaveatValue = {\n requiredScopes: InternalScopesObject;\n optionalScopes: InternalScopesObject;\n sessionProperties: Record<string, Json>;\n isMultichainOrigin: boolean;\n};\n\n/**\n * The name of the CAIP-25 permission caveat.\n */\nexport const Caip25CaveatType = 'authorizedScopes';\n\n/**\n * The target name of the CAIP-25 endowment permission.\n */\nexport const Caip25EndowmentPermissionName = 'endowment:caip25';\n\n/**\n * Creates a CAIP-25 permission caveat.\n *\n * @param value - The CAIP-25 permission caveat value.\n * @returns The CAIP-25 permission caveat (now including the type).\n */\nexport const createCaip25Caveat = (value: Caip25CaveatValue) => {\n return {\n type: Caip25CaveatType,\n value,\n };\n};\n\ntype Caip25EndowmentCaveatSpecificationBuilderOptions = {\n findNetworkClientIdByChainId: (chainId: Hex) => NetworkClientId;\n listAccounts: () => { type: string; address: Hex }[];\n isNonEvmScopeSupported: (scope: CaipChainId) => boolean;\n getNonEvmAccountAddresses: (scope: CaipChainId) => string[];\n};\n\n/**\n * Calculates the difference between two provided CAIP-25 permission caveat values, but only considering a single scope property at a time.\n *\n * @param originalValue - The existing CAIP-25 permission caveat value.\n * @param mergedValue - The result from merging existing and incoming CAIP-25 permission caveat values.\n * @param scopeToDiff - The required or optional scopes from the [CAIP-25](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-25.md) request.\n * @returns The difference between original and merged CAIP-25 permission caveat values.\n */\nexport function diffScopesForCaip25CaveatValue(\n originalValue: Caip25CaveatValue,\n mergedValue: Caip25CaveatValue,\n scopeToDiff: 'optionalScopes' | 'requiredScopes',\n): Caip25CaveatValue {\n const diff = cloneDeep(originalValue);\n\n const mergedScopeToDiff = mergedValue[scopeToDiff];\n for (const [scopeString, mergedScopeObject] of Object.entries(\n mergedScopeToDiff,\n )) {\n const internalScopeString = scopeString as keyof typeof mergedScopeToDiff;\n const originalScopeObject = diff[scopeToDiff][internalScopeString];\n\n if (originalScopeObject) {\n const newAccounts = mergedScopeObject.accounts.filter(\n (account) => !originalScopeObject?.accounts.includes(account),\n );\n if (newAccounts.length > 0) {\n diff[scopeToDiff][internalScopeString] = {\n accounts: newAccounts,\n };\n continue;\n }\n delete diff[scopeToDiff][internalScopeString];\n } else {\n diff[scopeToDiff][internalScopeString] = mergedScopeObject;\n }\n }\n\n return diff;\n}\n\n/**\n * Checks if every account in the given scopes object is supported.\n *\n * @param scopesObject - The scopes object to iterate over.\n * @param listAccounts - The hook for getting internalAccount objects for all evm accounts.\n * @param getNonEvmAccountAddresses - The hook that returns the supported CAIP-10 account addresses for a non EVM scope.\n * addresses.\n * @returns True if every account in the scopes object is supported, false otherwise.\n */\nfunction isEveryAccountInScopesObjectSupported(\n scopesObject: InternalScopesObject,\n listAccounts: () => { type: string; address: Hex }[],\n getNonEvmAccountAddresses: (scope: CaipChainId) => string[],\n) {\n return Object.values(scopesObject).every((scopeObject) =>\n scopeObject.accounts.every((account) =>\n isSupportedAccount(account, {\n getEvmInternalAccounts: listAccounts,\n getNonEvmAccountAddresses,\n }),\n ),\n );\n}\n\n/**\n * Helper that returns a `authorizedScopes` CAIP-25 caveat specification\n * that can be passed into the PermissionController constructor.\n *\n * @param options - The specification builder options.\n * @param options.findNetworkClientIdByChainId - The hook for getting the networkClientId that serves a chainId.\n * @param options.listAccounts - The hook for getting internalAccount objects for all evm accounts.\n * @param options.isNonEvmScopeSupported - The hook that determines if an non EVM scopeString is supported.\n * @param options.getNonEvmAccountAddresses - The hook that returns the supported CAIP-10 account addresses for a non EVM scope.\n * @returns The specification for the `caip25` caveat.\n */\nexport const caip25CaveatBuilder = ({\n findNetworkClientIdByChainId,\n listAccounts,\n isNonEvmScopeSupported,\n getNonEvmAccountAddresses,\n}: Caip25EndowmentCaveatSpecificationBuilderOptions): EndowmentCaveatSpecificationConstraint &\n Required<\n Pick<EndowmentCaveatSpecificationConstraint, 'validator' | 'merger'>\n > => {\n return {\n type: Caip25CaveatType,\n validator: (\n caveat: { type: typeof Caip25CaveatType; value: unknown },\n _origin?: string,\n _target?: string,\n ) => {\n if (\n !caveat.value ||\n !hasProperty(caveat.value, 'requiredScopes') ||\n !hasProperty(caveat.value, 'optionalScopes') ||\n !hasProperty(caveat.value, 'isMultichainOrigin') ||\n !hasProperty(caveat.value, 'sessionProperties') ||\n typeof caveat.value.isMultichainOrigin !== 'boolean' ||\n !isObject(caveat.value.sessionProperties)\n ) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received invalid value for caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n\n const { requiredScopes, optionalScopes, sessionProperties } =\n caveat.value;\n\n const allSessionPropertiesSupported = Object.keys(\n sessionProperties,\n ).every((sessionProperty) => isSupportedSessionProperty(sessionProperty));\n\n if (!allSessionPropertiesSupported) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received unknown session property(s) for caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n\n assertIsInternalScopesObject(requiredScopes);\n assertIsInternalScopesObject(optionalScopes);\n\n const isEvmChainIdSupported = (chainId: Hex) => {\n try {\n findNetworkClientIdByChainId(chainId);\n return true;\n } catch {\n return false;\n }\n };\n\n const allRequiredScopesSupported = Object.keys(requiredScopes).every(\n (scopeString) =>\n isSupportedScopeString(scopeString, {\n isEvmChainIdSupported,\n isNonEvmScopeSupported,\n }),\n );\n const allOptionalScopesSupported = Object.keys(optionalScopes).every(\n (scopeString) =>\n isSupportedScopeString(scopeString, {\n isEvmChainIdSupported,\n isNonEvmScopeSupported,\n }),\n );\n if (!allRequiredScopesSupported || !allOptionalScopesSupported) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received scopeString value(s) for caveat of type \"${Caip25CaveatType}\" that are not supported by the wallet.`,\n );\n }\n\n const allRequiredAccountsSupported =\n isEveryAccountInScopesObjectSupported(\n requiredScopes,\n listAccounts,\n getNonEvmAccountAddresses,\n );\n const allOptionalAccountsSupported =\n isEveryAccountInScopesObjectSupported(\n optionalScopes,\n listAccounts,\n getNonEvmAccountAddresses,\n );\n if (!allRequiredAccountsSupported || !allOptionalAccountsSupported) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received account value(s) for caveat of type \"${Caip25CaveatType}\" that are not supported by the wallet.`,\n );\n }\n },\n merger: (\n leftValue: Caip25CaveatValue,\n rightValue: Caip25CaveatValue,\n ): [Caip25CaveatValue, Caip25CaveatValue] => {\n const mergedRequiredScopes = mergeInternalScopes(\n leftValue.requiredScopes,\n rightValue.requiredScopes,\n );\n const mergedOptionalScopes = mergeInternalScopes(\n leftValue.optionalScopes,\n rightValue.optionalScopes,\n );\n\n const mergedSessionProperties = {\n ...leftValue.sessionProperties,\n ...rightValue.sessionProperties,\n };\n\n const mergedValue: Caip25CaveatValue = {\n requiredScopes: mergedRequiredScopes,\n optionalScopes: mergedOptionalScopes,\n sessionProperties: mergedSessionProperties,\n isMultichainOrigin: leftValue.isMultichainOrigin,\n };\n\n const partialDiff = diffScopesForCaip25CaveatValue(\n leftValue,\n mergedValue,\n 'requiredScopes',\n );\n\n const diff = diffScopesForCaip25CaveatValue(\n partialDiff,\n mergedValue,\n 'optionalScopes',\n );\n\n return [mergedValue, diff];\n },\n };\n};\n\ntype Caip25EndowmentSpecification = ValidPermissionSpecification<{\n permissionType: PermissionType.Endowment;\n targetName: typeof Caip25EndowmentPermissionName;\n endowmentGetter: (_options?: EndowmentGetterParams) => null;\n validator: PermissionValidatorConstraint;\n allowedCaveats: Readonly<NonEmptyArray<string>> | null;\n}>;\n\n/**\n * Helper that returns a `endowment:caip25` specification that\n * can be passed into the PermissionController constructor.\n *\n * @returns The specification for the `caip25` endowment.\n */\nconst specificationBuilder: PermissionSpecificationBuilder<\n PermissionType.Endowment,\n Record<never, never>,\n Caip25EndowmentSpecification\n> = () => {\n return {\n permissionType: PermissionType.Endowment,\n targetName: Caip25EndowmentPermissionName,\n allowedCaveats: [Caip25CaveatType],\n endowmentGetter: (_getterOptions?: EndowmentGetterParams) => null,\n validator: (permission: PermissionConstraint) => {\n if (\n permission.caveats?.length !== 1 ||\n permission.caveats?.[0]?.type !== Caip25CaveatType\n ) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Invalid caveats. There must be a single caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n },\n };\n};\n\n/**\n * The `caip25` endowment specification builder. Passed to the\n * `PermissionController` for constructing and validating the\n * `endowment:caip25` permission.\n */\nexport const caip25EndowmentBuilder = Object.freeze({\n targetName: Caip25EndowmentPermissionName,\n specificationBuilder,\n} as const);\n\n/**\n * Factories that construct caveat mutator functions that are passed to\n * PermissionController.updatePermissionsByCaveat.\n */\nexport const Caip25CaveatMutators = {\n [Caip25CaveatType]: {\n removeScope,\n removeAccount,\n },\n};\n\n/**\n * Removes the account from the scope object.\n *\n * @param targetAddress - The address to remove from the scope object.\n * @returns A function that removes the account from the scope object.\n */\nfunction removeAccountFilterFn(targetAddress: string) {\n return (account: CaipAccountId) => {\n const parsed = parseCaipAccountId(account);\n return parsed.address !== targetAddress;\n };\n}\n\n/**\n * Removes the account from the scope object.\n *\n * @param scopeObject - The scope object to remove the account from.\n * @param targetAddress - The address to remove from the scope object.\n */\nfunction removeAccountFromScopeObject(\n scopeObject: InternalScopeObject,\n targetAddress: string,\n) {\n if (scopeObject.accounts) {\n scopeObject.accounts = scopeObject.accounts.filter(\n removeAccountFilterFn(targetAddress),\n );\n }\n}\n\n/**\n * Removes the target account from the scope object.\n *\n * @param caip25CaveatValue - The CAIP-25 permission caveat value from which to remove the account (across all chain scopes).\n * @param targetAddress - The address to remove from the scope object. Not a CAIP-10 formatted address because it will be removed across each chain scope.\n * @returns The updated scope object.\n */\nfunction removeAccount(\n caip25CaveatValue: Caip25CaveatValue,\n targetAddress: Hex,\n) {\n const updatedCaveatValue = cloneDeep(caip25CaveatValue);\n\n [\n updatedCaveatValue.requiredScopes,\n updatedCaveatValue.optionalScopes,\n ].forEach((scopes) => {\n Object.entries(scopes).forEach(([, scopeObject]) => {\n removeAccountFromScopeObject(scopeObject, targetAddress);\n });\n });\n\n const noChange = isEqual(updatedCaveatValue, caip25CaveatValue);\n\n if (noChange) {\n return {\n operation: CaveatMutatorOperation.Noop,\n };\n }\n\n const hasAccounts = [\n ...Object.values(updatedCaveatValue.requiredScopes),\n ...Object.values(updatedCaveatValue.optionalScopes),\n ].some(({ accounts }) => accounts.length > 0);\n\n if (hasAccounts) {\n return {\n operation: CaveatMutatorOperation.UpdateValue,\n value: updatedCaveatValue,\n };\n }\n\n return {\n operation: CaveatMutatorOperation.RevokePermission,\n };\n}\n\n/**\n * Removes the target scope from the value arrays of the given\n * `endowment:caip25` caveat. No-ops if the target scopeString is not in\n * the existing scopes.\n *\n * @param caip25CaveatValue - The CAIP-25 permission caveat value to remove the scope from.\n * @param targetScopeString - The scope that is being removed.\n * @returns The updated CAIP-25 permission caveat value.\n */\nfunction removeScope(\n caip25CaveatValue: Caip25CaveatValue,\n targetScopeString: ExternalScopeString,\n) {\n const newRequiredScopes = Object.entries(\n caip25CaveatValue.requiredScopes,\n ).filter(([scope]) => scope !== targetScopeString);\n const newOptionalScopes = Object.entries(\n caip25CaveatValue.optionalScopes,\n ).filter(([scope]) => {\n return scope !== targetScopeString;\n });\n\n const requiredScopesRemoved =\n newRequiredScopes.length !==\n Object.keys(caip25CaveatValue.requiredScopes).length;\n const optionalScopesRemoved =\n newOptionalScopes.length !==\n Object.keys(caip25CaveatValue.optionalScopes).length;\n\n if (!requiredScopesRemoved && !optionalScopesRemoved) {\n return {\n operation: CaveatMutatorOperation.Noop,\n };\n }\n\n const updatedCaveatValue = {\n ...caip25CaveatValue,\n requiredScopes: Object.fromEntries(newRequiredScopes),\n optionalScopes: Object.fromEntries(newOptionalScopes),\n };\n\n const hasNonWalletScopes = [...newRequiredScopes, ...newOptionalScopes].some(\n ([scopeString]) => {\n const { namespace } = parseScopeString(scopeString);\n return namespace !== KnownCaipNamespace.Wallet;\n },\n );\n\n if (hasNonWalletScopes) {\n return {\n operation: CaveatMutatorOperation.UpdateValue,\n value: updatedCaveatValue,\n };\n }\n\n return {\n operation: CaveatMutatorOperation.RevokePermission,\n };\n}\n\n\n/**\n* Modifies the requested CAIP-25 permissions object after UI confirmation.\n*\n* @param caip25CaveatValue - The requested CAIP-25 caveat value to modify.\n* @param accountAddresses - The list of permitted eth addresses.\n* @param chainIds - The list of permitted eth chainIds.\n*/\nexport const generateCaip25Caveat = (\n caip25CaveatValue: Caip25CaveatValue,\n accountAddresses: CaipAccountId[],\n chainIds: CaipChainId[],\n): {\n [Caip25EndowmentPermissionName]: {\n caveats: [{ type: string; value: Caip25CaveatValue }];\n };\n} => {\n const caveatValueWithChains = setPermittedChainIds(\n caip25CaveatValue,\n chainIds,\n );\n\n const caveatValueWithAccounts = setPermittedAccounts(\n caveatValueWithChains,\n accountAddresses,\n );\n\n return {\n [Caip25EndowmentPermissionName]: {\n caveats: [\n {\n type: Caip25CaveatType,\n value: caveatValueWithAccounts,\n },\n ],\n },\n };\n}\n"]}
1
+ {"version":3,"file":"caip25Permission.cjs","sourceRoot":"","sources":["../src/caip25Permission.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkClientId } from '@metamask/network-controller';\nimport type {\n PermissionSpecificationBuilder,\n EndowmentGetterParams,\n ValidPermissionSpecification,\n PermissionValidatorConstraint,\n PermissionConstraint,\n EndowmentCaveatSpecificationConstraint,\n} from '@metamask/permission-controller';\nimport {\n CaveatMutatorOperation,\n PermissionType,\n} from '@metamask/permission-controller';\nimport type { CaipAccountId, CaipChainId, Json } from '@metamask/utils';\nimport {\n hasProperty,\n KnownCaipNamespace,\n parseCaipAccountId,\n isObject,\n type Hex,\n type NonEmptyArray,\n} from '@metamask/utils';\nimport { cloneDeep, isEqual } from 'lodash';\n\nimport { setPermittedAccounts } from './adapters/caip-permission-adapter-accounts';\nimport { setPermittedChainIds } from './adapters/caip-permission-adapter-permittedChains';\nimport { assertIsInternalScopesObject } from './scope/assert';\nimport {\n isSupportedAccount,\n isSupportedScopeString,\n isSupportedSessionProperty,\n} from './scope/supported';\nimport { mergeInternalScopes } from './scope/transform';\nimport {\n parseScopeString,\n type ExternalScopeString,\n type InternalScopeObject,\n type InternalScopesObject,\n} from './scope/types';\n\n/**\n * The CAIP-25 permission caveat value.\n * This permission contains the required and optional scopes and session properties from the [CAIP-25](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-25.md) request that initiated the permission session.\n * It also contains a boolean (isMultichainOrigin) indicating if the permission session is multichain, which may be needed to determine implicit permissioning.\n */\nexport type Caip25CaveatValue = {\n requiredScopes: InternalScopesObject;\n optionalScopes: InternalScopesObject;\n sessionProperties: Record<string, Json>;\n isMultichainOrigin: boolean;\n};\n\n/**\n * The name of the CAIP-25 permission caveat.\n */\nexport const Caip25CaveatType = 'authorizedScopes';\n\n/**\n * The target name of the CAIP-25 endowment permission.\n */\nexport const Caip25EndowmentPermissionName = 'endowment:caip25';\n\n/**\n * Creates a CAIP-25 permission caveat.\n *\n * @param value - The CAIP-25 permission caveat value.\n * @returns The CAIP-25 permission caveat (now including the type).\n */\nexport const createCaip25Caveat = (value: Caip25CaveatValue) => {\n return {\n type: Caip25CaveatType,\n value,\n };\n};\n\ntype Caip25EndowmentCaveatSpecificationBuilderOptions = {\n findNetworkClientIdByChainId: (chainId: Hex) => NetworkClientId;\n listAccounts: () => { type: string; address: Hex }[];\n isNonEvmScopeSupported: (scope: CaipChainId) => boolean;\n getNonEvmAccountAddresses: (scope: CaipChainId) => string[];\n};\n\n/**\n * Calculates the difference between two provided CAIP-25 permission caveat values, but only considering a single scope property at a time.\n *\n * @param originalValue - The existing CAIP-25 permission caveat value.\n * @param mergedValue - The result from merging existing and incoming CAIP-25 permission caveat values.\n * @param scopeToDiff - The required or optional scopes from the [CAIP-25](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-25.md) request.\n * @returns The difference between original and merged CAIP-25 permission caveat values.\n */\nexport function diffScopesForCaip25CaveatValue(\n originalValue: Caip25CaveatValue,\n mergedValue: Caip25CaveatValue,\n scopeToDiff: 'optionalScopes' | 'requiredScopes',\n): Caip25CaveatValue {\n const diff = cloneDeep(originalValue);\n\n const mergedScopeToDiff = mergedValue[scopeToDiff];\n for (const [scopeString, mergedScopeObject] of Object.entries(\n mergedScopeToDiff,\n )) {\n const internalScopeString = scopeString as keyof typeof mergedScopeToDiff;\n const originalScopeObject = diff[scopeToDiff][internalScopeString];\n\n if (originalScopeObject) {\n const newAccounts = mergedScopeObject.accounts.filter(\n (account) => !originalScopeObject?.accounts.includes(account),\n );\n if (newAccounts.length > 0) {\n diff[scopeToDiff][internalScopeString] = {\n accounts: newAccounts,\n };\n continue;\n }\n delete diff[scopeToDiff][internalScopeString];\n } else {\n diff[scopeToDiff][internalScopeString] = mergedScopeObject;\n }\n }\n\n return diff;\n}\n\n/**\n * Checks if every account in the given scopes object is supported.\n *\n * @param scopesObject - The scopes object to iterate over.\n * @param listAccounts - The hook for getting internalAccount objects for all evm accounts.\n * @param getNonEvmAccountAddresses - The hook that returns the supported CAIP-10 account addresses for a non EVM scope.\n * addresses.\n * @returns True if every account in the scopes object is supported, false otherwise.\n */\nfunction isEveryAccountInScopesObjectSupported(\n scopesObject: InternalScopesObject,\n listAccounts: () => { type: string; address: Hex }[],\n getNonEvmAccountAddresses: (scope: CaipChainId) => string[],\n) {\n return Object.values(scopesObject).every((scopeObject) =>\n scopeObject.accounts.every((account) =>\n isSupportedAccount(account, {\n getEvmInternalAccounts: listAccounts,\n getNonEvmAccountAddresses,\n }),\n ),\n );\n}\n\n/**\n * Helper that returns a `authorizedScopes` CAIP-25 caveat specification\n * that can be passed into the PermissionController constructor.\n *\n * @param options - The specification builder options.\n * @param options.findNetworkClientIdByChainId - The hook for getting the networkClientId that serves a chainId.\n * @param options.listAccounts - The hook for getting internalAccount objects for all evm accounts.\n * @param options.isNonEvmScopeSupported - The hook that determines if an non EVM scopeString is supported.\n * @param options.getNonEvmAccountAddresses - The hook that returns the supported CAIP-10 account addresses for a non EVM scope.\n * @returns The specification for the `caip25` caveat.\n */\nexport const caip25CaveatBuilder = ({\n findNetworkClientIdByChainId,\n listAccounts,\n isNonEvmScopeSupported,\n getNonEvmAccountAddresses,\n}: Caip25EndowmentCaveatSpecificationBuilderOptions): EndowmentCaveatSpecificationConstraint &\n Required<\n Pick<EndowmentCaveatSpecificationConstraint, 'validator' | 'merger'>\n > => {\n return {\n type: Caip25CaveatType,\n validator: (\n caveat: { type: typeof Caip25CaveatType; value: unknown },\n _origin?: string,\n _target?: string,\n ) => {\n if (\n !caveat.value ||\n !hasProperty(caveat.value, 'requiredScopes') ||\n !hasProperty(caveat.value, 'optionalScopes') ||\n !hasProperty(caveat.value, 'isMultichainOrigin') ||\n !hasProperty(caveat.value, 'sessionProperties') ||\n typeof caveat.value.isMultichainOrigin !== 'boolean' ||\n !isObject(caveat.value.sessionProperties)\n ) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received invalid value for caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n\n const { requiredScopes, optionalScopes, sessionProperties } =\n caveat.value;\n\n const allSessionPropertiesSupported = Object.keys(\n sessionProperties,\n ).every((sessionProperty) => isSupportedSessionProperty(sessionProperty));\n\n if (!allSessionPropertiesSupported) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received unknown session property(s) for caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n\n assertIsInternalScopesObject(requiredScopes);\n assertIsInternalScopesObject(optionalScopes);\n\n if (\n Object.keys(requiredScopes).length === 0 &&\n Object.keys(optionalScopes).length === 0\n ) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received no scopes requested for caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n\n const isEvmChainIdSupported = (chainId: Hex) => {\n try {\n findNetworkClientIdByChainId(chainId);\n return true;\n } catch {\n return false;\n }\n };\n\n const allRequiredScopesSupported = Object.keys(requiredScopes).every(\n (scopeString) =>\n isSupportedScopeString(scopeString, {\n isEvmChainIdSupported,\n isNonEvmScopeSupported,\n }),\n );\n const allOptionalScopesSupported = Object.keys(optionalScopes).every(\n (scopeString) =>\n isSupportedScopeString(scopeString, {\n isEvmChainIdSupported,\n isNonEvmScopeSupported,\n }),\n );\n if (!allRequiredScopesSupported || !allOptionalScopesSupported) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received scopeString value(s) for caveat of type \"${Caip25CaveatType}\" that are not supported by the wallet.`,\n );\n }\n\n const allRequiredAccountsSupported =\n isEveryAccountInScopesObjectSupported(\n requiredScopes,\n listAccounts,\n getNonEvmAccountAddresses,\n );\n const allOptionalAccountsSupported =\n isEveryAccountInScopesObjectSupported(\n optionalScopes,\n listAccounts,\n getNonEvmAccountAddresses,\n );\n if (!allRequiredAccountsSupported || !allOptionalAccountsSupported) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received account value(s) for caveat of type \"${Caip25CaveatType}\" that are not supported by the wallet.`,\n );\n }\n },\n merger: (\n leftValue: Caip25CaveatValue,\n rightValue: Caip25CaveatValue,\n ): [Caip25CaveatValue, Caip25CaveatValue] => {\n const mergedRequiredScopes = mergeInternalScopes(\n leftValue.requiredScopes,\n rightValue.requiredScopes,\n );\n const mergedOptionalScopes = mergeInternalScopes(\n leftValue.optionalScopes,\n rightValue.optionalScopes,\n );\n\n const mergedSessionProperties = {\n ...leftValue.sessionProperties,\n ...rightValue.sessionProperties,\n };\n\n const mergedValue: Caip25CaveatValue = {\n requiredScopes: mergedRequiredScopes,\n optionalScopes: mergedOptionalScopes,\n sessionProperties: mergedSessionProperties,\n isMultichainOrigin: leftValue.isMultichainOrigin,\n };\n\n const partialDiff = diffScopesForCaip25CaveatValue(\n leftValue,\n mergedValue,\n 'requiredScopes',\n );\n\n const diff = diffScopesForCaip25CaveatValue(\n partialDiff,\n mergedValue,\n 'optionalScopes',\n );\n\n return [mergedValue, diff];\n },\n };\n};\n\ntype Caip25EndowmentSpecification = ValidPermissionSpecification<{\n permissionType: PermissionType.Endowment;\n targetName: typeof Caip25EndowmentPermissionName;\n endowmentGetter: (_options?: EndowmentGetterParams) => null;\n validator: PermissionValidatorConstraint;\n allowedCaveats: Readonly<NonEmptyArray<string>> | null;\n}>;\n\n/**\n * Helper that returns a `endowment:caip25` specification that\n * can be passed into the PermissionController constructor.\n *\n * @returns The specification for the `caip25` endowment.\n */\nconst specificationBuilder: PermissionSpecificationBuilder<\n PermissionType.Endowment,\n Record<never, never>,\n Caip25EndowmentSpecification\n> = () => {\n return {\n permissionType: PermissionType.Endowment,\n targetName: Caip25EndowmentPermissionName,\n allowedCaveats: [Caip25CaveatType],\n endowmentGetter: (_getterOptions?: EndowmentGetterParams) => null,\n validator: (permission: PermissionConstraint) => {\n if (\n permission.caveats?.length !== 1 ||\n permission.caveats?.[0]?.type !== Caip25CaveatType\n ) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Invalid caveats. There must be a single caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n },\n };\n};\n\n/**\n * The `caip25` endowment specification builder. Passed to the\n * `PermissionController` for constructing and validating the\n * `endowment:caip25` permission.\n */\nexport const caip25EndowmentBuilder = Object.freeze({\n targetName: Caip25EndowmentPermissionName,\n specificationBuilder,\n} as const);\n\n/**\n * Factories that construct caveat mutator functions that are passed to\n * PermissionController.updatePermissionsByCaveat.\n */\nexport const Caip25CaveatMutators = {\n [Caip25CaveatType]: {\n removeScope,\n removeAccount,\n },\n};\n\n/**\n * Removes the account from the scope object.\n *\n * @param targetAddress - The address to remove from the scope object.\n * @returns A function that removes the account from the scope object.\n */\nfunction removeAccountFilterFn(targetAddress: string) {\n return (account: CaipAccountId) => {\n const parsed = parseCaipAccountId(account);\n return parsed.address !== targetAddress;\n };\n}\n\n/**\n * Removes the account from the scope object.\n *\n * @param scopeObject - The scope object to remove the account from.\n * @param targetAddress - The address to remove from the scope object.\n */\nfunction removeAccountFromScopeObject(\n scopeObject: InternalScopeObject,\n targetAddress: string,\n) {\n if (scopeObject.accounts) {\n scopeObject.accounts = scopeObject.accounts.filter(\n removeAccountFilterFn(targetAddress),\n );\n }\n}\n\n/**\n * Removes the target account from the scope object.\n *\n * @param caip25CaveatValue - The CAIP-25 permission caveat value from which to remove the account (across all chain scopes).\n * @param targetAddress - The address to remove from the scope object. Not a CAIP-10 formatted address because it will be removed across each chain scope.\n * @returns The updated scope object.\n */\nfunction removeAccount(\n caip25CaveatValue: Caip25CaveatValue,\n targetAddress: Hex,\n) {\n const updatedCaveatValue = cloneDeep(caip25CaveatValue);\n\n [\n updatedCaveatValue.requiredScopes,\n updatedCaveatValue.optionalScopes,\n ].forEach((scopes) => {\n Object.entries(scopes).forEach(([, scopeObject]) => {\n removeAccountFromScopeObject(scopeObject, targetAddress);\n });\n });\n\n const noChange = isEqual(updatedCaveatValue, caip25CaveatValue);\n\n if (noChange) {\n return {\n operation: CaveatMutatorOperation.Noop,\n };\n }\n\n const hasAccounts = [\n ...Object.values(updatedCaveatValue.requiredScopes),\n ...Object.values(updatedCaveatValue.optionalScopes),\n ].some(({ accounts }) => accounts.length > 0);\n\n if (hasAccounts) {\n return {\n operation: CaveatMutatorOperation.UpdateValue,\n value: updatedCaveatValue,\n };\n }\n\n return {\n operation: CaveatMutatorOperation.RevokePermission,\n };\n}\n\n/**\n * Removes the target scope from the value arrays of the given\n * `endowment:caip25` caveat. No-ops if the target scopeString is not in\n * the existing scopes.\n *\n * @param caip25CaveatValue - The CAIP-25 permission caveat value to remove the scope from.\n * @param targetScopeString - The scope that is being removed.\n * @returns The updated CAIP-25 permission caveat value.\n */\nfunction removeScope(\n caip25CaveatValue: Caip25CaveatValue,\n targetScopeString: ExternalScopeString,\n) {\n const newRequiredScopes = Object.entries(\n caip25CaveatValue.requiredScopes,\n ).filter(([scope]) => scope !== targetScopeString);\n const newOptionalScopes = Object.entries(\n caip25CaveatValue.optionalScopes,\n ).filter(([scope]) => {\n return scope !== targetScopeString;\n });\n\n const requiredScopesRemoved =\n newRequiredScopes.length !==\n Object.keys(caip25CaveatValue.requiredScopes).length;\n const optionalScopesRemoved =\n newOptionalScopes.length !==\n Object.keys(caip25CaveatValue.optionalScopes).length;\n\n if (!requiredScopesRemoved && !optionalScopesRemoved) {\n return {\n operation: CaveatMutatorOperation.Noop,\n };\n }\n\n const updatedCaveatValue = {\n ...caip25CaveatValue,\n requiredScopes: Object.fromEntries(newRequiredScopes),\n optionalScopes: Object.fromEntries(newOptionalScopes),\n };\n\n const hasNonWalletScopes = [...newRequiredScopes, ...newOptionalScopes].some(\n ([scopeString]) => {\n const { namespace } = parseScopeString(scopeString);\n return namespace !== KnownCaipNamespace.Wallet;\n },\n );\n\n if (hasNonWalletScopes) {\n return {\n operation: CaveatMutatorOperation.UpdateValue,\n value: updatedCaveatValue,\n };\n }\n\n return {\n operation: CaveatMutatorOperation.RevokePermission,\n };\n}\n\n/**\n * Modifies the requested CAIP-25 permissions object after UI confirmation.\n *\n * @param caip25CaveatValue - The requested CAIP-25 caveat value to modify.\n * @param accountAddresses - The list of permitted eth addresses.\n * @param chainIds - The list of permitted eth chainIds.\n * @returns The updated CAIP-25 caveat value with the permitted accounts and chainIds set.\n */\nexport const generateCaip25Caveat = (\n caip25CaveatValue: Caip25CaveatValue,\n accountAddresses: CaipAccountId[],\n chainIds: CaipChainId[],\n): {\n [Caip25EndowmentPermissionName]: {\n caveats: [{ type: string; value: Caip25CaveatValue }];\n };\n} => {\n const caveatValueWithChains = setPermittedChainIds(\n caip25CaveatValue,\n chainIds,\n );\n\n const caveatValueWithAccounts = setPermittedAccounts(\n caveatValueWithChains,\n accountAddresses,\n );\n\n return {\n [Caip25EndowmentPermissionName]: {\n caveats: [\n {\n type: Caip25CaveatType,\n value: caveatValueWithAccounts,\n },\n ],\n },\n };\n};\n"]}
@@ -128,12 +128,13 @@ declare function removeScope(caip25CaveatValue: Caip25CaveatValue, targetScopeSt
128
128
  };
129
129
  };
130
130
  /**
131
- * Modifies the requested CAIP-25 permissions object after UI confirmation.
132
- *
133
- * @param caip25CaveatValue - The requested CAIP-25 caveat value to modify.
134
- * @param accountAddresses - The list of permitted eth addresses.
135
- * @param chainIds - The list of permitted eth chainIds.
136
- */
131
+ * Modifies the requested CAIP-25 permissions object after UI confirmation.
132
+ *
133
+ * @param caip25CaveatValue - The requested CAIP-25 caveat value to modify.
134
+ * @param accountAddresses - The list of permitted eth addresses.
135
+ * @param chainIds - The list of permitted eth chainIds.
136
+ * @returns The updated CAIP-25 caveat value with the permitted accounts and chainIds set.
137
+ */
137
138
  export declare const generateCaip25Caveat: (caip25CaveatValue: Caip25CaveatValue, accountAddresses: CaipAccountId[], chainIds: CaipChainId[]) => {
138
139
  [Caip25EndowmentPermissionName]: {
139
140
  caveats: [{
@@ -1 +1 @@
1
- {"version":3,"file":"caip25Permission.d.cts","sourceRoot":"","sources":["../src/caip25Permission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AACpE,OAAO,KAAK,EACV,8BAA8B,EAC9B,qBAAqB,EAErB,6BAA6B,EAE7B,sCAAsC,EACvC,wCAAwC;AACzC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACf,wCAAwC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB;AACxE,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,aAAa,EACnB,wBAAwB;AAUzB,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,0BAAsB;AAIvB;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,oBAAoB,CAAC;IACrC,cAAc,EAAE,oBAAoB,CAAC;IACrC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,6BAA6B,qBAAqB,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,UAAW,iBAAiB;;;CAK1D,CAAC;AAEF,KAAK,gDAAgD,GAAG;IACtD,4BAA4B,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,eAAe,CAAC;IAChE,YAAY,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,EAAE,CAAC;IACrD,sBAAsB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;IACxD,yBAAyB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,EAAE,CAAC;CAC7D,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,iBAAiB,EAChC,WAAW,EAAE,iBAAiB,EAC9B,WAAW,EAAE,gBAAgB,GAAG,gBAAgB,GAC/C,iBAAiB,CA2BnB;AA0BD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,uGAK7B,gDAAgD,KAAG,sCAAsC,GAC1F,SACE,KAAK,sCAAsC,EAAE,WAAW,GAAG,QAAQ,CAAC,CA8HvE,CAAC;AAuCF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;wBAzCjB,eAAe,SAAS;oBAC5B,oCAAoC;qCACnB,qBAAqB,KAAK,IAAI;mBAChD,6BAA6B;wBACxB,SAAS,cAAc,MAAM,CAAC,CAAC,GAAG,IAAI;;EAwC7C,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;CAKhC,CAAC;AAgCF;;;;;;GAMG;AACH,iBAAS,aAAa,CACpB,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,GAAG;;;;;;EAoCnB;AAED;;;;;;;;GAQG;AACH,iBAAS,WAAW,CAClB,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,mBAAmB;;;;;;;;;;;;;;;EA+CvC;AAGD;;;;;;EAME;AACF,eAAO,MAAM,oBAAoB,sBACZ,iBAAiB,oBAClB,aAAa,EAAE,YACvB,WAAW,EAAE,KACtB;IACD,+BAA+B,EAAE;QAC/B,OAAO,EAAE,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,iBAAiB,CAAA;SAAE,CAAC,CAAC;KACvD,CAAC;CAsBH,CAAA"}
1
+ {"version":3,"file":"caip25Permission.d.cts","sourceRoot":"","sources":["../src/caip25Permission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AACpE,OAAO,KAAK,EACV,8BAA8B,EAC9B,qBAAqB,EAErB,6BAA6B,EAE7B,sCAAsC,EACvC,wCAAwC;AACzC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACf,wCAAwC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB;AACxE,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,aAAa,EACnB,wBAAwB;AAYzB,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,0BAAsB;AAEvB;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,oBAAoB,CAAC;IACrC,cAAc,EAAE,oBAAoB,CAAC;IACrC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,6BAA6B,qBAAqB,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,UAAW,iBAAiB;;;CAK1D,CAAC;AAEF,KAAK,gDAAgD,GAAG;IACtD,4BAA4B,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,eAAe,CAAC;IAChE,YAAY,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,EAAE,CAAC;IACrD,sBAAsB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;IACxD,yBAAyB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,EAAE,CAAC;CAC7D,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,iBAAiB,EAChC,WAAW,EAAE,iBAAiB,EAC9B,WAAW,EAAE,gBAAgB,GAAG,gBAAgB,GAC/C,iBAAiB,CA2BnB;AA0BD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,uGAK7B,gDAAgD,KAAG,sCAAsC,GAC1F,SACE,KAAK,sCAAsC,EAAE,WAAW,GAAG,QAAQ,CAAC,CAuIvE,CAAC;AAuCF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;wBAzCjB,eAAe,SAAS;oBAC5B,oCAAoC;qCACnB,qBAAqB,KAAK,IAAI;mBAChD,6BAA6B;wBACxB,SAAS,cAAc,MAAM,CAAC,CAAC,GAAG,IAAI;;EAwC7C,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;CAKhC,CAAC;AAgCF;;;;;;GAMG;AACH,iBAAS,aAAa,CACpB,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,GAAG;;;;;;EAoCnB;AAED;;;;;;;;GAQG;AACH,iBAAS,WAAW,CAClB,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,mBAAmB;;;;;;;;;;;;;;;EA+CvC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,sBACZ,iBAAiB,oBAClB,aAAa,EAAE,YACvB,WAAW,EAAE,KACtB;IACD,+BAA+B,EAAE;QAC/B,OAAO,EAAE,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,iBAAiB,CAAA;SAAE,CAAC,CAAC;KACvD,CAAC;CAsBH,CAAC"}
@@ -128,12 +128,13 @@ declare function removeScope(caip25CaveatValue: Caip25CaveatValue, targetScopeSt
128
128
  };
129
129
  };
130
130
  /**
131
- * Modifies the requested CAIP-25 permissions object after UI confirmation.
132
- *
133
- * @param caip25CaveatValue - The requested CAIP-25 caveat value to modify.
134
- * @param accountAddresses - The list of permitted eth addresses.
135
- * @param chainIds - The list of permitted eth chainIds.
136
- */
131
+ * Modifies the requested CAIP-25 permissions object after UI confirmation.
132
+ *
133
+ * @param caip25CaveatValue - The requested CAIP-25 caveat value to modify.
134
+ * @param accountAddresses - The list of permitted eth addresses.
135
+ * @param chainIds - The list of permitted eth chainIds.
136
+ * @returns The updated CAIP-25 caveat value with the permitted accounts and chainIds set.
137
+ */
137
138
  export declare const generateCaip25Caveat: (caip25CaveatValue: Caip25CaveatValue, accountAddresses: CaipAccountId[], chainIds: CaipChainId[]) => {
138
139
  [Caip25EndowmentPermissionName]: {
139
140
  caveats: [{
@@ -1 +1 @@
1
- {"version":3,"file":"caip25Permission.d.mts","sourceRoot":"","sources":["../src/caip25Permission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AACpE,OAAO,KAAK,EACV,8BAA8B,EAC9B,qBAAqB,EAErB,6BAA6B,EAE7B,sCAAsC,EACvC,wCAAwC;AACzC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACf,wCAAwC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB;AACxE,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,aAAa,EACnB,wBAAwB;AAUzB,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,0BAAsB;AAIvB;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,oBAAoB,CAAC;IACrC,cAAc,EAAE,oBAAoB,CAAC;IACrC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,6BAA6B,qBAAqB,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,UAAW,iBAAiB;;;CAK1D,CAAC;AAEF,KAAK,gDAAgD,GAAG;IACtD,4BAA4B,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,eAAe,CAAC;IAChE,YAAY,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,EAAE,CAAC;IACrD,sBAAsB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;IACxD,yBAAyB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,EAAE,CAAC;CAC7D,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,iBAAiB,EAChC,WAAW,EAAE,iBAAiB,EAC9B,WAAW,EAAE,gBAAgB,GAAG,gBAAgB,GAC/C,iBAAiB,CA2BnB;AA0BD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,uGAK7B,gDAAgD,KAAG,sCAAsC,GAC1F,SACE,KAAK,sCAAsC,EAAE,WAAW,GAAG,QAAQ,CAAC,CA8HvE,CAAC;AAuCF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;wBAzCjB,eAAe,SAAS;oBAC5B,oCAAoC;qCACnB,qBAAqB,KAAK,IAAI;mBAChD,6BAA6B;wBACxB,SAAS,cAAc,MAAM,CAAC,CAAC,GAAG,IAAI;;EAwC7C,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;CAKhC,CAAC;AAgCF;;;;;;GAMG;AACH,iBAAS,aAAa,CACpB,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,GAAG;;;;;;EAoCnB;AAED;;;;;;;;GAQG;AACH,iBAAS,WAAW,CAClB,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,mBAAmB;;;;;;;;;;;;;;;EA+CvC;AAGD;;;;;;EAME;AACF,eAAO,MAAM,oBAAoB,sBACZ,iBAAiB,oBAClB,aAAa,EAAE,YACvB,WAAW,EAAE,KACtB;IACD,+BAA+B,EAAE;QAC/B,OAAO,EAAE,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,iBAAiB,CAAA;SAAE,CAAC,CAAC;KACvD,CAAC;CAsBH,CAAA"}
1
+ {"version":3,"file":"caip25Permission.d.mts","sourceRoot":"","sources":["../src/caip25Permission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,qCAAqC;AACpE,OAAO,KAAK,EACV,8BAA8B,EAC9B,qBAAqB,EAErB,6BAA6B,EAE7B,sCAAsC,EACvC,wCAAwC;AACzC,OAAO,EACL,sBAAsB,EACtB,cAAc,EACf,wCAAwC;AACzC,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,wBAAwB;AACxE,OAAO,EAKL,KAAK,GAAG,EACR,KAAK,aAAa,EACnB,wBAAwB;AAYzB,OAAO,EAEL,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,0BAAsB;AAEvB;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,cAAc,EAAE,oBAAoB,CAAC;IACrC,cAAc,EAAE,oBAAoB,CAAC;IACrC,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACxC,kBAAkB,EAAE,OAAO,CAAC;CAC7B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,gBAAgB,qBAAqB,CAAC;AAEnD;;GAEG;AACH,eAAO,MAAM,6BAA6B,qBAAqB,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,UAAW,iBAAiB;;;CAK1D,CAAC;AAEF,KAAK,gDAAgD,GAAG;IACtD,4BAA4B,EAAE,CAAC,OAAO,EAAE,GAAG,KAAK,eAAe,CAAC;IAChE,YAAY,EAAE,MAAM;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,GAAG,CAAA;KAAE,EAAE,CAAC;IACrD,sBAAsB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;IACxD,yBAAyB,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,MAAM,EAAE,CAAC;CAC7D,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,8BAA8B,CAC5C,aAAa,EAAE,iBAAiB,EAChC,WAAW,EAAE,iBAAiB,EAC9B,WAAW,EAAE,gBAAgB,GAAG,gBAAgB,GAC/C,iBAAiB,CA2BnB;AA0BD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,mBAAmB,uGAK7B,gDAAgD,KAAG,sCAAsC,GAC1F,SACE,KAAK,sCAAsC,EAAE,WAAW,GAAG,QAAQ,CAAC,CAuIvE,CAAC;AAuCF;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;wBAzCjB,eAAe,SAAS;oBAC5B,oCAAoC;qCACnB,qBAAqB,KAAK,IAAI;mBAChD,6BAA6B;wBACxB,SAAS,cAAc,MAAM,CAAC,CAAC,GAAG,IAAI;;EAwC7C,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;CAKhC,CAAC;AAgCF;;;;;;GAMG;AACH,iBAAS,aAAa,CACpB,iBAAiB,EAAE,iBAAiB,EACpC,aAAa,EAAE,GAAG;;;;;;EAoCnB;AAED;;;;;;;;GAQG;AACH,iBAAS,WAAW,CAClB,iBAAiB,EAAE,iBAAiB,EACpC,iBAAiB,EAAE,mBAAmB;;;;;;;;;;;;;;;EA+CvC;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,sBACZ,iBAAiB,oBAClB,aAAa,EAAE,YACvB,WAAW,EAAE,KACtB;IACD,+BAA+B,EAAE;QAC/B,OAAO,EAAE,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,iBAAiB,CAAA;SAAE,CAAC,CAAC;KACvD,CAAC;CAsBH,CAAC"}
@@ -2,12 +2,12 @@ import { CaveatMutatorOperation, PermissionType } from "@metamask/permission-con
2
2
  import { hasProperty, KnownCaipNamespace, parseCaipAccountId, isObject } from "@metamask/utils";
3
3
  import $lodash from "lodash";
4
4
  const { cloneDeep, isEqual } = $lodash;
5
+ import { setPermittedAccounts } from "./adapters/caip-permission-adapter-accounts.mjs";
6
+ import { setPermittedChainIds } from "./adapters/caip-permission-adapter-permittedChains.mjs";
5
7
  import { assertIsInternalScopesObject } from "./scope/assert.mjs";
6
8
  import { isSupportedAccount, isSupportedScopeString, isSupportedSessionProperty } from "./scope/supported.mjs";
7
9
  import { mergeInternalScopes } from "./scope/transform.mjs";
8
10
  import { parseScopeString } from "./scope/types.mjs";
9
- import { setPermittedChainIds } from "./adapters/caip-permission-adapter-permittedChains.mjs";
10
- import { setPermittedAccounts } from "./adapters/caip-permission-adapter-accounts.mjs";
11
11
  /**
12
12
  * The name of the CAIP-25 permission caveat.
13
13
  */
@@ -104,6 +104,10 @@ export const caip25CaveatBuilder = ({ findNetworkClientIdByChainId, listAccounts
104
104
  }
105
105
  assertIsInternalScopesObject(requiredScopes);
106
106
  assertIsInternalScopesObject(optionalScopes);
107
+ if (Object.keys(requiredScopes).length === 0 &&
108
+ Object.keys(optionalScopes).length === 0) {
109
+ throw new Error(`${Caip25EndowmentPermissionName} error: Received no scopes requested for caveat of type "${Caip25CaveatType}".`);
110
+ }
107
111
  const isEvmChainIdSupported = (chainId) => {
108
112
  try {
109
113
  findNetworkClientIdByChainId(chainId);
@@ -291,12 +295,13 @@ function removeScope(caip25CaveatValue, targetScopeString) {
291
295
  };
292
296
  }
293
297
  /**
294
- * Modifies the requested CAIP-25 permissions object after UI confirmation.
295
- *
296
- * @param caip25CaveatValue - The requested CAIP-25 caveat value to modify.
297
- * @param accountAddresses - The list of permitted eth addresses.
298
- * @param chainIds - The list of permitted eth chainIds.
299
- */
298
+ * Modifies the requested CAIP-25 permissions object after UI confirmation.
299
+ *
300
+ * @param caip25CaveatValue - The requested CAIP-25 caveat value to modify.
301
+ * @param accountAddresses - The list of permitted eth addresses.
302
+ * @param chainIds - The list of permitted eth chainIds.
303
+ * @returns The updated CAIP-25 caveat value with the permitted accounts and chainIds set.
304
+ */
300
305
  export const generateCaip25Caveat = (caip25CaveatValue, accountAddresses, chainIds) => {
301
306
  const caveatValueWithChains = setPermittedChainIds(caip25CaveatValue, chainIds);
302
307
  const caveatValueWithAccounts = setPermittedAccounts(caveatValueWithChains, accountAddresses);
@@ -1 +1 @@
1
- {"version":3,"file":"caip25Permission.mjs","sourceRoot":"","sources":["../src/caip25Permission.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkClientId } from '@metamask/network-controller';\nimport type {\n PermissionSpecificationBuilder,\n EndowmentGetterParams,\n ValidPermissionSpecification,\n PermissionValidatorConstraint,\n PermissionConstraint,\n EndowmentCaveatSpecificationConstraint,\n} from '@metamask/permission-controller';\nimport {\n CaveatMutatorOperation,\n PermissionType,\n} from '@metamask/permission-controller';\nimport type { CaipAccountId, CaipChainId, Json } from '@metamask/utils';\nimport {\n hasProperty,\n KnownCaipNamespace,\n parseCaipAccountId,\n isObject,\n type Hex,\n type NonEmptyArray,\n} from '@metamask/utils';\nimport { cloneDeep, isEqual } from 'lodash';\n\nimport { assertIsInternalScopesObject } from './scope/assert';\nimport {\n isSupportedAccount,\n isSupportedScopeString,\n isSupportedSessionProperty,\n} from './scope/supported';\nimport { mergeInternalScopes } from './scope/transform';\nimport {\n parseScopeString,\n type ExternalScopeString,\n type InternalScopeObject,\n type InternalScopesObject,\n} from './scope/types';\nimport { setPermittedChainIds } from './adapters/caip-permission-adapter-permittedChains';\nimport { setPermittedAccounts } from './adapters/caip-permission-adapter-accounts';\n\n/**\n * The CAIP-25 permission caveat value.\n * This permission contains the required and optional scopes and session properties from the [CAIP-25](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-25.md) request that initiated the permission session.\n * It also contains a boolean (isMultichainOrigin) indicating if the permission session is multichain, which may be needed to determine implicit permissioning.\n */\nexport type Caip25CaveatValue = {\n requiredScopes: InternalScopesObject;\n optionalScopes: InternalScopesObject;\n sessionProperties: Record<string, Json>;\n isMultichainOrigin: boolean;\n};\n\n/**\n * The name of the CAIP-25 permission caveat.\n */\nexport const Caip25CaveatType = 'authorizedScopes';\n\n/**\n * The target name of the CAIP-25 endowment permission.\n */\nexport const Caip25EndowmentPermissionName = 'endowment:caip25';\n\n/**\n * Creates a CAIP-25 permission caveat.\n *\n * @param value - The CAIP-25 permission caveat value.\n * @returns The CAIP-25 permission caveat (now including the type).\n */\nexport const createCaip25Caveat = (value: Caip25CaveatValue) => {\n return {\n type: Caip25CaveatType,\n value,\n };\n};\n\ntype Caip25EndowmentCaveatSpecificationBuilderOptions = {\n findNetworkClientIdByChainId: (chainId: Hex) => NetworkClientId;\n listAccounts: () => { type: string; address: Hex }[];\n isNonEvmScopeSupported: (scope: CaipChainId) => boolean;\n getNonEvmAccountAddresses: (scope: CaipChainId) => string[];\n};\n\n/**\n * Calculates the difference between two provided CAIP-25 permission caveat values, but only considering a single scope property at a time.\n *\n * @param originalValue - The existing CAIP-25 permission caveat value.\n * @param mergedValue - The result from merging existing and incoming CAIP-25 permission caveat values.\n * @param scopeToDiff - The required or optional scopes from the [CAIP-25](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-25.md) request.\n * @returns The difference between original and merged CAIP-25 permission caveat values.\n */\nexport function diffScopesForCaip25CaveatValue(\n originalValue: Caip25CaveatValue,\n mergedValue: Caip25CaveatValue,\n scopeToDiff: 'optionalScopes' | 'requiredScopes',\n): Caip25CaveatValue {\n const diff = cloneDeep(originalValue);\n\n const mergedScopeToDiff = mergedValue[scopeToDiff];\n for (const [scopeString, mergedScopeObject] of Object.entries(\n mergedScopeToDiff,\n )) {\n const internalScopeString = scopeString as keyof typeof mergedScopeToDiff;\n const originalScopeObject = diff[scopeToDiff][internalScopeString];\n\n if (originalScopeObject) {\n const newAccounts = mergedScopeObject.accounts.filter(\n (account) => !originalScopeObject?.accounts.includes(account),\n );\n if (newAccounts.length > 0) {\n diff[scopeToDiff][internalScopeString] = {\n accounts: newAccounts,\n };\n continue;\n }\n delete diff[scopeToDiff][internalScopeString];\n } else {\n diff[scopeToDiff][internalScopeString] = mergedScopeObject;\n }\n }\n\n return diff;\n}\n\n/**\n * Checks if every account in the given scopes object is supported.\n *\n * @param scopesObject - The scopes object to iterate over.\n * @param listAccounts - The hook for getting internalAccount objects for all evm accounts.\n * @param getNonEvmAccountAddresses - The hook that returns the supported CAIP-10 account addresses for a non EVM scope.\n * addresses.\n * @returns True if every account in the scopes object is supported, false otherwise.\n */\nfunction isEveryAccountInScopesObjectSupported(\n scopesObject: InternalScopesObject,\n listAccounts: () => { type: string; address: Hex }[],\n getNonEvmAccountAddresses: (scope: CaipChainId) => string[],\n) {\n return Object.values(scopesObject).every((scopeObject) =>\n scopeObject.accounts.every((account) =>\n isSupportedAccount(account, {\n getEvmInternalAccounts: listAccounts,\n getNonEvmAccountAddresses,\n }),\n ),\n );\n}\n\n/**\n * Helper that returns a `authorizedScopes` CAIP-25 caveat specification\n * that can be passed into the PermissionController constructor.\n *\n * @param options - The specification builder options.\n * @param options.findNetworkClientIdByChainId - The hook for getting the networkClientId that serves a chainId.\n * @param options.listAccounts - The hook for getting internalAccount objects for all evm accounts.\n * @param options.isNonEvmScopeSupported - The hook that determines if an non EVM scopeString is supported.\n * @param options.getNonEvmAccountAddresses - The hook that returns the supported CAIP-10 account addresses for a non EVM scope.\n * @returns The specification for the `caip25` caveat.\n */\nexport const caip25CaveatBuilder = ({\n findNetworkClientIdByChainId,\n listAccounts,\n isNonEvmScopeSupported,\n getNonEvmAccountAddresses,\n}: Caip25EndowmentCaveatSpecificationBuilderOptions): EndowmentCaveatSpecificationConstraint &\n Required<\n Pick<EndowmentCaveatSpecificationConstraint, 'validator' | 'merger'>\n > => {\n return {\n type: Caip25CaveatType,\n validator: (\n caveat: { type: typeof Caip25CaveatType; value: unknown },\n _origin?: string,\n _target?: string,\n ) => {\n if (\n !caveat.value ||\n !hasProperty(caveat.value, 'requiredScopes') ||\n !hasProperty(caveat.value, 'optionalScopes') ||\n !hasProperty(caveat.value, 'isMultichainOrigin') ||\n !hasProperty(caveat.value, 'sessionProperties') ||\n typeof caveat.value.isMultichainOrigin !== 'boolean' ||\n !isObject(caveat.value.sessionProperties)\n ) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received invalid value for caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n\n const { requiredScopes, optionalScopes, sessionProperties } =\n caveat.value;\n\n const allSessionPropertiesSupported = Object.keys(\n sessionProperties,\n ).every((sessionProperty) => isSupportedSessionProperty(sessionProperty));\n\n if (!allSessionPropertiesSupported) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received unknown session property(s) for caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n\n assertIsInternalScopesObject(requiredScopes);\n assertIsInternalScopesObject(optionalScopes);\n\n const isEvmChainIdSupported = (chainId: Hex) => {\n try {\n findNetworkClientIdByChainId(chainId);\n return true;\n } catch {\n return false;\n }\n };\n\n const allRequiredScopesSupported = Object.keys(requiredScopes).every(\n (scopeString) =>\n isSupportedScopeString(scopeString, {\n isEvmChainIdSupported,\n isNonEvmScopeSupported,\n }),\n );\n const allOptionalScopesSupported = Object.keys(optionalScopes).every(\n (scopeString) =>\n isSupportedScopeString(scopeString, {\n isEvmChainIdSupported,\n isNonEvmScopeSupported,\n }),\n );\n if (!allRequiredScopesSupported || !allOptionalScopesSupported) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received scopeString value(s) for caveat of type \"${Caip25CaveatType}\" that are not supported by the wallet.`,\n );\n }\n\n const allRequiredAccountsSupported =\n isEveryAccountInScopesObjectSupported(\n requiredScopes,\n listAccounts,\n getNonEvmAccountAddresses,\n );\n const allOptionalAccountsSupported =\n isEveryAccountInScopesObjectSupported(\n optionalScopes,\n listAccounts,\n getNonEvmAccountAddresses,\n );\n if (!allRequiredAccountsSupported || !allOptionalAccountsSupported) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received account value(s) for caveat of type \"${Caip25CaveatType}\" that are not supported by the wallet.`,\n );\n }\n },\n merger: (\n leftValue: Caip25CaveatValue,\n rightValue: Caip25CaveatValue,\n ): [Caip25CaveatValue, Caip25CaveatValue] => {\n const mergedRequiredScopes = mergeInternalScopes(\n leftValue.requiredScopes,\n rightValue.requiredScopes,\n );\n const mergedOptionalScopes = mergeInternalScopes(\n leftValue.optionalScopes,\n rightValue.optionalScopes,\n );\n\n const mergedSessionProperties = {\n ...leftValue.sessionProperties,\n ...rightValue.sessionProperties,\n };\n\n const mergedValue: Caip25CaveatValue = {\n requiredScopes: mergedRequiredScopes,\n optionalScopes: mergedOptionalScopes,\n sessionProperties: mergedSessionProperties,\n isMultichainOrigin: leftValue.isMultichainOrigin,\n };\n\n const partialDiff = diffScopesForCaip25CaveatValue(\n leftValue,\n mergedValue,\n 'requiredScopes',\n );\n\n const diff = diffScopesForCaip25CaveatValue(\n partialDiff,\n mergedValue,\n 'optionalScopes',\n );\n\n return [mergedValue, diff];\n },\n };\n};\n\ntype Caip25EndowmentSpecification = ValidPermissionSpecification<{\n permissionType: PermissionType.Endowment;\n targetName: typeof Caip25EndowmentPermissionName;\n endowmentGetter: (_options?: EndowmentGetterParams) => null;\n validator: PermissionValidatorConstraint;\n allowedCaveats: Readonly<NonEmptyArray<string>> | null;\n}>;\n\n/**\n * Helper that returns a `endowment:caip25` specification that\n * can be passed into the PermissionController constructor.\n *\n * @returns The specification for the `caip25` endowment.\n */\nconst specificationBuilder: PermissionSpecificationBuilder<\n PermissionType.Endowment,\n Record<never, never>,\n Caip25EndowmentSpecification\n> = () => {\n return {\n permissionType: PermissionType.Endowment,\n targetName: Caip25EndowmentPermissionName,\n allowedCaveats: [Caip25CaveatType],\n endowmentGetter: (_getterOptions?: EndowmentGetterParams) => null,\n validator: (permission: PermissionConstraint) => {\n if (\n permission.caveats?.length !== 1 ||\n permission.caveats?.[0]?.type !== Caip25CaveatType\n ) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Invalid caveats. There must be a single caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n },\n };\n};\n\n/**\n * The `caip25` endowment specification builder. Passed to the\n * `PermissionController` for constructing and validating the\n * `endowment:caip25` permission.\n */\nexport const caip25EndowmentBuilder = Object.freeze({\n targetName: Caip25EndowmentPermissionName,\n specificationBuilder,\n} as const);\n\n/**\n * Factories that construct caveat mutator functions that are passed to\n * PermissionController.updatePermissionsByCaveat.\n */\nexport const Caip25CaveatMutators = {\n [Caip25CaveatType]: {\n removeScope,\n removeAccount,\n },\n};\n\n/**\n * Removes the account from the scope object.\n *\n * @param targetAddress - The address to remove from the scope object.\n * @returns A function that removes the account from the scope object.\n */\nfunction removeAccountFilterFn(targetAddress: string) {\n return (account: CaipAccountId) => {\n const parsed = parseCaipAccountId(account);\n return parsed.address !== targetAddress;\n };\n}\n\n/**\n * Removes the account from the scope object.\n *\n * @param scopeObject - The scope object to remove the account from.\n * @param targetAddress - The address to remove from the scope object.\n */\nfunction removeAccountFromScopeObject(\n scopeObject: InternalScopeObject,\n targetAddress: string,\n) {\n if (scopeObject.accounts) {\n scopeObject.accounts = scopeObject.accounts.filter(\n removeAccountFilterFn(targetAddress),\n );\n }\n}\n\n/**\n * Removes the target account from the scope object.\n *\n * @param caip25CaveatValue - The CAIP-25 permission caveat value from which to remove the account (across all chain scopes).\n * @param targetAddress - The address to remove from the scope object. Not a CAIP-10 formatted address because it will be removed across each chain scope.\n * @returns The updated scope object.\n */\nfunction removeAccount(\n caip25CaveatValue: Caip25CaveatValue,\n targetAddress: Hex,\n) {\n const updatedCaveatValue = cloneDeep(caip25CaveatValue);\n\n [\n updatedCaveatValue.requiredScopes,\n updatedCaveatValue.optionalScopes,\n ].forEach((scopes) => {\n Object.entries(scopes).forEach(([, scopeObject]) => {\n removeAccountFromScopeObject(scopeObject, targetAddress);\n });\n });\n\n const noChange = isEqual(updatedCaveatValue, caip25CaveatValue);\n\n if (noChange) {\n return {\n operation: CaveatMutatorOperation.Noop,\n };\n }\n\n const hasAccounts = [\n ...Object.values(updatedCaveatValue.requiredScopes),\n ...Object.values(updatedCaveatValue.optionalScopes),\n ].some(({ accounts }) => accounts.length > 0);\n\n if (hasAccounts) {\n return {\n operation: CaveatMutatorOperation.UpdateValue,\n value: updatedCaveatValue,\n };\n }\n\n return {\n operation: CaveatMutatorOperation.RevokePermission,\n };\n}\n\n/**\n * Removes the target scope from the value arrays of the given\n * `endowment:caip25` caveat. No-ops if the target scopeString is not in\n * the existing scopes.\n *\n * @param caip25CaveatValue - The CAIP-25 permission caveat value to remove the scope from.\n * @param targetScopeString - The scope that is being removed.\n * @returns The updated CAIP-25 permission caveat value.\n */\nfunction removeScope(\n caip25CaveatValue: Caip25CaveatValue,\n targetScopeString: ExternalScopeString,\n) {\n const newRequiredScopes = Object.entries(\n caip25CaveatValue.requiredScopes,\n ).filter(([scope]) => scope !== targetScopeString);\n const newOptionalScopes = Object.entries(\n caip25CaveatValue.optionalScopes,\n ).filter(([scope]) => {\n return scope !== targetScopeString;\n });\n\n const requiredScopesRemoved =\n newRequiredScopes.length !==\n Object.keys(caip25CaveatValue.requiredScopes).length;\n const optionalScopesRemoved =\n newOptionalScopes.length !==\n Object.keys(caip25CaveatValue.optionalScopes).length;\n\n if (!requiredScopesRemoved && !optionalScopesRemoved) {\n return {\n operation: CaveatMutatorOperation.Noop,\n };\n }\n\n const updatedCaveatValue = {\n ...caip25CaveatValue,\n requiredScopes: Object.fromEntries(newRequiredScopes),\n optionalScopes: Object.fromEntries(newOptionalScopes),\n };\n\n const hasNonWalletScopes = [...newRequiredScopes, ...newOptionalScopes].some(\n ([scopeString]) => {\n const { namespace } = parseScopeString(scopeString);\n return namespace !== KnownCaipNamespace.Wallet;\n },\n );\n\n if (hasNonWalletScopes) {\n return {\n operation: CaveatMutatorOperation.UpdateValue,\n value: updatedCaveatValue,\n };\n }\n\n return {\n operation: CaveatMutatorOperation.RevokePermission,\n };\n}\n\n\n/**\n* Modifies the requested CAIP-25 permissions object after UI confirmation.\n*\n* @param caip25CaveatValue - The requested CAIP-25 caveat value to modify.\n* @param accountAddresses - The list of permitted eth addresses.\n* @param chainIds - The list of permitted eth chainIds.\n*/\nexport const generateCaip25Caveat = (\n caip25CaveatValue: Caip25CaveatValue,\n accountAddresses: CaipAccountId[],\n chainIds: CaipChainId[],\n): {\n [Caip25EndowmentPermissionName]: {\n caveats: [{ type: string; value: Caip25CaveatValue }];\n };\n} => {\n const caveatValueWithChains = setPermittedChainIds(\n caip25CaveatValue,\n chainIds,\n );\n\n const caveatValueWithAccounts = setPermittedAccounts(\n caveatValueWithChains,\n accountAddresses,\n );\n\n return {\n [Caip25EndowmentPermissionName]: {\n caveats: [\n {\n type: Caip25CaveatType,\n value: caveatValueWithAccounts,\n },\n ],\n },\n };\n}\n"]}
1
+ {"version":3,"file":"caip25Permission.mjs","sourceRoot":"","sources":["../src/caip25Permission.ts"],"names":[],"mappings":"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","sourcesContent":["import type { NetworkClientId } from '@metamask/network-controller';\nimport type {\n PermissionSpecificationBuilder,\n EndowmentGetterParams,\n ValidPermissionSpecification,\n PermissionValidatorConstraint,\n PermissionConstraint,\n EndowmentCaveatSpecificationConstraint,\n} from '@metamask/permission-controller';\nimport {\n CaveatMutatorOperation,\n PermissionType,\n} from '@metamask/permission-controller';\nimport type { CaipAccountId, CaipChainId, Json } from '@metamask/utils';\nimport {\n hasProperty,\n KnownCaipNamespace,\n parseCaipAccountId,\n isObject,\n type Hex,\n type NonEmptyArray,\n} from '@metamask/utils';\nimport { cloneDeep, isEqual } from 'lodash';\n\nimport { setPermittedAccounts } from './adapters/caip-permission-adapter-accounts';\nimport { setPermittedChainIds } from './adapters/caip-permission-adapter-permittedChains';\nimport { assertIsInternalScopesObject } from './scope/assert';\nimport {\n isSupportedAccount,\n isSupportedScopeString,\n isSupportedSessionProperty,\n} from './scope/supported';\nimport { mergeInternalScopes } from './scope/transform';\nimport {\n parseScopeString,\n type ExternalScopeString,\n type InternalScopeObject,\n type InternalScopesObject,\n} from './scope/types';\n\n/**\n * The CAIP-25 permission caveat value.\n * This permission contains the required and optional scopes and session properties from the [CAIP-25](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-25.md) request that initiated the permission session.\n * It also contains a boolean (isMultichainOrigin) indicating if the permission session is multichain, which may be needed to determine implicit permissioning.\n */\nexport type Caip25CaveatValue = {\n requiredScopes: InternalScopesObject;\n optionalScopes: InternalScopesObject;\n sessionProperties: Record<string, Json>;\n isMultichainOrigin: boolean;\n};\n\n/**\n * The name of the CAIP-25 permission caveat.\n */\nexport const Caip25CaveatType = 'authorizedScopes';\n\n/**\n * The target name of the CAIP-25 endowment permission.\n */\nexport const Caip25EndowmentPermissionName = 'endowment:caip25';\n\n/**\n * Creates a CAIP-25 permission caveat.\n *\n * @param value - The CAIP-25 permission caveat value.\n * @returns The CAIP-25 permission caveat (now including the type).\n */\nexport const createCaip25Caveat = (value: Caip25CaveatValue) => {\n return {\n type: Caip25CaveatType,\n value,\n };\n};\n\ntype Caip25EndowmentCaveatSpecificationBuilderOptions = {\n findNetworkClientIdByChainId: (chainId: Hex) => NetworkClientId;\n listAccounts: () => { type: string; address: Hex }[];\n isNonEvmScopeSupported: (scope: CaipChainId) => boolean;\n getNonEvmAccountAddresses: (scope: CaipChainId) => string[];\n};\n\n/**\n * Calculates the difference between two provided CAIP-25 permission caveat values, but only considering a single scope property at a time.\n *\n * @param originalValue - The existing CAIP-25 permission caveat value.\n * @param mergedValue - The result from merging existing and incoming CAIP-25 permission caveat values.\n * @param scopeToDiff - The required or optional scopes from the [CAIP-25](https://github.com/ChainAgnostic/CAIPs/blob/main/CAIPs/caip-25.md) request.\n * @returns The difference between original and merged CAIP-25 permission caveat values.\n */\nexport function diffScopesForCaip25CaveatValue(\n originalValue: Caip25CaveatValue,\n mergedValue: Caip25CaveatValue,\n scopeToDiff: 'optionalScopes' | 'requiredScopes',\n): Caip25CaveatValue {\n const diff = cloneDeep(originalValue);\n\n const mergedScopeToDiff = mergedValue[scopeToDiff];\n for (const [scopeString, mergedScopeObject] of Object.entries(\n mergedScopeToDiff,\n )) {\n const internalScopeString = scopeString as keyof typeof mergedScopeToDiff;\n const originalScopeObject = diff[scopeToDiff][internalScopeString];\n\n if (originalScopeObject) {\n const newAccounts = mergedScopeObject.accounts.filter(\n (account) => !originalScopeObject?.accounts.includes(account),\n );\n if (newAccounts.length > 0) {\n diff[scopeToDiff][internalScopeString] = {\n accounts: newAccounts,\n };\n continue;\n }\n delete diff[scopeToDiff][internalScopeString];\n } else {\n diff[scopeToDiff][internalScopeString] = mergedScopeObject;\n }\n }\n\n return diff;\n}\n\n/**\n * Checks if every account in the given scopes object is supported.\n *\n * @param scopesObject - The scopes object to iterate over.\n * @param listAccounts - The hook for getting internalAccount objects for all evm accounts.\n * @param getNonEvmAccountAddresses - The hook that returns the supported CAIP-10 account addresses for a non EVM scope.\n * addresses.\n * @returns True if every account in the scopes object is supported, false otherwise.\n */\nfunction isEveryAccountInScopesObjectSupported(\n scopesObject: InternalScopesObject,\n listAccounts: () => { type: string; address: Hex }[],\n getNonEvmAccountAddresses: (scope: CaipChainId) => string[],\n) {\n return Object.values(scopesObject).every((scopeObject) =>\n scopeObject.accounts.every((account) =>\n isSupportedAccount(account, {\n getEvmInternalAccounts: listAccounts,\n getNonEvmAccountAddresses,\n }),\n ),\n );\n}\n\n/**\n * Helper that returns a `authorizedScopes` CAIP-25 caveat specification\n * that can be passed into the PermissionController constructor.\n *\n * @param options - The specification builder options.\n * @param options.findNetworkClientIdByChainId - The hook for getting the networkClientId that serves a chainId.\n * @param options.listAccounts - The hook for getting internalAccount objects for all evm accounts.\n * @param options.isNonEvmScopeSupported - The hook that determines if an non EVM scopeString is supported.\n * @param options.getNonEvmAccountAddresses - The hook that returns the supported CAIP-10 account addresses for a non EVM scope.\n * @returns The specification for the `caip25` caveat.\n */\nexport const caip25CaveatBuilder = ({\n findNetworkClientIdByChainId,\n listAccounts,\n isNonEvmScopeSupported,\n getNonEvmAccountAddresses,\n}: Caip25EndowmentCaveatSpecificationBuilderOptions): EndowmentCaveatSpecificationConstraint &\n Required<\n Pick<EndowmentCaveatSpecificationConstraint, 'validator' | 'merger'>\n > => {\n return {\n type: Caip25CaveatType,\n validator: (\n caveat: { type: typeof Caip25CaveatType; value: unknown },\n _origin?: string,\n _target?: string,\n ) => {\n if (\n !caveat.value ||\n !hasProperty(caveat.value, 'requiredScopes') ||\n !hasProperty(caveat.value, 'optionalScopes') ||\n !hasProperty(caveat.value, 'isMultichainOrigin') ||\n !hasProperty(caveat.value, 'sessionProperties') ||\n typeof caveat.value.isMultichainOrigin !== 'boolean' ||\n !isObject(caveat.value.sessionProperties)\n ) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received invalid value for caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n\n const { requiredScopes, optionalScopes, sessionProperties } =\n caveat.value;\n\n const allSessionPropertiesSupported = Object.keys(\n sessionProperties,\n ).every((sessionProperty) => isSupportedSessionProperty(sessionProperty));\n\n if (!allSessionPropertiesSupported) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received unknown session property(s) for caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n\n assertIsInternalScopesObject(requiredScopes);\n assertIsInternalScopesObject(optionalScopes);\n\n if (\n Object.keys(requiredScopes).length === 0 &&\n Object.keys(optionalScopes).length === 0\n ) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received no scopes requested for caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n\n const isEvmChainIdSupported = (chainId: Hex) => {\n try {\n findNetworkClientIdByChainId(chainId);\n return true;\n } catch {\n return false;\n }\n };\n\n const allRequiredScopesSupported = Object.keys(requiredScopes).every(\n (scopeString) =>\n isSupportedScopeString(scopeString, {\n isEvmChainIdSupported,\n isNonEvmScopeSupported,\n }),\n );\n const allOptionalScopesSupported = Object.keys(optionalScopes).every(\n (scopeString) =>\n isSupportedScopeString(scopeString, {\n isEvmChainIdSupported,\n isNonEvmScopeSupported,\n }),\n );\n if (!allRequiredScopesSupported || !allOptionalScopesSupported) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received scopeString value(s) for caveat of type \"${Caip25CaveatType}\" that are not supported by the wallet.`,\n );\n }\n\n const allRequiredAccountsSupported =\n isEveryAccountInScopesObjectSupported(\n requiredScopes,\n listAccounts,\n getNonEvmAccountAddresses,\n );\n const allOptionalAccountsSupported =\n isEveryAccountInScopesObjectSupported(\n optionalScopes,\n listAccounts,\n getNonEvmAccountAddresses,\n );\n if (!allRequiredAccountsSupported || !allOptionalAccountsSupported) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Received account value(s) for caveat of type \"${Caip25CaveatType}\" that are not supported by the wallet.`,\n );\n }\n },\n merger: (\n leftValue: Caip25CaveatValue,\n rightValue: Caip25CaveatValue,\n ): [Caip25CaveatValue, Caip25CaveatValue] => {\n const mergedRequiredScopes = mergeInternalScopes(\n leftValue.requiredScopes,\n rightValue.requiredScopes,\n );\n const mergedOptionalScopes = mergeInternalScopes(\n leftValue.optionalScopes,\n rightValue.optionalScopes,\n );\n\n const mergedSessionProperties = {\n ...leftValue.sessionProperties,\n ...rightValue.sessionProperties,\n };\n\n const mergedValue: Caip25CaveatValue = {\n requiredScopes: mergedRequiredScopes,\n optionalScopes: mergedOptionalScopes,\n sessionProperties: mergedSessionProperties,\n isMultichainOrigin: leftValue.isMultichainOrigin,\n };\n\n const partialDiff = diffScopesForCaip25CaveatValue(\n leftValue,\n mergedValue,\n 'requiredScopes',\n );\n\n const diff = diffScopesForCaip25CaveatValue(\n partialDiff,\n mergedValue,\n 'optionalScopes',\n );\n\n return [mergedValue, diff];\n },\n };\n};\n\ntype Caip25EndowmentSpecification = ValidPermissionSpecification<{\n permissionType: PermissionType.Endowment;\n targetName: typeof Caip25EndowmentPermissionName;\n endowmentGetter: (_options?: EndowmentGetterParams) => null;\n validator: PermissionValidatorConstraint;\n allowedCaveats: Readonly<NonEmptyArray<string>> | null;\n}>;\n\n/**\n * Helper that returns a `endowment:caip25` specification that\n * can be passed into the PermissionController constructor.\n *\n * @returns The specification for the `caip25` endowment.\n */\nconst specificationBuilder: PermissionSpecificationBuilder<\n PermissionType.Endowment,\n Record<never, never>,\n Caip25EndowmentSpecification\n> = () => {\n return {\n permissionType: PermissionType.Endowment,\n targetName: Caip25EndowmentPermissionName,\n allowedCaveats: [Caip25CaveatType],\n endowmentGetter: (_getterOptions?: EndowmentGetterParams) => null,\n validator: (permission: PermissionConstraint) => {\n if (\n permission.caveats?.length !== 1 ||\n permission.caveats?.[0]?.type !== Caip25CaveatType\n ) {\n throw new Error(\n `${Caip25EndowmentPermissionName} error: Invalid caveats. There must be a single caveat of type \"${Caip25CaveatType}\".`,\n );\n }\n },\n };\n};\n\n/**\n * The `caip25` endowment specification builder. Passed to the\n * `PermissionController` for constructing and validating the\n * `endowment:caip25` permission.\n */\nexport const caip25EndowmentBuilder = Object.freeze({\n targetName: Caip25EndowmentPermissionName,\n specificationBuilder,\n} as const);\n\n/**\n * Factories that construct caveat mutator functions that are passed to\n * PermissionController.updatePermissionsByCaveat.\n */\nexport const Caip25CaveatMutators = {\n [Caip25CaveatType]: {\n removeScope,\n removeAccount,\n },\n};\n\n/**\n * Removes the account from the scope object.\n *\n * @param targetAddress - The address to remove from the scope object.\n * @returns A function that removes the account from the scope object.\n */\nfunction removeAccountFilterFn(targetAddress: string) {\n return (account: CaipAccountId) => {\n const parsed = parseCaipAccountId(account);\n return parsed.address !== targetAddress;\n };\n}\n\n/**\n * Removes the account from the scope object.\n *\n * @param scopeObject - The scope object to remove the account from.\n * @param targetAddress - The address to remove from the scope object.\n */\nfunction removeAccountFromScopeObject(\n scopeObject: InternalScopeObject,\n targetAddress: string,\n) {\n if (scopeObject.accounts) {\n scopeObject.accounts = scopeObject.accounts.filter(\n removeAccountFilterFn(targetAddress),\n );\n }\n}\n\n/**\n * Removes the target account from the scope object.\n *\n * @param caip25CaveatValue - The CAIP-25 permission caveat value from which to remove the account (across all chain scopes).\n * @param targetAddress - The address to remove from the scope object. Not a CAIP-10 formatted address because it will be removed across each chain scope.\n * @returns The updated scope object.\n */\nfunction removeAccount(\n caip25CaveatValue: Caip25CaveatValue,\n targetAddress: Hex,\n) {\n const updatedCaveatValue = cloneDeep(caip25CaveatValue);\n\n [\n updatedCaveatValue.requiredScopes,\n updatedCaveatValue.optionalScopes,\n ].forEach((scopes) => {\n Object.entries(scopes).forEach(([, scopeObject]) => {\n removeAccountFromScopeObject(scopeObject, targetAddress);\n });\n });\n\n const noChange = isEqual(updatedCaveatValue, caip25CaveatValue);\n\n if (noChange) {\n return {\n operation: CaveatMutatorOperation.Noop,\n };\n }\n\n const hasAccounts = [\n ...Object.values(updatedCaveatValue.requiredScopes),\n ...Object.values(updatedCaveatValue.optionalScopes),\n ].some(({ accounts }) => accounts.length > 0);\n\n if (hasAccounts) {\n return {\n operation: CaveatMutatorOperation.UpdateValue,\n value: updatedCaveatValue,\n };\n }\n\n return {\n operation: CaveatMutatorOperation.RevokePermission,\n };\n}\n\n/**\n * Removes the target scope from the value arrays of the given\n * `endowment:caip25` caveat. No-ops if the target scopeString is not in\n * the existing scopes.\n *\n * @param caip25CaveatValue - The CAIP-25 permission caveat value to remove the scope from.\n * @param targetScopeString - The scope that is being removed.\n * @returns The updated CAIP-25 permission caveat value.\n */\nfunction removeScope(\n caip25CaveatValue: Caip25CaveatValue,\n targetScopeString: ExternalScopeString,\n) {\n const newRequiredScopes = Object.entries(\n caip25CaveatValue.requiredScopes,\n ).filter(([scope]) => scope !== targetScopeString);\n const newOptionalScopes = Object.entries(\n caip25CaveatValue.optionalScopes,\n ).filter(([scope]) => {\n return scope !== targetScopeString;\n });\n\n const requiredScopesRemoved =\n newRequiredScopes.length !==\n Object.keys(caip25CaveatValue.requiredScopes).length;\n const optionalScopesRemoved =\n newOptionalScopes.length !==\n Object.keys(caip25CaveatValue.optionalScopes).length;\n\n if (!requiredScopesRemoved && !optionalScopesRemoved) {\n return {\n operation: CaveatMutatorOperation.Noop,\n };\n }\n\n const updatedCaveatValue = {\n ...caip25CaveatValue,\n requiredScopes: Object.fromEntries(newRequiredScopes),\n optionalScopes: Object.fromEntries(newOptionalScopes),\n };\n\n const hasNonWalletScopes = [...newRequiredScopes, ...newOptionalScopes].some(\n ([scopeString]) => {\n const { namespace } = parseScopeString(scopeString);\n return namespace !== KnownCaipNamespace.Wallet;\n },\n );\n\n if (hasNonWalletScopes) {\n return {\n operation: CaveatMutatorOperation.UpdateValue,\n value: updatedCaveatValue,\n };\n }\n\n return {\n operation: CaveatMutatorOperation.RevokePermission,\n };\n}\n\n/**\n * Modifies the requested CAIP-25 permissions object after UI confirmation.\n *\n * @param caip25CaveatValue - The requested CAIP-25 caveat value to modify.\n * @param accountAddresses - The list of permitted eth addresses.\n * @param chainIds - The list of permitted eth chainIds.\n * @returns The updated CAIP-25 caveat value with the permitted accounts and chainIds set.\n */\nexport const generateCaip25Caveat = (\n caip25CaveatValue: Caip25CaveatValue,\n accountAddresses: CaipAccountId[],\n chainIds: CaipChainId[],\n): {\n [Caip25EndowmentPermissionName]: {\n caveats: [{ type: string; value: Caip25CaveatValue }];\n };\n} => {\n const caveatValueWithChains = setPermittedChainIds(\n caip25CaveatValue,\n chainIds,\n );\n\n const caveatValueWithAccounts = setPermittedAccounts(\n caveatValueWithChains,\n accountAddresses,\n );\n\n return {\n [Caip25EndowmentPermissionName]: {\n caveats: [\n {\n type: Caip25CaveatType,\n value: caveatValueWithAccounts,\n },\n ],\n },\n };\n};\n"]}
@@ -22,6 +22,7 @@ const parseScopeString = (scopeString) => {
22
22
  exports.parseScopeString = parseScopeString;
23
23
  /**
24
24
  * Checks if a scope string is either a 'wallet' scope or a 'wallet:*' scope.
25
+ *
25
26
  * @param scopeString - The scope string to check.
26
27
  * @returns True if the scope string is a wallet scope, false otherwise.
27
28
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../src/scope/types.ts"],"names":[],"mappings":";;;AAAA,2CAKyB;AAsFzB;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAC9B,WAAmB,EAInB,EAAE;IACF,IAAI,IAAA,uBAAe,EAAC,WAAW,CAAC,EAAE;QAChC,OAAO;YACL,SAAS,EAAE,WAAW;SACvB,CAAC;KACH;IACD,IAAI,IAAA,qBAAa,EAAC,WAAW,CAAC,EAAE;QAC9B,OAAO,IAAA,wBAAgB,EAAC,WAAW,CAAC,CAAC;KACtC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAhBW,QAAA,gBAAgB,oBAgB3B;AAUF;;;;GAIG;AACI,MAAM,aAAa,GAAG,CAC3B,WAAmB,EAGwB,EAAE;IAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,wBAAgB,EAAC,WAAW,CAAC,CAAC;IACpD,OAAO,SAAS,KAAK,0BAAkB,CAAC,MAAM,CAAC;AACjD,CAAC,CAAC;AAPW,QAAA,aAAa,iBAOxB","sourcesContent":["import {\n isCaipNamespace,\n isCaipChainId,\n parseCaipChainId,\n KnownCaipNamespace,\n} from '@metamask/utils';\nimport type {\n CaipChainId,\n CaipReference,\n CaipAccountId,\n CaipNamespace,\n Json,\n} from '@metamask/utils';\n\n/**\n * Represents a `scopeString` as defined in [CAIP-217](https://chainagnostic.org/CAIPs/caip-217).\n */\nexport type ExternalScopeString = CaipChainId | CaipNamespace;\n/**\n * Represents a `scopeObject` as defined in [CAIP-217](https://chainagnostic.org/CAIPs/caip-217).\n */\nexport type ExternalScopeObject = Omit<NormalizedScopeObject, 'accounts'> & {\n references?: CaipReference[];\n accounts?: CaipAccountId[];\n};\n/**\n * Represents a `scope` as defined in [CAIP-217](https://chainagnostic.org/CAIPs/caip-217).\n * TODO update the language in CAIP-217 to use \"scope\" instead of \"scopeObject\" for this full record type.\n */\nexport type ExternalScopesObject = Record<\n ExternalScopeString,\n ExternalScopeObject\n>;\n\n/**\n * Represents a `scopeString` as defined in\n * [CAIP-217](https://chainagnostic.org/CAIPs/caip-217), with the exception that\n * CAIP namespaces without a reference (aside from \"wallet\") are disallowed for our internal representations of CAIP-25 session scopes\n */\nexport type InternalScopeString = CaipChainId | KnownCaipNamespace.Wallet;\n\n/**\n * A trimmed down version of a [CAIP-217](https://chainagnostic.org/CAIPs/caip-217) defined scopeObject that is stored in a `endowment:caip25` permission.\n * The only property from the original CAIP-25 scopeObject that we use for permissioning is `accounts`.\n */\nexport type InternalScopeObject = {\n accounts: CaipAccountId[];\n};\n\n/**\n * A trimmed down version of a [CAIP-217](https://chainagnostic.org/CAIPs/caip-217) scope that is stored in a `endowment:caip25` permission.\n * Accounts arrays are mapped to CAIP-2 chainIds. These are currently the only properties used by the permission system.\n */\nexport type InternalScopesObject = Record<CaipChainId, InternalScopeObject> & {\n [KnownCaipNamespace.Wallet]?: InternalScopeObject;\n};\n\n/**\n * Represents a `scopeObject` as defined in\n * [CAIP-217](https://chainagnostic.org/CAIPs/caip-217), with the exception that\n * we resolve the `references` property into a scopeObject per reference and\n * assign an empty array to the `accounts` property if not already defined\n * to more easily perform support checks for `wallet_createSession` requests.\n * Also used as the return type for `wallet_createSession` and `wallet_sessionChanged`.\n */\nexport type NormalizedScopeObject = {\n methods: string[];\n notifications: string[];\n accounts: CaipAccountId[];\n rpcDocuments?: string[];\n rpcEndpoints?: string[];\n};\n/**\n * Represents a keyed `scopeObject` as defined in\n * [CAIP-217](https://chainagnostic.org/CAIPs/caip-217), with the exception that\n * we resolve the `references` property into a scopeObject per reference and\n * assign an empty array to the `accounts` property if not already defined\n * to more easily perform support checks for `wallet_createSession` requests.\n * Also used as the return type for `wallet_createSession` and `wallet_sessionChanged`.\n */\nexport type NormalizedScopesObject = Record<\n CaipChainId,\n NormalizedScopeObject\n> & {\n [KnownCaipNamespace.Wallet]?: NormalizedScopeObject;\n};\n\nexport type ScopedProperties = Record<CaipChainId, Record<string, Json>> & {\n [KnownCaipNamespace.Wallet]?: Record<string, Json>;\n};\n\n/**\n * Parses a scope string into a namespace and reference.\n *\n * @param scopeString - The scope string to parse.\n * @returns An object containing the namespace and reference.\n */\nexport const parseScopeString = (\n scopeString: string,\n): {\n namespace?: string;\n reference?: string;\n} => {\n if (isCaipNamespace(scopeString)) {\n return {\n namespace: scopeString,\n };\n }\n if (isCaipChainId(scopeString)) {\n return parseCaipChainId(scopeString);\n }\n\n return {};\n};\n\n/**\n * CAIP namespaces excluding \"wallet\" currently supported by/known to the wallet.\n */\nexport type NonWalletKnownCaipNamespace = Exclude<\n KnownCaipNamespace,\n KnownCaipNamespace.Wallet\n>;\n\n/**\n * Checks if a scope string is either a 'wallet' scope or a 'wallet:*' scope.\n * @param scopeString - The scope string to check.\n * @returns True if the scope string is a wallet scope, false otherwise.\n */\nexport const isWalletScope = (\n scopeString: string,\n): scopeString is\n | KnownCaipNamespace.Wallet\n | `${KnownCaipNamespace.Wallet}:${string}` => {\n const { namespace } = parseScopeString(scopeString);\n return namespace === KnownCaipNamespace.Wallet;\n};\n"]}
1
+ {"version":3,"file":"types.cjs","sourceRoot":"","sources":["../../src/scope/types.ts"],"names":[],"mappings":";;;AAAA,2CAKyB;AAsFzB;;;;;GAKG;AACI,MAAM,gBAAgB,GAAG,CAC9B,WAAmB,EAInB,EAAE;IACF,IAAI,IAAA,uBAAe,EAAC,WAAW,CAAC,EAAE;QAChC,OAAO;YACL,SAAS,EAAE,WAAW;SACvB,CAAC;KACH;IACD,IAAI,IAAA,qBAAa,EAAC,WAAW,CAAC,EAAE;QAC9B,OAAO,IAAA,wBAAgB,EAAC,WAAW,CAAC,CAAC;KACtC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAhBW,QAAA,gBAAgB,oBAgB3B;AAUF;;;;;GAKG;AACI,MAAM,aAAa,GAAG,CAC3B,WAAmB,EAGwB,EAAE;IAC7C,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,wBAAgB,EAAC,WAAW,CAAC,CAAC;IACpD,OAAO,SAAS,KAAK,0BAAkB,CAAC,MAAM,CAAC;AACjD,CAAC,CAAC;AAPW,QAAA,aAAa,iBAOxB","sourcesContent":["import {\n isCaipNamespace,\n isCaipChainId,\n parseCaipChainId,\n KnownCaipNamespace,\n} from '@metamask/utils';\nimport type {\n CaipChainId,\n CaipReference,\n CaipAccountId,\n CaipNamespace,\n Json,\n} from '@metamask/utils';\n\n/**\n * Represents a `scopeString` as defined in [CAIP-217](https://chainagnostic.org/CAIPs/caip-217).\n */\nexport type ExternalScopeString = CaipChainId | CaipNamespace;\n/**\n * Represents a `scopeObject` as defined in [CAIP-217](https://chainagnostic.org/CAIPs/caip-217).\n */\nexport type ExternalScopeObject = Omit<NormalizedScopeObject, 'accounts'> & {\n references?: CaipReference[];\n accounts?: CaipAccountId[];\n};\n/**\n * Represents a `scope` as defined in [CAIP-217](https://chainagnostic.org/CAIPs/caip-217).\n * TODO update the language in CAIP-217 to use \"scope\" instead of \"scopeObject\" for this full record type.\n */\nexport type ExternalScopesObject = Record<\n ExternalScopeString,\n ExternalScopeObject\n>;\n\n/**\n * Represents a `scopeString` as defined in\n * [CAIP-217](https://chainagnostic.org/CAIPs/caip-217), with the exception that\n * CAIP namespaces without a reference (aside from \"wallet\") are disallowed for our internal representations of CAIP-25 session scopes\n */\nexport type InternalScopeString = CaipChainId | KnownCaipNamespace.Wallet;\n\n/**\n * A trimmed down version of a [CAIP-217](https://chainagnostic.org/CAIPs/caip-217) defined scopeObject that is stored in a `endowment:caip25` permission.\n * The only property from the original CAIP-25 scopeObject that we use for permissioning is `accounts`.\n */\nexport type InternalScopeObject = {\n accounts: CaipAccountId[];\n};\n\n/**\n * A trimmed down version of a [CAIP-217](https://chainagnostic.org/CAIPs/caip-217) scope that is stored in a `endowment:caip25` permission.\n * Accounts arrays are mapped to CAIP-2 chainIds. These are currently the only properties used by the permission system.\n */\nexport type InternalScopesObject = Record<CaipChainId, InternalScopeObject> & {\n [KnownCaipNamespace.Wallet]?: InternalScopeObject;\n};\n\n/**\n * Represents a `scopeObject` as defined in\n * [CAIP-217](https://chainagnostic.org/CAIPs/caip-217), with the exception that\n * we resolve the `references` property into a scopeObject per reference and\n * assign an empty array to the `accounts` property if not already defined\n * to more easily perform support checks for `wallet_createSession` requests.\n * Also used as the return type for `wallet_createSession` and `wallet_sessionChanged`.\n */\nexport type NormalizedScopeObject = {\n methods: string[];\n notifications: string[];\n accounts: CaipAccountId[];\n rpcDocuments?: string[];\n rpcEndpoints?: string[];\n};\n/**\n * Represents a keyed `scopeObject` as defined in\n * [CAIP-217](https://chainagnostic.org/CAIPs/caip-217), with the exception that\n * we resolve the `references` property into a scopeObject per reference and\n * assign an empty array to the `accounts` property if not already defined\n * to more easily perform support checks for `wallet_createSession` requests.\n * Also used as the return type for `wallet_createSession` and `wallet_sessionChanged`.\n */\nexport type NormalizedScopesObject = Record<\n CaipChainId,\n NormalizedScopeObject\n> & {\n [KnownCaipNamespace.Wallet]?: NormalizedScopeObject;\n};\n\nexport type ScopedProperties = Record<CaipChainId, Record<string, Json>> & {\n [KnownCaipNamespace.Wallet]?: Record<string, Json>;\n};\n\n/**\n * Parses a scope string into a namespace and reference.\n *\n * @param scopeString - The scope string to parse.\n * @returns An object containing the namespace and reference.\n */\nexport const parseScopeString = (\n scopeString: string,\n): {\n namespace?: string;\n reference?: string;\n} => {\n if (isCaipNamespace(scopeString)) {\n return {\n namespace: scopeString,\n };\n }\n if (isCaipChainId(scopeString)) {\n return parseCaipChainId(scopeString);\n }\n\n return {};\n};\n\n/**\n * CAIP namespaces excluding \"wallet\" currently supported by/known to the wallet.\n */\nexport type NonWalletKnownCaipNamespace = Exclude<\n KnownCaipNamespace,\n KnownCaipNamespace.Wallet\n>;\n\n/**\n * Checks if a scope string is either a 'wallet' scope or a 'wallet:*' scope.\n *\n * @param scopeString - The scope string to check.\n * @returns True if the scope string is a wallet scope, false otherwise.\n */\nexport const isWalletScope = (\n scopeString: string,\n): scopeString is\n | KnownCaipNamespace.Wallet\n | `${KnownCaipNamespace.Wallet}:${string}` => {\n const { namespace } = parseScopeString(scopeString);\n return namespace === KnownCaipNamespace.Wallet;\n};\n"]}