UNPKG

@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
"use strict"; 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)]); });