@trufnetwork/sdk-js 0.5.3 → 0.5.4
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/README.md +59 -1
- package/dist/cjs/internal.cjs +2 -0
- package/dist/cjs/internal.cjs.map +2 -2
- package/dist/cjs/util/AttestationEncoding.cjs +341 -0
- package/dist/cjs/util/AttestationEncoding.cjs.map +2 -2
- package/dist/esm/internal.mjs +4 -0
- package/dist/esm/internal.mjs.map +2 -2
- package/dist/esm/util/AttestationEncoding.mjs +341 -0
- package/dist/esm/util/AttestationEncoding.mjs.map +2 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/types/internal.d.ts +2 -0
- package/dist/types/internal.d.ts.map +1 -1
- package/dist/types/util/AttestationEncoding.d.ts +118 -1
- package/dist/types/util/AttestationEncoding.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -274,6 +274,39 @@ attestations.forEach(att => {
|
|
|
274
274
|
});
|
|
275
275
|
```
|
|
276
276
|
|
|
277
|
+
#### Parsing Attestation Payloads
|
|
278
|
+
|
|
279
|
+
The SDK provides utilities to parse and verify signed attestation payloads:
|
|
280
|
+
|
|
281
|
+
```typescript
|
|
282
|
+
import { parseAttestationPayload } from "@trufnetwork/sdk-js";
|
|
283
|
+
import { sha256, recoverAddress } from "ethers";
|
|
284
|
+
|
|
285
|
+
// Get signed attestation
|
|
286
|
+
const signed = await attestationAction.getSignedAttestation({
|
|
287
|
+
requestTxId: result.requestTxId,
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
// Extract canonical payload and signature
|
|
291
|
+
const canonicalPayload = signed.payload.slice(0, -65);
|
|
292
|
+
const signature = signed.payload.slice(-65);
|
|
293
|
+
|
|
294
|
+
// Verify signature
|
|
295
|
+
const digest = sha256(canonicalPayload);
|
|
296
|
+
const validatorAddress = recoverAddress(digest, {
|
|
297
|
+
r: "0x" + Buffer.from(signature.slice(0, 32)).toString("hex"),
|
|
298
|
+
s: "0x" + Buffer.from(signature.slice(32, 64)).toString("hex"),
|
|
299
|
+
v: signature[64]
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
// Parse and decode the payload
|
|
303
|
+
const parsed = parseAttestationPayload(canonicalPayload);
|
|
304
|
+
console.log(`Validator: ${validatorAddress}`);
|
|
305
|
+
console.log(`Query Results: ${parsed.result.length} rows`);
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
**📖 For complete documentation including signature verification, payload structure, result decoding, and EVM integration examples, see the [Attestation Payload Parsing](./docs/api-reference.md#attestation-payload-parsing) section in the API Reference.**
|
|
309
|
+
|
|
277
310
|
#### Attestation Payload Structure
|
|
278
311
|
|
|
279
312
|
The signed attestation payload is a binary blob containing:
|
|
@@ -284,13 +317,35 @@ The signed attestation payload is a binary blob containing:
|
|
|
284
317
|
5. Stream ID (32 bytes, length-prefixed)
|
|
285
318
|
6. Action ID (2 bytes)
|
|
286
319
|
7. Arguments (variable, length-prefixed)
|
|
287
|
-
8. Result (variable, length-prefixed)
|
|
320
|
+
8. Result (variable, ABI-encoded, length-prefixed)
|
|
288
321
|
9. Signature (65 bytes, secp256k1)
|
|
289
322
|
|
|
290
323
|
This payload can be passed to EVM smart contracts for on-chain verification using `ecrecover`.
|
|
291
324
|
|
|
292
325
|
For a complete example, see [examples/attestation](./examples/attestation).
|
|
293
326
|
|
|
327
|
+
### Transaction Ledger Queries
|
|
328
|
+
|
|
329
|
+
Query transaction history, fees, and distributions for auditing and analytics.
|
|
330
|
+
|
|
331
|
+
```typescript
|
|
332
|
+
// Get transaction details
|
|
333
|
+
const transactionAction = client.loadTransactionAction();
|
|
334
|
+
const txEvent = await transactionAction.getTransactionEvent({
|
|
335
|
+
txId: '0xabcdef...'
|
|
336
|
+
});
|
|
337
|
+
console.log(`Method: ${txEvent.method}, Fee: ${txEvent.feeAmount} wei`);
|
|
338
|
+
|
|
339
|
+
// List fees paid by wallet
|
|
340
|
+
const entries = await transactionAction.listTransactionFees({
|
|
341
|
+
wallet: address,
|
|
342
|
+
mode: 'paid', // 'paid', 'received', or 'both'
|
|
343
|
+
limit: 10
|
|
344
|
+
});
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
**📖 For complete documentation including parameters, return types, pagination, filtering modes, and real-world examples, see the [Transaction Ledger Queries](./docs/api-reference.md#transaction-ledger-queries) section in the API Reference.**
|
|
348
|
+
|
|
294
349
|
### Transaction Lifecycle and Best Practices ⚠️
|
|
295
350
|
|
|
296
351
|
**Critical Understanding**: TN operations return success when transactions enter the mempool, NOT when they're executed on-chain. For operations where order matters, you must wait for transactions to be mined before proceeding.
|
|
@@ -428,7 +483,10 @@ For other bundlers or serverless platforms, consult their documentation on modul
|
|
|
428
483
|
| Get stream taxonomy | `composedAction.getTaxonomiesForStreams({streams, latestOnly})` |
|
|
429
484
|
| Request attestation | `attestationAction.requestAttestation({dataProvider, streamId, actionName, args, encryptSig, maxFee})` |
|
|
430
485
|
| Get signed attestation | `attestationAction.getSignedAttestation({requestTxId})` |
|
|
486
|
+
| Parse attestation payload | `parseAttestationPayload(canonicalPayload)` |
|
|
431
487
|
| List attestations | `attestationAction.listAttestations({requester, limit, offset, orderBy})` |
|
|
488
|
+
| Get transaction event | `transactionAction.getTransactionEvent({txId})` |
|
|
489
|
+
| List transaction fees | `transactionAction.listTransactionFees({wallet, mode, limit, offset})` |
|
|
432
490
|
| Destroy stream | `client.destroyStream(streamLocator)` |
|
|
433
491
|
|
|
434
492
|
**Safe Operation Pattern:**
|
package/dist/cjs/internal.cjs
CHANGED
|
@@ -31,6 +31,7 @@ __export(internal_exports, {
|
|
|
31
31
|
StreamType: () => import_contractValues.StreamType,
|
|
32
32
|
deleteStream: () => import_deleteStream.deleteStream,
|
|
33
33
|
deployStream: () => import_deployStream.deployStream,
|
|
34
|
+
parseAttestationPayload: () => import_AttestationEncoding.parseAttestationPayload,
|
|
34
35
|
visibility: () => import_visibility.visibility
|
|
35
36
|
});
|
|
36
37
|
module.exports = __toCommonJS(internal_exports);
|
|
@@ -45,5 +46,6 @@ var import_deleteStream = require("./contracts-api/deleteStream.cjs");
|
|
|
45
46
|
var import_StreamId = require("./util/StreamId.cjs");
|
|
46
47
|
var import_EthereumAddress = require("./util/EthereumAddress.cjs");
|
|
47
48
|
var import_visibility = require("./util/visibility.cjs");
|
|
49
|
+
var import_AttestationEncoding = require("./util/AttestationEncoding.cjs");
|
|
48
50
|
var import_contractValues = require("./contracts-api/contractValues.cjs");
|
|
49
51
|
//# sourceMappingURL=internal.cjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/internal.ts"],
|
|
4
|
-
"sourcesContent": ["/**\r\n * Internal module to manage exports and break circular dependencies\r\n * This centralizes all exports to prevent circular import issues\r\n */\r\n\r\n// Base client and types\r\nexport { BaseTNClient } from \"./client/client\";\r\nexport type { TNClientOptions, SignerInfo, ListStreamsInput, GetLastTransactionsInput } from \"./client/client\";\r\n\r\n// Contract APIs\r\nexport { Action } from \"./contracts-api/action\";\r\nexport { PrimitiveAction } from \"./contracts-api/primitiveAction\";\r\nexport { ComposedAction } from \"./contracts-api/composedAction\";\r\nexport { RoleManagement } from \"./contracts-api/roleManagement\";\r\nexport { AttestationAction } from \"./contracts-api/attestationAction\";\r\nexport { deployStream } from \"./contracts-api/deployStream\";\r\nexport { deleteStream } from \"./contracts-api/deleteStream\";\r\n\r\n// Utility classes\r\nexport { StreamId } from \"./util/StreamId\";\r\nexport { EthereumAddress } from \"./util/EthereumAddress\";\r\nexport { visibility } from \"./util/visibility\";\r\n\r\n// Contract values and types\r\nexport { StreamType } from \"./contracts-api/contractValues\";\r\n\r\n// Stream types\r\nexport type { StreamLocator } from \"./types/stream\";\r\n\r\n// Action types\r\nexport type {\r\n StreamRecord,\r\n ListMetadataByHeightParams,\r\n MetadataQueryResult,\r\n GetRecordInput,\r\n GetFirstRecordInput\r\n} from \"./contracts-api/action\";\r\n\r\n// Primitive action types\r\nexport type { InsertRecordInput } from \"./contracts-api/primitiveAction\";\r\n\r\n// Composed action types\r\nexport type {\r\n TaxonomySet,\r\n TaxonomyItem,\r\n ListTaxonomiesByHeightParams,\r\n GetTaxonomiesForStreamsParams,\r\n TaxonomyQueryResult\r\n} from \"./contracts-api/composedAction\";\r\n\r\n// Role management types\r\nexport type {\r\n GrantRoleInput,\r\n RevokeRoleInput,\r\n AreMembersOfInput,\r\n WalletMembership\r\n} from \"./types/role\";\r\n\r\n// Attestation types\r\nexport type {\r\n RequestAttestationInput,\r\n RequestAttestationResult,\r\n GetSignedAttestationInput,\r\n SignedAttestationResult,\r\n ListAttestationsInput,\r\n AttestationMetadata\r\n} from \"./types/attestation\";\r\n\r\n// Visibility types\r\nexport type { VisibilityEnum } from \"./util/visibility\";"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,oBAA6B;AAI7B,oBAAuB;AACvB,6BAAgC;AAChC,4BAA+B;AAC/B,4BAA+B;AAC/B,+BAAkC;AAClC,0BAA6B;AAC7B,0BAA6B;AAG7B,sBAAyB;AACzB,6BAAgC;AAChC,wBAA2B;AAG3B,4BAA2B;",
|
|
4
|
+
"sourcesContent": ["/**\r\n * Internal module to manage exports and break circular dependencies\r\n * This centralizes all exports to prevent circular import issues\r\n */\r\n\r\n// Base client and types\r\nexport { BaseTNClient } from \"./client/client\";\r\nexport type { TNClientOptions, SignerInfo, ListStreamsInput, GetLastTransactionsInput } from \"./client/client\";\r\n\r\n// Contract APIs\r\nexport { Action } from \"./contracts-api/action\";\r\nexport { PrimitiveAction } from \"./contracts-api/primitiveAction\";\r\nexport { ComposedAction } from \"./contracts-api/composedAction\";\r\nexport { RoleManagement } from \"./contracts-api/roleManagement\";\r\nexport { AttestationAction } from \"./contracts-api/attestationAction\";\r\nexport { deployStream } from \"./contracts-api/deployStream\";\r\nexport { deleteStream } from \"./contracts-api/deleteStream\";\r\n\r\n// Utility classes\r\nexport { StreamId } from \"./util/StreamId\";\r\nexport { EthereumAddress } from \"./util/EthereumAddress\";\r\nexport { visibility } from \"./util/visibility\";\r\n\r\n// Attestation encoding/decoding utilities\r\nexport {\r\n parseAttestationPayload\r\n} from \"./util/AttestationEncoding\";\r\n\r\nexport type {\r\n DecodedRow,\r\n ParsedAttestationPayload\r\n} from \"./util/AttestationEncoding\";\r\n\r\n// Contract values and types\r\nexport { StreamType } from \"./contracts-api/contractValues\";\r\n\r\n// Stream types\r\nexport type { StreamLocator } from \"./types/stream\";\r\n\r\n// Action types\r\nexport type {\r\n StreamRecord,\r\n ListMetadataByHeightParams,\r\n MetadataQueryResult,\r\n GetRecordInput,\r\n GetFirstRecordInput\r\n} from \"./contracts-api/action\";\r\n\r\n// Primitive action types\r\nexport type { InsertRecordInput } from \"./contracts-api/primitiveAction\";\r\n\r\n// Composed action types\r\nexport type {\r\n TaxonomySet,\r\n TaxonomyItem,\r\n ListTaxonomiesByHeightParams,\r\n GetTaxonomiesForStreamsParams,\r\n TaxonomyQueryResult\r\n} from \"./contracts-api/composedAction\";\r\n\r\n// Role management types\r\nexport type {\r\n GrantRoleInput,\r\n RevokeRoleInput,\r\n AreMembersOfInput,\r\n WalletMembership\r\n} from \"./types/role\";\r\n\r\n// Attestation types\r\nexport type {\r\n RequestAttestationInput,\r\n RequestAttestationResult,\r\n GetSignedAttestationInput,\r\n SignedAttestationResult,\r\n ListAttestationsInput,\r\n AttestationMetadata\r\n} from \"./types/attestation\";\r\n\r\n// Visibility types\r\nexport type { VisibilityEnum } from \"./util/visibility\";"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,oBAA6B;AAI7B,oBAAuB;AACvB,6BAAgC;AAChC,4BAA+B;AAC/B,4BAA+B;AAC/B,+BAAkC;AAClC,0BAA6B;AAC7B,0BAA6B;AAG7B,sBAAyB;AACzB,6BAAgC;AAChC,wBAA2B;AAG3B,iCAEO;AAQP,4BAA2B;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -20,11 +20,20 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/util/AttestationEncoding.ts
|
|
21
21
|
var AttestationEncoding_exports = {};
|
|
22
22
|
__export(AttestationEncoding_exports, {
|
|
23
|
+
decodeABIDatapoints: () => decodeABIDatapoints,
|
|
24
|
+
decodeCanonicalQueryResult: () => decodeCanonicalQueryResult,
|
|
25
|
+
decodeEncodedValue: () => decodeEncodedValue,
|
|
26
|
+
decodedValueToJS: () => decodedValueToJS,
|
|
23
27
|
encodeActionArgs: () => encodeActionArgs,
|
|
28
|
+
parseAttestationPayload: () => parseAttestationPayload,
|
|
29
|
+
readUint16BE: () => readUint16BE,
|
|
30
|
+
readUint16LE: () => readUint16LE,
|
|
31
|
+
readUint32BE: () => readUint32BE,
|
|
24
32
|
readUint32LE: () => readUint32LE
|
|
25
33
|
});
|
|
26
34
|
module.exports = __toCommonJS(AttestationEncoding_exports);
|
|
27
35
|
var import_kwil_js = require("@trufnetwork/kwil-js");
|
|
36
|
+
var import_ethers = require("ethers");
|
|
28
37
|
var import_meta = {};
|
|
29
38
|
function encodeActionArgs(args) {
|
|
30
39
|
const encodedArgs = [];
|
|
@@ -61,6 +70,303 @@ function writeUint32LE(buffer, value, offset) {
|
|
|
61
70
|
function readUint32LE(buffer, offset) {
|
|
62
71
|
return (buffer[offset] | buffer[offset + 1] << 8 | buffer[offset + 2] << 16 | buffer[offset + 3] << 24) >>> 0;
|
|
63
72
|
}
|
|
73
|
+
function readUint16LE(buffer, offset) {
|
|
74
|
+
return (buffer[offset] | buffer[offset + 1] << 8) >>> 0;
|
|
75
|
+
}
|
|
76
|
+
function readUint32BE(buffer, offset) {
|
|
77
|
+
return (buffer[offset] << 24 | buffer[offset + 1] << 16 | buffer[offset + 2] << 8 | buffer[offset + 3]) >>> 0;
|
|
78
|
+
}
|
|
79
|
+
function readUint16BE(buffer, offset) {
|
|
80
|
+
return (buffer[offset] << 8 | buffer[offset + 1]) >>> 0;
|
|
81
|
+
}
|
|
82
|
+
function decodeDataType(buffer, offset) {
|
|
83
|
+
const version = readUint16BE(buffer, offset);
|
|
84
|
+
offset += 2;
|
|
85
|
+
if (version !== 0) {
|
|
86
|
+
throw new Error(`Unsupported DataType version: ${version}`);
|
|
87
|
+
}
|
|
88
|
+
const nameLen = readUint32BE(buffer, offset);
|
|
89
|
+
offset += 4;
|
|
90
|
+
const nameBytes = buffer.slice(offset, offset + nameLen);
|
|
91
|
+
const name = new TextDecoder().decode(nameBytes);
|
|
92
|
+
offset += nameLen;
|
|
93
|
+
const is_array = buffer[offset] === 1;
|
|
94
|
+
offset += 1;
|
|
95
|
+
const metadata0 = readUint16BE(buffer, offset);
|
|
96
|
+
offset += 2;
|
|
97
|
+
const metadata1 = readUint16BE(buffer, offset);
|
|
98
|
+
offset += 2;
|
|
99
|
+
return {
|
|
100
|
+
type: {
|
|
101
|
+
name,
|
|
102
|
+
is_array,
|
|
103
|
+
metadata: [metadata0, metadata1]
|
|
104
|
+
},
|
|
105
|
+
offset
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function decodeEncodedValue(buffer, offset = 0) {
|
|
109
|
+
const version = readUint16LE(buffer, offset);
|
|
110
|
+
offset += 2;
|
|
111
|
+
if (version !== 0) {
|
|
112
|
+
throw new Error(`Unsupported EncodedValue version: ${version}`);
|
|
113
|
+
}
|
|
114
|
+
const typeLen = readUint32LE(buffer, offset);
|
|
115
|
+
offset += 4;
|
|
116
|
+
const typeBytes = buffer.slice(offset, offset + typeLen);
|
|
117
|
+
const { type } = decodeDataType(typeBytes, 0);
|
|
118
|
+
offset += typeLen;
|
|
119
|
+
const dataLen = readUint16LE(buffer, offset);
|
|
120
|
+
offset += 2;
|
|
121
|
+
const data = [];
|
|
122
|
+
for (let i = 0; i < dataLen; i++) {
|
|
123
|
+
const itemLen = readUint32LE(buffer, offset);
|
|
124
|
+
offset += 4;
|
|
125
|
+
const itemBytes = buffer.slice(offset, offset + itemLen);
|
|
126
|
+
data.push(itemBytes);
|
|
127
|
+
offset += itemLen;
|
|
128
|
+
}
|
|
129
|
+
return {
|
|
130
|
+
value: { type, data },
|
|
131
|
+
offset
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function decodedValueToJS(decoded) {
|
|
135
|
+
if (decoded.data.length === 0) {
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
const firstItem = decoded.data[0];
|
|
139
|
+
if (firstItem.length === 0 || firstItem[0] === 0) {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const valueBytes = firstItem.slice(1);
|
|
143
|
+
const typeName = decoded.type.name.toLowerCase();
|
|
144
|
+
if (decoded.type.is_array) {
|
|
145
|
+
const result = [];
|
|
146
|
+
for (const item of decoded.data) {
|
|
147
|
+
if (item.length === 0 || item[0] === 0) {
|
|
148
|
+
result.push(null);
|
|
149
|
+
} else {
|
|
150
|
+
const itemBytes = item.slice(1);
|
|
151
|
+
result.push(decodeSingleValue(typeName, itemBytes));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return result;
|
|
155
|
+
}
|
|
156
|
+
return decodeSingleValue(typeName, valueBytes);
|
|
157
|
+
}
|
|
158
|
+
function decodeSingleValue(typeName, bytes) {
|
|
159
|
+
switch (typeName) {
|
|
160
|
+
case "text":
|
|
161
|
+
case "uuid":
|
|
162
|
+
return new TextDecoder().decode(bytes);
|
|
163
|
+
case "int":
|
|
164
|
+
case "int8":
|
|
165
|
+
case "integer":
|
|
166
|
+
if (bytes.length === 8) {
|
|
167
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
|
|
168
|
+
return view.getBigInt64(0, false);
|
|
169
|
+
}
|
|
170
|
+
throw new Error(`Invalid integer byte length: expected 8, got ${bytes.length}`);
|
|
171
|
+
case "bool":
|
|
172
|
+
case "boolean":
|
|
173
|
+
return bytes.length > 0 && bytes[0] === 1;
|
|
174
|
+
case "numeric":
|
|
175
|
+
case "decimal":
|
|
176
|
+
return new TextDecoder().decode(bytes);
|
|
177
|
+
case "bytea":
|
|
178
|
+
case "blob":
|
|
179
|
+
return bytes;
|
|
180
|
+
default:
|
|
181
|
+
try {
|
|
182
|
+
return new TextDecoder().decode(bytes);
|
|
183
|
+
} catch {
|
|
184
|
+
return bytes;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
function decodeCanonicalQueryResult(data) {
|
|
189
|
+
let offset = 0;
|
|
190
|
+
if (data.length < 4) {
|
|
191
|
+
throw new Error("Data too short for row count");
|
|
192
|
+
}
|
|
193
|
+
const rowCount = readUint32LE(data, offset);
|
|
194
|
+
offset += 4;
|
|
195
|
+
const rows = [];
|
|
196
|
+
for (let i = 0; i < rowCount; i++) {
|
|
197
|
+
if (offset + 4 > data.length) {
|
|
198
|
+
throw new Error(`Data too short for column count at row ${i}`);
|
|
199
|
+
}
|
|
200
|
+
const colCount = readUint32LE(data, offset);
|
|
201
|
+
offset += 4;
|
|
202
|
+
const values = [];
|
|
203
|
+
for (let j = 0; j < colCount; j++) {
|
|
204
|
+
if (offset + 4 > data.length) {
|
|
205
|
+
throw new Error(`Data too short for column ${j} length at row ${i}`);
|
|
206
|
+
}
|
|
207
|
+
const colLen = readUint32LE(data, offset);
|
|
208
|
+
offset += 4;
|
|
209
|
+
if (offset + colLen > data.length) {
|
|
210
|
+
throw new Error(`Data too short for column ${j} bytes at row ${i}`);
|
|
211
|
+
}
|
|
212
|
+
const colBytes = data.slice(offset, offset + colLen);
|
|
213
|
+
const { value: decodedValue } = decodeEncodedValue(colBytes, 0);
|
|
214
|
+
const jsValue = decodedValueToJS(decodedValue);
|
|
215
|
+
values.push(jsValue);
|
|
216
|
+
offset += colLen;
|
|
217
|
+
}
|
|
218
|
+
rows.push({ values });
|
|
219
|
+
}
|
|
220
|
+
return rows;
|
|
221
|
+
}
|
|
222
|
+
function decodeABIDatapoints(data) {
|
|
223
|
+
if (!data || data.length === 0) {
|
|
224
|
+
return [];
|
|
225
|
+
}
|
|
226
|
+
const abiCoder = import_ethers.AbiCoder.defaultAbiCoder();
|
|
227
|
+
try {
|
|
228
|
+
const decoded = abiCoder.decode(
|
|
229
|
+
["uint256[]", "int256[]"],
|
|
230
|
+
data
|
|
231
|
+
);
|
|
232
|
+
const timestamps = decoded[0];
|
|
233
|
+
const values = decoded[1];
|
|
234
|
+
if (timestamps.length !== values.length) {
|
|
235
|
+
throw new Error(`Timestamp/value array length mismatch: ${timestamps.length} vs ${values.length}`);
|
|
236
|
+
}
|
|
237
|
+
const rows = [];
|
|
238
|
+
for (let i = 0; i < timestamps.length; i++) {
|
|
239
|
+
rows.push({
|
|
240
|
+
values: [
|
|
241
|
+
timestamps[i].toString(),
|
|
242
|
+
// Convert from 18-decimal fixed point to decimal string
|
|
243
|
+
formatFixedPoint(values[i], 18)
|
|
244
|
+
]
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
return rows;
|
|
248
|
+
} catch (err) {
|
|
249
|
+
throw new Error(`Failed to decode ABI datapoints: ${err}`);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function formatFixedPoint(value, decimals) {
|
|
253
|
+
const isNegative = value < 0n;
|
|
254
|
+
const absValue = isNegative ? -value : value;
|
|
255
|
+
const divisor = 10n ** BigInt(decimals);
|
|
256
|
+
const integerPart = absValue / divisor;
|
|
257
|
+
const fractionalPart = absValue % divisor;
|
|
258
|
+
const fractionalStr = fractionalPart.toString().padStart(decimals, "0");
|
|
259
|
+
const trimmedFractional = fractionalStr.replace(/0+$/, "");
|
|
260
|
+
if (trimmedFractional === "") {
|
|
261
|
+
return `${isNegative ? "-" : ""}${integerPart}`;
|
|
262
|
+
}
|
|
263
|
+
return `${isNegative ? "-" : ""}${integerPart}.${trimmedFractional}`;
|
|
264
|
+
}
|
|
265
|
+
function parseAttestationPayload(payload) {
|
|
266
|
+
let offset = 0;
|
|
267
|
+
if (payload.length < 1) {
|
|
268
|
+
throw new Error("Payload too short for version");
|
|
269
|
+
}
|
|
270
|
+
const version = payload[offset];
|
|
271
|
+
offset += 1;
|
|
272
|
+
if (offset >= payload.length) {
|
|
273
|
+
throw new Error("Payload too short for algorithm");
|
|
274
|
+
}
|
|
275
|
+
const algorithm = payload[offset];
|
|
276
|
+
offset += 1;
|
|
277
|
+
if (offset + 8 > payload.length) {
|
|
278
|
+
throw new Error("Payload too short for block height");
|
|
279
|
+
}
|
|
280
|
+
const blockHeightHigh = readUint32BE(payload, offset);
|
|
281
|
+
const blockHeightLow = readUint32BE(payload, offset + 4);
|
|
282
|
+
const blockHeight = BigInt(blockHeightHigh) << 32n | BigInt(blockHeightLow);
|
|
283
|
+
offset += 8;
|
|
284
|
+
if (offset + 4 > payload.length) {
|
|
285
|
+
throw new Error("Payload too short for data provider length");
|
|
286
|
+
}
|
|
287
|
+
const dataProviderLen = readUint32BE(payload, offset);
|
|
288
|
+
offset += 4;
|
|
289
|
+
if (offset + dataProviderLen > payload.length) {
|
|
290
|
+
throw new Error("Payload too short for data provider");
|
|
291
|
+
}
|
|
292
|
+
const dataProviderBytes = payload.slice(offset, offset + dataProviderLen);
|
|
293
|
+
let dataProvider;
|
|
294
|
+
if (dataProviderLen === 20) {
|
|
295
|
+
dataProvider = "0x" + Array.from(dataProviderBytes).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
296
|
+
} else {
|
|
297
|
+
try {
|
|
298
|
+
const decoded = new TextDecoder().decode(dataProviderBytes);
|
|
299
|
+
if (decoded.startsWith("0x") && /^0x[0-9a-fA-F]+$/.test(decoded)) {
|
|
300
|
+
dataProvider = decoded;
|
|
301
|
+
} else {
|
|
302
|
+
dataProvider = decoded;
|
|
303
|
+
}
|
|
304
|
+
} catch {
|
|
305
|
+
dataProvider = "0x" + Array.from(dataProviderBytes).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
offset += dataProviderLen;
|
|
309
|
+
if (offset + 4 > payload.length) {
|
|
310
|
+
throw new Error("Payload too short for stream ID length");
|
|
311
|
+
}
|
|
312
|
+
const streamIdLen = readUint32BE(payload, offset);
|
|
313
|
+
offset += 4;
|
|
314
|
+
if (offset + streamIdLen > payload.length) {
|
|
315
|
+
throw new Error("Payload too short for stream ID");
|
|
316
|
+
}
|
|
317
|
+
const streamIdBytes = payload.slice(offset, offset + streamIdLen);
|
|
318
|
+
const streamId = new TextDecoder().decode(streamIdBytes);
|
|
319
|
+
offset += streamIdLen;
|
|
320
|
+
if (offset + 2 > payload.length) {
|
|
321
|
+
throw new Error("Payload too short for action ID");
|
|
322
|
+
}
|
|
323
|
+
const actionId = readUint16BE(payload, offset);
|
|
324
|
+
offset += 2;
|
|
325
|
+
if (offset + 4 > payload.length) {
|
|
326
|
+
throw new Error("Payload too short for arguments length");
|
|
327
|
+
}
|
|
328
|
+
const argsLen = readUint32BE(payload, offset);
|
|
329
|
+
offset += 4;
|
|
330
|
+
if (offset + argsLen > payload.length) {
|
|
331
|
+
throw new Error("Payload too short for arguments");
|
|
332
|
+
}
|
|
333
|
+
const argsBytes = payload.slice(offset, offset + argsLen);
|
|
334
|
+
offset += argsLen;
|
|
335
|
+
let args = [];
|
|
336
|
+
if (argsLen > 0) {
|
|
337
|
+
let argsOffset = 0;
|
|
338
|
+
const argCount = readUint32LE(argsBytes, argsOffset);
|
|
339
|
+
argsOffset += 4;
|
|
340
|
+
for (let i = 0; i < argCount; i++) {
|
|
341
|
+
const argLen = readUint32LE(argsBytes, argsOffset);
|
|
342
|
+
argsOffset += 4;
|
|
343
|
+
const argBytes = argsBytes.slice(argsOffset, argsOffset + argLen);
|
|
344
|
+
const { value: decodedArg } = decodeEncodedValue(argBytes, 0);
|
|
345
|
+
args.push(decodedValueToJS(decodedArg));
|
|
346
|
+
argsOffset += argLen;
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
if (offset + 4 > payload.length) {
|
|
350
|
+
throw new Error("Payload too short for result length");
|
|
351
|
+
}
|
|
352
|
+
const resultLen = readUint32BE(payload, offset);
|
|
353
|
+
offset += 4;
|
|
354
|
+
if (offset + resultLen > payload.length) {
|
|
355
|
+
throw new Error("Payload too short for result");
|
|
356
|
+
}
|
|
357
|
+
const resultBytes = payload.slice(offset, offset + resultLen);
|
|
358
|
+
const result = decodeABIDatapoints(resultBytes);
|
|
359
|
+
return {
|
|
360
|
+
version,
|
|
361
|
+
algorithm,
|
|
362
|
+
blockHeight,
|
|
363
|
+
dataProvider,
|
|
364
|
+
streamId,
|
|
365
|
+
actionId,
|
|
366
|
+
arguments: args,
|
|
367
|
+
result
|
|
368
|
+
};
|
|
369
|
+
}
|
|
64
370
|
if (import_meta.vitest) {
|
|
65
371
|
const { describe, it, expect } = import_meta.vitest;
|
|
66
372
|
describe("encodeActionArgs", () => {
|
|
@@ -153,5 +459,40 @@ if (import_meta.vitest) {
|
|
|
153
459
|
expect(buffer[3]).toBe(18);
|
|
154
460
|
});
|
|
155
461
|
});
|
|
462
|
+
describe("readUint16LE and readUint16BE", () => {
|
|
463
|
+
it("should read uint16 little-endian correctly", () => {
|
|
464
|
+
const buffer = new Uint8Array([120, 86]);
|
|
465
|
+
expect(readUint16LE(buffer, 0)).toBe(22136);
|
|
466
|
+
});
|
|
467
|
+
it("should read uint16 big-endian correctly", () => {
|
|
468
|
+
const buffer = new Uint8Array([86, 120]);
|
|
469
|
+
expect(readUint16BE(buffer, 0)).toBe(22136);
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
describe("readUint32BE", () => {
|
|
473
|
+
it("should read uint32 big-endian correctly", () => {
|
|
474
|
+
const buffer = new Uint8Array([18, 52, 86, 120]);
|
|
475
|
+
expect(readUint32BE(buffer, 0)).toBe(305419896);
|
|
476
|
+
});
|
|
477
|
+
});
|
|
478
|
+
describe("decodeCanonicalQueryResult", () => {
|
|
479
|
+
it("should decode empty result (0 rows)", () => {
|
|
480
|
+
const buffer = new Uint8Array(4);
|
|
481
|
+
writeUint32LE(buffer, 0, 0);
|
|
482
|
+
const result = decodeCanonicalQueryResult(buffer);
|
|
483
|
+
expect(result.length).toBe(0);
|
|
484
|
+
});
|
|
485
|
+
it("should throw on invalid data", () => {
|
|
486
|
+
const buffer = new Uint8Array(2);
|
|
487
|
+
expect(() => decodeCanonicalQueryResult(buffer)).toThrow("Data too short for row count");
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
describe("parseAttestationPayload", () => {
|
|
491
|
+
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)");
|
|
492
|
+
it("should throw on invalid version", () => {
|
|
493
|
+
const payload = new Uint8Array(1);
|
|
494
|
+
expect(() => parseAttestationPayload(payload)).toThrow();
|
|
495
|
+
});
|
|
496
|
+
});
|
|
156
497
|
}
|
|
157
498
|
//# sourceMappingURL=AttestationEncoding.cjs.map
|
|
@@ -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';\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 * @returns Encoded bytes\n * @throws Error if any argument cannot be encoded\n */\nexport function encodeActionArgs(args: any[]): 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 const encodedValue: Types.EncodedValue = Utils.formatEncodedValue(args[i]);\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 (for testing)\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// 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"],
|
|
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 * 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 * @returns Encoded bytes\n * @throws Error if any argument cannot be encoded\n */\nexport function encodeActionArgs(args: any[]): 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 const encodedValue: Types.EncodedValue = Utils.formatEncodedValue(args[i]);\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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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/esm/internal.mjs
CHANGED
|
@@ -10,6 +10,9 @@ import { deleteStream } from "./contracts-api/deleteStream.mjs";
|
|
|
10
10
|
import { StreamId } from "./util/StreamId.mjs";
|
|
11
11
|
import { EthereumAddress } from "./util/EthereumAddress.mjs";
|
|
12
12
|
import { visibility } from "./util/visibility.mjs";
|
|
13
|
+
import {
|
|
14
|
+
parseAttestationPayload
|
|
15
|
+
} from "./util/AttestationEncoding.mjs";
|
|
13
16
|
import { StreamType } from "./contracts-api/contractValues.mjs";
|
|
14
17
|
export {
|
|
15
18
|
Action,
|
|
@@ -23,6 +26,7 @@ export {
|
|
|
23
26
|
StreamType,
|
|
24
27
|
deleteStream,
|
|
25
28
|
deployStream,
|
|
29
|
+
parseAttestationPayload,
|
|
26
30
|
visibility
|
|
27
31
|
};
|
|
28
32
|
//# sourceMappingURL=internal.mjs.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/internal.ts"],
|
|
4
|
-
"sourcesContent": ["/**\r\n * Internal module to manage exports and break circular dependencies\r\n * This centralizes all exports to prevent circular import issues\r\n */\r\n\r\n// Base client and types\r\nexport { BaseTNClient } from \"./client/client\";\r\nexport type { TNClientOptions, SignerInfo, ListStreamsInput, GetLastTransactionsInput } from \"./client/client\";\r\n\r\n// Contract APIs\r\nexport { Action } from \"./contracts-api/action\";\r\nexport { PrimitiveAction } from \"./contracts-api/primitiveAction\";\r\nexport { ComposedAction } from \"./contracts-api/composedAction\";\r\nexport { RoleManagement } from \"./contracts-api/roleManagement\";\r\nexport { AttestationAction } from \"./contracts-api/attestationAction\";\r\nexport { deployStream } from \"./contracts-api/deployStream\";\r\nexport { deleteStream } from \"./contracts-api/deleteStream\";\r\n\r\n// Utility classes\r\nexport { StreamId } from \"./util/StreamId\";\r\nexport { EthereumAddress } from \"./util/EthereumAddress\";\r\nexport { visibility } from \"./util/visibility\";\r\n\r\n// Contract values and types\r\nexport { StreamType } from \"./contracts-api/contractValues\";\r\n\r\n// Stream types\r\nexport type { StreamLocator } from \"./types/stream\";\r\n\r\n// Action types\r\nexport type {\r\n StreamRecord,\r\n ListMetadataByHeightParams,\r\n MetadataQueryResult,\r\n GetRecordInput,\r\n GetFirstRecordInput\r\n} from \"./contracts-api/action\";\r\n\r\n// Primitive action types\r\nexport type { InsertRecordInput } from \"./contracts-api/primitiveAction\";\r\n\r\n// Composed action types\r\nexport type {\r\n TaxonomySet,\r\n TaxonomyItem,\r\n ListTaxonomiesByHeightParams,\r\n GetTaxonomiesForStreamsParams,\r\n TaxonomyQueryResult\r\n} from \"./contracts-api/composedAction\";\r\n\r\n// Role management types\r\nexport type {\r\n GrantRoleInput,\r\n RevokeRoleInput,\r\n AreMembersOfInput,\r\n WalletMembership\r\n} from \"./types/role\";\r\n\r\n// Attestation types\r\nexport type {\r\n RequestAttestationInput,\r\n RequestAttestationResult,\r\n GetSignedAttestationInput,\r\n SignedAttestationResult,\r\n ListAttestationsInput,\r\n AttestationMetadata\r\n} from \"./types/attestation\";\r\n\r\n// Visibility types\r\nexport type { VisibilityEnum } from \"./util/visibility\";"],
|
|
5
|
-
"mappings": ";AAMA,SAAS,oBAAoB;AAI7B,SAAS,cAAc;AACvB,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAG7B,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAG3B,SAAS,kBAAkB;",
|
|
4
|
+
"sourcesContent": ["/**\r\n * Internal module to manage exports and break circular dependencies\r\n * This centralizes all exports to prevent circular import issues\r\n */\r\n\r\n// Base client and types\r\nexport { BaseTNClient } from \"./client/client\";\r\nexport type { TNClientOptions, SignerInfo, ListStreamsInput, GetLastTransactionsInput } from \"./client/client\";\r\n\r\n// Contract APIs\r\nexport { Action } from \"./contracts-api/action\";\r\nexport { PrimitiveAction } from \"./contracts-api/primitiveAction\";\r\nexport { ComposedAction } from \"./contracts-api/composedAction\";\r\nexport { RoleManagement } from \"./contracts-api/roleManagement\";\r\nexport { AttestationAction } from \"./contracts-api/attestationAction\";\r\nexport { deployStream } from \"./contracts-api/deployStream\";\r\nexport { deleteStream } from \"./contracts-api/deleteStream\";\r\n\r\n// Utility classes\r\nexport { StreamId } from \"./util/StreamId\";\r\nexport { EthereumAddress } from \"./util/EthereumAddress\";\r\nexport { visibility } from \"./util/visibility\";\r\n\r\n// Attestation encoding/decoding utilities\r\nexport {\r\n parseAttestationPayload\r\n} from \"./util/AttestationEncoding\";\r\n\r\nexport type {\r\n DecodedRow,\r\n ParsedAttestationPayload\r\n} from \"./util/AttestationEncoding\";\r\n\r\n// Contract values and types\r\nexport { StreamType } from \"./contracts-api/contractValues\";\r\n\r\n// Stream types\r\nexport type { StreamLocator } from \"./types/stream\";\r\n\r\n// Action types\r\nexport type {\r\n StreamRecord,\r\n ListMetadataByHeightParams,\r\n MetadataQueryResult,\r\n GetRecordInput,\r\n GetFirstRecordInput\r\n} from \"./contracts-api/action\";\r\n\r\n// Primitive action types\r\nexport type { InsertRecordInput } from \"./contracts-api/primitiveAction\";\r\n\r\n// Composed action types\r\nexport type {\r\n TaxonomySet,\r\n TaxonomyItem,\r\n ListTaxonomiesByHeightParams,\r\n GetTaxonomiesForStreamsParams,\r\n TaxonomyQueryResult\r\n} from \"./contracts-api/composedAction\";\r\n\r\n// Role management types\r\nexport type {\r\n GrantRoleInput,\r\n RevokeRoleInput,\r\n AreMembersOfInput,\r\n WalletMembership\r\n} from \"./types/role\";\r\n\r\n// Attestation types\r\nexport type {\r\n RequestAttestationInput,\r\n RequestAttestationResult,\r\n GetSignedAttestationInput,\r\n SignedAttestationResult,\r\n ListAttestationsInput,\r\n AttestationMetadata\r\n} from \"./types/attestation\";\r\n\r\n// Visibility types\r\nexport type { VisibilityEnum } from \"./util/visibility\";"],
|
|
5
|
+
"mappings": ";AAMA,SAAS,oBAAoB;AAI7B,SAAS,cAAc;AACvB,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,sBAAsB;AAC/B,SAAS,yBAAyB;AAClC,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAG7B,SAAS,gBAAgB;AACzB,SAAS,uBAAuB;AAChC,SAAS,kBAAkB;AAG3B;AAAA,EACE;AAAA,OACK;AAQP,SAAS,kBAAkB;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|