PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-hbar/dist/src/lib
Просмотр файла: walletInitializationBuilder.js
"use strict";
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 () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.WalletInitializationBuilder = void 0;
const Long = __importStar(require("long"));
const proto_1 = require("@hashgraph/proto");
const sdk_core_1 = require("@bitgo/sdk-core");
const transactionBuilder_1 = require("./transactionBuilder");
const utils_1 = require("./utils");
const _1 = require("./");
const constants_1 = require("./constants");
class WalletInitializationBuilder extends transactionBuilder_1.TransactionBuilder {
constructor(_coinConfig) {
super(_coinConfig);
this._owners = [];
this._txBodyData = new proto_1.proto.CryptoCreateTransactionBody();
this._txBody.cryptoCreateAccount = this._txBodyData;
this._txBodyData.autoRenewPeriod = new proto_1.proto.Duration({ seconds: Long.fromNumber(7890000) });
}
// region Base Builder
/** @inheritdoc */
async buildImplementation() {
this._txBodyData.key = { thresholdKey: this.buildOwnersKeys() };
this._txBodyData.initialBalance = Long.ZERO;
this.transaction.setTransactionType(sdk_core_1.TransactionType.WalletInitialization);
return await super.buildImplementation();
}
/**
*
* @param {boolean} rawKeys - Defines if the owners keys are obtained in raw or protocol default format
* @returns {proto.ThresholdKey} - The wallet threshold keys
*/
buildOwnersKeys(rawKeys = true) {
return this._owners.reduce((tKeys, key) => {
if (tKeys.keys && tKeys.keys.keys) {
tKeys.keys.keys.push({
ed25519: (0, utils_1.toUint8Array)(new _1.KeyPair({ pub: key }).getKeys(rawKeys).pub),
});
}
return tKeys;
}, new proto_1.proto.ThresholdKey({ threshold: 2, keys: { keys: [] } }));
}
/** @inheritdoc */
initBuilder(tx) {
super.initBuilder(tx);
const createAcc = tx.txBody.cryptoCreateAccount;
if (createAcc && createAcc.key && createAcc.key.thresholdKey) {
this.initOwners(createAcc.key.thresholdKey);
}
}
initOwners(keys) {
if (keys.keys && keys.keys.keys) {
keys.keys.keys.forEach((key) => {
this.owner((0, utils_1.toHex)(key.ed25519));
});
}
}
// endregion
// region Common builder methods
/**
* Set one of the owners of the multisig wallet.
*
* @param {string} address - The public key of the owner's account
* @returns {WalletInitializationBuilder} - This wallet initialization builder
*/
owner(address) {
if (this._owners.length >= constants_1.DEFAULT_SIGNER_NUMBER) {
throw new sdk_core_1.BuildTransactionError('A maximum of ' + constants_1.DEFAULT_SIGNER_NUMBER + ' owners can be set for a multisig wallet');
}
if (!(0, utils_1.isValidPublicKey)(address)) {
throw new sdk_core_1.BuildTransactionError('Invalid address: ' + address);
}
if (this._owners.includes(address)) {
throw new sdk_core_1.BuildTransactionError('Repeated owner address: ' + address);
}
this._owners.push(address);
return this;
}
// endregion
// region Validators
validateMandatoryFields() {
if (this._owners === undefined) {
throw new sdk_core_1.BuildTransactionError('Invalid transaction: missing wallet owners');
}
if (this._owners.length !== constants_1.DEFAULT_SIGNER_NUMBER) {
throw new sdk_core_1.BuildTransactionError(`Invalid transaction: wrong number of owners -- required: ${constants_1.DEFAULT_SIGNER_NUMBER}, found: ${this._owners.length}`);
}
super.validateMandatoryFields();
}
}
exports.WalletInitializationBuilder = WalletInitializationBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FsbGV0SW5pdGlhbGl6YXRpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi93YWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsMkNBQTZCO0FBQzdCLDRDQUF5QztBQUN6Qyw4Q0FBeUU7QUFDekUsNkRBQTBEO0FBRTFELG1DQUFnRTtBQUNoRSx5QkFBNkI7QUFDN0IsMkNBQW9EO0FBRXBELE1BQWEsMkJBQTRCLFNBQVEsdUNBQWtCO0lBSWpFLFlBQVksV0FBaUM7UUFDM0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBSGIsWUFBTyxHQUFhLEVBQUUsQ0FBQztRQUk3QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksYUFBSyxDQUFDLDJCQUEyQixFQUFFLENBQUM7UUFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ3BELElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxHQUFHLElBQUksYUFBSyxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvRixDQUFDO0lBRUQsc0JBQXNCO0lBQ3RCLGtCQUFrQjtJQUNSLEtBQUssQ0FBQyxtQkFBbUI7UUFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUM7UUFDaEUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUM1QyxJQUFJLENBQUMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLDBCQUFlLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUMxRSxPQUFPLE1BQU0sS0FB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LEtBQUssaUNBQXFCLEVBQUUsQ0FBQztZQUNsRCxNQUFNLElBQUksZ0NBQXFCLENBQzdCLDREQUE0RCxpQ0FBcUIsWUFBWSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUNuSCxDQUFDO1FBQ0osQ0FBQztRQUNELEtBQUssQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ2xDLENBQUM7Q0FFRjtBQTVGRCxrRUE0RkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQ29pbiBhcyBDb2luQ29uZmlnIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0ICogYXMgTG9uZyBmcm9tICdsb25nJztcbmltcG9ydCB7IHByb3RvIH0gZnJvbSAnQGhhc2hncmFwaC9wcm90byc7XG5pbXBvcnQgeyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IsIFRyYW5zYWN0aW9uVHlwZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkJ1aWxkZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uQnVpbGRlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbiB9IGZyb20gJy4vdHJhbnNhY3Rpb24nO1xuaW1wb3J0IHsgaXNWYWxpZFB1YmxpY0tleSwgdG9IZXgsIHRvVWludDhBcnJheSB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgS2V5UGFpciB9IGZyb20gJy4vJztcbmltcG9ydCB7IERFRkFVTFRfU0lHTkVSX05VTUJFUiB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIFdhbGxldEluaXRpYWxpemF0aW9uQnVpbGRlciBleHRlbmRzIFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3R4Qm9keURhdGE6IHByb3RvLkNyeXB0b0NyZWF0ZVRyYW5zYWN0aW9uQm9keTtcbiAgcHJpdmF0ZSBfb3duZXJzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgICB0aGlzLl90eEJvZHlEYXRhID0gbmV3IHByb3RvLkNyeXB0b0NyZWF0ZVRyYW5zYWN0aW9uQm9keSgpO1xuICAgIHRoaXMuX3R4Qm9keS5jcnlwdG9DcmVhdGVBY2NvdW50ID0gdGhpcy5fdHhCb2R5RGF0YTtcbiAgICB0aGlzLl90eEJvZHlEYXRhLmF1dG9SZW5ld1BlcmlvZCA9IG5ldyBwcm90by5EdXJhdGlvbih7IHNlY29uZHM6IExvbmcuZnJvbU51bWJlcig3ODkwMDAwKSB9KTtcbiAgfVxuXG4gIC8vIHJlZ2lvbiBCYXNlIEJ1aWxkZXJcbiAgLyoqIEBpbmhlcml0ZG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8VHJhbnNhY3Rpb24+IHtcbiAgICB0aGlzLl90eEJvZHlEYXRhLmtleSA9IHsgdGhyZXNob2xkS2V5OiB0aGlzLmJ1aWxkT3duZXJzS2V5cygpIH07XG4gICAgdGhpcy5fdHhCb2R5RGF0YS5pbml0aWFsQmFsYW5jZSA9IExvbmcuWkVSTztcbiAgICB0aGlzLnRyYW5zYWN0aW9uLnNldFRyYW5zYWN0aW9uVHlwZShUcmFuc2FjdGlvblR5cGUuV2FsbGV0SW5pdGlhbGl6YXRpb24pO1xuICAgIHJldHVybiBhd2FpdCBzdXBlci5idWlsZEltcGxlbWVudGF0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogQHBhcmFtIHtib29sZWFufSByYXdLZXlzIC0gRGVmaW5lcyBpZiB0aGUgb3duZXJzIGtleXMgYXJlIG9idGFpbmVkIGluIHJhdyBvciBwcm90b2NvbCBkZWZhdWx0IGZvcm1hdFxuICAgKiBAcmV0dXJucyB7cHJvdG8uVGhyZXNob2xkS2V5fSAtIFRoZSB3YWxsZXQgdGhyZXNob2xkIGtleXNcbiAgICovXG4gIHByaXZhdGUgYnVpbGRPd25lcnNLZXlzKHJhd0tleXMgPSB0cnVlKTogcHJvdG8uVGhyZXNob2xkS2V5IHtcbiAgICByZXR1cm4gdGhpcy5fb3duZXJzLnJlZHVjZSgodEtleXMsIGtleSkgPT4ge1xuICAgICAgaWYgKHRLZXlzLmtleXMgJiYgdEtleXMua2V5cy5rZXlzKSB7XG4gICAgICAgIHRLZXlzLmtleXMua2V5cy5wdXNoKHtcbiAgICAgICAgICBlZDI1NTE5OiB0b1VpbnQ4QXJyYXkobmV3IEtleVBhaXIoeyBwdWI6IGtleSB9KS5nZXRLZXlzKHJhd0tleXMpLnB1YiksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRLZXlzO1xuICAgIH0sIG5ldyBwcm90by5UaHJlc2hvbGRLZXkoeyB0aHJlc2hvbGQ6IDIsIGtleXM6IHsga2V5czogW10gfSB9KSk7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgaW5pdEJ1aWxkZXIodHg6IFRyYW5zYWN0aW9uKTogdm9pZCB7XG4gICAgc3VwZXIuaW5pdEJ1aWxkZXIodHgpO1xuICAgIGNvbnN0IGNyZWF0ZUFjYyA9IHR4LnR4Qm9keS5jcnlwdG9DcmVhdGVBY2NvdW50O1xuICAgIGlmIChjcmVhdGVBY2MgJiYgY3JlYXRlQWNjLmtleSAmJiBjcmVhdGVBY2Mua2V5LnRocmVzaG9sZEtleSkge1xuICAgICAgdGhpcy5pbml0T3duZXJzKGNyZWF0ZUFjYy5rZXkudGhyZXNob2xkS2V5IGFzIHByb3RvLlRocmVzaG9sZEtleSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0T3duZXJzKGtleXM6IHByb3RvLlRocmVzaG9sZEtleSkge1xuICAgIGlmIChrZXlzLmtleXMgJiYga2V5cy5rZXlzLmtleXMpIHtcbiAgICAgIGtleXMua2V5cy5rZXlzLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICB0aGlzLm93bmVyKHRvSGV4KGtleS5lZDI1NTE5ISkpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIC8vIGVuZHJlZ2lvblxuXG4gIC8vIHJlZ2lvbiBDb21tb24gYnVpbGRlciBtZXRob2RzXG4gIC8qKlxuICAgKiBTZXQgb25lIG9mIHRoZSBvd25lcnMgb2YgdGhlIG11bHRpc2lnIHdhbGxldC5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGFkZHJlc3MgLSBUaGUgcHVibGljIGtleSBvZiB0aGUgb3duZXIncyBhY2NvdW50XG4gICAqIEByZXR1cm5zIHtXYWxsZXRJbml0aWFsaXphdGlvbkJ1aWxkZXJ9IC0gVGhpcyB3YWxsZXQgaW5pdGlhbGl6YXRpb24gYnVpbGRlclxuICAgKi9cbiAgb3duZXIoYWRkcmVzczogc3RyaW5nKTogdGhpcyB7XG4gICAgaWYgKHRoaXMuX293bmVycy5sZW5ndGggPj0gREVGQVVMVF9TSUdORVJfTlVNQkVSKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICAnQSBtYXhpbXVtIG9mICcgKyBERUZBVUxUX1NJR05FUl9OVU1CRVIgKyAnIG93bmVycyBjYW4gYmUgc2V0IGZvciBhIG11bHRpc2lnIHdhbGxldCdcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghaXNWYWxpZFB1YmxpY0tleShhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEJ1aWxkVHJhbnNhY3Rpb25FcnJvcignSW52YWxpZCBhZGRyZXNzOiAnICsgYWRkcmVzcyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vd25lcnMuaW5jbHVkZXMoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBCdWlsZFRyYW5zYWN0aW9uRXJyb3IoJ1JlcGVhdGVkIG93bmVyIGFkZHJlc3M6ICcgKyBhZGRyZXNzKTtcbiAgICB9XG4gICAgdGhpcy5fb3duZXJzLnB1c2goYWRkcmVzcyk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG5cbiAgLy8gcmVnaW9uIFZhbGlkYXRvcnNcbiAgdmFsaWRhdGVNYW5kYXRvcnlGaWVsZHMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX293bmVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKCdJbnZhbGlkIHRyYW5zYWN0aW9uOiBtaXNzaW5nIHdhbGxldCBvd25lcnMnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb3duZXJzLmxlbmd0aCAhPT0gREVGQVVMVF9TSUdORVJfTlVNQkVSKSB7XG4gICAgICB0aHJvdyBuZXcgQnVpbGRUcmFuc2FjdGlvbkVycm9yKFxuICAgICAgICBgSW52YWxpZCB0cmFuc2FjdGlvbjogd3JvbmcgbnVtYmVyIG9mIG93bmVycyAtLSByZXF1aXJlZDogJHtERUZBVUxUX1NJR05FUl9OVU1CRVJ9LCBmb3VuZDogJHt0aGlzLl9vd25lcnMubGVuZ3RofWBcbiAgICAgICk7XG4gICAgfVxuICAgIHN1cGVyLnZhbGlkYXRlTWFuZGF0b3J5RmllbGRzKCk7XG4gIH1cbiAgLy8gZW5kcmVnaW9uXG59XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!