From 49c1c22dd61bf10d2da23966db061198790fc641 Mon Sep 17 00:00:00 2001 From: Aniket Dixit Date: Thu, 26 Mar 2026 19:41:52 +0530 Subject: [PATCH 1/4] timestamp updates --- all_networks_shared.ts | 16 ++++----- all_networks_types_helpers.ts | 62 +++++++++++++++-------------------- 2 files changed, 34 insertions(+), 44 deletions(-) diff --git a/all_networks_shared.ts b/all_networks_shared.ts index 2d0f2b5..855b6f8 100644 --- a/all_networks_shared.ts +++ b/all_networks_shared.ts @@ -265,9 +265,10 @@ async function flushBatchSettlementBuffer( toStrictBytes32(item.inputHash, "inputHash"), toStrictBytes32(item.outputHash, "outputHash"), teeSignatureLeafValue(item.teeSignature), + item.timestamp, ]); - const tree = StandardMerkleTree.of(values, ["bytes32", "bytes32", "bytes32"]); + const tree = StandardMerkleTree.of(values, ["bytes32", "bytes32", "bytes32", "uint256"]); const merkleRoot = tree.root; const treeData = JSON.stringify(tree.dump()); const blobId = await uploadToWalrus(treeData, "batch-tree"); @@ -375,7 +376,6 @@ export async function uploadToWalrus( body: data, headers: { "Content-Type": "application/json", - }, signal: abortController.signal, }); @@ -572,7 +572,11 @@ export function createDataWorkerContext(): DataWorkerContext { } return txHash; } catch (error) { - incrementMetric("data.tx.failure.count", ["worker:data", "tx_type:batch", `stage:${stage}`]); + incrementMetric("data.tx.failure.count", [ + "worker:data", + "tx_type:batch", + `stage:${stage}`, + ]); throw error; } }, @@ -656,11 +660,7 @@ export function createHeartbeatRelayContext(): HeartbeatRelayContext { chainId: ogEvm.id, chainName: ogEvm.name, registryContractAddress, - submitHeartbeat: async ({ - teeId, - timestamp, - signature, - }): Promise<`0x${string}`> => { + submitHeartbeat: async ({ teeId, timestamp, signature }): Promise<`0x${string}`> => { let stage: "broadcast" | "receipt" = "broadcast"; let txHash: `0x${string}` | undefined; try { diff --git a/all_networks_types_helpers.ts b/all_networks_types_helpers.ts index de88f47..1b5789d 100644 --- a/all_networks_types_helpers.ts +++ b/all_networks_types_helpers.ts @@ -54,6 +54,7 @@ export type SettlementBatchData = { inputHash: string; outputHash: string; teeSignature: string; + timestamp: string; }; export type SettlementIndividualData = SettlementBatchData & { @@ -143,7 +144,10 @@ function isRecord(value: unknown): value is Record { return typeof value === "object" && value !== null; } -export function getRequiredStringField(record: Record, fieldNames: string[]): string { +export function getRequiredStringField( + record: Record, + fieldNames: string[], +): string { for (const name of fieldNames) { const value = record[name]; if (typeof value === "string" && value.length > 0) { @@ -153,7 +157,10 @@ export function getRequiredStringField(record: Record, fieldNam throw new Error(`Missing required settlement field. Expected one of: ${fieldNames.join(", ")}`); } -export function getRequiredUnknownField(record: Record, fieldNames: string[]): unknown { +export function getRequiredUnknownField( + record: Record, + fieldNames: string[], +): unknown { for (const name of fieldNames) { if (name in record) { return record[name]; @@ -167,13 +174,17 @@ export function parseUint256Field(record: Record, fieldNames: s if (typeof raw === "number") { if (!Number.isInteger(raw) || raw < 0) { - throw new Error(`Invalid uint256 field. Expected non-negative integer for: ${fieldNames.join(", ")}`); + throw new Error( + `Invalid uint256 field. Expected non-negative integer for: ${fieldNames.join(", ")}`, + ); } return raw.toString(); } if (typeof raw !== "string") { - throw new Error(`Invalid uint256 field. Expected string or number for: ${fieldNames.join(", ")}`); + throw new Error( + `Invalid uint256 field. Expected string or number for: ${fieldNames.join(", ")}`, + ); } const trimmed = raw.trim(); @@ -196,7 +207,10 @@ export function parseUint256Field(record: Record, fieldNames: s return trimmed; } -function parseEvmAddressField(record: Record, fieldNames: string[]): `0x${string}` { +function parseEvmAddressField( + record: Record, + fieldNames: string[], +): `0x${string}` { const value = getRequiredStringField(record, fieldNames); if (!isAddress(value)) { throw new Error(`Invalid EVM address for: ${fieldNames.join(", ")}`); @@ -210,20 +224,10 @@ function parseBatchSettlementData(decoded: unknown): SettlementBatchData { } return { - inputHash: getRequiredStringField(decoded, ["inputHash", "input_hash", "input hash", "input-hash"]), - outputHash: getRequiredStringField(decoded, [ - "outputHash", - "output_hash", - "output hash", - "output-hash", - ]), - teeSignature: getRequiredStringField(decoded, [ - "teeSignature", - "tee_signature", - "tee signature", - "tee-signature", - "tee singature", - ]), + inputHash: getRequiredStringField(decoded, ["input_hash"]), + outputHash: getRequiredStringField(decoded, ["output_hash"]), + teeSignature: getRequiredStringField(decoded, ["tee_signature"]), + timestamp: parseUint256Field(decoded, ["tee_timestamp", "timestamp"]), }; } @@ -233,23 +237,9 @@ function parseIndividualSettlementData(decoded: unknown): SettlementIndividualDa } const batchData = parseBatchSettlementData(decoded); - const teeId = toStrictBytes32( - getRequiredStringField(decoded, ["teeId", "tee_id", "tee id", "tee-id"]), - "teeId", - ); - const timestamp = parseUint256Field(decoded, [ - "timestamp", - "timeStamp", - "time_stamp", - "tee_timestamp", - ]); - const ethAddress = parseEvmAddressField(decoded, [ - "ethAddress", - "eth_address", - "eth address", - "eth-address", - "address", - ]); + const teeId = toStrictBytes32(getRequiredStringField(decoded, ["tee_id"]), "teeId"); + const timestamp = parseUint256Field(decoded, ["timestamp"]); + const ethAddress = parseEvmAddressField(decoded, ["eth_address"]); return { ...batchData, From 63d62a065b808fc6abce7459b1e619f6f936a6d5 Mon Sep 17 00:00:00 2001 From: Aniket Dixit Date: Thu, 26 Mar 2026 19:57:23 +0530 Subject: [PATCH 2/4] queue name update --- all_networks_types_helpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/all_networks_types_helpers.ts b/all_networks_types_helpers.ts index 1b5789d..fafc45f 100644 --- a/all_networks_types_helpers.ts +++ b/all_networks_types_helpers.ts @@ -30,7 +30,7 @@ export const PAYMENT_QUEUE_NAME = resolveQueueName( ); export const DATA_SETTLEMENT_QUEUE_NAME = resolveQueueName( process.env.DATA_SETTLEMENT_QUEUE_NAME, - "x402-settle-data-queue", + "x402-settle-data-queue-v2", "DATA_SETTLEMENT_QUEUE_NAME", ); export const SHUTDOWN_TIMEOUT_MS = Number(process.env.SHUTDOWN_TIMEOUT_MS || 10_000); From 57138cfde37af7427e4e9668400bd6bac37956c3 Mon Sep 17 00:00:00 2001 From: Aniket Dixit Date: Mon, 30 Mar 2026 12:54:47 +0530 Subject: [PATCH 3/4] tee id update --- all_networks_shared.ts | 9 ++++++++- all_networks_types_helpers.ts | 4 +++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/all_networks_shared.ts b/all_networks_shared.ts index 855b6f8..0b15785 100644 --- a/all_networks_shared.ts +++ b/all_networks_shared.ts @@ -262,13 +262,20 @@ async function flushBatchSettlementBuffer( try { const values = items.map(item => [ + toStrictBytes32(item.teeId, "teeId"), toStrictBytes32(item.inputHash, "inputHash"), toStrictBytes32(item.outputHash, "outputHash"), teeSignatureLeafValue(item.teeSignature), item.timestamp, ]); - const tree = StandardMerkleTree.of(values, ["bytes32", "bytes32", "bytes32", "uint256"]); + const tree = StandardMerkleTree.of(values, [ + "bytes32", + "bytes32", + "bytes32", + "bytes32", + "uint256", + ]); const merkleRoot = tree.root; const treeData = JSON.stringify(tree.dump()); const blobId = await uploadToWalrus(treeData, "batch-tree"); diff --git a/all_networks_types_helpers.ts b/all_networks_types_helpers.ts index fafc45f..37c6502 100644 --- a/all_networks_types_helpers.ts +++ b/all_networks_types_helpers.ts @@ -51,6 +51,7 @@ export const DATA_SETTLEMENT_BATCH_MAX_AGE_MS = Number( export type SettlementType = "private" | "batch" | "individual"; export type SettlementBatchData = { + teeId: `0x${string}`; inputHash: string; outputHash: string; teeSignature: string; @@ -224,10 +225,11 @@ function parseBatchSettlementData(decoded: unknown): SettlementBatchData { } return { + teeId: toStrictBytes32(getRequiredStringField(decoded, ["tee_id"]), "teeId"), inputHash: getRequiredStringField(decoded, ["input_hash"]), outputHash: getRequiredStringField(decoded, ["output_hash"]), teeSignature: getRequiredStringField(decoded, ["tee_signature"]), - timestamp: parseUint256Field(decoded, ["tee_timestamp", "timestamp"]), + timestamp: parseUint256Field(decoded, ["tee_timestamp"]), }; } From 8bba4e36b651c20d051dba8f038e84207fc60fef Mon Sep 17 00:00:00 2001 From: Aniket Dixit Date: Mon, 30 Mar 2026 13:25:31 +0530 Subject: [PATCH 4/4] batch updates --- all_networks_shared.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/all_networks_shared.ts b/all_networks_shared.ts index 0b15785..edcf824 100644 --- a/all_networks_shared.ts +++ b/all_networks_shared.ts @@ -22,7 +22,6 @@ import { HEARTBEAT_RELAY_EVM_PRIVATE_KEY_ENV, HEARTBEAT_RELAY_REGISTRY_CONTRACT_ENV, REDIS_URL, - teeSignatureLeafValue, toBytesCalldata, toStrictBytes32, type DataSettlementJobData, @@ -265,7 +264,7 @@ async function flushBatchSettlementBuffer( toStrictBytes32(item.teeId, "teeId"), toStrictBytes32(item.inputHash, "inputHash"), toStrictBytes32(item.outputHash, "outputHash"), - teeSignatureLeafValue(item.teeSignature), + base64ToBytesCalldata(item.teeSignature), item.timestamp, ]); @@ -273,7 +272,7 @@ async function flushBatchSettlementBuffer( "bytes32", "bytes32", "bytes32", - "bytes32", + "bytes", "uint256", ]); const merkleRoot = tree.root;