11import { rpcErrors } from '@metamask/rpc-errors' ;
2- import { CaipChainId , Hex , KnownCaipNamespace } from '@metamask/utils' ;
2+ import {
3+ CaipChainId ,
4+ Hex ,
5+ KnownCaipNamespace ,
6+ parseCaipAccountId ,
7+ } from '@metamask/utils' ;
38import {
49 NavigationContainerRef ,
510 ParamListBase ,
@@ -317,6 +322,11 @@ export const getScopedPermissions = async ({
317322 const namespaces : Record < string , NamespaceConfig > = { } ;
318323 // EIP155 namespace
319324 const approvedAccounts = getPermittedAccounts ( channelId ) ;
325+ if ( ! Array . isArray ( approvedAccounts ) ) {
326+ throw rpcErrors . internal ( {
327+ message : `WalletConnect permissions are in an unexpected format: approved accounts must be an array.` ,
328+ } ) ;
329+ }
320330 const permittedChains = await getPermittedChains ( channelId ) ;
321331 const evmChains = permittedChains . filter ( ( chain ) =>
322332 chain . startsWith ( `${ KnownCaipNamespace . Eip155 } :` ) ,
@@ -329,9 +339,7 @@ export const getScopedPermissions = async ({
329339 methods : APPROVED_METHODS_BY_NAMESPACE [ KnownCaipNamespace . Eip155 ] ,
330340 events : [ 'chainChanged' , 'accountsChanged' ] ,
331341 accounts : evmChains . flatMap ( ( chain ) =>
332- Array . isArray ( approvedAccounts )
333- ? approvedAccounts . map ( ( account ) => `${ chain } :${ account } ` )
334- : [ ] ,
342+ approvedAccounts . map ( ( account ) => `${ chain } :${ account } ` ) ,
335343 ) ,
336344 } ;
337345
@@ -352,14 +360,20 @@ export const getScopedPermissions = async ({
352360 )
353361 . filter ( ( account ) => account . startsWith ( `${ KnownCaipNamespace . Tron } :` ) )
354362 . flatMap ( ( account ) => {
355- const [ namespace , chainRef , ...addressParts ] = account . split ( ':' ) ;
356- if ( namespace !== KnownCaipNamespace . Tron || ! chainRef ) {
363+ try {
364+ const parsedAccount = parseCaipAccountId ( account ) ;
365+ if ( parsedAccount . chain . namespace !== KnownCaipNamespace . Tron ) {
366+ return [ account ] ;
367+ }
368+
369+ const chainId = `${ parsedAccount . chain . namespace } :${ parsedAccount . chain . reference } ` ;
370+ return getCompatibleTronCaipChainIdsForWalletConnect ( chainId ) . map (
371+ ( compatibleChainId ) =>
372+ `${ compatibleChainId } :${ parsedAccount . address } ` ,
373+ ) ;
374+ } catch {
357375 return [ account ] ;
358376 }
359- const address = addressParts . join ( ':' ) ;
360- return getCompatibleTronCaipChainIdsForWalletConnect (
361- `${ namespace } :${ chainRef } ` ,
362- ) . map ( ( chainId ) => `${ chainId } :${ address } ` ) ;
363377 } )
364378 : [ ] ;
365379
0 commit comments