diff --git a/packages/chain-agnostic-permission/src/caip25Permission.test.ts b/packages/chain-agnostic-permission/src/caip25Permission.test.ts index 075e9806572..b155eed7736 100644 --- a/packages/chain-agnostic-permission/src/caip25Permission.test.ts +++ b/packages/chain-agnostic-permission/src/caip25Permission.test.ts @@ -901,6 +901,24 @@ describe('caip25CaveatBuilder', () => { ).toBeUndefined(); }); + it('throws an error if both requiredScopes and optionalScopes are empty', () => { + expect(() => { + validator({ + type: Caip25CaveatType, + value: { + requiredScopes: {}, + optionalScopes: {}, + sessionProperties: {}, + isMultichainOrigin: true, + }, + }); + }).toThrow( + new Error( + `${Caip25EndowmentPermissionName} error: Received no scopes for caveat of type "${Caip25CaveatType}".`, + ), + ); + }); + describe('permission merger', () => { describe('incremental request an existing scope (requiredScopes), and 2 whole new scopes (optionalScopes) with accounts', () => { it('should return merged scope with previously existing chain and accounts, plus new requested chains with new accounts', () => { diff --git a/packages/chain-agnostic-permission/src/caip25Permission.ts b/packages/chain-agnostic-permission/src/caip25Permission.ts index ed83b4f4b1d..73ce39f8d2b 100644 --- a/packages/chain-agnostic-permission/src/caip25Permission.ts +++ b/packages/chain-agnostic-permission/src/caip25Permission.ts @@ -202,6 +202,15 @@ export const caip25CaveatBuilder = ({ assertIsInternalScopesObject(requiredScopes); assertIsInternalScopesObject(optionalScopes); + if ( + Object.keys(requiredScopes).length === 0 && + Object.keys(optionalScopes).length === 0 + ) { + throw new Error( + `${Caip25EndowmentPermissionName} error: Received no scopes for caveat of type "${Caip25CaveatType}".`, + ); + } + const isEvmChainIdSupported = (chainId: Hex) => { try { findNetworkClientIdByChainId(chainId);