UNPKG

@digitalbits-blockchain/xdb-digitalbits-sdk

Version:

@digitalbits-blockchain/xdb-digitalbits-sdk is a library for working with the DigitalBits Frontier server.

382 lines 21.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Server = exports.SUBMIT_TRANSACTION_TIMEOUT = void 0; var tslib_1 = require("tslib"); var bignumber_js_1 = tslib_1.__importDefault(require("bignumber.js")); var isEmpty_1 = tslib_1.__importDefault(require("lodash/isEmpty")); var merge_1 = tslib_1.__importDefault(require("lodash/merge")); var xdb_digitalbits_base_1 = require("@digitalbits-blockchain/xdb-digitalbits-base"); var urijs_1 = tslib_1.__importDefault(require("urijs")); var call_builder_1 = require("./call_builder"); var config_1 = require("./config"); var errors_1 = require("./errors"); var account_call_builder_1 = require("./account_call_builder"); var account_response_1 = require("./account_response"); var assets_call_builder_1 = require("./assets_call_builder"); var claimable_balances_call_builder_1 = require("./claimable_balances_call_builder"); var effect_call_builder_1 = require("./effect_call_builder"); var friendbot_builder_1 = require("./friendbot_builder"); var ledger_call_builder_1 = require("./ledger_call_builder"); var liquidity_pool_call_builder_1 = require("./liquidity_pool_call_builder"); var offer_call_builder_1 = require("./offer_call_builder"); var operation_call_builder_1 = require("./operation_call_builder"); var orderbook_call_builder_1 = require("./orderbook_call_builder"); var payment_call_builder_1 = require("./payment_call_builder"); var strict_receive_path_call_builder_1 = require("./strict_receive_path_call_builder"); var strict_send_path_call_builder_1 = require("./strict_send_path_call_builder"); var trade_aggregation_call_builder_1 = require("./trade_aggregation_call_builder"); var trades_call_builder_1 = require("./trades_call_builder"); var transaction_call_builder_1 = require("./transaction_call_builder"); var frontier_axios_client_1 = tslib_1.__importStar(require("./frontier_axios_client")); exports.SUBMIT_TRANSACTION_TIMEOUT = 60 * 1000; var NIBBS_IN_DIGITALBITS = 10000000; var ACCOUNT_REQUIRES_MEMO = "MQ=="; function _getAmountInNibbs(amt) { return new bignumber_js_1.default(amt).div(NIBBS_IN_DIGITALBITS).toString(); } var Server = (function () { function Server(serverURL, opts) { if (opts === void 0) { opts = {}; } this.serverURL = urijs_1.default(serverURL); var allowHttp = typeof opts.allowHttp === "undefined" ? config_1.Config.isAllowHttp() : opts.allowHttp; var customHeaders = {}; if (opts.appName) { customHeaders["X-App-Name"] = opts.appName; } if (opts.appVersion) { customHeaders["X-App-Version"] = opts.appVersion; } if (!isEmpty_1.default(customHeaders)) { frontier_axios_client_1.default.interceptors.request.use(function (config) { config.headers = merge_1.default(customHeaders, config.headers); return config; }); } if (this.serverURL.protocol() !== "https" && !allowHttp) { throw new Error("Cannot connect to insecure frontier server"); } } Server.prototype.fetchTimebounds = function (seconds, _isRetry) { if (_isRetry === void 0) { _isRetry = false; } return tslib_1.__awaiter(this, void 0, void 0, function () { var currentTime; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: currentTime = frontier_axios_client_1.getCurrentServerTime(this.serverURL.hostname()); if (currentTime) { return [2, { minTime: 0, maxTime: currentTime + seconds, }]; } if (_isRetry) { return [2, { minTime: 0, maxTime: Math.floor(new Date().getTime() / 1000) + seconds, }]; } return [4, frontier_axios_client_1.default.get(urijs_1.default(this.serverURL).toString())]; case 1: _a.sent(); return [4, this.fetchTimebounds(seconds, true)]; case 2: return [2, _a.sent()]; } }); }); }; Server.prototype.fetchBaseFee = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var response; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4, this.feeStats()]; case 1: response = _a.sent(); return [2, parseInt(response.last_ledger_base_fee, 10) || 100]; } }); }); }; Server.prototype.feeStats = function () { return tslib_1.__awaiter(this, void 0, void 0, function () { var cb; return tslib_1.__generator(this, function (_a) { cb = new call_builder_1.CallBuilder(urijs_1.default(this.serverURL)); cb.filter.push(["fee_stats"]); return [2, cb.call()]; }); }); }; Server.prototype.submitTransaction = function (transaction, opts) { if (opts === void 0) { opts = { skipMemoRequiredCheck: false }; } return tslib_1.__awaiter(this, void 0, void 0, function () { var tx; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (!!opts.skipMemoRequiredCheck) return [3, 2]; return [4, this.checkMemoRequired(transaction)]; case 1: _a.sent(); _a.label = 2; case 2: tx = encodeURIComponent(transaction .toEnvelope() .toXDR() .toString("base64")); return [2, frontier_axios_client_1.default.post(urijs_1.default(this.serverURL) .segment("transactions") .toString(), "tx=" + tx, { timeout: exports.SUBMIT_TRANSACTION_TIMEOUT }) .then(function (response) { if (!response.data.result_xdr) { return response.data; } var responseXDR = xdb_digitalbits_base_1.xdr.TransactionResult .fromXDR(response.data.result_xdr, "base64"); var results = responseXDR.result().value(); var offerResults; var hasManageOffer; if (results.length) { offerResults = results .map(function (result, i) { if (result.value().switch().name !== "manageBuyOffer" && result.value().switch().name !== "manageSellOffer") { return null; } hasManageOffer = true; var amountBought = new bignumber_js_1.default(0); var amountSold = new bignumber_js_1.default(0); var offerSuccess = result .value() .value() .success(); var offersClaimed = offerSuccess .offersClaimed() .map(function (offerClaimedAtom) { var offerClaimed = offerClaimedAtom.value(); var sellerId = ""; switch (offerClaimedAtom.switch()) { case xdb_digitalbits_base_1.xdr.ClaimAtomType.claimAtomTypeV0(): sellerId = xdb_digitalbits_base_1.StrKey.encodeEd25519PublicKey(offerClaimed.sellerEd25519()); break; case xdb_digitalbits_base_1.xdr.ClaimAtomType.claimAtomTypeOrderBook(): sellerId = xdb_digitalbits_base_1.StrKey.encodeEd25519PublicKey(offerClaimed.sellerId().ed25519()); break; default: throw new Error("Invalid offer result type: " + offerClaimedAtom.switch()); } var claimedOfferAmountBought = new bignumber_js_1.default(offerClaimed.amountBought().toString()); var claimedOfferAmountSold = new bignumber_js_1.default(offerClaimed.amountSold().toString()); amountBought = amountBought.add(claimedOfferAmountSold); amountSold = amountSold.add(claimedOfferAmountBought); var sold = xdb_digitalbits_base_1.Asset.fromOperation(offerClaimed.assetSold()); var bought = xdb_digitalbits_base_1.Asset.fromOperation(offerClaimed.assetBought()); var assetSold = { type: sold.getAssetType(), assetCode: sold.getCode(), issuer: sold.getIssuer(), }; var assetBought = { type: bought.getAssetType(), assetCode: bought.getCode(), issuer: bought.getIssuer(), }; return { sellerId: sellerId, offerId: offerClaimed.offerId().toString(), assetSold: assetSold, amountSold: _getAmountInNibbs(claimedOfferAmountSold), assetBought: assetBought, amountBought: _getAmountInNibbs(claimedOfferAmountBought), }; }); var effect = offerSuccess.offer().switch().name; var currentOffer; if (typeof offerSuccess.offer().value === "function" && offerSuccess.offer().value()) { var offerXDR = offerSuccess.offer().value(); currentOffer = { offerId: offerXDR.offerId().toString(), selling: {}, buying: {}, amount: _getAmountInNibbs(offerXDR.amount().toString()), price: { n: offerXDR.price().n(), d: offerXDR.price().d(), }, }; var selling = xdb_digitalbits_base_1.Asset.fromOperation(offerXDR.selling()); currentOffer.selling = { type: selling.getAssetType(), assetCode: selling.getCode(), issuer: selling.getIssuer(), }; var buying = xdb_digitalbits_base_1.Asset.fromOperation(offerXDR.buying()); currentOffer.buying = { type: buying.getAssetType(), assetCode: buying.getCode(), issuer: buying.getIssuer(), }; } return { offersClaimed: offersClaimed, effect: effect, operationIndex: i, currentOffer: currentOffer, amountBought: _getAmountInNibbs(amountBought), amountSold: _getAmountInNibbs(amountSold), isFullyOpen: !offersClaimed.length && effect !== "manageOfferDeleted", wasPartiallyFilled: !!offersClaimed.length && effect !== "manageOfferDeleted", wasImmediatelyFilled: !!offersClaimed.length && effect === "manageOfferDeleted", wasImmediatelyDeleted: !offersClaimed.length && effect === "manageOfferDeleted", }; }) .filter(function (result) { return !!result; }); } return Object.assign({}, response.data, { offerResults: hasManageOffer ? offerResults : undefined, }); }) .catch(function (response) { if (response instanceof Error) { return Promise.reject(response); } return Promise.reject(new errors_1.BadResponseError("Transaction submission failed. Server responded: " + response.status + " " + response.statusText, response.data)); })]; } }); }); }; Server.prototype.accounts = function () { return new account_call_builder_1.AccountCallBuilder(urijs_1.default(this.serverURL)); }; Server.prototype.claimableBalances = function () { return new claimable_balances_call_builder_1.ClaimableBalanceCallBuilder(urijs_1.default(this.serverURL)); }; Server.prototype.ledgers = function () { return new ledger_call_builder_1.LedgerCallBuilder(urijs_1.default(this.serverURL)); }; Server.prototype.transactions = function () { return new transaction_call_builder_1.TransactionCallBuilder(urijs_1.default(this.serverURL)); }; Server.prototype.offers = function () { return new offer_call_builder_1.OfferCallBuilder(urijs_1.default(this.serverURL)); }; Server.prototype.orderbook = function (selling, buying) { return new orderbook_call_builder_1.OrderbookCallBuilder(urijs_1.default(this.serverURL), selling, buying); }; Server.prototype.trades = function () { return new trades_call_builder_1.TradesCallBuilder(urijs_1.default(this.serverURL)); }; Server.prototype.operations = function () { return new operation_call_builder_1.OperationCallBuilder(urijs_1.default(this.serverURL)); }; Server.prototype.liquidityPools = function () { return new liquidity_pool_call_builder_1.LiquidityPoolCallBuilder(urijs_1.default(this.serverURL)); }; Server.prototype.strictReceivePaths = function (source, destinationAsset, destinationAmount) { return new strict_receive_path_call_builder_1.StrictReceivePathCallBuilder(urijs_1.default(this.serverURL), source, destinationAsset, destinationAmount); }; Server.prototype.strictSendPaths = function (sourceAsset, sourceAmount, destination) { return new strict_send_path_call_builder_1.StrictSendPathCallBuilder(urijs_1.default(this.serverURL), sourceAsset, sourceAmount, destination); }; Server.prototype.payments = function () { return new payment_call_builder_1.PaymentCallBuilder(urijs_1.default(this.serverURL)); }; Server.prototype.effects = function () { return new effect_call_builder_1.EffectCallBuilder(urijs_1.default(this.serverURL)); }; Server.prototype.friendbot = function (address) { return new friendbot_builder_1.FriendbotBuilder(urijs_1.default(this.serverURL), address); }; Server.prototype.assets = function () { return new assets_call_builder_1.AssetsCallBuilder(urijs_1.default(this.serverURL)); }; Server.prototype.loadAccount = function (accountId) { return tslib_1.__awaiter(this, void 0, void 0, function () { var res; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: return [4, this.accounts() .accountId(accountId) .call()]; case 1: res = _a.sent(); return [2, new account_response_1.AccountResponse(res)]; } }); }); }; Server.prototype.tradeAggregation = function (base, counter, start_time, end_time, resolution, offset) { return new trade_aggregation_call_builder_1.TradeAggregationCallBuilder(urijs_1.default(this.serverURL), base, counter, start_time, end_time, resolution, offset); }; Server.prototype.checkMemoRequired = function (transaction) { return tslib_1.__awaiter(this, void 0, void 0, function () { var destinations, i, operation, destination, account, e_1; return tslib_1.__generator(this, function (_a) { switch (_a.label) { case 0: if (transaction instanceof xdb_digitalbits_base_1.FeeBumpTransaction) { transaction = transaction.innerTransaction; } if (transaction.memo.type !== "none") { return [2]; } destinations = new Set(); i = 0; _a.label = 1; case 1: if (!(i < transaction.operations.length)) return [3, 6]; operation = transaction.operations[i]; switch (operation.type) { case "payment": case "pathPaymentStrictReceive": case "pathPaymentStrictSend": case "accountMerge": break; default: return [3, 5]; } destination = operation.destination; if (destinations.has(destination)) { return [3, 5]; } destinations.add(destination); if (destination.startsWith("M")) { return [3, 5]; } _a.label = 2; case 2: _a.trys.push([2, 4, , 5]); return [4, this.loadAccount(destination)]; case 3: account = _a.sent(); if (account.data_attr["config.memo_required"] === ACCOUNT_REQUIRES_MEMO) { throw new errors_1.AccountRequiresMemoError("account requires memo", destination, i); } return [3, 5]; case 4: e_1 = _a.sent(); if (e_1 instanceof errors_1.AccountRequiresMemoError) { throw e_1; } if (!(e_1 instanceof errors_1.NotFoundError)) { throw e_1; } return [3, 5]; case 5: i++; return [3, 1]; case 6: return [2]; } }); }); }; return Server; }()); exports.Server = Server; //# sourceMappingURL=server.js.map