Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: Add CAIP-25 permission and adapters to @metamask/multichain #4784

Merged
merged 169 commits into from
Nov 13, 2024

Conversation

jiexi
Copy link
Contributor

@jiexi jiexi commented Oct 10, 2024

Explanation

This PR updates @metamask/multichain to provide types, CAIP-25 permission, and helpers/adapters for the new permission, which can be shared across the extension & mobile clients.

These tools and utilities will be used in both clients (mobile + extension)'s multichain API implementations.

File Overview

  • packages/multichain/src/adapters/: Helpers that get and set legacy permission values from and to the new CAIP-25 permission
  • packages/multichain/src/caip25Permission.ts: Constants, types, mutators, and a specification builder for a CAIP-25 permission
  • packages/multichain/src/index.ts: Barrel export
  • packages/multichain/src/scope/: Types for CAIP-217 and our internal normalized/flattened version of them. Additionally contains helpers for validating shape, normalizing/merging, and checking support (i.e. if the wallet is able to serve the chain with it's requested methods and notifications)

References

Upstream: #4812
Downstream: #4813

Key Multichain API Standards implemented here:

Open PR that uses this new package for migrating the legacy permissions to CAIP-25 permission in the extension: MetaMask/metamask-extension#27847

Changelog

@metamask/multichain

  • ADDED: TODO

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

@jiexi jiexi requested a review from a team as a code owner October 10, 2024 22:49
@jiexi jiexi marked this pull request as draft October 10, 2024 22:49
jiexi and others added 3 commits October 10, 2024 15:54
## Explanation
This PR fixes a lot of the linting and typescript errors. still some
left but this covers a lot of it.


<!--
Thanks for your contribution! Take a moment to answer these questions so
that reviewers have the information they need to properly understand
your changes:

* What is the current state of things and why does it need to change?
* What is the solution your changes offer and how does it work?
* Are there any changes whose purpose might not obvious to those
unfamiliar with the domain?
* If your primary goal was to update one package but you found you had
to update another one along the way, why did you do so?
* If you had to upgrade a dependency, why did you do so?
-->

## References

<!--
Are there any issues that this pull request is tied to?
Are there other links that reviewers should consult to understand these
changes better?
Are there client or consumer pull requests to adopt any breaking
changes?

For example:

* Fixes #12345
* Related to #67890
-->

## Changelog

<!--
If you're making any consumer-facing changes, list those changes here as
if you were updating a changelog, using the template below as a guide.

(CATEGORY is one of BREAKING, ADDED, CHANGED, DEPRECATED, REMOVED, or
FIXED. For security-related issues, follow the Security Advisory
process.)

Please take care to name the exact pieces of the API you've added or
changed (e.g. types, interfaces, functions, or methods).

If there are any breaking changes, make sure to offer a solution for
consumers to follow once they upgrade to the changes.

Finally, if you're only making changes to development scripts or tests,
you may replace the template below with "None".
-->

### `@metamask/package-a`

- **<CATEGORY>**: Your change here
- **<CATEGORY>**: Your change here

### `@metamask/package-b`

- **<CATEGORY>**: Your change here
- **<CATEGORY>**: Your change here

## 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

---------

Co-authored-by: Jiexi Luan <[email protected]>
## Explanation

<!--
Thanks for your contribution! Take a moment to answer these questions so
that reviewers have the information they need to properly understand
your changes:

* What is the current state of things and why does it need to change?
* What is the solution your changes offer and how does it work?
* Are there any changes whose purpose might not obvious to those
unfamiliar with the domain?
* If your primary goal was to update one package but you found you had
to update another one along the way, why did you do so?
* If you had to upgrade a dependency, why did you do so?
-->
Added ESM exports for multichain package

## References

<!--
Are there any issues that this pull request is tied to?
Are there other links that reviewers should consult to understand these
changes better?
Are there client or consumer pull requests to adopt any breaking
changes?

For example:

* Fixes #12345
* Related to #67890
-->

## Changelog

<!--
If you're making any consumer-facing changes, list those changes here as
if you were updating a changelog, using the template below as a guide.

(CATEGORY is one of BREAKING, ADDED, CHANGED, DEPRECATED, REMOVED, or
FIXED. For security-related issues, follow the Security Advisory
process.)

Please take care to name the exact pieces of the API you've added or
changed (e.g. types, interfaces, functions, or methods).

If there are any breaking changes, make sure to offer a solution for
consumers to follow once they upgrade to the changes.

Finally, if you're only making changes to development scripts or tests,
you may replace the template below with "None".
-->

### `@metamask/package-a`

- **<CATEGORY>**: Your change here
- **<CATEGORY>**: Your change here

### `@metamask/package-b`

- **<CATEGORY>**: Your change here
- **<CATEGORY>**: Your change here

## 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
@jiexi
Copy link
Contributor Author

jiexi commented Oct 11, 2024

@metamaskbot publish-preview

Copy link
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": "18.2.2-preview-85a723e",
  "@metamask-previews/address-book-controller": "6.0.1-preview-85a723e",
  "@metamask-previews/announcement-controller": "7.0.1-preview-85a723e",
  "@metamask-previews/approval-controller": "7.1.0-preview-85a723e",
  "@metamask-previews/assets-controllers": "38.3.0-preview-85a723e",
  "@metamask-previews/base-controller": "7.0.1-preview-85a723e",
  "@metamask-previews/build-utils": "3.0.1-preview-85a723e",
  "@metamask-previews/chain-controller": "0.1.3-preview-85a723e",
  "@metamask-previews/composable-controller": "9.0.1-preview-85a723e",
  "@metamask-previews/controller-utils": "11.3.0-preview-85a723e",
  "@metamask-previews/ens-controller": "14.0.1-preview-85a723e",
  "@metamask-previews/eth-json-rpc-provider": "4.1.4-preview-85a723e",
  "@metamask-previews/gas-fee-controller": "20.0.1-preview-85a723e",
  "@metamask-previews/json-rpc-engine": "9.0.3-preview-85a723e",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.3-preview-85a723e",
  "@metamask-previews/keyring-controller": "17.2.2-preview-85a723e",
  "@metamask-previews/logging-controller": "6.0.1-preview-85a723e",
  "@metamask-previews/message-manager": "10.1.1-preview-85a723e",
  "@metamask-previews/multichain": "0.0.0-preview-85a723e",
  "@metamask-previews/name-controller": "8.0.1-preview-85a723e",
  "@metamask-previews/network-controller": "21.0.1-preview-85a723e",
  "@metamask-previews/notification-controller": "7.0.0-preview-85a723e",
  "@metamask-previews/notification-services-controller": "0.9.0-preview-85a723e",
  "@metamask-previews/permission-controller": "11.0.2-preview-85a723e",
  "@metamask-previews/permission-log-controller": "3.0.1-preview-85a723e",
  "@metamask-previews/phishing-controller": "12.0.3-preview-85a723e",
  "@metamask-previews/polling-controller": "10.0.1-preview-85a723e",
  "@metamask-previews/preferences-controller": "13.0.3-preview-85a723e",
  "@metamask-previews/profile-sync-controller": "0.9.7-preview-85a723e",
  "@metamask-previews/queued-request-controller": "5.1.0-preview-85a723e",
  "@metamask-previews/rate-limit-controller": "6.0.1-preview-85a723e",
  "@metamask-previews/selected-network-controller": "18.0.1-preview-85a723e",
  "@metamask-previews/signature-controller": "19.1.0-preview-85a723e",
  "@metamask-previews/transaction-controller": "37.2.0-preview-85a723e",
  "@metamask-previews/user-operation-controller": "15.0.1-preview-85a723e"
}

@jiexi
Copy link
Contributor Author

jiexi commented Oct 11, 2024

@metamaskbot publish-preview

Copy link
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": "18.2.2-preview-a0bb278",
  "@metamask-previews/address-book-controller": "6.0.1-preview-a0bb278",
  "@metamask-previews/announcement-controller": "7.0.1-preview-a0bb278",
  "@metamask-previews/approval-controller": "7.1.0-preview-a0bb278",
  "@metamask-previews/assets-controllers": "38.3.0-preview-a0bb278",
  "@metamask-previews/base-controller": "7.0.1-preview-a0bb278",
  "@metamask-previews/build-utils": "3.0.1-preview-a0bb278",
  "@metamask-previews/chain-controller": "0.1.3-preview-a0bb278",
  "@metamask-previews/composable-controller": "9.0.1-preview-a0bb278",
  "@metamask-previews/controller-utils": "11.3.0-preview-a0bb278",
  "@metamask-previews/ens-controller": "14.0.1-preview-a0bb278",
  "@metamask-previews/eth-json-rpc-provider": "4.1.4-preview-a0bb278",
  "@metamask-previews/gas-fee-controller": "20.0.1-preview-a0bb278",
  "@metamask-previews/json-rpc-engine": "9.0.3-preview-a0bb278",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.3-preview-a0bb278",
  "@metamask-previews/keyring-controller": "17.2.2-preview-a0bb278",
  "@metamask-previews/logging-controller": "6.0.1-preview-a0bb278",
  "@metamask-previews/message-manager": "10.1.1-preview-a0bb278",
  "@metamask-previews/multichain": "0.0.0-preview-a0bb278",
  "@metamask-previews/name-controller": "8.0.1-preview-a0bb278",
  "@metamask-previews/network-controller": "21.0.1-preview-a0bb278",
  "@metamask-previews/notification-controller": "7.0.0-preview-a0bb278",
  "@metamask-previews/notification-services-controller": "0.9.0-preview-a0bb278",
  "@metamask-previews/permission-controller": "11.0.2-preview-a0bb278",
  "@metamask-previews/permission-log-controller": "3.0.1-preview-a0bb278",
  "@metamask-previews/phishing-controller": "12.0.3-preview-a0bb278",
  "@metamask-previews/polling-controller": "10.0.1-preview-a0bb278",
  "@metamask-previews/preferences-controller": "13.0.3-preview-a0bb278",
  "@metamask-previews/profile-sync-controller": "0.9.7-preview-a0bb278",
  "@metamask-previews/queued-request-controller": "5.1.0-preview-a0bb278",
  "@metamask-previews/rate-limit-controller": "6.0.1-preview-a0bb278",
  "@metamask-previews/selected-network-controller": "18.0.1-preview-a0bb278",
  "@metamask-previews/signature-controller": "19.1.0-preview-a0bb278",
  "@metamask-previews/transaction-controller": "37.2.0-preview-a0bb278",
  "@metamask-previews/user-operation-controller": "15.0.1-preview-a0bb278"
}

@jiexi
Copy link
Contributor Author

jiexi commented Oct 11, 2024

@metamaskbot publish-preview

Copy link
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": "18.2.2-preview-1cd8ef2",
  "@metamask-previews/address-book-controller": "6.0.1-preview-1cd8ef2",
  "@metamask-previews/announcement-controller": "7.0.1-preview-1cd8ef2",
  "@metamask-previews/approval-controller": "7.1.0-preview-1cd8ef2",
  "@metamask-previews/assets-controllers": "38.3.0-preview-1cd8ef2",
  "@metamask-previews/base-controller": "7.0.1-preview-1cd8ef2",
  "@metamask-previews/build-utils": "3.0.1-preview-1cd8ef2",
  "@metamask-previews/chain-controller": "0.1.3-preview-1cd8ef2",
  "@metamask-previews/composable-controller": "9.0.1-preview-1cd8ef2",
  "@metamask-previews/controller-utils": "11.3.0-preview-1cd8ef2",
  "@metamask-previews/ens-controller": "14.0.1-preview-1cd8ef2",
  "@metamask-previews/eth-json-rpc-provider": "4.1.4-preview-1cd8ef2",
  "@metamask-previews/gas-fee-controller": "20.0.1-preview-1cd8ef2",
  "@metamask-previews/json-rpc-engine": "9.0.3-preview-1cd8ef2",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.3-preview-1cd8ef2",
  "@metamask-previews/keyring-controller": "17.2.2-preview-1cd8ef2",
  "@metamask-previews/logging-controller": "6.0.1-preview-1cd8ef2",
  "@metamask-previews/message-manager": "10.1.1-preview-1cd8ef2",
  "@metamask-previews/multichain": "0.0.0-preview-1cd8ef2",
  "@metamask-previews/name-controller": "8.0.1-preview-1cd8ef2",
  "@metamask-previews/network-controller": "21.0.1-preview-1cd8ef2",
  "@metamask-previews/notification-controller": "7.0.0-preview-1cd8ef2",
  "@metamask-previews/notification-services-controller": "0.9.0-preview-1cd8ef2",
  "@metamask-previews/permission-controller": "11.0.2-preview-1cd8ef2",
  "@metamask-previews/permission-log-controller": "3.0.1-preview-1cd8ef2",
  "@metamask-previews/phishing-controller": "12.0.3-preview-1cd8ef2",
  "@metamask-previews/polling-controller": "10.0.1-preview-1cd8ef2",
  "@metamask-previews/preferences-controller": "13.0.3-preview-1cd8ef2",
  "@metamask-previews/profile-sync-controller": "0.9.7-preview-1cd8ef2",
  "@metamask-previews/queued-request-controller": "5.1.0-preview-1cd8ef2",
  "@metamask-previews/rate-limit-controller": "6.0.1-preview-1cd8ef2",
  "@metamask-previews/selected-network-controller": "18.0.1-preview-1cd8ef2",
  "@metamask-previews/signature-controller": "19.1.0-preview-1cd8ef2",
  "@metamask-previews/transaction-controller": "37.2.0-preview-1cd8ef2",
  "@metamask-previews/user-operation-controller": "15.0.1-preview-1cd8ef2"
}

@jiexi
Copy link
Contributor Author

jiexi commented Oct 11, 2024

@metamaskbot publish-preview

Copy link
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": "18.2.2-preview-c636def",
  "@metamask-previews/address-book-controller": "6.0.1-preview-c636def",
  "@metamask-previews/announcement-controller": "7.0.1-preview-c636def",
  "@metamask-previews/approval-controller": "7.1.0-preview-c636def",
  "@metamask-previews/assets-controllers": "38.3.0-preview-c636def",
  "@metamask-previews/base-controller": "7.0.1-preview-c636def",
  "@metamask-previews/build-utils": "3.0.1-preview-c636def",
  "@metamask-previews/chain-controller": "0.1.3-preview-c636def",
  "@metamask-previews/composable-controller": "9.0.1-preview-c636def",
  "@metamask-previews/controller-utils": "11.3.0-preview-c636def",
  "@metamask-previews/ens-controller": "14.0.1-preview-c636def",
  "@metamask-previews/eth-json-rpc-provider": "4.1.4-preview-c636def",
  "@metamask-previews/gas-fee-controller": "20.0.1-preview-c636def",
  "@metamask-previews/json-rpc-engine": "9.0.3-preview-c636def",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.3-preview-c636def",
  "@metamask-previews/keyring-controller": "17.2.2-preview-c636def",
  "@metamask-previews/logging-controller": "6.0.1-preview-c636def",
  "@metamask-previews/message-manager": "10.1.1-preview-c636def",
  "@metamask-previews/multichain": "0.0.0-preview-c636def",
  "@metamask-previews/name-controller": "8.0.1-preview-c636def",
  "@metamask-previews/network-controller": "21.0.1-preview-c636def",
  "@metamask-previews/notification-controller": "7.0.0-preview-c636def",
  "@metamask-previews/notification-services-controller": "0.9.0-preview-c636def",
  "@metamask-previews/permission-controller": "11.0.2-preview-c636def",
  "@metamask-previews/permission-log-controller": "3.0.1-preview-c636def",
  "@metamask-previews/phishing-controller": "12.0.3-preview-c636def",
  "@metamask-previews/polling-controller": "10.0.1-preview-c636def",
  "@metamask-previews/preferences-controller": "13.0.3-preview-c636def",
  "@metamask-previews/profile-sync-controller": "0.9.7-preview-c636def",
  "@metamask-previews/queued-request-controller": "5.1.0-preview-c636def",
  "@metamask-previews/rate-limit-controller": "6.0.1-preview-c636def",
  "@metamask-previews/selected-network-controller": "18.0.1-preview-c636def",
  "@metamask-previews/signature-controller": "19.1.0-preview-c636def",
  "@metamask-previews/transaction-controller": "37.2.0-preview-c636def",
  "@metamask-previews/user-operation-controller": "15.0.1-preview-c636def"
}

@jiexi
Copy link
Contributor Author

jiexi commented Oct 14, 2024

@metamaskbot publish-preview

Copy link
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": "18.2.2-preview-42134f7e",
  "@metamask-previews/address-book-controller": "6.0.1-preview-42134f7e",
  "@metamask-previews/announcement-controller": "7.0.1-preview-42134f7e",
  "@metamask-previews/approval-controller": "7.1.0-preview-42134f7e",
  "@metamask-previews/assets-controllers": "38.3.0-preview-42134f7e",
  "@metamask-previews/base-controller": "7.0.1-preview-42134f7e",
  "@metamask-previews/build-utils": "3.0.1-preview-42134f7e",
  "@metamask-previews/chain-controller": "0.1.3-preview-42134f7e",
  "@metamask-previews/composable-controller": "9.0.1-preview-42134f7e",
  "@metamask-previews/controller-utils": "11.3.0-preview-42134f7e",
  "@metamask-previews/ens-controller": "14.0.1-preview-42134f7e",
  "@metamask-previews/eth-json-rpc-provider": "4.1.4-preview-42134f7e",
  "@metamask-previews/gas-fee-controller": "20.0.1-preview-42134f7e",
  "@metamask-previews/json-rpc-engine": "9.0.3-preview-42134f7e",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.3-preview-42134f7e",
  "@metamask-previews/keyring-controller": "17.2.2-preview-42134f7e",
  "@metamask-previews/logging-controller": "6.0.1-preview-42134f7e",
  "@metamask-previews/message-manager": "10.1.1-preview-42134f7e",
  "@metamask-previews/multichain": "0.0.0-preview-42134f7e",
  "@metamask-previews/name-controller": "8.0.1-preview-42134f7e",
  "@metamask-previews/network-controller": "21.0.1-preview-42134f7e",
  "@metamask-previews/notification-controller": "7.0.0-preview-42134f7e",
  "@metamask-previews/notification-services-controller": "0.9.0-preview-42134f7e",
  "@metamask-previews/permission-controller": "11.0.2-preview-42134f7e",
  "@metamask-previews/permission-log-controller": "3.0.1-preview-42134f7e",
  "@metamask-previews/phishing-controller": "12.0.3-preview-42134f7e",
  "@metamask-previews/polling-controller": "10.0.1-preview-42134f7e",
  "@metamask-previews/preferences-controller": "13.0.3-preview-42134f7e",
  "@metamask-previews/profile-sync-controller": "0.9.7-preview-42134f7e",
  "@metamask-previews/queued-request-controller": "5.1.0-preview-42134f7e",
  "@metamask-previews/rate-limit-controller": "6.0.1-preview-42134f7e",
  "@metamask-previews/selected-network-controller": "18.0.1-preview-42134f7e",
  "@metamask-previews/signature-controller": "19.1.0-preview-42134f7e",
  "@metamask-previews/transaction-controller": "37.2.0-preview-42134f7e",
  "@metamask-previews/user-operation-controller": "15.0.1-preview-42134f7e"
}

@jiexi
Copy link
Contributor Author

jiexi commented Oct 14, 2024

@metamaskbot publish-preview

@adonesky1 adonesky1 force-pushed the caip-multichain branch 2 times, most recently from bff1d4a to 1e2e990 Compare November 12, 2024 22:48
Comment on lines +147 to +163
// Fetch EVM accounts from native wallet keyring
// These addresses are lowercased already
const existingEvmAddresses = methodHooks
.listAccounts()
.map((account) => account.address);
const ethAccounts = getEthAccounts({
requiredScopes: normalizedRequiredScopes,
optionalScopes: normalizedOptionalScopes,
}).map((address) => address.toLowerCase() as Hex);

const allEthAccountsSupported = ethAccounts.every((address) =>
existingEvmAddresses.includes(address),
);
if (!allEthAccountsSupported) {
throw new Error(
`${Caip25EndowmentPermissionName} error: Received eip155 account value(s) for caveat of type "${Caip25CaveatType}" that were not found in the wallet keyring.`,
);
Copy link
Contributor

Choose a reason for hiding this comment

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

Is there are reason we don't do this in the assertScopesSupported function like we do with methods/notifications? And why don't we use the isSupportedAccount helper? I'm not seeing it used anywhere atm?

Copy link
Contributor

Choose a reason for hiding this comment

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

Also I kindof thought we were going to ignore this - just filter out requested accounts that aren't in the wallet... But probably not a big deal either way

Copy link
Contributor

Choose a reason for hiding this comment

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

I don't necessarily think we need to block on this. We can resolve it in #4813

Copy link
Member

@Gudahtt Gudahtt Nov 13, 2024

Choose a reason for hiding this comment

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

I tried updating this to use isSupportedAccount locally, and found it was more trouble than it was worth. isSupportedAccount takes the CAIP account ID as input, but here we're filtering to just Eth accounts first. Which does seem easier, because then we're not re-checking the same account twice each time we see it referenced in a new scope.

Maybe we don't need isSupportedAccount. Seems fine delete it, at least for now. But agreed that it's not a blocker.

Copy link
Contributor

Choose a reason for hiding this comment

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

I did the same and decided to leave it for now. I'll leave it in since it seems to include some filtering related to SCAs that we may want soon?

Gudahtt
Gudahtt previously approved these changes Nov 13, 2024
Copy link
Member

@Gudahtt Gudahtt left a comment

Choose a reason for hiding this comment

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

LGTM!

Gudahtt
Gudahtt previously approved these changes Nov 13, 2024
@adonesky1 adonesky1 enabled auto-merge (squash) November 13, 2024 21:44
@adonesky1 adonesky1 merged commit 1e7d70e into main Nov 13, 2024
120 checks passed
@adonesky1 adonesky1 deleted the caip-multichain branch November 13, 2024 21:49
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.

5 participants