From 8352b02fe402acc54c45c8e2245b4ee8d3c48a15 Mon Sep 17 00:00:00 2001 From: Arjun Porwal <65214523+ap211unitech@users.noreply.github.com> Date: Wed, 26 Mar 2025 09:39:03 +0530 Subject: [PATCH] refactor: multisig query logic to eliminate dependency on proxyAddress (#11412) --- packages/react-signer/src/Address.tsx | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/react-signer/src/Address.tsx b/packages/react-signer/src/Address.tsx index f6908bcd0b..eafb8638f5 100644 --- a/packages/react-signer/src/Address.tsx +++ b/packages/react-signer/src/Address.tsx @@ -142,13 +142,15 @@ function filterProxies (allAccounts: string[], tx: Call | SubmittableExtrinsic<' .map(([address]) => address); } -async function queryForMultisig (api: ApiPromise, requestAddress: string | null, proxyAddress: string | null, tx: SubmittableExtrinsic<'promise'>): Promise { +// This function shouldn't depend on proxyAddress, it can fetch multisig info based on source multisig account. +async function queryForMultisig (api: ApiPromise, requestAddress: string | null, tx: SubmittableExtrinsic<'promise'>): Promise { const multiModule = api.tx.multisig ? 'multisig' : 'utility'; if (isFunction(api.query[multiModule]?.multisigs)) { - const address = proxyAddress || requestAddress; + const address = requestAddress; const { threshold, who } = extractExternal(address); - const hash = (proxyAddress ? api.tx.proxy.proxy(requestAddress || '', null, tx) : tx).method.hash; + const hash = (address ? api.tx.proxy.proxy(requestAddress || '', null, tx) : tx).method.hash; + const optMulti = await api.query[multiModule].multisigs>(address, hash); const multi = optMulti.unwrapOr(null); @@ -202,8 +204,10 @@ function Address ({ currentItem, onChange, onEnter, passwordError, requestAddres const [signAddress, flags] = useMemo( (): [string | null, AddressFlags] => { - const signAddress = (multiInfo && multiAddress) || - (isProxyActive && proxyInfo && proxyAddress) || + // If certain conditions are met, then proxyAddress would have higher priority over multisig signatories. + // proxyAddress would be used to sign tx in that scenario. + const signAddress = (isProxyActive && proxyInfo && proxyAddress) || + (multiInfo && multiAddress) || requestAddress; try { @@ -238,8 +242,8 @@ function Address ({ currentItem, onChange, onEnter, passwordError, requestAddres useEffect((): void => { setMultInfo(null); - currentItem.extrinsic && extractExternal(proxyAddress || requestAddress).isMultisig && - queryForMultisig(api, requestAddress, proxyAddress, currentItem.extrinsic) + currentItem.extrinsic && extractExternal(requestAddress).isMultisig && + queryForMultisig(api, requestAddress, currentItem.extrinsic) .then((info): void => { if (mountedRef.current) { setMultInfo(info); @@ -247,13 +251,13 @@ function Address ({ currentItem, onChange, onEnter, passwordError, requestAddres } }) .catch(console.error); - }, [proxyAddress, api, currentItem, mountedRef, requestAddress]); + }, [api, currentItem.extrinsic, mountedRef, requestAddress]); useEffect((): void => { onChange({ isMultiCall, isUnlockCached, - multiRoot: multiInfo ? multiInfo.address : null, + multiRoot: multiInfo && (!isProxyActive || !proxyInfo) ? multiInfo.address : null, proxyRoot: (proxyInfo && isProxyActive) ? proxyInfo.address : null, signAddress, signPassword @@ -282,7 +286,7 @@ function Address ({ currentItem, onChange, onEnter, passwordError, requestAddres /> )} - {multiInfo && ( + {multiInfo && (!isProxyActive || !proxyInfo) && (