eulith-web3js-core
Version:
Eulith core web3js SDK (code to access Eulith services via web3js)
169 lines • 22.3 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
__setModuleDefault(result, mod);
return result;
};
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 __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.Utils = void 0;
const web3_1 = __importDefault(require("web3"));
const Eulith = __importStar(require("../src/index"));
var Utils;
(function (Utils) {
/**
* note, unless you explicitly pass throwOnFailure: false, this will throw an error if the transaction fails
* for any reason, making it easy to handle errors with successive transactions - just await and outer
* try/catch
*/
function waitForTxReceipt({ logger, web3, provider, txHash, timeoutInMS, throwOnFailure }) {
return __awaiter(this, void 0, void 0, function* () {
const delay = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
const timeOutAt = Date.now() + (timeoutInMS !== null && timeoutInMS !== void 0 ? timeoutInMS : 30 * 1000);
if (web3 === undefined) {
if (provider === undefined) {
throw new Error("At least one of web3 or provider needed for waitForTxReceipt");
}
web3 = new Eulith.Web3({ provider });
}
while (Date.now() < timeOutAt) {
const txReceipt = yield web3.eth.getTransactionReceipt(txHash);
if (txReceipt == null) {
yield delay(1 * 1000); // don't busy wait, but maybe could use more configurable polling?
}
else {
if (!txReceipt.status) {
if (throwOnFailure !== false) {
throw new Error("Transaction failed");
}
}
return txReceipt;
}
}
Eulith.Exceptions.Timeout.Throw(logger, {
message: "Eulith.Utils.waitForTxReceipt timed out waiting for txReceipt"
});
});
}
Utils.waitForTxReceipt = waitForTxReceipt;
/**
* Based on https://github.com/ethereum/web3.py/blob/master/web3/_utils/transactions.py#L100 because
* python client used this
*
* But - with several changes, and maxFeePerGas/maxPriorityFeePerGas NYI
*
* NOTE: This requires the transaction.from (sender) field to be set properly, since it is required for most/
* many operations.
*
* NOTE: CONSIDER deprecating this API, in favor of UnsignedTransaction instance method canonicalize()
*/
function fillTransactionDefaults(transaction, provider, logger) {
return __awaiter(this, void 0, void 0, function* () {
// @todo Based on python library code: reference while deciding if this works adequately (probably OK but for estiate gas stuff - discuss with team)
// TRANSACTION_DEFAULTS = {
// "value": 0,
// "data": b"",
// "gas": lambda w3, tx: w3.eth.estimate_gas(tx),
// "gasPrice": lambda w3, tx: w3.eth.generate_gas_price(tx),
// "maxFeePerGas": (
// lambda w3, tx: w3.eth.max_priority_fee
// + (2 * w3.eth.get_block("latest")["baseFeePerGas"])
// ),
// "maxPriorityFeePerGas": lambda w3, tx: w3.eth.max_priority_fee,
// "chainId": lambda w3, tx: w3.eth.chain_id,
// }
if (transaction.from == null) {
throw new Error("Eulith.Utils.fillTransactionDefaults requires the from (aka sender) field to be set");
}
transaction = Object.assign({}, transaction); // clone before changing (too costly to check if need to clone)
if (!transaction.value) {
transaction.value = 0;
}
if (!transaction.gas) {
if (transaction.data == null) {
transaction.gas = 21000; // simple transfers always 21000 (@todo add SOURCE for this logic)
}
else if (provider != null) {
const useProvider = Eulith.Provider.ProviderOrWeb3(provider);
const web3 = new Eulith.Web3({ provider: useProvider });
try {
transaction.gas = yield web3.eth.estimateGas(transaction);
}
catch (e) {
// @todo LOG
}
}
}
if (!transaction.gasPrice && provider) {
const useProvider = Eulith.Provider.ProviderOrWeb3(provider);
const web3 = new Eulith.Web3({ provider: useProvider });
transaction.gasPrice = web3_1.default.utils.toNumber(yield web3.eth.getGasPrice());
}
if (!transaction.gas) {
if (logger) {
let reason = "";
if (provider == null) {
reason = "no web3 argument specified";
}
else {
reason = "web3.eth.estimateGas failed";
}
logger.log(Eulith.Logging.LogLevel.WARNING, `Unable to automatically compute gas value for tx ${JSON.stringify(transaction)}: reason: ${reason}`);
}
}
if (!transaction.maxFeePerGas && provider) {
// @todo but dont know how right now and doesn't seem critical
// transaction.maxFeePerGas = w3.eth.;
// maxFeePerGas:"0x23b11bc04"
}
if (!transaction.maxPriorityFeePerGas && provider) {
// @todo but dont know how right now and doesn't seem critical
// transaction.maxPriorityFeePerGas = w3.eth.max_priority_fee
// maxPriorityFeePerGas:"0x9502F900",
}
if (!transaction.chainId && provider) {
const useProvider = Eulith.Provider.ProviderOrWeb3(provider);
const web3 = new Eulith.Web3({ provider: useProvider });
transaction.chainId = yield web3.eth.getChainId();
}
if (transaction.from && !transaction.nonce && provider) {
const useProvider = Eulith.Provider.ProviderOrWeb3(provider);
const web3 = new Eulith.Web3({ provider: useProvider });
// If nonce is missing, the current value to use is the current transaction count from the chain
transaction.nonce = yield web3.eth.getTransactionCount(transaction.from.toString(), "pending");
}
return transaction;
});
}
Utils.fillTransactionDefaults = fillTransactionDefaults;
})(Utils = exports.Utils || (exports.Utils = {}));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxnREFBd0I7QUFHeEIscURBQXVDO0FBRXZDLElBQWMsS0FBSyxDQTBJbEI7QUExSUQsV0FBYyxLQUFLO0lBQ2Y7Ozs7T0FJRztJQUNILFNBQXNCLGdCQUFnQixDQUFDLEVBQ25DLE1BQU0sRUFDTixJQUFJLEVBQ0osUUFBUSxFQUNSLE1BQU0sRUFDTixXQUFXLEVBQ1gsY0FBYyxFQVFqQjs7WUFDRyxNQUFNLEtBQUssR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxXQUFXLGFBQVgsV0FBVyxjQUFYLFdBQVcsR0FBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUM7WUFDMUQsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO2dCQUNwQixJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7b0JBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsOERBQThELENBQUMsQ0FBQztpQkFDbkY7Z0JBQ0QsSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUM7YUFDeEM7WUFDRCxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxTQUFTLEVBQUU7Z0JBQzNCLE1BQU0sU0FBUyxHQUF1QixNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25GLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtvQkFDbkIsTUFBTSxLQUFLLENBQUMs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T0FBTyxXQUFXLENBQUM7UUFDdkIsQ0FBQztLQUFBO0lBL0VxQiw2QkFBdUIsMEJBK0U1QyxDQUFBO0FBQ0wsQ0FBQyxFQTFJYSxLQUFLLEdBQUwsYUFBSyxLQUFMLGFBQUssUUEwSWxCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFdlYjMgZnJvbSBcIndlYjNcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29uZmlnLCBUcmFuc2FjdGlvblJlY2VpcHQgfSBmcm9tIFwid2ViMy1ldGhcIjtcblxuaW1wb3J0ICogYXMgRXVsaXRoIGZyb20gXCIuLi9zcmMvaW5kZXhcIjtcblxuZXhwb3J0IG1vZHVsZSBVdGlscyB7XG4gICAgLyoqXG4gICAgICogIG5vdGUsIHVubGVzcyB5b3UgZXhwbGljaXRseSBwYXNzIHRocm93T25GYWlsdXJlOiBmYWxzZSwgdGhpcyB3aWxsIHRocm93IGFuIGVycm9yIGlmIHRoZSB0cmFuc2FjdGlvbiBmYWlsc1xuICAgICAqICBmb3IgYW55IHJlYXNvbiwgbWFraW5nIGl0IGVhc3kgdG8gaGFuZGxlIGVycm9ycyB3aXRoIHN1Y2Nlc3NpdmUgdHJhbnNhY3Rpb25zIC0ganVzdCBhd2FpdCBhbmQgb3V0ZXJcbiAgICAgKiAgdHJ5L2NhdGNoXG4gICAgICovXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JUeFJlY2VpcHQoe1xuICAgICAgICBsb2dnZXIsXG4gICAgICAgIHdlYjMsXG4gICAgICAgIHByb3ZpZGVyLFxuICAgICAgICB0eEhhc2gsXG4gICAgICAgIHRpbWVvdXRJbk1TLFxuICAgICAgICB0aHJvd09uRmFpbHVyZVxuICAgIH06IHtcbiAgICAgICAgd2ViMz86IFdlYjM7XG4gICAgICAgIHByb3ZpZGVyPzogRXVsaXRoLlByb3ZpZGVyO1xuICAgICAgICB0eEhhc2g6IHN0cmluZztcbiAgICAgICAgdGltZW91dEluTVM/OiBudW1iZXI7XG4gICAgICAgIGxvZ2dlcj86IEV1bGl0aC5Mb2dnaW5nLklMb2dnZXI7XG4gICAgICAgIHRocm93T25GYWlsdXJlPzogYm9vbGVhbjtcbiAgICB9KTogUHJvbWlzZTxUcmFuc2FjdGlvblJlY2VpcHQ+IHtcbiAgICAgICAgY29uc3QgZGVsYXkgPSAobXMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG4gICAgICAgIGNvbnN0IHRpbWVPdXRBdCA9IERhdGUubm93KCkgKyAodGltZW91dEluTVMgPz8gMzAgKiAxMDAwKTtcbiAgICAgICAgaWYgKHdlYjMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHByb3ZpZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBdCBsZWFzdCBvbmUgb2Ygd2ViMyBvciBwcm92aWRlciBuZWVkZWQgZm9yIHdhaXRGb3JUeFJlY2VpcHRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3ZWIzID0gbmV3IEV1bGl0aC5XZWIzKHsgcHJvdmlkZXIgfSk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKERhdGUubm93KCkgPCB0aW1lT3V0QXQpIHtcbiAgICAgICAgICAgIGNvbnN0IHR4UmVjZWlwdDogVHJhbnNhY3Rpb25SZWNlaXB0ID0gYXdhaXQgd2ViMy5ldGguZ2V0VHJhbnNhY3Rpb25SZWNlaXB0KHR4SGFzaCk7XG4gICAgICAgICAgICBpZiAodHhSZWNlaXB0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBkZWxheSgxICogMTAwMCk7IC8vIGRvbid0IGJ1c3kgd2FpdCwgYnV0IG1heWJlIGNvdWxkIHVzZSBtb3JlIGNvbmZpZ3VyYWJsZSBwb2xsaW5nP1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIXR4UmVjZWlwdC5zdGF0dXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRocm93T25GYWlsdXJlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVHJhbnNhY3Rpb24gZmFpbGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0eFJlY2VpcHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgRXVsaXRoLkV4Y2VwdGlvbnMuVGltZW91dC5UaHJvdyhsb2dnZXIsIHtcbiAgICAgICAgICAgIG1lc3NhZ2U6IFwiRXVsaXRoLlV0aWxzLndhaXRGb3JUeFJlY2VpcHQgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHR4UmVjZWlwdFwiXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqICBCYXNlZCBvbiBodHRwczovL2dpdGh1Yi5jb20vZXRoZXJldW0vd2ViMy5weS9ibG9iL21hc3Rlci93ZWIzL191dGlscy90cmFuc2FjdGlvbnMucHkjTDEwMCBiZWNhdXNlXG4gICAgICogIHB5dGhvbiBjbGllbnQgdXNlZCB0aGlzXG4gICAgICpcbiAgICAgKiAgQnV0IC0gd2l0aCBzZXZlcmFsIGNoYW5nZXMsIGFuZCBtYXhGZWVQZXJHYXMvbWF4UHJpb3JpdHlGZWVQZXJHYXMgTllJXG4gICAgICpcbiAgICAgKiAgTk9URTogVGhpcyByZXF1aXJlcyB0aGUgdHJhbnNhY3Rpb24uZnJvbSAoc2VuZGVyKSBmaWVsZCB0byBiZSBzZXQgcHJvcGVybHksIHNpbmNlIGl0IGlzIHJlcXVpcmVkIGZvciBtb3N0L1xuICAgICAqICBtYW55IG9wZXJhdGlvbnMuXG4gICAgICpcbiAgICAgKiAgTk9URTogQ09OU0lERVIgZGVwcmVjYXRpbmcgdGhpcyBBUEksIGluIGZhdm9yIG9mIFVuc2lnbmVkVHJhbnNhY3Rpb24gaW5zdGFuY2UgbWV0aG9kIGNhbm9uaWNhbGl6ZSgpXG4gICAgICovXG4gICAgZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbGxUcmFuc2FjdGlvbkRlZmF1bHRzKFxuICAgICAgICB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25Db25maWcsXG4gICAgICAgIHByb3ZpZGVyPzogRXVsaXRoLlByb3ZpZGVyIHwgRXVsaXRoLldlYjMsXG4gICAgICAgIGxvZ2dlcj86IEV1bGl0aC5Mb2dnaW5nLklMb2dnZXJcbiAgICApOiBQcm9taXNlPFRyYW5zYWN0aW9uQ29uZmlnPiB7XG4gICAgICAgIC8vIEB0b2RvIEJhc2VkIG9uIHB5dGhvbiBsaWJyYXJ5IGNvZGU6IHJlZmVyZW5jZSB3aGlsZSBkZWNpZGluZyBpZiB0aGlzIHdvcmtzIGFkZXF1YXRlbHkgKHByb2JhYmx5IE9LIGJ1dCBmb3IgZXN0aWF0ZSBnYXMgc3R1ZmYgLSBkaXNjdXNzIHdpdGggdGVhbSlcbiAgICAgICAgLy8gVFJBTlNBQ1RJT05fREVGQVVMVFMgPSB7XG4gICAgICAgIC8vICAgICBcInZhbHVlXCI6IDAsXG4gICAgICAgIC8vICAgICBcImRhdGFcIjogYlwiXCIsXG4gICAgICAgIC8vICAgICBcImdhc1wiOiBsYW1iZGEgdzMsIHR4OiB3My5ldGguZXN0aW1hdGVfZ2FzKHR4KSxcbiAgICAgICAgLy8gICAgIFwiZ2FzUHJpY2VcIjogbGFtYmRhIHczLCB0eDogdzMuZXRoLmdlbmVyYXRlX2dhc19wcmljZSh0eCksXG4gICAgICAgIC8vICAgICBcIm1heEZlZVBlckdhc1wiOiAoXG4gICAgICAgIC8vICAgICAgICAgbGFtYmRhIHczLCB0eDogdzMuZXRoLm1heF9wcmlvcml0eV9mZWVcbiAgICAgICAgLy8gICAgICAgICArICgyICogdzMuZXRoLmdldF9ibG9jayhcImxhdGVzdFwiKVtcImJhc2VGZWVQZXJHYXNcIl0pXG4gICAgICAgIC8vICAgICApLFxuICAgICAgICAvLyAgICAgXCJtYXhQcmlvcml0eUZlZVBlckdhc1wiOiBsYW1iZGEgdzMsIHR4OiB3My5ldGgubWF4X3ByaW9yaXR5X2ZlZSxcbiAgICAgICAgLy8gICAgIFwiY2hhaW5JZFwiOiBsYW1iZGEgdzMsIHR4OiB3My5ldGguY2hhaW5faWQsXG4gICAgICAgIC8vIH1cbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uLmZyb20gPT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXVsaXRoLlV0aWxzLmZpbGxUcmFuc2FjdGlvbkRlZmF1bHRzIHJlcXVpcmVzIHRoZSBmcm9tIChha2Egc2VuZGVyKSBmaWVsZCB0byBiZSBzZXRcIik7XG4gICAgICAgIH1cbiAgICAgICAgdHJhbnNhY3Rpb24gPSB7IC4uLnRyYW5zYWN0aW9uIH07IC8vIGNsb25lIGJlZm9yZSBjaGFuZ2luZyAodG9vIGNvc3RseSB0byBjaGVjayBpZiBuZWVkIHRvIGNsb25lKVxuICAgICAgICBpZiAoIXRyYW5zYWN0aW9uLnZhbHVlKSB7XG4gICAgICAgICAgICB0cmFuc2FjdGlvbi52YWx1ZSA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0cmFuc2FjdGlvbi5nYXMpIHtcbiAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvbi5kYXRhID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5nYXMgPSAyMTAwMDsgLy8gc2ltcGxlIHRyYW5zZmVycyBhbHdheXMgMjEwMDAgKEB0b2RvIGFkZCBTT1VSQ0UgZm9yIHRoaXMgbG9naWMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3ZpZGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB1c2VQcm92aWRlciA9IEV1bGl0aC5Qcm92aWRlci5Qcm92aWRlck9yV2ViMyhwcm92aWRlcik7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2ViMyA9IG5ldyBFdWxpdGguV2ViMyh7IHByb3ZpZGVyOiB1c2VQcm92aWRlciB9KTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5nYXMgPSBhd2FpdCB3ZWIzLmV0aC5lc3RpbWF0ZUdhcyh0cmFuc2FjdGlvbik7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBAdG9kbyBMT0dcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0cmFuc2FjdGlvbi5nYXNQcmljZSAmJiBwcm92aWRlcikge1xuICAgICAgICAgICAgY29uc3QgdXNlUHJvdmlkZXIgPSBFdWxpdGguUHJvdmlkZXIuUHJvdmlkZXJPcldlYjMocHJvdmlkZXIpO1xuICAgICAgICAgICAgY29uc3Qgd2ViMyA9IG5ldyBFdWxpdGguV2ViMyh7IHByb3ZpZGVyOiB1c2VQcm92aWRlciB9KTtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmdhc1ByaWNlID0gV2ViMy51dGlscy50b051bWJlcihhd2FpdCB3ZWIzLmV0aC5nZXRHYXNQcmljZSgpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRyYW5zYWN0aW9uLmdhcykge1xuICAgICAgICAgICAgaWYgKGxvZ2dlcikge1xuICAgICAgICAgICAgICAgIGxldCByZWFzb24gPSBcIlwiO1xuICAgICAgICAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlYXNvbiA9IFwibm8gd2ViMyBhcmd1bWVudCBzcGVjaWZpZWRcIjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWFzb24gPSBcIndlYjMuZXRoLmVzdGltYXRlR2FzIGZhaWxlZFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsb2dnZXIubG9nKFxuICAgICAgICAgICAgICAgICAgICBFdWxpdGguTG9nZ2luZy5Mb2dMZXZlbC5XQVJOSU5HLFxuICAgICAgICAgICAgICAgICAgICBgVW5hYmxlIHRvIGF1dG9tYXRpY2FsbHkgY29tcHV0ZSBnYXMgdmFsdWUgZm9yIHR4ICR7SlNPTi5zdHJpbmdpZnkodHJhbnNhY3Rpb24pfTogcmVhc29uOiAke3JlYXNvbn1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRyYW5zYWN0aW9uLm1heEZlZVBlckdhcyAmJiBwcm92aWRlcikge1xuICAgICAgICAgICAgLy8gQHRvZG8gYnV0IGRvbnQga25vdyBob3cgcmlnaHQgbm93IGFuZCBkb2Vzbid0IHNlZW0gY3JpdGljYWxcbiAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uLm1heEZlZVBlckdhcyA9IHczLmV0aC47XG4gICAgICAgICAgICAvLyBtYXhGZWVQZXJHYXM6XCIweDIzYjExYmMwNFwiXG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0cmFuc2FjdGlvbi5tYXhQcmlvcml0eUZlZVBlckdhcyAmJiBwcm92aWRlcikge1xuICAgICAgICAgICAgLy8gQHRvZG8gYnV0IGRvbnQga25vdyBob3cgcmlnaHQgbm93IGFuZCBkb2Vzbid0IHNlZW0gY3JpdGljYWxcbiAgICAgICAgICAgIC8vIHRyYW5zYWN0aW9uLm1heFByaW9yaXR5RmVlUGVyR2FzID0gdzMuZXRoLm1heF9wcmlvcml0eV9mZWVcbiAgICAgICAgICAgIC8vIG1heFByaW9yaXR5RmVlUGVyR2FzOlwiMHg5NTAyRjkwMFwiLFxuICAgICAgICB9XG4gICAgICAgIGlmICghdHJhbnNhY3Rpb24uY2hhaW5JZCAmJiBwcm92aWRlcikge1xuICAgICAgICAgICAgY29uc3QgdXNlUHJvdmlkZXIgPSBFdWxpdGguUHJvdmlkZXIuUHJvdmlkZXJPcldlYjMocHJvdmlkZXIpO1xuICAgICAgICAgICAgY29uc3Qgd2ViMyA9IG5ldyBFdWxpdGguV2ViMyh7IHByb3ZpZGVyOiB1c2VQcm92aWRlciB9KTtcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uLmNoYWluSWQgPSBhd2FpdCB3ZWIzLmV0aC5nZXRDaGFpbklkKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYW5zYWN0aW9uLmZyb20gJiYgIXRyYW5zYWN0aW9uLm5vbmNlICYmIHByb3ZpZGVyKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VQcm92aWRlciA9IEV1bGl0aC5Qcm92aWRlci5Qcm92aWRlck9yV2ViMyhwcm92aWRlcik7XG4gICAgICAgICAgICBjb25zdCB3ZWIzID0gbmV3IEV1bGl0aC5XZWIzKHsgcHJvdmlkZXI6IHVzZVByb3ZpZGVyIH0pO1xuICAgICAgICAgICAgLy8gSWYgbm9uY2UgaXMgbWlzc2luZywgdGhlIGN1cnJlbnQgdmFsdWUgdG8gdXNlIGlzIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGNvdW50IGZyb20gdGhlIGNoYWluXG4gICAgICAgICAgICB0cmFuc2FjdGlvbi5ub25jZSA9IGF3YWl0IHdlYjMuZXRoLmdldFRyYW5zYWN0aW9uQ291bnQodHJhbnNhY3Rpb24uZnJvbS50b1N0cmluZygpLCBcInBlbmRpbmdcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRyYW5zYWN0aW9uO1xuICAgIH1cbn1cbiJdfQ==