From 3bd8f194f1b38463ebde6f704f58709ff422a544 Mon Sep 17 00:00:00 2001 From: Viterbo Date: Tue, 30 Jan 2024 19:46:29 -0300 Subject: [PATCH] autologin does not relay anymore on the injected provider poiting to the correct network --- src/antelope/mocks/AccountStore.ts | 51 ++++++++----------- .../authenticators/EVMAuthenticator.ts | 18 +++++++ src/components/LoginModal.vue | 10 ++-- 3 files changed, 44 insertions(+), 35 deletions(-) diff --git a/src/antelope/mocks/AccountStore.ts b/src/antelope/mocks/AccountStore.ts index 6c3a0824c..230e2f5a2 100644 --- a/src/antelope/mocks/AccountStore.ts +++ b/src/antelope/mocks/AccountStore.ts @@ -35,6 +35,7 @@ let currentAccount = null as addressString | null; interface LoginEVMActionData { authenticator: EVMAuthenticator network: string, + autoLogAccount?: string, } class AccountStore { @@ -54,9 +55,10 @@ class AccountStore { } as AccountModel; } - async loginEVM({ authenticator, network }: LoginEVMActionData, trackAnalyticsEvents: boolean): Promise { + async loginEVM({ authenticator, network, autoLogAccount }: LoginEVMActionData, trackAnalyticsEvents: boolean): Promise { currentAuthenticator = authenticator; - currentAccount = await authenticator.login(network, trackAnalyticsEvents); + currentAccount = autoLogAccount ? await authenticator.autoLogin(network, autoLogAccount, trackAnalyticsEvents) : await authenticator.login(network, trackAnalyticsEvents); + const account = useAccountStore().getAccount(authenticator.label); getAntelope().events.onLoggedIn.next(account); return true; @@ -153,37 +155,24 @@ class AccountStore { async assertNetworkConnection(label: string): Promise { if (!await useAccountStore().isConnectedToCorrectNetwork(label)) { - return new Promise((resolve) => { + // eslint-disable-next-line no-async-promise-executor + return new Promise(async (resolve) => { const ant = getAntelope(); const authenticator = useAccountStore().loggedAccount.authenticator as EVMAuthenticator; - const networkName = useChainStore().loggedChain.settings.getDisplay(); - const errorMessage = ant.config.localizationHandler('evm_wallet.incorrect_network', { networkName }); - let userClickedSwitch = false; - ant.config.notifyFailureWithAction(errorMessage, { - label: ant.config.localizationHandler('evm_wallet.switch'), - handler: async () => { - userClickedSwitch = true; - try { - await authenticator.ensureCorrectChain(); - if (!await useAccountStore().isConnectedToCorrectNetwork(label)) { - resolve(false); - } else { - resolve(true); - } - } catch (error) { - const message = (error as Error).message; - if (message === 'antelope.evm.error_switch_chain_rejected') { - ant.config.notifyNeutralMessageHandler(message); - } - resolve(false); - } - }, - onDismiss: () => { - if (!userClickedSwitch) { - resolve(false); - } - }, - }); + try { + await authenticator.ensureCorrectChain(); + if (!await useAccountStore().isConnectedToCorrectNetwork(label)) { + resolve(false); + } else { + resolve(true); + } + } catch (error) { + const message = (error as Error).message; + if (message === 'antelope.evm.error_switch_chain_rejected') { + ant.config.notifyNeutralMessageHandler(message); + } + resolve(false); + } }); } else { return true; diff --git a/src/antelope/wallets/authenticators/EVMAuthenticator.ts b/src/antelope/wallets/authenticators/EVMAuthenticator.ts index d421f3b63..ae72463ef 100644 --- a/src/antelope/wallets/authenticators/EVMAuthenticator.ts +++ b/src/antelope/wallets/authenticators/EVMAuthenticator.ts @@ -92,6 +92,24 @@ export abstract class EVMAuthenticator { } } + async autoLogin(network: string, account: string, trackAnalyticsEvents?: boolean): Promise { + this.trace('autoLogin', network, account); + this.trace('AutoLogin analytics enabled =', trackAnalyticsEvents); + + const chain = useChainStore(); + try { + chain.setChain(CURRENT_CONTEXT, network); + return account as addressString; + } catch (error) { + if ((error as unknown as ExceptionError).code === 4001) { + throw new AntelopeError('antelope.evm.error_connect_rejected'); + } else { + console.error('Error:', error); + throw new AntelopeError('antelope.evm.error_login'); + } + } + } + async ensureCorrectChain(): Promise { this.trace('ensureCorrectChain'); if (usePlatformStore().isMobile) { diff --git a/src/components/LoginModal.vue b/src/components/LoginModal.vue index 57f7de07e..eec734ba3 100644 --- a/src/components/LoginModal.vue +++ b/src/components/LoginModal.vue @@ -70,6 +70,7 @@ export default defineComponent({ localStorage.setItem(LOGIN_DATA_KEY, JSON.stringify({ type: LOGIN_EVM, provider: pr_name, + account: address, })); }); @@ -80,7 +81,7 @@ export default defineComponent({ const loginObj = JSON.parse(loginData); if (loginObj.type === LOGIN_EVM) { - this.loginWithAntelope(loginObj.provider); + this.loginWithAntelope(loginObj.provider, loginObj.account); } else if (loginObj.type === LOGIN_NATIVE) { const wallet = this.authenticators.find((a: { getName: () => any; }) => a.getName() === loginObj.provider); if (wallet) { @@ -144,7 +145,7 @@ export default defineComponent({ nativeAccount: accountName, }); this.$providerManager.setProvider(account); - localStorage.setItem(LOGIN_DATA_KEY, JSON.stringify({ type: LOGIN_NATIVE, provider: wallet.getName() })); + localStorage.setItem(LOGIN_DATA_KEY, JSON.stringify({ type: LOGIN_NATIVE, provider: wallet.getName(), account: evmAccount.address })); } this.$emit('hide'); }, @@ -156,7 +157,7 @@ export default defineComponent({ return wallet.getStyle().icon; }, - async loginWithAntelope(name:string) { + async loginWithAntelope(name:string, autoLogAccount?: string) { const label = CURRENT_CONTEXT; const auth = getAntelope().wallets.getAuthenticator(name); if (!auth) { @@ -165,12 +166,13 @@ export default defineComponent({ } const authenticator = auth.newInstance(label); const network = useChainStore().currentChain.settings.getNetwork(); - useAccountStore().loginEVM({ authenticator, network }, true).then(() => { + useAccountStore().loginEVM({ authenticator, network, autoLogAccount }, true).then(() => { const address = useAccountStore().getAccount(label).account; this.setLogin({ address }); localStorage.setItem(LOGIN_DATA_KEY, JSON.stringify({ type: LOGIN_EVM, provider: name, + account: address, })); }); this.$emit('hide');