From 5aeb01f968672cb86466247c1bc5ef3926b9a234 Mon Sep 17 00:00:00 2001 From: Brendan Chou <3680392+BrendanChou@users.noreply.github.com> Date: Fri, 26 Jan 2024 17:08:51 -0500 Subject: [PATCH] allow viewer to use the `address` test-flag to have a view-only experience of a wallet (#250) * allow viewer to use test-flag to specify a view-only experience of a wallet * respond to CR * lint --- src/constants/wallets.ts | 14 +++++++++++++- src/hooks/useAccounts.tsx | 31 +++++++++++++++++++++++++++++-- src/hooks/useWalletConnection.ts | 13 +++++++++++++ src/lib/testFlags.ts | 4 ++++ src/lib/wallet/index.ts | 6 ++++++ 5 files changed, 65 insertions(+), 3 deletions(-) diff --git a/src/constants/wallets.ts b/src/constants/wallets.ts index 5a0c3c5..43e80c9 100644 --- a/src/constants/wallets.ts +++ b/src/constants/wallets.ts @@ -33,6 +33,7 @@ export enum WalletConnectionType { CosmosSigner = 'CosmosSigner', InjectedEip1193 = 'injectedEip1193', WalletConnect2 = 'walletConnect2', + TestWallet = 'TestWallet', } export enum WalletErrorType { @@ -68,6 +69,9 @@ export const walletConnectionTypes: Record = { icon: KeplrIcon, connectionTypes: [WalletConnectionType.CosmosSigner], }, + [WalletType.TestWallet]: { + type: WalletType.TestWallet, + stringKey: STRING_KEYS.TEST_WALLET, + icon: GenericWalletIcon, + connectionTypes: [WalletConnectionType.TestWallet], + }, }; // Injected EIP-1193 Providers @@ -354,3 +364,5 @@ export enum DydxChainAsset { USDC = 'usdc', CHAINTOKEN = 'chain', } + +export const TEST_WALLET_EVM_ADDRESS: EvmAddress = '0x0000000000000000000000000000000000000000'; diff --git a/src/hooks/useAccounts.tsx b/src/hooks/useAccounts.tsx index 4bf529b..e4f091d 100644 --- a/src/hooks/useAccounts.tsx +++ b/src/hooks/useAccounts.tsx @@ -6,14 +6,22 @@ import { NOBLE_BECH32_PREFIX, LocalWallet, type Subaccount } from '@dydxprotocol import { OnboardingGuard, OnboardingState, type EvmDerivedAddresses } from '@/constants/account'; import { DialogTypes } from '@/constants/dialogs'; +import { STRING_KEYS } from '@/constants/localization'; import { LocalStorageKey, LOCAL_STORAGE_VERSIONS } from '@/constants/localStorage'; -import { DydxAddress, EvmAddress, PrivateInformation } from '@/constants/wallets'; +import { + DydxAddress, + EvmAddress, + PrivateInformation, + TEST_WALLET_EVM_ADDRESS, + WalletType, +} from '@/constants/wallets'; import { setOnboardingState, setOnboardingGuard } from '@/state/account'; import { forceOpenDialog } from '@/state/dialogs'; import abacusStateManager from '@/lib/abacus'; import { log } from '@/lib/telemetry'; +import { testFlags } from '@/lib/testFlags'; import { useDydxClient } from './useDydxClient'; import { useLocalStorage } from './useLocalStorage'; @@ -178,7 +186,26 @@ const useAccountsContext = () => { useEffect(() => { (async () => { - if (connectedDydxAddress && signerGraz) { + if (walletType === WalletType.TestWallet) { + // Get override values. Use the testFlags value if it exists, otherwise use the previously + // saved value where possible. If neither exist, use a default garbage value. + const addressOverride: DydxAddress = testFlags.addressOverride as DydxAddress || + evmDerivedAddresses?.[TEST_WALLET_EVM_ADDRESS]?.dydxAddress as DydxAddress || + 'dydx1'; + + dispatch(setOnboardingState(OnboardingState.WalletConnected)); + + // Set variables. + saveEvmDerivedAccount({ + evmAddress: TEST_WALLET_EVM_ADDRESS, + dydxAddress: addressOverride, + }); + const wallet = new LocalWallet(); + wallet.address = addressOverride; + setLocalDydxWallet(wallet); + + dispatch(setOnboardingState(OnboardingState.AccountConnected)); + } else if (connectedDydxAddress && signerGraz) { dispatch(setOnboardingState(OnboardingState.WalletConnected)); try { setLocalDydxWallet(await LocalWallet.fromOfflineSigner(signerGraz)); diff --git a/src/hooks/useWalletConnection.ts b/src/hooks/useWalletConnection.ts index 5f32945..cb64f02 100644 --- a/src/hooks/useWalletConnection.ts +++ b/src/hooks/useWalletConnection.ts @@ -2,6 +2,7 @@ import { useCallback, useEffect, useState, useMemo } from 'react'; import { useSelector } from 'react-redux'; import { EvmDerivedAddresses } from '@/constants/account'; +import { STRING_KEYS } from '@/constants/localization'; import { LocalStorageKey } from '@/constants/localStorage'; import { ENVIRONMENT_CONFIG_MAP } from '@/constants/networks'; @@ -38,6 +39,7 @@ import { getWalletConnection, parseWalletError } from '@/lib/wallet'; import { log } from '@/lib/telemetry'; import { useStringGetter } from './useStringGetter'; +import { testFlags } from '@/lib/testFlags'; export const useWalletConnection = () => { const stringGetter = useStringGetter(); @@ -138,6 +140,8 @@ export const useWalletConnection = () => { walletType: cosmosWalletType, }); } + } else if (walletConnection.type === WalletConnectionType.TestWallet) { + saveEvmAddress(STRING_KEYS.TEST_WALLET as EvmAddress); } else { const isAccountConnected = Boolean( evmAddress && evmDerivedAddresses[evmAddress]?.encryptedSignature @@ -224,6 +228,15 @@ export const useWalletConnection = () => { setSelectedWalletType(walletType); }; + // On page load, if testFlag.address is set, connect to the test wallet. + useEffect(() => { + (async () => { + if (testFlags.addressOverride) { + setSelectedWalletType(WalletType.TestWallet); + } + })(); + }, []); + return { // Wallet connection walletType, diff --git a/src/lib/testFlags.ts b/src/lib/testFlags.ts index ad1fba7..66c4b59 100644 --- a/src/lib/testFlags.ts +++ b/src/lib/testFlags.ts @@ -22,6 +22,10 @@ class TestFlags { get showMobileSignInOption() { return !!this.queryParams.mobilesignin; } + + get addressOverride():string { + return this.queryParams.address; + } } export const testFlags = new TestFlags(); diff --git a/src/lib/wallet/index.ts b/src/lib/wallet/index.ts index 80ee1c4..ba11110 100644 --- a/src/lib/wallet/index.ts +++ b/src/lib/wallet/index.ts @@ -62,6 +62,12 @@ export const getWalletConnection = ({ type: WalletConnectionType.CosmosSigner, }; } + + case WalletConnectionType.TestWallet: { + return { + type: WalletConnectionType.TestWallet, + }; + } } } };