@tronweb3/tronwallet-adapter-gatewallet
Version:
Wallet adapter for Gate Wallet app and extension.
340 lines • 15.9 kB
JavaScript
"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.GateWalletAdapter = exports.GateWalletAdapterName = 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.GateWalletAdapterName = 'Gate Wallet';
class GateWalletAdapter extends tronwallet_abstract_adapter_1.Adapter {
constructor(config = {}) {
super();
this.name = exports.GateWalletAdapterName;
this.url = 'https://gate.io';
this.icon = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNDAiIGhlaWdodD0iNDAiIHZpZXdCb3g9IjAgMCA0MCA0MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPG1hc2sgaWQ9Im1hc2swXzQ1ODJfNzgxIiBzdHlsZT0ibWFzay10eXBlOmFscGhhIiBtYXNrVW5pdHM9InVzZXJTcGFjZU9uVXNlIiB4PSIwIiB5PSIwIiB3aWR0aD0iNDAiIGhlaWdodD0iNDAiPgo8cGF0aCBkPSJNMCA4QzAgMy41ODE3MiAzLjU4MTcyIDAgOCAwSDMyQzM2LjQxODMgMCA0MCAzLjU4MTcyIDQwIDhWMzJDNDAgMzYuNDE4MyAzNi40MTgzIDQwIDMyIDQwSDhDMy41ODE3MiA0MCAwIDM2LjQxODMgMCAzMlY4WiIgZmlsbD0id2hpdGUiLz4KPC9tYXNrPgo8ZyBtYXNrPSJ1cmwoI21hc2swXzQ1ODJfNzgxKSI+CjxwYXRoIGQ9Ik0wIDhDMCAzLjU4MTcyIDMuNTgxNzIgMCA4IDBIMzJDMzYuNDE4MyAwIDQwIDMuNTgxNzIgNDAgOFYzMkM0MCAzNi40MTgzIDM2LjQxODMgNDAgMzIgNDBIOEMzLjU4MTcyIDQwIDAgMzYuNDE4MyAwIDMyVjhaIiBmaWxsPSIjMDA1MUQyIi8+CjwvZz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0zNSAyMEMzNSAyOC4yODQzIDI4LjI4NDMgMzUgMjAgMzVDMTEuNzE1NyAzNSA1IDI4LjI4NDMgNSAyMEM1IDExLjcxNTcgMTEuNzE1NyA1IDIwIDVWMTIuMDU4N0MyMCAxMi4wNTg3IDE5Ljk5OTkgMTIuMDU4NyAxOS45OTk5IDEyLjA1ODdDMTUuNjE0MSAxMi4wNTg3IDEyLjA1ODcgMTUuNjE0MSAxMi4wNTg3IDE5Ljk5OTlDMTIuMDU4NyAyNC4zODU3IDE1LjYxNDEgMjcuOTQxMSAxOS45OTk5IDI3Ljk0MTFDMjQuMzg1NiAyNy45NDExIDI3Ljk0MSAyNC4zODU3IDI3Ljk0MTEgMjBIMzVaIiBmaWxsPSJ3aGl0ZSIvPgo8cmVjdCB4PSIyMCIgeT0iMTIuMDU4NiIgd2lkdGg9IjcuOTQxMTgiIGhlaWdodD0iNy45NDExOCIgZmlsbD0iIzE0RTBBMSIvPgo8L3N2Zz4K';
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.onGateAccountChange = (res) => {
setTimeout(() => {
const preAddr = this.address || '';
if (res.length !== 0) {
const address = res[0];
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);
};
this._checkPromise = null;
this._updateWallet = () => {
var _a, _b;
let state = this.state;
let address = this.address;
if ((0, utils_js_1.supportGateWallet)()) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
this._wallet = utils_js_1.isGateApp ? window.gatewallet.tronLink : window.gatewallet.tron;
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;
const ready = utils_js_1.isGateApp
? this._wallet.ready
: this._wallet.tronWeb.ready;
state = 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('[GateWalletAdapter] 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.supportGateWallet)()) {
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 GateWallet.
* @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.checkIfOpenGateWallet();
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;
let res;
try {
const method = utils_js_1.isGateApp ? 'tron_requestAccounts' : 'eth_requestAccounts';
res = yield wallet.request({ method });
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 GateWallet, 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 = (utils_js_1.isGateApp ? (_a = wallet.tronWeb.defaultAddress) === null || _a === void 0 ? void 0 : _a.base58 : res[0]) || '';
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.checkIfOpenGateWallet();
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();
if (utils_js_1.isGateApp)
return;
this._wallet.on('accountsChanged', this.onGateAccountChange);
}
_stopListenEvent() {
if (utils_js_1.isGateApp)
return;
this._wallet.off('accountsChanged', this.onGateAccountChange);
}
checkIfOpenGateWallet() {
if (this.config.openAppWithDeeplink === false) {
return;
}
if ((0, utils_js_1.openGateWallet)()) {
throw new tronwallet_abstract_adapter_1.WalletNotFoundError();
}
}
/**
* check if wallet exists by interval, the promise only resolve when wallet detected or timeout
* @returns if GateWallet 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.supportGateWallet)();
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.GateWalletAdapter = GateWalletAdapter;
//# sourceMappingURL=adapter.js.map