Skip to content

chore: add more chain agnostic utility functions for interfacing w/ caip25 permission#5536

Merged
adonesky1 merged 22 commits intomainfrom
ad/make-chain-agnostic-permission-utilities-more-chain-agnostic
Mar 25, 2025
Merged

chore: add more chain agnostic utility functions for interfacing w/ caip25 permission#5536
adonesky1 merged 22 commits intomainfrom
ad/make-chain-agnostic-permission-utilities-more-chain-agnostic

Conversation

@adonesky1
Copy link
Copy Markdown
Contributor

@adonesky1 adonesky1 commented Mar 24, 2025

Explanation

Currently the utility/helper functions we expose to interface with and help construct a valid caip25 permission caveat are very eth/evm centric (i.e. setPermittedAccounts, addPermittedEthChainId, getPermittedEthChainIds etc)

This PR adds some new helpers that are actually chain agnostic

References

see @david0xd 's PR here

and my extension PR ontop of it that uses these changes:
MetaMask/metamask-extension#31253

@metamask/chain-agnostic-permission

  • CHANGED: Renamed caip-permission-adapter-eth-accounts.ts to caip-permission-adapter-accounts.ts to better reflect its more generalized functionality.
  • ADDED: New setPermittedAccounts function that allows setting accounts for any CAIP namespace, not just EVM scopes.
  • ADDED: New addPermittedChainId and setPermittedChainIds functions for managing permitted chains across any CAIP namespace.
  • ADDED: New generateCaip25Caveat function to simplify modification of CAIP-25 permissions after UI confirmation.
  • ADDED: New isWalletScope utility function to detect wallet-related scopes.

CHANGED : BREAKING The caip25:endowment permission caveat validator now throws an error when both requiredScopes and optionalScopes contain no scopes.
Moved to another PR: https://github.com/MetaMask/core/pull/5548.diff

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've highlighted breaking changes using the "BREAKING" category above as appropriate
  • I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes

@adonesky1
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/accounts-controller": "27.0.0-preview-8c3b89c",
  "@metamask-previews/address-book-controller": "6.0.3-preview-8c3b89c",
  "@metamask-previews/announcement-controller": "7.0.3-preview-8c3b89c",
  "@metamask-previews/approval-controller": "7.1.3-preview-8c3b89c",
  "@metamask-previews/assets-controllers": "55.0.1-preview-8c3b89c",
  "@metamask-previews/base-controller": "8.0.0-preview-8c3b89c",
  "@metamask-previews/bridge-controller": "11.0.0-preview-8c3b89c",
  "@metamask-previews/bridge-status-controller": "10.0.0-preview-8c3b89c",
  "@metamask-previews/build-utils": "3.0.3-preview-8c3b89c",
  "@metamask-previews/chain-agnostic-permission": "0.2.0-preview-8c3b89c",
  "@metamask-previews/composable-controller": "11.0.0-preview-8c3b89c",
  "@metamask-previews/controller-utils": "11.6.0-preview-8c3b89c",
  "@metamask-previews/earn-controller": "0.9.0-preview-8c3b89c",
  "@metamask-previews/eip1193-permission-middleware": "0.1.0-preview-8c3b89c",
  "@metamask-previews/ens-controller": "16.0.0-preview-8c3b89c",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-8c3b89c",
  "@metamask-previews/gas-fee-controller": "23.0.0-preview-8c3b89c",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-8c3b89c",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-8c3b89c",
  "@metamask-previews/keyring-controller": "21.0.0-preview-8c3b89c",
  "@metamask-previews/logging-controller": "6.0.4-preview-8c3b89c",
  "@metamask-previews/message-manager": "12.0.1-preview-8c3b89c",
  "@metamask-previews/multichain": "4.0.0-preview-8c3b89c",
  "@metamask-previews/multichain-api-middleware": "0.1.1-preview-8c3b89c",
  "@metamask-previews/multichain-network-controller": "0.3.0-preview-8c3b89c",
  "@metamask-previews/multichain-transactions-controller": "0.8.0-preview-8c3b89c",
  "@metamask-previews/name-controller": "8.0.3-preview-8c3b89c",
  "@metamask-previews/network-controller": "23.1.0-preview-8c3b89c",
  "@metamask-previews/notification-services-controller": "5.0.1-preview-8c3b89c",
  "@metamask-previews/permission-controller": "11.0.6-preview-8c3b89c",
  "@metamask-previews/permission-log-controller": "3.0.3-preview-8c3b89c",
  "@metamask-previews/phishing-controller": "12.4.1-preview-8c3b89c",
  "@metamask-previews/polling-controller": "13.0.0-preview-8c3b89c",
  "@metamask-previews/preferences-controller": "17.0.0-preview-8c3b89c",
  "@metamask-previews/profile-sync-controller": "11.0.0-preview-8c3b89c",
  "@metamask-previews/queued-request-controller": "10.0.0-preview-8c3b89c",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-8c3b89c",
  "@metamask-previews/remote-feature-flag-controller": "1.6.0-preview-8c3b89c",
  "@metamask-previews/sample-controllers": "0.0.0-preview-8c3b89c",
  "@metamask-previews/selected-network-controller": "22.0.0-preview-8c3b89c",
  "@metamask-previews/signature-controller": "27.0.0-preview-8c3b89c",
  "@metamask-previews/token-search-discovery-controller": "2.1.0-preview-8c3b89c",
  "@metamask-previews/transaction-controller": "52.1.0-preview-8c3b89c",
  "@metamask-previews/user-operation-controller": "31.0.0-preview-8c3b89c"
}

@adonesky1 adonesky1 force-pushed the ad/make-chain-agnostic-permission-utilities-more-chain-agnostic branch from 7f7d307 to b6a1c5d Compare March 24, 2025 21:06
@adonesky1
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/accounts-controller": "27.0.0-preview-62c1e797",
  "@metamask-previews/address-book-controller": "6.0.3-preview-62c1e797",
  "@metamask-previews/announcement-controller": "7.0.3-preview-62c1e797",
  "@metamask-previews/approval-controller": "7.1.3-preview-62c1e797",
  "@metamask-previews/assets-controllers": "55.0.1-preview-62c1e797",
  "@metamask-previews/base-controller": "8.0.0-preview-62c1e797",
  "@metamask-previews/bridge-controller": "11.0.0-preview-62c1e797",
  "@metamask-previews/bridge-status-controller": "10.0.0-preview-62c1e797",
  "@metamask-previews/build-utils": "3.0.3-preview-62c1e797",
  "@metamask-previews/chain-agnostic-permission": "0.2.0-preview-62c1e797",
  "@metamask-previews/composable-controller": "11.0.0-preview-62c1e797",
  "@metamask-previews/controller-utils": "11.6.0-preview-62c1e797",
  "@metamask-previews/earn-controller": "0.9.0-preview-62c1e797",
  "@metamask-previews/eip1193-permission-middleware": "0.1.0-preview-62c1e797",
  "@metamask-previews/ens-controller": "16.0.0-preview-62c1e797",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-62c1e797",
  "@metamask-previews/gas-fee-controller": "23.0.0-preview-62c1e797",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-62c1e797",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-62c1e797",
  "@metamask-previews/keyring-controller": "21.0.0-preview-62c1e797",
  "@metamask-previews/logging-controller": "6.0.4-preview-62c1e797",
  "@metamask-previews/message-manager": "12.0.1-preview-62c1e797",
  "@metamask-previews/multichain": "4.0.0-preview-62c1e797",
  "@metamask-previews/multichain-api-middleware": "0.1.1-preview-62c1e797",
  "@metamask-previews/multichain-network-controller": "0.3.0-preview-62c1e797",
  "@metamask-previews/multichain-transactions-controller": "0.8.0-preview-62c1e797",
  "@metamask-previews/name-controller": "8.0.3-preview-62c1e797",
  "@metamask-previews/network-controller": "23.1.0-preview-62c1e797",
  "@metamask-previews/notification-services-controller": "5.0.1-preview-62c1e797",
  "@metamask-previews/permission-controller": "11.0.6-preview-62c1e797",
  "@metamask-previews/permission-log-controller": "3.0.3-preview-62c1e797",
  "@metamask-previews/phishing-controller": "12.4.1-preview-62c1e797",
  "@metamask-previews/polling-controller": "13.0.0-preview-62c1e797",
  "@metamask-previews/preferences-controller": "17.0.0-preview-62c1e797",
  "@metamask-previews/profile-sync-controller": "11.0.0-preview-62c1e797",
  "@metamask-previews/queued-request-controller": "10.0.0-preview-62c1e797",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-62c1e797",
  "@metamask-previews/remote-feature-flag-controller": "1.6.0-preview-62c1e797",
  "@metamask-previews/sample-controllers": "0.0.0-preview-62c1e797",
  "@metamask-previews/selected-network-controller": "22.0.0-preview-62c1e797",
  "@metamask-previews/signature-controller": "27.0.0-preview-62c1e797",
  "@metamask-previews/token-search-discovery-controller": "2.1.0-preview-62c1e797",
  "@metamask-previews/transaction-controller": "52.1.0-preview-62c1e797",
  "@metamask-previews/user-operation-controller": "31.0.0-preview-62c1e797"
}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

adapters probably isn't the best descriptor for these anymore. getters/setters seem more appropriate now, but a problem for later


updatedScopesObject[scopeString] = {
...scopeObject,
accounts: uniq(caipAccounts),
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit. thoughts on doing this uniq call at the top of this helper?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure I follow? Where are you thinking?

* @param requestedCaip25CaveatValue - CAIP-25 request values.
* @returns Accounts available for requesting.
*/
export function getAllAccountsFromCaip25Caveat(
Copy link
Copy Markdown
Member

@jiexi jiexi Mar 24, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thoughts on just calling this getPermittedAccounts? The ending of this one sticks out from the rest. I can see why getPermittedAccounts might conflict in other contexts though, but maybe that can be fixed with a rename on import by the code that imports this package?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed that its not a great name, especially since others don't follow that naming convention. I'm going to change it to getAllAccounts for now since really this is used before the caveat is persisted... but it can be used for the caveat persisted or not...

// If its a wallet scope or a wallet:* scope we don't filter it
if (isWalletScope(scopeString)) {
updatedScopesObject[scopeString] = scopeObject;
} else if (chainIds.includes(scopeString)) {
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can these two statements be combined into one guard?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done here: 305d18d

@adonesky1 adonesky1 changed the title Ad/make chain agnostic permission utilities more chain agnostic chore: add more chain agnostic utility functions for interfacing w/ caip25 permission + throw in caveat validator when no scopes are requested Mar 25, 2025
@adonesky1 adonesky1 changed the title chore: add more chain agnostic utility functions for interfacing w/ caip25 permission + throw in caveat validator when no scopes are requested chore: add more chain agnostic utility functions for interfacing w/ caip25 permission Mar 25, 2025
@adonesky1 adonesky1 marked this pull request as ready for review March 25, 2025 16:53
@adonesky1 adonesky1 requested a review from a team as a code owner March 25, 2025 16:53
@adonesky1
Copy link
Copy Markdown
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/accounts-controller": "27.0.0-preview-6bd2731f",
  "@metamask-previews/address-book-controller": "6.0.3-preview-6bd2731f",
  "@metamask-previews/announcement-controller": "7.0.3-preview-6bd2731f",
  "@metamask-previews/approval-controller": "7.1.3-preview-6bd2731f",
  "@metamask-previews/assets-controllers": "55.0.1-preview-6bd2731f",
  "@metamask-previews/base-controller": "8.0.0-preview-6bd2731f",
  "@metamask-previews/bridge-controller": "11.0.0-preview-6bd2731f",
  "@metamask-previews/bridge-status-controller": "10.0.0-preview-6bd2731f",
  "@metamask-previews/build-utils": "3.0.3-preview-6bd2731f",
  "@metamask-previews/chain-agnostic-permission": "0.2.0-preview-6bd2731f",
  "@metamask-previews/composable-controller": "11.0.0-preview-6bd2731f",
  "@metamask-previews/controller-utils": "11.6.0-preview-6bd2731f",
  "@metamask-previews/earn-controller": "0.9.0-preview-6bd2731f",
  "@metamask-previews/eip1193-permission-middleware": "0.1.0-preview-6bd2731f",
  "@metamask-previews/ens-controller": "16.0.0-preview-6bd2731f",
  "@metamask-previews/eth-json-rpc-provider": "4.1.8-preview-6bd2731f",
  "@metamask-previews/gas-fee-controller": "23.0.0-preview-6bd2731f",
  "@metamask-previews/json-rpc-engine": "10.0.3-preview-6bd2731f",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.7-preview-6bd2731f",
  "@metamask-previews/keyring-controller": "21.0.0-preview-6bd2731f",
  "@metamask-previews/logging-controller": "6.0.4-preview-6bd2731f",
  "@metamask-previews/message-manager": "12.0.1-preview-6bd2731f",
  "@metamask-previews/multichain": "4.0.0-preview-6bd2731f",
  "@metamask-previews/multichain-api-middleware": "0.1.1-preview-6bd2731f",
  "@metamask-previews/multichain-network-controller": "0.3.0-preview-6bd2731f",
  "@metamask-previews/multichain-transactions-controller": "0.8.0-preview-6bd2731f",
  "@metamask-previews/name-controller": "8.0.3-preview-6bd2731f",
  "@metamask-previews/network-controller": "23.1.0-preview-6bd2731f",
  "@metamask-previews/notification-services-controller": "5.0.1-preview-6bd2731f",
  "@metamask-previews/permission-controller": "11.0.6-preview-6bd2731f",
  "@metamask-previews/permission-log-controller": "3.0.3-preview-6bd2731f",
  "@metamask-previews/phishing-controller": "12.4.1-preview-6bd2731f",
  "@metamask-previews/polling-controller": "13.0.0-preview-6bd2731f",
  "@metamask-previews/preferences-controller": "17.0.0-preview-6bd2731f",
  "@metamask-previews/profile-sync-controller": "11.0.0-preview-6bd2731f",
  "@metamask-previews/queued-request-controller": "10.0.0-preview-6bd2731f",
  "@metamask-previews/rate-limit-controller": "6.0.3-preview-6bd2731f",
  "@metamask-previews/remote-feature-flag-controller": "1.6.0-preview-6bd2731f",
  "@metamask-previews/sample-controllers": "0.0.0-preview-6bd2731f",
  "@metamask-previews/selected-network-controller": "22.0.0-preview-6bd2731f",
  "@metamask-previews/signature-controller": "27.0.0-preview-6bd2731f",
  "@metamask-previews/token-search-discovery-controller": "2.1.0-preview-6bd2731f",
  "@metamask-previews/transaction-controller": "52.1.0-preview-6bd2731f",
  "@metamask-previews/user-operation-controller": "31.0.0-preview-6bd2731f"
}

});
});

describe('setPermittedAccounts', () => {
Copy link
Copy Markdown
Member

@jiexi jiexi Mar 25, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is it okay if we add a scenario to setting accounts where there is no scope for that account defined in the caveat?

};

/**
* Sets the permitted accounts for the given scopes object.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

worth mentioning the caveat that the scope must already exist in the scopesObject?

};

/**
* Sets the permitted accounts for the given CAIP-25 caveat value.
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same

jiexi
jiexi previously approved these changes Mar 25, 2025
@adonesky1 adonesky1 enabled auto-merge (squash) March 25, 2025 17:51
@adonesky1 adonesky1 merged commit fd8330b into main Mar 25, 2025
193 checks passed
@adonesky1 adonesky1 deleted the ad/make-chain-agnostic-permission-utilities-more-chain-agnostic branch March 25, 2025 17:58
@adonesky1 adonesky1 mentioned this pull request Mar 25, 2025
adonesky1 added a commit that referenced this pull request Mar 25, 2025
## @metamask/chain-agnostic-permission

## [0.3.0]

### Added

- Export `KnownSessionProperties` enum
([#5522](#5522))
- Add more chain agnostic utility functions for interfacing w/ caip25
permission ([#5536](#5536))
- New `setPermittedAccounts` function that allows setting accounts for
any CAIP namespace, not just EVM scopes.
- New `addPermittedChainId` and `setPermittedChainIds` functions for
managing permitted chains across any CAIP namespace.
- New `generateCaip25Caveat` function to generate a valid
`endowment:caip25` permission caveat from given accounts and chains of
any CAIP namespace.
- New `isWalletScope` utility function to detect wallet-related scopes.

### Changed

- **BREAKING:** An error is now thrown in the caveat validator when a
`caip25:endowment` permission caveat has no scopes in either
`requiredScopes` or `optionalScopes`
([#5548](#5548))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants