@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
252 lines (245 loc) • 8.23 kB
JavaScript
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
var defineProperty = require('../../../../dist/defineProperty-9051a5d3.cjs.dev.js');
var WagmiConnector = require('../../../../dist/WagmiConnector-6ff7d562.cjs.dev.js');
var errors = require('../../../../dist/errors-a8e8ea7b.cjs.dev.js');
var ethers = require('ethers');
var walletIds = require('../../../../dist/walletIds-a0be5020.cjs.dev.js');
var url = require('../../../../dist/url-4b641c31.cjs.dev.js');
var normalizeChainId = require('../../../../dist/normalizeChainId-5da85f42.cjs.dev.js');
require('@thirdweb-dev/chains');
require('eventemitter3');
function _interopNamespace(e) {
if (e && e.__esModule) return e;
var n = Object.create(null);
if (e) {
Object.keys(e).forEach(function (k) {
if (k !== 'default') {
var d = Object.getOwnPropertyDescriptor(e, k);
Object.defineProperty(n, k, d.get ? d : {
enumerable: true,
get: function () { return e[k]; }
});
}
});
}
n["default"] = e;
return Object.freeze(n);
}
class CoinbaseWalletConnector extends WagmiConnector.WagmiConnector {
constructor(_ref) {
let {
chains,
options
} = _ref;
super({
chains,
options: {
reloadOnDisconnect: false,
...options
}
});
defineProperty._defineProperty(this, "id", walletIds.walletIds.coinbase);
defineProperty._defineProperty(this, "name", "Coinbase Wallet");
defineProperty._defineProperty(this, "ready", true);
defineProperty._defineProperty(this, "onAccountsChanged", accounts => {
if (accounts.length === 0) {
this.emit("disconnect");
} else {
this.emit("change", {
account: ethers.utils.getAddress(accounts[0])
});
}
});
defineProperty._defineProperty(this, "onChainChanged", chainId => {
const id = normalizeChainId.normalizeChainId(chainId);
const unsupported = this.isChainUnsupported(id);
this.emit("change", {
chain: {
id,
unsupported
}
});
});
defineProperty._defineProperty(this, "onDisconnect", () => {
this.emit("disconnect");
});
}
async connect() {
let {
chainId
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
try {
const provider = await this.getProvider();
this.setupListeners();
this.emit("message", {
type: "connecting"
});
const accounts = await provider.enable();
const account = ethers.utils.getAddress(accounts[0]);
// Switch to chain if provided
let id = await this.getChainId();
let unsupported = this.isChainUnsupported(id);
if (chainId && id !== chainId) {
try {
const chain = await this.switchChain(chainId);
id = chain.chainId;
unsupported = this.isChainUnsupported(id);
} catch (e) {
console.error(`Connected but failed to switch to desired chain ${chainId}`, e);
}
}
return {
account,
chain: {
id,
unsupported
},
provider: new ethers.providers.Web3Provider(provider)
};
} catch (error) {
if (/(user closed modal|accounts received is empty)/i.test(error.message)) {
throw new errors.UserRejectedRequestError(error);
}
throw error;
}
}
async disconnect() {
if (!this._provider) {
return;
}
const provider = await this.getProvider();
provider.removeListener("accountsChanged", this.onAccountsChanged);
provider.removeListener("chainChanged", this.onChainChanged);
provider.removeListener("disconnect", this.onDisconnect);
provider.disconnect();
provider.close();
}
async getAccount() {
const provider = await this.getProvider();
const accounts = await provider.request({
method: "eth_accounts"
});
if (accounts.length === 0) {
throw new Error("No accounts found");
}
// return checksum address
return ethers.utils.getAddress(accounts[0]);
}
async getChainId() {
const provider = await this.getProvider();
const chainId = normalizeChainId.normalizeChainId(provider.chainId);
return chainId;
}
async getProvider() {
if (!this._provider) {
let CoinbaseWalletSDK = (await Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespace(require('@coinbase/wallet-sdk')); })).default;
// Workaround for Vite dev import errors
// https://github.com/vitejs/vite/issues/7112
if (typeof CoinbaseWalletSDK !== "function" &&
// @ts-expect-error This import error is not visible to TypeScript
typeof CoinbaseWalletSDK.default === "function") {
CoinbaseWalletSDK = CoinbaseWalletSDK.default;
}
this._client = new CoinbaseWalletSDK(this.options);
const walletExtensionChainId = this._client.walletExtension?.getChainId();
const chain = this.chains.find(chain_ => this.options.chainId ? chain_.chainId === this.options.chainId : chain_.chainId === walletExtensionChainId) || this.chains[0];
const chainId = this.options.chainId || chain?.chainId;
const jsonRpcUrl = this.options.jsonRpcUrl || chain?.rpc[0];
this._provider = this._client.makeWeb3Provider(jsonRpcUrl, chainId);
}
return this._provider;
}
async getSigner() {
let {
chainId
} = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
const [provider, account] = await Promise.all([this.getProvider(), this.getAccount()]);
return new ethers.providers.Web3Provider(provider, chainId).getSigner(account);
}
async isAuthorized() {
try {
const account = await this.getAccount();
return !!account;
} catch {
return false;
}
}
async switchChain(chainId) {
const provider = await this.getProvider();
const id = ethers.utils.hexValue(chainId);
try {
await provider.request({
method: "wallet_switchEthereumChain",
params: [{
chainId: id
}]
});
return this.chains.find(x => x.chainId === chainId) ?? {
chainId: chainId,
name: `Chain ${id}`,
slug: `${id}`,
nativeCurrency: {
name: "Ether",
decimals: 18,
symbol: "ETH"
},
rpc: [""],
testnet: false,
chain: "ethereum",
shortName: "eth"
};
} catch (error) {
const chain = this.chains.find(x => x.chainId === chainId);
if (!chain) {
throw new errors.ChainNotConfiguredError({
chainId,
connectorId: this.id
});
}
// Indicates chain is not added to provider
if (error.code === 4902) {
try {
await provider.request({
method: "wallet_addEthereumChain",
params: [{
chainId: id,
chainName: chain.name,
nativeCurrency: chain.nativeCurrency,
rpcUrls: url.getValidPublicRPCUrl(chain),
// no client id on purpose here
blockExplorerUrls: this.getBlockExplorerUrls(chain)
}]
});
return chain;
} catch (addError) {
if (this._isUserRejectedRequestError(addError)) {
throw new errors.UserRejectedRequestError(addError);
}
throw new errors.AddChainError();
}
}
if (this._isUserRejectedRequestError(error)) {
throw new errors.UserRejectedRequestError(error);
}
throw new errors.SwitchChainError(error);
}
}
_isUserRejectedRequestError(error) {
return /(user rejected)/i.test(error.message);
}
async setupListeners() {
const provider = await this.getProvider();
provider.on("accountsChanged", this.onAccountsChanged);
provider.on("chainChanged", this.onChainChanged);
provider.on("disconnect", this.onDisconnect);
}
async getQrUrl() {
await this.getProvider();
if (!this._client) {
throw new Error("Coinbase Wallet SDK not initialized");
}
return this._client.getQrUrl();
}
}
exports.CoinbaseWalletConnector = CoinbaseWalletConnector;