UNPKG

@lit-protocol/auth-browser

Version:

Browser-specific authentication utilities for the Lit Protocol, enabling seamless connection to various blockchain networks including Ethereum, Cosmos, and Solana.

125 lines 4.91 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.signAndSaveAuthMessage = exports.checkAndSignSolAuthMessage = exports.connectSolProvider = void 0; const constants_1 = require("@lit-protocol/constants"); const misc_1 = require("@lit-protocol/misc"); const misc_browser_1 = require("@lit-protocol/misc-browser"); // import { toString as uint8arrayToString } from 'uint8arrays'; const uint8arrays_1 = require("@lit-protocol/uint8arrays"); /** * * Get the Solana provider from the browser web3 extension * * @returns { object || never } */ const getProvider = () => { let resultOrError; // -- validate // The Backpack wallet does not inject a solana object into the window, so we need to check for the backpack object as well. if ('solana' in window || 'backpack' in window) { // only check for the solana object on the window, as keplr does not have the same client interface injected into the window. // @ts-ignore resultOrError = (0, constants_1.ERight)(window?.solana ?? window?.backpack); } else { resultOrError = (0, constants_1.ELeft)(new constants_1.NoWalletException({}, 'No web3 wallet was found that works with Solana. Install a Solana wallet or choose another chain')); } return resultOrError; }; /** * * Get Solana provider * * @returns { Promise<IProvider } */ const connectSolProvider = async () => { const providerOrError = getProvider(); if (providerOrError.type === 'ERROR') { throw new constants_1.UnknownError({ info: { provider: providerOrError.result, }, }, 'Failed to get provider'); } const provider = providerOrError.result; // No need to reconnect if already connected, some wallets such as Backpack throws an error when doing so. if (!provider.isConnected) { await provider.connect(); } const account = provider.publicKey.toBase58(); return { provider, account }; }; exports.connectSolProvider = connectSolProvider; /** * * Check and sign solana auth message * * @returns { AuthSig } */ const checkAndSignSolAuthMessage = async () => { const res = await (0, exports.connectSolProvider)(); if (!res) { (0, misc_1.log)('Failed to connect sol provider'); } const provider = res?.provider; const account = res?.account; const key = constants_1.LOCAL_STORAGE_KEYS.AUTH_SOL_SIGNATURE; let authSigOrError = (0, misc_browser_1.getStorageItem)(key); // -- case: if unable to get auth from local storage if (authSigOrError.type === constants_1.EITHER_TYPE.ERROR) { (0, misc_1.log)('signing auth message because sig is not in local storage'); await (0, exports.signAndSaveAuthMessage)({ provider }); // Refetch authSigOrError written in previous line authSigOrError = (0, misc_browser_1.getStorageItem)(key); } // @ts-ignore window.test = authSigOrError; let authSig = JSON.parse(authSigOrError.result); // -- if the wallet address isn't the same as the address from local storage if (account !== authSig.address) { (0, misc_1.log)('signing auth message because account is not the same as the address in the auth sig'); await (0, exports.signAndSaveAuthMessage)({ provider }); authSigOrError = (0, misc_browser_1.getStorageItem)(key); authSig = JSON.parse(authSigOrError.result); } (0, misc_1.log)('authSig', authSig); return authSig; }; exports.checkAndSignSolAuthMessage = checkAndSignSolAuthMessage; /** * * Sign and save auth signature locally (not saved to the nodes) * * @property { any } provider * @return { Promise<AuthSig | undefined> } * */ const signAndSaveAuthMessage = async ({ provider, }) => { const now = new Date().toISOString(); const body = constants_1.AUTH_SIGNATURE_BODY.replace('{{timestamp}}', now); // turn body into Uint8Array const data = (0, uint8arrays_1.uint8arrayFromString)(body, 'utf8'); // const data = naclUtil.encode(body); let payload; let derivedVia = 'solana.signMessage'; // Backpack wallet expects and returns a different payload from signMessage() if (provider?.isBackpack) { const result = await provider.signMessage(data); payload = { signature: result }; derivedVia = 'backpack.signMessage'; } else { payload = await provider.signMessage(data, 'utf8'); } const hexSig = (0, uint8arrays_1.uint8arrayToString)(payload.signature, 'base16'); const authSig = { sig: hexSig, derivedVia, signedMessage: body, address: provider.publicKey.toBase58(), }; localStorage.setItem(constants_1.LOCAL_STORAGE_KEYS.AUTH_SOL_SIGNATURE, JSON.stringify(authSig)); return authSig; }; exports.signAndSaveAuthMessage = signAndSaveAuthMessage; //# sourceMappingURL=sol.js.map