From d6c70fcd4006e574daf411bc887e828920e41014 Mon Sep 17 00:00:00 2001 From: Georges KABBOUCHI Date: Fri, 1 Oct 2021 21:55:42 +0300 Subject: [PATCH] Add InstadappConnector --- composables/useEagerConnect.ts | 14 ++++++- composables/useInstadappConnection.ts | 36 ++++++++++++++++++ connectors/index.ts | 10 +++++ connectors/instadapp.ts | 53 +++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 composables/useInstadappConnection.ts create mode 100644 connectors/instadapp.ts diff --git a/composables/useEagerConnect.ts b/composables/useEagerConnect.ts index a91c7e1..20d446a 100644 --- a/composables/useEagerConnect.ts +++ b/composables/useEagerConnect.ts @@ -1,15 +1,25 @@ import { useWeb3 } from "@instadapp/vue-web3"; -import { injected, gnosisSafe } from "../connectors"; +import { injected, gnosisSafe, instadapp } from "../connectors"; import { onMounted, ref, watch, watchEffect } from "@nuxtjs/composition-api"; import { useSafeAppConnection } from "./useSafeAppConnection"; +import { useInstadappConnection } from "./useInstadappConnection"; export function useEagerConnect() { const { activate, active } = useWeb3(); const { tried: triedToConnectToSafe } = useSafeAppConnection(gnosisSafe); + const { tried: triedToConnectToInstadapp } = useInstadappConnection( + instadapp + ); + const tried = ref(false); watchEffect(() => { - if (triedToConnectToSafe.value && !active.value && !tried.value) { + if ( + triedToConnectToSafe.value && + triedToConnectToInstadapp.value && + !active.value && + !tried.value + ) { injected.isAuthorized().then((isAuthorized: boolean) => { if (isAuthorized) { activate(injected, undefined, true).catch(() => { diff --git a/composables/useInstadappConnection.ts b/composables/useInstadappConnection.ts new file mode 100644 index 0000000..fcd7271 --- /dev/null +++ b/composables/useInstadappConnection.ts @@ -0,0 +1,36 @@ +import { useWeb3 } from "@instadapp/vue-web3"; +import { onMounted, ref, watch } from "@nuxtjs/composition-api"; +import { Network, useNetwork } from "./useNetwork"; +import { InstadappConnector } from "~/connectors/instadapp"; + +export function useInstadappConnection(connector?: InstadappConnector) { + const { activate, active } = useWeb3(); + const { activeNetworkId} = useNetwork(); + + const tried = ref(false); + + onMounted(() => { + connector?.isInstadapp().then(async (loaded: boolean) => { + if (loaded) { + await activate(connector, undefined, true).catch(() => { + tried.value = true; + }); + + activeNetworkId.value = (await connector.getChainId() === 1) ? Network.Mainnet : Network.Polygon; + } else { + tried.value = true; + } + }); + }); + + // if the connection worked, wait until we get confirmation of that to flip the flag + watch([tried, active], () => { + if (!tried.value && active.value) { + tried.value = true; + } + }); + + return { + tried + }; +} \ No newline at end of file diff --git a/connectors/index.ts b/connectors/index.ts index fb2df9b..a9970e9 100644 --- a/connectors/index.ts +++ b/connectors/index.ts @@ -10,6 +10,7 @@ import INSTADAPP_LOGO_URL from "~/assets/logo/instadapp-logo-icon.svg?inline"; import Web3 from "web3"; import { SafeAppConnector } from "@gnosis.pm/safe-apps-web3-react/dist/connector"; +import { InstadappConnector } from "./instadapp"; setWeb3LibraryCallback(provider => new Web3(provider)); @@ -47,6 +48,15 @@ if (process.client) { export { gnosisSafe }; +let instadapp = null; + +if (process.client) { + instadapp = new InstadappConnector(); +} + +export { instadapp }; + + const POLLING_INTERVAL = 12000; export enum LedgerDerivationPath { diff --git a/connectors/instadapp.ts b/connectors/instadapp.ts new file mode 100644 index 0000000..ea05692 --- /dev/null +++ b/connectors/instadapp.ts @@ -0,0 +1,53 @@ +import { AbstractConnector } from "@web3-react/abstract-connector"; +import { ConnectorUpdate } from "@web3-react/types"; + +class InstadappConnector extends AbstractConnector { + private provider: AbstractConnector | undefined; + + public async activate(): Promise { + //@ts-ignore + const provider = await window.parent.$nuxt.$web3Modal.connect(); + + return { + provider, + chainId: 1, + account: window.parent.$nuxt.$store.state.auth.dsaAddress + }; + } + public async getProvider(): Promise { + if (!this.provider) { + //@ts-ignore + this.provider = await window.parent.$nuxt.$web3Modal.connect(); + } + return this.provider; + } + + public async getChainId(): Promise { + const provider = await this.getProvider(); + + //@ts-ignore + return provider.chainId; + } + + public async getAccount(): Promise { + return window.parent.$nuxt.$store.state.auth.dsaAddress; + } + + public async deactivate(): Promise { + //@ts-ignore + await window.parent.$nuxt.$disconnectProviderWeb3(); + } + + public async isInstadapp(): Promise { + return ( + window.parent && + window.parent.$nuxt && + //@ts-ignore + typeof window.parent.$nuxt.$web3 != "undefined" && + //@ts-ignore + typeof window.parent.$nuxt.$dsa != "undefined" + ); + } +} + +export { InstadappConnector };