web3-wallets-kit
Version:
Package for connecting with Ethereum wallets for dApp
158 lines • 7.58 kB
JavaScript
"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