og-fe-tee-verification 0.0.1
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 +97 -0
- package/dist/cjs/index.d.ts +230 -0
- package/dist/cjs/index.js +441 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/esm/index.d.mts +230 -0
- package/dist/esm/index.mjs +400 -0
- package/dist/esm/index.mjs.map +1 -0
- package/package.json +63 -0
|
@@ -0,0 +1,441 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var src_exports = {};
|
|
22
|
+
__export(src_exports, {
|
|
23
|
+
DEFAULT_WALRUS_AGGREGATOR_URL: () => DEFAULT_WALRUS_AGGREGATOR_URL,
|
|
24
|
+
DEFAULT_WALRUS_RPC_URL: () => DEFAULT_WALRUS_RPC_URL,
|
|
25
|
+
DEFAULT_WALRUS_VERIFIER_CONTRACT_ADDRESS: () => DEFAULT_WALRUS_VERIFIER_CONTRACT_ADDRESS,
|
|
26
|
+
WALRUS_BATCH_LEAF_ENCODING: () => WALRUS_BATCH_LEAF_ENCODING,
|
|
27
|
+
WalrusBlobFetchError: () => WalrusBlobFetchError,
|
|
28
|
+
createWalrusClient: () => createWalrusClient,
|
|
29
|
+
encodeWalrusSignature: () => encodeWalrusSignature,
|
|
30
|
+
fetchWalrusBatchTree: () => fetchWalrusBatchTree,
|
|
31
|
+
fetchWalrusBlob: () => fetchWalrusBlob,
|
|
32
|
+
fetchWalrusBlobBytes: () => fetchWalrusBlobBytes,
|
|
33
|
+
fetchWalrusBlobJson: () => fetchWalrusBlobJson,
|
|
34
|
+
fetchWalrusBlobText: () => fetchWalrusBlobText,
|
|
35
|
+
getWalrusBlobUrl: () => getWalrusBlobUrl,
|
|
36
|
+
isWalrusBlobFetchError: () => isWalrusBlobFetchError,
|
|
37
|
+
parseWalrusBatchTree: () => parseWalrusBatchTree,
|
|
38
|
+
verifyWalrusBatchTreeItemSignature: () => verifyWalrusBatchTreeItemSignature,
|
|
39
|
+
verifyWalrusBatchTreeSignatures: () => verifyWalrusBatchTreeSignatures
|
|
40
|
+
});
|
|
41
|
+
module.exports = __toCommonJS(src_exports);
|
|
42
|
+
var import_merkle_tree = require("@openzeppelin/merkle-tree");
|
|
43
|
+
var import_viem = require("viem");
|
|
44
|
+
var DEFAULT_WALRUS_AGGREGATOR_URL = "https://aggregator.suicore.com";
|
|
45
|
+
var DEFAULT_WALRUS_VERIFIER_CONTRACT_ADDRESS = "0xa06dAFA3D713b74e4e1E74B34bd1588C9FD6C290";
|
|
46
|
+
var DEFAULT_WALRUS_RPC_URL = "https://ogevmdevnet.opengradient.ai";
|
|
47
|
+
var WALRUS_BATCH_LEAF_ENCODING = [
|
|
48
|
+
"bytes32",
|
|
49
|
+
"bytes32",
|
|
50
|
+
"bytes32",
|
|
51
|
+
"bytes",
|
|
52
|
+
"uint256"
|
|
53
|
+
];
|
|
54
|
+
var verifierContractAbi = [
|
|
55
|
+
{
|
|
56
|
+
type: "function",
|
|
57
|
+
name: "verifySignatureNoTimestamp",
|
|
58
|
+
stateMutability: "view",
|
|
59
|
+
inputs: [
|
|
60
|
+
{
|
|
61
|
+
name: "teeId",
|
|
62
|
+
type: "bytes32"
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: "inputHash",
|
|
66
|
+
type: "bytes32"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
name: "outputHash",
|
|
70
|
+
type: "bytes32"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
name: "timestamp",
|
|
74
|
+
type: "uint256"
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
name: "signature",
|
|
78
|
+
type: "bytes"
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
outputs: [
|
|
82
|
+
{
|
|
83
|
+
name: "",
|
|
84
|
+
type: "bool"
|
|
85
|
+
}
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
];
|
|
89
|
+
var WalrusBlobFetchError = class extends Error {
|
|
90
|
+
/**
|
|
91
|
+
* Creates a new Walrus blob fetch error.
|
|
92
|
+
*
|
|
93
|
+
* @param blobId - The blob ID that was requested.
|
|
94
|
+
* @param response - The failed HTTP response.
|
|
95
|
+
* @param url - The resolved blob URL.
|
|
96
|
+
*/
|
|
97
|
+
constructor(blobId, response, url) {
|
|
98
|
+
super(
|
|
99
|
+
`Failed to fetch Walrus blob "${blobId}" from ${url}: ${response.status} ${response.statusText}`
|
|
100
|
+
);
|
|
101
|
+
this.name = "WalrusBlobFetchError";
|
|
102
|
+
this.blobId = blobId;
|
|
103
|
+
this.status = response.status;
|
|
104
|
+
this.statusText = response.statusText;
|
|
105
|
+
this.url = url;
|
|
106
|
+
}
|
|
107
|
+
};
|
|
108
|
+
function isWalrusBlobFetchError(error) {
|
|
109
|
+
return error instanceof WalrusBlobFetchError;
|
|
110
|
+
}
|
|
111
|
+
function getWalrusBlobUrl(blobId, options = {}) {
|
|
112
|
+
const normalizedBlobId = normalizeBlobId(blobId);
|
|
113
|
+
const baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_WALRUS_AGGREGATOR_URL);
|
|
114
|
+
return `${baseUrl}/v1/blobs/${encodeURIComponent(normalizedBlobId)}`;
|
|
115
|
+
}
|
|
116
|
+
async function fetchWalrusBlob(blobId, options = {}) {
|
|
117
|
+
const { baseUrl, fetch: fetchImplementation, ...requestInit } = options;
|
|
118
|
+
const resolvedFetch = resolveFetch(fetchImplementation);
|
|
119
|
+
const normalizedBlobId = normalizeBlobId(blobId);
|
|
120
|
+
const url = getWalrusBlobUrl(normalizedBlobId, { baseUrl });
|
|
121
|
+
const response = await resolvedFetch(url, {
|
|
122
|
+
...requestInit,
|
|
123
|
+
method: "GET"
|
|
124
|
+
});
|
|
125
|
+
if (!response.ok) {
|
|
126
|
+
throw new WalrusBlobFetchError(normalizedBlobId, response, url);
|
|
127
|
+
}
|
|
128
|
+
return response;
|
|
129
|
+
}
|
|
130
|
+
async function fetchWalrusBlobBytes(blobId, options = {}) {
|
|
131
|
+
const response = await fetchWalrusBlob(blobId, options);
|
|
132
|
+
return response.arrayBuffer();
|
|
133
|
+
}
|
|
134
|
+
async function fetchWalrusBlobText(blobId, options = {}) {
|
|
135
|
+
const response = await fetchWalrusBlob(blobId, options);
|
|
136
|
+
return response.text();
|
|
137
|
+
}
|
|
138
|
+
async function fetchWalrusBlobJson(blobId, options = {}) {
|
|
139
|
+
const response = await fetchWalrusBlob(blobId, options);
|
|
140
|
+
return await response.json();
|
|
141
|
+
}
|
|
142
|
+
async function fetchWalrusBatchTree(blobId, options = {}) {
|
|
143
|
+
const normalizedBlobId = normalizeBlobId(blobId);
|
|
144
|
+
const dump = await fetchWalrusBlobJson(normalizedBlobId, options);
|
|
145
|
+
return parseWalrusBatchTree(normalizedBlobId, dump);
|
|
146
|
+
}
|
|
147
|
+
function parseWalrusBatchTree(blobId, dump) {
|
|
148
|
+
validateWalrusBatchTreeDump(dump);
|
|
149
|
+
const tree = import_merkle_tree.StandardMerkleTree.load(dump);
|
|
150
|
+
const items = Array.from(tree.entries()).map(([index, value]) => {
|
|
151
|
+
const tuple = normalizeWalrusBatchLeafTuple(value);
|
|
152
|
+
return {
|
|
153
|
+
index,
|
|
154
|
+
tee_id: tuple[0],
|
|
155
|
+
input_hash: tuple[1],
|
|
156
|
+
output_hash: tuple[2],
|
|
157
|
+
tee_signature: tuple[3],
|
|
158
|
+
tee_timestamp: tuple[4],
|
|
159
|
+
tuple
|
|
160
|
+
};
|
|
161
|
+
});
|
|
162
|
+
return {
|
|
163
|
+
blobId,
|
|
164
|
+
merkleRoot: tree.root,
|
|
165
|
+
tree,
|
|
166
|
+
dump,
|
|
167
|
+
items
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
function encodeWalrusSignature(signature, encoding = "auto") {
|
|
171
|
+
const normalizedSignature = normalizeRequiredString(signature, "teeSignature");
|
|
172
|
+
if (encoding === "hex" || encoding === "auto" && isHexLike(normalizedSignature)) {
|
|
173
|
+
return normalizeHex(normalizedSignature);
|
|
174
|
+
}
|
|
175
|
+
if (encoding === "base64") {
|
|
176
|
+
return base64ToHex(normalizedSignature);
|
|
177
|
+
}
|
|
178
|
+
return (0, import_viem.toHex)(normalizedSignature);
|
|
179
|
+
}
|
|
180
|
+
async function verifyWalrusBatchTreeItemSignature(args) {
|
|
181
|
+
return args.publicClient.readContract({
|
|
182
|
+
address: resolveVerifierContractAddress(args),
|
|
183
|
+
abi: verifierContractAbi,
|
|
184
|
+
functionName: "verifySignatureNoTimestamp",
|
|
185
|
+
args: [
|
|
186
|
+
args.item.tee_id,
|
|
187
|
+
args.item.input_hash,
|
|
188
|
+
args.item.output_hash,
|
|
189
|
+
BigInt(args.item.tee_timestamp),
|
|
190
|
+
args.item.tee_signature
|
|
191
|
+
]
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
async function verifyWalrusBatchTreeSignatures(args) {
|
|
195
|
+
const loadedTree = args.tree ?? await fetchWalrusBatchTree(args.blobId ?? "", {
|
|
196
|
+
baseUrl: args.aggregatorUrl,
|
|
197
|
+
fetch: args.fetch
|
|
198
|
+
});
|
|
199
|
+
const results = await Promise.all(
|
|
200
|
+
loadedTree.items.map(async (item) => {
|
|
201
|
+
try {
|
|
202
|
+
const verified = await args.publicClient.readContract({
|
|
203
|
+
address: resolveVerifierContractAddress(args),
|
|
204
|
+
abi: verifierContractAbi,
|
|
205
|
+
functionName: "verifySignatureNoTimestamp",
|
|
206
|
+
args: [
|
|
207
|
+
item.tee_id,
|
|
208
|
+
item.input_hash,
|
|
209
|
+
item.output_hash,
|
|
210
|
+
BigInt(item.tee_timestamp),
|
|
211
|
+
item.tee_signature
|
|
212
|
+
]
|
|
213
|
+
});
|
|
214
|
+
return {
|
|
215
|
+
item,
|
|
216
|
+
verified
|
|
217
|
+
};
|
|
218
|
+
} catch (error) {
|
|
219
|
+
return {
|
|
220
|
+
item,
|
|
221
|
+
verified: null,
|
|
222
|
+
error: error instanceof Error ? error.message : String(error)
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
})
|
|
226
|
+
);
|
|
227
|
+
return {
|
|
228
|
+
blobId: loadedTree.blobId,
|
|
229
|
+
merkleRoot: loadedTree.merkleRoot,
|
|
230
|
+
results
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
function createWalrusClient(options = {}) {
|
|
234
|
+
return {
|
|
235
|
+
getBlobUrl(blobId) {
|
|
236
|
+
return getWalrusBlobUrl(blobId, options);
|
|
237
|
+
},
|
|
238
|
+
fetchBlob(blobId, requestInit = {}) {
|
|
239
|
+
return fetchWalrusBlob(blobId, { ...options, ...requestInit });
|
|
240
|
+
},
|
|
241
|
+
fetchBlobBytes(blobId, requestInit = {}) {
|
|
242
|
+
return fetchWalrusBlobBytes(blobId, { ...options, ...requestInit });
|
|
243
|
+
},
|
|
244
|
+
fetchBlobText(blobId, requestInit = {}) {
|
|
245
|
+
return fetchWalrusBlobText(blobId, { ...options, ...requestInit });
|
|
246
|
+
},
|
|
247
|
+
fetchBlobJson(blobId, requestInit = {}) {
|
|
248
|
+
return fetchWalrusBlobJson(blobId, { ...options, ...requestInit });
|
|
249
|
+
},
|
|
250
|
+
fetchBatchTree(blobId, requestInit = {}) {
|
|
251
|
+
return fetchWalrusBatchTree(blobId, { ...options, ...requestInit });
|
|
252
|
+
},
|
|
253
|
+
verifyBatchTreeSignatures(args) {
|
|
254
|
+
return verifyWalrusBatchTreeSignatures({
|
|
255
|
+
...args,
|
|
256
|
+
blobId: args.tree?.blobId,
|
|
257
|
+
fetch: options.fetch,
|
|
258
|
+
aggregatorUrl: args.aggregatorUrl ?? options.baseUrl
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
function resolveFetch(fetchImplementation) {
|
|
264
|
+
const resolvedFetch = fetchImplementation ?? globalThis.fetch;
|
|
265
|
+
if (!resolvedFetch) {
|
|
266
|
+
throw new Error(
|
|
267
|
+
"No fetch implementation available. Pass one in the options or use a runtime with globalThis.fetch."
|
|
268
|
+
);
|
|
269
|
+
}
|
|
270
|
+
return resolvedFetch;
|
|
271
|
+
}
|
|
272
|
+
function normalizeBlobId(blobId) {
|
|
273
|
+
const normalizedBlobId = blobId.trim();
|
|
274
|
+
if (normalizedBlobId.length === 0) {
|
|
275
|
+
throw new Error("Walrus blob ID is required.");
|
|
276
|
+
}
|
|
277
|
+
return decodeHexEncodedBlobId(normalizedBlobId);
|
|
278
|
+
}
|
|
279
|
+
function normalizeBaseUrl(baseUrl) {
|
|
280
|
+
const normalizedBaseUrl = baseUrl.trim().replace(/\/+$/, "");
|
|
281
|
+
if (normalizedBaseUrl.length === 0) {
|
|
282
|
+
throw new Error("Walrus aggregator base URL is required.");
|
|
283
|
+
}
|
|
284
|
+
return normalizedBaseUrl;
|
|
285
|
+
}
|
|
286
|
+
function normalizeRequiredString(value, fieldName) {
|
|
287
|
+
const normalizedValue = value.trim();
|
|
288
|
+
if (normalizedValue.length === 0) {
|
|
289
|
+
throw new Error(`${fieldName} is required.`);
|
|
290
|
+
}
|
|
291
|
+
return normalizedValue;
|
|
292
|
+
}
|
|
293
|
+
function normalizeHex(value) {
|
|
294
|
+
const normalizedValue = normalizeRequiredString(value, "hex");
|
|
295
|
+
return normalizedValue.startsWith("0x") ? normalizedValue : `0x${normalizedValue}`;
|
|
296
|
+
}
|
|
297
|
+
function normalizeAddress(value, fieldName) {
|
|
298
|
+
const normalizedValue = normalizeHex(value);
|
|
299
|
+
if (!/^0x[0-9a-fA-F]{40}$/.test(normalizedValue)) {
|
|
300
|
+
throw new Error(`${fieldName} must be a valid EVM address.`);
|
|
301
|
+
}
|
|
302
|
+
return normalizedValue;
|
|
303
|
+
}
|
|
304
|
+
function resolveVerifierContractAddress(args) {
|
|
305
|
+
const verifierContractAddress = args.verifierContractAddress ?? DEFAULT_WALRUS_VERIFIER_CONTRACT_ADDRESS;
|
|
306
|
+
return normalizeAddress(verifierContractAddress, "verifierContractAddress");
|
|
307
|
+
}
|
|
308
|
+
function normalizeBytes32(value, fieldName) {
|
|
309
|
+
const normalizedValue = normalizeHex(value);
|
|
310
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(normalizedValue)) {
|
|
311
|
+
throw new Error(`${fieldName} must be a bytes32 hex string.`);
|
|
312
|
+
}
|
|
313
|
+
return normalizedValue;
|
|
314
|
+
}
|
|
315
|
+
function normalizeUint256(value, fieldName) {
|
|
316
|
+
if (typeof value === "bigint") {
|
|
317
|
+
if (value < 0n) {
|
|
318
|
+
throw new Error(`${fieldName} must be a non-negative uint256.`);
|
|
319
|
+
}
|
|
320
|
+
return value.toString();
|
|
321
|
+
}
|
|
322
|
+
if (typeof value === "number") {
|
|
323
|
+
if (!Number.isInteger(value) || value < 0) {
|
|
324
|
+
throw new Error(`${fieldName} must be a non-negative uint256.`);
|
|
325
|
+
}
|
|
326
|
+
return value.toString();
|
|
327
|
+
}
|
|
328
|
+
if (typeof value !== "string") {
|
|
329
|
+
throw new Error(`${fieldName} must be a string, number, or bigint.`);
|
|
330
|
+
}
|
|
331
|
+
const normalizedValue = value.trim();
|
|
332
|
+
if (normalizedValue.length === 0) {
|
|
333
|
+
throw new Error(`${fieldName} is required.`);
|
|
334
|
+
}
|
|
335
|
+
if (!/^[0-9]+$/.test(normalizedValue)) {
|
|
336
|
+
throw new Error(`${fieldName} must be a base-10 uint256 string.`);
|
|
337
|
+
}
|
|
338
|
+
return normalizedValue;
|
|
339
|
+
}
|
|
340
|
+
function validateWalrusBatchTreeDump(value) {
|
|
341
|
+
if (!isRecord(value)) {
|
|
342
|
+
throw new Error("Walrus batch blob must be a JSON object.");
|
|
343
|
+
}
|
|
344
|
+
if (value.format !== "standard-v1") {
|
|
345
|
+
throw new Error("Unsupported Walrus Merkle tree format.");
|
|
346
|
+
}
|
|
347
|
+
if (!Array.isArray(value.leafEncoding)) {
|
|
348
|
+
throw new Error("Walrus batch tree is missing leafEncoding.");
|
|
349
|
+
}
|
|
350
|
+
const matchesExpectedEncoding = value.leafEncoding.length === WALRUS_BATCH_LEAF_ENCODING.length && value.leafEncoding.every((item, index) => item === WALRUS_BATCH_LEAF_ENCODING[index]);
|
|
351
|
+
if (!matchesExpectedEncoding) {
|
|
352
|
+
throw new Error(
|
|
353
|
+
`Unexpected Walrus batch leaf encoding. Expected ${WALRUS_BATCH_LEAF_ENCODING.join(", ")}`
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
if (!Array.isArray(value.tree) || !Array.isArray(value.values)) {
|
|
357
|
+
throw new Error("Walrus batch tree is missing tree or values arrays.");
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
function normalizeWalrusBatchLeafTuple(value) {
|
|
361
|
+
if (!Array.isArray(value) || value.length !== 5) {
|
|
362
|
+
throw new Error("Walrus batch tree item must be a 5-field tuple.");
|
|
363
|
+
}
|
|
364
|
+
return [
|
|
365
|
+
normalizeBytes32(String(value[0]), "tee_id"),
|
|
366
|
+
normalizeBytes32(String(value[1]), "input_hash"),
|
|
367
|
+
normalizeBytes32(String(value[2]), "output_hash"),
|
|
368
|
+
normalizeBytes(String(value[3]), "tee_signature"),
|
|
369
|
+
normalizeUint256(value[4], "tee_timestamp")
|
|
370
|
+
];
|
|
371
|
+
}
|
|
372
|
+
function isHexLike(value) {
|
|
373
|
+
return /^0x[0-9a-fA-F]+$/.test(value);
|
|
374
|
+
}
|
|
375
|
+
function normalizeBytes(value, fieldName) {
|
|
376
|
+
const normalizedValue = normalizeHex(value);
|
|
377
|
+
if (!isHexLike(normalizedValue) || (normalizedValue.length - 2) % 2 !== 0) {
|
|
378
|
+
throw new Error(`${fieldName} must be valid bytes hex.`);
|
|
379
|
+
}
|
|
380
|
+
return normalizedValue;
|
|
381
|
+
}
|
|
382
|
+
function base64ToHex(value) {
|
|
383
|
+
const decodedValue = decodeBase64(value);
|
|
384
|
+
let hex = "0x";
|
|
385
|
+
for (let index = 0; index < decodedValue.length; index += 1) {
|
|
386
|
+
hex += decodedValue.charCodeAt(index).toString(16).padStart(2, "0");
|
|
387
|
+
}
|
|
388
|
+
return hex;
|
|
389
|
+
}
|
|
390
|
+
function decodeBase64(value) {
|
|
391
|
+
if (typeof globalThis.atob === "function") {
|
|
392
|
+
return globalThis.atob(value);
|
|
393
|
+
}
|
|
394
|
+
throw new Error("Base64 signature decoding requires globalThis.atob in this runtime.");
|
|
395
|
+
}
|
|
396
|
+
function isRecord(value) {
|
|
397
|
+
return typeof value === "object" && value !== null;
|
|
398
|
+
}
|
|
399
|
+
function decodeHexEncodedBlobId(blobId) {
|
|
400
|
+
if (!/^0x[0-9a-fA-F]+$/.test(blobId)) {
|
|
401
|
+
return blobId;
|
|
402
|
+
}
|
|
403
|
+
const hexValue = blobId.slice(2);
|
|
404
|
+
if (hexValue.length === 0 || hexValue.length % 2 !== 0) {
|
|
405
|
+
return blobId;
|
|
406
|
+
}
|
|
407
|
+
try {
|
|
408
|
+
const bytes = new Uint8Array(hexValue.length / 2);
|
|
409
|
+
for (let index = 0; index < hexValue.length; index += 2) {
|
|
410
|
+
bytes[index / 2] = Number.parseInt(hexValue.slice(index, index + 2), 16);
|
|
411
|
+
}
|
|
412
|
+
const decodedBlobId = new TextDecoder("utf-8", { fatal: true }).decode(bytes);
|
|
413
|
+
if (!/^[\x21-\x7E]+$/.test(decodedBlobId)) {
|
|
414
|
+
return blobId;
|
|
415
|
+
}
|
|
416
|
+
return decodedBlobId;
|
|
417
|
+
} catch {
|
|
418
|
+
return blobId;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
422
|
+
0 && (module.exports = {
|
|
423
|
+
DEFAULT_WALRUS_AGGREGATOR_URL,
|
|
424
|
+
DEFAULT_WALRUS_RPC_URL,
|
|
425
|
+
DEFAULT_WALRUS_VERIFIER_CONTRACT_ADDRESS,
|
|
426
|
+
WALRUS_BATCH_LEAF_ENCODING,
|
|
427
|
+
WalrusBlobFetchError,
|
|
428
|
+
createWalrusClient,
|
|
429
|
+
encodeWalrusSignature,
|
|
430
|
+
fetchWalrusBatchTree,
|
|
431
|
+
fetchWalrusBlob,
|
|
432
|
+
fetchWalrusBlobBytes,
|
|
433
|
+
fetchWalrusBlobJson,
|
|
434
|
+
fetchWalrusBlobText,
|
|
435
|
+
getWalrusBlobUrl,
|
|
436
|
+
isWalrusBlobFetchError,
|
|
437
|
+
parseWalrusBatchTree,
|
|
438
|
+
verifyWalrusBatchTreeItemSignature,
|
|
439
|
+
verifyWalrusBatchTreeSignatures
|
|
440
|
+
});
|
|
441
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import { StandardMerkleTree } from \"@openzeppelin/merkle-tree\";\nimport { toHex, type Hex } from \"viem\";\n\nexport const DEFAULT_WALRUS_AGGREGATOR_URL = \"https://aggregator.suicore.com\";\nexport const DEFAULT_WALRUS_VERIFIER_CONTRACT_ADDRESS =\n \"0xa06dAFA3D713b74e4e1E74B34bd1588C9FD6C290\" as Hex;\nexport const DEFAULT_WALRUS_RPC_URL = \"https://ogevmdevnet.opengradient.ai\";\n\nexport const WALRUS_BATCH_LEAF_ENCODING = [\n \"bytes32\",\n \"bytes32\",\n \"bytes32\",\n \"bytes\",\n \"uint256\",\n] as const;\n\nconst verifierContractAbi = [\n {\n type: \"function\",\n name: \"verifySignatureNoTimestamp\",\n stateMutability: \"view\",\n inputs: [\n {\n name: \"teeId\",\n type: \"bytes32\",\n },\n {\n name: \"inputHash\",\n type: \"bytes32\",\n },\n {\n name: \"outputHash\",\n type: \"bytes32\",\n },\n {\n name: \"timestamp\",\n type: \"uint256\",\n },\n {\n name: \"signature\",\n type: \"bytes\",\n },\n ],\n outputs: [\n {\n name: \"\",\n type: \"bool\",\n },\n ],\n },\n] as const;\n\n/**\n * Shared client options for Walrus blob requests.\n */\nexport interface WalrusClientOptions {\n /**\n * Base aggregator URL.\n *\n * @defaultValue \"https://aggregator.suicore.com\"\n */\n baseUrl?: string;\n\n /**\n * Fetch implementation to use. Defaults to `globalThis.fetch`.\n */\n fetch?: typeof globalThis.fetch;\n}\n\n/**\n * Request options for blob fetches.\n */\nexport interface FetchWalrusBlobOptions\n extends Omit<RequestInit, \"body\" | \"method\">,\n WalrusClientOptions {}\n\nexport type WalrusBatchLeafTuple = [Hex, Hex, Hex, Hex, string];\n\nexport type WalrusBatchTreeDump = {\n format: \"standard-v1\";\n leafEncoding: string[];\n tree: Hex[];\n values: Array<{\n value: WalrusBatchLeafTuple;\n treeIndex: number;\n hash: Hex;\n }>;\n};\n\nexport type WalrusBatchTreeItem = {\n index: number;\n tee_id: Hex;\n input_hash: Hex;\n output_hash: Hex;\n tee_signature: Hex;\n tee_timestamp: string;\n tuple: WalrusBatchLeafTuple;\n};\n\nexport type LoadedWalrusBatchTree = {\n blobId: string;\n merkleRoot: Hex;\n tree: StandardMerkleTree<WalrusBatchLeafTuple>;\n dump: WalrusBatchTreeDump;\n items: WalrusBatchTreeItem[];\n};\n\nexport type WalrusSignatureEncoding = \"auto\" | \"hex\" | \"utf8\" | \"base64\";\n\nexport type WalrusSignatureVerificationClient = {\n readContract(args: {\n address: Hex;\n abi: typeof verifierContractAbi;\n functionName: \"verifySignatureNoTimestamp\";\n args: readonly [Hex, Hex, Hex, bigint, Hex];\n }): Promise<boolean>;\n};\n\nexport type VerifyWalrusBatchTreeItemSignatureArgs = {\n item: WalrusBatchTreeItem;\n verifierContractAddress?: Hex;\n publicClient: WalrusSignatureVerificationClient;\n};\n\nexport type VerifyWalrusBatchTreeSignaturesArgs = {\n blobId?: string;\n tree?: LoadedWalrusBatchTree;\n verifierContractAddress?: Hex;\n publicClient: WalrusSignatureVerificationClient;\n aggregatorUrl?: string;\n fetch?: typeof globalThis.fetch;\n};\n\nexport type WalrusBatchTreeItemVerification = {\n item: WalrusBatchTreeItem;\n verified: boolean | null;\n error?: string;\n};\n\nexport type WalrusBatchTreeVerificationResult = {\n blobId: string;\n merkleRoot: Hex;\n results: WalrusBatchTreeItemVerification[];\n};\n\n/**\n * Thrown when a Walrus blob request fails.\n */\nexport class WalrusBlobFetchError extends Error {\n public readonly blobId: string;\n public readonly status: number;\n public readonly statusText: string;\n public readonly url: string;\n\n /**\n * Creates a new Walrus blob fetch error.\n *\n * @param blobId - The blob ID that was requested.\n * @param response - The failed HTTP response.\n * @param url - The resolved blob URL.\n */\n public constructor(blobId: string, response: Response, url: string) {\n super(\n `Failed to fetch Walrus blob \"${blobId}\" from ${url}: ${response.status} ${response.statusText}`,\n );\n this.name = \"WalrusBlobFetchError\";\n this.blobId = blobId;\n this.status = response.status;\n this.statusText = response.statusText;\n this.url = url;\n }\n}\n\n/**\n * Type guard for Walrus blob fetch errors.\n *\n * @param error - Unknown thrown value.\n * @returns Whether the value is a WalrusBlobFetchError.\n */\nexport function isWalrusBlobFetchError(error: unknown): error is WalrusBlobFetchError {\n return error instanceof WalrusBlobFetchError;\n}\n\n/**\n * Builds the Sui Core aggregator URL for a Walrus blob ID.\n *\n * @param blobId - Walrus blob ID.\n * @param options - Optional URL settings.\n * @returns The full blob URL.\n */\nexport function getWalrusBlobUrl(\n blobId: string,\n options: Pick<WalrusClientOptions, \"baseUrl\"> = {},\n): string {\n const normalizedBlobId = normalizeBlobId(blobId);\n const baseUrl = normalizeBaseUrl(options.baseUrl ?? DEFAULT_WALRUS_AGGREGATOR_URL);\n return `${baseUrl}/v1/blobs/${encodeURIComponent(normalizedBlobId)}`;\n}\n\n/**\n * Fetches a Walrus blob and returns the raw HTTP response.\n *\n * @param blobId - Walrus blob ID.\n * @param options - Optional request configuration.\n * @returns The successful blob response.\n */\nexport async function fetchWalrusBlob(\n blobId: string,\n options: FetchWalrusBlobOptions = {},\n): Promise<Response> {\n const { baseUrl, fetch: fetchImplementation, ...requestInit } = options;\n const resolvedFetch = resolveFetch(fetchImplementation);\n const normalizedBlobId = normalizeBlobId(blobId);\n const url = getWalrusBlobUrl(normalizedBlobId, { baseUrl });\n const response = await resolvedFetch(url, {\n ...requestInit,\n method: \"GET\",\n });\n\n if (!response.ok) {\n throw new WalrusBlobFetchError(normalizedBlobId, response, url);\n }\n\n return response;\n}\n\n/**\n * Fetches a Walrus blob and returns its bytes.\n *\n * @param blobId - Walrus blob ID.\n * @param options - Optional request configuration.\n * @returns The blob bytes.\n */\nexport async function fetchWalrusBlobBytes(\n blobId: string,\n options: FetchWalrusBlobOptions = {},\n): Promise<ArrayBuffer> {\n const response = await fetchWalrusBlob(blobId, options);\n return response.arrayBuffer();\n}\n\n/**\n * Fetches a Walrus blob and returns its text content.\n *\n * @param blobId - Walrus blob ID.\n * @param options - Optional request configuration.\n * @returns The blob body as text.\n */\nexport async function fetchWalrusBlobText(\n blobId: string,\n options: FetchWalrusBlobOptions = {},\n): Promise<string> {\n const response = await fetchWalrusBlob(blobId, options);\n return response.text();\n}\n\n/**\n * Fetches a Walrus blob and parses it as JSON.\n *\n * @param blobId - Walrus blob ID.\n * @param options - Optional request configuration.\n * @returns The parsed JSON payload.\n */\nexport async function fetchWalrusBlobJson<T>(\n blobId: string,\n options: FetchWalrusBlobOptions = {},\n): Promise<T> {\n const response = await fetchWalrusBlob(blobId, options);\n return (await response.json()) as T;\n}\n\n/**\n * Fetches and parses a Walrus batch Merkle tree blob.\n *\n * @param blobId - Walrus batch blob ID.\n * @param options - Optional request configuration.\n * @returns The loaded tree plus decoded batch items.\n */\nexport async function fetchWalrusBatchTree(\n blobId: string,\n options: FetchWalrusBlobOptions = {},\n): Promise<LoadedWalrusBatchTree> {\n const normalizedBlobId = normalizeBlobId(blobId);\n const dump = await fetchWalrusBlobJson<WalrusBatchTreeDump>(normalizedBlobId, options);\n return parseWalrusBatchTree(normalizedBlobId, dump);\n}\n\n/**\n * Parses a Walrus batch Merkle tree payload into strongly typed items.\n *\n * @param blobId - Walrus batch blob ID.\n * @param dump - Raw tree dump JSON.\n * @returns The loaded tree plus decoded batch items.\n */\nexport function parseWalrusBatchTree(\n blobId: string,\n dump: WalrusBatchTreeDump,\n): LoadedWalrusBatchTree {\n validateWalrusBatchTreeDump(dump);\n\n const tree = StandardMerkleTree.load<WalrusBatchLeafTuple>(dump);\n const items = Array.from(tree.entries()).map(([index, value]) => {\n const tuple = normalizeWalrusBatchLeafTuple(value);\n return {\n index,\n tee_id: tuple[0],\n input_hash: tuple[1],\n output_hash: tuple[2],\n tee_signature: tuple[3],\n tee_timestamp: tuple[4],\n tuple,\n };\n });\n\n return {\n blobId,\n merkleRoot: tree.root as Hex,\n tree,\n dump,\n items,\n };\n}\n\n/**\n * Encodes a raw tee signature into bytes calldata for the onchain verifySignatureNoTimestamp call.\n *\n * @param signature - Raw signature value.\n * @param encoding - Signature encoding strategy.\n * @returns Encoded bytes calldata.\n */\nexport function encodeWalrusSignature(\n signature: string,\n encoding: WalrusSignatureEncoding = \"auto\",\n): Hex {\n const normalizedSignature = normalizeRequiredString(signature, \"teeSignature\");\n\n if (encoding === \"hex\" || (encoding === \"auto\" && isHexLike(normalizedSignature))) {\n return normalizeHex(normalizedSignature);\n }\n\n if (encoding === \"base64\") {\n return base64ToHex(normalizedSignature);\n }\n\n return toHex(normalizedSignature);\n}\n\n/**\n * Calls verifySignatureNoTimestamp for a single Walrus batch item.\n *\n * @param args - Verification inputs for one batch item.\n * @returns Whether the onchain verifySignatureNoTimestamp call returned true.\n */\nexport async function verifyWalrusBatchTreeItemSignature(\n args: VerifyWalrusBatchTreeItemSignatureArgs,\n): Promise<boolean> {\n return args.publicClient.readContract({\n address: resolveVerifierContractAddress(args),\n abi: verifierContractAbi,\n functionName: \"verifySignatureNoTimestamp\",\n args: [\n args.item.tee_id,\n args.item.input_hash,\n args.item.output_hash,\n BigInt(args.item.tee_timestamp),\n args.item.tee_signature,\n ],\n });\n}\n\n/**\n * Calls verifySignatureNoTimestamp for every item in a Walrus batch tree.\n *\n * @param args - Verification inputs for the whole Walrus batch tree.\n * @returns Per-item verification results.\n */\nexport async function verifyWalrusBatchTreeSignatures(\n args: VerifyWalrusBatchTreeSignaturesArgs,\n): Promise<WalrusBatchTreeVerificationResult> {\n const loadedTree =\n args.tree ??\n (await fetchWalrusBatchTree(args.blobId ?? \"\", {\n baseUrl: args.aggregatorUrl,\n fetch: args.fetch,\n }));\n\n const results = await Promise.all(\n loadedTree.items.map(async item => {\n try {\n const verified = await args.publicClient.readContract({\n address: resolveVerifierContractAddress(args),\n abi: verifierContractAbi,\n functionName: \"verifySignatureNoTimestamp\",\n args: [\n item.tee_id,\n item.input_hash,\n item.output_hash,\n BigInt(item.tee_timestamp),\n item.tee_signature,\n ],\n });\n\n return {\n item,\n verified,\n } satisfies WalrusBatchTreeItemVerification;\n } catch (error) {\n return {\n item,\n verified: null,\n error: error instanceof Error ? error.message : String(error),\n } satisfies WalrusBatchTreeItemVerification;\n }\n }),\n );\n\n return {\n blobId: loadedTree.blobId,\n merkleRoot: loadedTree.merkleRoot,\n results,\n };\n}\n\n/**\n * Creates a reusable Walrus client.\n *\n * @param options - Shared client options.\n * @returns Bound Walrus helper methods.\n */\nexport function createWalrusClient(options: WalrusClientOptions = {}) {\n return {\n getBlobUrl(blobId: string) {\n return getWalrusBlobUrl(blobId, options);\n },\n fetchBlob(blobId: string, requestInit: FetchWalrusBlobOptions = {}) {\n return fetchWalrusBlob(blobId, { ...options, ...requestInit });\n },\n fetchBlobBytes(blobId: string, requestInit: FetchWalrusBlobOptions = {}) {\n return fetchWalrusBlobBytes(blobId, { ...options, ...requestInit });\n },\n fetchBlobText(blobId: string, requestInit: FetchWalrusBlobOptions = {}) {\n return fetchWalrusBlobText(blobId, { ...options, ...requestInit });\n },\n fetchBlobJson<T>(blobId: string, requestInit: FetchWalrusBlobOptions = {}) {\n return fetchWalrusBlobJson<T>(blobId, { ...options, ...requestInit });\n },\n fetchBatchTree(blobId: string, requestInit: FetchWalrusBlobOptions = {}) {\n return fetchWalrusBatchTree(blobId, { ...options, ...requestInit });\n },\n verifyBatchTreeSignatures(args: Omit<VerifyWalrusBatchTreeSignaturesArgs, \"blobId\" | \"fetch\">) {\n return verifyWalrusBatchTreeSignatures({\n ...args,\n blobId: args.tree?.blobId,\n fetch: options.fetch,\n aggregatorUrl: args.aggregatorUrl ?? options.baseUrl,\n });\n },\n };\n}\n\n/**\n * Resolves the fetch implementation for the current runtime.\n *\n * @param fetchImplementation - Optional fetch implementation override.\n * @returns The fetch implementation to use.\n */\nfunction resolveFetch(fetchImplementation?: typeof globalThis.fetch): typeof globalThis.fetch {\n const resolvedFetch = fetchImplementation ?? globalThis.fetch;\n\n if (!resolvedFetch) {\n throw new Error(\n \"No fetch implementation available. Pass one in the options or use a runtime with globalThis.fetch.\",\n );\n }\n\n return resolvedFetch;\n}\n\n/**\n * Validates and normalizes a blob ID.\n *\n * @param blobId - Candidate blob ID.\n * @returns A trimmed blob ID.\n */\nfunction normalizeBlobId(blobId: string): string {\n const normalizedBlobId = blobId.trim();\n\n if (normalizedBlobId.length === 0) {\n throw new Error(\"Walrus blob ID is required.\");\n }\n\n return decodeHexEncodedBlobId(normalizedBlobId);\n}\n\n/**\n * Removes trailing slashes from a base URL.\n *\n * @param baseUrl - Candidate base URL.\n * @returns The normalized base URL.\n */\nfunction normalizeBaseUrl(baseUrl: string): string {\n const normalizedBaseUrl = baseUrl.trim().replace(/\\/+$/, \"\");\n\n if (normalizedBaseUrl.length === 0) {\n throw new Error(\"Walrus aggregator base URL is required.\");\n }\n\n return normalizedBaseUrl;\n}\n\nfunction normalizeRequiredString(value: string, fieldName: string): string {\n const normalizedValue = value.trim();\n if (normalizedValue.length === 0) {\n throw new Error(`${fieldName} is required.`);\n }\n return normalizedValue;\n}\n\nfunction normalizeHex(value: string): Hex {\n const normalizedValue = normalizeRequiredString(value, \"hex\");\n return (normalizedValue.startsWith(\"0x\") ? normalizedValue : `0x${normalizedValue}`) as Hex;\n}\n\nfunction normalizeAddress(value: string, fieldName: string): Hex {\n const normalizedValue = normalizeHex(value);\n if (!/^0x[0-9a-fA-F]{40}$/.test(normalizedValue)) {\n throw new Error(`${fieldName} must be a valid EVM address.`);\n }\n return normalizedValue;\n}\n\nfunction resolveVerifierContractAddress(args: {\n verifierContractAddress?: string;\n}): Hex {\n const verifierContractAddress =\n args.verifierContractAddress ?? DEFAULT_WALRUS_VERIFIER_CONTRACT_ADDRESS;\n\n return normalizeAddress(verifierContractAddress, \"verifierContractAddress\");\n}\n\nfunction normalizeBytes32(value: string, fieldName: string): Hex {\n const normalizedValue = normalizeHex(value);\n if (!/^0x[0-9a-fA-F]{64}$/.test(normalizedValue)) {\n throw new Error(`${fieldName} must be a bytes32 hex string.`);\n }\n return normalizedValue;\n}\n\nfunction normalizeUint256(value: unknown, fieldName: string): string {\n if (typeof value === \"bigint\") {\n if (value < 0n) {\n throw new Error(`${fieldName} must be a non-negative uint256.`);\n }\n return value.toString();\n }\n\n if (typeof value === \"number\") {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(`${fieldName} must be a non-negative uint256.`);\n }\n return value.toString();\n }\n\n if (typeof value !== \"string\") {\n throw new Error(`${fieldName} must be a string, number, or bigint.`);\n }\n\n const normalizedValue = value.trim();\n if (normalizedValue.length === 0) {\n throw new Error(`${fieldName} is required.`);\n }\n\n if (!/^[0-9]+$/.test(normalizedValue)) {\n throw new Error(`${fieldName} must be a base-10 uint256 string.`);\n }\n\n return normalizedValue;\n}\n\nfunction validateWalrusBatchTreeDump(value: unknown): asserts value is WalrusBatchTreeDump {\n if (!isRecord(value)) {\n throw new Error(\"Walrus batch blob must be a JSON object.\");\n }\n\n if (value.format !== \"standard-v1\") {\n throw new Error(\"Unsupported Walrus Merkle tree format.\");\n }\n\n if (!Array.isArray(value.leafEncoding)) {\n throw new Error(\"Walrus batch tree is missing leafEncoding.\");\n }\n\n const matchesExpectedEncoding =\n value.leafEncoding.length === WALRUS_BATCH_LEAF_ENCODING.length &&\n value.leafEncoding.every((item, index) => item === WALRUS_BATCH_LEAF_ENCODING[index]);\n if (!matchesExpectedEncoding) {\n throw new Error(\n `Unexpected Walrus batch leaf encoding. Expected ${WALRUS_BATCH_LEAF_ENCODING.join(\", \")}`,\n );\n }\n\n if (!Array.isArray(value.tree) || !Array.isArray(value.values)) {\n throw new Error(\"Walrus batch tree is missing tree or values arrays.\");\n }\n}\n\nfunction normalizeWalrusBatchLeafTuple(value: unknown): WalrusBatchLeafTuple {\n if (!Array.isArray(value) || value.length !== 5) {\n throw new Error(\"Walrus batch tree item must be a 5-field tuple.\");\n }\n\n return [\n normalizeBytes32(String(value[0]), \"tee_id\"),\n normalizeBytes32(String(value[1]), \"input_hash\"),\n normalizeBytes32(String(value[2]), \"output_hash\"),\n normalizeBytes(String(value[3]), \"tee_signature\"),\n normalizeUint256(value[4], \"tee_timestamp\"),\n ];\n}\n\nfunction isHexLike(value: string): boolean {\n return /^0x[0-9a-fA-F]+$/.test(value);\n}\n\nfunction normalizeBytes(value: string, fieldName: string): Hex {\n const normalizedValue = normalizeHex(value);\n if (!isHexLike(normalizedValue) || (normalizedValue.length - 2) % 2 !== 0) {\n throw new Error(`${fieldName} must be valid bytes hex.`);\n }\n return normalizedValue;\n}\n\nfunction base64ToHex(value: string): Hex {\n const decodedValue = decodeBase64(value);\n let hex = \"0x\";\n for (let index = 0; index < decodedValue.length; index += 1) {\n hex += decodedValue.charCodeAt(index).toString(16).padStart(2, \"0\");\n }\n return hex as Hex;\n}\n\nfunction decodeBase64(value: string): string {\n if (typeof globalThis.atob === \"function\") {\n return globalThis.atob(value);\n }\n\n throw new Error(\"Base64 signature decoding requires globalThis.atob in this runtime.\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction decodeHexEncodedBlobId(blobId: string): string {\n if (!/^0x[0-9a-fA-F]+$/.test(blobId)) {\n return blobId;\n }\n\n const hexValue = blobId.slice(2);\n if (hexValue.length === 0 || hexValue.length % 2 !== 0) {\n return blobId;\n }\n\n try {\n const bytes = new Uint8Array(hexValue.length / 2);\n for (let index = 0; index < hexValue.length; index += 2) {\n bytes[index / 2] = Number.parseInt(hexValue.slice(index, index + 2), 16);\n }\n\n const decodedBlobId = new TextDecoder(\"utf-8\", { fatal: true }).decode(bytes);\n if (!/^[\\x21-\\x7E]+$/.test(decodedBlobId)) {\n return blobId;\n }\n\n return decodedBlobId;\n } catch {\n return blobId;\n }\n}\n"],"mappings":"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","names":[]}
|