Skip to content

Commit 3e5c974

Browse files
committed
chore(walletconnect): enforce multichain caveat origin and harden account parsing
1 parent 86a65ac commit 3e5c974

2 files changed

Lines changed: 28 additions & 11 deletions

File tree

app/core/WalletConnect/WalletConnectV2.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,10 @@ export class WC2Manager {
659659

660660
try {
661661
// Create a modified CAIP-25 caveat value that includes the current chain
662-
const caveatValue = getDefaultCaip25CaveatValue();
662+
const caveatValue = {
663+
...getDefaultCaip25CaveatValue(),
664+
isMultichainOrigin: true,
665+
};
663666

664667
// Important: Use hostname as the origin for permission request to ensure consistency
665668
DevLogger.log(

app/core/WalletConnect/wc-utils.ts

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
import { 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';
38
import {
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

Comments
 (0)