diff --git a/apps/extension/src/background/approvals/handler.ts b/apps/extension/src/background/approvals/handler.ts index f1564516e..cb967f094 100644 --- a/apps/extension/src/background/approvals/handler.ts +++ b/apps/extension/src/background/approvals/handler.ts @@ -135,11 +135,12 @@ const handleConnectInterfaceResponseMsg: ( ) => InternalHandler = (service) => { return async ( { senderTabId: popupTabId }, - { interfaceOrigin, allowConnection } + { interfaceOrigin, chainId, allowConnection } ) => { return await service.approveConnectionResponse( popupTabId, interfaceOrigin, + chainId, allowConnection ); }; diff --git a/apps/extension/src/background/approvals/service.test.ts b/apps/extension/src/background/approvals/service.test.ts index c8dd649fc..6e2a06ab1 100644 --- a/apps/extension/src/background/approvals/service.test.ts +++ b/apps/extension/src/background/approvals/service.test.ts @@ -303,6 +303,7 @@ describe("approvals service", () => { describe("approveConnectionResponse", () => { it("should approve connection response", async () => { const interfaceOrigin = "origin"; + const chainId = "chainId"; const popupTabId = 1; service["resolverMap"] = { [popupTabId]: { @@ -315,6 +316,7 @@ describe("approvals service", () => { await service.approveConnectionResponse( popupTabId, interfaceOrigin, + chainId, true ); @@ -326,15 +328,22 @@ describe("approvals service", () => { it("should throw an error if resolvers are not found", async () => { const interfaceOrigin = "origin"; + const chainId = "chainId"; const popupTabId = 1; await expect( - service.approveConnectionResponse(popupTabId, interfaceOrigin, true) + service.approveConnectionResponse( + popupTabId, + interfaceOrigin, + chainId, + true + ) ).rejects.toBeDefined(); }); it("should reject the connection if allowConnection is set to false", async () => { const interfaceOrigin = "origin"; + const chainId = "chainId"; const popupTabId = 1; service["resolverMap"] = { [popupTabId]: { @@ -346,6 +355,7 @@ describe("approvals service", () => { await service.approveConnectionResponse( popupTabId, interfaceOrigin, + chainId, false ); @@ -416,6 +426,7 @@ describe("approvals service", () => { it("should reject the connection if revokeConnection is set to false", async () => { const interfaceOrigin = "origin"; + const chainId = "chainId"; const popupTabId = 1; service["resolverMap"] = { [popupTabId]: { @@ -427,6 +438,7 @@ describe("approvals service", () => { await service.approveConnectionResponse( popupTabId, interfaceOrigin, + chainId, false ); diff --git a/apps/extension/src/background/approvals/service.ts b/apps/extension/src/background/approvals/service.ts index 2491b7a58..3519b6b0f 100644 --- a/apps/extension/src/background/approvals/service.ts +++ b/apps/extension/src/background/approvals/service.ts @@ -222,6 +222,7 @@ export class ApprovalsService { async approveConnectionResponse( popupTabId: number, interfaceOrigin: string, + chainId: string, allowConnection: boolean ): Promise { const resolvers = this.getResolver(popupTabId); @@ -229,6 +230,8 @@ export class ApprovalsService { if (allowConnection) { try { await this.localStorage.addApprovedOrigin(interfaceOrigin); + // Enable signing for this chain + await this.chainService.updateChain(chainId); } catch (e) { resolvers.reject(e); } diff --git a/apps/namadillo/src/App/Common/ConnectExtensionButton.tsx b/apps/namadillo/src/App/Common/ConnectExtensionButton.tsx index 9934178cd..dbd34999a 100644 --- a/apps/namadillo/src/App/Common/ConnectExtensionButton.tsx +++ b/apps/namadillo/src/App/Common/ConnectExtensionButton.tsx @@ -1,5 +1,6 @@ import { ActionButton } from "@namada/components"; import { useUntilIntegrationAttached } from "@namada/integrations"; +import { chainParametersAtom } from "atoms/chain"; import { namadaExtensionConnectedAtom } from "atoms/settings"; import { useExtensionConnect } from "hooks/useExtensionConnect"; import { useAtomValue } from "jotai"; @@ -7,12 +8,17 @@ import { useAtomValue } from "jotai"; export const ConnectExtensionButton = (): JSX.Element => { const extensionAttachStatus = useUntilIntegrationAttached(); const isExtensionConnected = useAtomValue(namadaExtensionConnectedAtom); - const { connect } = useExtensionConnect(); + const chainParams = useAtomValue(chainParametersAtom); + const { connect } = useExtensionConnect("namada", chainParams.data?.chainId); return ( <> {extensionAttachStatus === "attached" && !isExtensionConnected && ( - + connect()} + > Connect Keychain )} diff --git a/apps/namadillo/src/atoms/accounts/atoms.ts b/apps/namadillo/src/atoms/accounts/atoms.ts index e483d972b..0ecd7ad5e 100644 --- a/apps/namadillo/src/atoms/accounts/atoms.ts +++ b/apps/namadillo/src/atoms/accounts/atoms.ts @@ -1,11 +1,12 @@ import { getIntegration } from "@namada/integrations"; import { Account } from "@namada/types"; import { indexerApiAtom } from "atoms/api"; -import { nativeTokenAddressAtom } from "atoms/chain"; +import { chainParametersAtom, nativeTokenAddressAtom } from "atoms/chain"; import { shouldUpdateBalanceAtom } from "atoms/etc"; import { namadaExtensionConnectedAtom } from "atoms/settings"; import { queryDependentFn } from "atoms/utils"; import BigNumber from "bignumber.js"; +import { getDefaultStore } from "jotai"; import { atomWithMutation, atomWithQuery } from "jotai-tanstack-query"; import { chainConfigByName } from "registry"; import { @@ -41,8 +42,10 @@ export const updateDefaultAccountAtom = atomWithMutation(() => { export const disconnectAccountAtom = atomWithMutation(() => { const integration = getIntegration("namada"); + const store = getDefaultStore(); + const { chainId } = store.get(chainParametersAtom).data!; return { - mutationFn: () => integration.disconnect(), + mutationFn: () => integration.disconnect(chainId), }; }); diff --git a/apps/namadillo/src/hooks/useExtensionConnect.ts b/apps/namadillo/src/hooks/useExtensionConnect.ts index 237eb7712..584f331a4 100644 --- a/apps/namadillo/src/hooks/useExtensionConnect.ts +++ b/apps/namadillo/src/hooks/useExtensionConnect.ts @@ -11,14 +11,15 @@ type UseConnectOutput = { }; export const useExtensionConnect = ( - chainKey: ChainKey = "namada" + chainKey: ChainKey = "namada", + chainId: string = "" ): UseConnectOutput => { const [connectionStatus, setConnectionStatus] = useAtom( namadaExtensionConnectionStatus ); const [_integration, isConnectingToExtension, withConnection] = - useIntegrationConnection(chainKey); + useIntegrationConnection(chainKey, chainId); useEffect(() => { if (isConnectingToExtension) { diff --git a/apps/namadillo/src/hooks/useExtensionEvents.tsx b/apps/namadillo/src/hooks/useExtensionEvents.tsx index 949660057..bb773f59b 100644 --- a/apps/namadillo/src/hooks/useExtensionEvents.tsx +++ b/apps/namadillo/src/hooks/useExtensionEvents.tsx @@ -2,12 +2,14 @@ import { useEventListenerOnce } from "@namada/hooks"; import { useIntegration } from "@namada/integrations"; import { Events } from "@namada/types"; import { accountBalanceAtom, defaultAccountAtom } from "atoms/accounts"; +import { chainParametersAtom } from "atoms/chain"; import { namadaExtensionConnectionStatus } from "atoms/settings"; import { useAtomValue, useSetAtom } from "jotai"; export const useExtensionEvents = (): void => { const defaultAccount = useAtomValue(defaultAccountAtom); const balances = useAtomValue(accountBalanceAtom); + const chainParams = useAtomValue(chainParametersAtom); const integration = useIntegration("namada"); const setNamadaExtensionConnected = useSetAtom( @@ -22,7 +24,9 @@ export const useExtensionEvents = (): void => { useEventListenerOnce(Events.ConnectionRevoked, async () => { setNamadaExtensionConnected( - (await integration.isConnected()) ? "connected" : "idle" + (await integration.isConnected(chainParams.data!.chainId)) ? + "connected" + : "idle" ); }); }; diff --git a/apps/namadillo/src/hooks/useOnNamadaExtensionAttached.ts b/apps/namadillo/src/hooks/useOnNamadaExtensionAttached.ts index 8c84bb27f..63a6c3a41 100644 --- a/apps/namadillo/src/hooks/useOnNamadaExtensionAttached.ts +++ b/apps/namadillo/src/hooks/useOnNamadaExtensionAttached.ts @@ -4,18 +4,20 @@ import { useIntegration, useUntilIntegrationAttached, } from "@namada/integrations"; +import { chainParametersAtom } from "atoms/chain"; import { namadaExtensionConnectionStatus } from "atoms/settings"; -import { useSetAtom } from "jotai"; +import { useAtomValue, useSetAtom } from "jotai"; export const useOnNamadaExtensionAttached = (): void => { const setNamadExtensionStatus = useSetAtom(namadaExtensionConnectionStatus); + const chainParams = useAtomValue(chainParametersAtom); const attachStatus = useUntilIntegrationAttached(); const integration = useIntegration("namada") as Namada; useEffectSkipFirstRender(() => { (async () => { - if (attachStatus === "attached") { - if (!!(await integration.isConnected())) { + if (attachStatus === "attached" && chainParams.data?.chainId) { + if (!!(await integration.isConnected(chainParams.data.chainId))) { setNamadExtensionStatus("connected"); } } diff --git a/packages/integrations/src/hooks/useIntegration.ts b/packages/integrations/src/hooks/useIntegration.ts index d3c178e20..608425193 100644 --- a/packages/integrations/src/hooks/useIntegration.ts +++ b/packages/integrations/src/hooks/useIntegration.ts @@ -60,7 +60,8 @@ export const useIntegration = ( * Tuple of integration, connection status and connection function. */ export const useIntegrationConnection = ( - chainKey: K + chainKey: K, + chainId: string ): [ IntegrationFromChainKey, boolean, @@ -74,7 +75,7 @@ export const useIntegrationConnection = ( setIsConnectingToExtension(true); try { if (integration.detect()) { - await integration.connect(); + await integration.connect(chainId); await onSuccess(); } } catch { @@ -84,7 +85,7 @@ export const useIntegrationConnection = ( } setIsConnectingToExtension(false); }, - [chainKey] + [chainKey, chainId] ); return [integration, isConnectingToExtension, connect];