PHP WebShell
Текущая директория: /usr/lib/node_modules/bitgo/node_modules/@stacks/transactions/dist
Просмотр файла: contract-abi.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseToCV = exports.validateContractCall = exports.abiFunctionToString = exports.getTypeString = exports.encodeClarityValue = exports.getTypeUnion = exports.isClarityAbiList = exports.isClarityAbiTuple = exports.isClarityAbiOptional = exports.isClarityAbiResponse = exports.isClarityAbiStringUtf8 = exports.isClarityAbiStringAscii = exports.isClarityAbiBuffer = exports.isClarityAbiPrimitive = exports.ClarityAbiTypeId = void 0;
const common_1 = require("@stacks/common");
const utils_1 = require("./utils");
const clarity_1 = require("./clarity");
const errors_1 = require("./errors");
const stringCV_1 = require("./clarity/types/stringCV");
var ClarityAbiTypeId;
(function (ClarityAbiTypeId) {
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypeUInt128"] = 1] = "ClarityAbiTypeUInt128";
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypeInt128"] = 2] = "ClarityAbiTypeInt128";
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypeBool"] = 3] = "ClarityAbiTypeBool";
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypePrincipal"] = 4] = "ClarityAbiTypePrincipal";
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypeNone"] = 5] = "ClarityAbiTypeNone";
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypeBuffer"] = 6] = "ClarityAbiTypeBuffer";
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypeResponse"] = 7] = "ClarityAbiTypeResponse";
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypeOptional"] = 8] = "ClarityAbiTypeOptional";
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypeTuple"] = 9] = "ClarityAbiTypeTuple";
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypeList"] = 10] = "ClarityAbiTypeList";
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypeStringAscii"] = 11] = "ClarityAbiTypeStringAscii";
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypeStringUtf8"] = 12] = "ClarityAbiTypeStringUtf8";
ClarityAbiTypeId[ClarityAbiTypeId["ClarityAbiTypeTraitReference"] = 13] = "ClarityAbiTypeTraitReference";
})(ClarityAbiTypeId = exports.ClarityAbiTypeId || (exports.ClarityAbiTypeId = {}));
const isClarityAbiPrimitive = (val) => typeof val === 'string';
exports.isClarityAbiPrimitive = isClarityAbiPrimitive;
const isClarityAbiBuffer = (val) => val.buffer !== undefined;
exports.isClarityAbiBuffer = isClarityAbiBuffer;
const isClarityAbiStringAscii = (val) => val['string-ascii'] !== undefined;
exports.isClarityAbiStringAscii = isClarityAbiStringAscii;
const isClarityAbiStringUtf8 = (val) => val['string-utf8'] !== undefined;
exports.isClarityAbiStringUtf8 = isClarityAbiStringUtf8;
const isClarityAbiResponse = (val) => val.response !== undefined;
exports.isClarityAbiResponse = isClarityAbiResponse;
const isClarityAbiOptional = (val) => val.optional !== undefined;
exports.isClarityAbiOptional = isClarityAbiOptional;
const isClarityAbiTuple = (val) => val.tuple !== undefined;
exports.isClarityAbiTuple = isClarityAbiTuple;
const isClarityAbiList = (val) => val.list !== undefined;
exports.isClarityAbiList = isClarityAbiList;
function getTypeUnion(val) {
if (exports.isClarityAbiPrimitive(val)) {
if (val === 'uint128') {
return { id: ClarityAbiTypeId.ClarityAbiTypeUInt128, type: val };
}
else if (val === 'int128') {
return { id: ClarityAbiTypeId.ClarityAbiTypeInt128, type: val };
}
else if (val === 'bool') {
return { id: ClarityAbiTypeId.ClarityAbiTypeBool, type: val };
}
else if (val === 'principal') {
return { id: ClarityAbiTypeId.ClarityAbiTypePrincipal, type: val };
}
else if (val === 'trait_reference') {
return { id: ClarityAbiTypeId.ClarityAbiTypeTraitReference, type: val };
}
else if (val === 'none') {
return { id: ClarityAbiTypeId.ClarityAbiTypeNone, type: val };
}
else {
throw new Error(`Unexpected Clarity ABI type primitive: ${JSON.stringify(val)}`);
}
}
else if (exports.isClarityAbiBuffer(val)) {
return { id: ClarityAbiTypeId.ClarityAbiTypeBuffer, type: val };
}
else if (exports.isClarityAbiResponse(val)) {
return { id: ClarityAbiTypeId.ClarityAbiTypeResponse, type: val };
}
else if (exports.isClarityAbiOptional(val)) {
return { id: ClarityAbiTypeId.ClarityAbiTypeOptional, type: val };
}
else if (exports.isClarityAbiTuple(val)) {
return { id: ClarityAbiTypeId.ClarityAbiTypeTuple, type: val };
}
else if (exports.isClarityAbiList(val)) {
return { id: ClarityAbiTypeId.ClarityAbiTypeList, type: val };
}
else if (exports.isClarityAbiStringAscii(val)) {
return { id: ClarityAbiTypeId.ClarityAbiTypeStringAscii, type: val };
}
else if (exports.isClarityAbiStringUtf8(val)) {
return { id: ClarityAbiTypeId.ClarityAbiTypeStringUtf8, type: val };
}
else {
throw new Error(`Unexpected Clarity ABI type: ${JSON.stringify(val)}`);
}
}
exports.getTypeUnion = getTypeUnion;
function encodeClarityValue(input, val) {
let union;
if (input.id !== undefined) {
union = input;
}
else {
union = getTypeUnion(input);
}
switch (union.id) {
case ClarityAbiTypeId.ClarityAbiTypeUInt128:
return clarity_1.uintCV(val);
case ClarityAbiTypeId.ClarityAbiTypeInt128:
return clarity_1.intCV(val);
case ClarityAbiTypeId.ClarityAbiTypeBool:
if (val === 'false' || val === '0')
return clarity_1.falseCV();
else if (val === 'true' || val === '1')
return clarity_1.trueCV();
else
throw new Error(`Unexpected Clarity bool value: ${JSON.stringify(val)}`);
case ClarityAbiTypeId.ClarityAbiTypePrincipal:
if (val.includes('.')) {
const [addr, name] = val.split('.');
return clarity_1.contractPrincipalCV(addr, name);
}
else {
return clarity_1.standardPrincipalCV(val);
}
case ClarityAbiTypeId.ClarityAbiTypeTraitReference:
const [addr, name] = val.split('.');
return clarity_1.contractPrincipalCV(addr, name);
case ClarityAbiTypeId.ClarityAbiTypeNone:
return clarity_1.noneCV();
case ClarityAbiTypeId.ClarityAbiTypeBuffer:
return clarity_1.bufferCV(common_1.Buffer.from(val, 'utf8'));
case ClarityAbiTypeId.ClarityAbiTypeStringAscii:
return stringCV_1.stringAsciiCV(val);
case ClarityAbiTypeId.ClarityAbiTypeStringUtf8:
return stringCV_1.stringUtf8CV(val);
case ClarityAbiTypeId.ClarityAbiTypeResponse:
throw new errors_1.NotImplementedError(`Unsupported encoding for Clarity type: ${union.id}`);
case ClarityAbiTypeId.ClarityAbiTypeOptional:
throw new errors_1.NotImplementedError(`Unsupported encoding for Clarity type: ${union.id}`);
case ClarityAbiTypeId.ClarityAbiTypeTuple:
throw new errors_1.NotImplementedError(`Unsupported encoding for Clarity type: ${union.id}`);
case ClarityAbiTypeId.ClarityAbiTypeList:
throw new errors_1.NotImplementedError(`Unsupported encoding for Clarity type: ${union.id}`);
default:
throw new Error(`Unexpected Clarity type ID: ${JSON.stringify(union)}`);
}
}
exports.encodeClarityValue = encodeClarityValue;
function getTypeString(val) {
if (exports.isClarityAbiPrimitive(val)) {
if (val === 'int128') {
return 'int';
}
else if (val === 'uint128') {
return 'uint';
}
return val;
}
else if (exports.isClarityAbiBuffer(val)) {
return `(buff ${val.buffer.length})`;
}
else if (exports.isClarityAbiStringAscii(val)) {
return `(string-ascii ${val['string-ascii'].length})`;
}
else if (exports.isClarityAbiStringUtf8(val)) {
return `(string-utf8 ${val['string-utf8'].length})`;
}
else if (exports.isClarityAbiResponse(val)) {
return `(response ${getTypeString(val.response.ok)} ${getTypeString(val.response.error)})`;
}
else if (exports.isClarityAbiOptional(val)) {
return `(optional ${getTypeString(val.optional)})`;
}
else if (exports.isClarityAbiTuple(val)) {
return `(tuple ${val.tuple.map(t => `(${t.name} ${getTypeString(t.type)})`).join(' ')})`;
}
else if (exports.isClarityAbiList(val)) {
return `(list ${val.list.length} ${getTypeString(val.list.type)})`;
}
else {
throw new Error(`Type string unsupported for Clarity type: ${JSON.stringify(val)}`);
}
}
exports.getTypeString = getTypeString;
function abiFunctionToString(func) {
const access = func.access === 'read_only' ? 'read-only' : func.access;
return `(define-${access} (${func.name} ${func.args
.map(arg => `(${arg.name} ${getTypeString(arg.type)})`)
.join(' ')}))`;
}
exports.abiFunctionToString = abiFunctionToString;
function matchType(cv, abiType) {
const union = getTypeUnion(abiType);
switch (cv.type) {
case clarity_1.ClarityType.BoolTrue:
case clarity_1.ClarityType.BoolFalse:
return union.id === ClarityAbiTypeId.ClarityAbiTypeBool;
case clarity_1.ClarityType.Int:
return union.id === ClarityAbiTypeId.ClarityAbiTypeInt128;
case clarity_1.ClarityType.UInt:
return union.id === ClarityAbiTypeId.ClarityAbiTypeUInt128;
case clarity_1.ClarityType.Buffer:
return (union.id === ClarityAbiTypeId.ClarityAbiTypeBuffer &&
union.type.buffer.length >= cv.buffer.length);
case clarity_1.ClarityType.StringASCII:
return (union.id === ClarityAbiTypeId.ClarityAbiTypeStringAscii &&
union.type['string-ascii'].length >= cv.data.length);
case clarity_1.ClarityType.StringUTF8:
return (union.id === ClarityAbiTypeId.ClarityAbiTypeStringUtf8 &&
union.type['string-utf8'].length >= cv.data.length);
case clarity_1.ClarityType.OptionalNone:
return (union.id === ClarityAbiTypeId.ClarityAbiTypeNone ||
union.id === ClarityAbiTypeId.ClarityAbiTypeOptional);
case clarity_1.ClarityType.OptionalSome:
return (union.id === ClarityAbiTypeId.ClarityAbiTypeOptional &&
matchType(cv.value, union.type.optional));
case clarity_1.ClarityType.ResponseErr:
return (union.id === ClarityAbiTypeId.ClarityAbiTypeResponse &&
matchType(cv.value, union.type.response.error));
case clarity_1.ClarityType.ResponseOk:
return (union.id === ClarityAbiTypeId.ClarityAbiTypeResponse &&
matchType(cv.value, union.type.response.ok));
case clarity_1.ClarityType.PrincipalContract:
return (union.id === ClarityAbiTypeId.ClarityAbiTypePrincipal ||
union.id === ClarityAbiTypeId.ClarityAbiTypeTraitReference);
case clarity_1.ClarityType.PrincipalStandard:
return union.id === ClarityAbiTypeId.ClarityAbiTypePrincipal;
case clarity_1.ClarityType.List:
return (union.id == ClarityAbiTypeId.ClarityAbiTypeList &&
union.type.list.length >= cv.list.length &&
cv.list.every(val => matchType(val, union.type.list.type)));
case clarity_1.ClarityType.Tuple:
if (union.id == ClarityAbiTypeId.ClarityAbiTypeTuple) {
const tuple = utils_1.cloneDeep(cv.data);
for (let i = 0; i < union.type.tuple.length; i++) {
const abiTupleEntry = union.type.tuple[i];
const key = abiTupleEntry.name;
const val = tuple[key];
if (val) {
if (!matchType(val, abiTupleEntry.type)) {
return false;
}
delete tuple[key];
}
else {
return false;
}
}
return true;
}
else {
return false;
}
default:
return false;
}
}
function validateContractCall(payload, abi) {
const filtered = abi.functions.filter(fn => fn.name === payload.functionName.content);
if (filtered.length === 1) {
const abiFunc = filtered[0];
const abiArgs = abiFunc.args;
if (payload.functionArgs.length !== abiArgs.length) {
throw new Error(`Clarity function expects ${abiArgs.length} argument(s) but received ${payload.functionArgs.length}`);
}
for (let i = 0; i < payload.functionArgs.length; i++) {
const payloadArg = payload.functionArgs[i];
const abiArg = abiArgs[i];
if (!matchType(payloadArg, abiArg.type)) {
const argNum = i + 1;
throw new Error(`Clarity function \`${payload.functionName.content}\` expects argument ${argNum} to be of type ${getTypeString(abiArg.type)}, not ${clarity_1.getCVTypeString(payloadArg)}`);
}
}
return true;
}
else if (filtered.length === 0) {
throw new Error(`ABI doesn't contain a function with the name ${payload.functionName.content}`);
}
else {
throw new Error(`Malformed ABI. Contains multiple functions with the name ${payload.functionName.content}`);
}
}
exports.validateContractCall = validateContractCall;
function parseToCV(input, type) {
const typeString = getTypeString(type);
if (exports.isClarityAbiPrimitive(type)) {
if (type === 'uint128') {
return clarity_1.uintCV(input);
}
else if (type === 'int128') {
return clarity_1.intCV(input);
}
else if (type === 'bool') {
if (input.toLowerCase() === 'true') {
return clarity_1.trueCV();
}
else if (input.toLowerCase() === 'false') {
return clarity_1.falseCV();
}
else {
throw new Error(`Invalid bool value: ${input}`);
}
}
else if (type === 'principal') {
if (input.includes('.')) {
const [address, contractName] = input.split('.');
return clarity_1.contractPrincipalCV(address, contractName);
}
else {
return clarity_1.standardPrincipalCV(input);
}
}
else {
throw new Error(`Contract function contains unsupported Clarity ABI type: ${typeString}`);
}
}
else if (exports.isClarityAbiBuffer(type)) {
const inputLength = common_1.Buffer.from(input).byteLength;
if (inputLength > type.buffer.length) {
throw new Error(`Input exceeds specified buffer length limit of ${type.buffer.length}`);
}
return clarity_1.bufferCVFromString(input);
}
else if (exports.isClarityAbiResponse(type)) {
throw new Error(`Contract function contains unsupported Clarity ABI type: ${typeString}`);
}
else if (exports.isClarityAbiOptional(type)) {
throw new Error(`Contract function contains unsupported Clarity ABI type: ${typeString}`);
}
else if (exports.isClarityAbiTuple(type)) {
throw new Error(`Contract function contains unsupported Clarity ABI type: ${typeString}`);
}
else if (exports.isClarityAbiList(type)) {
throw new Error(`Contract function contains unsupported Clarity ABI type: ${typeString}`);
}
else {
throw new Error(`Contract function contains unsupported Clarity ABI type: ${typeString}`);
}
}
exports.parseToCV = parseToCV;
//# sourceMappingURL=contract-abi.js.mapВыполнить команду
Для локальной разработки. Не используйте в интернете!