UNPKG

web3-wallets-kit

Version:

Package for connecting with Ethereum wallets for dApp

158 lines 7.58 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var web3_1 = tslib_1.__importDefault(require("web3")); var rxjs_1 = require("rxjs"); var operators_1 = require("rxjs/operators"); var core_decorators_1 = require("core-decorators"); var resolvers_1 = require("./resolvers"); var storage_1 = require("./storage"); var defaultOptions = { network: 'mainnet', autoConnectToPreviousWallet: true, }; var Web3WalletsManager = /** @class */ (function () { function Web3WalletsManager(options) { this.txWeb3 = new rxjs_1.BehaviorSubject(null); // public gsnWeb3 = new BehaviorSubject<Web3 | null>(null); this.account = new rxjs_1.BehaviorSubject(null); this.wallet = new rxjs_1.BehaviorSubject(null); this.status = new rxjs_1.BehaviorSubject('disconnected'); this.storage = new storage_1.LocalStorage(); this.connectionDetails = null; this.accountSubscription = null; this.options = tslib_1.__assign(tslib_1.__assign({}, defaultOptions), options); this.checkOptions(); this.web3 = this.getWeb3(); var connectedWallet = this.storage.get('__web3wm_connectedWallet__'); this.options.autoConnectToPreviousWallet && connectedWallet && this.connect(connectedWallet); } Web3WalletsManager.prototype.connect = function (wallet) { return tslib_1.__awaiter(this, void 0, void 0, function () { var resolver, config, connectionDetails, web3_2, account, error_1; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.disconnect()]; case 1: _a.sent(); _a.label = 2; case 2: _a.trys.push([2, 5, , 6]); this.status.next('pending'); resolver = resolvers_1.resolvers[wallet]; config = this.options.walletConfigs[wallet]; return [4 /*yield*/, resolver.initialize(config)]; case 3: connectionDetails = _a.sent(); web3_2 = new web3_1.default(connectionDetails.provider); return [4 /*yield*/, getAccount(web3_2)]; case 4: account = _a.sent(); this.storage.set('__web3wm_connectedWallet__', connectionDetails.wallet); this.wallet.next(connectionDetails.wallet); this.connectionDetails = connectionDetails; this.txWeb3.next(web3_2); this.account.next(account); this.accountSubscription = rxjs_1.interval(1000) .pipe(operators_1.switchMap(function () { return getAccount(web3_2); })) .subscribe(this.account); this.status.next('connected'); return [2 /*return*/, { web3: web3_2, account: account }]; case 5: error_1 = _a.sent(); this.resetState(); throw error_1; case 6: return [2 /*return*/]; } }); }); }; Web3WalletsManager.prototype.disconnect = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var resolver; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, , 3, 4]); this.accountSubscription && this.accountSubscription.unsubscribe(); if (!this.connectionDetails) return [3 /*break*/, 2]; resolver = resolvers_1.resolvers[this.connectionDetails.wallet]; return [4 /*yield*/, resolver.destroy(this.connectionDetails)]; case 1: _a.sent(); _a.label = 2; case 2: return [3 /*break*/, 4]; case 3: this.resetState(); return [7 /*endfinally*/]; case 4: return [2 /*return*/]; } }); }); }; Web3WalletsManager.prototype.getAccount = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var web3; return tslib_1.__generator(this, function (_a) { web3 = this.txWeb3.getValue(); if (!web3) { throw new Error('Web3 instance is not found, you need to connect wallet before account getting'); } return [2 /*return*/, getAccount(web3)]; }); }); }; Web3WalletsManager.prototype.resetState = function () { this.connectionDetails = null; this.txWeb3.next(null); this.account.next(null); this.wallet.next(null); this.status.next('disconnected'); this.storage.remove('__web3wm_connectedWallet__'); }; Web3WalletsManager.prototype.checkOptions = function () { var _a = this.options, httpRpcUrl = _a.httpRpcUrl, wsRpcUrl = _a.wsRpcUrl, infuraAccessToken = _a.infuraAccessToken; if (!httpRpcUrl && !wsRpcUrl && !infuraAccessToken) { console.error('You need to configure one of these parameters: "httpRpcUrl", "wsRpcUrl" or "infuraAccessToken".'); } }; Web3WalletsManager.prototype.getWeb3 = function () { var _a = this.options, httpRpcUrl = _a.httpRpcUrl, wsRpcUrl = _a.wsRpcUrl, infuraAccessToken = _a.infuraAccessToken; var network = this.options.network || 'mainnet'; var provider = (wsRpcUrl && new web3_1.default.providers.WebsocketProvider(wsRpcUrl)) || (httpRpcUrl && new web3_1.default.providers.HttpProvider(httpRpcUrl)) || new web3_1.default.providers.WebsocketProvider("wss://" + network + ".infura.io/ws/v3/" + infuraAccessToken); return new web3_1.default(provider); }; tslib_1.__decorate([ core_decorators_1.autobind, tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", [String]), tslib_1.__metadata("design:returntype", Promise) ], Web3WalletsManager.prototype, "connect", null); tslib_1.__decorate([ core_decorators_1.autobind, tslib_1.__metadata("design:type", Function), tslib_1.__metadata("design:paramtypes", []), tslib_1.__metadata("design:returntype", Promise) ], Web3WalletsManager.prototype, "disconnect", null); return Web3WalletsManager; }()); exports.Web3WalletsManager = Web3WalletsManager; function getAccount(web3) { return tslib_1.__awaiter(this, void 0, void 0, function () { var accounts; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, web3.eth.getAccounts()]; case 1: accounts = _a.sent(); if (!accounts[0]) { throw new Error('No Ethereum accounts found, you need to create an account in your wallet'); } return [2 /*return*/, accounts[0]]; } }); }); } //# sourceMappingURL=index.js.map