@harmoniclabs/plu-ts-onchain
Version:
An embedded DSL for Cardano smart contracts creation coupled with a library for Cardano transactions, all in Typescript
162 lines (161 loc) • 6.32 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.tyVar = exports.asData = exports.alias = exports.sop = exports.struct = exports.delayed = exports.fn = exports.lam = exports.map = exports._pair = exports.pair = exports.list = exports.data = exports.bool = exports.unit = exports.str = exports.blsResult = exports.blsG2 = exports.blsG1 = exports.bs = exports.int = exports.cloneSopDef = exports.cloneSopCtorDef = exports.normalizeTermType = exports.PrimType = void 0;
var obj_utils_1 = require("@harmoniclabs/obj-utils");
var assert_1 = require("../../utils/assert.js");
var tyArgs_1 = require("./tyArgs/index.js");
var PrimType;
(function (PrimType) {
PrimType["Int"] = "int";
PrimType["BS"] = "bs";
PrimType["Str"] = "str";
PrimType["Unit"] = "unit";
PrimType["Bool"] = "bool";
PrimType["Data"] = "data";
PrimType["List"] = "list";
PrimType["Pair"] = "pair";
PrimType["Delayed"] = "delayed";
PrimType["Lambda"] = "lam";
PrimType["Struct"] = "struct";
PrimType["Alias"] = "alias";
PrimType["AsData"] = "asData";
PrimType["Sop"] = "sop";
PrimType["bls12_381_G1_element"] = "bls12_381_G1_element";
PrimType["bls12_381_G2_element"] = "bls12_381_G2_element";
PrimType["bls12_381_MlResult"] = "bls12_381_MlResult";
})(PrimType = exports.PrimType || (exports.PrimType = {}));
Object.freeze(PrimType);
function normalizeTermType(extended) {
if (typeof extended === "object" &&
extended !== null &&
!Array.isArray(extended) &&
(0, obj_utils_1.hasOwn)(extended, "type"))
return extended.type;
return extended;
}
exports.normalizeTermType = normalizeTermType;
function cloneSopCtorDef(ctorDef) {
var clone = {};
for (var fieldName in ctorDef) {
clone[fieldName] = ctorDef[fieldName];
}
return clone;
}
exports.cloneSopCtorDef = cloneSopCtorDef;
function cloneSopDef(def) {
var clone = {};
var ctors = Object.keys(def);
for (var i = 0; i < ctors.length; i++) {
(0, obj_utils_1.defineReadOnlyProperty)(clone, ctors[i], cloneSopCtorDef(def[ctors[i]]));
}
return clone;
}
exports.cloneSopDef = cloneSopDef;
exports.int = Object.freeze([PrimType.Int]);
exports.bs = Object.freeze([PrimType.BS]);
exports.blsG1 = Object.freeze([PrimType.bls12_381_G1_element]);
exports.blsG2 = Object.freeze([PrimType.bls12_381_G2_element]);
exports.blsResult = Object.freeze([PrimType.bls12_381_MlResult]);
exports.str = Object.freeze([PrimType.Str]);
exports.unit = Object.freeze([PrimType.Unit]);
exports.bool = Object.freeze([PrimType.Bool]);
exports.data = Object.freeze([PrimType.Data]);
var list = function (ofElem) {
return Object.freeze([PrimType.List, ofElem]);
};
exports.list = list;
var pair = function (fst, snd) {
// all pairs must be "asData"; breaks uplc otherwhise
return (Object.freeze([PrimType.Pair, asData(fst), asData(snd)]));
};
exports.pair = pair;
var _pair = function (fst, snd) {
// all pairs must be "asData"; breaks uplc otherwhise
return (Object.freeze([PrimType.Pair, fst, snd]));
};
exports._pair = _pair;
var map = function (fst, snd) {
return (0, exports.list)((0, exports.pair)(fst, snd));
};
exports.map = map;
var lam = function (input, output) {
return Object.freeze([PrimType.Lambda, input, output]);
};
exports.lam = lam;
var fn = function (inputs, output) {
(0, assert_1.assert)(inputs.length > 0, "unsupported '(void) => any' type at Pluts level");
if (inputs.length === 1)
return Object.freeze((0, exports.lam)(inputs[0], output));
return Object.freeze((0, exports.lam)(inputs[0], (0, exports.fn)(inputs.slice(1), output)));
};
exports.fn = fn;
var delayed = function (toDelay) {
return Object.freeze([PrimType.Delayed, toDelay]);
};
exports.delayed = delayed;
var struct = function (def, methods) {
return Object.freeze([
PrimType.Struct,
Object.freeze(cloneSopDef(def)),
Object.freeze(methods !== null && methods !== void 0 ? methods : {})
]);
};
exports.struct = struct;
var sop = function (def, methods) {
return Object.freeze([
PrimType.Sop,
Object.freeze(cloneSopDef(def)),
Object.freeze(methods !== null && methods !== void 0 ? methods : {})
]);
};
exports.sop = sop;
function alias(toAlias, methods) {
if (toAlias[0] === PrimType.Alias)
return toAlias;
return Object.freeze([PrimType.Alias, toAlias, Object.freeze(methods !== null && methods !== void 0 ? methods : {})]);
}
exports.alias = alias;
function asData(someT) {
// invalid asData type but not worth to rise an error
if (someT[0] === PrimType.Lambda ||
someT[0] === PrimType.Delayed)
return someT;
// invalid asData type that need an error
if (someT[0] === PrimType.Sop)
throw new Error("'SoP' type can not have an implicit data representation.");
// already data
if (someT[0] === PrimType.Struct ||
someT[0] === PrimType.Data ||
someT[0] === PrimType.AsData)
return someT;
// map `asData` down if the type is structured
// if the type is an alias temporarely unwrap;
// this to prevent blocking the mapping of `asData`
var exAliasMethods = undefined;
if (someT[0] === PrimType.Alias) {
exAliasMethods = someT[2];
someT = someT[1];
}
// here mapping
if (someT[0] === PrimType.List) {
var elemsT = (0, tyArgs_1.getElemsT)(someT);
if (elemsT[0] === PrimType.Pair) {
someT = (0, exports.list)((0, exports.pair)(asData(elemsT[1]), asData(elemsT[2])));
}
else if (elemsT[0] === PrimType.Alias &&
elemsT[1][0] === PrimType.Pair) {
someT = (0, exports.list)((0, exports.pair)(asData(elemsT[1][1]), asData(elemsT[1][2])));
someT = alias(someT, elemsT[2]);
}
else {
someT = (0, exports.list)(asData(elemsT));
}
}
// re-wrap in alias if it was infact an alias
// before finally wrapping everything in `asData`
if (typeof exAliasMethods !== "undefined")
someT = alias(someT, exAliasMethods);
return Object.freeze([PrimType.AsData, someT]);
}
exports.asData = asData;
exports.tyVar = (function (description) { return Object.freeze([Symbol(description)]); });