UNPKG

@sybil-center/zkc-preparator

Version:
483 lines 32.8 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") }, 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", 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) { let result = BigInt(0); for (let i = bytes.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); } 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; }, {}); } function uintsToBytes() { return uints.reduce((prev, name) => { prev[`${name}-bytes`] = { inputType: name, outputType: "bytes", name: `${name}-bytes`, transform: numToBytes }; 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" }; 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 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(), ...uintsToBytes(), ...bytesToInt(), ...intsToBytes(), ...bytesToString(), ...stringToBytes(), ...stringsToBoolean(), ...booleanToStrings(), ...booleanToNumbers(), ...numbersToBoolean(), ...stringsToNumbers(), ...numbersToStrings(), ...stringsToFloat(), ...floatToStrings(), "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 mat ${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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiLi9zcmMvIiwic291cmNlcyI6WyJncmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLGFBQWEsQ0FBQztBQUNuQyxPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFFOUIsU0FBUyxLQUFLLENBQUMsUUFBZ0M7SUFDN0MsT0FBTyxDQUFDLEtBQVUsRUFBRSxFQUFFO1FBQ3BCLE1BQU0sS0FBSyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQztRQUN4QyxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSTtZQUNGLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1NBQ2pDO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDVixNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ2hCO1FBQ0QsT0FBTyxLQUFLLElBQUksTUFBTSxDQUFDO0lBQ3pCLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxHQUFXO0lBQ3pCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQixNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUM5QixPQUFPLENBQUMsS0FBVSxFQUFXLEVBQUU7UUFDN0IsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzFELE1BQU0sU0FBUyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDcEUsT0FBTyxFQUFFLElBQUksU0FBUyxJQUFJLFNBQVMsSUFBSSxHQUFHLENBQUM7U0FDNUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFT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