@thirdweb-dev/wallets
Version:
<p align="center"> <br /> <a href="https://thirdweb.com"><img src="https://github.com/thirdweb-dev/js/blob/main/legacy_packages/sdk/logo.svg?raw=true" width="200" alt=""/></a> <br /> </p> <h1 align="center">thirdweb Wallet SDK</h1> <p align="center"> <a h
413 lines (403 loc) • 16.9 kB
JavaScript
import { Core } from '@walletconnect/core';
import { Web3Wallet } from '@walletconnect/web3wallet';
import { utils } from 'ethers';
import EventEmitter from 'eventemitter3';
import { T as TW_WC_PROJECT_ID, W as WC_RELAY_URL, E as EIP155_SIGNING_METHODS } from './wc-f2c5150f.esm.js';
export { E as EIP155_SIGNING_METHODS } from './wc-f2c5150f.esm.js';
import { formatJsonRpcResult } from '@walletconnect/jsonrpc-utils';
export { a as AbstractClientWallet, A as AsyncLocalStorage, D as DEFAULT_DAPP_META, c as createAsyncLocalStorage, i as isWalletAnalyticsEnabled, s as setWalletAnalyticsEnabled } from './base-7cb4610a.esm.js';
export { w as walletIds } from './walletIds-c34dbb3f.esm.js';
export { W as WagmiConnector } from './WagmiConnector-6011bbb1.esm.js';
export { A as AddChainError, C as ChainNotConfiguredError, P as ProviderRpcError, S as SwitchChainError, U as UserRejectedRequestError } from './errors-35fc3528.esm.js';
export { n as normalizeChainId } from './normalizeChainId-abcb61d5.esm.js';
export { C as Connector, W as WagmiAdapter } from './connector-20f7cf73.esm.js';
export { D as DEFAULT_FACTORY_ADDRESS, c as checkContractWalletSignature, g as getAllSigners, a as getAllSmartWallets, b as getSmartWalletAddress, d as getUserOpReceipt, i as isSmartWalletDeployed, e as isZkSyncChain } from './utils-80af2010.esm.js';
export { BloctoWallet } from '../evm/wallets/blocto/dist/thirdweb-dev-wallets-evm-wallets-blocto.esm.js';
export { EmbeddedWallet, EmbeddedWallet as InAppWallet } from '../evm/wallets/embedded-wallet/dist/thirdweb-dev-wallets-evm-wallets-embedded-wallet.esm.js';
export { s as supportedSmsCountries } from './supported-sms-countries-1bcd889a.esm.js';
export { MetaMaskWallet } from '../evm/wallets/metamask/dist/thirdweb-dev-wallets-evm-wallets-metamask.esm.js';
export { g as getInjectedXDEFIProvider } from './getInjectedXDEFIProvider-63fe03f0.esm.js';
export { OKXWallet } from '../evm/wallets/okx/dist/thirdweb-dev-wallets-evm-wallets-okx.esm.js';
export { g as getInjectedOKXProvider } from './getInjectedOKXProvider-bef80221.esm.js';
export { CoreWallet } from '../evm/wallets/core-wallet/dist/thirdweb-dev-wallets-evm-wallets-core-wallet.esm.js';
export { g as getInjectedCoreWalletProvider } from './getInjectedCoreWalletProvider-ebe9ab09.esm.js';
export { OneKeyWallet } from '../evm/wallets/onekey/dist/thirdweb-dev-wallets-evm-wallets-onekey.esm.js';
export { g as getInjectedOneKeyProvider } from './getInjectedOneKeyProvider-b2a7d8e7.esm.js';
export { CryptoDefiWallet } from '../evm/wallets/crypto-defi-wallet/dist/thirdweb-dev-wallets-evm-wallets-crypto-defi-wallet.esm.js';
export { g as getInjectedCryptoDefiWalletProvider } from './getInjectedCryptoDefiWalletProvider-6883e68f.esm.js';
export { RabbyWallet } from '../evm/wallets/rabby/dist/thirdweb-dev-wallets-evm-wallets-rabby.esm.js';
export { g as getInjectedRabbyProvider } from './getInjectedRabbyProvider-71aa751e.esm.js';
export { Coin98Wallet } from '../evm/wallets/coin98/dist/thirdweb-dev-wallets-evm-wallets-coin98.esm.js';
export { g as getInjectedCoin98Provider } from './getInjectedCoin98Provider-87d2f6e1.esm.js';
export { g as getInjectedMagicEdenProvider } from './getInjectedMagicEdenProvider-dcaf9ecd.esm.js';
export { g as getInjectedMetamaskProvider } from './getInjectedMetamaskProvider-bdec14c0.esm.js';
export { g as getInjectedPhantomProvider } from './getInjectedPhantomProvider-594ca51b.esm.js';
export { g as getInjectedRainbowProvider } from './getInjectedRainbowProvider-d812bb1f.esm.js';
export { g as getInjectedCoinbaseProvider } from './getInjectedCoinbaseProvider-e62a7926.esm.js';
export { a as assertWindowEthereum } from './assertWindowEthereum-2bcf9787.esm.js';
export { E as EngineSigner, a as EngineWallet } from './engine-949aae28.esm.js';
export { PaperWallet } from '../evm/wallets/paper-wallet/dist/thirdweb-dev-wallets-evm-wallets-paper-wallet.esm.js';
export { CoinbaseWallet } from '../evm/wallets/coinbase-wallet/dist/thirdweb-dev-wallets-evm-wallets-coinbase-wallet.esm.js';
export { EthersWallet } from '../evm/wallets/ethers/dist/thirdweb-dev-wallets-evm-wallets-ethers.esm.js';
export { FrameWallet } from '../evm/wallets/frame/dist/thirdweb-dev-wallets-evm-wallets-frame.esm.js';
export { ImTokenWallet } from '../evm/wallets/imtoken/dist/thirdweb-dev-wallets-evm-wallets-imtoken.esm.js';
export { InjectedWallet } from '../evm/wallets/injected/dist/thirdweb-dev-wallets-evm-wallets-injected.esm.js';
export { LocalWallet, isValidPrivateKey } from '../evm/wallets/local-wallet/dist/thirdweb-dev-wallets-evm-wallets-local-wallet.esm.js';
export { SignerWallet } from '../evm/wallets/signer/dist/thirdweb-dev-wallets-evm-wallets-signer.esm.js';
export { MagicLink } from '../evm/wallets/magic/dist/thirdweb-dev-wallets-evm-wallets-magic.esm.js';
export { XDEFIWallet } from '../evm/wallets/xdefi/dist/thirdweb-dev-wallets-evm-wallets-xdefi.esm.js';
export { PhantomWallet } from '../evm/wallets/phantom/dist/thirdweb-dev-wallets-evm-wallets-phantom.esm.js';
export { PrivateKeyWallet } from '../evm/wallets/private-key/dist/thirdweb-dev-wallets-evm-wallets-private-key.esm.js';
export { RainbowWallet } from '../evm/wallets/rainbow-wallet/dist/thirdweb-dev-wallets-evm-wallets-rainbow-wallet.esm.js';
export { SafeWallet } from '../evm/wallets/safe/dist/thirdweb-dev-wallets-evm-wallets-safe.esm.js';
export { SmartWallet } from '../evm/wallets/smart-wallet/dist/thirdweb-dev-wallets-evm-wallets-smart-wallet.esm.js';
export { TrustWallet } from '../evm/wallets/trust/dist/thirdweb-dev-wallets-evm-wallets-trust.esm.js';
export { WalletConnect } from '../evm/wallets/wallet-connect/dist/thirdweb-dev-wallets-evm-wallets-wallet-connect.esm.js';
export { WalletConnectV1 } from '../evm/wallets/wallet-connect-v1/dist/thirdweb-dev-wallets-evm-wallets-wallet-connect-v1.esm.js';
export { ZerionWallet } from '../evm/wallets/zerion/dist/thirdweb-dev-wallets-evm-wallets-zerion.esm.js';
export { TokenBoundSmartWallet } from '../evm/wallets/token-bound-smart-wallet/dist/thirdweb-dev-wallets-evm-wallets-token-bound-smart-wallet.esm.js';
export { MagicEdenWallet } from '../evm/wallets/magic-eden/dist/thirdweb-dev-wallets-evm-wallets-magic-eden.esm.js';
export { A as AUTH_TOKEN_LOCAL_STORAGE_NAME, c as AuthProvider, D as DEVICE_SHARE_LOCAL_STORAGE_NAME, a as DEVICE_SHARE_LOCAL_STORAGE_NAME_DEPRECATED, E as EmbeddedWalletSdk, R as RecoveryShareManagement, U as UserWalletStatus, W as WALLET_USER_DETAILS_LOCAL_STORAGE_NAME, b as WALLET_USER_ID_LOCAL_STORAGE_NAME } from './embedded-wallet-0fba3cdb.esm.js';
import '@thirdweb-dev/chains';
import '../evm/wallets/abstract/dist/thirdweb-dev-wallets-evm-wallets-abstract.esm.js';
import './defineProperty-7303a112.esm.js';
import '@thirdweb-dev/sdk';
import './headers-31b6ef3b.esm.js';
import './url-0d129c6b.esm.js';
import '@account-abstraction/contracts';
import 'buffer';
import '@thirdweb-dev/crypto';
import '@paperxyz/sdk-common-utilities';
import 'ethers/lib/utils';
const PREFIX = "__TW__";
class LocalStorage {
constructor(name) {
this.name = name;
}
getItem(key) {
return localStorage.getItem(`${PREFIX}/${this.name}/${key}`);
}
setItem(key, value) {
return localStorage.setItem(`${PREFIX}/${this.name}/${key}`, value);
}
removeItem(key) {
return localStorage.removeItem(`${PREFIX}/${this.name}/${key}`);
}
}
/**
* @internal
*/
function createLocalStorage(name) {
return new LocalStorage(name);
}
// connect dapp support through wcv2 protocol
class WalletConnectHandler extends EventEmitter {
constructor(wallet) {
super();
this.wallet = wallet;
}
}
class WalletConnectV2Handler extends WalletConnectHandler {
constructor(options, wallet) {
super(wallet);
const defaultWCReceiverConfig = {
walletConnectWalletMetadata: {
name: "thirdweb Smart Account",
description: "thirdweb Smart Account",
url: "https://thirdweb.com",
icons: ["https://thirdweb.com/favicon.ico"]
},
walletConnectV2ProjectId: TW_WC_PROJECT_ID,
walletConnectV2RelayUrl: WC_RELAY_URL,
...(options?.walletConnectReceiver === true ? {} : options?.walletConnectReceiver)
};
this._wcMetadata = defaultWCReceiverConfig.walletConnectWalletMetadata;
this._core = new Core({
projectId: defaultWCReceiverConfig.walletConnectV2ProjectId,
relayUrl: defaultWCReceiverConfig.walletConnectV2RelayUrl
});
}
async init() {
this._wcWallet = await Web3Wallet.init({
core: this._core,
metadata: this._wcMetadata
});
const sessions = this._wcWallet.getActiveSessions();
const keys = Object.keys(sessions);
if (keys[0]) {
this._session = sessions[keys[0]];
}
this._setupWalletConnectEventsListeners();
}
async connectApp(wcUri) {
if (!this._wcWallet) {
throw new Error("Please, init the wallet before connecting an app.");
}
await this._wcWallet.core.pairing.pair({
uri: wcUri
});
}
async approveSession() {
if (!this._wcWallet) {
throw new Error("Please, init the wallet before making session requests.");
}
if (!this._activeProposal) {
throw new Error("Please, pass a valid proposal.");
}
const account = await this.wallet.getAddress();
const {
id,
params
} = this._activeProposal;
const {
requiredNamespaces,
relays
} = params;
const namespaces = {};
Object.keys(requiredNamespaces).forEach(key => {
const accounts = [];
const namespace = requiredNamespaces[key];
if (namespace) {
namespace.chains?.map(chain => {
accounts.push(`${chain}:${account}`);
});
namespaces[key] = {
accounts,
methods: namespace.methods,
events: namespace.events
};
}
});
this._session = await this._wcWallet.approveSession({
id,
relayProtocol: relays[0]?.protocol,
namespaces
});
this.emit("session_approved");
}
async rejectSession() {
if (!this._wcWallet) {
throw new Error("Please, init the wallet before making session requests.");
}
if (!this._activeProposal) {
throw new Error("Please, pass a valid proposal.");
}
const {
id
} = this._activeProposal;
await this._wcWallet.rejectSession({
id,
reason: {
message: "User rejected methods.",
code: 5002
}
});
}
async approveEIP155Request() {
if (!this._activeRequestEvent) {
return;
}
const {
topic,
params,
id
} = this._activeRequestEvent;
const {
request
} = params;
let response;
switch (request.method) {
case EIP155_SIGNING_METHODS.PERSONAL_SIGN:
case EIP155_SIGNING_METHODS.ETH_SIGN:
const message = this._getSignParamsMessage(request.params);
const signedMessage = await this.wallet.signMessage(message || ""); // TODO: handle empty message
response = formatJsonRpcResult(id, signedMessage);
break;
// case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA:
// case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V3:
// case EIP155_SIGNING_METHODS.ETH_SIGN_TYPED_DATA_V4:
// const {
// domain,
// types,
// message: data,
// } = getSignTypedDataParamsData(request.params);
// // https://github.com/ethers-io/ethers.js/issues/687#issuecomment-714069471
// delete types.EIP712Domain;
// const signedData = await wallet._signTypedData(domain, types, data);
// return formatJsonRpcResult(id, signedData);
case EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION:
const signer = await this.wallet.getSigner();
const sendTransaction = request.params[0];
const tx = await signer.sendTransaction(sendTransaction);
const {
transactionHash
} = await tx.wait();
response = formatJsonRpcResult(id, transactionHash);
break;
case EIP155_SIGNING_METHODS.ETH_SIGN_TRANSACTION:
const signerSign = await this.wallet.getSigner();
const signTransaction = request.params[0];
const signature = await signerSign.signTransaction(signTransaction);
response = formatJsonRpcResult(id, signature);
break;
default:
const error = {
id,
jsonrpc: "2.0",
error: {
message: "Invalid event.",
code: 1002
}
};
return this._wcWallet?.respondSessionRequest({
topic,
response: error
});
}
return this._wcWallet?.respondSessionRequest({
topic,
response
});
}
async rejectEIP155Request() {
if (!this._activeRequestEvent) {
return;
}
const {
topic,
id
} = this._activeRequestEvent;
const response = {
id,
jsonrpc: "2.0",
error: {
message: "User rejected methods.",
code: 5002
}
};
return this._wcWallet?.respondSessionRequest({
topic,
response
});
}
getActiveSessions() {
if (!this._wcWallet) {
throw new Error("Please, init the wallet before getting sessions.");
}
const sessions = this._wcWallet.getActiveSessions();
const sessionKeys = Object.keys(sessions);
if (!sessions || sessionKeys.length === 0) {
return [];
}
const thisSessions = [];
for (const sessionKey of sessionKeys) {
const session = sessions[sessionKey];
if (session) {
const topic = session.topic;
const peerMeta = session.peer.metadata;
thisSessions.push({
topic,
peer: {
metadata: peerMeta
}
});
}
}
return thisSessions;
}
disconnectSession() {
if (!this._wcWallet) {
throw new Error("Please, init the wallet before disconnecting sessions.");
}
if (!this._session) {
return Promise.resolve();
}
const params = {
topic: this._session.topic,
reason: {
message: "User disconnected.",
code: 6000
}
};
return this._wcWallet?.disconnectSession(params);
}
_setupWalletConnectEventsListeners() {
if (!this._wcWallet) {
throw new Error("Please, init the wallet before making session requests.");
}
this._wcWallet.on("session_proposal", proposal => {
this._activeProposal = proposal;
this.emit("session_proposal", {
proposer: {
metadata: proposal.params.proposer.metadata
}
});
});
this._wcWallet.on("session_delete", session => {
this._session = undefined;
this._activeProposal = undefined;
this.emit("session_delete", {
topic: session.topic
});
});
this._wcWallet.on("session_request", async requestEvent => {
if (!this._session) {
return;
}
const {
params: requestParams
} = requestEvent;
const {
request
} = requestParams;
const {
params
} = request;
switch (request.method) {
case EIP155_SIGNING_METHODS.ETH_SIGN:
case EIP155_SIGNING_METHODS.PERSONAL_SIGN:
this._activeRequestEvent = requestEvent;
const message = params[0];
const decodedMessage = new TextDecoder().decode(utils.arrayify(message));
const paramsCopy = [...params];
paramsCopy[0] = decodedMessage;
this.emit("session_request", {
topic: this._session.topic,
params: paramsCopy,
peer: {
metadata: this._session.peer.metadata
},
method: request.method
});
return;
case EIP155_SIGNING_METHODS.ETH_SEND_TRANSACTION:
case EIP155_SIGNING_METHODS.ETH_SIGN_TRANSACTION:
this._activeRequestEvent = requestEvent;
this.emit("session_request", {
topic: this._session.topic,
params: requestEvent.params.request.params,
peer: {
metadata: this._session.peer.metadata
},
method: request.method
});
return;
default:
throw new Error(`WCV2.Method not supported: ${request.method}`);
}
});
}
/**
* Gets message from various signing request methods by filtering out
* a value that is not an address (thus is a message).
* If it is a hex string, it gets converted to utf8 string
*/
_getSignParamsMessage(params) {
const message = params.filter(p => !utils.isAddress(p))[0] || ""; // TODO: handle empty message
if (utils.isHexString(message)) {
return utils.toUtf8String(message);
}
return message;
}
}
export { LocalStorage, WalletConnectHandler, WalletConnectV2Handler, createLocalStorage };