@particle-network/solana-connectors
Version:
402 lines (392 loc) • 13.6 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/index.ts
var src_exports = {};
__export(src_exports, {
defaultConnectorFns: () => defaultConnectorFns,
injected: () => injected,
solanaWalletConnectors: () => solanaWalletConnectors,
version: () => version
});
module.exports = __toCommonJS(src_exports);
// src/injected.ts
var import_connector_core = require("@particle-network/connector-core");
var import_web3 = require("@solana/web3.js");
// src/utils.ts
var isConnected = (provider) => {
if (provider && typeof provider.isConnected === "boolean") {
return provider.isConnected;
}
return Boolean(provider == null ? void 0 : provider.publicKey);
};
// src/injected.ts
var targetMap = {
coinbaseWallet: {
id: "coinbaseWallet",
name: "Coinbase Wallet",
provider(window2) {
if (typeof window2 !== "undefined") {
return window2 == null ? void 0 : window2.coinbaseSolana;
}
return void 0;
}
},
bitKeep: {
id: "bitKeep",
name: "Bitget",
provider(window2) {
var _a, _b, _c;
if (typeof window2 !== "undefined" && ((_b = (_a = window2.bitkeep) == null ? void 0 : _a.solana) == null ? void 0 : _b.isBitKeep)) {
return (_c = window2.bitkeep) == null ? void 0 : _c.solana;
}
}
},
phantom: {
id: "phantom",
name: "Phantom",
provider(window2) {
var _a, _b, _c;
if (typeof window2 !== "undefined" && ((_b = (_a = window2.phantom) == null ? void 0 : _a.solana) == null ? void 0 : _b.isPhantom)) {
return (_c = window2.phantom) == null ? void 0 : _c.solana;
}
}
},
trustWallet: {
id: "trustWallet",
name: "Trust Wallet",
provider(window2) {
var _a, _b, _c;
if (typeof window2 !== "undefined" && ((_b = (_a = window2.trustwallet) == null ? void 0 : _a.solana) == null ? void 0 : _b.isTrust)) {
return (_c = window2.trustwallet) == null ? void 0 : _c.solana;
}
}
},
okxWallet: {
id: "okxWallet",
name: "OKX Wallet",
provider(window2) {
var _a, _b, _c;
if (typeof window2 !== "undefined" && ((_b = (_a = window2.okxwallet) == null ? void 0 : _a.solana) == null ? void 0 : _b.isOkxWallet)) {
return (_c = window2.okxwallet) == null ? void 0 : _c.solana;
}
}
},
braveWallet: {
id: "braveWallet",
name: "Brave Wallet",
provider(window2) {
var _a;
if (typeof window2 !== "undefined" && ((_a = window2.braveSolana) == null ? void 0 : _a.isBraveWallet)) {
return window2.braveSolana;
}
}
}
};
injected.type = "injected";
function injected(parameters) {
const { unstableShimAsyncInject } = parameters;
function getTarget() {
const target = parameters.target;
if (typeof target === "function") {
const result = target();
if (result)
return result;
}
if (typeof target === "object")
return target;
if (typeof target === "string" && targetMap[target])
return targetMap[target];
throw new Error("target not found.");
}
let accountChanged;
let disconnect;
return (0, import_connector_core.createConnector)((config) => ({
get icon() {
return getTarget().icon;
},
get id() {
return `solana_${getTarget().id}`;
},
get name() {
return getTarget().name;
},
type: injected.type,
async connect({ chainId, isReconnecting } = {}) {
var _a, _b, _c;
const provider = await this.getProvider();
if (!provider)
throw new import_connector_core.ProviderNotFoundError();
let accounts = [];
if (isReconnecting) {
const connected = await ((_a = config.storage) == null ? void 0 : _a.getItem(`${this.id}.injected.connected`));
if (connected) {
if (!isConnected(provider)) {
await provider.connect();
}
if (!provider.publicKey)
throw new import_connector_core.WalletAccountError(this.id);
}
accounts = await this.getAccounts().catch(() => []);
}
try {
if (!(accounts == null ? void 0 : accounts.length) && !isReconnecting) {
if (!isConnected(provider)) {
await provider.connect();
}
if (!provider.publicKey)
throw new import_connector_core.WalletAccountError(this.id);
accounts = [provider.publicKey.toBase58()];
}
if (!accountChanged) {
accountChanged = this.onAccountChanged.bind(this);
provider.on("accountChanged", accountChanged);
}
if (!disconnect) {
disconnect = this.onDisconnect.bind(this);
provider.on("disconnect", disconnect);
}
let currentChainId = await this.getChainId();
if (chainId && currentChainId !== chainId) {
const chain = await this.switchChain({ chainId }).catch((error) => {
if (error.code === import_connector_core.UserRejectedRequestError.code)
throw error;
return { id: currentChainId };
});
currentChainId = (_b = chain == null ? void 0 : chain.id) != null ? _b : currentChainId;
}
await ((_c = config.storage) == null ? void 0 : _c.setItem(`${this.id}.injected.connected`, true));
if (provider.publicKey) {
this.publicKey = new import_web3.PublicKey(provider.publicKey.toBytes());
}
return { accounts, chainId: currentChainId };
} catch (err) {
const error = err;
if (error.code === import_connector_core.UserRejectedRequestError.code)
throw new import_connector_core.UserRejectedRequestError(error);
throw error;
}
},
async disconnect() {
var _a;
const provider = await this.getProvider();
if (!provider)
throw new import_connector_core.ProviderNotFoundError();
if (disconnect) {
provider.removeListener("disconnect", disconnect);
disconnect = void 0;
}
try {
await provider.disconnect();
} catch {
}
await ((_a = config.storage) == null ? void 0 : _a.removeItem(`${this.id}.injected.connected`));
this.publicKey = void 0;
},
async getAccounts() {
var _a;
const provider = await this.getProvider();
if (!provider)
throw new import_connector_core.ProviderNotFoundError();
if (this.publicKey) {
return [this.publicKey.toBase58()];
}
const connected = await ((_a = config.storage) == null ? void 0 : _a.getItem(`${this.id}.injected.connected`));
if (connected) {
if (!isConnected(provider)) {
await provider.connect();
}
if (provider.publicKey) {
this.publicKey = new import_web3.PublicKey(provider.publicKey.toBytes());
return [this.publicKey.toBase58()];
}
}
return [];
},
async getChainId() {
var _a;
const provider = await this.getProvider();
if (!provider)
throw new import_connector_core.ProviderNotFoundError();
const chainId = await ((_a = config.storage) == null ? void 0 : _a.getItem(`${this.id}.injected.chainId`));
if (chainId && config.chains.find((chain) => chain.id === Number(chainId))) {
return Number(chainId);
}
return config.chains[0].id;
},
async getProvider() {
if (typeof window === "undefined")
return void 0;
const target = getTarget();
const provider = target.provider(window);
return provider;
},
async isAuthorized() {
var _a;
try {
let provider = await this.getProvider();
if (!provider) {
if (unstableShimAsyncInject !== void 0 && unstableShimAsyncInject !== false) {
const handleProvider = async () => {
const provider2 = await this.getProvider();
return provider2;
};
const timeout = typeof unstableShimAsyncInject === "number" ? unstableShimAsyncInject : 1e3;
provider = await new Promise((resolve) => setTimeout(() => resolve(handleProvider()), timeout));
if (!provider) {
throw new import_connector_core.ProviderNotFoundError();
}
} else {
throw new import_connector_core.ProviderNotFoundError();
}
}
const connected = await ((_a = config.storage) == null ? void 0 : _a.getItem(`${this.id}.injected.connected`));
return Boolean(connected);
} catch {
return false;
}
},
async switchChain({ chainId }) {
var _a;
const chain = config.chains.find((chain2) => chain2.id === chainId);
if (!chain) {
throw new import_connector_core.SwitchChainError(new import_connector_core.ChainNotConfiguredError());
}
await ((_a = config.storage) == null ? void 0 : _a.setItem(`${this.id}.injected.chainId`, chainId));
config.emitter.emit("change", { chainId });
return chain;
},
async onAccountChanged(publicKey) {
if (!publicKey) {
this.publicKey = void 0;
this.onDisconnect();
} else {
this.publicKey = new import_web3.PublicKey(publicKey.toBytes());
config.emitter.emit("change", {
accounts: [this.publicKey.toBase58()]
});
}
},
onChainChanged(chain) {
const chainId = Number(chain);
config.emitter.emit("change", { chainId });
},
async onDisconnect() {
var _a;
const provider = await this.getProvider();
config.emitter.emit("disconnect");
if (provider) {
if (disconnect) {
provider.removeListener("disconnect", disconnect);
disconnect = void 0;
}
}
this.publicKey = void 0;
await ((_a = config.storage) == null ? void 0 : _a.removeItem(`${this.id}.injected.connected`));
},
isInstalled() {
if (typeof window === "undefined")
return false;
const target = getTarget();
const provider = target.provider(window);
return Boolean(provider);
}
}));
}
// src/defaultConnectorFns.ts
var defaultConnectorFns = () => {
const connectors = [];
connectors.push(injected({ target: "phantom" }));
connectors.push(injected({ target: "coinbaseWallet" }));
connectors.push(injected({ target: "okxWallet" }));
connectors.push(injected({ target: "bitKeep" }));
connectors.push(injected({ target: "trustWallet" }));
return connectors;
};
// src/store.ts
var import_connector_core2 = require("@particle-network/connector-core");
var import_vanilla = require("zustand/vanilla");
// src/getConnection.ts
var import_web32 = require("@solana/web3.js");
var clients = /* @__PURE__ */ new Map();
function getConnection(chain) {
{
const client2 = clients.get(chain.id);
if (client2)
return client2;
}
const client = new import_web32.Connection(chain.rpcUrls.default.http[0]);
clients.set(chain.id, client);
return client;
}
// src/store.ts
solanaWalletConnectors.type = "solanaWallet";
function solanaWalletConnectors(parameters = {}) {
const { connectorFns } = parameters;
const defaultConnectorFns2 = connectorFns != null ? connectorFns : defaultConnectorFns();
return (0, import_connector_core2.createWalletConnector)((options) => {
const { ...rest } = options;
const allChains = rest.chains.filter(import_connector_core2.isSolanaChain);
if (allChains.length == 0) {
throw new Error("Please add Solana chains in Connectkit options.");
}
const chains = (0, import_vanilla.createStore)(() => allChains);
function setup(connectorFn) {
var _a;
const emitter = (0, import_connector_core2.createEmitter)();
const connector = {
...connectorFn({ emitter, chains: chains.getState(), storage: rest.storage }),
emitter,
uid: emitter.uid,
chainType: "solana",
walletConnectorType: solanaWalletConnectors.type
};
(_a = connector.setup) == null ? void 0 : _a.call(connector);
return connector;
}
const connectors = (0, import_vanilla.createStore)(() => [...defaultConnectorFns2].map(setup));
function getClient(chainId) {
const chain = chains.getState().find((chain2) => chain2.id === chainId);
if (!chain) {
throw new import_connector_core2.ChainNotConfiguredError();
}
return getConnection(chain);
}
return {
get type() {
return solanaWalletConnectors.type;
},
get chains() {
return chains.getState();
},
get connectors() {
return connectors.getState();
},
store: connectors,
getClient,
_internal: {
connectors: {
setup
}
}
};
});
}
// src/version.ts
var version = "2.1.0";
//# sourceMappingURL=index.cjs.map