Skip to content

Commit ccd9f4c

Browse files
committed
Grant permitted chains permission on install/update
1 parent a5b2c60 commit ccd9f4c

File tree

3 files changed

+211
-14
lines changed

3 files changed

+211
-14
lines changed

packages/snaps-controllers/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,13 @@
5757
"@metamask/base-controller": "^6.0.2",
5858
"@metamask/json-rpc-engine": "^9.0.2",
5959
"@metamask/json-rpc-middleware-stream": "^8.0.2",
60+
"@metamask/network-controller": "^20.1.0",
6061
"@metamask/object-multiplex": "^2.0.0",
6162
"@metamask/permission-controller": "^11.0.0",
6263
"@metamask/phishing-controller": "^10.1.1",
6364
"@metamask/post-message-stream": "^8.1.0",
6465
"@metamask/rpc-errors": "^6.3.1",
66+
"@metamask/selected-network-controller": "^17.0.0",
6567
"@metamask/snaps-registry": "^3.2.1",
6668
"@metamask/snaps-rpc-methods": "workspace:^",
6769
"@metamask/snaps-sdk": "workspace:^",

packages/snaps-controllers/src/snaps/SnapController.ts

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type {
44
} from '@metamask/approval-controller';
55
import type { RestrictedControllerMessenger } from '@metamask/base-controller';
66
import { BaseController } from '@metamask/base-controller';
7+
import type { NetworkControllerGetNetworkClientByIdAction } from '@metamask/network-controller';
78
import type {
89
Caveat,
910
GetEndowments,
@@ -26,6 +27,7 @@ import type {
2627
} from '@metamask/permission-controller';
2728
import { SubjectType } from '@metamask/permission-controller';
2829
import { rpcErrors } from '@metamask/rpc-errors';
30+
import type { SelectedNetworkControllerGetNetworkClientIdForDomainAction } from '@metamask/selected-network-controller';
2931
import type { BlockReason } from '@metamask/snaps-registry';
3032
import {
3133
WALLET_SNAP_PERMISSION_KEY,
@@ -556,7 +558,9 @@ export type AllowedActions =
556558
| Update
557559
| ResolveVersion
558560
| CreateInterface
559-
| GetInterface;
561+
| GetInterface
562+
| NetworkControllerGetNetworkClientByIdAction
563+
| SelectedNetworkControllerGetNetworkClientIdForDomainAction;
560564

561565
export type AllowedEvents =
562566
| ExecutionServiceEvents
@@ -3624,7 +3628,50 @@ export class SnapController extends BaseController<
36243628
}
36253629

36263630
/**
3627-
* Updates the permissions for a snap following an install, update or rollback.
3631+
* Get the permissions to grant to a Snap following an install, update or
3632+
* rollback.
3633+
*
3634+
* @param snapId - The snap ID.
3635+
* @param newPermissions - The new permissions to be granted.
3636+
* @returns The permissions to grant to the Snap.
3637+
*/
3638+
#getPermissionsToGrant(snapId: SnapId, newPermissions: RequestedPermissions) {
3639+
if (Object.keys(newPermissions).includes(SnapEndowments.EthereumProvider)) {
3640+
const networkClientId = this.messagingSystem.call(
3641+
'SelectedNetworkController:getNetworkClientIdForDomain',
3642+
snapId,
3643+
);
3644+
3645+
const { configuration } = this.messagingSystem.call(
3646+
'NetworkController:getNetworkClientById',
3647+
networkClientId,
3648+
);
3649+
3650+
// This needs to be assigned to have proper type inference.
3651+
const modifiedPermissions: RequestedPermissions = {
3652+
...newPermissions,
3653+
permittedChains: {
3654+
caveats: [
3655+
{
3656+
type: 'restrictNetworkSwitching',
3657+
value: [configuration.chainId],
3658+
},
3659+
],
3660+
date: Date.now(),
3661+
id: nanoid(),
3662+
invoker: snapId,
3663+
parentCapability: 'permittedChains',
3664+
},
3665+
};
3666+
3667+
return modifiedPermissions;
3668+
}
3669+
3670+
return newPermissions;
3671+
}
3672+
3673+
/**
3674+
* Update the permissions for a snap following an install, update or rollback.
36283675
*
36293676
* Grants newly requested permissions and revokes unused/revoked permissions.
36303677
*
@@ -3657,8 +3704,13 @@ export class SnapController extends BaseController<
36573704
}
36583705

36593706
if (isNonEmptyArray(Object.keys(newPermissions))) {
3707+
const approvedPermissions = this.#getPermissionsToGrant(
3708+
snapId,
3709+
newPermissions,
3710+
);
3711+
36603712
this.messagingSystem.call('PermissionController:grantPermissions', {
3661-
approvedPermissions: newPermissions,
3713+
approvedPermissions,
36623714
subject: { origin: snapId },
36633715
requestData,
36643716
});

yarn.lock

Lines changed: 154 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4422,6 +4422,49 @@ __metadata:
44224422
languageName: node
44234423
linkType: hard
44244424

4425+
"@metamask/eth-block-tracker@npm:^9.0.3":
4426+
version: 9.0.3
4427+
resolution: "@metamask/eth-block-tracker@npm:9.0.3"
4428+
dependencies:
4429+
"@metamask/eth-json-rpc-provider": ^3.0.2
4430+
"@metamask/safe-event-emitter": ^3.0.0
4431+
"@metamask/utils": ^8.1.0
4432+
json-rpc-random-id: ^1.0.1
4433+
pify: ^5.0.0
4434+
checksum: edd3d59a0416752d90c8e2d8c10c31635dbe3eb323fcb054c401528afe4cbbb6a5a85aedd6ffee4a504d9779656bfab027f2274fd95981c90bf56b6f565dbca2
4435+
languageName: node
4436+
linkType: hard
4437+
4438+
"@metamask/eth-json-rpc-infura@npm:^9.1.0":
4439+
version: 9.1.0
4440+
resolution: "@metamask/eth-json-rpc-infura@npm:9.1.0"
4441+
dependencies:
4442+
"@metamask/eth-json-rpc-provider": ^2.1.0
4443+
"@metamask/json-rpc-engine": ^7.1.1
4444+
"@metamask/rpc-errors": ^6.0.0
4445+
"@metamask/utils": ^8.1.0
4446+
node-fetch: ^2.7.0
4447+
checksum: 58f2a6b6ce9c545c9210b2ab3f8c0946cc82ed02c82a096406d8c7146c89c1eba1a13e472048a6e252906dd5eb336e63238d9a5446407c1d46b1d6a40e2a64f4
4448+
languageName: node
4449+
linkType: hard
4450+
4451+
"@metamask/eth-json-rpc-middleware@npm:^12.1.1":
4452+
version: 12.1.2
4453+
resolution: "@metamask/eth-json-rpc-middleware@npm:12.1.2"
4454+
dependencies:
4455+
"@metamask/eth-block-tracker": ^9.0.3
4456+
"@metamask/eth-json-rpc-provider": ^3.0.2
4457+
"@metamask/eth-sig-util": ^7.0.0
4458+
"@metamask/json-rpc-engine": ^8.0.2
4459+
"@metamask/rpc-errors": ^6.0.0
4460+
"@metamask/utils": ^8.1.0
4461+
klona: ^2.0.6
4462+
pify: ^5.0.0
4463+
safe-stable-stringify: ^2.4.3
4464+
checksum: 0334fa8e51d73488e42e1cd663e90012f4055c5cd04cb4ff371ecb3552b82cd271f27a88ff0187ad23f195cfbbba467126711c08b20c1124083a706a85524a82
4465+
languageName: node
4466+
linkType: hard
4467+
44254468
"@metamask/eth-json-rpc-middleware@npm:^13.0.0":
44264469
version: 13.0.0
44274470
resolution: "@metamask/eth-json-rpc-middleware@npm:13.0.0"
@@ -4441,16 +4484,38 @@ __metadata:
44414484
languageName: node
44424485
linkType: hard
44434486

4444-
"@metamask/eth-json-rpc-provider@npm:^4.0.0":
4445-
version: 4.1.2
4446-
resolution: "@metamask/eth-json-rpc-provider@npm:4.1.2"
4487+
"@metamask/eth-json-rpc-provider@npm:^2.1.0":
4488+
version: 2.3.2
4489+
resolution: "@metamask/eth-json-rpc-provider@npm:2.3.2"
4490+
dependencies:
4491+
"@metamask/json-rpc-engine": ^7.3.2
4492+
"@metamask/safe-event-emitter": ^3.0.0
4493+
"@metamask/utils": ^8.3.0
4494+
checksum: e6731271aad3b972d85b9230c26d35a9b88722f3bd3024675ad2f568e634e9fdfef4717ef2892f3cc512d381cf17a4e20dbd5eb808ced765082bea3379ad6ddc
4495+
languageName: node
4496+
linkType: hard
4497+
4498+
"@metamask/eth-json-rpc-provider@npm:^3.0.2":
4499+
version: 3.0.2
4500+
resolution: "@metamask/eth-json-rpc-provider@npm:3.0.2"
4501+
dependencies:
4502+
"@metamask/json-rpc-engine": ^8.0.2
4503+
"@metamask/safe-event-emitter": ^3.0.0
4504+
"@metamask/utils": ^8.3.0
4505+
checksum: 0321eaad6fa205a9d3ddcfaf28e63c05291614893cb2e116151185a4acbd6bb6a508d6e556b3cb8bc4d3caef4bf0a638202d9b6bdc127fbcb81715eb2660a809
4506+
languageName: node
4507+
linkType: hard
4508+
4509+
"@metamask/eth-json-rpc-provider@npm:^4.0.0, @metamask/eth-json-rpc-provider@npm:^4.1.2":
4510+
version: 4.1.3
4511+
resolution: "@metamask/eth-json-rpc-provider@npm:4.1.3"
44474512
dependencies:
44484513
"@metamask/json-rpc-engine": ^9.0.2
44494514
"@metamask/rpc-errors": ^6.3.1
44504515
"@metamask/safe-event-emitter": ^3.0.0
44514516
"@metamask/utils": ^9.1.0
44524517
uuid: ^8.3.2
4453-
checksum: d7092ce64fc185796a0be3f339da1718e280159f06e8fdf29a002b4573abd0903219a527a4c5890952d5e66dbe56b5c3e53d42aa8a4bbc25acbdf6efadcff6ea
4518+
checksum: 788c1f983d8021a10922f414f7c5aa93f79e14000219bd5155f027c1964e73d08e931cb98749057f57fb4001441098724aedacbe2198ab5a0b28cc3fcb4d262d
44544519
languageName: node
44554520
linkType: hard
44564521

@@ -4881,6 +4946,28 @@ __metadata:
48814946
languageName: unknown
48824947
linkType: soft
48834948

4949+
"@metamask/json-rpc-engine@npm:^7.1.1, @metamask/json-rpc-engine@npm:^7.3.2":
4950+
version: 7.3.3
4951+
resolution: "@metamask/json-rpc-engine@npm:7.3.3"
4952+
dependencies:
4953+
"@metamask/rpc-errors": ^6.2.1
4954+
"@metamask/safe-event-emitter": ^3.0.0
4955+
"@metamask/utils": ^8.3.0
4956+
checksum: 7bab8b4d2341a6243ba451bc58283f0a6905b09f7257857859848a51a795444ca6899b1a6908b15f8ed236fb574ab85a630c9cb28d127ab52c4630e496c16006
4957+
languageName: node
4958+
linkType: hard
4959+
4960+
"@metamask/json-rpc-engine@npm:^8.0.2":
4961+
version: 8.0.2
4962+
resolution: "@metamask/json-rpc-engine@npm:8.0.2"
4963+
dependencies:
4964+
"@metamask/rpc-errors": ^6.2.1
4965+
"@metamask/safe-event-emitter": ^3.0.0
4966+
"@metamask/utils": ^8.3.0
4967+
checksum: c240d298ad503d93922a94a62cf59f0344b6d6644a523bc8ea3c0f321bea7172b89f2747a5618e2861b2e8152ae5086b76f391a10e4566529faa50b8850c051d
4968+
languageName: node
4969+
linkType: hard
4970+
48844971
"@metamask/json-rpc-engine@npm:^9.0.0, @metamask/json-rpc-engine@npm:^9.0.1, @metamask/json-rpc-engine@npm:^9.0.2":
48854972
version: 9.0.2
48864973
resolution: "@metamask/json-rpc-engine@npm:9.0.2"
@@ -5135,6 +5222,29 @@ __metadata:
51355222
languageName: unknown
51365223
linkType: soft
51375224

5225+
"@metamask/network-controller@npm:^20.1.0":
5226+
version: 20.1.0
5227+
resolution: "@metamask/network-controller@npm:20.1.0"
5228+
dependencies:
5229+
"@metamask/base-controller": ^6.0.2
5230+
"@metamask/controller-utils": ^11.0.2
5231+
"@metamask/eth-block-tracker": ^9.0.3
5232+
"@metamask/eth-json-rpc-infura": ^9.1.0
5233+
"@metamask/eth-json-rpc-middleware": ^12.1.1
5234+
"@metamask/eth-json-rpc-provider": ^4.1.2
5235+
"@metamask/eth-query": ^4.0.0
5236+
"@metamask/json-rpc-engine": ^9.0.2
5237+
"@metamask/rpc-errors": ^6.3.1
5238+
"@metamask/swappable-obj-proxy": ^2.2.0
5239+
"@metamask/utils": ^9.1.0
5240+
async-mutex: ^0.5.0
5241+
immer: ^9.0.6
5242+
loglevel: ^1.8.1
5243+
uuid: ^8.3.2
5244+
checksum: 41aa7f2cd693850b3f3ce3a0937b67bdca482bf573b1b96fa36cbf75728c3593c2082b2cd99497cf2cb182912f73e784a6cc8c4db0357bf452caa2d5890329c7
5245+
languageName: node
5246+
linkType: hard
5247+
51385248
"@metamask/network-example-snap@workspace:^, @metamask/network-example-snap@workspace:packages/examples/packages/network-access":
51395249
version: 0.0.0-use.local
51405250
resolution: "@metamask/network-example-snap@workspace:packages/examples/packages/network-access"
@@ -5337,7 +5447,7 @@ __metadata:
53375447
languageName: unknown
53385448
linkType: soft
53395449

5340-
"@metamask/rpc-errors@npm:^6.0.0, @metamask/rpc-errors@npm:^6.3.1":
5450+
"@metamask/rpc-errors@npm:^6.0.0, @metamask/rpc-errors@npm:^6.2.1, @metamask/rpc-errors@npm:^6.3.1":
53415451
version: 6.3.1
53425452
resolution: "@metamask/rpc-errors@npm:6.3.1"
53435453
dependencies:
@@ -5364,6 +5474,21 @@ __metadata:
53645474
languageName: node
53655475
linkType: hard
53665476

5477+
"@metamask/selected-network-controller@npm:^17.0.0":
5478+
version: 17.0.0
5479+
resolution: "@metamask/selected-network-controller@npm:17.0.0"
5480+
dependencies:
5481+
"@metamask/base-controller": ^6.0.2
5482+
"@metamask/json-rpc-engine": ^9.0.2
5483+
"@metamask/swappable-obj-proxy": ^2.2.0
5484+
"@metamask/utils": ^9.1.0
5485+
peerDependencies:
5486+
"@metamask/network-controller": ^20.0.0
5487+
"@metamask/permission-controller": ^11.0.0
5488+
checksum: 8ad6a64c4e51a7538e85b81065e1b2fc3648bc771f8406eafd2d53064b09739b2c6d1b2b6d6b1e8e17bad5400cee0206235f82cad4e51308263306d8fac32845
5489+
languageName: node
5490+
linkType: hard
5491+
53675492
"@metamask/signature-insights-example-snap@workspace:^, @metamask/signature-insights-example-snap@workspace:packages/examples/packages/signature-insights":
53685493
version: 0.0.0-use.local
53695494
resolution: "@metamask/signature-insights-example-snap@workspace:packages/examples/packages/signature-insights"
@@ -5562,11 +5687,13 @@ __metadata:
55625687
"@metamask/eslint-config-typescript": ^12.1.0
55635688
"@metamask/json-rpc-engine": ^9.0.2
55645689
"@metamask/json-rpc-middleware-stream": ^8.0.2
5690+
"@metamask/network-controller": ^20.1.0
55655691
"@metamask/object-multiplex": ^2.0.0
55665692
"@metamask/permission-controller": ^11.0.0
55675693
"@metamask/phishing-controller": ^10.1.1
55685694
"@metamask/post-message-stream": ^8.1.0
55695695
"@metamask/rpc-errors": ^6.3.1
5696+
"@metamask/selected-network-controller": ^17.0.0
55705697
"@metamask/snaps-registry": ^3.2.1
55715698
"@metamask/snaps-rpc-methods": "workspace:^"
55725699
"@metamask/snaps-sdk": "workspace:^"
@@ -6162,6 +6289,13 @@ __metadata:
61626289
languageName: node
61636290
linkType: hard
61646291

6292+
"@metamask/swappable-obj-proxy@npm:^2.2.0":
6293+
version: 2.2.0
6294+
resolution: "@metamask/swappable-obj-proxy@npm:2.2.0"
6295+
checksum: 343c95f72c96776980ef3e70600f7fa312be9a75683c132404a66ddd3c507abadee9c4deba1385246f73bded1938a7958e5a89fc407c19dfc352dd9b398e216f
6296+
languageName: node
6297+
linkType: hard
6298+
61656299
"@metamask/template-snap@npm:^0.7.0":
61666300
version: 0.7.0
61676301
resolution: "@metamask/template-snap@npm:0.7.0"
@@ -6255,7 +6389,7 @@ __metadata:
62556389
languageName: unknown
62566390
linkType: soft
62576391

6258-
"@metamask/utils@npm:^8.1.0, @metamask/utils@npm:^8.2.0, @metamask/utils@npm:^8.2.1":
6392+
"@metamask/utils@npm:^8.1.0, @metamask/utils@npm:^8.2.0, @metamask/utils@npm:^8.2.1, @metamask/utils@npm:^8.3.0":
62596393
version: 8.5.0
62606394
resolution: "@metamask/utils@npm:8.5.0"
62616395
dependencies:
@@ -9442,6 +9576,15 @@ __metadata:
94429576
languageName: node
94439577
linkType: hard
94449578

9579+
"async-mutex@npm:^0.5.0":
9580+
version: 0.5.0
9581+
resolution: "async-mutex@npm:0.5.0"
9582+
dependencies:
9583+
tslib: ^2.4.0
9584+
checksum: be1587f4875f3bb15e34e9fcce82eac2966daef4432c8d0046e61947fb9a1b95405284601bc7ce4869319249bc07c75100880191db6af11d1498931ac2a2f9ea
9585+
languageName: node
9586+
linkType: hard
9587+
94459588
"async@npm:^3.2.3, async@npm:^3.2.4":
94469589
version: 3.2.4
94479590
resolution: "async@npm:3.2.4"
@@ -16904,10 +17047,10 @@ __metadata:
1690417047
languageName: node
1690517048
linkType: hard
1690617049

16907-
"loglevel@npm:^1.6.0":
16908-
version: 1.8.1
16909-
resolution: "loglevel@npm:1.8.1"
16910-
checksum: a1a62db40291aaeaef2f612334c49e531bff71cc1d01a2acab689ab80d59e092f852ab164a5aedc1a752fdc46b7b162cb097d8a9eb2cf0b299511106c29af61d
17050+
"loglevel@npm:^1.6.0, loglevel@npm:^1.8.1":
17051+
version: 1.9.1
17052+
resolution: "loglevel@npm:1.9.1"
17053+
checksum: e1c8586108c4d566122e91f8a79c8df728920e3a714875affa5120566761a24077ec8ec9e5fc388b022e39fc411ec6e090cde1b5775871241b045139771eeb06
1691117054
languageName: node
1691217055
linkType: hard
1691317056

@@ -17822,7 +17965,7 @@ __metadata:
1782217965
languageName: node
1782317966
linkType: hard
1782417967

17825-
"node-fetch@npm:^2.6.11, node-fetch@npm:^2.6.12":
17968+
"node-fetch@npm:^2.6.11, node-fetch@npm:^2.6.12, node-fetch@npm:^2.7.0":
1782617969
version: 2.7.0
1782717970
resolution: "node-fetch@npm:2.7.0"
1782817971
dependencies:

0 commit comments

Comments
 (0)