UNPKG

@unilogin/sdk

Version:

SDK is a JS library, that communicates with relayer. SDK allows managing contract, by creating basic contract-calling messages.

361 lines 20.1 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()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var commons_1 = require("@unilogin/commons"); var contracts_1 = require("@unilogin/contracts"); var ethers_1 = require("ethers"); var SdkConfigDefault_1 = require("../config/SdkConfigDefault"); var AggregateBalanceObserver_1 = require("../core/observers/AggregateBalanceObserver"); var AuthorisationsObserver_1 = __importDefault(require("../core/observers/AuthorisationsObserver")); var BalanceObserver_1 = require("../core/observers/BalanceObserver"); var PriceObserver_1 = require("../core/observers/PriceObserver"); var ExecutionFactory_1 = require("../core/services/ExecutionFactory"); var FeatureFlagsService_1 = require("../core/services/FeatureFlagsService"); var GasModeService_1 = require("../core/services/GasModeService"); var MessageConverter_1 = require("../core/services/MessageConverter"); var TokensDetailsStore_1 = require("../core/services/TokensDetailsStore"); var errors_1 = require("../core/utils/errors"); var ENSService_1 = require("../integration/ethereum/ENSService"); var RelayerApi_1 = require("../integration/http/RelayerApi"); var FutureWalletFactory_1 = require("./FutureWalletFactory"); var WalletEventsObserverFactory_1 = __importDefault(require("../core/observers/WalletEventsObserverFactory")); var BlockNumberState_1 = require("../core/states/BlockNumberState"); var WalletContractService_1 = require("../integration/ethereum/WalletContractService"); var Beta2Service_1 = require("../integration/ethereum/Beta2Service"); var GnosisSafeService_1 = require("../integration/ethereum/GnosisSafeService"); var NotifySdk_1 = require("../integration/notifySdk/NotifySdk"); var sanitizers_1 = require("@restless/sanitizers"); var UniLoginSdk = /** @class */ (function () { function UniLoginSdk(relayerUrl, providerOrUrl, config) { var _this = this; this.provider = typeof (providerOrUrl) === 'string' ? new ethers_1.providers.JsonRpcProvider(providerOrUrl) : providerOrUrl; this.config = commons_1.deepMerge(SdkConfigDefault_1.SdkConfigDefault, config); this.relayerApi = new RelayerApi_1.RelayerApi(relayerUrl, this.config.apiKey); this.authorisationsObserver = new AuthorisationsObserver_1.default(this.relayerApi, this.config.authorizationsObserverTick); this.executionFactory = new ExecutionFactory_1.ExecutionFactory(this.relayerApi, this.config.mineableFactoryTick, this.config.mineableFactoryTimeout); this.blockchainService = new contracts_1.BlockchainService(this.provider); var blockNumberState = new BlockNumberState_1.BlockNumberState(this.blockchainService); this.walletEventsObserverFactory = new WalletEventsObserverFactory_1.default(this.blockchainService, blockNumberState, this.config.storageService); this.balanceChecker = new commons_1.BalanceChecker(this.provider); this.sufficientBalanceValidator = new commons_1.SufficientBalanceValidator(this.provider); this.tokenDetailsService = new commons_1.TokenDetailsService(this.provider, this.config.saiTokenAddress); this.tokensDetailsStore = new TokensDetailsStore_1.TokensDetailsStore(this.tokenDetailsService, this.config.observedTokensAddresses); this.tokenPricesService = new commons_1.TokenPricesService(); this.priceObserver = new PriceObserver_1.PriceObserver(this.tokensDetailsStore, this.tokenPricesService, this.config.priceObserverTick); this.gasPriceOracle = new commons_1.GasPriceOracle(); this.tokensValueConverter = new commons_1.TokensValueConverter(this.config.observedCurrencies); this.gasModeService = new GasModeService_1.GasModeService(this.tokensDetailsStore, this.gasPriceOracle, this.priceObserver); this.featureFlagsService = new FeatureFlagsService_1.FeatureFlagsService(); this.messageConverter = new MessageConverter_1.MessageConverter(this.blockchainService); var beta2Service = new Beta2Service_1.Beta2Service(this.provider); var gnosisSafeService = new GnosisSafeService_1.GnosisSafeService(this.provider); this.walletContractService = new WalletContractService_1.WalletContractService(this.blockchainService, beta2Service, gnosisSafeService); this.relayerConfig = new commons_1.Lazy(function () { return _this.loadRelayerConfigFromApi(); }); } UniLoginSdk.prototype.loadRelayerConfigFromApi = function () { return __awaiter(this, void 0, void 0, function () { var config; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.relayerApi.getConfig()]; case 1: config = _a.sent(); if (!commons_1.Network.equals(sanitizers_1.cast(config.network, commons_1.asNetwork), this.config.network)) { throw new Error("Relayer is configured to a different network. Expected: " + this.config.network + ", got: " + config.network); } return [2 /*return*/, config]; } }); }); }; UniLoginSdk.prototype.getNotice = function () { if (this.config.network === 'mainnet') { return 'This is beta version running on mainnet - do not deposit more than $5 for now'; } return "This is beta version running on " + this.config.network; }; UniLoginSdk.prototype.isRefundPaid = function () { return !!this.config.apiKey; }; UniLoginSdk.prototype.getFutureWalletFactory = function () { this.getRelayerConfig(); this.fetchFutureWalletFactory(); return this.futureWalletFactory; }; UniLoginSdk.prototype.createFutureWallet = function (ensName, gasPrice, gasToken) { return this.getFutureWalletFactory().createNew(ensName, gasPrice, gasToken); }; UniLoginSdk.prototype.getMessageStatus = function (messageHash) { return this.relayerApi.getStatus(messageHash); }; UniLoginSdk.prototype.getRelayerConfig = function () { return this.relayerConfig.get(); }; UniLoginSdk.prototype.fetchRelayerConfig = function () { return this.relayerConfig.load(); }; UniLoginSdk.prototype.fetchBalanceObserver = function (contractAddress) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: if (this.balanceObserver) { return [2 /*return*/]; } commons_1.ensureNotFalsy(contractAddress, errors_1.InvalidContract); return [4 /*yield*/, this.tokensDetailsStore.fetchTokensDetails()]; case 1: _a.sent(); this.balanceObserver = new BalanceObserver_1.BalanceObserver(this.balanceChecker, contractAddress, this.tokensDetailsStore, this.config.balanceObserverTick); return [2 /*return*/]; } }); }); }; UniLoginSdk.prototype.fetchAggregateBalanceObserver = function (contractAddress) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: if (this.aggregateBalanceObserver) { return [2 /*return*/]; } return [4 /*yield*/, this.fetchBalanceObserver(contractAddress)]; case 1: _a.sent(); this.aggregateBalanceObserver = new AggregateBalanceObserver_1.AggregateBalanceObserver(this.balanceObserver, this.priceObserver, this.tokensValueConverter); return [2 /*return*/]; } }); }); }; UniLoginSdk.prototype.fetchFutureWalletFactory = function () { var _a = this.getRelayerConfig(), supportedTokens = _a.supportedTokens, factoryAddress = _a.factoryAddress, contractWhiteList = _a.contractWhiteList, ensAddress = _a.ensAddress, ensRegistrar = _a.ensRegistrar, walletContractAddress = _a.walletContractAddress, relayerAddress = _a.relayerAddress, fallbackHandlerAddress = _a.fallbackHandlerAddress; var futureWalletConfig = { supportedTokens: supportedTokens, factoryAddress: factoryAddress, contractWhiteList: contractWhiteList, ensAddress: ensAddress, walletContractAddress: walletContractAddress, relayerAddress: relayerAddress, fallbackHandlerAddress: fallbackHandlerAddress }; this.futureWalletFactory = this.futureWalletFactory || new FutureWalletFactory_1.FutureWalletFactory(futureWalletConfig, new ENSService_1.ENSService(this.provider, futureWalletConfig.ensAddress, ensRegistrar), this, this.balanceChecker); }; UniLoginSdk.prototype.getWalletContractAddress = function (ensName) { return __awaiter(this, void 0, void 0, function () { var walletContractAddress, _a; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, this.resolveName(ensName)]; case 1: walletContractAddress = _b.sent(); commons_1.ensureNotFalsy(walletContractAddress, errors_1.InvalidENSRecord, ensName); _a = commons_1.ensure; return [4 /*yield*/, this.blockchainService.getCode(walletContractAddress)]; case 2: _a.apply(void 0, [(_b.sent()) !== '0x', errors_1.InvalidENSRecord, ensName]); return [2 /*return*/, walletContractAddress]; } }); }); }; UniLoginSdk.prototype.walletContractExist = function (ensName) { return __awaiter(this, void 0, void 0, function () { var walletContractAddress, _a; return __generator(this, function (_b) { switch (_b.label) { case 0: return [4 /*yield*/, this.resolveName(ensName)]; case 1: walletContractAddress = _b.sent(); _a = walletContractAddress; if (!_a) return [3 /*break*/, 3]; return [4 /*yield*/, this.blockchainService.getCode(walletContractAddress)]; case 2: _a = (_b.sent()); _b.label = 3; case 3: return [2 /*return*/, !!(_a)]; } }); }); }; UniLoginSdk.prototype.resolveName = function (ensName) { return __awaiter(this, void 0, void 0, function () { var ensAddress; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.fetchRelayerConfig()]; case 1: ensAddress = (_a.sent()).ensAddress; return [2 /*return*/, commons_1.resolveName(this.provider, ensAddress, ensName)]; } }); }); }; UniLoginSdk.prototype.connect = function (walletContractAddress) { return __awaiter(this, void 0, void 0, function () { var _a, publicKey, privateKey; return __generator(this, function (_b) { switch (_b.label) { case 0: _a = commons_1.createKeyPair(), publicKey = _a.publicKey, privateKey = _a.privateKey; return [4 /*yield*/, this.relayerApi.connect(walletContractAddress, publicKey, this.config.applicationInfo)]; case 1: _b.sent(); return [2 /*return*/, { privateKey: privateKey, securityCode: commons_1.generateCode(publicKey), }]; } }); }); }; UniLoginSdk.prototype.subscribe = function (eventType, filter, callback) { commons_1.ensure(['KeyAdded', 'KeyRemoved', 'AddedOwner', 'RemovedOwner'].includes(eventType), errors_1.InvalidEvent, eventType); return this.walletEventsObserverFactory.subscribe(eventType, filter, callback); }; UniLoginSdk.prototype.subscribeToBalances = function (contractAddress, callback) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.fetchBalanceObserver(contractAddress)]; case 1: _a.sent(); return [2 /*return*/, this.balanceObserver.subscribe(callback)]; } }); }); }; UniLoginSdk.prototype.subscribeToAggregatedBalance = function (contractAddress, callback) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.fetchAggregateBalanceObserver(contractAddress)]; case 1: _a.sent(); return [2 /*return*/, this.aggregateBalanceObserver.subscribe(callback)]; } }); }); }; UniLoginSdk.prototype.subscribeToPrices = function (callback) { return this.priceObserver.subscribe(callback); }; UniLoginSdk.prototype.subscribeAuthorisations = function (contractAddress, privateKey, callback) { return __awaiter(this, void 0, void 0, function () { var _a, _b; return __generator(this, function (_c) { switch (_c.label) { case 0: _b = (_a = this.authorisationsObserver).subscribe; return [4 /*yield*/, this.walletContractService.signRelayerRequest(privateKey, { contractAddress: contractAddress })]; case 1: return [2 /*return*/, _b.apply(_a, [_c.sent(), function (notifications) { return callback(commons_1.addCodesToNotifications(notifications)); }])]; } }); }); }; UniLoginSdk.prototype.getConnectedDevices = function (contractAddress, privateKey) { return __awaiter(this, void 0, void 0, function () { var _a, _b; return __generator(this, function (_c) { switch (_c.label) { case 0: _b = (_a = this.relayerApi).getConnectedDevices; return [4 /*yield*/, this.walletContractService.signRelayerRequest(privateKey, { contractAddress: contractAddress })]; case 1: return [2 /*return*/, _b.apply(_a, [_c.sent()])]; } }); }); }; UniLoginSdk.prototype.getGasModes = function () { return this.gasModeService.getModes(); }; UniLoginSdk.prototype.getNotifySdk = function () { if (!this.notifySdk) { var relayerConfig = this.getRelayerConfig(); this.notifySdk = NotifySdk_1.NotifySdk.createForNetwork(this.config.notifySdkApiKey, sanitizers_1.cast(relayerConfig.network, commons_1.asNetwork)); } return this.notifySdk; }; UniLoginSdk.prototype.start = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, Promise.all([ this.fetchRelayerConfig(), this.startBlockchainServices(), ])]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; UniLoginSdk.prototype.startBlockchainServices = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.walletEventsObserverFactory.start()]; case 1: _a.sent(); return [4 /*yield*/, this.tokensDetailsStore.fetchTokensDetails()]; case 2: _a.sent(); return [2 /*return*/]; } }); }); }; UniLoginSdk.prototype.stop = function () { this.walletEventsObserverFactory.stop(); }; UniLoginSdk.prototype.finalizeAndStop = function () { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { switch (_a.label) { case 0: return [4 /*yield*/, this.walletEventsObserverFactory.finalizeAndStop()]; case 1: _a.sent(); return [2 /*return*/]; } }); }); }; return UniLoginSdk; }()); exports.default = UniLoginSdk; //# sourceMappingURL=sdk.js.map