From 6be9e40d63e8cfbb3814bd4970c3b1b4f70e9cb5 Mon Sep 17 00:00:00 2001 From: "Justin R. Evans" Date: Mon, 25 Nov 2024 14:11:12 -0500 Subject: [PATCH] feat: remove dependency on integrations package --- .../src/App/Common/ConnectExtensionButton.tsx | 2 +- .../src/App/Setup/ExtensionLoader.tsx | 34 ++++++++++++++----- apps/namadillo/src/App/WorkerTest.tsx | 2 +- apps/namadillo/src/atoms/accounts/atoms.ts | 14 +++++--- apps/namadillo/src/atoms/accounts/services.ts | 6 ++-- apps/namadillo/src/atoms/arbitraryMessages.ts | 12 ++++--- apps/namadillo/src/atoms/shield/services.ts | 4 +-- apps/namadillo/src/hooks/useNamadaKeychain.ts | 9 ++--- apps/namadillo/src/lib/query.ts | 10 +++--- packages/types/src/namada.ts | 2 +- 10 files changed, 56 insertions(+), 39 deletions(-) diff --git a/apps/namadillo/src/App/Common/ConnectExtensionButton.tsx b/apps/namadillo/src/App/Common/ConnectExtensionButton.tsx index 077dd69fa7..1369619263 100644 --- a/apps/namadillo/src/App/Common/ConnectExtensionButton.tsx +++ b/apps/namadillo/src/App/Common/ConnectExtensionButton.tsx @@ -21,7 +21,7 @@ export const ConnectExtensionButton = (): JSX.Element => { {connectStatus === "connecting" ? "Connecting..." - : "Connect Keychain"} + : "Connect Keychain"} )} {extensionAttachStatus === "detached" && ( diff --git a/apps/namadillo/src/App/Setup/ExtensionLoader.tsx b/apps/namadillo/src/App/Setup/ExtensionLoader.tsx index 2a324a49f4..2ae083adcf 100644 --- a/apps/namadillo/src/App/Setup/ExtensionLoader.tsx +++ b/apps/namadillo/src/App/Setup/ExtensionLoader.tsx @@ -1,9 +1,10 @@ -import { useIntegration } from "@namada/integrations"; +import { chainParametersAtom } from "atoms/chain"; import { namadaExtensionAttachStatus, namadaExtensionConnectionStatus, } from "atoms/settings"; -import { useAtom, useSetAtom } from "jotai"; +import { useNamadaKeychain } from "hooks/useNamadaKeychain"; +import { useAtom, useAtomValue, useSetAtom } from "jotai"; import { ReactNode, useEffect } from "react"; import { PageLoader } from "../Common/PageLoader"; @@ -12,19 +13,34 @@ export const ExtensionLoader = ({ }: { children: ReactNode; }): JSX.Element => { + const { namadaKeychain } = useNamadaKeychain(); const [attachStatus, setAttachStatus] = useAtom(namadaExtensionAttachStatus); + const { data: chain } = useAtomValue(chainParametersAtom); const setConnectionStatus = useSetAtom(namadaExtensionConnectionStatus); - const integration = useIntegration("namada"); - useEffect(() => { - setAttachStatus(integration.detect() ? "attached" : "detached"); + const chainId = chain?.chainId; + const keychainPromise = namadaKeychain.get(); - integration.isConnected().then((isConnected) => { - if (isConnected) { - setConnectionStatus("connected"); + useEffect(() => { + keychainPromise.then((injectedNamada) => { + if (injectedNamada) { + return setAttachStatus("attached"); } + setAttachStatus("detached"); }); - }, [integration]); + }, []); + + useEffect(() => { + if (chainId && attachStatus === "attached") { + keychainPromise.then((injectedNamada) => { + injectedNamada.isConnected(chainId).then((isConnected) => { + if (isConnected) { + setConnectionStatus("connected"); + } + }); + }); + } + }, [attachStatus, chainId]); if (attachStatus === "pending") { return ; diff --git a/apps/namadillo/src/App/WorkerTest.tsx b/apps/namadillo/src/App/WorkerTest.tsx index 6cdb83906e..68dd435f2b 100644 --- a/apps/namadillo/src/App/WorkerTest.tsx +++ b/apps/namadillo/src/App/WorkerTest.tsx @@ -90,7 +90,7 @@ export function WorkerTest(): JSX.Element { const { payload: encodedTx } = await shieldWorker.shield(msg); - const signedTxs = await signTx("namada", encodedTx, account?.address || ""); + const signedTxs = await signTx(encodedTx, account?.address || ""); await shieldWorker.broadcast({ type: "broadcast", diff --git a/apps/namadillo/src/atoms/accounts/atoms.ts b/apps/namadillo/src/atoms/accounts/atoms.ts index e0a2f75403..99bad14eee 100644 --- a/apps/namadillo/src/atoms/accounts/atoms.ts +++ b/apps/namadillo/src/atoms/accounts/atoms.ts @@ -1,4 +1,3 @@ -import { getIntegration } from "@namada/integrations"; import { Account, AccountType } from "@namada/types"; import { indexerApiAtom } from "atoms/api"; import { nativeTokenAddressAtom } from "atoms/chain"; @@ -6,6 +5,7 @@ import { shouldUpdateBalanceAtom } from "atoms/etc"; import { namadaExtensionConnectedAtom } from "atoms/settings"; import { queryDependentFn } from "atoms/utils"; import BigNumber from "bignumber.js"; +import { NamadaKeychain } from "hooks/useNamadaKeychain"; import { atomWithMutation, atomWithQuery } from "jotai-tanstack-query"; import { chainConfigByName } from "registry"; import { @@ -67,16 +67,20 @@ export const allDefaultAccountsAtom = atomWithQuery((get) => { }); export const updateDefaultAccountAtom = atomWithMutation(() => { - const integration = getIntegration("namada"); + const namadaPromise = new NamadaKeychain().get(); return { - mutationFn: (address: string) => integration.updateDefaultAccount(address), + mutationFn: (address: string) => + namadaPromise.then((injectedNamada) => + injectedNamada.updateDefaultAccount(address) + ), }; }); export const disconnectAccountAtom = atomWithMutation(() => { - const integration = getIntegration("namada"); + const namadaPromise = new NamadaKeychain().get(); return { - mutationFn: () => integration.disconnect(), + mutationFn: () => + namadaPromise.then((injectedNamada) => injectedNamada.disconnect()), }; }); diff --git a/apps/namadillo/src/atoms/accounts/services.ts b/apps/namadillo/src/atoms/accounts/services.ts index 87107af4a1..d63ca6671e 100644 --- a/apps/namadillo/src/atoms/accounts/services.ts +++ b/apps/namadillo/src/atoms/accounts/services.ts @@ -1,16 +1,16 @@ import { Balance, DefaultApi } from "@namada/indexer-client"; -import { getIntegration } from "@namada/integrations"; import { Account } from "@namada/types"; import BigNumber from "bignumber.js"; +import { NamadaKeychain } from "hooks/useNamadaKeychain"; export const fetchAccounts = async (): Promise => { - const namada = getIntegration("namada"); + const namada = await new NamadaKeychain().get(); const result = await namada.accounts(); return result || []; }; export const fetchDefaultAccount = async (): Promise => { - const namada = getIntegration("namada"); + const namada = await new NamadaKeychain().get(); return await namada.defaultAccount(); }; diff --git a/apps/namadillo/src/atoms/arbitraryMessages.ts b/apps/namadillo/src/atoms/arbitraryMessages.ts index 658f9ac8f0..69d7f9abc0 100644 --- a/apps/namadillo/src/atoms/arbitraryMessages.ts +++ b/apps/namadillo/src/atoms/arbitraryMessages.ts @@ -1,18 +1,20 @@ -import { getIntegration } from "@namada/integrations"; +import { NamadaKeychain } from "hooks/useNamadaKeychain"; import invariant from "invariant"; import { atomWithMutation } from "jotai-tanstack-query"; import { defaultAccountAtom } from "./accounts"; export const arbitraryMessagesAtom = atomWithMutation((get) => { - const integration = getIntegration("namada"); + const namadaPromise = new NamadaKeychain().get(); const account = get(defaultAccountAtom); return { enabled: account.data, mutationFn: async (message: string) => { invariant(account.data, "Default account is not selected"); - const response = await integration - .signer() - ?.signArbitrary(account.data?.address, message); + const response = await namadaPromise.then((injectedNamada) => + injectedNamada + ?.getSigner() + .signArbitrary(account.data!.address, message) + ); return response; }, }; diff --git a/apps/namadillo/src/atoms/shield/services.ts b/apps/namadillo/src/atoms/shield/services.ts index fa0d647723..37cc338b72 100644 --- a/apps/namadillo/src/atoms/shield/services.ts +++ b/apps/namadillo/src/atoms/shield/services.ts @@ -77,7 +77,7 @@ export const submitShieldTx = async ( const { payload: encodedTx } = await shieldWorker.shield(msg); - const signedTxs = await signTx("namada", encodedTx, source); + const signedTxs = await signTx(encodedTx, source); await shieldWorker.broadcast({ type: "broadcast", @@ -133,7 +133,7 @@ export const submitUnshieldTx = async ( const { payload: encodedTx } = await unshieldWorker.unshield(msg); - const signedTxs = await signTx("namada", encodedTx, source); + const signedTxs = await signTx(encodedTx, source); await unshieldWorker.broadcast({ type: "broadcast", diff --git a/apps/namadillo/src/hooks/useNamadaKeychain.ts b/apps/namadillo/src/hooks/useNamadaKeychain.ts index 880e8bbf21..b382357ddc 100644 --- a/apps/namadillo/src/hooks/useNamadaKeychain.ts +++ b/apps/namadillo/src/hooks/useNamadaKeychain.ts @@ -11,10 +11,6 @@ import { useCallback, useState } from "react"; export type InjectedNamada = WindowWithNamada["namada"]; export class NamadaKeychain implements Wallet { - static detect(): boolean { - return Boolean((window as WindowWithNamada).namada); - } - // TODO: Should we use this, or keep our existing download buttons? install(): void { console.warn( @@ -66,9 +62,10 @@ export const useNamadaKeychain = (): { const [connectStatus, setConnectStatus] = useAtom( namadaExtensionConnectionStatus ); - const [attachStatus] = useAtom(namadaExtensionAttachStatus); - const [error, setError] = useState(); + const attachStatus = useAtomValue(namadaExtensionAttachStatus); const { data: chain } = useAtomValue(chainParametersAtom); + + const [error, setError] = useState(); const namadaKeychain = new NamadaKeychain(); const chainId = chain?.chainId; diff --git a/apps/namadillo/src/lib/query.ts b/apps/namadillo/src/lib/query.ts index e65f72fc98..31facd927f 100644 --- a/apps/namadillo/src/lib/query.ts +++ b/apps/namadillo/src/lib/query.ts @@ -1,9 +1,7 @@ -import { getIntegration } from "@namada/integrations/utils"; import { Sdk } from "@namada/sdk/web"; import { Account, AccountType, - ExtensionKey, Signer, TxMsgValue, TxProps, @@ -11,6 +9,7 @@ import { } from "@namada/types"; import { getIndexerApi } from "atoms/api"; import { chainParametersAtom } from "atoms/chain"; +import { NamadaKeychain } from "hooks/useNamadaKeychain"; import invariant from "invariant"; import { getDefaultStore } from "jotai"; import { Address, ChainSettings, GasConfig } from "types"; @@ -142,12 +141,11 @@ export const buildTx = async ( * Asynchronously signs an encoded batch transaction using Namada extension. */ export const signTx = async ( - wallet: ExtensionKey, typedEncodedTx: EncodedTxData, owner: string ): Promise => { - const integration = getIntegration(wallet); - const signingClient = integration.signer() as Signer; + const namada = await new NamadaKeychain().get(); + const signingClient = namada.getSigner() as Signer; const store = getDefaultStore(); const { data: chainParameters } = store.get(chainParametersAtom); @@ -200,7 +198,7 @@ export const buildTxPair = async ( publicKeyRevealed, memo ); - const signedTxs = await signTx(chain.extensionId, encodedTxData, owner); + const signedTxs = await signTx(encodedTxData, owner); return { signedTxs, encodedTxData, diff --git a/packages/types/src/namada.ts b/packages/types/src/namada.ts index 0701a6346b..b416011402 100644 --- a/packages/types/src/namada.ts +++ b/packages/types/src/namada.ts @@ -26,7 +26,7 @@ export type BalancesProps = { }; export interface Namada { - accounts(chainId?: string): Promise; + accounts(chainId?: string): Promise; connect(chainId?: string): Promise; disconnect(chainId?: string): Promise; isConnected(chainId?: string): Promise;