@@ -5330,7 +5330,7 @@ describe('SnapController', () => {
53305330 snapController . destroy ( ) ;
53315331 } ) ;
53325332
5333- it ( 'grants permitted chains permission to Snaps with `endowment:ethereum-provider`' , async ( ) => {
5333+ it ( 'grants the `endowment:permitted- chains` permission to a Snap with `endowment:ethereum-provider`' , async ( ) => {
53345334 const rootMessenger = getControllerMessenger ( ) ;
53355335 const messenger = getSnapControllerMessenger ( rootMessenger ) ;
53365336
@@ -5389,6 +5389,145 @@ describe('SnapController', () => {
53895389 snapController . destroy ( ) ;
53905390 } ) ;
53915391
5392+ it ( 'overrides the `endowment:permitted-chains` permission if the Snap specifies it in its manifest' , async ( ) => {
5393+ const rootMessenger = getControllerMessenger ( ) ;
5394+ const messenger = getSnapControllerMessenger ( rootMessenger ) ;
5395+
5396+ rootMessenger . registerActionHandler (
5397+ 'PermissionController:getPermissions' ,
5398+ ( ) => ( { } ) ,
5399+ ) ;
5400+
5401+ rootMessenger . registerActionHandler (
5402+ 'SelectedNetworkController:getNetworkClientIdForDomain' ,
5403+ ( ) => 'mainnet' ,
5404+ ) ;
5405+
5406+ rootMessenger . registerActionHandler (
5407+ 'NetworkController:getNetworkClientById' ,
5408+ ( ) => ( {
5409+ // @ts -expect-error - Partial network client.
5410+ configuration : {
5411+ chainId : '0x1' ,
5412+ } ,
5413+ } ) ,
5414+ ) ;
5415+
5416+ const { manifest } = await getMockSnapFilesWithUpdatedChecksum ( {
5417+ manifest : getSnapManifest ( {
5418+ initialPermissions : {
5419+ 'endowment:page-home' : { } ,
5420+ 'endowment:ethereum-provider' : { } ,
5421+ [ PERMITTED_CHAINS_ENDOWMENT ] : {
5422+ caveats : [
5423+ {
5424+ type : 'restrictNetworkSwitching' ,
5425+ value : [ '0x5' ] ,
5426+ } ,
5427+ ] ,
5428+ } ,
5429+ } ,
5430+ } ) ,
5431+ } ) ;
5432+
5433+ const snapController = getSnapController (
5434+ getSnapControllerOptions ( {
5435+ messenger,
5436+ detectSnapLocation : loopbackDetect ( { manifest } ) ,
5437+ } ) ,
5438+ ) ;
5439+
5440+ await snapController . installSnaps ( MOCK_ORIGIN , {
5441+ [ MOCK_SNAP_ID ] : { } ,
5442+ } ) ;
5443+
5444+ const approvedPermissions = {
5445+ 'endowment:page-home' : {
5446+ caveats : null ,
5447+ } ,
5448+ 'endowment:ethereum-provider' : { } ,
5449+ [ PERMITTED_CHAINS_ENDOWMENT ] : {
5450+ caveats : [
5451+ {
5452+ type : 'restrictNetworkSwitching' ,
5453+ value : [ '0x1' ] ,
5454+ } ,
5455+ ] ,
5456+ } ,
5457+ } ;
5458+
5459+ expect ( messenger . call ) . toHaveBeenCalledWith (
5460+ 'PermissionController:grantPermissions' ,
5461+ {
5462+ approvedPermissions,
5463+ subject : { origin : MOCK_SNAP_ID } ,
5464+ requestData : expect . any ( Object ) ,
5465+ } ,
5466+ ) ;
5467+
5468+ snapController . destroy ( ) ;
5469+ } ) ;
5470+
5471+ it ( 'does not grant the `endowment:permitted-chains` permission if the Snap does not have the `endowment:ethereum-provider` permission' , async ( ) => {
5472+ const rootMessenger = getControllerMessenger ( ) ;
5473+ const messenger = getSnapControllerMessenger ( rootMessenger ) ;
5474+
5475+ rootMessenger . registerActionHandler (
5476+ 'PermissionController:getPermissions' ,
5477+ ( ) => ( { } ) ,
5478+ ) ;
5479+
5480+ rootMessenger . registerActionHandler (
5481+ 'SelectedNetworkController:getNetworkClientIdForDomain' ,
5482+ ( ) => {
5483+ throw new Error ( 'This should not be called.' ) ;
5484+ } ,
5485+ ) ;
5486+
5487+ rootMessenger . registerActionHandler (
5488+ 'NetworkController:getNetworkClientById' ,
5489+ ( ) => {
5490+ throw new Error ( 'This should not be called.' ) ;
5491+ } ,
5492+ ) ;
5493+
5494+ const { manifest } = await getMockSnapFilesWithUpdatedChecksum ( {
5495+ manifest : getSnapManifest ( {
5496+ initialPermissions : {
5497+ 'endowment:page-home' : { } ,
5498+ } ,
5499+ } ) ,
5500+ } ) ;
5501+
5502+ const snapController = getSnapController (
5503+ getSnapControllerOptions ( {
5504+ messenger,
5505+ detectSnapLocation : loopbackDetect ( { manifest } ) ,
5506+ } ) ,
5507+ ) ;
5508+
5509+ await snapController . installSnaps ( MOCK_ORIGIN , {
5510+ [ MOCK_SNAP_ID ] : { } ,
5511+ } ) ;
5512+
5513+ const approvedPermissions = {
5514+ 'endowment:page-home' : {
5515+ caveats : null ,
5516+ } ,
5517+ } ;
5518+
5519+ expect ( messenger . call ) . toHaveBeenCalledWith (
5520+ 'PermissionController:grantPermissions' ,
5521+ {
5522+ approvedPermissions,
5523+ subject : { origin : MOCK_SNAP_ID } ,
5524+ requestData : expect . any ( Object ) ,
5525+ } ,
5526+ ) ;
5527+
5528+ snapController . destroy ( ) ;
5529+ } ) ;
5530+
53925531 it ( 'supports preinstalled snaps' , async ( ) => {
53935532 const rootMessenger = getControllerMessenger ( ) ;
53945533 jest . spyOn ( rootMessenger , 'call' ) ;
0 commit comments