UNPKG

@thirdweb-dev/wallets

Version:

<p align="center"> <br /> <a href="https://thirdweb.com"><img src="https://github.com/thirdweb-dev/js/blob/main/packages/sdk/logo.svg?raw=true" width="200" alt=""/></a> <br /> </p> <h1 align="center">thirdweb Wallet SDK</h1> <p align="center"> <a href="ht

229 lines (220 loc) • 7.5 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var classPrivateFieldSet = require('../../../../dist/classPrivateFieldSet-f0dc2a42.cjs.dev.js'); var defineProperty = require('../../../../dist/defineProperty-21d22449.cjs.dev.js'); var ethers = require('ethers'); var walletIds = require('../../../../dist/walletIds-2f745506.cjs.dev.js'); var connector = require('../../../../dist/connector-a63dd9e7.cjs.dev.js'); var normalizeChainId = require('../../../../dist/normalizeChainId-8778491e.cjs.dev.js'); var embeddedWallet = require('../../../../dist/embedded-wallet-94ab26c4.cjs.dev.js'); require('eventemitter3'); require('@paperxyz/sdk-common-utilities'); require('ethers/lib/utils'); var _embeddedWalletSdk = /*#__PURE__*/new WeakMap(); var _signer = /*#__PURE__*/new WeakMap(); class EmbeddedWalletConnector extends connector.Connector { constructor(options) { super(); defineProperty._defineProperty(this, "id", walletIds.walletIds.paper); defineProperty._defineProperty(this, "name", "Embedded Wallet"); defineProperty._defineProperty(this, "ready", true); defineProperty._defineProperty(this, "user", null); classPrivateFieldSet._classPrivateFieldInitSpec(this, _embeddedWalletSdk, { writable: true, value: void 0 }); classPrivateFieldSet._classPrivateFieldInitSpec(this, _signer, { writable: true, value: void 0 }); defineProperty._defineProperty(this, "onAccountsChanged", async accounts => { if (accounts.length === 0) { await this.onDisconnect(); } else { this.emit("change", { account: ethers.utils.getAddress(accounts[0]) }); } }); defineProperty._defineProperty(this, "onChainChanged", chainId => { const id = normalizeChainId.normalizeChainId(chainId); const unsupported = this.options.chains.findIndex(c => c.chainId === id) === -1; this.emit("change", { chain: { id, unsupported } }); }); defineProperty._defineProperty(this, "onDisconnect", async () => { this.emit("disconnect"); }); this.options = options; } getEmbeddedWalletSDK() { if (!classPrivateFieldSet._classPrivateFieldGet(this, _embeddedWalletSdk)) { classPrivateFieldSet._classPrivateFieldSet(this, _embeddedWalletSdk, new embeddedWallet.EmbeddedWalletSdk({ clientId: this.options.clientId, chain: "Ethereum", styles: this.options.styles })); } return classPrivateFieldSet._classPrivateFieldGet(this, _embeddedWalletSdk); } async connect(options) { const thirdwebSDK = await this.getEmbeddedWalletSDK(); if (!thirdwebSDK) { throw new Error("EmbeddedWallet SDK not initialized"); } const user = await thirdwebSDK.getUser(); switch (user.status) { case embeddedWallet.UserStatus.LOGGED_OUT: { let authResult; switch (options?.loginType) { case "headless_google_oauth": { authResult = await thirdwebSDK.auth.loginWithGoogle({ closeOpenedWindow: options.closeOpenedWindow, openedWindow: options.openedWindow }); break; } case "headless_email_otp_verification": { authResult = await thirdwebSDK.auth.verifyEmailLoginOtp({ email: options.email, otp: options.otp }); break; } case "ui_email_otp": { authResult = await thirdwebSDK.auth.loginWithEmailOtp({ email: options.email }); break; } default: { authResult = await thirdwebSDK.auth.loginWithModal(); break; } } this.user = authResult.user; break; } case embeddedWallet.UserStatus.LOGGED_IN_WALLET_INITIALIZED: { if (options?.loginType === "headless_google_oauth") { if (options.closeOpenedWindow && options.openedWindow) { options.closeOpenedWindow(options.openedWindow); } } this.user = user; break; } } if (!this.user) { throw new Error("Error connecting User"); } if (options?.chainId) { this.switchChain(options.chainId); } this.setupListeners(); return this.getAddress(); } async disconnect() { const paper = await classPrivateFieldSet._classPrivateFieldGet(this, _embeddedWalletSdk); await paper?.auth.logout(); classPrivateFieldSet._classPrivateFieldSet(this, _signer, undefined); classPrivateFieldSet._classPrivateFieldSet(this, _embeddedWalletSdk, undefined); this.user = null; } async getAddress() { const signer = await this.getSigner(); return signer.getAddress(); } async isConnected() { try { const addr = await this.getAddress(); return !!addr; } catch (e) { return false; } } async getProvider() { const signer = await this.getSigner(); if (!signer.provider) { throw new Error("Provider not found"); } return signer.provider; } async getSigner() { if (classPrivateFieldSet._classPrivateFieldGet(this, _signer)) { return classPrivateFieldSet._classPrivateFieldGet(this, _signer); } if (!this.user) { const embeddedWalletSdk = await this.getEmbeddedWalletSDK(); const user = await embeddedWalletSdk.getUser(); switch (user.status) { case embeddedWallet.UserStatus.LOGGED_IN_WALLET_INITIALIZED: { this.user = user; break; } } } const signer = await this.user?.wallet.getEthersJsSigner({ rpcEndpoint: this.options.chain.rpc[0] || "" // TODO: handle chain.rpc being empty array }); if (!signer) { throw new Error("Signer not found"); } classPrivateFieldSet._classPrivateFieldSet(this, _signer, signer); return signer; } async isAuthorized() { return false; } async switchChain(chainId) { const chain = this.options.chains.find(c => c.chainId === chainId); if (!chain) { throw new Error("Chain not configured"); } // update chain in wallet await this.user?.wallet.setChain({ chain: "Ethereum" }); // just pass Ethereum no matter what chain we are going to connect // update signer classPrivateFieldSet._classPrivateFieldSet(this, _signer, await this.user?.wallet.getEthersJsSigner({ rpcEndpoint: chain.rpc[0] || "" // TODO: handle chain.rpc being empty array })); this.emit("change", { chain: { id: chainId, unsupported: false } }); } async setupListeners() { const provider = await this.getProvider(); if (provider.on) { provider.on("accountsChanged", this.onAccountsChanged); provider.on("chainChanged", this.onChainChanged); provider.on("disconnect", this.onDisconnect); } } updateChains(chains) { this.options.chains = chains; } async getEmail() { // implicit call to set the user await this.getSigner(); if (!this.user) { throw new Error("No user found, Paper Wallet is not connected"); } return this.user.authDetails.email; } } exports.EmbeddedWalletConnector = EmbeddedWalletConnector;