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.55 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 venomWalletName = "Venom Wallet"; const getKey = (type: string) => getKeyRaw(venomWalletName, type); /** * venomProvider: ProviderRpcClient */ export const checkIsProviderExist = async (venomProvider: any) => { try { const isExist = !!(await venomProvider?.hasProvider()); if (!isExist) { log({ type: "error", key: venomWalletName, value: "Extension is not installed", }); } return isExist; } catch (error) { return false; } }; /** * venomProvider: ProviderRpcClient, * options: any | undefined */ const checkVenomWalletAuth = async (VenomProvider: any, options: any) => { try { const key = getKey("extension/auth"); log({ key, value: "check auth start", }); const venomProvider = await makeMove( { before: "provider creating", after: "provider created", error: "provider creating failed", key, }, async () => { return new VenomProvider(options); } ); await makeMove( { before: "injected provider checking", after: "provider injected", error: "injected provider checking failed", key, }, async () => { const isExist = checkIsProviderExist(venomProvider); if (!isExist) throw new Error(); } ); const auth = await makeMove( { before: "auth checking", after: "auth checked", error: "auth checking failed", key, }, async () => { const getProviderState = await venomProvider?.getProviderState?.(); const permissions = getProviderState?.permissions; const accountInteraction = permissions?.accountInteraction; const address = accountInteraction?.address; // здесь вызовется только когда уже был залогинен setupNetworkIdTimer(address, venomProvider, options.checkNetworkId); return address && venomProvider; } ); log({ key, value: "check auth end", }); return { auth, fallback: venomProvider, }; } catch (error) { // console.error(error); } }; /** * venomProvider: ProviderRpcClient, * options: any | undefined * callbacks: Callbacks */ const connectToVenomWallet = async ( VenomProvider: any, options: any, callbacks: Callbacks ) => { try { const key = getKey("extension"); log({ key, value: "connection start", }); const venomProvider = await makeMove( { before: "provider creating", after: "provider created", error: "provider creating failed", key, }, async () => { return new VenomProvider(options); } ); await makeMove( { before: "injected provider checking", after: "provider injected", error: "injected provider checking failed", key, }, async () => { const isExist = checkIsProviderExist(venomProvider); 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 venomProvider?.requestPermissions({ permissions, }); if (accountInteraction == null) { throw new Error("Insufficient permissions"); } setupNetworkIdTimer( accountInteraction.address, venomProvider, options.checkNetworkId ); return accountInteraction; } ); log({ key, value: "connection end", }); callbacks.authorizationCompleted(venomProvider); await toggleExtensionWindow({ isExtensionWindowOpen: false, }); return venomProvider; } 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, }); } }; /** * venomProvider: ProviderRpcClient, * options: any | undefined */ const getStandaloneConnectionToVenomWallet = async ( VenomProvider: any, options: any ) => { try { const key = getKey("extension"); log({ key, value: "standalone start", }); const venomProvider = await makeMove( { before: "standalone provider creating", after: "standalone provider created", error: "standalone provider creating failed", key, }, async () => { return new VenomProvider(options); } ); log({ key, value: "standalone end", }); return venomProvider; } 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 venomWallet = { extension: { connector: connectToVenomWallet, authChecker: checkVenomWalletAuth, standalone: getStandaloneConnectionToVenomWallet, }, mobile: { connector: goByQRCode, }, ios: { connector: goByDeepLinkIOS, }, android: { connector: goByDeepLinkAndroid, }, }; export default venomWallet;