@trufnetwork/sdk-js 0.6.1 → 0.6.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/util/AttestationEncoding.cjs +84 -0
- package/dist/cjs/util/AttestationEncoding.cjs.map +2 -2
- package/dist/cjs/util/orderbookHelpers.cjs +40 -0
- package/dist/cjs/util/orderbookHelpers.cjs.map +2 -2
- package/dist/cjs/util/orderbookHelpers.test.cjs +321 -0
- package/dist/cjs/util/orderbookHelpers.test.cjs.map +4 -4
- package/dist/esm/util/AttestationEncoding.mjs +84 -0
- package/dist/esm/util/AttestationEncoding.mjs.map +2 -2
- package/dist/esm/util/orderbookHelpers.mjs +45 -1
- package/dist/esm/util/orderbookHelpers.mjs.map +2 -2
- package/dist/esm/util/orderbookHelpers.test.mjs +383 -58
- package/dist/esm/util/orderbookHelpers.test.mjs.map +4 -4
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/util/AttestationEncoding.d.ts +21 -0
- package/dist/types/util/AttestationEncoding.d.ts.map +1 -1
- package/dist/types/util/orderbookHelpers.d.ts +23 -0
- package/dist/types/util/orderbookHelpers.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -21,8 +21,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
var AttestationEncoding_exports = {};
|
|
22
22
|
__export(AttestationEncoding_exports, {
|
|
23
23
|
decodeABIDatapoints: () => decodeABIDatapoints,
|
|
24
|
+
decodeActionArgs: () => decodeActionArgs,
|
|
24
25
|
decodeCanonicalQueryResult: () => decodeCanonicalQueryResult,
|
|
25
26
|
decodeEncodedValue: () => decodeEncodedValue,
|
|
27
|
+
decodeQueryComponents: () => decodeQueryComponents,
|
|
26
28
|
decodedValueToJS: () => decodedValueToJS,
|
|
27
29
|
encodeActionArgs: () => encodeActionArgs,
|
|
28
30
|
parseAttestationPayload: () => parseAttestationPayload,
|
|
@@ -62,6 +64,60 @@ function encodeActionArgs(args, types) {
|
|
|
62
64
|
}
|
|
63
65
|
return buffer;
|
|
64
66
|
}
|
|
67
|
+
function decodeActionArgs(data) {
|
|
68
|
+
if (data.length < 4) {
|
|
69
|
+
throw new Error("Data too short for arg count");
|
|
70
|
+
}
|
|
71
|
+
let offset = 0;
|
|
72
|
+
const argCount = readUint32LE(data, offset);
|
|
73
|
+
offset += 4;
|
|
74
|
+
const args = [];
|
|
75
|
+
for (let i = 0; i < argCount; i++) {
|
|
76
|
+
if (offset + 4 > data.length) {
|
|
77
|
+
throw new Error(`Data too short for arg ${i} length`);
|
|
78
|
+
}
|
|
79
|
+
const argLen = readUint32LE(data, offset);
|
|
80
|
+
offset += 4;
|
|
81
|
+
if (offset + argLen > data.length) {
|
|
82
|
+
throw new Error(`Data too short for arg ${i} bytes`);
|
|
83
|
+
}
|
|
84
|
+
const argBytes = data.slice(offset, offset + argLen);
|
|
85
|
+
const { value: decodedArg } = decodeEncodedValue(argBytes, 0);
|
|
86
|
+
args.push(decodedValueToJS(decodedArg));
|
|
87
|
+
offset += argLen;
|
|
88
|
+
}
|
|
89
|
+
return args;
|
|
90
|
+
}
|
|
91
|
+
function decodeQueryComponents(encoded) {
|
|
92
|
+
const abiCoder = import_ethers.AbiCoder.defaultAbiCoder();
|
|
93
|
+
const decoded = abiCoder.decode(
|
|
94
|
+
["address", "bytes32", "string", "bytes"],
|
|
95
|
+
encoded
|
|
96
|
+
);
|
|
97
|
+
const streamIdBytes = hexToBytes(decoded[1]);
|
|
98
|
+
let lastNonZero = -1;
|
|
99
|
+
for (let i = 31; i >= 0; i--) {
|
|
100
|
+
if (streamIdBytes[i] !== 0) {
|
|
101
|
+
lastNonZero = i;
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const streamId = new TextDecoder().decode(streamIdBytes.slice(0, lastNonZero + 1));
|
|
106
|
+
return {
|
|
107
|
+
dataProvider: decoded[0].toLowerCase(),
|
|
108
|
+
streamId,
|
|
109
|
+
actionId: decoded[2],
|
|
110
|
+
args: hexToBytes(decoded[3])
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function hexToBytes(hex) {
|
|
114
|
+
const cleanHex = hex.startsWith("0x") ? hex.slice(2) : hex;
|
|
115
|
+
const bytes = new Uint8Array(cleanHex.length / 2);
|
|
116
|
+
for (let i = 0; i < cleanHex.length; i += 2) {
|
|
117
|
+
bytes[i / 2] = parseInt(cleanHex.slice(i, i + 2), 16);
|
|
118
|
+
}
|
|
119
|
+
return bytes;
|
|
120
|
+
}
|
|
65
121
|
function writeUint32LE(buffer, value, offset) {
|
|
66
122
|
buffer[offset] = value & 255;
|
|
67
123
|
buffer[offset + 1] = value >> 8 & 255;
|
|
@@ -441,6 +497,34 @@ if (import_meta.vitest) {
|
|
|
441
497
|
expect(encoded.length).toBeGreaterThan(4);
|
|
442
498
|
});
|
|
443
499
|
});
|
|
500
|
+
describe("decodeActionArgs", () => {
|
|
501
|
+
it("should decode empty args", () => {
|
|
502
|
+
const original = [];
|
|
503
|
+
const encoded = encodeActionArgs(original);
|
|
504
|
+
const decoded = decodeActionArgs(encoded);
|
|
505
|
+
expect(decoded).toEqual(original);
|
|
506
|
+
});
|
|
507
|
+
it("should decode single string arg", () => {
|
|
508
|
+
const original = ["hello"];
|
|
509
|
+
const encoded = encodeActionArgs(original);
|
|
510
|
+
const decoded = decodeActionArgs(encoded);
|
|
511
|
+
expect(decoded).toEqual(original);
|
|
512
|
+
});
|
|
513
|
+
it("should decode single number arg", () => {
|
|
514
|
+
const original = [42];
|
|
515
|
+
const encoded = encodeActionArgs(original);
|
|
516
|
+
const decoded = decodeActionArgs(encoded);
|
|
517
|
+
expect(Number(decoded[0])).toBe(42);
|
|
518
|
+
});
|
|
519
|
+
it("should decode multiple args of different types", () => {
|
|
520
|
+
const original = ["hello", 42, true];
|
|
521
|
+
const encoded = encodeActionArgs(original);
|
|
522
|
+
const decoded = decodeActionArgs(encoded);
|
|
523
|
+
expect(decoded[0]).toBe("hello");
|
|
524
|
+
expect(Number(decoded[1])).toBe(42);
|
|
525
|
+
expect(decoded[2]).toBe(true);
|
|
526
|
+
});
|
|
527
|
+
});
|
|
444
528
|
describe("writeUint32LE and readUint32LE", () => {
|
|
445
529
|
it("should round-trip uint32 values", () => {
|
|
446
530
|
const buffer = new Uint8Array(4);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/util/AttestationEncoding.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Argument encoding for attestation requests\n *\n * This module encodes action arguments into the canonical format expected by\n * the node's request_attestation action. It uses kwil-js's native encoding\n * to ensure perfect compatibility with kwil-db's EncodedValue.MarshalBinary() format.\n */\n\nimport { Utils, Types } from '@trufnetwork/kwil-js';\nimport { AbiCoder } from 'ethers';\n\n/**\n * Type hint for specifying explicit types when encoding arguments.\n * Use Utils.DataType from kwil-js (e.g., Utils.DataType.Numeric(36, 18))\n *\n * DataInfo structure: { name: VarType, is_array: boolean, metadata?: number[] }\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type TypeHint = any;\n\n/**\n * Encodes action arguments into canonical bytes using kwil-js utilities.\n *\n * Format: [arg_count:uint32(LE)][length:uint32(LE)][encoded_arg1][length:uint32(LE)][encoded_arg2]...\n *\n * Each encoded_arg uses kwil-db's EncodedValue.MarshalBinary() format.\n *\n * @param args - Array of arguments to encode\n * @param types - Optional map of argument index to type hint (for NUMERIC, etc.)\n * @returns Encoded bytes\n * @throws Error if any argument cannot be encoded\n */\nexport function encodeActionArgs(args: any[], types?: Record<number, TypeHint>): Uint8Array {\n // Calculate total size needed\n const encodedArgs: Uint8Array[] = [];\n let totalSize = 4; // arg_count (uint32)\n\n // Encode each argument using kwil-js utilities\n for (let i = 0; i < args.length; i++) {\n try {\n // Convert value to EncodedValue using kwil-js\n // If type hint is provided, use it; otherwise let kwil-js infer the type\n const typeHint = types?.[i];\n const encodedValue: Types.EncodedValue = Utils.formatEncodedValue(args[i], typeHint);\n\n // Serialize EncodedValue to bytes using kwil-js\n const argBytes = Utils.encodeEncodedValue(encodedValue);\n\n encodedArgs.push(argBytes);\n totalSize += 4 + argBytes.length; // length prefix + data\n } catch (err) {\n throw new Error(`Failed to encode arg ${i}: ${err}`);\n }\n }\n\n // Allocate buffer\n const buffer = new Uint8Array(totalSize);\n let offset = 0;\n\n // Write argument count (little-endian uint32)\n writeUint32LE(buffer, args.length, offset);\n offset += 4;\n\n // Write each encoded argument with length prefix\n for (let i = 0; i < encodedArgs.length; i++) {\n const encodedArg = encodedArgs[i];\n\n // Write length (little-endian uint32)\n writeUint32LE(buffer, encodedArg.length, offset);\n offset += 4;\n\n // Write encoded argument bytes\n buffer.set(encodedArg, offset);\n offset += encodedArg.length;\n }\n\n return buffer;\n}\n\n/**\n * Writes a uint32 value in little-endian format\n * Used for writing arg count and length prefixes\n *\n * @param buffer - Target buffer\n * @param value - Value to write\n * @param offset - Offset in buffer\n */\nfunction writeUint32LE(buffer: Uint8Array, value: number, offset: number): void {\n buffer[offset] = value & 0xff;\n buffer[offset + 1] = (value >> 8) & 0xff;\n buffer[offset + 2] = (value >> 16) & 0xff;\n buffer[offset + 3] = (value >> 24) & 0xff;\n}\n\n/**\n * Reads a uint32 value in little-endian format\n *\n * @param buffer - Source buffer\n * @param offset - Offset in buffer\n * @returns The uint32 value\n */\nexport function readUint32LE(buffer: Uint8Array, offset: number): number {\n return (\n buffer[offset] |\n (buffer[offset + 1] << 8) |\n (buffer[offset + 2] << 16) |\n (buffer[offset + 3] << 24)\n ) >>> 0; // Convert to unsigned 32-bit integer\n}\n\n/**\n * Reads a uint16 value in little-endian format\n *\n * @param buffer - Source buffer\n * @param offset - Offset in buffer\n * @returns The uint16 value\n */\nexport function readUint16LE(buffer: Uint8Array, offset: number): number {\n return (buffer[offset] | (buffer[offset + 1] << 8)) >>> 0;\n}\n\n/**\n * Reads a uint32 value in big-endian format\n *\n * @param buffer - Source buffer\n * @param offset - Offset in buffer\n * @returns The uint32 value\n */\nexport function readUint32BE(buffer: Uint8Array, offset: number): number {\n return (\n (buffer[offset] << 24) |\n (buffer[offset + 1] << 16) |\n (buffer[offset + 2] << 8) |\n buffer[offset + 3]\n ) >>> 0;\n}\n\n/**\n * Reads a uint16 value in big-endian format\n *\n * @param buffer - Source buffer\n * @param offset - Offset in buffer\n * @returns The uint16 value\n */\nexport function readUint16BE(buffer: Uint8Array, offset: number): number {\n return ((buffer[offset] << 8) | buffer[offset + 1]) >>> 0;\n}\n\n/**\n * Decoded data type information\n */\nexport interface DecodedDataType {\n name: string;\n is_array: boolean;\n metadata: number[];\n}\n\n/**\n * Decoded EncodedValue structure\n */\nexport interface DecodedEncodedValue {\n type: DecodedDataType;\n data: Uint8Array[];\n}\n\n/**\n * Decoded query result row\n */\nexport interface DecodedRow {\n values: any[];\n}\n\n/**\n * Parsed attestation payload structure\n */\nexport interface ParsedAttestationPayload {\n version: number;\n algorithm: number;\n blockHeight: bigint;\n dataProvider: string;\n streamId: string;\n actionId: number;\n arguments: any[];\n result: DecodedRow[];\n}\n\n/**\n * Decodes DataType from bytes (reverse of encodeDataType)\n *\n * @param buffer - Source buffer\n * @param offset - Starting offset\n * @returns Decoded data type and new offset\n */\nfunction decodeDataType(buffer: Uint8Array, offset: number): { type: DecodedDataType; offset: number } {\n // Version (uint16 BE)\n const version = readUint16BE(buffer, offset);\n offset += 2;\n\n if (version !== 0) {\n throw new Error(`Unsupported DataType version: ${version}`);\n }\n\n // Name length (uint32 BE)\n const nameLen = readUint32BE(buffer, offset);\n offset += 4;\n\n // Name bytes\n const nameBytes = buffer.slice(offset, offset + nameLen);\n const name = new TextDecoder().decode(nameBytes);\n offset += nameLen;\n\n // is_array (1 byte boolean)\n const is_array = buffer[offset] === 1;\n offset += 1;\n\n // Metadata (2 x uint16 BE)\n const metadata0 = readUint16BE(buffer, offset);\n offset += 2;\n const metadata1 = readUint16BE(buffer, offset);\n offset += 2;\n\n return {\n type: {\n name,\n is_array,\n metadata: [metadata0, metadata1],\n },\n offset,\n };\n}\n\n/**\n * Decodes an EncodedValue from bytes (reverse of encodeEncodedValue)\n *\n * @param buffer - Source buffer containing the encoded value\n * @param offset - Starting offset (default 0)\n * @returns Decoded value and new offset\n */\nexport function decodeEncodedValue(\n buffer: Uint8Array,\n offset: number = 0\n): { value: DecodedEncodedValue; offset: number } {\n // Version (uint16 LE)\n const version = readUint16LE(buffer, offset);\n offset += 2;\n\n if (version !== 0) {\n throw new Error(`Unsupported EncodedValue version: ${version}`);\n }\n\n // Type length (uint32 LE)\n const typeLen = readUint32LE(buffer, offset);\n offset += 4;\n\n // Type bytes\n const typeBytes = buffer.slice(offset, offset + typeLen);\n const { type } = decodeDataType(typeBytes, 0);\n offset += typeLen;\n\n // Data array length (uint16 LE)\n const dataLen = readUint16LE(buffer, offset);\n offset += 2;\n\n // Data items\n const data: Uint8Array[] = [];\n for (let i = 0; i < dataLen; i++) {\n // Data item length (uint32 LE)\n const itemLen = readUint32LE(buffer, offset);\n offset += 4;\n\n // Data item bytes\n const itemBytes = buffer.slice(offset, offset + itemLen);\n data.push(itemBytes);\n offset += itemLen;\n }\n\n return {\n value: { type, data },\n offset,\n };\n}\n\n/**\n * Converts a decoded EncodedValue to a JavaScript value\n *\n * @param decoded - Decoded EncodedValue\n * @returns JavaScript value (string, number, boolean, null, Uint8Array, or array)\n */\nexport function decodedValueToJS(decoded: DecodedEncodedValue): any {\n // Handle NULL values (data array is empty or first item indicates null)\n if (decoded.data.length === 0) {\n return null;\n }\n\n // Check the null indicator (first byte of first data item)\n const firstItem = decoded.data[0];\n if (firstItem.length === 0 || firstItem[0] === 0) {\n return null;\n }\n\n // Extract actual value bytes (skip null indicator byte)\n const valueBytes = firstItem.slice(1);\n\n // Decode based on type name\n const typeName = decoded.type.name.toLowerCase();\n\n if (decoded.type.is_array) {\n // Handle array types\n const result: any[] = [];\n for (const item of decoded.data) {\n if (item.length === 0 || item[0] === 0) {\n result.push(null);\n } else {\n const itemBytes = item.slice(1);\n result.push(decodeSingleValue(typeName, itemBytes));\n }\n }\n return result;\n }\n\n // Handle scalar types\n return decodeSingleValue(typeName, valueBytes);\n}\n\n/**\n * Decodes a single value based on type name\n */\nfunction decodeSingleValue(typeName: string, bytes: Uint8Array): any {\n switch (typeName) {\n case 'text':\n case 'uuid':\n return new TextDecoder().decode(bytes);\n\n case 'int':\n case 'int8':\n case 'integer':\n // Decode as 8-byte signed int64 (big-endian as per kwil-db)\n if (bytes.length === 8) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n // Use getBigInt64 to properly decode signed int64\n return view.getBigInt64(0, false); // false = big-endian\n }\n throw new Error(`Invalid integer byte length: expected 8, got ${bytes.length}`);\n\n case 'bool':\n case 'boolean':\n return bytes.length > 0 && bytes[0] === 1;\n\n case 'numeric':\n case 'decimal':\n return new TextDecoder().decode(bytes);\n\n case 'bytea':\n case 'blob':\n return bytes;\n\n default:\n // Unknown type, return as string if possible\n try {\n return new TextDecoder().decode(bytes);\n } catch {\n return bytes;\n }\n }\n}\n\n/**\n * Decodes canonical query result bytes into rows and columns\n *\n * Format:\n * [row_count: uint32 LE]\n * [col_count: uint32 LE]\n * [col_len: uint32 LE][col_bytes: EncodedValue.MarshalBinary()]\n * ...\n * [col_count: uint32 LE]\n * ...\n *\n * @param data - Canonical query result bytes\n * @returns Array of decoded rows\n */\nexport function decodeCanonicalQueryResult(data: Uint8Array): DecodedRow[] {\n let offset = 0;\n\n // Row count (uint32 LE)\n if (data.length < 4) {\n throw new Error('Data too short for row count');\n }\n\n const rowCount = readUint32LE(data, offset);\n offset += 4;\n\n const rows: DecodedRow[] = [];\n\n for (let i = 0; i < rowCount; i++) {\n // Column count (uint32 LE)\n if (offset + 4 > data.length) {\n throw new Error(`Data too short for column count at row ${i}`);\n }\n\n const colCount = readUint32LE(data, offset);\n offset += 4;\n\n const values: any[] = [];\n\n for (let j = 0; j < colCount; j++) {\n // Column length (uint32 LE)\n if (offset + 4 > data.length) {\n throw new Error(`Data too short for column ${j} length at row ${i}`);\n }\n\n const colLen = readUint32LE(data, offset);\n offset += 4;\n\n // Column bytes\n if (offset + colLen > data.length) {\n throw new Error(`Data too short for column ${j} bytes at row ${i}`);\n }\n\n const colBytes = data.slice(offset, offset + colLen);\n\n // Decode the EncodedValue\n const { value: decodedValue } = decodeEncodedValue(colBytes, 0);\n\n // Convert to JavaScript value\n const jsValue = decodedValueToJS(decodedValue);\n values.push(jsValue);\n\n offset += colLen;\n }\n\n rows.push({ values });\n }\n\n return rows;\n}\n\n/**\n * Decodes ABI-encoded datapoints result (timestamps and values)\n *\n * Format: abi.encode(uint256[] timestamps, int256[] values)\n *\n * @param data - ABI-encoded bytes\n * @returns Array of decoded rows with [timestamp, value] pairs\n */\nexport function decodeABIDatapoints(data: Uint8Array): DecodedRow[] {\n // Handle empty data\n if (!data || data.length === 0) {\n return [];\n }\n\n const abiCoder = AbiCoder.defaultAbiCoder();\n\n try {\n // Decode as (uint256[], int256[])\n const decoded = abiCoder.decode(\n ['uint256[]', 'int256[]'],\n data\n );\n\n const timestamps = decoded[0] as bigint[];\n const values = decoded[1] as bigint[];\n\n if (timestamps.length !== values.length) {\n throw new Error(`Timestamp/value array length mismatch: ${timestamps.length} vs ${values.length}`);\n }\n\n const rows: DecodedRow[] = [];\n for (let i = 0; i < timestamps.length; i++) {\n rows.push({\n values: [\n timestamps[i].toString(),\n // Convert from 18-decimal fixed point to decimal string\n formatFixedPoint(values[i], 18)\n ]\n });\n }\n\n return rows;\n } catch (err) {\n throw new Error(`Failed to decode ABI datapoints: ${err}`);\n }\n}\n\n/**\n * Formats a fixed-point integer value to decimal string\n *\n * @param value - BigInt value with fixed decimals\n * @param decimals - Number of decimal places\n * @returns Formatted decimal string\n */\nfunction formatFixedPoint(value: bigint, decimals: number): string {\n const isNegative = value < 0n;\n const absValue = isNegative ? -value : value;\n\n const divisor = 10n ** BigInt(decimals);\n const integerPart = absValue / divisor;\n const fractionalPart = absValue % divisor;\n\n // Pad fractional part with leading zeros\n const fractionalStr = fractionalPart.toString().padStart(decimals, '0');\n\n // Remove trailing zeros from fractional part\n const trimmedFractional = fractionalStr.replace(/0+$/, '');\n\n if (trimmedFractional === '') {\n return `${isNegative ? '-' : ''}${integerPart}`;\n }\n\n return `${isNegative ? '-' : ''}${integerPart}.${trimmedFractional}`;\n}\n\n/**\n * Parses a canonical attestation payload (without signature)\n *\n * Payload format:\n * 1. Version (1 byte)\n * 2. Algorithm (1 byte, 0 = secp256k1)\n * 3. Block height (8 bytes, uint64 big-endian)\n * 4. Data provider (length-prefixed with 4 bytes big-endian)\n * 5. Stream ID (length-prefixed with 4 bytes big-endian)\n * 6. Action ID (2 bytes, uint16 big-endian)\n * 7. Arguments (length-prefixed with 4 bytes big-endian)\n * 8. Result (length-prefixed with 4 bytes big-endian)\n *\n * @param payload - Canonical payload bytes (without 65-byte signature)\n * @returns Parsed payload structure\n */\nexport function parseAttestationPayload(payload: Uint8Array): ParsedAttestationPayload {\n let offset = 0;\n\n // 1. Version (1 byte)\n if (payload.length < 1) {\n throw new Error('Payload too short for version');\n }\n const version = payload[offset];\n offset += 1;\n\n // 2. Algorithm (1 byte)\n if (offset >= payload.length) {\n throw new Error('Payload too short for algorithm');\n }\n const algorithm = payload[offset];\n offset += 1;\n\n // 3. Block height (8 bytes, uint64 big-endian)\n if (offset + 8 > payload.length) {\n throw new Error('Payload too short for block height');\n }\n const blockHeightHigh = readUint32BE(payload, offset);\n const blockHeightLow = readUint32BE(payload, offset + 4);\n const blockHeight = (BigInt(blockHeightHigh) << 32n) | BigInt(blockHeightLow);\n offset += 8;\n\n // 4. Data provider (length-prefixed, 4 bytes big-endian)\n if (offset + 4 > payload.length) {\n throw new Error('Payload too short for data provider length');\n }\n const dataProviderLen = readUint32BE(payload, offset);\n offset += 4;\n\n if (offset + dataProviderLen > payload.length) {\n throw new Error('Payload too short for data provider');\n }\n const dataProviderBytes = payload.slice(offset, offset + dataProviderLen);\n // Data provider is typically a hex address (20 bytes for Ethereum address)\n // Try to decode as UTF-8 first, if it looks like a hex string keep it\n // Otherwise convert bytes to hex\n let dataProvider: string;\n if (dataProviderLen === 20) {\n // Likely an Ethereum address (20 bytes)\n dataProvider = '0x' + Array.from(dataProviderBytes).map(b => b.toString(16).padStart(2, '0')).join('');\n } else {\n // Try UTF-8 decoding\n try {\n const decoded = new TextDecoder().decode(dataProviderBytes);\n // Check if it looks like a hex address string (starts with \"0x\")\n if (decoded.startsWith('0x') && /^0x[0-9a-fA-F]+$/.test(decoded)) {\n dataProvider = decoded;\n } else {\n // Assume it's a valid UTF-8 string\n dataProvider = decoded;\n }\n } catch {\n // Fallback to hex\n dataProvider = '0x' + Array.from(dataProviderBytes).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n }\n offset += dataProviderLen;\n\n // 5. Stream ID (length-prefixed, 4 bytes big-endian)\n if (offset + 4 > payload.length) {\n throw new Error('Payload too short for stream ID length');\n }\n const streamIdLen = readUint32BE(payload, offset);\n offset += 4;\n\n if (offset + streamIdLen > payload.length) {\n throw new Error('Payload too short for stream ID');\n }\n const streamIdBytes = payload.slice(offset, offset + streamIdLen);\n const streamId = new TextDecoder().decode(streamIdBytes);\n offset += streamIdLen;\n\n // 6. Action ID (2 bytes, uint16 big-endian)\n if (offset + 2 > payload.length) {\n throw new Error('Payload too short for action ID');\n }\n const actionId = readUint16BE(payload, offset);\n offset += 2;\n\n // 7. Arguments (length-prefixed, 4 bytes big-endian)\n if (offset + 4 > payload.length) {\n throw new Error('Payload too short for arguments length');\n }\n const argsLen = readUint32BE(payload, offset);\n offset += 4;\n\n if (offset + argsLen > payload.length) {\n throw new Error('Payload too short for arguments');\n }\n const argsBytes = payload.slice(offset, offset + argsLen);\n offset += argsLen;\n\n // Decode arguments\n let args: any[] = [];\n if (argsLen > 0) {\n let argsOffset = 0;\n\n // Arguments format: [arg_count: uint32 LE][length: uint32 LE][encoded_arg]...\n const argCount = readUint32LE(argsBytes, argsOffset);\n argsOffset += 4;\n\n for (let i = 0; i < argCount; i++) {\n const argLen = readUint32LE(argsBytes, argsOffset);\n argsOffset += 4;\n\n const argBytes = argsBytes.slice(argsOffset, argsOffset + argLen);\n const { value: decodedArg } = decodeEncodedValue(argBytes, 0);\n args.push(decodedValueToJS(decodedArg));\n argsOffset += argLen;\n }\n }\n\n // 8. Result (length-prefixed, 4 bytes big-endian)\n if (offset + 4 > payload.length) {\n throw new Error('Payload too short for result length');\n }\n const resultLen = readUint32BE(payload, offset);\n offset += 4;\n\n if (offset + resultLen > payload.length) {\n throw new Error('Payload too short for result');\n }\n const resultBytes = payload.slice(offset, offset + resultLen);\n\n // Decode result (ABI-encoded as uint256[], int256[])\n const result = decodeABIDatapoints(resultBytes);\n\n return {\n version,\n algorithm,\n blockHeight,\n dataProvider,\n streamId,\n actionId,\n arguments: args,\n result,\n };\n}\n\n// Inline unit tests\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n\n describe('encodeActionArgs', () => {\n it('should encode empty args', () => {\n const encoded = encodeActionArgs([]);\n expect(encoded.length).toBe(4); // Just arg_count\n expect(readUint32LE(encoded, 0)).toBe(0);\n });\n\n it('should encode single string arg', () => {\n const encoded = encodeActionArgs(['hello']);\n expect(encoded.length).toBeGreaterThan(4);\n expect(readUint32LE(encoded, 0)).toBe(1); // arg_count = 1\n\n // Check length prefix and data\n const argLen = readUint32LE(encoded, 4);\n expect(argLen).toBeGreaterThan(0);\n });\n\n it('should encode single number arg', () => {\n const encoded = encodeActionArgs([42]);\n expect(encoded.length).toBeGreaterThan(4);\n expect(readUint32LE(encoded, 0)).toBe(1); // arg_count = 1\n });\n\n it('should encode null arg', () => {\n const encoded = encodeActionArgs([null]);\n expect(encoded.length).toBeGreaterThan(4);\n expect(readUint32LE(encoded, 0)).toBe(1); // arg_count = 1\n\n // kwil-js handles null encoding internally\n const argLen = readUint32LE(encoded, 4);\n expect(argLen).toBeGreaterThan(0);\n });\n\n it('should encode boolean arg', () => {\n const encoded = encodeActionArgs([true]);\n expect(encoded.length).toBeGreaterThan(4);\n expect(readUint32LE(encoded, 0)).toBe(1); // arg_count = 1\n });\n\n it('should encode Uint8Array arg', () => {\n const bytes = new Uint8Array([1, 2, 3, 4]);\n const encoded = encodeActionArgs([bytes]);\n expect(encoded.length).toBeGreaterThan(4);\n expect(readUint32LE(encoded, 0)).toBe(1); // arg_count = 1\n });\n\n it('should encode multiple args of different types', () => {\n const encoded = encodeActionArgs(['hello', 42, true, null]);\n expect(readUint32LE(encoded, 0)).toBe(4); // arg_count = 4\n expect(encoded.length).toBeGreaterThan(4);\n });\n\n it('should encode real-world get_record args', () => {\n const dataProvider = '0x4710a8d8f0d845da110086812a32de6d90d7ff5c';\n const streamId = 'stai0000000000000000000000000000';\n const fromTime = 1234567890;\n const toTime = 1234567900;\n const frozenAt = null;\n const useCache = false;\n\n const encoded = encodeActionArgs([\n dataProvider,\n streamId,\n fromTime,\n toTime,\n frozenAt,\n useCache,\n ]);\n\n expect(readUint32LE(encoded, 0)).toBe(6); // arg_count = 6\n expect(encoded.length).toBeGreaterThan(4);\n });\n\n it('should handle large strings', () => {\n const largeString = 'a'.repeat(10000);\n const encoded = encodeActionArgs([largeString]);\n expect(readUint32LE(encoded, 0)).toBe(1);\n expect(encoded.length).toBeGreaterThan(10000);\n });\n\n it('should encode array args', () => {\n const encoded = encodeActionArgs([['a', 'b', 'c']]);\n expect(readUint32LE(encoded, 0)).toBe(1); // arg_count = 1\n expect(encoded.length).toBeGreaterThan(4);\n });\n });\n\n describe('writeUint32LE and readUint32LE', () => {\n it('should round-trip uint32 values', () => {\n const buffer = new Uint8Array(4);\n const testValues = [0, 1, 255, 256, 65535, 16777215, 4294967295];\n\n for (const value of testValues) {\n writeUint32LE(buffer, value, 0);\n const read = readUint32LE(buffer, 0);\n expect(read).toBe(value);\n }\n });\n\n it('should use little-endian byte order', () => {\n const buffer = new Uint8Array(4);\n writeUint32LE(buffer, 0x12345678, 0);\n expect(buffer[0]).toBe(0x78);\n expect(buffer[1]).toBe(0x56);\n expect(buffer[2]).toBe(0x34);\n expect(buffer[3]).toBe(0x12);\n });\n });\n\n describe('readUint16LE and readUint16BE', () => {\n it('should read uint16 little-endian correctly', () => {\n const buffer = new Uint8Array([0x78, 0x56]);\n expect(readUint16LE(buffer, 0)).toBe(0x5678);\n });\n\n it('should read uint16 big-endian correctly', () => {\n const buffer = new Uint8Array([0x56, 0x78]);\n expect(readUint16BE(buffer, 0)).toBe(0x5678);\n });\n });\n\n describe('readUint32BE', () => {\n it('should read uint32 big-endian correctly', () => {\n const buffer = new Uint8Array([0x12, 0x34, 0x56, 0x78]);\n expect(readUint32BE(buffer, 0)).toBe(0x12345678);\n });\n });\n\n describe('decodeCanonicalQueryResult', () => {\n it('should decode empty result (0 rows)', () => {\n const buffer = new Uint8Array(4);\n writeUint32LE(buffer, 0, 0); // row count = 0\n\n const result = decodeCanonicalQueryResult(buffer);\n expect(result.length).toBe(0);\n });\n\n it('should throw on invalid data', () => {\n const buffer = new Uint8Array(2); // Too short\n expect(() => decodeCanonicalQueryResult(buffer)).toThrow('Data too short for row count');\n });\n });\n\n describe('parseAttestationPayload', () => {\n it.todo('should parse payload with ABI-encoded result (TODO: need to construct synthetic test data with valid ABI encoding - see examples/attestation/index.ts for working integration test)');\n\n it('should throw on invalid version', () => {\n const payload = new Uint8Array(1);\n expect(() => parseAttestationPayload(payload)).toThrow();\n });\n });\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["/**\n * Argument encoding for attestation requests\n *\n * This module encodes action arguments into the canonical format expected by\n * the node's request_attestation action. It uses kwil-js's native encoding\n * to ensure perfect compatibility with kwil-db's EncodedValue.MarshalBinary() format.\n */\n\nimport { Utils, Types } from '@trufnetwork/kwil-js';\nimport { AbiCoder } from 'ethers';\n\n/**\n * Type hint for specifying explicit types when encoding arguments.\n * Use Utils.DataType from kwil-js (e.g., Utils.DataType.Numeric(36, 18))\n *\n * DataInfo structure: { name: VarType, is_array: boolean, metadata?: number[] }\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type TypeHint = any;\n\n/**\n * Encodes action arguments into canonical bytes using kwil-js utilities.\n *\n * Format: [arg_count:uint32(LE)][length:uint32(LE)][encoded_arg1][length:uint32(LE)][encoded_arg2]...\n *\n * Each encoded_arg uses kwil-db's EncodedValue.MarshalBinary() format.\n *\n * @param args - Array of arguments to encode\n * @param types - Optional map of argument index to type hint (for NUMERIC, etc.)\n * @returns Encoded bytes\n * @throws Error if any argument cannot be encoded\n */\nexport function encodeActionArgs(args: any[], types?: Record<number, TypeHint>): Uint8Array {\n // Calculate total size needed\n const encodedArgs: Uint8Array[] = [];\n let totalSize = 4; // arg_count (uint32)\n\n // Encode each argument using kwil-js utilities\n for (let i = 0; i < args.length; i++) {\n try {\n // Convert value to EncodedValue using kwil-js\n // If type hint is provided, use it; otherwise let kwil-js infer the type\n const typeHint = types?.[i];\n const encodedValue: Types.EncodedValue = Utils.formatEncodedValue(args[i], typeHint);\n\n // Serialize EncodedValue to bytes using kwil-js\n const argBytes = Utils.encodeEncodedValue(encodedValue);\n\n encodedArgs.push(argBytes);\n totalSize += 4 + argBytes.length; // length prefix + data\n } catch (err) {\n throw new Error(`Failed to encode arg ${i}: ${err}`);\n }\n }\n\n // Allocate buffer\n const buffer = new Uint8Array(totalSize);\n let offset = 0;\n\n // Write argument count (little-endian uint32)\n writeUint32LE(buffer, args.length, offset);\n offset += 4;\n\n // Write each encoded argument with length prefix\n for (let i = 0; i < encodedArgs.length; i++) {\n const encodedArg = encodedArgs[i];\n\n // Write length (little-endian uint32)\n writeUint32LE(buffer, encodedArg.length, offset);\n offset += 4;\n\n // Write encoded argument bytes\n buffer.set(encodedArg, offset);\n offset += encodedArg.length;\n }\n\n return buffer;\n}\n\n/**\n * Decodes canonical bytes back into action arguments.\n * This is the inverse of encodeActionArgs.\n *\n * @param data - Encoded argument bytes\n * @returns Array of decoded values\n */\nexport function decodeActionArgs(data: Uint8Array): any[] {\n if (data.length < 4) {\n throw new Error('Data too short for arg count');\n }\n\n let offset = 0;\n const argCount = readUint32LE(data, offset);\n offset += 4;\n\n const args: any[] = [];\n for (let i = 0; i < argCount; i++) {\n if (offset + 4 > data.length) {\n throw new Error(`Data too short for arg ${i} length`);\n }\n\n const argLen = readUint32LE(data, offset);\n offset += 4;\n\n if (offset + argLen > data.length) {\n throw new Error(`Data too short for arg ${i} bytes`);\n }\n\n const argBytes = data.slice(offset, offset + argLen);\n const { value: decodedArg } = decodeEncodedValue(argBytes, 0);\n args.push(decodedValueToJS(decodedArg));\n offset += argLen;\n }\n\n return args;\n}\n\n/**\n * Decodes ABI-encoded query_components tuple.\n * Format: (address data_provider, bytes32 stream_id, string action_id, bytes args)\n *\n * @param encoded - ABI-encoded bytes\n * @returns Object with decoded components\n */\nexport function decodeQueryComponents(encoded: Uint8Array): {\n dataProvider: string;\n streamId: string;\n actionId: string;\n args: Uint8Array;\n} {\n const abiCoder = AbiCoder.defaultAbiCoder();\n const decoded = abiCoder.decode(\n ['address', 'bytes32', 'string', 'bytes'],\n encoded\n );\n\n // Trim trailing null bytes from streamId (bytes32)\n const streamIdBytes = hexToBytes(decoded[1]);\n let lastNonZero = -1;\n for (let i = 31; i >= 0; i--) {\n if (streamIdBytes[i] !== 0) {\n lastNonZero = i;\n break;\n }\n }\n const streamId = new TextDecoder().decode(streamIdBytes.slice(0, lastNonZero + 1));\n\n return {\n dataProvider: decoded[0].toLowerCase(),\n streamId,\n actionId: decoded[2],\n args: hexToBytes(decoded[3]),\n };\n}\n\n/**\n * Helper to convert hex string to Uint8Array\n */\nfunction hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.startsWith('0x') ? hex.slice(2) : hex;\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < cleanHex.length; i += 2) {\n bytes[i / 2] = parseInt(cleanHex.slice(i, i + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Writes a uint32 value in little-endian format\n * Used for writing arg count and length prefixes\n *\n * @param buffer - Target buffer\n * @param value - Value to write\n * @param offset - Offset in buffer\n */\nfunction writeUint32LE(buffer: Uint8Array, value: number, offset: number): void {\n buffer[offset] = value & 0xff;\n buffer[offset + 1] = (value >> 8) & 0xff;\n buffer[offset + 2] = (value >> 16) & 0xff;\n buffer[offset + 3] = (value >> 24) & 0xff;\n}\n\n/**\n * Reads a uint32 value in little-endian format\n *\n * @param buffer - Source buffer\n * @param offset - Offset in buffer\n * @returns The uint32 value\n */\nexport function readUint32LE(buffer: Uint8Array, offset: number): number {\n return (\n buffer[offset] |\n (buffer[offset + 1] << 8) |\n (buffer[offset + 2] << 16) |\n (buffer[offset + 3] << 24)\n ) >>> 0; // Convert to unsigned 32-bit integer\n}\n\n/**\n * Reads a uint16 value in little-endian format\n *\n * @param buffer - Source buffer\n * @param offset - Offset in buffer\n * @returns The uint16 value\n */\nexport function readUint16LE(buffer: Uint8Array, offset: number): number {\n return (buffer[offset] | (buffer[offset + 1] << 8)) >>> 0;\n}\n\n/**\n * Reads a uint32 value in big-endian format\n *\n * @param buffer - Source buffer\n * @param offset - Offset in buffer\n * @returns The uint32 value\n */\nexport function readUint32BE(buffer: Uint8Array, offset: number): number {\n return (\n (buffer[offset] << 24) |\n (buffer[offset + 1] << 16) |\n (buffer[offset + 2] << 8) |\n buffer[offset + 3]\n ) >>> 0;\n}\n\n/**\n * Reads a uint16 value in big-endian format\n *\n * @param buffer - Source buffer\n * @param offset - Offset in buffer\n * @returns The uint16 value\n */\nexport function readUint16BE(buffer: Uint8Array, offset: number): number {\n return ((buffer[offset] << 8) | buffer[offset + 1]) >>> 0;\n}\n\n/**\n * Decoded data type information\n */\nexport interface DecodedDataType {\n name: string;\n is_array: boolean;\n metadata: number[];\n}\n\n/**\n * Decoded EncodedValue structure\n */\nexport interface DecodedEncodedValue {\n type: DecodedDataType;\n data: Uint8Array[];\n}\n\n/**\n * Decoded query result row\n */\nexport interface DecodedRow {\n values: any[];\n}\n\n/**\n * Parsed attestation payload structure\n */\nexport interface ParsedAttestationPayload {\n version: number;\n algorithm: number;\n blockHeight: bigint;\n dataProvider: string;\n streamId: string;\n actionId: number;\n arguments: any[];\n result: DecodedRow[];\n}\n\n/**\n * Decodes DataType from bytes (reverse of encodeDataType)\n *\n * @param buffer - Source buffer\n * @param offset - Starting offset\n * @returns Decoded data type and new offset\n */\nfunction decodeDataType(buffer: Uint8Array, offset: number): { type: DecodedDataType; offset: number } {\n // Version (uint16 BE)\n const version = readUint16BE(buffer, offset);\n offset += 2;\n\n if (version !== 0) {\n throw new Error(`Unsupported DataType version: ${version}`);\n }\n\n // Name length (uint32 BE)\n const nameLen = readUint32BE(buffer, offset);\n offset += 4;\n\n // Name bytes\n const nameBytes = buffer.slice(offset, offset + nameLen);\n const name = new TextDecoder().decode(nameBytes);\n offset += nameLen;\n\n // is_array (1 byte boolean)\n const is_array = buffer[offset] === 1;\n offset += 1;\n\n // Metadata (2 x uint16 BE)\n const metadata0 = readUint16BE(buffer, offset);\n offset += 2;\n const metadata1 = readUint16BE(buffer, offset);\n offset += 2;\n\n return {\n type: {\n name,\n is_array,\n metadata: [metadata0, metadata1],\n },\n offset,\n };\n}\n\n/**\n * Decodes an EncodedValue from bytes (reverse of encodeEncodedValue)\n *\n * @param buffer - Source buffer containing the encoded value\n * @param offset - Starting offset (default 0)\n * @returns Decoded value and new offset\n */\nexport function decodeEncodedValue(\n buffer: Uint8Array,\n offset: number = 0\n): { value: DecodedEncodedValue; offset: number } {\n // Version (uint16 LE)\n const version = readUint16LE(buffer, offset);\n offset += 2;\n\n if (version !== 0) {\n throw new Error(`Unsupported EncodedValue version: ${version}`);\n }\n\n // Type length (uint32 LE)\n const typeLen = readUint32LE(buffer, offset);\n offset += 4;\n\n // Type bytes\n const typeBytes = buffer.slice(offset, offset + typeLen);\n const { type } = decodeDataType(typeBytes, 0);\n offset += typeLen;\n\n // Data array length (uint16 LE)\n const dataLen = readUint16LE(buffer, offset);\n offset += 2;\n\n // Data items\n const data: Uint8Array[] = [];\n for (let i = 0; i < dataLen; i++) {\n // Data item length (uint32 LE)\n const itemLen = readUint32LE(buffer, offset);\n offset += 4;\n\n // Data item bytes\n const itemBytes = buffer.slice(offset, offset + itemLen);\n data.push(itemBytes);\n offset += itemLen;\n }\n\n return {\n value: { type, data },\n offset,\n };\n}\n\n/**\n * Converts a decoded EncodedValue to a JavaScript value\n *\n * @param decoded - Decoded EncodedValue\n * @returns JavaScript value (string, number, boolean, null, Uint8Array, or array)\n */\nexport function decodedValueToJS(decoded: DecodedEncodedValue): any {\n // Handle NULL values (data array is empty or first item indicates null)\n if (decoded.data.length === 0) {\n return null;\n }\n\n // Check the null indicator (first byte of first data item)\n const firstItem = decoded.data[0];\n if (firstItem.length === 0 || firstItem[0] === 0) {\n return null;\n }\n\n // Extract actual value bytes (skip null indicator byte)\n const valueBytes = firstItem.slice(1);\n\n // Decode based on type name\n const typeName = decoded.type.name.toLowerCase();\n\n if (decoded.type.is_array) {\n // Handle array types\n const result: any[] = [];\n for (const item of decoded.data) {\n if (item.length === 0 || item[0] === 0) {\n result.push(null);\n } else {\n const itemBytes = item.slice(1);\n result.push(decodeSingleValue(typeName, itemBytes));\n }\n }\n return result;\n }\n\n // Handle scalar types\n return decodeSingleValue(typeName, valueBytes);\n}\n\n/**\n * Decodes a single value based on type name\n */\nfunction decodeSingleValue(typeName: string, bytes: Uint8Array): any {\n switch (typeName) {\n case 'text':\n case 'uuid':\n return new TextDecoder().decode(bytes);\n\n case 'int':\n case 'int8':\n case 'integer':\n // Decode as 8-byte signed int64 (big-endian as per kwil-db)\n if (bytes.length === 8) {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n // Use getBigInt64 to properly decode signed int64\n return view.getBigInt64(0, false); // false = big-endian\n }\n throw new Error(`Invalid integer byte length: expected 8, got ${bytes.length}`);\n\n case 'bool':\n case 'boolean':\n return bytes.length > 0 && bytes[0] === 1;\n\n case 'numeric':\n case 'decimal':\n return new TextDecoder().decode(bytes);\n\n case 'bytea':\n case 'blob':\n return bytes;\n\n default:\n // Unknown type, return as string if possible\n try {\n return new TextDecoder().decode(bytes);\n } catch {\n return bytes;\n }\n }\n}\n\n/**\n * Decodes canonical query result bytes into rows and columns\n *\n * Format:\n * [row_count: uint32 LE]\n * [col_count: uint32 LE]\n * [col_len: uint32 LE][col_bytes: EncodedValue.MarshalBinary()]\n * ...\n * [col_count: uint32 LE]\n * ...\n *\n * @param data - Canonical query result bytes\n * @returns Array of decoded rows\n */\nexport function decodeCanonicalQueryResult(data: Uint8Array): DecodedRow[] {\n let offset = 0;\n\n // Row count (uint32 LE)\n if (data.length < 4) {\n throw new Error('Data too short for row count');\n }\n\n const rowCount = readUint32LE(data, offset);\n offset += 4;\n\n const rows: DecodedRow[] = [];\n\n for (let i = 0; i < rowCount; i++) {\n // Column count (uint32 LE)\n if (offset + 4 > data.length) {\n throw new Error(`Data too short for column count at row ${i}`);\n }\n\n const colCount = readUint32LE(data, offset);\n offset += 4;\n\n const values: any[] = [];\n\n for (let j = 0; j < colCount; j++) {\n // Column length (uint32 LE)\n if (offset + 4 > data.length) {\n throw new Error(`Data too short for column ${j} length at row ${i}`);\n }\n\n const colLen = readUint32LE(data, offset);\n offset += 4;\n\n // Column bytes\n if (offset + colLen > data.length) {\n throw new Error(`Data too short for column ${j} bytes at row ${i}`);\n }\n\n const colBytes = data.slice(offset, offset + colLen);\n\n // Decode the EncodedValue\n const { value: decodedValue } = decodeEncodedValue(colBytes, 0);\n\n // Convert to JavaScript value\n const jsValue = decodedValueToJS(decodedValue);\n values.push(jsValue);\n\n offset += colLen;\n }\n\n rows.push({ values });\n }\n\n return rows;\n}\n\n/**\n * Decodes ABI-encoded datapoints result (timestamps and values)\n *\n * Format: abi.encode(uint256[] timestamps, int256[] values)\n *\n * @param data - ABI-encoded bytes\n * @returns Array of decoded rows with [timestamp, value] pairs\n */\nexport function decodeABIDatapoints(data: Uint8Array): DecodedRow[] {\n // Handle empty data\n if (!data || data.length === 0) {\n return [];\n }\n\n const abiCoder = AbiCoder.defaultAbiCoder();\n\n try {\n // Decode as (uint256[], int256[])\n const decoded = abiCoder.decode(\n ['uint256[]', 'int256[]'],\n data\n );\n\n const timestamps = decoded[0] as bigint[];\n const values = decoded[1] as bigint[];\n\n if (timestamps.length !== values.length) {\n throw new Error(`Timestamp/value array length mismatch: ${timestamps.length} vs ${values.length}`);\n }\n\n const rows: DecodedRow[] = [];\n for (let i = 0; i < timestamps.length; i++) {\n rows.push({\n values: [\n timestamps[i].toString(),\n // Convert from 18-decimal fixed point to decimal string\n formatFixedPoint(values[i], 18)\n ]\n });\n }\n\n return rows;\n } catch (err) {\n throw new Error(`Failed to decode ABI datapoints: ${err}`);\n }\n}\n\n/**\n * Formats a fixed-point integer value to decimal string\n *\n * @param value - BigInt value with fixed decimals\n * @param decimals - Number of decimal places\n * @returns Formatted decimal string\n */\nfunction formatFixedPoint(value: bigint, decimals: number): string {\n const isNegative = value < 0n;\n const absValue = isNegative ? -value : value;\n\n const divisor = 10n ** BigInt(decimals);\n const integerPart = absValue / divisor;\n const fractionalPart = absValue % divisor;\n\n // Pad fractional part with leading zeros\n const fractionalStr = fractionalPart.toString().padStart(decimals, '0');\n\n // Remove trailing zeros from fractional part\n const trimmedFractional = fractionalStr.replace(/0+$/, '');\n\n if (trimmedFractional === '') {\n return `${isNegative ? '-' : ''}${integerPart}`;\n }\n\n return `${isNegative ? '-' : ''}${integerPart}.${trimmedFractional}`;\n}\n\n/**\n * Parses a canonical attestation payload (without signature)\n *\n * Payload format:\n * 1. Version (1 byte)\n * 2. Algorithm (1 byte, 0 = secp256k1)\n * 3. Block height (8 bytes, uint64 big-endian)\n * 4. Data provider (length-prefixed with 4 bytes big-endian)\n * 5. Stream ID (length-prefixed with 4 bytes big-endian)\n * 6. Action ID (2 bytes, uint16 big-endian)\n * 7. Arguments (length-prefixed with 4 bytes big-endian)\n * 8. Result (length-prefixed with 4 bytes big-endian)\n *\n * @param payload - Canonical payload bytes (without 65-byte signature)\n * @returns Parsed payload structure\n */\nexport function parseAttestationPayload(payload: Uint8Array): ParsedAttestationPayload {\n let offset = 0;\n\n // 1. Version (1 byte)\n if (payload.length < 1) {\n throw new Error('Payload too short for version');\n }\n const version = payload[offset];\n offset += 1;\n\n // 2. Algorithm (1 byte)\n if (offset >= payload.length) {\n throw new Error('Payload too short for algorithm');\n }\n const algorithm = payload[offset];\n offset += 1;\n\n // 3. Block height (8 bytes, uint64 big-endian)\n if (offset + 8 > payload.length) {\n throw new Error('Payload too short for block height');\n }\n const blockHeightHigh = readUint32BE(payload, offset);\n const blockHeightLow = readUint32BE(payload, offset + 4);\n const blockHeight = (BigInt(blockHeightHigh) << 32n) | BigInt(blockHeightLow);\n offset += 8;\n\n // 4. Data provider (length-prefixed, 4 bytes big-endian)\n if (offset + 4 > payload.length) {\n throw new Error('Payload too short for data provider length');\n }\n const dataProviderLen = readUint32BE(payload, offset);\n offset += 4;\n\n if (offset + dataProviderLen > payload.length) {\n throw new Error('Payload too short for data provider');\n }\n const dataProviderBytes = payload.slice(offset, offset + dataProviderLen);\n // Data provider is typically a hex address (20 bytes for Ethereum address)\n // Try to decode as UTF-8 first, if it looks like a hex string keep it\n // Otherwise convert bytes to hex\n let dataProvider: string;\n if (dataProviderLen === 20) {\n // Likely an Ethereum address (20 bytes)\n dataProvider = '0x' + Array.from(dataProviderBytes).map(b => b.toString(16).padStart(2, '0')).join('');\n } else {\n // Try UTF-8 decoding\n try {\n const decoded = new TextDecoder().decode(dataProviderBytes);\n // Check if it looks like a hex address string (starts with \"0x\")\n if (decoded.startsWith('0x') && /^0x[0-9a-fA-F]+$/.test(decoded)) {\n dataProvider = decoded;\n } else {\n // Assume it's a valid UTF-8 string\n dataProvider = decoded;\n }\n } catch {\n // Fallback to hex\n dataProvider = '0x' + Array.from(dataProviderBytes).map(b => b.toString(16).padStart(2, '0')).join('');\n }\n }\n offset += dataProviderLen;\n\n // 5. Stream ID (length-prefixed, 4 bytes big-endian)\n if (offset + 4 > payload.length) {\n throw new Error('Payload too short for stream ID length');\n }\n const streamIdLen = readUint32BE(payload, offset);\n offset += 4;\n\n if (offset + streamIdLen > payload.length) {\n throw new Error('Payload too short for stream ID');\n }\n const streamIdBytes = payload.slice(offset, offset + streamIdLen);\n const streamId = new TextDecoder().decode(streamIdBytes);\n offset += streamIdLen;\n\n // 6. Action ID (2 bytes, uint16 big-endian)\n if (offset + 2 > payload.length) {\n throw new Error('Payload too short for action ID');\n }\n const actionId = readUint16BE(payload, offset);\n offset += 2;\n\n // 7. Arguments (length-prefixed, 4 bytes big-endian)\n if (offset + 4 > payload.length) {\n throw new Error('Payload too short for arguments length');\n }\n const argsLen = readUint32BE(payload, offset);\n offset += 4;\n\n if (offset + argsLen > payload.length) {\n throw new Error('Payload too short for arguments');\n }\n const argsBytes = payload.slice(offset, offset + argsLen);\n offset += argsLen;\n\n // Decode arguments\n let args: any[] = [];\n if (argsLen > 0) {\n let argsOffset = 0;\n\n // Arguments format: [arg_count: uint32 LE][length: uint32 LE][encoded_arg]...\n const argCount = readUint32LE(argsBytes, argsOffset);\n argsOffset += 4;\n\n for (let i = 0; i < argCount; i++) {\n const argLen = readUint32LE(argsBytes, argsOffset);\n argsOffset += 4;\n\n const argBytes = argsBytes.slice(argsOffset, argsOffset + argLen);\n const { value: decodedArg } = decodeEncodedValue(argBytes, 0);\n args.push(decodedValueToJS(decodedArg));\n argsOffset += argLen;\n }\n }\n\n // 8. Result (length-prefixed, 4 bytes big-endian)\n if (offset + 4 > payload.length) {\n throw new Error('Payload too short for result length');\n }\n const resultLen = readUint32BE(payload, offset);\n offset += 4;\n\n if (offset + resultLen > payload.length) {\n throw new Error('Payload too short for result');\n }\n const resultBytes = payload.slice(offset, offset + resultLen);\n\n // Decode result (ABI-encoded as uint256[], int256[])\n const result = decodeABIDatapoints(resultBytes);\n\n return {\n version,\n algorithm,\n blockHeight,\n dataProvider,\n streamId,\n actionId,\n arguments: args,\n result,\n };\n}\n\n// Inline unit tests\nif (import.meta.vitest) {\n const { describe, it, expect } = import.meta.vitest;\n\n describe('encodeActionArgs', () => {\n it('should encode empty args', () => {\n const encoded = encodeActionArgs([]);\n expect(encoded.length).toBe(4); // Just arg_count\n expect(readUint32LE(encoded, 0)).toBe(0);\n });\n\n it('should encode single string arg', () => {\n const encoded = encodeActionArgs(['hello']);\n expect(encoded.length).toBeGreaterThan(4);\n expect(readUint32LE(encoded, 0)).toBe(1); // arg_count = 1\n\n // Check length prefix and data\n const argLen = readUint32LE(encoded, 4);\n expect(argLen).toBeGreaterThan(0);\n });\n\n it('should encode single number arg', () => {\n const encoded = encodeActionArgs([42]);\n expect(encoded.length).toBeGreaterThan(4);\n expect(readUint32LE(encoded, 0)).toBe(1); // arg_count = 1\n });\n\n it('should encode null arg', () => {\n const encoded = encodeActionArgs([null]);\n expect(encoded.length).toBeGreaterThan(4);\n expect(readUint32LE(encoded, 0)).toBe(1); // arg_count = 1\n\n // kwil-js handles null encoding internally\n const argLen = readUint32LE(encoded, 4);\n expect(argLen).toBeGreaterThan(0);\n });\n\n it('should encode boolean arg', () => {\n const encoded = encodeActionArgs([true]);\n expect(encoded.length).toBeGreaterThan(4);\n expect(readUint32LE(encoded, 0)).toBe(1); // arg_count = 1\n });\n\n it('should encode Uint8Array arg', () => {\n const bytes = new Uint8Array([1, 2, 3, 4]);\n const encoded = encodeActionArgs([bytes]);\n expect(encoded.length).toBeGreaterThan(4);\n expect(readUint32LE(encoded, 0)).toBe(1); // arg_count = 1\n });\n\n it('should encode multiple args of different types', () => {\n const encoded = encodeActionArgs(['hello', 42, true, null]);\n expect(readUint32LE(encoded, 0)).toBe(4); // arg_count = 4\n expect(encoded.length).toBeGreaterThan(4);\n });\n\n it('should encode real-world get_record args', () => {\n const dataProvider = '0x4710a8d8f0d845da110086812a32de6d90d7ff5c';\n const streamId = 'stai0000000000000000000000000000';\n const fromTime = 1234567890;\n const toTime = 1234567900;\n const frozenAt = null;\n const useCache = false;\n\n const encoded = encodeActionArgs([\n dataProvider,\n streamId,\n fromTime,\n toTime,\n frozenAt,\n useCache,\n ]);\n\n expect(readUint32LE(encoded, 0)).toBe(6); // arg_count = 6\n expect(encoded.length).toBeGreaterThan(4);\n });\n\n it('should handle large strings', () => {\n const largeString = 'a'.repeat(10000);\n const encoded = encodeActionArgs([largeString]);\n expect(readUint32LE(encoded, 0)).toBe(1);\n expect(encoded.length).toBeGreaterThan(10000);\n });\n\n it('should encode array args', () => {\n const encoded = encodeActionArgs([['a', 'b', 'c']]);\n expect(readUint32LE(encoded, 0)).toBe(1); // arg_count = 1\n expect(encoded.length).toBeGreaterThan(4);\n });\n });\n\n describe('decodeActionArgs', () => {\n it('should decode empty args', () => {\n const original: any[] = [];\n const encoded = encodeActionArgs(original);\n const decoded = decodeActionArgs(encoded);\n expect(decoded).toEqual(original);\n });\n\n it('should decode single string arg', () => {\n const original = ['hello'];\n const encoded = encodeActionArgs(original);\n const decoded = decodeActionArgs(encoded);\n expect(decoded).toEqual(original);\n });\n\n it('should decode single number arg', () => {\n const original = [42];\n const encoded = encodeActionArgs(original);\n const decoded = decodeActionArgs(encoded);\n expect(Number(decoded[0])).toBe(42);\n });\n\n it('should decode multiple args of different types', () => {\n const original = ['hello', 42, true];\n const encoded = encodeActionArgs(original);\n const decoded = decodeActionArgs(encoded);\n expect(decoded[0]).toBe('hello');\n expect(Number(decoded[1])).toBe(42);\n expect(decoded[2]).toBe(true);\n });\n });\n\n describe('writeUint32LE and readUint32LE', () => {\n it('should round-trip uint32 values', () => {\n const buffer = new Uint8Array(4);\n const testValues = [0, 1, 255, 256, 65535, 16777215, 4294967295];\n\n for (const value of testValues) {\n writeUint32LE(buffer, value, 0);\n const read = readUint32LE(buffer, 0);\n expect(read).toBe(value);\n }\n });\n\n it('should use little-endian byte order', () => {\n const buffer = new Uint8Array(4);\n writeUint32LE(buffer, 0x12345678, 0);\n expect(buffer[0]).toBe(0x78);\n expect(buffer[1]).toBe(0x56);\n expect(buffer[2]).toBe(0x34);\n expect(buffer[3]).toBe(0x12);\n });\n });\n\n describe('readUint16LE and readUint16BE', () => {\n it('should read uint16 little-endian correctly', () => {\n const buffer = new Uint8Array([0x78, 0x56]);\n expect(readUint16LE(buffer, 0)).toBe(0x5678);\n });\n\n it('should read uint16 big-endian correctly', () => {\n const buffer = new Uint8Array([0x56, 0x78]);\n expect(readUint16BE(buffer, 0)).toBe(0x5678);\n });\n });\n\n describe('readUint32BE', () => {\n it('should read uint32 big-endian correctly', () => {\n const buffer = new Uint8Array([0x12, 0x34, 0x56, 0x78]);\n expect(readUint32BE(buffer, 0)).toBe(0x12345678);\n });\n });\n\n describe('decodeCanonicalQueryResult', () => {\n it('should decode empty result (0 rows)', () => {\n const buffer = new Uint8Array(4);\n writeUint32LE(buffer, 0, 0); // row count = 0\n\n const result = decodeCanonicalQueryResult(buffer);\n expect(result.length).toBe(0);\n });\n\n it('should throw on invalid data', () => {\n const buffer = new Uint8Array(2); // Too short\n expect(() => decodeCanonicalQueryResult(buffer)).toThrow('Data too short for row count');\n });\n });\n\n describe('parseAttestationPayload', () => {\n it.todo('should parse payload with ABI-encoded result (TODO: need to construct synthetic test data with valid ABI encoding - see examples/attestation/index.ts for working integration test)');\n\n it('should throw on invalid version', () => {\n const payload = new Uint8Array(1);\n expect(() => parseAttestationPayload(payload)).toThrow();\n });\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -22,6 +22,7 @@ var orderbookHelpers_exports = {};
|
|
|
22
22
|
__export(orderbookHelpers_exports, {
|
|
23
23
|
bytesToHex: () => bytesToHex,
|
|
24
24
|
dbBytesToUint8Array: () => dbBytesToUint8Array,
|
|
25
|
+
decodeMarketData: () => decodeMarketData,
|
|
25
26
|
encodeActionArgs: () => encodeActionArgs,
|
|
26
27
|
encodeEqualsActionArgs: () => encodeEqualsActionArgs,
|
|
27
28
|
encodeQueryComponents: () => encodeQueryComponents,
|
|
@@ -39,6 +40,45 @@ module.exports = __toCommonJS(orderbookHelpers_exports);
|
|
|
39
40
|
var import_ethers = require("ethers");
|
|
40
41
|
var import_kwil_js = require("@trufnetwork/kwil-js");
|
|
41
42
|
var import_AttestationEncoding = require("./AttestationEncoding.cjs");
|
|
43
|
+
function decodeMarketData(encoded) {
|
|
44
|
+
const bytes = dbBytesToUint8Array(encoded);
|
|
45
|
+
const { dataProvider, streamId, actionId, args: argsBytes } = (0, import_AttestationEncoding.decodeQueryComponents)(bytes);
|
|
46
|
+
const args = (0, import_AttestationEncoding.decodeActionArgs)(argsBytes);
|
|
47
|
+
const market = {
|
|
48
|
+
dataProvider,
|
|
49
|
+
streamId,
|
|
50
|
+
actionId,
|
|
51
|
+
type: "unknown",
|
|
52
|
+
thresholds: []
|
|
53
|
+
};
|
|
54
|
+
switch (actionId) {
|
|
55
|
+
case "price_above_threshold":
|
|
56
|
+
market.type = "above";
|
|
57
|
+
if (args.length >= 4) {
|
|
58
|
+
market.thresholds.push(args[3].toString());
|
|
59
|
+
}
|
|
60
|
+
break;
|
|
61
|
+
case "price_below_threshold":
|
|
62
|
+
market.type = "below";
|
|
63
|
+
if (args.length >= 4) {
|
|
64
|
+
market.thresholds.push(args[3].toString());
|
|
65
|
+
}
|
|
66
|
+
break;
|
|
67
|
+
case "value_in_range":
|
|
68
|
+
market.type = "between";
|
|
69
|
+
if (args.length >= 5) {
|
|
70
|
+
market.thresholds.push(args[3].toString(), args[4].toString());
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
case "value_equals":
|
|
74
|
+
market.type = "equals";
|
|
75
|
+
if (args.length >= 5) {
|
|
76
|
+
market.thresholds.push(args[3].toString(), args[4].toString());
|
|
77
|
+
}
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
return market;
|
|
81
|
+
}
|
|
42
82
|
function encodeActionArgs(dataProvider, streamId, timestamp, threshold, frozenAt) {
|
|
43
83
|
return (0, import_AttestationEncoding.encodeActionArgs)(
|
|
44
84
|
[
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/util/orderbookHelpers.ts"],
|
|
4
|
-
"sourcesContent": ["/**\r\n * Order Book Helper Utilities\r\n *\r\n * Provides encoding functions for query components and byte conversion utilities.\r\n */\r\n\r\nimport { ethers } from \"ethers\";\r\nimport { Utils } from \"@trufnetwork/kwil-js\";\r\nimport { encodeActionArgs as encodeActionArgsKwil } from \"./AttestationEncoding\";\r\n\r\n/**\r\n * Encodes action arguments for order book queries using Kwil's native encoding.\r\n *\r\n * @param dataProvider - Data provider's Ethereum address\r\n * @param streamId - Stream ID (32 characters)\r\n * @param timestamp - Unix timestamp for price/value check\r\n * @param threshold - Threshold value (as decimal string, e.g., \"50000.00\")\r\n * @param frozenAt - Block height for data snapshot (0 for latest)\r\n * @returns Kwil-encoded bytes compatible with call_dispatch\r\n *\r\n * @example\r\n * ```typescript\r\n * const args = encodeActionArgs(\r\n * \"0x1234567890abcdef1234567890abcdef12345678\",\r\n * \"my_stream_id____________________\", // 32 chars\r\n * 1700000000,\r\n * \"50000.00\",\r\n * 0\r\n * );\r\n * ```\r\n */\r\nexport function encodeActionArgs(\r\n dataProvider: string,\r\n streamId: string,\r\n timestamp: number,\r\n threshold: string,\r\n frozenAt: number\r\n): Uint8Array {\r\n // Use Kwil's native encoding format which is compatible with call_dispatch\r\n // The price_above_threshold action expects: ($data_provider TEXT, $stream_id TEXT, $timestamp INT8, $threshold NUMERIC(36, 18), $frozen_at INT8)\r\n return encodeActionArgsKwil(\r\n [\r\n dataProvider.toLowerCase(), // TEXT: data provider address\r\n streamId, // TEXT: stream ID\r\n timestamp, // INT8: timestamp\r\n threshold, // NUMERIC: threshold - must specify type explicitly\r\n frozenAt === 0 ? null : frozenAt, // INT8: frozen_at (null for latest)\r\n ],\r\n {\r\n // Argument 3 (threshold) must be NUMERIC(36, 18) to match price_above_threshold action signature\r\n 3: Utils.DataType.Numeric(36, 18),\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Encodes action arguments for range-based markets using Kwil's native encoding.\r\n *\r\n * @param dataProvider - Data provider's Ethereum address\r\n * @param streamId - Stream ID\r\n * @param timestamp - Unix timestamp\r\n * @param minValue - Minimum value of range\r\n * @param maxValue - Maximum value of range\r\n * @param frozenAt - Block height (0 for latest)\r\n * @returns Kwil-encoded bytes compatible with call_dispatch\r\n */\r\nexport function encodeRangeActionArgs(\r\n dataProvider: string,\r\n streamId: string,\r\n timestamp: number,\r\n minValue: string,\r\n maxValue: string,\r\n frozenAt: number\r\n): Uint8Array {\r\n // value_in_range expects: ($data_provider TEXT, $stream_id TEXT, $timestamp INT8, $min_value NUMERIC, $max_value NUMERIC, $frozen_at INT8)\r\n return encodeActionArgsKwil(\r\n [\r\n dataProvider.toLowerCase(),\r\n streamId,\r\n timestamp,\r\n minValue,\r\n maxValue,\r\n frozenAt === 0 ? null : frozenAt,\r\n ],\r\n {\r\n // Arguments 3, 4 (minValue, maxValue) must be NUMERIC(36, 18)\r\n 3: Utils.DataType.Numeric(36, 18),\r\n 4: Utils.DataType.Numeric(36, 18),\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Encodes action arguments for value equals markets using Kwil's native encoding.\r\n *\r\n * @param dataProvider - Data provider's Ethereum address\r\n * @param streamId - Stream ID\r\n * @param timestamp - Unix timestamp\r\n * @param targetValue - Target value\r\n * @param tolerance - Acceptable tolerance\r\n * @param frozenAt - Block height (0 for latest)\r\n * @returns Kwil-encoded bytes compatible with call_dispatch\r\n */\r\nexport function encodeEqualsActionArgs(\r\n dataProvider: string,\r\n streamId: string,\r\n timestamp: number,\r\n targetValue: string,\r\n tolerance: string,\r\n frozenAt: number\r\n): Uint8Array {\r\n // value_equals expects: ($data_provider TEXT, $stream_id TEXT, $timestamp INT8, $target NUMERIC, $tolerance NUMERIC, $frozen_at INT8)\r\n return encodeActionArgsKwil(\r\n [\r\n dataProvider.toLowerCase(),\r\n streamId,\r\n timestamp,\r\n targetValue,\r\n tolerance,\r\n frozenAt === 0 ? null : frozenAt,\r\n ],\r\n {\r\n // Arguments 3, 4 (targetValue, tolerance) must be NUMERIC(36, 18)\r\n 3: Utils.DataType.Numeric(36, 18),\r\n 4: Utils.DataType.Numeric(36, 18),\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Encodes full query components for market creation.\r\n *\r\n * The query components are ABI-encoded as a tuple:\r\n * (address dataProvider, bytes32 streamId, string actionId, bytes args)\r\n *\r\n * @param dataProvider - Data provider's Ethereum address\r\n * @param streamId - Stream ID (will be padded to 32 bytes)\r\n * @param actionId - Action identifier (e.g., \"price_above_threshold\")\r\n * @param args - Pre-encoded action arguments from encodeActionArgs()\r\n * @returns ABI-encoded query components\r\n *\r\n * @example\r\n * ```typescript\r\n * const args = encodeActionArgs(...);\r\n * const queryComponents = encodeQueryComponents(\r\n * \"0x1234567890abcdef1234567890abcdef12345678\",\r\n * \"my_stream_id____________________\",\r\n * \"price_above_threshold\",\r\n * args\r\n * );\r\n * ```\r\n */\r\nexport function encodeQueryComponents(\r\n dataProvider: string,\r\n streamId: string,\r\n actionId: string,\r\n args: Uint8Array\r\n): Uint8Array {\r\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\r\n const streamIdBytes = stringToBytes32(streamId);\r\n\r\n const encoded = abiCoder.encode(\r\n [\"address\", \"bytes32\", \"string\", \"bytes\"],\r\n [dataProvider, streamIdBytes, actionId, args]\r\n );\r\n\r\n return ethers.getBytes(encoded);\r\n}\r\n\r\n/**\r\n * Converts a string to bytes32, padding with zeros if needed.\r\n *\r\n * @param str - String to convert (max 32 characters)\r\n * @returns bytes32 as hex string\r\n */\r\nexport function stringToBytes32(str: string): string {\r\n // Convert string to UTF-8 bytes\r\n const bytes = ethers.toUtf8Bytes(str);\r\n\r\n // Ensure it's not longer than 32 bytes\r\n if (bytes.length > 32) {\r\n throw new Error(`String too long for bytes32: ${str.length} characters`);\r\n }\r\n\r\n // Pad to 32 bytes\r\n return ethers.zeroPadValue(bytes, 32);\r\n}\r\n\r\n/**\r\n * Converts a hex string to Uint8Array.\r\n *\r\n * @param hex - Hex string (with or without 0x prefix)\r\n * @returns Uint8Array\r\n *\r\n * @example\r\n * ```typescript\r\n * const bytes = hexToBytes(\"0x1234abcd\");\r\n * const bytes2 = hexToBytes(\"1234abcd\");\r\n * ```\r\n */\r\nexport function hexToBytes(hex: string): Uint8Array {\r\n const cleanHex = hex.startsWith(\"0x\") ? hex : \"0x\" + hex;\r\n return ethers.getBytes(cleanHex);\r\n}\r\n\r\n/**\r\n * Checks if a string appears to be base64 encoded.\r\n *\r\n * @param str - String to check\r\n * @returns true if string appears to be base64\r\n */\r\nfunction isBase64(str: string): boolean {\r\n // Remove potential 0x prefix for checking\r\n const s = str.startsWith(\"0x\") ? str.slice(2) : str;\r\n // Base64 strings contain +, /, or = which are not valid hex\r\n return /[+/=]/.test(s) || !/^[0-9a-fA-F]*$/.test(s);\r\n}\r\n\r\n/**\r\n * Decodes a base64 string to Uint8Array.\r\n *\r\n * @param b64 - Base64 string (may have 0x prefix from kwil-js)\r\n * @returns Uint8Array\r\n */\r\nfunction base64ToBytes(b64: string): Uint8Array {\r\n // Remove potential 0x prefix that kwil-js might add\r\n const cleanB64 = b64.startsWith(\"0x\") ? b64.slice(2) : b64;\r\n\r\n // In Node.js, use Buffer\r\n if (typeof Buffer !== \"undefined\") {\r\n return new Uint8Array(Buffer.from(cleanB64, \"base64\"));\r\n }\r\n\r\n // In browser, use atob\r\n const binary = atob(cleanB64);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes;\r\n}\r\n\r\n/**\r\n * Converts a database bytes value (hex or base64) to Uint8Array.\r\n * kwil-js may return BYTEA as hex or base64 depending on version/context.\r\n *\r\n * @param value - Hex string, base64 string, or Uint8Array\r\n * @returns Uint8Array\r\n */\r\nexport function dbBytesToUint8Array(\r\n value: string | Uint8Array\r\n): Uint8Array {\r\n if (value instanceof Uint8Array) {\r\n return value;\r\n }\r\n\r\n if (typeof value === \"string\") {\r\n if (isBase64(value)) {\r\n return base64ToBytes(value);\r\n }\r\n return hexToBytes(value);\r\n }\r\n\r\n throw new Error(`Unexpected bytes value type: ${typeof value}`);\r\n}\r\n\r\n/**\r\n * Converts a Uint8Array to hex string with 0x prefix.\r\n *\r\n * @param bytes - Uint8Array to convert\r\n * @returns Hex string with 0x prefix\r\n *\r\n * @example\r\n * ```typescript\r\n * const hex = bytesToHex(new Uint8Array([0x12, 0x34]));\r\n * // Returns \"0x1234\"\r\n * ```\r\n */\r\nexport function bytesToHex(bytes: Uint8Array): string {\r\n return ethers.hexlify(bytes);\r\n}\r\n\r\n/**\r\n * Validates a price value for order operations.\r\n *\r\n * @param price - Price to validate (1-99)\r\n * @param operation - Operation name for error message\r\n * @throws Error if price is invalid\r\n */\r\nexport function validatePrice(price: number, operation: string): void {\r\n if (!Number.isInteger(price)) {\r\n throw new Error(`${operation}: Price must be an integer`);\r\n }\r\n if (price < 1 || price > 99) {\r\n throw new Error(`${operation}: Price must be between 1 and 99 cents`);\r\n }\r\n}\r\n\r\n/**\r\n * Validates an amount value for order operations.\r\n *\r\n * @param amount - Amount to validate (must be positive)\r\n * @param operation - Operation name for error message\r\n * @throws Error if amount is invalid\r\n */\r\nexport function validateAmount(amount: number, operation: string): void {\r\n if (!Number.isInteger(amount)) {\r\n throw new Error(`${operation}: Amount must be an integer`);\r\n }\r\n if (amount <= 0) {\r\n throw new Error(`${operation}: Amount must be positive`);\r\n }\r\n if (amount > 1_000_000_000) {\r\n throw new Error(`${operation}: Amount exceeds maximum (1,000,000,000)`);\r\n }\r\n}\r\n\r\n/**\r\n * Validates a bridge identifier.\r\n *\r\n * @param bridge - Bridge identifier to validate\r\n * @throws Error if bridge is invalid\r\n */\r\nexport function validateBridge(bridge: string): void {\r\n const validBridges = [\"hoodi_tt2\", \"sepolia_bridge\", \"ethereum_bridge\"];\r\n if (!validBridges.includes(bridge)) {\r\n throw new Error(\r\n `Invalid bridge: ${bridge}. Must be one of: ${validBridges.join(\", \")}`\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Validates max spread for market creation.\r\n *\r\n * @param maxSpread - Max spread to validate (1-50)\r\n * @throws Error if maxSpread is invalid\r\n */\r\nexport function validateMaxSpread(maxSpread: number): void {\r\n if (!Number.isInteger(maxSpread)) {\r\n throw new Error(\"Max spread must be an integer\");\r\n }\r\n if (maxSpread < 1 || maxSpread > 50) {\r\n throw new Error(\"Max spread must be between 1 and 50 cents\");\r\n }\r\n}\r\n\r\n/**\r\n * Validates settle time for market creation.\r\n *\r\n * @param settleTime - Unix timestamp to validate (must be in future)\r\n * @throws Error if settleTime is invalid\r\n */\r\nexport function validateSettleTime(settleTime: number): void {\r\n const now = Math.floor(Date.now() / 1000);\r\n if (settleTime <= now) {\r\n throw new Error(\"Settle time must be in the future\");\r\n }\r\n}\r\n\r\n/**\r\n * Converts settled filter boolean to the value for Kuneiform.\r\n *\r\n * @param filter - Boolean filter (null/undefined=all, true=unsettled, false=settled)\r\n * @returns Boolean or null (null=all, true/false=filter by settled status)\r\n */\r\nexport function settledFilterToBoolean(\r\n filter: boolean | null | undefined\r\n): boolean | null {\r\n if (filter === null || filter === undefined) {\r\n return null; // All markets\r\n }\r\n return filter; // true=unsettled, false=settled\r\n}\r\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,oBAAuB;AACvB,qBAAsB;AACtB,
|
|
4
|
+
"sourcesContent": ["/**\r\n * Order Book Helper Utilities\r\n *\r\n * Provides encoding functions for query components and byte conversion utilities.\r\n */\r\n\r\nimport { ethers } from \"ethers\";\r\nimport { Utils } from \"@trufnetwork/kwil-js\";\r\nimport {\r\n encodeActionArgs as encodeActionArgsKwil,\r\n decodeActionArgs,\r\n decodeQueryComponents\r\n} from \"./AttestationEncoding\";\r\n\r\n/**\r\n * Structured content of a prediction market's query components\r\n */\r\nexport interface MarketData {\r\n dataProvider: string;\r\n streamId: string;\r\n actionId: string;\r\n type: \"above\" | \"below\" | \"between\" | \"equals\" | \"unknown\";\r\n thresholds: string[];\r\n}\r\n\r\n/**\r\n * Decodes ABI-encoded query_components into high-level MarketData.\r\n *\r\n * @param encoded - ABI-encoded bytes (from marketInfo.queryComponents)\r\n * @returns Object with decoded market details\r\n *\r\n * @example\r\n * ```typescript\r\n * const market = decodeMarketData(marketInfo.queryComponents);\r\n * console.log(`Market type: ${market.type}, Threshold: ${market.thresholds[0]}`);\r\n * ```\r\n */\r\nexport function decodeMarketData(encoded: string | Uint8Array): MarketData {\r\n const bytes = dbBytesToUint8Array(encoded);\r\n const { dataProvider, streamId, actionId, args: argsBytes } = decodeQueryComponents(bytes);\r\n const args = decodeActionArgs(argsBytes);\r\n\r\n const market: MarketData = {\r\n dataProvider,\r\n streamId,\r\n actionId,\r\n type: \"unknown\",\r\n thresholds: [],\r\n };\r\n\r\n // Map action_id to market type and thresholds\r\n // Based on 040-binary-attestation-actions.sql\r\n switch (actionId) {\r\n case \"price_above_threshold\":\r\n market.type = \"above\";\r\n if (args.length >= 4) {\r\n market.thresholds.push(args[3].toString());\r\n }\r\n break;\r\n case \"price_below_threshold\":\r\n market.type = \"below\";\r\n if (args.length >= 4) {\r\n market.thresholds.push(args[3].toString());\r\n }\r\n break;\r\n case \"value_in_range\":\r\n market.type = \"between\";\r\n if (args.length >= 5) {\r\n market.thresholds.push(args[3].toString(), args[4].toString());\r\n }\r\n break;\r\n case \"value_equals\":\r\n market.type = \"equals\";\r\n if (args.length >= 5) {\r\n market.thresholds.push(args[3].toString(), args[4].toString());\r\n }\r\n break;\r\n }\r\n\r\n return market;\r\n}\r\n\r\n/**\r\n * Encodes action arguments for order book queries using Kwil's native encoding.\r\n *\r\n * @param dataProvider - Data provider's Ethereum address\r\n * @param streamId - Stream ID (32 characters)\r\n * @param timestamp - Unix timestamp for price/value check\r\n * @param threshold - Threshold value (as decimal string, e.g., \"50000.00\")\r\n * @param frozenAt - Block height for data snapshot (0 for latest)\r\n * @returns Kwil-encoded bytes compatible with call_dispatch\r\n *\r\n * @example\r\n * ```typescript\r\n * const args = encodeActionArgs(\r\n * \"0x1234567890abcdef1234567890abcdef12345678\",\r\n * \"my_stream_id____________________\", // 32 chars\r\n * 1700000000,\r\n * \"50000.00\",\r\n * 0\r\n * );\r\n * ```\r\n */\r\nexport function encodeActionArgs(\r\n dataProvider: string,\r\n streamId: string,\r\n timestamp: number,\r\n threshold: string,\r\n frozenAt: number\r\n): Uint8Array {\r\n // Use Kwil's native encoding format which is compatible with call_dispatch\r\n // The price_above_threshold action expects: ($data_provider TEXT, $stream_id TEXT, $timestamp INT8, $threshold NUMERIC(36, 18), $frozen_at INT8)\r\n return encodeActionArgsKwil(\r\n [\r\n dataProvider.toLowerCase(), // TEXT: data provider address\r\n streamId, // TEXT: stream ID\r\n timestamp, // INT8: timestamp\r\n threshold, // NUMERIC: threshold - must specify type explicitly\r\n frozenAt === 0 ? null : frozenAt, // INT8: frozen_at (null for latest)\r\n ],\r\n {\r\n // Argument 3 (threshold) must be NUMERIC(36, 18) to match price_above_threshold action signature\r\n 3: Utils.DataType.Numeric(36, 18),\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Encodes action arguments for range-based markets using Kwil's native encoding.\r\n *\r\n * @param dataProvider - Data provider's Ethereum address\r\n * @param streamId - Stream ID\r\n * @param timestamp - Unix timestamp\r\n * @param minValue - Minimum value of range\r\n * @param maxValue - Maximum value of range\r\n * @param frozenAt - Block height (0 for latest)\r\n * @returns Kwil-encoded bytes compatible with call_dispatch\r\n */\r\nexport function encodeRangeActionArgs(\r\n dataProvider: string,\r\n streamId: string,\r\n timestamp: number,\r\n minValue: string,\r\n maxValue: string,\r\n frozenAt: number\r\n): Uint8Array {\r\n // value_in_range expects: ($data_provider TEXT, $stream_id TEXT, $timestamp INT8, $min_value NUMERIC, $max_value NUMERIC, $frozen_at INT8)\r\n return encodeActionArgsKwil(\r\n [\r\n dataProvider.toLowerCase(),\r\n streamId,\r\n timestamp,\r\n minValue,\r\n maxValue,\r\n frozenAt === 0 ? null : frozenAt,\r\n ],\r\n {\r\n // Arguments 3, 4 (minValue, maxValue) must be NUMERIC(36, 18)\r\n 3: Utils.DataType.Numeric(36, 18),\r\n 4: Utils.DataType.Numeric(36, 18),\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Encodes action arguments for value equals markets using Kwil's native encoding.\r\n *\r\n * @param dataProvider - Data provider's Ethereum address\r\n * @param streamId - Stream ID\r\n * @param timestamp - Unix timestamp\r\n * @param targetValue - Target value\r\n * @param tolerance - Acceptable tolerance\r\n * @param frozenAt - Block height (0 for latest)\r\n * @returns Kwil-encoded bytes compatible with call_dispatch\r\n */\r\nexport function encodeEqualsActionArgs(\r\n dataProvider: string,\r\n streamId: string,\r\n timestamp: number,\r\n targetValue: string,\r\n tolerance: string,\r\n frozenAt: number\r\n): Uint8Array {\r\n // value_equals expects: ($data_provider TEXT, $stream_id TEXT, $timestamp INT8, $target NUMERIC, $tolerance NUMERIC, $frozen_at INT8)\r\n return encodeActionArgsKwil(\r\n [\r\n dataProvider.toLowerCase(),\r\n streamId,\r\n timestamp,\r\n targetValue,\r\n tolerance,\r\n frozenAt === 0 ? null : frozenAt,\r\n ],\r\n {\r\n // Arguments 3, 4 (targetValue, tolerance) must be NUMERIC(36, 18)\r\n 3: Utils.DataType.Numeric(36, 18),\r\n 4: Utils.DataType.Numeric(36, 18),\r\n }\r\n );\r\n}\r\n\r\n/**\r\n * Encodes full query components for market creation.\r\n *\r\n * The query components are ABI-encoded as a tuple:\r\n * (address dataProvider, bytes32 streamId, string actionId, bytes args)\r\n *\r\n * @param dataProvider - Data provider's Ethereum address\r\n * @param streamId - Stream ID (will be padded to 32 bytes)\r\n * @param actionId - Action identifier (e.g., \"price_above_threshold\")\r\n * @param args - Pre-encoded action arguments from encodeActionArgs()\r\n * @returns ABI-encoded query components\r\n *\r\n * @example\r\n * ```typescript\r\n * const args = encodeActionArgs(...);\r\n * const queryComponents = encodeQueryComponents(\r\n * \"0x1234567890abcdef1234567890abcdef12345678\",\r\n * \"my_stream_id____________________\",\r\n * \"price_above_threshold\",\r\n * args\r\n * );\r\n * ```\r\n */\r\nexport function encodeQueryComponents(\r\n dataProvider: string,\r\n streamId: string,\r\n actionId: string,\r\n args: Uint8Array\r\n): Uint8Array {\r\n const abiCoder = ethers.AbiCoder.defaultAbiCoder();\r\n const streamIdBytes = stringToBytes32(streamId);\r\n\r\n const encoded = abiCoder.encode(\r\n [\"address\", \"bytes32\", \"string\", \"bytes\"],\r\n [dataProvider, streamIdBytes, actionId, args]\r\n );\r\n\r\n return ethers.getBytes(encoded);\r\n}\r\n\r\n/**\r\n * Converts a string to bytes32, padding with zeros if needed.\r\n *\r\n * @param str - String to convert (max 32 characters)\r\n * @returns bytes32 as hex string\r\n */\r\nexport function stringToBytes32(str: string): string {\r\n // Convert string to UTF-8 bytes\r\n const bytes = ethers.toUtf8Bytes(str);\r\n\r\n // Ensure it's not longer than 32 bytes\r\n if (bytes.length > 32) {\r\n throw new Error(`String too long for bytes32: ${str.length} characters`);\r\n }\r\n\r\n // Pad to 32 bytes\r\n return ethers.zeroPadValue(bytes, 32);\r\n}\r\n\r\n/**\r\n * Converts a hex string to Uint8Array.\r\n *\r\n * @param hex - Hex string (with or without 0x prefix)\r\n * @returns Uint8Array\r\n *\r\n * @example\r\n * ```typescript\r\n * const bytes = hexToBytes(\"0x1234abcd\");\r\n * const bytes2 = hexToBytes(\"1234abcd\");\r\n * ```\r\n */\r\nexport function hexToBytes(hex: string): Uint8Array {\r\n const cleanHex = hex.startsWith(\"0x\") ? hex : \"0x\" + hex;\r\n return ethers.getBytes(cleanHex);\r\n}\r\n\r\n/**\r\n * Checks if a string appears to be base64 encoded.\r\n *\r\n * @param str - String to check\r\n * @returns true if string appears to be base64\r\n */\r\nfunction isBase64(str: string): boolean {\r\n // Remove potential 0x prefix for checking\r\n const s = str.startsWith(\"0x\") ? str.slice(2) : str;\r\n // Base64 strings contain +, /, or = which are not valid hex\r\n return /[+/=]/.test(s) || !/^[0-9a-fA-F]*$/.test(s);\r\n}\r\n\r\n/**\r\n * Decodes a base64 string to Uint8Array.\r\n *\r\n * @param b64 - Base64 string (may have 0x prefix from kwil-js)\r\n * @returns Uint8Array\r\n */\r\nfunction base64ToBytes(b64: string): Uint8Array {\r\n // Remove potential 0x prefix that kwil-js might add\r\n const cleanB64 = b64.startsWith(\"0x\") ? b64.slice(2) : b64;\r\n\r\n // In Node.js, use Buffer\r\n if (typeof Buffer !== \"undefined\") {\r\n return new Uint8Array(Buffer.from(cleanB64, \"base64\"));\r\n }\r\n\r\n // In browser, use atob\r\n const binary = atob(cleanB64);\r\n const bytes = new Uint8Array(binary.length);\r\n for (let i = 0; i < binary.length; i++) {\r\n bytes[i] = binary.charCodeAt(i);\r\n }\r\n return bytes;\r\n}\r\n\r\n/**\r\n * Converts a database bytes value (hex or base64) to Uint8Array.\r\n * kwil-js may return BYTEA as hex or base64 depending on version/context.\r\n *\r\n * @param value - Hex string, base64 string, or Uint8Array\r\n * @returns Uint8Array\r\n */\r\nexport function dbBytesToUint8Array(\r\n value: string | Uint8Array\r\n): Uint8Array {\r\n if (value instanceof Uint8Array) {\r\n return value;\r\n }\r\n\r\n if (typeof value === \"string\") {\r\n if (isBase64(value)) {\r\n return base64ToBytes(value);\r\n }\r\n return hexToBytes(value);\r\n }\r\n\r\n throw new Error(`Unexpected bytes value type: ${typeof value}`);\r\n}\r\n\r\n/**\r\n * Converts a Uint8Array to hex string with 0x prefix.\r\n *\r\n * @param bytes - Uint8Array to convert\r\n * @returns Hex string with 0x prefix\r\n *\r\n * @example\r\n * ```typescript\r\n * const hex = bytesToHex(new Uint8Array([0x12, 0x34]));\r\n * // Returns \"0x1234\"\r\n * ```\r\n */\r\nexport function bytesToHex(bytes: Uint8Array): string {\r\n return ethers.hexlify(bytes);\r\n}\r\n\r\n/**\r\n * Validates a price value for order operations.\r\n *\r\n * @param price - Price to validate (1-99)\r\n * @param operation - Operation name for error message\r\n * @throws Error if price is invalid\r\n */\r\nexport function validatePrice(price: number, operation: string): void {\r\n if (!Number.isInteger(price)) {\r\n throw new Error(`${operation}: Price must be an integer`);\r\n }\r\n if (price < 1 || price > 99) {\r\n throw new Error(`${operation}: Price must be between 1 and 99 cents`);\r\n }\r\n}\r\n\r\n/**\r\n * Validates an amount value for order operations.\r\n *\r\n * @param amount - Amount to validate (must be positive)\r\n * @param operation - Operation name for error message\r\n * @throws Error if amount is invalid\r\n */\r\nexport function validateAmount(amount: number, operation: string): void {\r\n if (!Number.isInteger(amount)) {\r\n throw new Error(`${operation}: Amount must be an integer`);\r\n }\r\n if (amount <= 0) {\r\n throw new Error(`${operation}: Amount must be positive`);\r\n }\r\n if (amount > 1_000_000_000) {\r\n throw new Error(`${operation}: Amount exceeds maximum (1,000,000,000)`);\r\n }\r\n}\r\n\r\n/**\r\n * Validates a bridge identifier.\r\n *\r\n * @param bridge - Bridge identifier to validate\r\n * @throws Error if bridge is invalid\r\n */\r\nexport function validateBridge(bridge: string): void {\r\n const validBridges = [\"hoodi_tt2\", \"sepolia_bridge\", \"ethereum_bridge\"];\r\n if (!validBridges.includes(bridge)) {\r\n throw new Error(\r\n `Invalid bridge: ${bridge}. Must be one of: ${validBridges.join(\", \")}`\r\n );\r\n }\r\n}\r\n\r\n/**\r\n * Validates max spread for market creation.\r\n *\r\n * @param maxSpread - Max spread to validate (1-50)\r\n * @throws Error if maxSpread is invalid\r\n */\r\nexport function validateMaxSpread(maxSpread: number): void {\r\n if (!Number.isInteger(maxSpread)) {\r\n throw new Error(\"Max spread must be an integer\");\r\n }\r\n if (maxSpread < 1 || maxSpread > 50) {\r\n throw new Error(\"Max spread must be between 1 and 50 cents\");\r\n }\r\n}\r\n\r\n/**\r\n * Validates settle time for market creation.\r\n *\r\n * @param settleTime - Unix timestamp to validate (must be in future)\r\n * @throws Error if settleTime is invalid\r\n */\r\nexport function validateSettleTime(settleTime: number): void {\r\n const now = Math.floor(Date.now() / 1000);\r\n if (settleTime <= now) {\r\n throw new Error(\"Settle time must be in the future\");\r\n }\r\n}\r\n\r\n/**\r\n * Converts settled filter boolean to the value for Kuneiform.\r\n *\r\n * @param filter - Boolean filter (null/undefined=all, true=unsettled, false=settled)\r\n * @returns Boolean or null (null=all, true/false=filter by settled status)\r\n */\r\nexport function settledFilterToBoolean(\r\n filter: boolean | null | undefined\r\n): boolean | null {\r\n if (filter === null || filter === undefined) {\r\n return null; // All markets\r\n }\r\n return filter; // true=unsettled, false=settled\r\n}\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["encodeActionArgsKwil"]
|
|
7
7
|
}
|