UNPKG

zkc-core

Version:
538 lines 37.2 kB
import * as u8a from "uint8arrays"; import ieee754 from "ieee754"; function isStr(encoding) { return (value) => { const isstr = typeof value === "string"; let result = true; try { u8a.fromString(value, encoding); } catch (e) { result = false; } return isstr && result; }; } function isUint(num) { const bignum = BigInt(num); const max = 2n ** bignum - 1n; return (value) => { if (typeof value === "number" || typeof value === "bigint") { const targetNum = typeof value === "number" ? BigInt(value) : value; return 0n <= targetNum && targetNum <= max; } return false; }; } function isInt(num) { const bignum = BigInt(num); const max = ((2n ** bignum) / 2n) - 1n; const min = -((2n ** bignum) / 2n); return (value) => { if (typeof value === "number" || typeof value === "bigint") { const targetNum = typeof value === "number" ? BigInt(value) : value; return min <= targetNum && targetNum <= max; } return false; }; } const BASE_NODES = { utf8: { name: "utf8", isType: isStr("utf-8") }, base64: { name: "base64", isType: isStr("base64") }, base32: { name: "base32", isType: isStr("base32upper") }, base16: { name: "base16", isType: isStr("base16upper") }, hex: { name: "hex", isType: isStr("hex") }, base64url: { name: "base64url", isType: isStr("base64url") }, base58: { name: "base58", isType: isStr("base58btc") }, ascii: { name: "ascii", isType: isStr("ascii") }, uint16: { name: "uint16", isType: isUint(16) }, uint32: { name: "uint32", isType: isUint(32) }, uint64: { name: "uint64", isType: isUint(64) }, uint128: { name: "uint128", isType: isUint(128) }, uint256: { name: "uint256", isType: isUint(256) }, int16: { name: "int16", isType: isInt(16) }, int32: { name: "int32", isType: isInt(32) }, int64: { name: "int64", isType: isInt(64) }, int128: { name: "int128", isType: isInt(128) }, int256: { name: "int256", isType: isInt(256) }, float32: { name: "float32", isType: (value) => typeof value === "number" }, boolean: { name: "boolean", isType: (value) => typeof value === "boolean" }, bytes: { name: "bytes", spread: true, isType: (value) => value instanceof Uint8Array }, uint: { name: "uint", isType: (value) => { if (typeof value === "number") { return value >= 0 && Number.isInteger(value); } return typeof value === "bigint" && value >= 0n; } } }; function defaultLinks() { return Object .keys(BASE_NODES) .reduce((prev, current) => { if (current.startsWith("int") || current.startsWith("uint")) { prev[current] = { inputType: current, outputType: current, name: current, transform: value => BigInt(value) }; } else { prev[current] = { inputType: current, outputType: current, name: current, transform: value => value }; } return prev; }, {}); } function toBigInt(bytes) { const reversedBytes = bytes.reverse(); let result = BigInt(0); for (let i = reversedBytes.length - 1; i >= 0; i--) { result = result * BigInt(256) + BigInt(bytes[i]); } return result; } function numToBytes(num) { let target = typeof num === "number" ? BigInt(num) : num; const bytes = []; let count = 0; while (target !== 0n) { bytes[count] = Number(target % 256n); count++; target = target / 256n; } return new Uint8Array(bytes.reverse()); } const uintMap = { uint: { max: null, numBytes: null }, uint16: { max: 2n ** 16n - 1n, numBytes: 2 }, uint32: { max: 2n ** 32n - 1n, numBytes: 4 }, uint64: { max: 2n ** 64n - 1n, numBytes: 8 }, uint128: { max: 2n ** 128n - 1n, numBytes: 16 }, uint256: { max: 2n ** 128n - 1n, numBytes: 32 } }; // @ts-ignore function uintToBytes() { const result = {}; for (const uintName in uintMap) { const uint = uintMap[uintName]; result[`${uintName}-bytes`] = { name: `${uintName}-bytes`, inputType: uintName, outputType: "bytes", transform: (value) => { const bytes = numToBytes(value); if (uint.numBytes && uint.numBytes > bytes.length) { const zeroes = new Array(uint.numBytes - bytes.length).fill(0); return new Uint8Array([...zeroes, ...bytes]); } else if (uint.numBytes && uint.numBytes < bytes.length) { throw new Error(`Transformation Graph: link ${uintName}-bytes, throw error because bytes length more than max bytes length ${uint.numBytes}`); } return bytes; } }; } return result; } const uints = [ "uint", "uint16", "uint32", "uint64", "uint128", "uint256", ]; function bytesToUint() { return uints.reduce((prev, name) => { prev[`bytes-${name}`] = { inputType: "bytes", outputType: name, name: `bytes-${name}`, transform: toBigInt }; return prev; }, {}); } const intsMap = { int16: { num: 16, bnum: 16n }, int32: { num: 32, bnum: 32n }, int64: { num: 64, bnum: 64n }, int128: { num: 128, bnum: 128n }, int256: { num: 256, bnum: 256n } }; function bytesToInt() { return Object.keys(intsMap) .reduce((prev, name) => { prev[`bytes-${name}`] = { inputType: "bytes", outputType: name, name: name, transform: (bytes) => { const nBits = intsMap[name]; if (bytes.length > nBits.num / 8) { throw new Error(`Graph transformation bytes-${name} error, more then ${nBits.num} bits`); } const max = ((2n ** nBits.bnum) / 2n) - 1n; const target = toBigInt(bytes); return target > max ? -(target - max) : target; } }; return prev; }, {}); } function intsToBytes() { return Object.keys(intsMap) .reduce((prev, name) => { prev[`${name}-bytes`] = { inputType: name, outputType: "bytes", name: `${name}-bytes`, transform: (value) => { const num = typeof value === "number" ? BigInt(value) : value; const nBits = intsMap[name]; const max = ((2n ** nBits.bnum) / 2n) - 1n; const target = num < 0 ? max + (-num) : num; return numToBytes(target); } }; return prev; }, {}); } const encAliases = { "utf8": "utf8", "base64": "base64", "base64url": "base64url", "base32": "base32upper", "base16": "base16upper", "base58": "base58btc", "ascii": "ascii", "hex": "hex" }; function bytesToString() { return Object.keys(encAliases) .reduce((prev, name) => { const encoding = encAliases[name]; prev[`bytes-${name}`] = { inputType: "bytes", outputType: name, name: `bytes-${name}`, transform: (bytes) => u8a.toString(bytes, encoding) }; return prev; }, {}); } function stringToBytes() { return Object.keys(encAliases) .reduce((prev, name) => { const encoding = encAliases[name]; prev[`${name}-bytes`] = { inputType: name, outputType: "bytes", name: `${name}-bytes`, transform: (str) => u8a.fromString(str, encoding) }; return prev; }, {}); } function stringsToBoolean() { return [ "utf8", "ascii" ].reduce((prev, name) => { prev[`${name}-boolean`] = { inputType: name, outputType: "boolean", name: `${name}-boolean`, transform: (str) => { if (str === "true" || str === "false") { return str === "true"; } throw new Error(`For graph link ${name}-boolean value must to be "true" or "false"`); } }; return prev; }, {}); } function uintsMod() { const uintsMods = { uint: null, uint16: 2n ** 16n, uint32: 2n ** 32n, uint64: 2n ** 64n, uint128: 2n ** 128n, uint256: 2n ** 256n }; const result = {}; for (const name in uintsMods) { const divisor = uintsMods[name]; if (!divisor) continue; result[`mod.${name}`] = { inputType: "uint", outputType: name, name: `mod.${name}`, transform: (value) => { const target = typeof value === "number" ? BigInt(value) : value; return target % divisor; } }; } return result; } function booleanToStrings() { return [ "utf8", "ascii" ].reduce((prev, name) => { prev[`boolean-${name}`] = { inputType: "boolean", outputType: name, name: `boolean-${name}`, transform: (bool) => bool ? "true" : "false" }; return prev; }, {}); } function booleanToNumbers() { return uints.concat(Object.keys(intsMap)) .reduce((prev, name) => { prev[`boolean-${name}`] = { inputType: "boolean", outputType: name, name: `boolean-${name}`, transform: (bool) => bool ? 1n : 0n }; return prev; }, {}); } function numbersToBoolean() { return uints.concat(Object.keys(intsMap)) .reduce((prev, name) => { prev[`${name}-boolean`] = { inputType: name, outputType: "boolean", name: `${name}-boolean`, transform: (num) => { const target = typeof num === "number" ? BigInt(num) : num; if (target === 1n || target === 0n) { return target === 1n; } throw new Error(`For graph link ${name}-boolean ${name} value must be 0 or 1`); } }; return prev; }, {}); } function stringsToNumbers() { const result = {}; ["utf8", "ascii"].forEach((strName) => { uints.concat(Object.keys(intsMap)) .forEach((numName) => { result[`${strName}-${numName}`] = { inputType: strName, outputType: numName, name: `${strName}-${numName}`, transform: (str) => BigInt(str) }; }); }); return result; } function numbersToStrings() { const result = {}; ["utf8", "ascii"].forEach((strName) => { uints.concat(Object.keys(intsMap)) .forEach((numName) => { result[`${numName}-${strName}`] = { inputType: numName, outputType: strName, name: `${numName}-${strName}`, transform: (value) => { const target = typeof value === "number" ? BigInt(value) : value; return target.toString(); } }; }); }); return result; } function stringsToFloat() { return ["utf8", "ascii"].reduce((prev, name) => { prev[`${name}-float32`] = { inputType: name, outputType: "float32", name: `${name}-float32`, transform: (str) => parseFloat(str) }; return prev; }, {}); } function floatToStrings() { return ["utf8", "ascii"].reduce((prev, name) => { prev[`float32-${name}`] = { inputType: "float32", outputType: name, name: `float32-${name}`, transform: (num) => String(num) }; return prev; }, {}); } const BASE_LINKS = { ...defaultLinks(), ...bytesToUint(), ...uintToBytes(), ...bytesToInt(), ...intsToBytes(), ...bytesToString(), ...stringToBytes(), ...stringsToBoolean(), ...booleanToStrings(), ...booleanToNumbers(), ...numbersToBoolean(), ...stringsToNumbers(), ...numbersToStrings(), ...stringsToFloat(), ...floatToStrings(), ...uintsMod(), "bytes-float32": { inputType: "bytes", outputType: "float32", name: "bytes-float32", transform: (bytes) => { return ieee754.read(bytes, 0, true, 23, 4); } }, "float32-bytes": { inputType: "float32", outputType: "bytes", name: "float32-bytes", transform: (num) => { const bytes = new Uint8Array(4); ieee754.write(bytes, num, 0, true, 23, 4); return bytes; } }, }; export class TransformationGraph { constructor() { this.nodes = { ...BASE_NODES }; this.links = { ...BASE_LINKS }; } extend(nodes, links) { nodes.forEach(node => { if (this.nodes[node.name]) { throw new Error(`Node with name "${node.name}" already exists in transformation graph`); } this.nodes[node.name] = node; }); links.forEach((link) => { if (this.links[link.name]) { throw new Error(`Link with name "${link.name}" already exists in transformation graph`); } this.links[link.name] = link; }); } transform(value, links) { let result = value; links.forEach((link) => { const targetLink = this.links[link]; if (!targetLink) { throw new Error(`${link} link is not supported by Transformation Graph`); } const { inputType, outputType, transform } = targetLink; const input = this.nodes[inputType]; if (!input) throw new Error(`Node with name ${inputType} not supported`); const output = this.nodes[outputType]; if (!output) throw new Error(`Node with name ${outputType} not supported`); if (!input.isType(result)) { throw new Error(`Invalid transformation, input type ${input.name} is not matched to value`); } result = transform(result); if (!output.isType(result)) { throw new Error(`Invalid transformation, output type ${output.name} is not matched to value`); } }); return result; } toLastNode(links) { const lastLink = links[links.length - 1]; const lastType = this.links[lastLink].outputType; return this.nodes[lastType]; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJwcmVwYXJhdG9yL2dyYXBoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxHQUFHLE1BQU0sYUFBYSxDQUFDO0FBQ25DLE9BQU8sT0FBTyxNQUFNLFNBQVMsQ0FBQztBQUU5QixTQUFTLEtBQUssQ0FBQyxRQUFnQztJQUM3QyxPQUFPLENBQUMsS0FBVSxFQUFFLEVBQUU7UUFDcEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDO1FBQ3hDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUNsQixJQUFJO1lBQ0YsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7U0FDakM7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sR0FBRyxLQUFLLENBQUM7U0FDaEI7UUFDRCxPQUFPLEtBQUssSUFBSSxNQUFNLENBQUM7SUFDekIsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsTUFBTSxDQUFDLEdBQVc7SUFDekIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sR0FBRyxHQUFHLEVBQUUsSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQzlCLE9BQU8sQ0FBQyxLQUFVLEVBQVcsRUFBRTtRQUM3QixJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDMUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNwRSxPQUFPLEVBQUUsSUFBSSxTQUFTLElBQUksU0FBUyxJQUFJLEdBQUcsQ0FBQztTQUM1QztRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0FBQ0osQ0FB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