@trust402/sdk 0.1.0

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.
@@ -0,0 +1,2 @@
1
+ export * from "./trust402.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./trust402.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAC"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * Trust402 SDK — proof orchestration for publishing content listings.
3
+ *
4
+ * One call (`publish`) chains 2 proofs transparently:
5
+ * 1. Per-schema proof (blog-article-v1 or content-commitment-v1)
6
+ * 2. Listing-binding proof (listing-binding-v1)
7
+ */
8
+ import type { LemmaClient } from "@lemmaoracle/spec";
9
+ /** Payload for blog-article content type. */
10
+ export type BlogArticlePayload = Readonly<{
11
+ author: string;
12
+ body: string;
13
+ published: number;
14
+ words: number;
15
+ lang: string;
16
+ }>;
17
+ /** Supported content input variants. */
18
+ export type ContentInput = Readonly<{
19
+ type: "file";
20
+ name: string;
21
+ bytes: Uint8Array;
22
+ mimeType: string;
23
+ }> | Readonly<{
24
+ type: "blog-article";
25
+ payload: BlogArticlePayload;
26
+ }> | Readonly<{
27
+ type: "generic";
28
+ mimeType: string;
29
+ payload: Uint8Array;
30
+ }>;
31
+ /** Price in USDC smallest unit (6 decimals). */
32
+ export type PriceInput = Readonly<{
33
+ amount: number;
34
+ currency: "USDC";
35
+ }>;
36
+ /** Publish input — everything the seller provides. */
37
+ export type Trust402PublishInput = Readonly<{
38
+ content: ContentInput;
39
+ price: PriceInput;
40
+ did: string;
41
+ metadata?: Readonly<{
42
+ title?: string;
43
+ version?: string;
44
+ description?: string;
45
+ }>;
46
+ /** Salt for listing-binding proof. Auto-generated if omitted. */
47
+ salt?: string;
48
+ }>;
49
+ /** Full listing returned after successful publish. */
50
+ export type Trust402Listing = Readonly<{
51
+ listingRoot: string;
52
+ schemaId: string;
53
+ commitment: string;
54
+ price: PriceInput;
55
+ cid?: string;
56
+ perSchemaProof: {
57
+ circuitId: string;
58
+ proof: string;
59
+ inputs: ReadonlyArray<string>;
60
+ };
61
+ listingBindingProof: {
62
+ circuitId: string;
63
+ proof: string;
64
+ inputs: ReadonlyArray<string>;
65
+ };
66
+ metadata?: Readonly<{
67
+ title?: string;
68
+ version?: string;
69
+ description?: string;
70
+ }>;
71
+ createdAt: number;
72
+ }>;
73
+ /**
74
+ * Publish a Trust402 listing — chains 2 proofs transparently.
75
+ *
76
+ * One call: generates per-schema proof, listing-binding proof, registers
77
+ * both proofs with Lemma, and returns a full listing.
78
+ */
79
+ export declare const publish: (client: LemmaClient, input: Trust402PublishInput) => Promise<Trust402Listing>;
80
+ /**
81
+ * Detect content type from a browser File object.
82
+ * Used by dashboard before publish to show a badge.
83
+ */
84
+ export declare const detectContentType: (file: {
85
+ readonly type: string;
86
+ readonly name: string;
87
+ }) => string;
88
+ //# sourceMappingURL=trust402.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust402.d.ts","sourceRoot":"","sources":["../src/trust402.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAgFrD,6CAA6C;AAC7C,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC,CAAC;AAEH,wCAAwC;AACxC,MAAM,MAAM,YAAY,GACpB,QAAQ,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,UAAU,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,GAC7E,QAAQ,CAAC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,kBAAkB,CAAA;CAAE,CAAC,GAC/D,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,CAAC,CAAC;AAEzE,gDAAgD;AAChD,MAAM,MAAM,UAAU,GAAG,QAAQ,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAExE,sDAAsD;AACtD,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CAAC;IAC1C,OAAO,EAAE,YAAY,CAAC;IACtB,KAAK,EAAE,UAAU,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChF,iEAAiE;IACjE,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC,CAAC;AAEH,sDAAsD;AACtD,MAAM,MAAM,eAAe,GAAG,QAAQ,CAAC;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,UAAU,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;IACpF,mBAAmB,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;KAAE,CAAC;IACzF,QAAQ,CAAC,EAAE,QAAQ,CAAC;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAChF,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC,CAAC;AA0IH;;;;;GAKG;AACH,eAAO,MAAM,OAAO,GAClB,QAAQ,WAAW,EACnB,OAAO,oBAAoB,KAC1B,OAAO,CAAC,eAAe,CAoGzB,CAAC;AAoBF;;;GAGG;AACH,eAAO,MAAM,iBAAiB,GAAI,MAAM;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,KAAG,MA6BH,CAAC"}
@@ -0,0 +1,305 @@
1
+ import { toScalar } from "@lemmaoracle/sdk";
2
+ import { poseidon1, poseidon2, poseidon5 } from "poseidon-lite";
3
+ import { sha256 } from "@noble/hashes/sha256";
4
+ import { randomBytes } from "@noble/hashes/utils";
5
+ /* ------------------------------------------------------------------ */
6
+ /* Inlined normalizer helpers (from @lemmaoracle/content) */
7
+ /* Inlined to avoid cross-package rootDir issues and circular deps. */
8
+ /* ------------------------------------------------------------------ */
9
+ /** Chunk size in bytes: 31 bytes = 248 bits < 254-bit field prime. */
10
+ const CHUNK_SIZE = 31;
11
+ /**
12
+ * Convert raw bytes to an array of BN254 field elements.
13
+ * Uses 31-byte big-endian chunks with PKCS7 padding.
14
+ */
15
+ const bytesToFieldElements = (data) => {
16
+ const len = data.length;
17
+ const padLen = CHUNK_SIZE - (len % CHUNK_SIZE);
18
+ const paddedLen = len + padLen;
19
+ const padded = new Uint8Array(paddedLen);
20
+ padded.set(data);
21
+ for (let i = len; i < paddedLen; i++) {
22
+ padded[i] = padLen;
23
+ }
24
+ const numChunks = paddedLen / CHUNK_SIZE;
25
+ const elements = new Array(numChunks);
26
+ for (let i = 0; i < numChunks; i++) {
27
+ const offset = i * CHUNK_SIZE;
28
+ let val = 0n;
29
+ for (let j = 0; j < CHUNK_SIZE; j++) {
30
+ const byte = padded[offset + j];
31
+ val = (val << 8n) | BigInt(byte ?? 0);
32
+ }
33
+ elements[i] = val;
34
+ }
35
+ return elements;
36
+ };
37
+ /**
38
+ * Reduce an array of field elements to a single field element
39
+ * using iterative Poseidon(2) hashing.
40
+ */
41
+ const reduceElements = (elements, poseidon2Fn) => {
42
+ if (elements.length === 0) {
43
+ return 0n;
44
+ }
45
+ let acc = elements[0] ?? 0n;
46
+ for (let i = 1; i < elements.length; i++) {
47
+ acc = poseidon2Fn([acc, elements[i] ?? 0n]);
48
+ }
49
+ return acc;
50
+ };
51
+ /* ------------------------------------------------------------------ */
52
+ /* Inlined crypto helpers (from @lemmaoracle/sdk platform) */
53
+ /* ------------------------------------------------------------------ */
54
+ const bytesToHex = (bytes) => Array.from(bytes)
55
+ .map((b) => b.toString(16).padStart(2, "0"))
56
+ .join("");
57
+ const sha256Hex = (data) => bytesToHex(sha256(data));
58
+ const randomHex = (length = 32) => bytesToHex(randomBytes(length));
59
+ const CONTENT_REGISTRY = {
60
+ "blog-article": { circuitId: "blog-article-v1", needsCID: false },
61
+ default: { circuitId: "content-commitment-v1", needsCID: true },
62
+ };
63
+ /* ------------------------------------------------------------------ */
64
+ /* Language code map (ISO 639-1 → numeric code) */
65
+ /* ------------------------------------------------------------------ */
66
+ const LANG_MAP = Object.freeze({
67
+ en: 1n,
68
+ ja: 2n,
69
+ zh: 3n,
70
+ ko: 4n,
71
+ es: 5n,
72
+ fr: 6n,
73
+ de: 7n,
74
+ pt: 8n,
75
+ ru: 9n,
76
+ ar: 10n,
77
+ hi: 11n,
78
+ it: 12n,
79
+ nl: 13n,
80
+ tr: 14n,
81
+ vi: 15n,
82
+ th: 16n,
83
+ id: 17n,
84
+ pl: 18n,
85
+ uk: 19n,
86
+ sv: 20n,
87
+ });
88
+ const langToCode = (lang) => LANG_MAP[lang.toLowerCase()] ?? 0n;
89
+ /* ------------------------------------------------------------------ */
90
+ /* Step 0: selectCircuit */
91
+ /* ------------------------------------------------------------------ */
92
+ /** Select the per-schema circuit and CID requirement for a content input. */
93
+ const selectCircuit = (content) => content.type === "blog-article"
94
+ ? CONTENT_REGISTRY["blog-article"]
95
+ : CONTENT_REGISTRY.default;
96
+ /* ------------------------------------------------------------------ */
97
+ /* Witness Builders (internal, not exported) */
98
+ /* ------------------------------------------------------------------ */
99
+ /**
100
+ * Build witness for blog-article-v1 circuit.
101
+ *
102
+ * Witness fields:
103
+ * authorHash, published, integrityHash, words, langCode, commitment
104
+ * where commitment = poseidon5([authorHash, published, integrityHash, words, langCode])
105
+ */
106
+ const buildBlogArticleWitness = (payload) => {
107
+ const authorHash = toScalar(payload.author);
108
+ const published = BigInt(payload.published);
109
+ const integrityHash = toScalar(payload.body);
110
+ const words = BigInt(payload.words);
111
+ const langCode = langToCode(payload.lang);
112
+ const commitment = poseidon5([authorHash, published, integrityHash, words, langCode]);
113
+ return Object.freeze({
114
+ authorHash: `0x${authorHash.toString(16)}`,
115
+ published: published.toString(),
116
+ integrityHash: `0x${integrityHash.toString(16)}`,
117
+ words: words.toString(),
118
+ langCode: langCode.toString(),
119
+ commitment: `0x${commitment.toString(16)}`,
120
+ // Fallback prover compatibility: also expose as commitment_root
121
+ commitment_root: `0x${commitment.toString(16)}`,
122
+ });
123
+ };
124
+ /**
125
+ * Build witness for content-commitment-v1 circuit.
126
+ *
127
+ * Uses the canonical normalizer: bytes → fieldElements → poseidon2 reduction → poseidon1.
128
+ */
129
+ const buildContentCommitmentWitness = (bytes) => {
130
+ const elements = bytesToFieldElements(bytes);
131
+ const fileHash = reduceElements(elements, (inputs) => poseidon2(inputs));
132
+ const commitment = poseidon1([fileHash]);
133
+ return Object.freeze({
134
+ fileHash: `0x${fileHash.toString(16)}`,
135
+ commitment: `0x${commitment.toString(16)}`,
136
+ // Fallback prover compatibility: also expose as commitment_root
137
+ commitment_root: `0x${commitment.toString(16)}`,
138
+ });
139
+ };
140
+ /** Build the per-schema witness based on content type. */
141
+ const buildPerSchemaWitness = (content) => content.type === "blog-article"
142
+ ? {
143
+ circuitId: "blog-article-v1",
144
+ witness: buildBlogArticleWitness(content.payload),
145
+ }
146
+ : (() => {
147
+ const bytes = content.type === "file" ? content.bytes : content.payload;
148
+ return {
149
+ circuitId: "content-commitment-v1",
150
+ witness: buildContentCommitmentWitness(bytes),
151
+ };
152
+ })();
153
+ /* ------------------------------------------------------------------ */
154
+ /* Hex helpers */
155
+ /* ------------------------------------------------------------------ */
156
+ const bigintToHex = (n) => `0x${n.toString(16)}`;
157
+ /* ------------------------------------------------------------------ */
158
+ /* Main publish function */
159
+ /* ------------------------------------------------------------------ */
160
+ /**
161
+ * Publish a Trust402 listing — chains 2 proofs transparently.
162
+ *
163
+ * One call: generates per-schema proof, listing-binding proof, registers
164
+ * both proofs with Lemma, and returns a full listing.
165
+ */
166
+ export const publish = async (client, input) => {
167
+ // Dynamically import from SDK to avoid circular deps at module load
168
+ const [{ prover }, { proofs }] = await Promise.all([
169
+ import("@lemmaoracle/sdk"),
170
+ import("@lemmaoracle/sdk"),
171
+ ]);
172
+ const { prove } = prover;
173
+ const { submit } = proofs;
174
+ // ── Step 0: select circuit ──
175
+ const mapping = selectCircuit(input.content);
176
+ // ── Step 1: Per-schema proof ──
177
+ const { circuitId, witness: perSchemaWitness } = buildPerSchemaWitness(input.content);
178
+ const perSchemaProof = await prove(client, {
179
+ circuitId,
180
+ witness: perSchemaWitness,
181
+ });
182
+ // Commitment is public signal [0]
183
+ const commitment = perSchemaProof.inputs[0];
184
+ if (commitment === undefined) {
185
+ throw new Error("Per-schema proof produced no public signals");
186
+ }
187
+ // Register per-schema proof
188
+ const docHash = commitment;
189
+ await submit(client, {
190
+ docHash,
191
+ circuitId,
192
+ proof: perSchemaProof.proof,
193
+ inputs: perSchemaProof.inputs,
194
+ });
195
+ // ── Step 2: Listing-binding proof ──
196
+ const schemaId = toScalar(circuitId);
197
+ const priceUsdc = toScalar(input.price.amount);
198
+ const didScalar = toScalar(input.did);
199
+ const salt = toScalar(input.salt ?? randomHex(32));
200
+ const listingRoot = poseidon5([schemaId, BigInt(commitment), priceUsdc, didScalar, salt]);
201
+ const listingWitness = Object.freeze({
202
+ did: `0x${didScalar.toString(16)}`,
203
+ salt: `0x${salt.toString(16)}`,
204
+ listingRoot: `0x${listingRoot.toString(16)}`,
205
+ perSchemaCommitment: commitment,
206
+ schemaId: `0x${schemaId.toString(16)}`,
207
+ priceUsdc: `0x${priceUsdc.toString(16)}`,
208
+ // Fallback prover compatibility
209
+ commitment_root: commitment,
210
+ });
211
+ const listingBindingProof = await prove(client, {
212
+ circuitId: "listing-binding-v1",
213
+ witness: listingWitness,
214
+ });
215
+ // Register listing-binding proof
216
+ await submit(client, {
217
+ docHash: bigintToHex(listingRoot),
218
+ circuitId: "listing-binding-v1",
219
+ proof: listingBindingProof.proof,
220
+ inputs: listingBindingProof.inputs,
221
+ });
222
+ // ── Step 3: Compute CID if needed ──
223
+ const cid = mapping.needsCID
224
+ ? (() => {
225
+ const bytes = input.content.type === "file"
226
+ ? input.content.bytes
227
+ : input.content.type === "generic"
228
+ ? input.content.payload
229
+ : undefined;
230
+ return bytes !== undefined ? `sha256:${sha256Hex(bytes)}` : undefined;
231
+ })()
232
+ : undefined;
233
+ // ── Step 4: Return listing ──
234
+ return Object.freeze({
235
+ listingRoot: bigintToHex(listingRoot),
236
+ schemaId: circuitId,
237
+ commitment,
238
+ price: input.price,
239
+ cid,
240
+ perSchemaProof: {
241
+ circuitId,
242
+ proof: perSchemaProof.proof,
243
+ inputs: perSchemaProof.inputs,
244
+ },
245
+ listingBindingProof: {
246
+ circuitId: "listing-binding-v1",
247
+ proof: listingBindingProof.proof,
248
+ inputs: listingBindingProof.inputs,
249
+ },
250
+ metadata: input.metadata,
251
+ createdAt: Date.now(),
252
+ });
253
+ };
254
+ /* ------------------------------------------------------------------ */
255
+ /* Content type detection utility */
256
+ /* ------------------------------------------------------------------ */
257
+ /** MIME type → content type detection (for File-based input). */
258
+ const MIME_TO_CONTENT_TYPE = Object.freeze({
259
+ "image/": "image",
260
+ "video/": "video",
261
+ "text/csv": "csv",
262
+ "application/json": "code",
263
+ "text/plain": "code",
264
+ "text/html": "code",
265
+ "text/javascript": "code",
266
+ "text/typescript": "code",
267
+ "application/xml": "code",
268
+ "text/markdown": "code",
269
+ });
270
+ /**
271
+ * Detect content type from a browser File object.
272
+ * Used by dashboard before publish to show a badge.
273
+ */
274
+ export const detectContentType = (file) => {
275
+ // Try exact MIME match first
276
+ const exactMatch = Object.entries(MIME_TO_CONTENT_TYPE).find(([key]) => file.type === key);
277
+ if (exactMatch !== undefined) {
278
+ return exactMatch[1];
279
+ }
280
+ // Try prefix match (e.g. "image/png" → "image")
281
+ const prefixMatch = Object.entries(MIME_TO_CONTENT_TYPE).find(([key]) => key.endsWith("/") && file.type.startsWith(key));
282
+ if (prefixMatch !== undefined) {
283
+ return prefixMatch[1];
284
+ }
285
+ // Fall back to extension detection
286
+ const ext = file.name.split(".").pop()?.toLowerCase();
287
+ if (ext === "csv")
288
+ return "csv";
289
+ if (ext === "json" || ext === "jsonl")
290
+ return "code";
291
+ if (ext === "md")
292
+ return "code";
293
+ if (ext === "xml")
294
+ return "code";
295
+ if (ext === "html" || ext === "htm")
296
+ return "code";
297
+ if (ext === "js" || ext === "ts" || ext === "jsx" || ext === "tsx")
298
+ return "code";
299
+ if (ext === "py" || ext === "rs" || ext === "go" || ext === "java")
300
+ return "code";
301
+ if (ext === "sol" || ext === "vy")
302
+ return "code";
303
+ return "generic";
304
+ };
305
+ //# sourceMappingURL=trust402.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust402.js","sourceRoot":"","sources":["../src/trust402.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,wEAAwE;AACxE,yEAAyE;AACzE,yEAAyE;AACzE,wEAAwE;AAExE,sEAAsE;AACtE,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB;;;GAGG;AACH,MAAM,oBAAoB,GAAG,CAAC,IAAgB,EAAY,EAAE;IAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;IACxB,MAAM,MAAM,GAAG,UAAU,GAAG,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,GAAG,GAAG,MAAM,CAAC;IAE/B,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,CAAC;IACzC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjB,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;IACrB,CAAC;IAED,MAAM,SAAS,GAAG,SAAS,GAAG,UAAU,CAAC;IACzC,MAAM,QAAQ,GAAa,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;IAEhD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC;QAC9B,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAChC,GAAG,GAAG,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACxC,CAAC;QACD,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;IACpB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,cAAc,GAAG,CACrB,QAA2B,EAC3B,WAAiD,EACzC,EAAE;IACV,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACzC,GAAG,GAAG,WAAW,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC,CAAC;AAEF,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,MAAM,UAAU,GAAG,CAAC,KAAiB,EAAU,EAAE,CAC/C,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;KACd,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;KAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AAEd,MAAM,SAAS,GAAG,CAAC,IAAgB,EAAU,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;AAEzE,MAAM,SAAS,GAAG,CAAC,MAAM,GAAG,EAAE,EAAU,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AAwD3E,MAAM,gBAAgB,GAAmC;IACvD,cAAc,EAAE,EAAE,SAAS,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,EAAE;IACjE,OAAO,EAAE,EAAE,SAAS,EAAE,uBAAuB,EAAE,QAAQ,EAAE,IAAI,EAAE;CACvD,CAAC;AAEX,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,MAAM,QAAQ,GAAqC,MAAM,CAAC,MAAM,CAAC;IAC/D,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,EAAE;IACN,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;IACP,EAAE,EAAE,GAAG;CACR,CAAC,CAAC;AAEH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;AAEhF,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,6EAA6E;AAC7E,MAAM,aAAa,GAAG,CAAC,OAAqB,EAAkB,EAAE,CAC9D,OAAO,CAAC,IAAI,KAAK,cAAc;IAC7B,CAAC,CAAC,gBAAgB,CAAC,cAAc,CAAE;IACnC,CAAC,CAAC,gBAAgB,CAAC,OAAQ,CAAC;AAEhC,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE;;;;;;GAMG;AACH,MAAM,uBAAuB,GAAG,CAC9B,OAA2B,EACO,EAAE;IACpC,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5C,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEtF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,UAAU,EAAE,KAAK,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAC1C,SAAS,EAAE,SAAS,CAAC,QAAQ,EAAE;QAC/B,aAAa,EAAE,KAAK,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAChD,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;QACvB,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE;QAC7B,UAAU,EAAE,KAAK,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAC1C,gEAAgE;QAChE,eAAe,EAAE,KAAK,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;KAChD,CAAC,CAAC;AACL,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,6BAA6B,GAAG,CACpC,KAAiB,EACiB,EAAE;IACpC,MAAM,QAAQ,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAC,MAAwB,EAAE,EAAE,CACrE,SAAS,CAAC,MAAM,CAAC,CAClB,CAAC;IACF,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEzC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,QAAQ,EAAE,KAAK,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QACtC,UAAU,EAAE,KAAK,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAC1C,gEAAgE;QAChE,eAAe,EAAE,KAAK,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;KAChD,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,0DAA0D;AAC1D,MAAM,qBAAqB,GAAG,CAC5B,OAAqB,EAC6C,EAAE,CACpE,OAAO,CAAC,IAAI,KAAK,cAAc;IAC7B,CAAC,CAAC;QACE,SAAS,EAAE,iBAAiB;QAC5B,OAAO,EAAE,uBAAuB,CAAC,OAAO,CAAC,OAAO,CAAC;KAClD;IACH,CAAC,CAAC,CAAC,GAAG,EAAE;QACJ,MAAM,KAAK,GACT,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QAC5D,OAAO;YACL,SAAS,EAAE,uBAAuB;YAClC,OAAO,EAAE,6BAA6B,CAAC,KAAK,CAAC;SAC9C,CAAC;IACJ,CAAC,CAAC,EAAE,CAAC;AAEX,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,MAAM,WAAW,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;AAEjE,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE;;;;;GAKG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC1B,MAAmB,EACnB,KAA2B,EACD,EAAE;IAC5B,oEAAoE;IACpE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACjD,MAAM,CAAC,kBAAkB,CAAC;QAC1B,MAAM,CAAC,kBAAkB,CAAC;KAC3B,CAAC,CAAC;IACH,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;IAE1B,+BAA+B;IAC/B,MAAM,OAAO,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAE7C,iCAAiC;IACjC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,gBAAgB,EAAE,GAC5C,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEvC,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;QACzC,SAAS;QACT,OAAO,EAAE,gBAAgB;KAC1B,CAAC,CAAC;IAEH,kCAAkC;IAClC,MAAM,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC5C,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IAED,4BAA4B;IAC5B,MAAM,OAAO,GAAG,UAAU,CAAC;IAC3B,MAAM,MAAM,CAAC,MAAM,EAAE;QACnB,OAAO;QACP,SAAS;QACT,KAAK,EAAE,cAAc,CAAC,KAAK;QAC3B,MAAM,EAAE,cAAc,CAAC,MAAM;KAC9B,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,SAAS,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IAE1F,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QACnC,GAAG,EAAE,KAAK,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAClC,IAAI,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAC9B,WAAW,EAAE,KAAK,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QAC5C,mBAAmB,EAAE,UAAU;QAC/B,QAAQ,EAAE,KAAK,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QACtC,SAAS,EAAE,KAAK,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;QACxC,gCAAgC;QAChC,eAAe,EAAE,UAAU;KAC5B,CAAC,CAAC;IAEH,MAAM,mBAAmB,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE;QAC9C,SAAS,EAAE,oBAAoB;QAC/B,OAAO,EAAE,cAAc;KACxB,CAAC,CAAC;IAEH,iCAAiC;IACjC,MAAM,MAAM,CAAC,MAAM,EAAE;QACnB,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC;QACjC,SAAS,EAAE,oBAAoB;QAC/B,KAAK,EAAE,mBAAmB,CAAC,KAAK;QAChC,MAAM,EAAE,mBAAmB,CAAC,MAAM;KACnC,CAAC,CAAC;IAEH,sCAAsC;IACtC,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ;QAC1B,CAAC,CAAC,CAAC,GAAG,EAAE;YACJ,MAAM,KAAK,GACT,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,MAAM;gBAC3B,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK;gBACrB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS;oBAChC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO;oBACvB,CAAC,CAAC,SAAS,CAAC;YAClB,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,UAAU,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,CAAC,CAAC,EAAE;QACN,CAAC,CAAC,SAAS,CAAC;IAEd,+BAA+B;IAC/B,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC;QACrC,QAAQ,EAAE,SAAS;QACnB,UAAU;QACV,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,GAAG;QACH,cAAc,EAAE;YACd,SAAS;YACT,KAAK,EAAE,cAAc,CAAC,KAAK;YAC3B,MAAM,EAAE,cAAc,CAAC,MAAM;SAC9B;QACD,mBAAmB,EAAE;YACnB,SAAS,EAAE,oBAAoB;YAC/B,KAAK,EAAE,mBAAmB,CAAC,KAAK;YAChC,MAAM,EAAE,mBAAmB,CAAC,MAAM;SACnC;QACD,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,wEAAwE;AACxE,yEAAyE;AACzE,wEAAwE;AAExE,iEAAiE;AACjE,MAAM,oBAAoB,GAAqC,MAAM,CAAC,MAAM,CAAC;IAC3E,QAAQ,EAAE,OAAO;IACjB,QAAQ,EAAE,OAAO;IACjB,UAAU,EAAE,KAAK;IACjB,kBAAkB,EAAE,MAAM;IAC1B,YAAY,EAAE,MAAM;IACpB,WAAW,EAAE,MAAM;IACnB,iBAAiB,EAAE,MAAM;IACzB,iBAAiB,EAAE,MAAM;IACzB,iBAAiB,EAAE,MAAM;IACzB,eAAe,EAAE,MAAM;CACxB,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,IAGjC,EAAU,EAAE;IACX,6BAA6B;IAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CACrE,IAAI,CAAC,IAAI,KAAK,GAAG,CAClB,CAAC;IACF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,gDAAgD;IAChD,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CACtE,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAC/C,CAAC;IACF,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,WAAW,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC;IAED,mCAAmC;IACnC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,CAAC;IACtD,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IAChC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,MAAM,CAAC;IACrD,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAChC,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IACjC,IAAI,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IACnD,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,MAAM,CAAC;IAClF,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAClF,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAEjD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=trust402.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust402.test.d.ts","sourceRoot":"","sources":["../src/trust402.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,336 @@
1
+ import { describe, it, expect, vi, beforeEach } from "vitest";
2
+ import { publish, detectContentType } from "./trust402.js";
3
+ import { create, toScalar } from "@lemmaoracle/sdk";
4
+ import { poseidon5 } from "poseidon-lite";
5
+ // ---------------------------------------------------------------------------
6
+ // detectContentType
7
+ // ---------------------------------------------------------------------------
8
+ describe("detectContentType", () => {
9
+ it("detects image from MIME prefix", () => {
10
+ expect(detectContentType({ type: "image/png", name: "photo.png" })).toBe("image");
11
+ expect(detectContentType({ type: "image/jpeg", name: "img.jpg" })).toBe("image");
12
+ });
13
+ it("detects video from MIME prefix", () => {
14
+ expect(detectContentType({ type: "video/mp4", name: "vid.mp4" })).toBe("video");
15
+ });
16
+ it("detects CSV from exact MIME match", () => {
17
+ expect(detectContentType({ type: "text/csv", name: "data.csv" })).toBe("csv");
18
+ });
19
+ it("detects code from JSON MIME", () => {
20
+ expect(detectContentType({
21
+ type: "application/json",
22
+ name: "config.json",
23
+ })).toBe("code");
24
+ });
25
+ it("detects code from markdown", () => {
26
+ expect(detectContentType({
27
+ type: "text/markdown",
28
+ name: "readme.md",
29
+ })).toBe("code");
30
+ });
31
+ it("falls back to extension detection when MIME is unknown", () => {
32
+ expect(detectContentType({
33
+ type: "application/octet-stream",
34
+ name: "data.csv",
35
+ })).toBe("csv");
36
+ expect(detectContentType({
37
+ type: "application/octet-stream",
38
+ name: "script.py",
39
+ })).toBe("code");
40
+ });
41
+ it("returns generic for unknown types", () => {
42
+ expect(detectContentType({
43
+ type: "application/octet-stream",
44
+ name: "file.xyz",
45
+ })).toBe("generic");
46
+ });
47
+ });
48
+ // ---------------------------------------------------------------------------
49
+ // Witness builders (tested via publish with mocked prover / proofs)
50
+ // ---------------------------------------------------------------------------
51
+ describe("trust402.publish", () => {
52
+ beforeEach(() => {
53
+ vi.clearAllMocks();
54
+ });
55
+ // ── Helpers ──────────────────────────────────────────────────────────
56
+ /** Build a mock fetch that returns circuit metadata with no artifacts
57
+ * (triggering fallback SHA-256 proving path). */
58
+ const setupNoArtifactMocks = () => {
59
+ const mockFetch = vi.fn().mockImplementation((url) => {
60
+ if (url.includes("/v1/circuits/")) {
61
+ return Promise.resolve({
62
+ ok: true,
63
+ json: () => Promise.resolve({
64
+ circuitId: url.split("/v1/circuits/")[1],
65
+ schema: "test-schema",
66
+ }),
67
+ });
68
+ }
69
+ if (url.includes("/v1/proofs")) {
70
+ return Promise.resolve({
71
+ ok: true,
72
+ json: () => Promise.resolve({
73
+ status: "received",
74
+ verificationId: "verif-001",
75
+ }),
76
+ });
77
+ }
78
+ return Promise.resolve({ ok: false });
79
+ });
80
+ const c = create({ apiBase: "http://localhost:8787" });
81
+ c.fetcher = mockFetch;
82
+ return c;
83
+ };
84
+ // ── Blog Article tests ──────────────────────────────────────────────
85
+ describe("blog-article content", () => {
86
+ const blogPayload = Object.freeze({
87
+ author: "did:ethr:0xabc123",
88
+ body: "Zero-knowledge proofs enable privacy-preserving verification on decentralized networks.",
89
+ published: 1714069800,
90
+ words: 13,
91
+ lang: "en",
92
+ });
93
+ const blogInput = Object.freeze({
94
+ content: Object.freeze({
95
+ type: "blog-article",
96
+ payload: blogPayload,
97
+ }),
98
+ price: Object.freeze({ amount: 42000000, currency: "USDC" }),
99
+ did: "did:ethr:0xabc123",
100
+ metadata: Object.freeze({ title: "My Blog Post", version: "1.0.0" }),
101
+ });
102
+ it("publishes a blog-article listing successfully", async () => {
103
+ const client = setupNoArtifactMocks();
104
+ const listing = await publish(client, blogInput);
105
+ // Shape
106
+ expect(listing).toHaveProperty("listingRoot");
107
+ expect(listing).toHaveProperty("commitment");
108
+ expect(listing).toHaveProperty("perSchemaProof");
109
+ expect(listing).toHaveProperty("listingBindingProof");
110
+ expect(listing.schemaId).toBe("blog-article-v1");
111
+ expect(listing.price).toEqual(blogInput.price);
112
+ expect(listing.cid).toBeUndefined(); // blog-article doesn't need CID
113
+ // perSchemaProof
114
+ expect(listing.perSchemaProof.circuitId).toBe("blog-article-v1");
115
+ expect(listing.perSchemaProof.inputs.length).toBeGreaterThan(0);
116
+ // listingBindingProof
117
+ expect(listing.listingBindingProof.circuitId).toBe("listing-binding-v1");
118
+ expect(listing.listingBindingProof.inputs.length).toBeGreaterThan(0);
119
+ // Metadata preserved
120
+ expect(listing.metadata).toEqual(blogInput.metadata);
121
+ // createdAt is a recent timestamp
122
+ expect(listing.createdAt).toBeGreaterThan(0);
123
+ expect(listing.createdAt).toBeLessThanOrEqual(Date.now());
124
+ });
125
+ it("computes a deterministic commitment from blog article payload", async () => {
126
+ const client = setupNoArtifactMocks();
127
+ const listing1 = await publish(client, blogInput);
128
+ const listing2 = await publish(client, blogInput);
129
+ // Same input → same commitment
130
+ expect(listing1.commitment).toBe(listing2.commitment);
131
+ });
132
+ it("produces different commitments for different payloads", async () => {
133
+ const client = setupNoArtifactMocks();
134
+ const listing1 = await publish(client, blogInput);
135
+ const differentPayload = Object.freeze({
136
+ ...blogPayload,
137
+ body: "A completely different article body.",
138
+ });
139
+ const differentInput = Object.freeze({
140
+ ...blogInput,
141
+ content: Object.freeze({
142
+ type: "blog-article",
143
+ payload: differentPayload,
144
+ }),
145
+ });
146
+ const listing2 = await publish(client, differentInput);
147
+ expect(listing1.commitment).not.toBe(listing2.commitment);
148
+ });
149
+ it("verifies the commitment matches Poseidon5 of witness fields", async () => {
150
+ const client = setupNoArtifactMocks();
151
+ const listing = await publish(client, blogInput);
152
+ // Recompute commitment from payload
153
+ const authorHash = toScalar(blogPayload.author);
154
+ const published = BigInt(blogPayload.published);
155
+ const integrityHash = toScalar(blogPayload.body);
156
+ const words = BigInt(blogPayload.words);
157
+ const langMap = { en: 1n };
158
+ const langCode = langMap[blogPayload.lang] ?? 0n;
159
+ const expectedCommitment = `0x${poseidon5([authorHash, published, integrityHash, words, langCode]).toString(16)}`;
160
+ expect(listing.commitment).toBe(expectedCommitment);
161
+ });
162
+ it("respects custom salt for listing-binding", async () => {
163
+ const client = setupNoArtifactMocks();
164
+ const listing1 = await publish(client, {
165
+ ...blogInput,
166
+ salt: "0xcustomsalt0000000000000000000000000000000000000000000000000000000001",
167
+ });
168
+ const listing2 = await publish(client, {
169
+ ...blogInput,
170
+ salt: "0xcustomsalt0000000000000000000000000000000000000000000000000000000002",
171
+ });
172
+ // Different salts → different listingRoots (commitment stays same)
173
+ expect(listing1.commitment).toBe(listing2.commitment);
174
+ expect(listing1.listingRoot).not.toBe(listing2.listingRoot);
175
+ });
176
+ });
177
+ // ── Content Commitment tests (generic bytes) ────────────────────────
178
+ describe("content-commitment (generic) content", () => {
179
+ const fileBytes = new Uint8Array([
180
+ 0x48, 0x65, 0x6c, 0x6c, 0x6f, // "Hello"
181
+ ]);
182
+ const genericInput = Object.freeze({
183
+ content: Object.freeze({
184
+ type: "generic",
185
+ mimeType: "text/plain",
186
+ payload: fileBytes,
187
+ }),
188
+ price: Object.freeze({ amount: 10000000, currency: "USDC" }),
189
+ did: "did:ethr:0xdef456",
190
+ });
191
+ it("publishes a generic content listing successfully", async () => {
192
+ const client = setupNoArtifactMocks();
193
+ const listing = await publish(client, genericInput);
194
+ expect(listing.schemaId).toBe("content-commitment-v1");
195
+ expect(listing.perSchemaProof.circuitId).toBe("content-commitment-v1");
196
+ expect(listing.listingBindingProof.circuitId).toBe("listing-binding-v1");
197
+ // CID should be present for content-commitment
198
+ expect(listing.cid).toBeDefined();
199
+ expect(listing.cid).toMatch(/^sha256:[0-9a-f]{64}$/);
200
+ });
201
+ it("computes deterministic CID", async () => {
202
+ const client = setupNoArtifactMocks();
203
+ const listing1 = await publish(client, genericInput);
204
+ const listing2 = await publish(client, genericInput);
205
+ expect(listing1.cid).toBe(listing2.cid);
206
+ expect(listing1.commitment).toBe(listing2.commitment);
207
+ });
208
+ it("produces different CIDs for different content", async () => {
209
+ const client = setupNoArtifactMocks();
210
+ const listing1 = await publish(client, genericInput);
211
+ const differentInput = Object.freeze({
212
+ ...genericInput,
213
+ content: Object.freeze({
214
+ type: "generic",
215
+ mimeType: "text/plain",
216
+ payload: new Uint8Array([0x57, 0x6f, 0x72, 0x6c, 0x64]), // "World"
217
+ }),
218
+ });
219
+ const listing2 = await publish(client, differentInput);
220
+ expect(listing1.cid).not.toBe(listing2.cid);
221
+ expect(listing1.commitment).not.toBe(listing2.commitment);
222
+ });
223
+ it("verifies commitment matches Poseidon1 of fileHash", async () => {
224
+ const client = setupNoArtifactMocks();
225
+ const listing = await publish(client, genericInput);
226
+ // Recompute via inlined normalizer logic
227
+ const { poseidon1, poseidon2 } = await import("poseidon-lite");
228
+ const BN254_PRIME = BigInt("21888242871839275222246405745257275088548364400416034343698204186575808495617");
229
+ const CHUNK_SIZE = 31;
230
+ const bytesToFieldElements = (data) => {
231
+ const len = data.length;
232
+ const padLen = CHUNK_SIZE - (len % CHUNK_SIZE);
233
+ const paddedLen = len + padLen;
234
+ const padded = new Uint8Array(paddedLen);
235
+ padded.set(data);
236
+ for (let i = len; i < paddedLen; i++)
237
+ padded[i] = padLen;
238
+ const numChunks = paddedLen / CHUNK_SIZE;
239
+ const elements = new Array(numChunks);
240
+ for (let i = 0; i < numChunks; i++) {
241
+ const offset = i * CHUNK_SIZE;
242
+ let val = 0n;
243
+ for (let j = 0; j < CHUNK_SIZE; j++) {
244
+ val = (val << 8n) | BigInt(padded[offset + j] ?? 0);
245
+ }
246
+ elements[i] = val;
247
+ }
248
+ return elements;
249
+ };
250
+ const reduceElements = (elements, fn) => {
251
+ if (elements.length === 0)
252
+ return 0n;
253
+ let acc = elements[0] ?? 0n;
254
+ for (let i = 1; i < elements.length; i++) {
255
+ acc = fn([acc, elements[i] ?? 0n]);
256
+ }
257
+ return acc;
258
+ };
259
+ const elements = bytesToFieldElements(fileBytes);
260
+ const fileHash = reduceElements(elements, (inputs) => poseidon2(inputs));
261
+ const expectedCommitment = `0x${poseidon1([fileHash]).toString(16)}`;
262
+ expect(listing.commitment).toBe(expectedCommitment);
263
+ });
264
+ });
265
+ // ── File type (same as generic, just different input shape) ─────────
266
+ describe("file content", () => {
267
+ it("publishes a file listing with CID", async () => {
268
+ const client = setupNoArtifactMocks();
269
+ const fileBytes = new Uint8Array([1, 2, 3, 4, 5]);
270
+ const fileInput = Object.freeze({
271
+ content: Object.freeze({
272
+ type: "file",
273
+ name: "test.bin",
274
+ bytes: fileBytes,
275
+ mimeType: "application/octet-stream",
276
+ }),
277
+ price: Object.freeze({ amount: 5000000, currency: "USDC" }),
278
+ did: "did:ethr:0xfile001",
279
+ });
280
+ const listing = await publish(client, fileInput);
281
+ expect(listing.schemaId).toBe("content-commitment-v1");
282
+ expect(listing.cid).toBeDefined();
283
+ expect(listing.cid).toMatch(/^sha256:[0-9a-f]{64}$/);
284
+ });
285
+ });
286
+ // ── Listing-binding proof cross-check ───────────────────────────────
287
+ describe("listing-binding proof", () => {
288
+ it("chains per-schema commitment into listing-binding", async () => {
289
+ const client = setupNoArtifactMocks();
290
+ const blogPayload = Object.freeze({
291
+ author: "did:ethr:0xcross",
292
+ body: "Cross-check test body.",
293
+ published: 1700000000,
294
+ words: 4,
295
+ lang: "en",
296
+ });
297
+ const input = Object.freeze({
298
+ content: Object.freeze({
299
+ type: "blog-article",
300
+ payload: blogPayload,
301
+ }),
302
+ price: Object.freeze({ amount: 100, currency: "USDC" }),
303
+ did: "did:ethr:0xcross",
304
+ salt: "0xdeadbeef00000000000000000000000000000000000000000000000000000000",
305
+ });
306
+ const listing = await publish(client, input);
307
+ // Recompute listingRoot manually to verify
308
+ const schemaId = toScalar("blog-article-v1");
309
+ const priceUsdc = toScalar(100);
310
+ const didScalar = toScalar("did:ethr:0xcross");
311
+ const salt = toScalar("0xdeadbeef00000000000000000000000000000000000000000000000000000000");
312
+ const commitment = BigInt(listing.commitment);
313
+ const expectedRoot = `0x${poseidon5([schemaId, commitment, priceUsdc, didScalar, salt]).toString(16)}`;
314
+ expect(listing.listingRoot).toBe(expectedRoot);
315
+ });
316
+ });
317
+ // ── Error handling ──────────────────────────────────────────────────
318
+ describe("error handling", () => {
319
+ it("throws when circuit metadata fetch fails", async () => {
320
+ const mockFetch = vi.fn().mockRejectedValue(new Error("Network error"));
321
+ const client = create({ apiBase: "http://localhost:8787" });
322
+ client.fetcher = mockFetch;
323
+ const input = Object.freeze({
324
+ content: Object.freeze({
325
+ type: "generic",
326
+ mimeType: "text/plain",
327
+ payload: new Uint8Array([1]),
328
+ }),
329
+ price: Object.freeze({ amount: 100, currency: "USDC" }),
330
+ did: "did:ethr:0xerr",
331
+ });
332
+ await expect(publish(client, input)).rejects.toThrow();
333
+ });
334
+ });
335
+ });
336
+ //# sourceMappingURL=trust402.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust402.test.js","sourceRoot":"","sources":["../src/trust402.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@trust402/sdk",
3
+ "version": "0.1.0",
4
+ "license": "Apache-2.0",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/lemmaoracle/lemma.git",
8
+ "directory": "packages/trust402"
9
+ },
10
+ "homepage": "https://github.com/lemmaoracle/lemma/tree/main/packages/trust402#readme",
11
+ "type": "module",
12
+ "main": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js",
18
+ "default": "./dist/index.js"
19
+ }
20
+ },
21
+ "files": [
22
+ "dist"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc -p tsconfig.json",
26
+ "type-check": "tsc -p tsconfig.json --noEmit",
27
+ "lint": "eslint 'src/**/*.ts'",
28
+ "test": "vitest run"
29
+ },
30
+ "dependencies": {
31
+ "@lemmaoracle/sdk": "workspace:*",
32
+ "@lemmaoracle/spec": "workspace:*",
33
+ "@noble/hashes": "^1.7.0",
34
+ "poseidon-lite": "^0.2.0"
35
+ },
36
+ "devDependencies": {
37
+ "@typescript-eslint/eslint-plugin": "^8.56.1",
38
+ "@typescript-eslint/parser": "^8.56.1",
39
+ "eslint": "^9.39.3",
40
+ "eslint-config-prettier": "^9.1.0",
41
+ "eslint-plugin-functional": "^9.0.4",
42
+ "typescript": "^5.5.0",
43
+ "vitest": "^2.1.0"
44
+ }
45
+ }