UNPKG

venom-connect

Version:

<p align="center"> <a href="https://github.com/venom-blockchain/developer-program"> <img src="https://raw.githubusercontent.com/venom-blockchain/developer-program/main/vf-dev-program.png" alt="Logo" width="366.8" height="146.4"> </a> </p>

308 lines (261 loc) 6.52 kB
import { toggleExtensionWindow } from "../../helpers/backdrop"; import { getKey as getKeyRaw, log, makeMove } from "../../helpers/utils"; import { Callbacks } from "../../types"; import { setupNetworkIdTimer } from "./networkIdTimerUtil"; // checked for version "everscale-inpage-provider": "^0.3.28", export const everWalletName = "Ever Wallet"; const getKey = (type: string) => getKeyRaw(everWalletName, type); /** * everProvider: ProviderRpcClient */ export const checkIsProviderExist = async (everProvider: any) => { try { const isExist = !!(await everProvider?.hasProvider()); if (!isExist) { log({ type: "error", key: everWalletName, value: "Extension is not installed", }); } return isExist; } catch (error) { return false; } }; /** * everProvider: ProviderRpcClient, * options: any | undefined */ const checkEverWalletAuth = async (EverProvider: any, options: any) => { try { const key = getKey("extension/auth"); log({ key, value: "check auth start", }); const everProvider = await makeMove( { before: "provider creating", after: "provider created", error: "provider creating failed", key, }, async () => { return new EverProvider(options); } ); await makeMove( { before: "injected provider checking", after: "provider injected", error: "injected provider checking failed", key, }, async () => { const isExist = checkIsProviderExist(everProvider); if (!isExist) throw new Error(); } ); const auth = await makeMove( { before: "auth checking", after: "auth checked", error: "auth checking failed", key, }, async () => { const getProviderState = await everProvider?.getProviderState?.(); const permissions = getProviderState?.permissions; const accountInteraction = permissions?.accountInteraction; const address = accountInteraction?.address; // здесь вызовется только когда уже был залогинен setupNetworkIdTimer(address, everProvider, options.checkNetworkId); return address && everProvider; } ); log({ key, value: "check auth end", }); return { auth, fallback: everProvider, }; } catch (error) { // console.error(error); } }; /** * everProvider: ProviderRpcClient, * options: any | undefined * callbacks: Callbacks */ const connectToEverWallet = async ( EverProvider: any, options: any, callbacks: Callbacks ) => { try { const key = getKey("extension"); log({ key, value: "connection start", }); const everProvider = await makeMove( { before: "provider creating", after: "provider created", error: "provider creating failed", key, }, async () => { return new EverProvider(options); } ); await makeMove( { before: "injected provider checking", after: "provider injected", error: "injected provider checking failed", key, }, async () => { const isExist = checkIsProviderExist(everProvider); if (!isExist) throw new Error(); } ); const permissions = ["basic", "accountInteraction"]; await toggleExtensionWindow({ isExtensionWindowOpen: true, }); await makeMove( { before: `permissions requesting (${permissions.join(", ")})`, after: "permissions requested", error: "permissions requesting failed", key, }, async () => { const { accountInteraction } = await everProvider?.requestPermissions({ permissions, }); if (accountInteraction == null) { throw new Error("Insufficient permissions"); } setupNetworkIdTimer( accountInteraction.address, everProvider, options.checkNetworkId ); return accountInteraction; } ); log({ key, value: "connection end", }); callbacks.authorizationCompleted(everProvider); await toggleExtensionWindow({ isExtensionWindowOpen: false, }); return everProvider; } catch (error: any) { let emessage; if (typeof error === "object") { if (error.message) { emessage = error.message; // get the error message } else { emessage = JSON.stringify(error); // convert the object to a string } } else { emessage = error.toString(); // convert the error to a string } callbacks.extensionWindowError(emessage); } finally { await toggleExtensionWindow({ isExtensionWindowOpen: false, }); } }; /** * everProvider: ProviderRpcClient, * options: any | undefined */ const getStandaloneConnectionToEverWallet = async ( EverProvider: any, options: any ) => { try { const key = getKey("extension"); log({ key, value: "standalone start", }); const everProvider = await makeMove( { before: "standalone provider creating", after: "standalone provider created", error: "standalone provider creating failed", key, }, async () => { return new EverProvider(options); } ); log({ key, value: "standalone end", }); return everProvider; } catch (error) { // console.error(error); } }; const goByQRCode = () => { try { const key = getKey("qr"); log({ key, value: "work in progress", }); return undefined as any; } catch (error) {} }; const goByDeepLinkIOS = () => { try { const key = getKey("ios"); log({ key, value: "work in progress", }); return undefined as any; } catch (error) {} }; const goByDeepLinkAndroid = () => { try { const key = getKey("android"); log({ key, value: "work in progress", }); return undefined as any; } catch (error) {} }; const everWallet = { extension: { connector: connectToEverWallet, authChecker: checkEverWalletAuth, standalone: getStandaloneConnectionToEverWallet, }, mobile: { connector: goByQRCode, }, ios: { connector: goByDeepLinkIOS, }, android: { connector: goByDeepLinkAndroid, }, }; export default everWallet;