@@ -4880,7 +4880,7 @@ describe('SnapController', () => {
48804880 snapController . destroy ( ) ;
48814881 } ) ;
48824882
4883- it ( 'grants permitted chains permission to Snaps with `endowment:ethereum-provider`' , async ( ) => {
4883+ it ( 'grants the `endowment:permitted- chains` permission to a Snap with `endowment:ethereum-provider`' , async ( ) => {
48844884 const rootMessenger = getControllerMessenger ( ) ;
48854885 const messenger = getSnapControllerMessenger ( rootMessenger ) ;
48864886
@@ -4951,6 +4951,145 @@ describe('SnapController', () => {
49514951 snapController . destroy ( ) ;
49524952 } ) ;
49534953
4954+ it ( 'overrides the `endowment:permitted-chains` permission if the Snap specifies it in its manifest' , async ( ) => {
4955+ const rootMessenger = getControllerMessenger ( ) ;
4956+ const messenger = getSnapControllerMessenger ( rootMessenger ) ;
4957+
4958+ rootMessenger . registerActionHandler (
4959+ 'PermissionController:getPermissions' ,
4960+ ( ) => ( { } ) ,
4961+ ) ;
4962+
4963+ rootMessenger . registerActionHandler (
4964+ 'SelectedNetworkController:getNetworkClientIdForDomain' ,
4965+ ( ) => 'mainnet' ,
4966+ ) ;
4967+
4968+ rootMessenger . registerActionHandler (
4969+ 'NetworkController:getNetworkClientById' ,
4970+ ( ) => ( {
4971+ // @ts -expect-error - Partial network client.
4972+ configuration : {
4973+ chainId : '0x1' ,
4974+ } ,
4975+ } ) ,
4976+ ) ;
4977+
4978+ const { manifest } = await getMockSnapFilesWithUpdatedChecksum ( {
4979+ manifest : getSnapManifest ( {
4980+ initialPermissions : {
4981+ 'endowment:page-home' : { } ,
4982+ 'endowment:ethereum-provider' : { } ,
4983+ [ PERMITTED_CHAINS_ENDOWMENT ] : {
4984+ caveats : [
4985+ {
4986+ type : 'restrictNetworkSwitching' ,
4987+ value : [ '0x5' ] ,
4988+ } ,
4989+ ] ,
4990+ } ,
4991+ } ,
4992+ } ) ,
4993+ } ) ;
4994+
4995+ const snapController = getSnapController (
4996+ getSnapControllerOptions ( {
4997+ messenger,
4998+ detectSnapLocation : loopbackDetect ( { manifest } ) ,
4999+ } ) ,
5000+ ) ;
5001+
5002+ await snapController . installSnaps ( MOCK_ORIGIN , {
5003+ [ MOCK_SNAP_ID ] : { } ,
5004+ } ) ;
5005+
5006+ const approvedPermissions = {
5007+ 'endowment:page-home' : {
5008+ caveats : null ,
5009+ } ,
5010+ 'endowment:ethereum-provider' : { } ,
5011+ [ PERMITTED_CHAINS_ENDOWMENT ] : {
5012+ caveats : [
5013+ {
5014+ type : 'restrictNetworkSwitching' ,
5015+ value : [ '0x1' ] ,
5016+ } ,
5017+ ] ,
5018+ } ,
5019+ } ;
5020+
5021+ expect ( messenger . call ) . toHaveBeenCalledWith (
5022+ 'PermissionController:grantPermissions' ,
5023+ {
5024+ approvedPermissions,
5025+ subject : { origin : MOCK_SNAP_ID } ,
5026+ requestData : expect . any ( Object ) ,
5027+ } ,
5028+ ) ;
5029+
5030+ snapController . destroy ( ) ;
5031+ } ) ;
5032+
5033+ it ( 'does not grant the `endowment:permitted-chains` permission if the Snap does not have the `endowment:ethereum-provider` permission' , async ( ) => {
5034+ const rootMessenger = getControllerMessenger ( ) ;
5035+ const messenger = getSnapControllerMessenger ( rootMessenger ) ;
5036+
5037+ rootMessenger . registerActionHandler (
5038+ 'PermissionController:getPermissions' ,
5039+ ( ) => ( { } ) ,
5040+ ) ;
5041+
5042+ rootMessenger . registerActionHandler (
5043+ 'SelectedNetworkController:getNetworkClientIdForDomain' ,
5044+ ( ) => {
5045+ throw new Error ( 'This should not be called.' ) ;
5046+ } ,
5047+ ) ;
5048+
5049+ rootMessenger . registerActionHandler (
5050+ 'NetworkController:getNetworkClientById' ,
5051+ ( ) => {
5052+ throw new Error ( 'This should not be called.' ) ;
5053+ } ,
5054+ ) ;
5055+
5056+ const { manifest } = await getMockSnapFilesWithUpdatedChecksum ( {
5057+ manifest : getSnapManifest ( {
5058+ initialPermissions : {
5059+ 'endowment:page-home' : { } ,
5060+ } ,
5061+ } ) ,
5062+ } ) ;
5063+
5064+ const snapController = getSnapController (
5065+ getSnapControllerOptions ( {
5066+ messenger,
5067+ detectSnapLocation : loopbackDetect ( { manifest } ) ,
5068+ } ) ,
5069+ ) ;
5070+
5071+ await snapController . installSnaps ( MOCK_ORIGIN , {
5072+ [ MOCK_SNAP_ID ] : { } ,
5073+ } ) ;
5074+
5075+ const approvedPermissions = {
5076+ 'endowment:page-home' : {
5077+ caveats : null ,
5078+ } ,
5079+ } ;
5080+
5081+ expect ( messenger . call ) . toHaveBeenCalledWith (
5082+ 'PermissionController:grantPermissions' ,
5083+ {
5084+ approvedPermissions,
5085+ subject : { origin : MOCK_SNAP_ID } ,
5086+ requestData : expect . any ( Object ) ,
5087+ } ,
5088+ ) ;
5089+
5090+ snapController . destroy ( ) ;
5091+ } ) ;
5092+
49545093 it ( 'supports preinstalled snaps' , async ( ) => {
49555094 const rootMessenger = getControllerMessenger ( ) ;
49565095 jest . spyOn ( rootMessenger , 'call' ) ;
0 commit comments