PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@bitgo/sdk-coin-stx/dist/src/lib
Просмотр файла: contractBuilder.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ContractBuilder = void 0;
const transactions_1 = require("@stacks/transactions");
const sdk_core_1 = require("@bitgo/sdk-core");
const utils_1 = require("./utils");
const _1 = require(".");
const constants_1 = require("./constants");
const abstractContractBuilder_1 = require("./abstractContractBuilder");
class ContractBuilder extends abstractContractBuilder_1.AbstractContractBuilder {
constructor(_coinConfig) {
super(_coinConfig);
}
initBuilder(tx) {
super.initBuilder(tx);
// Retro compatibility, checks parameters.
this.contractAddress(this._contractAddress);
this.contractName(this._contractName);
this.functionName(this._functionName);
this.functionArgs(this._functionArgs);
}
// region Contract fields
/**
* Set the contract address
*
* @param {string} address the address deployed the contract
* @returns {ContractBuilder} the builder with the new parameter set
*/
contractAddress(address) {
if (!(0, utils_1.isValidAddress)(address)) {
throw new sdk_core_1.InvalidParameterValueError('Invalid address');
}
if (!_1.Utils.isValidContractAddress(address, this._coinConfig.network)) {
throw new sdk_core_1.InvalidParameterValueError('Invalid contract address');
}
this._contractAddress = address;
return this;
}
/**
* Set the contract name
*
* @param {string} name name of contract
* @returns {ContractBuilder} the builder with the new parameter set
*/
contractName(name) {
if (name.length === 0) {
throw new sdk_core_1.InvalidParameterValueError('Invalid name');
}
if (name !== constants_1.CONTRACT_NAME_STAKING && name !== constants_1.CONTRACT_NAME_SENDMANY) {
throw new sdk_core_1.InvalidParameterValueError('Only pox-4 and send-many-memo contracts supported');
}
this._contractName = name;
return this;
}
/**
* Set the function name in contract
*
* @param {string} name name of function
* @returns {ContractBuilder} the builder with the new parameter set
*/
functionName(name) {
if (name.length === 0) {
throw new sdk_core_1.InvalidParameterValueError('Invalid name');
}
if (!_1.Utils.isValidContractFunctionName(name)) {
throw new sdk_core_1.InvalidParameterValueError(`${name} is not supported contract function name`);
}
this._functionName = name;
return this;
}
functionArgs(args) {
this._functionArgs = args.map((arg) => {
if (!transactions_1.ClarityType[arg.type]) {
return this.parseCv(arg);
}
else {
// got direct clarity value after deserialization in fromImplementation
return arg;
}
});
return this;
}
parseCv(arg) {
switch (arg.type) {
case 'optional':
if (arg.val === undefined) {
return (0, transactions_1.noneCV)();
}
else {
return (0, transactions_1.someCV)(this.parseCv(arg.val));
}
case 'tuple':
if (arg.val instanceof Array) {
const data = {};
arg.val.forEach((a) => {
data[a.key] = this.parseCv({ type: a.type, val: a.val });
});
return (0, transactions_1.tupleCV)(data);
}
throw new sdk_core_1.InvalidParameterValueError('tuple require Array val');
case 'buffer':
if (arg.val instanceof Buffer) {
return (0, transactions_1.bufferCV)(arg.val);
}
const nval = Number(arg.val);
if (nval) {
return (0, transactions_1.bufferCV)(Buffer.of(nval));
}
return (0, transactions_1.bufferCVFromString)(arg.val);
default:
return (0, transactions_1.encodeClarityValue)(arg.type, arg.val);
}
}
}
exports.ContractBuilder = ContractBuilder;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RCdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9jb250cmFjdEJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsdURBVThCO0FBQzlCLDhDQUE2RDtBQUU3RCxtQ0FBeUM7QUFFekMsd0JBQTBCO0FBQzFCLDJDQUE0RTtBQUM1RSx1RUFBb0U7QUFFcEUsTUFBYSxlQUFnQixTQUFRLGlEQUF1QjtJQUMxRCxZQUFZLFdBQWlDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNyQixDQUFDO0lBRUQsV0FBVyxDQUFDLEVBQWU7UUFDekIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QiwwQ0FBMEM7UUFDMUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQseUJBQXlCO0lBQ3pCOzs7OztPQUtHO0lBQ0gsZUFBZSxDQUFDLE9BQWU7UUFDN0IsSUFBSSxDQUFDLElBQUEsc0JBQWMsRUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQzdCLE1BQU0sSUFBSSxxQ0FBMEIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzFELENBQUM7UUFDRCxJQUFJLENBQUMsUUFBSyxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQTZCLENBQUMsRUFBRSxDQUFDO1lBQzNGLE1BQU0sSUFBSSxxQ0FBMEIsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO1FBQ25FLENBQUM7UUFDRCxJQUFJLENB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O2dCQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzdCLElBQUksSUFBSSxFQUFFLENBQUM7b0JBQ1QsT0FBTyxJQUFBLHVCQUFRLEVBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxDQUFDO2dCQUNELE9BQU8sSUFBQSxpQ0FBa0IsRUFBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckM7Z0JBQ0UsT0FBTyxJQUFBLGlDQUFrQixFQUFDLEdBQUcsQ0FBQyxJQUFzQixFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBNUdELDBDQTRHQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcsIFN0YWNrc05ldHdvcmsgYXMgQml0Z29TdGFja3NOZXR3b3JrIH0gZnJvbSAnQGJpdGdvL3N0YXRpY3MnO1xuaW1wb3J0IHtcbiAgYnVmZmVyQ1YsXG4gIGJ1ZmZlckNWRnJvbVN0cmluZyxcbiAgQ2xhcml0eUFiaVR5cGUsXG4gIENsYXJpdHlUeXBlLFxuICBDbGFyaXR5VmFsdWUsXG4gIGVuY29kZUNsYXJpdHlWYWx1ZSxcbiAgbm9uZUNWLFxuICBzb21lQ1YsXG4gIHR1cGxlQ1YsXG59IGZyb20gJ0BzdGFja3MvdHJhbnNhY3Rpb25zJztcbmltcG9ydCB7IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yIH0gZnJvbSAnQGJpdGdvL3Nkay1jb3JlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBpc1ZhbGlkQWRkcmVzcyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgQ2xhcml0eVZhbHVlSnNvbiB9IGZyb20gJy4vaWZhY2UnO1xuaW1wb3J0IHsgVXRpbHMgfSBmcm9tICcuJztcbmltcG9ydCB7IENPTlRSQUNUX05BTUVfU0VORE1BTlksIENPTlRSQUNUX05BTUVfU1RBS0lORyB9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJhY3RCdWlsZGVyIH0gZnJvbSAnLi9hYnN0cmFjdENvbnRyYWN0QnVpbGRlcic7XG5cbmV4cG9ydCBjbGFzcyBDb250cmFjdEJ1aWxkZXIgZXh0ZW5kcyBBYnN0cmFjdENvbnRyYWN0QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKF9jb2luQ29uZmlnOiBSZWFkb25seTxDb2luQ29uZmlnPikge1xuICAgIHN1cGVyKF9jb2luQ29uZmlnKTtcbiAgfVxuXG4gIGluaXRCdWlsZGVyKHR4OiBUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIHN1cGVyLmluaXRCdWlsZGVyKHR4KTtcbiAgICAvLyBSZXRybyBjb21wYXRpYmlsaXR5LCBjaGVja3MgcGFyYW1ldGVycy5cbiAgICB0aGlzLmNvbnRyYWN0QWRkcmVzcyh0aGlzLl9jb250cmFjdEFkZHJlc3MpO1xuICAgIHRoaXMuY29udHJhY3ROYW1lKHRoaXMuX2NvbnRyYWN0TmFtZSk7XG4gICAgdGhpcy5mdW5jdGlvbk5hbWUodGhpcy5fZnVuY3Rpb25OYW1lKTtcbiAgICB0aGlzLmZ1bmN0aW9uQXJncyh0aGlzLl9mdW5jdGlvbkFyZ3MpO1xuICB9XG5cbiAgLy8gcmVnaW9uIENvbnRyYWN0IGZpZWxkc1xuICAvKipcbiAgICogU2V0IHRoZSBjb250cmFjdCBhZGRyZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyZXNzIHRoZSBhZGRyZXNzIGRlcGxveWVkIHRoZSBjb250cmFjdFxuICAgKiBAcmV0dXJucyB7Q29udHJhY3RCdWlsZGVyfSB0aGUgYnVpbGRlciB3aXRoIHRoZSBuZXcgcGFyYW1ldGVyIHNldFxuICAgKi9cbiAgY29udHJhY3RBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICghaXNWYWxpZEFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcignSW52YWxpZCBhZGRyZXNzJyk7XG4gICAgfVxuICAgIGlmICghVXRpbHMuaXNWYWxpZENvbnRyYWN0QWRkcmVzcyhhZGRyZXNzLCB0aGlzLl9jb2luQ29uZmlnLm5ldHdvcmsgYXMgQml0Z29TdGFja3NOZXR3b3JrKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdJbnZhbGlkIGNvbnRyYWN0IGFkZHJlc3MnKTtcbiAgICB9XG4gICAgdGhpcy5fY29udHJhY3RBZGRyZXNzID0gYWRkcmVzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGNvbnRyYWN0IG5hbWVcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiBjb250cmFjdFxuICAgKiBAcmV0dXJucyB7Q29udHJhY3RCdWlsZGVyfSB0aGUgYnVpbGRlciB3aXRoIHRoZSBuZXcgcGFyYW1ldGVyIHNldFxuICAgKi9cbiAgY29udHJhY3ROYW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdJbnZhbGlkIG5hbWUnKTtcbiAgICB9XG4gICAgaWYgKG5hbWUgIT09IENPTlRSQUNUX05BTUVfU1RBS0lORyAmJiBuYW1lICE9PSBDT05UUkFDVF9OQU1FX1NFTkRNQU5ZKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlclZhbHVlRXJyb3IoJ09ubHkgcG94LTQgYW5kIHNlbmQtbWFueS1tZW1vIGNvbnRyYWN0cyBzdXBwb3J0ZWQnKTtcbiAgICB9XG4gICAgdGhpcy5fY29udHJhY3ROYW1lID0gbmFtZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIGZ1bmN0aW9uIG5hbWUgaW4gY29udHJhY3RcbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiBmdW5jdGlvblxuICAgKiBAcmV0dXJucyB7Q29udHJhY3RCdWlsZGVyfSB0aGUgYnVpbGRlciB3aXRoIHRoZSBuZXcgcGFyYW1ldGVyIHNldFxuICAgKi9cbiAgZnVuY3Rpb25OYW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuICAgIGlmIChuYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQYXJhbWV0ZXJWYWx1ZUVycm9yKCdJbnZhbGlkIG5hbWUnKTtcbiAgICB9XG4gICAgaWYgKCFVdGlscy5pc1ZhbGlkQ29udHJhY3RGdW5jdGlvbk5hbWUobmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGFyYW1ldGVyVmFsdWVFcnJvcihgJHtuYW1lfSBpcyBub3Qgc3VwcG9ydGVkIGNvbnRyYWN0IGZ1bmN0aW9uIG5hbWVgKTtcbiAgICB9XG4gICAgdGhpcy5fZnVuY3Rpb25OYW1lID0gbmFtZTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGZ1bmN0aW9uQXJncyhhcmdzOiBDbGFyaXR5VmFsdWVKc29uW10gfCBDbGFyaXR5VmFsdWVbXSk6IHRoaXMge1xuICAgIHRoaXMuX2Z1bmN0aW9uQXJncyA9IGFyZ3MubWFwKChhcmcpID0+IHtcbiAgICAgIGlmICghQ2xhcml0eVR5cGVbYXJnLnR5cGVdKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQ3YoYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGdvdCBkaXJlY3QgY2xhcml0eSB2YWx1ZSBhZnRlciBkZXNlcmlhbGl6YXRpb24gaW4gZnJvbUltcGxlbWVudGF0aW9uXG4gICAgICAgIHJldHVybiBhcmc7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlQ3YoYXJnOiBDbGFyaXR5VmFsdWVKc29uKTogQ2xhcml0eVZhbHVlIHtcbiAgICBzd2l0Y2ggKGFyZy50eXBlKSB7XG4gICAgICBjYXNlICdvcHRpb25hbCc6XG4gICAgICAgIGlmIChhcmcudmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gbm9uZUNWKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHNvbWVDVih0aGlzLnBhcnNlQ3YoYXJnLnZhbCkpO1xuICAgICAgICB9XG4gICAgICBjYXNlICd0dXBsZSc6XG4gICAgICAgIGlmIChhcmcudmFsIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICBjb25zdCBkYXRhID0ge307XG4gICAgICAgICAgYXJnLnZhbC5mb3JFYWNoKChhKSA9PiB7XG4gICAgICAgICAgICBkYXRhW2Eua2V5XSA9IHRoaXMucGFyc2VDdih7IHR5cGU6IGEudHlwZSwgdmFsOiBhLnZhbCB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHVwbGVDVihkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFBhcmFtZXRlclZhbHVlRXJyb3IoJ3R1cGxlIHJlcXVpcmUgQXJyYXkgdmFsJyk7XG4gICAgICBjYXNlICdidWZmZXInOlxuICAgICAgICBpZiAoYXJnLnZhbCBpbnN0YW5jZW9mIEJ1ZmZlcikge1xuICAgICAgICAgIHJldHVybiBidWZmZXJDVihhcmcudmFsKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBudmFsID0gTnVtYmVyKGFyZy52YWwpO1xuICAgICAgICBpZiAobnZhbCkge1xuICAgICAgICAgIHJldHVybiBidWZmZXJDVihCdWZmZXIub2YobnZhbCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBidWZmZXJDVkZyb21TdHJpbmcoYXJnLnZhbCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gZW5jb2RlQ2xhcml0eVZhbHVlKGFyZy50eXBlIGFzIENsYXJpdHlBYmlUeXBlLCBhcmcudmFsKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==Выполнить команду
Для локальной разработки. Не используйте в интернете!