UNPKG

@tronweb3/tronwallet-adapter-okxwallet

Version:

Wallet adapter for Okx Wallet extension and Okx Wallet app.

357 lines 19.4 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.OkxWalletAdapter = exports.OkxWalletAdapterName = void 0; const tronwallet_abstract_adapter_1 = require("@tronweb3/tronwallet-abstract-adapter"); const tronwallet_adapter_tronlink_1 = require("@tronweb3/tronwallet-adapter-tronlink"); const utils_js_1 = require("./utils.js"); exports.OkxWalletAdapterName = 'OKX Wallet'; class OkxWalletAdapter extends tronwallet_abstract_adapter_1.Adapter { constructor(config = {}) { super(); this.name = exports.OkxWalletAdapterName; this.url = 'https://okx.com'; this.icon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIiByeD0iOCIgZmlsbD0iYmxhY2siLz4KPHBhdGggZD0iTTIzLjU1ODMgMTUuODk2NUgxNi40NDc0QzE2LjE0NTMgMTUuODk2NSAxNS45MDA0IDE2LjE0MTQgMTUuOTAwNCAxNi40NDM1VjIzLjU1NDRDMTUuOTAwNCAyMy44NTY1IDE2LjE0NTMgMjQuMTAxNCAxNi40NDc0IDI0LjEwMTRIMjMuNTU4M0MyMy44NjA0IDI0LjEwMTQgMjQuMTA1MyAyMy44NTY1IDI0LjEwNTMgMjMuNTU0NFYxNi40NDM1QzI0LjEwNTMgMTYuMTQxNCAyMy44NjA0IDE1Ljg5NjUgMjMuNTU4MyAxNS44OTY1WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTE2LjQ0NzQgMTYuMzk2NUgyMy41NTgzQzIzLjU4NDIgMTYuMzk2NSAyMy42MDUzIDE2LjQxNzUgMjMuNjA1MyAxNi40NDM1VjIzLjU1NDRDMjMuNjA1MyAyMy41ODAzIDIzLjU4NDIgMjMuNjAxNCAyMy41NTgzIDIzLjYwMTRIMTYuNDQ3NEMxNi40MjE0IDIzLjYwMTQgMTYuNDAwNCAyMy41ODAzIDE2LjQwMDQgMjMuNTU0NFYxNi40NDM1QzE2LjQwMDQgMTYuNDE3NSAxNi40MjE0IDE2LjM5NjUgMTYuNDQ3NCAxNi4zOTY1WiIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLW9wYWNpdHk9IjAuMTUiLz4KPHBhdGggZD0iTTE1LjM1MDMgNy42OTE0MUg4LjIzOTM3QzcuOTM3MjggNy42OTE0MSA3LjY5MjM4IDcuOTM2MyA3LjY5MjM4IDguMjM4NFYxNS4zNDkzQzcuNjkyMzggMTUuNjUxNCA3LjkzNzI4IDE1Ljg5NjMgOC4yMzkzNyAxNS44OTYzSDE1LjM1MDNDMTUuNjUyMyAxNS44OTYzIDE1Ljg5NzIgMTUuNjUxNCAxNS44OTcyIDE1LjM0OTNWOC4yMzg0QzE1Ljg5NzIgNy45MzYzIDE1LjY1MjMgNy42OTE0MSAxNS4zNTAzIDcuNjkxNDFaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNOC4yMzkzNyA4LjE5MTQxSDE1LjM1MDNDMTUuMzc2MiA4LjE5MTQxIDE1LjM5NzIgOC4yMTI0NSAxNS4zOTcyIDguMjM4NFYxNS4zNDkzQzE1LjM5NzIgMTUuMzc1MiAxNS4zNzYyIDE1LjM5NjMgMTUuMzUwMyAxNS4zOTYzSDguMjM5MzdDOC4yMTM0MiAxNS4zOTYzIDguMTkyMzggMTUuMzc1MiA4LjE5MjM4IDE1LjM0OTNWOC4yMzg0QzguMTkyMzggOC4yMTI0NCA4LjIxMzQyIDguMTkxNDEgOC4yMzkzNyA4LjE5MTQxWiIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLW9wYWNpdHk9IjAuMTUiLz4KPHBhdGggZD0iTTMxLjc2MDQgNy42OTE0MUgyNC42NDk1QzI0LjM0NzQgNy42OTE0MSAyNC4xMDI1IDcuOTM2MyAyNC4xMDI1IDguMjM4NFYxNS4zNDkzQzI0LjEwMjUgMTUuNjUxNCAyNC4zNDc0IDE1Ljg5NjMgMjQuNjQ5NSAxNS44OTYzSDMxLjc2MDRDMzIuMDYyNSAxNS44OTYzIDMyLjMwNzQgMTUuNjUxNCAzMi4zMDc0IDE1LjM0OTNWOC4yMzg0QzMyLjMwNzQgNy45MzYzIDMyLjA2MjUgNy42OTE0MSAzMS43NjA0IDcuNjkxNDFaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNMjQuNjQ5NSA4LjE5MTQxSDMxLjc2MDRDMzEuNzg2NCA4LjE5MTQxIDMxLjgwNzQgOC4yMTI0NSAzMS44MDc0IDguMjM4NFYxNS4zNDkzQzMxLjgwNzQgMTUuMzc1MiAzMS43ODY0IDE1LjM5NjMgMzEuNzYwNCAxNS4zOTYzSDI0LjY0OTVDMjQuNjIzNiAxNS4zOTYzIDI0LjYwMjUgMTUuMzc1MiAyNC42MDI1IDE1LjM0OTNWOC4yMzg0QzI0LjYwMjUgOC4yMTI0NCAyNC42MjM2IDguMTkxNDEgMjQuNjQ5NSA4LjE5MTQxWiIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLW9wYWNpdHk9IjAuMTUiLz4KPHBhdGggZD0iTTE1LjM1MDMgMjQuMDk5Nkg4LjIzOTM3QzcuOTM3MjggMjQuMDk5NiA3LjY5MjM4IDI0LjM0NDUgNy42OTIzOCAyNC42NDY2VjMxLjc1NzVDNy42OTIzOCAzMi4wNTk2IDcuOTM3MjggMzIuMzA0NSA4LjIzOTM3IDMyLjMwNDVIMTUuMzUwM0MxNS42NTI0IDMyLjMwNDUgMTUuODk3MyAzMi4wNTk2IDE1Ljg5NzMgMzEuNzU3NVYyNC42NDY2QzE1Ljg5NzMgMjQuMzQ0NSAxNS42NTI0IDI0LjA5OTYgMTUuMzUwMyAyNC4wOTk2WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTguMjM5MzcgMjQuNTk5NkgxNS4zNTAzQzE1LjM3NjIgMjQuNTk5NiAxNS4zOTczIDI0LjYyMDYgMTUuMzk3MyAyNC42NDY2VjMxLjc1NzVDMTUuMzk3MyAzMS43ODM0IDE1LjM3NjIgMzEuODA0NSAxNS4zNTAzIDMxLjgwNDVIOC4yMzkzN0M4LjIxMzQyIDMxLjgwNDUgOC4xOTIzOCAzMS43ODM0IDguMTkyMzggMzEuNzU3NVYyNC42NDY2QzguMTkyMzggMjQuNjIwNiA4LjIxMzQyIDI0LjU5OTYgOC4yMzkzNyAyNC41OTk2WiIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLW9wYWNpdHk9IjAuMTUiLz4KPHBhdGggZD0iTTMxLjc2MDQgMjQuMDk5NkgyNC42NDk1QzI0LjM0NzQgMjQuMDk5NiAyNC4xMDI1IDI0LjM0NDUgMjQuMTAyNSAyNC42NDY2VjMxLjc1NzVDMjQuMTAyNSAzMi4wNTk2IDI0LjM0NzQgMzIuMzA0NSAyNC42NDk1IDMyLjMwNDVIMzEuNzYwNEMzMi4wNjI1IDMyLjMwNDUgMzIuMzA3NCAzMi4wNTk2IDMyLjMwNzQgMzEuNzU3NVYyNC42NDY2QzMyLjMwNzQgMjQuMzQ0NSAzMi4wNjI1IDI0LjA5OTYgMzEuNzYwNCAyNC4wOTk2WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTI0LjY0OTUgMjQuNTk5NkgzMS43NjA0QzMxLjc4NjQgMjQuNTk5NiAzMS44MDc0IDI0LjYyMDYgMzEuODA3NCAyNC42NDY2VjMxLjc1NzVDMzEuODA3NCAzMS43ODM0IDMxLjc4NjQgMzEuODA0NSAzMS43NjA0IDMxLjgwNDVIMjQuNjQ5NUMyNC42MjM2IDMxLjgwNDUgMjQuNjAyNSAzMS43ODM0IDI0LjYwMjUgMzEuNzU3NVYyNC42NDY2QzI0LjYwMjUgMjQuNjIwNiAyNC42MjM2IDI0LjU5OTYgMjQuNjQ5NSAyNC41OTk2WiIgc3Ryb2tlPSJ3aGl0ZSIgc3Ryb2tlLW9wYWNpdHk9IjAuMTUiLz4KPC9zdmc+Cg=='; this._readyState = (0, tronwallet_abstract_adapter_1.isInBrowser)() ? tronwallet_abstract_adapter_1.WalletReadyState.Loading : tronwallet_abstract_adapter_1.WalletReadyState.NotFound; this._state = tronwallet_abstract_adapter_1.AdapterState.Loading; this.messageHandler = (e) => { var _a, _b, _c; const message = (_a = e.data) === null || _a === void 0 ? void 0 : _a.message; if (!message) { return; } if (message.action === 'accountsChanged') { setTimeout(() => { var _a; const preAddr = this.address || ''; if ((_a = this._wallet) === null || _a === void 0 ? void 0 : _a.ready) { const address = message.data.address; this.setAddress(address); this.setState(tronwallet_abstract_adapter_1.AdapterState.Connected); } else { this.setAddress(null); this.setState(tronwallet_abstract_adapter_1.AdapterState.Disconnect); } const address = this.address || ''; if (address !== preAddr) { this.emit('accountsChanged', this.address || '', preAddr); } if (!preAddr && this.address) { this.emit('connect', this.address); } else if (preAddr && !this.address) { this.emit('disconnect'); } }, 200); } else if (message.action === 'connect') { const isCurConnected = this.connected; const preAddress = this.address || ''; const address = ((_c = (_b = this._wallet.tronWeb) === null || _b === void 0 ? void 0 : _b.defaultAddress) === null || _c === void 0 ? void 0 : _c.base58) || ''; this.setAddress(address); this.setState(tronwallet_abstract_adapter_1.AdapterState.Connected); if (!isCurConnected) { this.emit('connect', address); } else if (address !== preAddress) { this.emit('accountsChanged', this.address || '', preAddress); } } else if (message.action === 'disconnect') { this.setAddress(null); this.setState(tronwallet_abstract_adapter_1.AdapterState.Disconnect); this.emit('disconnect'); } }; this._checkPromise = null; this._updateWallet = () => { var _a, _b; let state = this.state; let address = this.address; if ((0, utils_js_1.supportOkxWallet)()) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion this._wallet = window.okxwallet.tronLink; this._listenEvent(); address = ((_b = (_a = this._wallet.tronWeb) === null || _a === void 0 ? void 0 : _a.defaultAddress) === null || _b === void 0 ? void 0 : _b.base58) || null; state = this._wallet.ready ? tronwallet_abstract_adapter_1.AdapterState.Connected : tronwallet_abstract_adapter_1.AdapterState.Disconnect; } else { this._wallet = null; address = null; state = tronwallet_abstract_adapter_1.AdapterState.NotFound; } this.setAddress(address); this.setState(state); }; const { checkTimeout = 2 * 1000, openUrlWhenWalletNotFound = true, openAppWithDeeplink = true } = config; if (typeof checkTimeout !== 'number') { throw new Error('[OkxWalletAdapter] config.checkTimeout should be a number'); } this.config = { checkTimeout, openAppWithDeeplink, openUrlWhenWalletNotFound, }; this._connecting = false; this._wallet = null; this._address = null; if (!(0, tronwallet_abstract_adapter_1.isInBrowser)()) { this._readyState = tronwallet_abstract_adapter_1.WalletReadyState.NotFound; this.setState(tronwallet_abstract_adapter_1.AdapterState.NotFound); return; } if ((0, utils_js_1.supportOkxWallet)()) { this._readyState = tronwallet_abstract_adapter_1.WalletReadyState.Found; this._updateWallet(); } else { this._checkWallet().then(() => { if (this.connected) { this.emit('connect', this.address || ''); } }); } } get address() { return this._address; } get state() { return this._state; } get readyState() { return this._readyState; } get connecting() { return this._connecting; } /** * Get network information used by OkxWallet. * @returns {Network} Current network information. */ network() { return __awaiter(this, void 0, void 0, function* () { try { yield this._checkWallet(); if (this.state !== tronwallet_abstract_adapter_1.AdapterState.Connected) throw new tronwallet_abstract_adapter_1.WalletDisconnectedError(); const wallet = this._wallet; if (!wallet || !wallet.tronWeb) throw new tronwallet_abstract_adapter_1.WalletDisconnectedError(); try { return yield (0, tronwallet_adapter_tronlink_1.getNetworkInfoByTronWeb)(wallet.tronWeb); } catch (e) { throw new tronwallet_abstract_adapter_1.WalletGetNetworkError(e === null || e === void 0 ? void 0 : e.message, e); } } catch (e) { this.emit('error', e); throw e; } }); } connect() { return __awaiter(this, void 0, void 0, function* () { var _a; try { this.checkIfOpenOkxWallet(); if (this.connected || this.connecting) return; yield this._checkWallet(); if (this.state === tronwallet_abstract_adapter_1.AdapterState.NotFound) { if (this.config.openUrlWhenWalletNotFound !== false && (0, tronwallet_abstract_adapter_1.isInBrowser)()) { window.open(this.url, '_blank'); } throw new tronwallet_abstract_adapter_1.WalletNotFoundError(); } if (!this._wallet) return; this._connecting = true; const wallet = this._wallet; try { const res = yield wallet.request({ method: 'tron_requestAccounts' }); if (!res) { throw new tronwallet_abstract_adapter_1.WalletConnectionError('Request connect error.'); } if (res.code === 4000) { throw new tronwallet_abstract_adapter_1.WalletConnectionError('The same DApp has already initiated a request to connect to OkxWallet, and the pop-up window has not been closed.'); } if (res.code === 4001) { throw new tronwallet_abstract_adapter_1.WalletConnectionError('The user rejected connection.'); } } catch (error) { throw new tronwallet_abstract_adapter_1.WalletConnectionError(error === null || error === void 0 ? void 0 : error.message, error); } const address = ((_a = wallet.tronWeb.defaultAddress) === null || _a === void 0 ? void 0 : _a.base58) || ''; this.setAddress(address); this.setState(tronwallet_abstract_adapter_1.AdapterState.Connected); this._listenEvent(); this.connected && this.emit('connect', this.address || ''); } catch (error) { this.emit('error', error); throw error; } finally { this._connecting = false; } }); } disconnect() { return __awaiter(this, void 0, void 0, function* () { this._stopListenEvent(); if (this.state !== tronwallet_abstract_adapter_1.AdapterState.Connected) { return; } this.setAddress(null); this.setState(tronwallet_abstract_adapter_1.AdapterState.Disconnect); this.emit('disconnect'); }); } signTransaction(transaction, privateKey) { return __awaiter(this, void 0, void 0, function* () { try { const wallet = yield this.checkAndGetWallet(); try { return yield wallet.tronWeb.trx.sign(transaction, privateKey); } catch (error) { if (error instanceof Error) { throw new tronwallet_abstract_adapter_1.WalletSignTransactionError(error.message, error); } else { throw new tronwallet_abstract_adapter_1.WalletSignTransactionError(error, new Error(error)); } } } catch (error) { this.emit('error', error); throw error; } }); } multiSign(transaction, privateKey, permissionId) { return __awaiter(this, void 0, void 0, function* () { try { const wallet = yield this.checkAndGetWallet(); try { return yield wallet.tronWeb.trx.multiSign(transaction, privateKey, permissionId); } catch (error) { if (error instanceof Error) { throw new tronwallet_abstract_adapter_1.WalletSignTransactionError(error.message, error); } else { throw new tronwallet_abstract_adapter_1.WalletSignTransactionError(error, new Error(error)); } } } catch (error) { this.emit('error', error); throw error; } }); } signMessage(message, privateKey) { return __awaiter(this, void 0, void 0, function* () { try { const wallet = yield this.checkAndGetWallet(); try { return yield wallet.tronWeb.trx.signMessageV2(message, privateKey); } catch (error) { if (error instanceof Error) { throw new tronwallet_abstract_adapter_1.WalletSignMessageError(error.message, error); } else { throw new tronwallet_abstract_adapter_1.WalletSignMessageError(error, new Error(error)); } } } catch (error) { this.emit('error', error); throw error; } }); } checkAndGetWallet() { return __awaiter(this, void 0, void 0, function* () { this.checkIfOpenOkxWallet(); yield this._checkWallet(); if (this.state !== tronwallet_abstract_adapter_1.AdapterState.Connected) throw new tronwallet_abstract_adapter_1.WalletDisconnectedError(); const wallet = this._wallet; if (!wallet || !wallet.tronWeb) throw new tronwallet_abstract_adapter_1.WalletDisconnectedError(); return wallet; }); } _listenEvent() { this._stopListenEvent(); window.addEventListener('message', this.messageHandler); } _stopListenEvent() { window.removeEventListener('message', this.messageHandler); } checkIfOpenOkxWallet() { if (this.config.openAppWithDeeplink === false) { return; } if ((0, utils_js_1.openOkxWallet)()) { throw new tronwallet_abstract_adapter_1.WalletNotFoundError(); } } /** * check if wallet exists by interval, the promise only resolve when wallet detected or timeout * @returns if OkxWallet exists */ _checkWallet() { if (this.readyState === tronwallet_abstract_adapter_1.WalletReadyState.Found) { return Promise.resolve(true); } if (this._checkPromise) { return this._checkPromise; } const interval = 100; const maxTimes = Math.floor(this.config.checkTimeout / interval); let times = 0, timer; this._checkPromise = new Promise((resolve) => { const check = () => { times++; const isSupport = (0, utils_js_1.supportOkxWallet)(); if (isSupport || times > maxTimes) { timer && clearInterval(timer); this._readyState = isSupport ? tronwallet_abstract_adapter_1.WalletReadyState.Found : tronwallet_abstract_adapter_1.WalletReadyState.NotFound; this._updateWallet(); this.emit('readyStateChanged', this.readyState); resolve(isSupport); } }; timer = setInterval(check, interval); check(); }); return this._checkPromise; } setAddress(address) { this._address = address; } setState(state) { const preState = this.state; if (state !== preState) { this._state = state; this.emit('stateChanged', state); } } } exports.OkxWalletAdapter = OkxWalletAdapter; //# sourceMappingURL=adapter.js.map