PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-sui/dist/src/lib
Просмотр файла: walrusStakingBuilder.js
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.WalrusStakingBuilder = void 0;
const statics_1 = require("@bitgo/statics");
const sdk_core_1 = require("@bitgo/sdk-core");
const iface_1 = require("./iface");
const transactionBuilder_1 = require("./transactionBuilder");
const utils_1 = __importDefault(require("./utils"));
const assert_1 = __importDefault(require("assert"));
const stakingTransaction_1 = require("./stakingTransaction");
const builder_1 = require("./mystenlab/builder");
const constants_1 = require("./constants");
const walrusConfig_1 = require("./resources/walrusConfig");
class WalrusStakingBuilder extends transactionBuilder_1.TransactionBuilder {
constructor(_coinConfig) {
super(_coinConfig);
this._transaction = new stakingTransaction_1.StakingTransaction(_coinConfig);
// TODO improve mainnet vs. testnet configuration
this.walrusConfig = _coinConfig.network.type === statics_1.NetworkType.MAINNET ? walrusConfig_1.WALRUS_PROD_CONFIG : walrusConfig_1.WALRUS_TESTNET_CONFIG;
}
/**
* Build a MoveCall transaction ready to be signed and executed.
*
* @returns {BitGoSuiTransaction} an unsigned Sui transaction
*/
buildStakeTransaction() {
return {
type: iface_1.SuiTransactionType.WalrusStakeWithPool,
sender: this._sender,
tx: {
inputs: [],
transactions: [],
},
gasData: this._gasData,
};
}
/**
* Get staking transaction type
*
* @return {TransactionType}
* @protected
*/
get transactionType() {
return sdk_core_1.TransactionType.StakingAdd;
}
/** @inheritdoc */
validateTransaction(transaction) {
if (!transaction.suiTransaction) {
return;
}
this.validateTransactionFields();
}
/** @inheritdoc */
sign(key) {
this.transaction.setSuiTransaction(this.buildSuiTransaction());
super.sign(key);
}
/**
* Create a new transaction for staking coins ready to be signed and executed.
*
* @param {RequestWalrusStakeWithPool[]} request: a list of staking request
*/
stake(request) {
request.forEach((req) => {
utils_1.default.validateAddress(req.validatorAddress, 'validatorAddress');
(0, assert_1.default)(utils_1.default.isValidAmount(req.amount), 'Invalid recipient amount');
if (this._sender === req.validatorAddress) {
throw new sdk_core_1.BuildTransactionError('Sender address cannot be the same as the Staking address');
}
});
this._stakeWithPoolTx = request;
return this;
}
/**
* Set the $WAL objects to be used for staking.
*
* @param tokens The WAL objects to be used
* @returns this
*/
inputObjects(inputObjects) {
this.validateInputObjects(inputObjects);
this._inputObjects = inputObjects;
return this;
}
validateInputObjects(inputObjects) {
(0, assert_1.default)(inputObjects && inputObjects.length > 0, new sdk_core_1.BuildTransactionError('input objects required before building'));
inputObjects.forEach((inputObject) => {
this.validateSuiObjectRef(inputObject, 'input object');
});
}
/** @inheritdoc */
fromImplementation(rawTransaction) {
const tx = new stakingTransaction_1.StakingTransaction(this._coinConfig);
this.validateRawTransaction(rawTransaction);
tx.fromRawTransaction(rawTransaction);
this.initBuilder(tx);
return this.transaction;
}
/** @inheritdoc */
async buildImplementation() {
this.transaction.setSuiTransaction(this.buildSuiTransaction());
this.transaction.transactionType(this.transactionType);
if (this._signer) {
this.transaction.sign(this._signer);
}
this._signatures.forEach((signature) => {
this.transaction.addSignature(signature.publicKey, signature.signature);
});
this.transaction.loadInputsAndOutputs();
return this.transaction;
}
/**
* Initialize the transaction builder fields using the decoded transaction data
*
* @param {StakingTransaction} tx the transaction data
*/
initBuilder(tx) {
this._transaction = tx;
if (tx.signature && tx.signature.length > 0) {
this._signatures = [tx.suiSignature];
}
const txData = tx.toJson();
this.type(iface_1.SuiTransactionType.WalrusStakeWithPool);
this.sender(txData.sender);
this.gasData(txData.gasData);
const requests = utils_1.default.getWalrusStakeWithPoolRequests(tx.suiTransaction.tx);
this.stake(requests);
(0, assert_1.default)(txData.inputObjects);
this.inputObjects(txData.inputObjects);
}
/**
* Validates all fields are defined
*/
validateTransactionFields() {
(0, assert_1.default)(this._type, new sdk_core_1.BuildTransactionError('type is required before building'));
(0, assert_1.default)(this._sender, new sdk_core_1.BuildTransactionError('sender is required before building'));
this._stakeWithPoolTx.forEach((req) => {
(0, assert_1.default)(req.validatorAddress, new sdk_core_1.BuildTransactionError('validator address is required before building'));
(0, assert_1.default)(req.amount, new sdk_core_1.BuildTransactionError('staking amount is required before building'));
});
(0, assert_1.default)(this._gasData, new sdk_core_1.BuildTransactionError('gasData is required before building'));
this.validateGasData(this._gasData);
this.validateInputObjects(this._inputObjects);
}
/**
* Build SuiTransaction
*
* @return {BitGoSuiTransaction<MoveCallTx>}
* @protected
*/
buildSuiTransaction() {
this.validateTransactionFields();
const programmableTxBuilder = new builder_1.TransactionBlock();
switch (this._type) {
case iface_1.SuiTransactionType.WalrusStakeWithPool:
const inputObjects = this._inputObjects.map((token) => programmableTxBuilder.object(builder_1.Inputs.ObjectRef(token)));
const mergedObject = inputObjects.shift();
if (inputObjects.length > 0) {
programmableTxBuilder.mergeCoins(mergedObject, inputObjects);
}
// Create a new coin with staking balance, based on the coins used as gas payment.
const stakedWals = this._stakeWithPoolTx.map((req) => {
const splitObject = programmableTxBuilder.splitCoins(mergedObject, [
programmableTxBuilder.pure(Number(req.amount)),
]);
// Stake the split coin to a specific validator address.
return programmableTxBuilder.moveCall({
target: `${this.walrusConfig.WALRUS_PKG_ID}::${this.walrusConfig.WALRUS_STAKING_MODULE_NAME}::${this.walrusConfig.WALRUS_STAKE_WITH_POOL_FUN_NAME}`,
arguments: [
programmableTxBuilder.object(builder_1.Inputs.SharedObjectRef(this.walrusConfig.WALRUS_STAKING_OBJECT)),
splitObject,
programmableTxBuilder.object(req.validatorAddress),
],
});
});
programmableTxBuilder.transferObjects(stakedWals, programmableTxBuilder.object(this._sender));
break;
default:
throw new sdk_core_1.InvalidTransactionError(`unsupported target method`);
}
const txData = programmableTxBuilder.blockData;
return {
type: this._type,
sender: this._sender,
tx: {
inputs: [...txData.inputs],
transactions: [...txData.transactions],
},
gasData: {
...this._gasData,
payment: this._gasData.payment.slice(0, constants_1.MAX_GAS_OBJECTS - 1),
},
};
}
}
exports.WalrusStakingBuilder = WalrusStakingBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FscnVzU3Rha2luZ0J1aWxkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3dhbHJ1c1N0YWtpbmdCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLDRDQUFxRTtBQUNyRSw4Q0FBMkc7QUFDM0csbUNBS2lCO0FBQ2pCLDZEQUEwRDtBQUUxRCxvREFBNEI7QUFDNUIsb0RBQTRCO0FBRTVCLDZEQUEwRDtBQUMxRCxpREFLNkI7QUFDN0IsMkNBQThDO0FBQzlDLDJEQUFxRjtBQUdyRixNQUFhLG9CQUFxQixTQUFRLHVDQUF3RDtJQU1oRyxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksdUNBQWtCLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFeEQsaURBQWlEO1FBQ2pELElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUsscUJBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlDQUFrQixDQUFDLENBQUMsQ0FBQyxvQ0FBcUIsQ0FBQztJQUNwSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNPLHFCQUFxQjtRQUM3QixPQUFPO1lBQ0wsSUFBSSxFQUFFLDBCQUFrQixDQUFDLG1CQUFtQjtZQUM1QyxNQUFNLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDcEIsRUFBRSxFQUFFO2dCQUNGLE1BQU0sRUFBRSxFQUFFO2dCQUNWLFlBQVksRUFBRSxFQUFFO2FBQ2pCO1lBQ0QsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRO1NBQ3ZCLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxJQUFjLGVBQWU7UUFDM0IsT0FBTywwQkFBZSxDQUFDLFVBQVUsQ0FBQztJQUNwQyxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLG1CQUFtQixDQUFDLFdBQWdDO1FBQ2xELElBQUksQ0FBQyxXQUFX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QUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDMUIsWUFBWSxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO2FBQ3ZDO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLEdBQUcsSUFBSSxDQUFDLFFBQVE7Z0JBQ2hCLE9BQU8sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLDJCQUFlLEdBQUcsQ0FBQyxDQUFDO2FBQzdEO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQXhORCxvREF3TkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnLCBOZXR3b3JrVHlwZSB9IGZyb20gJ0BiaXRnby9zdGF0aWNzJztcbmltcG9ydCB7IEJhc2VLZXksIEJ1aWxkVHJhbnNhY3Rpb25FcnJvciwgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQge1xuICBSZXF1ZXN0V2FscnVzU3Rha2VXaXRoUG9vbCxcbiAgU3VpVHJhbnNhY3Rpb24sXG4gIFN1aVRyYW5zYWN0aW9uVHlwZSxcbiAgV2FscnVzU3Rha2luZ1Byb2dyYW1tYWJsZVRyYW5zYWN0aW9uLFxufSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4vdHJhbnNhY3Rpb25CdWlsZGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgdXRpbHMgZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgeyBUcmFuc2ZlclRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2ZlclRyYW5zYWN0aW9uJztcbmltcG9ydCB7IFN0YWtpbmdUcmFuc2FjdGlvbiB9IGZyb20gJy4vc3Rha2luZ1RyYW5zYWN0aW9uJztcbmltcG9ydCB7XG4gIElucHV0cyxcbiAgTW92ZUNhbGxUcmFuc2FjdGlvbixcbiAgVHJhbnNhY3Rpb25Bcmd1bWVudCxcbiAgVHJhbnNhY3Rpb25CbG9jayBhcyBQcm9ncmFtbWluZ1RyYW5zYWN0aW9uQmxvY2tCdWlsZGVyLFxufSBmcm9tICcuL215c3RlbmxhYi9idWlsZGVyJztcbmltcG9ydCB7IE1BWF9HQVNfT0JKRUNUUyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IFdBTFJVU19QUk9EX0NPTkZJRywgV0FMUlVTX1RFU1RORVRfQ09ORklHIH0gZnJvbSAnLi9yZXNvdXJjZXMvd2FscnVzQ29uZmlnJztcbmltcG9ydCB7IFN1aU9iamVjdFJlZiB9IGZyb20gJy4vbXlzdGVubGFiL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFdhbHJ1c1N0YWtpbmdCdWlsZGVyIGV4dGVuZHMgVHJhbnNhY3Rpb25CdWlsZGVyPFdhbHJ1c1N0YWtpbmdQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj4ge1xuICBwcm90ZWN0ZWQgX3N0YWtlV2l0aFBvb2xUeDogUmVxdWVzdFdhbHJ1c1N0YWtlV2l0aFBvb2xbXTtcbiAgcHJvdGVjdGVkIF9pbnB1dE9iamVjdHM6IFN1aU9iamVjdFJlZltdO1xuXG4gIHByaXZhdGUgd2FscnVzQ29uZmlnOiBhbnk7IC8vIFRPRE8gaW1wcm92ZVxuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IG5ldyBTdGFraW5nVHJhbnNhY3Rpb24oX2NvaW5Db25maWcpO1xuXG4gICAgLy8gVE9ETyBpbXByb3ZlIG1haW5uZXQgdnMuIHRlc3RuZXQgY29uZmlndXJhdGlvblxuICAgIHRoaXMud2FscnVzQ29uZmlnID0gX2NvaW5Db25maWcubmV0d29yay50eXBlID09PSBOZXR3b3JrVHlwZS5NQUlOTkVUID8gV0FMUlVTX1BST0RfQ09ORklHIDogV0FMUlVTX1RFU1RORVRfQ09ORklHO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgTW92ZUNhbGwgdHJhbnNhY3Rpb24gcmVhZHkgdG8gYmUgc2lnbmVkIGFuZCBleGVjdXRlZC5cbiAgICpcbiAgICogQHJldHVybnMge0JpdEdvU3VpVHJhbnNhY3Rpb259IGFuIHVuc2lnbmVkIFN1aSB0cmFuc2FjdGlvblxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkU3Rha2VUcmFuc2FjdGlvbigpOiBTdWlUcmFuc2FjdGlvbjxXYWxydXNTdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+IHtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogU3VpVHJhbnNhY3Rpb25UeXBlLldhbHJ1c1N0YWtlV2l0aFBvb2wsXG4gICAgICBzZW5kZXI6IHRoaXMuX3NlbmRlcixcbiAgICAgIHR4OiB7XG4gICAgICAgIGlucHV0czogW10sXG4gICAgICAgIHRyYW5zYWN0aW9uczogW10sXG4gICAgICB9LFxuICAgICAgZ2FzRGF0YTogdGhpcy5fZ2FzRGF0YSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBzdGFraW5nIHRyYW5zYWN0aW9uIHR5cGVcbiAgICpcbiAgICogQHJldHVybiB7VHJhbnNhY3Rpb25UeXBlfVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uVHlwZSgpOiBUcmFuc2FjdGlvblR5cGUge1xuICAgIHJldHVybiBUcmFuc2FjdGlvblR5cGUuU3Rha2luZ0FkZDtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKHRyYW5zYWN0aW9uOiBUcmFuc2ZlclRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0cmFuc2FjdGlvbi5zdWlUcmFuc2FjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnZhbGlkYXRlVHJhbnNhY3Rpb25GaWVsZHMoKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBzaWduKGtleTogQmFzZUtleSkge1xuICAgIHRoaXMudHJhbnNhY3Rpb24uc2V0U3VpVHJhbnNhY3Rpb24odGhpcy5idWlsZFN1aVRyYW5zYWN0aW9uKCkpO1xuICAgIHN1cGVyLnNpZ24oa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBuZXcgdHJhbnNhY3Rpb24gZm9yIHN0YWtpbmcgY29pbnMgcmVhZHkgdG8gYmUgc2lnbmVkIGFuZCBleGVjdXRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtSZXF1ZXN0V2FscnVzU3Rha2VXaXRoUG9vbFtdfSByZXF1ZXN0OiBhIGxpc3Qgb2Ygc3Rha2luZyByZXF1ZXN0XG4gICAqL1xuICBzdGFrZShyZXF1ZXN0OiBSZXF1ZXN0V2FscnVzU3Rha2VXaXRoUG9vbFtdKTogdGhpcyB7XG4gICAgcmVxdWVzdC5mb3JFYWNoKChyZXEpID0+IHtcbiAgICAgIHV0aWxzLnZhbGlkYXRlQWRkcmVzcyhyZXEudmFsaWRhdG9yQWRkcmVzcywgJ3ZhbGlkYXRvckFkZHJlc3MnKTtcbiAgICAgIGFzc2VydCh1dGlscy5pc1ZhbGlkQW1vdW50KHJlcS5hbW91bnQpLCAnSW52YWxpZCByZWNpcGllbnQgYW1vdW50Jyk7XG5cbiAgICAgIGlmICh0aGlzLl9zZW5kZXIgPT09IHJlcS52YWxpZGF0b3JBZGRyZXNzKSB7XG4gICAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1NlbmRlciBhZGRyZXNzIGNhbm5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgU3Rha2luZyBhZGRyZXNzJyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLl9zdGFrZVdpdGhQb29sVHggPSByZXF1ZXN0O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgJFdBTCBvYmplY3RzIHRvIGJlIHVzZWQgZm9yIHN0YWtpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB0b2tlbnMgVGhlIFdBTCBvYmplY3RzIHRvIGJlIHVzZWRcbiAgICogQHJldHVybnMgdGhpc1xuICAgKi9cbiAgaW5wdXRPYmplY3RzKGlucHV0T2JqZWN0czogU3VpT2JqZWN0UmVmW10pOiB0aGlzIHtcbiAgICB0aGlzLnZhbGlkYXRlSW5wdXRPYmplY3RzKGlucHV0T2JqZWN0cyk7XG4gICAgdGhpcy5faW5wdXRPYmplY3RzID0gaW5wdXRPYmplY3RzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZUlucHV0T2JqZWN0cyhpbnB1dE9iamVjdHM6IFN1aU9iamVjdFJlZltdKTogdm9pZCB7XG4gICAgYXNzZXJ0KFxuICAgICAgaW5wdXRPYmplY3RzICYmIGlucHV0T2JqZWN0cy5sZW5ndGggPiAwLFxuICAgICAgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignaW5wdXQgb2JqZWN0cyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKVxuICAgICk7XG4gICAgaW5wdXRPYmplY3RzLmZvckVhY2goKGlucHV0T2JqZWN0KSA9PiB7XG4gICAgICB0aGlzLnZhbGlkYXRlU3VpT2JqZWN0UmVmKGlucHV0T2JqZWN0LCAnaW5wdXQgb2JqZWN0Jyk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb248V2FscnVzU3Rha2luZ1Byb2dyYW1tYWJsZVRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHggPSBuZXcgU3Rha2luZ1RyYW5zYWN0aW9uKHRoaXMuX2NvaW5Db25maWcpO1xuICAgIHRoaXMudmFsaWRhdGVSYXdUcmFuc2FjdGlvbihyYXdUcmFuc2FjdGlvbik7XG4gICAgdHguZnJvbVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uKTtcbiAgICB0aGlzLmluaXRCdWlsZGVyKHR4KTtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgYnVpbGRJbXBsZW1lbnRhdGlvbigpOiBQcm9taXNlPFRyYW5zYWN0aW9uPFdhbHJ1c1N0YWtpbmdQcm9ncmFtbWFibGVUcmFuc2FjdGlvbj4+IHtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFN1aVRyYW5zYWN0aW9uKHRoaXMuYnVpbGRTdWlUcmFuc2FjdGlvbigpKTtcbiAgICB0aGlzLnRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uVHlwZSh0aGlzLnRyYW5zYWN0aW9uVHlwZSk7XG5cbiAgICBpZiAodGhpcy5fc2lnbmVyKSB7XG4gICAgICB0aGlzLnRyYW5zYWN0aW9uLnNpZ24odGhpcy5fc2lnbmVyKTtcbiAgICB9XG5cbiAgICB0aGlzLl9zaWduYXR1cmVzLmZvckVhY2goKHNpZ25hdHVyZSkgPT4ge1xuICAgICAgdGhpcy50cmFuc2FjdGlvbi5hZGRTaWduYXR1cmUoc2lnbmF0dXJlLnB1YmxpY0tleSwgc2lnbmF0dXJlLnNpZ25hdHVyZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnRyYW5zYWN0aW9uLmxvYWRJbnB1dHNBbmRPdXRwdXRzKCk7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSB0aGUgdHJhbnNhY3Rpb24gYnVpbGRlciBmaWVsZHMgdXNpbmcgdGhlIGRlY29kZWQgdHJhbnNhY3Rpb24gZGF0YVxuICAgKlxuICAgKiBAcGFyYW0ge1N0YWtpbmdUcmFuc2FjdGlvbn0gdHggdGhlIHRyYW5zYWN0aW9uIGRhdGFcbiAgICovXG4gIGluaXRCdWlsZGVyKHR4OiBUcmFuc2FjdGlvbjxXYWxydXNTdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+KTogdm9pZCB7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSB0eDtcblxuICAgIGlmICh0eC5zaWduYXR1cmUgJiYgdHguc2lnbmF0dXJlLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3NpZ25hdHVyZXMgPSBbdHguc3VpU2lnbmF0dXJlXTtcbiAgICB9XG5cbiAgICBjb25zdCB0eERhdGEgPSB0eC50b0pzb24oKTtcbiAgICB0aGlzLnR5cGUoU3VpVHJhbnNhY3Rpb25UeXBlLldhbHJ1c1N0YWtlV2l0aFBvb2wpO1xuICAgIHRoaXMuc2VuZGVyKHR4RGF0YS5zZW5kZXIpO1xuICAgIHRoaXMuZ2FzRGF0YSh0eERhdGEuZ2FzRGF0YSk7XG5cbiAgICBjb25zdCByZXF1ZXN0cyA9IHV0aWxzLmdldFdhbHJ1c1N0YWtlV2l0aFBvb2xSZXF1ZXN0cyh0eC5zdWlUcmFuc2FjdGlvbi50eCk7XG4gICAgdGhpcy5zdGFrZShyZXF1ZXN0cyk7XG5cbiAgICBhc3NlcnQodHhEYXRhLmlucHV0T2JqZWN0cyk7XG4gICAgdGhpcy5pbnB1dE9iamVjdHModHhEYXRhLmlucHV0T2JqZWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGVzIGFsbCBmaWVsZHMgYXJlIGRlZmluZWRcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVUcmFuc2FjdGlvbkZpZWxkcygpOiB2b2lkIHtcbiAgICBhc3NlcnQodGhpcy5fdHlwZSwgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcigndHlwZSBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKSk7XG4gICAgYXNzZXJ0KHRoaXMuX3NlbmRlciwgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignc2VuZGVyIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpKTtcbiAgICB0aGlzLl9zdGFrZVdpdGhQb29sVHguZm9yRWFjaCgocmVxKSA9PiB7XG4gICAgICBhc3NlcnQocmVxLnZhbGlkYXRvckFkZHJlc3MsIG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ3ZhbGlkYXRvciBhZGRyZXNzIGlzIHJlcXVpcmVkIGJlZm9yZSBidWlsZGluZycpKTtcbiAgICAgIGFzc2VydChyZXEuYW1vdW50LCBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdzdGFraW5nIGFtb3VudCBpcyByZXF1aXJlZCBiZWZvcmUgYnVpbGRpbmcnKSk7XG4gICAgfSk7XG4gICAgYXNzZXJ0KHRoaXMuX2dhc0RhdGEsIG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ2dhc0RhdGEgaXMgcmVxdWlyZWQgYmVmb3JlIGJ1aWxkaW5nJykpO1xuICAgIHRoaXMudmFsaWRhdGVHYXNEYXRhKHRoaXMuX2dhc0RhdGEpO1xuICAgIHRoaXMudmFsaWRhdGVJbnB1dE9iamVjdHModGhpcy5faW5wdXRPYmplY3RzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBTdWlUcmFuc2FjdGlvblxuICAgKlxuICAgKiBAcmV0dXJuIHtCaXRHb1N1aVRyYW5zYWN0aW9uPE1vdmVDYWxsVHg+fVxuICAgKiBAcHJvdGVjdGVkXG4gICAqL1xuICBwcm90ZWN0ZWQgYnVpbGRTdWlUcmFuc2FjdGlvbigpOiBTdWlUcmFuc2FjdGlvbjxXYWxydXNTdGFraW5nUHJvZ3JhbW1hYmxlVHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLnZhbGlkYXRlVHJhbnNhY3Rpb25GaWVsZHMoKTtcblxuICAgIGNvbnN0IHByb2dyYW1tYWJsZVR4QnVpbGRlciA9IG5ldyBQcm9ncmFtbWluZ1RyYW5zYWN0aW9uQmxvY2tCdWlsZGVyKCk7XG4gICAgc3dpdGNoICh0aGlzLl90eXBlKSB7XG4gICAgICBjYXNlIFN1aVRyYW5zYWN0aW9uVHlwZS5XYWxydXNTdGFrZVdpdGhQb29sOlxuICAgICAgICBjb25zdCBpbnB1dE9iamVjdHMgPSB0aGlzLl9pbnB1dE9iamVjdHMubWFwKCh0b2tlbikgPT4gcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLm9iamVjdChJbnB1dHMuT2JqZWN0UmVmKHRva2VuKSkpO1xuICAgICAgICBjb25zdCBtZXJnZWRPYmplY3QgPSBpbnB1dE9iamVjdHMuc2hpZnQoKSBhcyBUcmFuc2FjdGlvbkFyZ3VtZW50O1xuXG4gICAgICAgIGlmIChpbnB1dE9iamVjdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHByb2dyYW1tYWJsZVR4QnVpbGRlci5tZXJnZUNvaW5zKG1lcmdlZE9iamVjdCwgaW5wdXRPYmplY3RzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBjb2luIHdpdGggc3Rha2luZyBiYWxhbmNlLCBiYXNlZCBvbiB0aGUgY29pbnMgdXNlZCBhcyBnYXMgcGF5bWVudC5cbiAgICAgICAgY29uc3Qgc3Rha2VkV2FscyA9IHRoaXMuX3N0YWtlV2l0aFBvb2xUeC5tYXAoKHJlcSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHNwbGl0T2JqZWN0ID0gcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLnNwbGl0Q29pbnMobWVyZ2VkT2JqZWN0LCBbXG4gICAgICAgICAgICBwcm9ncmFtbWFibGVUeEJ1aWxkZXIucHVyZShOdW1iZXIocmVxLmFtb3VudCkpLFxuICAgICAgICAgIF0pO1xuICAgICAgICAgIC8vIFN0YWtlIHRoZSBzcGxpdCBjb2luIHRvIGEgc3BlY2lmaWMgdmFsaWRhdG9yIGFkZHJlc3MuXG4gICAgICAgICAgcmV0dXJuIHByb2dyYW1tYWJsZVR4QnVpbGRlci5tb3ZlQ2FsbCh7XG4gICAgICAgICAgICB0YXJnZXQ6IGAke3RoaXMud2FscnVzQ29uZmlnLldBTFJVU19QS0dfSUR9Ojoke3RoaXMud2FscnVzQ29uZmlnLldBTFJVU19TVEFLSU5HX01PRFVMRV9OQU1FfTo6JHt0aGlzLndhbHJ1c0NvbmZpZy5XQUxSVVNfU1RBS0VfV0lUSF9QT09MX0ZVTl9OQU1FfWAsXG4gICAgICAgICAgICBhcmd1bWVudHM6IFtcbiAgICAgICAgICAgICAgcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLm9iamVjdChJbnB1dHMuU2hhcmVkT2JqZWN0UmVmKHRoaXMud2FscnVzQ29uZmlnLldBTFJVU19TVEFLSU5HX09CSkVDVCkpLFxuICAgICAgICAgICAgICBzcGxpdE9iamVjdCxcbiAgICAgICAgICAgICAgcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLm9iamVjdChyZXEudmFsaWRhdG9yQWRkcmVzcyksXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0gYXMgdW5rbm93biBhcyBNb3ZlQ2FsbFRyYW5zYWN0aW9uKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcHJvZ3JhbW1hYmxlVHhCdWlsZGVyLnRyYW5zZmVyT2JqZWN0cyhzdGFrZWRXYWxzLCBwcm9ncmFtbWFibGVUeEJ1aWxkZXIub2JqZWN0KHRoaXMuX3NlbmRlcikpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvcihgdW5zdXBwb3J0ZWQgdGFyZ2V0IG1ldGhvZGApO1xuICAgIH1cblxuICAgIGNvbnN0IHR4RGF0YSA9IHByb2dyYW1tYWJsZVR4QnVpbGRlci5ibG9ja0RhdGE7XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHRoaXMuX3R5cGUsXG4gICAgICBzZW5kZXI6IHRoaXMuX3NlbmRlcixcbiAgICAgIHR4OiB7XG4gICAgICAgIGlucHV0czogWy4uLnR4RGF0YS5pbnB1dHNdLFxuICAgICAgICB0cmFuc2FjdGlvbnM6IFsuLi50eERhdGEudHJhbnNhY3Rpb25zXSxcbiAgICAgIH0sXG4gICAgICBnYXNEYXRhOiB7XG4gICAgICAgIC4uLnRoaXMuX2dhc0RhdGEsXG4gICAgICAgIHBheW1lbnQ6IHRoaXMuX2dhc0RhdGEucGF5bWVudC5zbGljZSgwLCBNQVhfR0FTX09CSkVDVFMgLSAxKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxufVxuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!