From 83ac5593ca1ebc04fabd39f36d51a66a3d0a1514 Mon Sep 17 00:00:00 2001 From: KSS Date: Fri, 9 Jan 2026 13:31:34 +0100 Subject: [PATCH 1/8] feat: fill time --- .../test/7683/analyselogs/arb-to-base.ts | 83 +++++++++++++++++-- 1 file changed, 77 insertions(+), 6 deletions(-) diff --git a/contracts/script/test/7683/analyselogs/arb-to-base.ts b/contracts/script/test/7683/analyselogs/arb-to-base.ts index 5621a81a..0946a11b 100644 --- a/contracts/script/test/7683/analyselogs/arb-to-base.ts +++ b/contracts/script/test/7683/analyselogs/arb-to-base.ts @@ -26,8 +26,24 @@ const filledTopic0 = iface.getEvent("Filled")!.topicHash; const norm = (x: string) => x.toLowerCase(); +type OpenEntry = { + orderId: string; + blockNumber: number; + blockTimestamp: number; + txHash: string; + logIndex: number; +}; + +type FilledEntry = { + orderId: string; + blockNumber: number; + blockTimestamp: number; + txHash: string; + logIndex: number; +}; + // -------------------- 1) Collect Opens on Arbitrum -------------------- -const openedByOrderId = new Map(); // orderId -> { orderId, blockNumber, txHash, logIndex, args? } +const openedByOrderId = new Map(); // orderId -> OpenEntry for (let start = arbFromBlock; start <= arbLatest; start += step + 1) { const end = Math.min(arbLatest, start + step); @@ -44,9 +60,13 @@ for (let start = arbFromBlock; start <= arbLatest; start += step + 1) { // Dedup by orderId (keep first seen) if (!openedByOrderId.has(orderId)) { + const blk = await arbProvider.getBlock(log.blockNumber); + const blockTimestamp = Number(blk?.timestamp ?? 0); + openedByOrderId.set(orderId, { orderId, blockNumber: log.blockNumber, + blockTimestamp, txHash: log.transactionHash, logIndex: log.index, }); @@ -58,7 +78,7 @@ console.log(`Searched in Arbitrum blocks from ${arbFromBlock} to ${arbLatest} an console.log("Opened unique orderIds on Arbitrum:", openedByOrderId.size); // -------------------- 2) Collect Fills on Base -------------------- -const filledOrderIds = new Set(); +const filledByOrderId = new Map(); // orderId -> FilledEntry for (let start = baseFromBlock; start <= baseLatest; start += step + 1) { const end = Math.min(baseLatest, start + step); @@ -72,18 +92,69 @@ for (let start = baseFromBlock; start <= baseLatest; start += step + 1) { for (const log of logs) { const orderId = norm(log.topics[1]!); // indexed orderId - filledOrderIds.add(orderId); + + // Dedup by orderId (keep first seen) + if (!filledByOrderId.has(orderId)) { + const blk = await baseProvider.getBlock(log.blockNumber); + const blockTimestamp = Number(blk?.timestamp ?? 0); + + filledByOrderId.set(orderId, { + orderId, + blockNumber: log.blockNumber, + blockTimestamp, + txHash: log.transactionHash, + logIndex: log.index, + }); + } } } console.log(`Searched in Base blocks from ${baseFromBlock} to ${baseLatest} and found...`); -console.log("Filled unique orderIds on Base:", filledOrderIds.size); +console.log("Filled unique orderIds on Base:", filledByOrderId.size); // -------------------- 3) Diff: Opened on Arb but NOT Filled on Base -------------------- -const unfilledOpenEvents = []; +const unfilledOpenEvents: OpenEntry[] = []; for (const [orderId, openEvent] of openedByOrderId.entries()) { - if (!filledOrderIds.has(orderId)) unfilledOpenEvents.push(openEvent); + if (!filledByOrderId.has(orderId)) unfilledOpenEvents.push(openEvent); } console.log("Unfilled count:", unfilledOpenEvents.length); console.log("Unfilled orders:", JSON.stringify(unfilledOpenEvents, null, 2)); + +// -------------------- 4) Fill time stats for matched orders -------------------- +const fillDurationsSec: number[] = []; +const matchedCount = (() => { + let cnt = 0; + for (const [orderId, openEvent] of openedByOrderId.entries()) { + const filled = filledByOrderId.get(orderId); + if (filled) { + const delta = filled.blockTimestamp - openEvent.blockTimestamp; + // Only include non-negative durations + if (Number.isFinite(delta) && delta >= 0) { + fillDurationsSec.push(delta); + cnt++; + } + } + } + return cnt; +})(); + +if (matchedCount === 0) { + console.log("No matched open->fill pairs within the specified ranges. Skipping stats."); +} else { + let fastest = Infinity; + let slowest = -Infinity; + let sum = 0; + + for (const d of fillDurationsSec) { + if (d < fastest) fastest = d; + if (d > slowest) slowest = d; + sum += d; + } + const avg = sum / fillDurationsSec.length; + + console.log("Matched open->fill pairs:", matchedCount); + console.log("Fastest fill time (s):", fastest); + console.log("Slowest fill time (s):", slowest); + console.log("Average fill time (s):", avg); +} From e03b135a91f9da8d1ef213900c828aae1656caed Mon Sep 17 00:00:00 2001 From: KSS Date: Fri, 9 Jan 2026 13:39:41 +0100 Subject: [PATCH 2/8] feat: solver repayment time --- .../test/7683/analyselogs/arb-to-base.ts | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/contracts/script/test/7683/analyselogs/arb-to-base.ts b/contracts/script/test/7683/analyselogs/arb-to-base.ts index 0946a11b..0dac6efd 100644 --- a/contracts/script/test/7683/analyselogs/arb-to-base.ts +++ b/contracts/script/test/7683/analyselogs/arb-to-base.ts @@ -23,6 +23,9 @@ const iface = new ethers.Interface(T1ERC7683.abi); // Topics const openTopic0 = iface.getEvent("Open")!.topicHash; const filledTopic0 = iface.getEvent("Filled")!.topicHash; +// Additional topics for solver repayment measurement on Arbitrum +const svrTopic0 = iface.getEvent("SettlementVerificationRequested")!.topicHash; +const settledTopic0 = iface.getEvent("Settled")!.topicHash; const norm = (x: string) => x.toLowerCase(); @@ -42,6 +45,22 @@ type FilledEntry = { logIndex: number; }; +type RepaymentStartEntry = { + orderId: string; + blockNumber: number; + blockTimestamp: number; + txHash: string; + logIndex: number; +}; + +type RepaymentEndEntry = { + orderId: string; + blockNumber: number; + blockTimestamp: number; + txHash: string; + logIndex: number; +}; + // -------------------- 1) Collect Opens on Arbitrum -------------------- const openedByOrderId = new Map(); // orderId -> OpenEntry @@ -158,3 +177,104 @@ if (matchedCount === 0) { console.log("Slowest fill time (s):", slowest); console.log("Average fill time (s):", avg); } + +// -------------------- 5) Solver repayment time on Arbitrum -------------------- +// Start: SettlementVerificationRequested(orderId, requestId) +// End: Settled(orderId, settlementReceiver) +const repayStartByOrderId = new Map(); +const repayEndByOrderId = new Map(); + +// 5.a) Collect SettlementVerificationRequested (start) on Arbitrum +for (let start = arbFromBlock; start <= arbLatest; start += step + 1) { + const end = Math.min(arbLatest, start + step); + + const logs = await arbProvider.getLogs({ + address: arbErc7683Address, + fromBlock: start, + toBlock: end, + topics: [svrTopic0], + }); + + for (const log of logs) { + const orderId = norm(log.topics[1]!); // indexed orderId + if (!repayStartByOrderId.has(orderId)) { + const blk = await arbProvider.getBlock(log.blockNumber); + const blockTimestamp = Number(blk?.timestamp ?? 0); + + repayStartByOrderId.set(orderId, { + orderId, + blockNumber: log.blockNumber, + blockTimestamp, + txHash: log.transactionHash, + logIndex: log.index, + }); + } + } +} + +console.log("SettlementVerificationRequested unique orderIds on Arbitrum:", repayStartByOrderId.size); + +// 5.b) Collect Settled (end) on Arbitrum +for (let start = arbFromBlock; start <= arbLatest; start += step + 1) { + const end = Math.min(arbLatest, start + step); + + const logs = await arbProvider.getLogs({ + address: arbErc7683Address, + fromBlock: start, + toBlock: end, + topics: [settledTopic0], + }); + + for (const log of logs) { + const orderId = norm(log.topics[1]!); // indexed orderId + if (!repayEndByOrderId.has(orderId)) { + const blk = await arbProvider.getBlock(log.blockNumber); + const blockTimestamp = Number(blk?.timestamp ?? 0); + + repayEndByOrderId.set(orderId, { + orderId, + blockNumber: log.blockNumber, + blockTimestamp, + txHash: log.transactionHash, + logIndex: log.index, + }); + } + } +} + +console.log("Settled unique orderIds on Arbitrum:", repayEndByOrderId.size); + +// 5.c) Repayment time stats (start->end) per orderId +const repaymentDurationsSec: number[] = []; +let repayMatchedCount = 0; + +for (const [orderId, startEntry] of repayStartByOrderId.entries()) { + const endEntry = repayEndByOrderId.get(orderId); + if (endEntry) { + const delta = endEntry.blockTimestamp - startEntry.blockTimestamp; + if (Number.isFinite(delta) && delta >= 0) { + repaymentDurationsSec.push(delta); + repayMatchedCount++; + } + } +} + +if (repayMatchedCount === 0) { + console.log("No matched SettlementVerificationRequested -> Settled pairs within the specified Arbitrum range. Skipping repayment stats."); +} else { + let fastest = Infinity; + let slowest = -Infinity; + let sum = 0; + + for (const d of repaymentDurationsSec) { + if (d < fastest) fastest = d; + if (d > slowest) slowest = d; + sum += d; + } + const avg = sum / repaymentDurationsSec.length; + + console.log("Matched repayment pairs (verification->settled):", repayMatchedCount); + console.log("Fastest solver repayment time (s):", fastest); + console.log("Slowest solver repayment time (s):", slowest); + console.log("Average solver repayment time (s):", avg); +} From 6f29b0e4e8313400fa93d7c4fc0e9c3fc9700bdf Mon Sep 17 00:00:00 2001 From: KSS Date: Fri, 9 Jan 2026 13:42:29 +0100 Subject: [PATCH 3/8] feat: print non-settled settle attempts --- contracts/script/test/7683/analyselogs/arb-to-base.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/contracts/script/test/7683/analyselogs/arb-to-base.ts b/contracts/script/test/7683/analyselogs/arb-to-base.ts index 0dac6efd..670daca8 100644 --- a/contracts/script/test/7683/analyselogs/arb-to-base.ts +++ b/contracts/script/test/7683/analyselogs/arb-to-base.ts @@ -278,3 +278,14 @@ if (repayMatchedCount === 0) { console.log("Slowest solver repayment time (s):", slowest); console.log("Average solver repayment time (s):", avg); } + +// -------------------- 5.d) Unsettled SettlementVerificationRequested (no Settled) -------------------- +const unsettledRepayStarts: { orderId: string; txHash: string }[] = []; +for (const [orderId, startEntry] of repayStartByOrderId.entries()) { + if (!repayEndByOrderId.has(orderId)) { + unsettledRepayStarts.push({ orderId, txHash: startEntry.txHash }); + } +} + +console.log("Unsettled SettlementVerificationRequested count:", unsettledRepayStarts.length); +console.log("Unsettled SettlementVerificationRequested:", JSON.stringify(unsettledRepayStarts, null, 2)); From aca7cfb944fd59b3f29f88d7b36037ae8ed4d30f Mon Sep 17 00:00:00 2001 From: KSS Date: Fri, 9 Jan 2026 14:07:33 +0100 Subject: [PATCH 4/8] refactor: move common logic outside of chain-specific context --- .../test/7683/analyselogs/arb-to-base.ts | 315 ++---------------- .../7683/analyselogs/src/logAnalyzer7683.ts | 290 ++++++++++++++++ 2 files changed, 317 insertions(+), 288 deletions(-) create mode 100644 contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts diff --git a/contracts/script/test/7683/analyselogs/arb-to-base.ts b/contracts/script/test/7683/analyselogs/arb-to-base.ts index 670daca8..af38527d 100644 --- a/contracts/script/test/7683/analyselogs/arb-to-base.ts +++ b/contracts/script/test/7683/analyselogs/arb-to-base.ts @@ -1,291 +1,30 @@ import { ethers } from "ethers"; -import T1ERC7683 from "../../../../artifacts/src/T1ERC7683.sol/T1ERC7683.json"; +import { analyzeERC7683Logs } from "./src/logAnalyzer7683.ts"; // -------------------- Config -------------------- -const arbProvider = new ethers.JsonRpcProvider("https://arb1.arbitrum.io/rpc"); -const arbErc7683Address = "0x996f3583bd967bba19694733aa7a7623e6d780eb"; - -const baseProvider = new ethers.JsonRpcProvider("https://base-rpc.publicnode.com"); -const baseErc7683Address = "0xdbA711a6c1b187479e9a5b33020E5217D0BD5A1f"; - -const arbFromBlock = 418241010; -const arbLatest = 418842847; -// const arbLatest = await arbProvider.getBlockNumber(); - -const baseFromBlock = 40423900; -const baseLatest = 40499026; -// const baseLatest = await baseProvider.getBlockNumber(); - -const step = 10_000; - -const iface = new ethers.Interface(T1ERC7683.abi); - -// Topics -const openTopic0 = iface.getEvent("Open")!.topicHash; -const filledTopic0 = iface.getEvent("Filled")!.topicHash; -// Additional topics for solver repayment measurement on Arbitrum -const svrTopic0 = iface.getEvent("SettlementVerificationRequested")!.topicHash; -const settledTopic0 = iface.getEvent("Settled")!.topicHash; - -const norm = (x: string) => x.toLowerCase(); - -type OpenEntry = { - orderId: string; - blockNumber: number; - blockTimestamp: number; - txHash: string; - logIndex: number; -}; - -type FilledEntry = { - orderId: string; - blockNumber: number; - blockTimestamp: number; - txHash: string; - logIndex: number; -}; - -type RepaymentStartEntry = { - orderId: string; - blockNumber: number; - blockTimestamp: number; - txHash: string; - logIndex: number; -}; - -type RepaymentEndEntry = { - orderId: string; - blockNumber: number; - blockTimestamp: number; - txHash: string; - logIndex: number; -}; - -// -------------------- 1) Collect Opens on Arbitrum -------------------- -const openedByOrderId = new Map(); // orderId -> OpenEntry - -for (let start = arbFromBlock; start <= arbLatest; start += step + 1) { - const end = Math.min(arbLatest, start + step); - - const logs = await arbProvider.getLogs({ - address: arbErc7683Address, - fromBlock: start, - toBlock: end, - topics: [openTopic0], - }); - - for (const log of logs) { - const orderId = norm(log.topics[1]!); // indexed orderId - - // Dedup by orderId (keep first seen) - if (!openedByOrderId.has(orderId)) { - const blk = await arbProvider.getBlock(log.blockNumber); - const blockTimestamp = Number(blk?.timestamp ?? 0); - - openedByOrderId.set(orderId, { - orderId, - blockNumber: log.blockNumber, - blockTimestamp, - txHash: log.transactionHash, - logIndex: log.index, - }); - } - } -} - -console.log(`Searched in Arbitrum blocks from ${arbFromBlock} to ${arbLatest} and found...`); -console.log("Opened unique orderIds on Arbitrum:", openedByOrderId.size); - -// -------------------- 2) Collect Fills on Base -------------------- -const filledByOrderId = new Map(); // orderId -> FilledEntry - -for (let start = baseFromBlock; start <= baseLatest; start += step + 1) { - const end = Math.min(baseLatest, start + step); - - const logs = await baseProvider.getLogs({ - address: baseErc7683Address, - fromBlock: start, - toBlock: end, - topics: [filledTopic0], - }); - - for (const log of logs) { - const orderId = norm(log.topics[1]!); // indexed orderId - - // Dedup by orderId (keep first seen) - if (!filledByOrderId.has(orderId)) { - const blk = await baseProvider.getBlock(log.blockNumber); - const blockTimestamp = Number(blk?.timestamp ?? 0); - - filledByOrderId.set(orderId, { - orderId, - blockNumber: log.blockNumber, - blockTimestamp, - txHash: log.transactionHash, - logIndex: log.index, - }); - } - } -} - -console.log(`Searched in Base blocks from ${baseFromBlock} to ${baseLatest} and found...`); -console.log("Filled unique orderIds on Base:", filledByOrderId.size); - -// -------------------- 3) Diff: Opened on Arb but NOT Filled on Base -------------------- -const unfilledOpenEvents: OpenEntry[] = []; -for (const [orderId, openEvent] of openedByOrderId.entries()) { - if (!filledByOrderId.has(orderId)) unfilledOpenEvents.push(openEvent); -} - -console.log("Unfilled count:", unfilledOpenEvents.length); -console.log("Unfilled orders:", JSON.stringify(unfilledOpenEvents, null, 2)); - -// -------------------- 4) Fill time stats for matched orders -------------------- -const fillDurationsSec: number[] = []; -const matchedCount = (() => { - let cnt = 0; - for (const [orderId, openEvent] of openedByOrderId.entries()) { - const filled = filledByOrderId.get(orderId); - if (filled) { - const delta = filled.blockTimestamp - openEvent.blockTimestamp; - // Only include non-negative durations - if (Number.isFinite(delta) && delta >= 0) { - fillDurationsSec.push(delta); - cnt++; - } - } - } - return cnt; -})(); - -if (matchedCount === 0) { - console.log("No matched open->fill pairs within the specified ranges. Skipping stats."); -} else { - let fastest = Infinity; - let slowest = -Infinity; - let sum = 0; - - for (const d of fillDurationsSec) { - if (d < fastest) fastest = d; - if (d > slowest) slowest = d; - sum += d; - } - const avg = sum / fillDurationsSec.length; - - console.log("Matched open->fill pairs:", matchedCount); - console.log("Fastest fill time (s):", fastest); - console.log("Slowest fill time (s):", slowest); - console.log("Average fill time (s):", avg); -} - -// -------------------- 5) Solver repayment time on Arbitrum -------------------- -// Start: SettlementVerificationRequested(orderId, requestId) -// End: Settled(orderId, settlementReceiver) -const repayStartByOrderId = new Map(); -const repayEndByOrderId = new Map(); - -// 5.a) Collect SettlementVerificationRequested (start) on Arbitrum -for (let start = arbFromBlock; start <= arbLatest; start += step + 1) { - const end = Math.min(arbLatest, start + step); - - const logs = await arbProvider.getLogs({ - address: arbErc7683Address, - fromBlock: start, - toBlock: end, - topics: [svrTopic0], - }); - - for (const log of logs) { - const orderId = norm(log.topics[1]!); // indexed orderId - if (!repayStartByOrderId.has(orderId)) { - const blk = await arbProvider.getBlock(log.blockNumber); - const blockTimestamp = Number(blk?.timestamp ?? 0); - - repayStartByOrderId.set(orderId, { - orderId, - blockNumber: log.blockNumber, - blockTimestamp, - txHash: log.transactionHash, - logIndex: log.index, - }); - } - } -} - -console.log("SettlementVerificationRequested unique orderIds on Arbitrum:", repayStartByOrderId.size); - -// 5.b) Collect Settled (end) on Arbitrum -for (let start = arbFromBlock; start <= arbLatest; start += step + 1) { - const end = Math.min(arbLatest, start + step); - - const logs = await arbProvider.getLogs({ - address: arbErc7683Address, - fromBlock: start, - toBlock: end, - topics: [settledTopic0], - }); - - for (const log of logs) { - const orderId = norm(log.topics[1]!); // indexed orderId - if (!repayEndByOrderId.has(orderId)) { - const blk = await arbProvider.getBlock(log.blockNumber); - const blockTimestamp = Number(blk?.timestamp ?? 0); - - repayEndByOrderId.set(orderId, { - orderId, - blockNumber: log.blockNumber, - blockTimestamp, - txHash: log.transactionHash, - logIndex: log.index, - }); - } - } -} - -console.log("Settled unique orderIds on Arbitrum:", repayEndByOrderId.size); - -// 5.c) Repayment time stats (start->end) per orderId -const repaymentDurationsSec: number[] = []; -let repayMatchedCount = 0; - -for (const [orderId, startEntry] of repayStartByOrderId.entries()) { - const endEntry = repayEndByOrderId.get(orderId); - if (endEntry) { - const delta = endEntry.blockTimestamp - startEntry.blockTimestamp; - if (Number.isFinite(delta) && delta >= 0) { - repaymentDurationsSec.push(delta); - repayMatchedCount++; - } - } -} - -if (repayMatchedCount === 0) { - console.log("No matched SettlementVerificationRequested -> Settled pairs within the specified Arbitrum range. Skipping repayment stats."); -} else { - let fastest = Infinity; - let slowest = -Infinity; - let sum = 0; - - for (const d of repaymentDurationsSec) { - if (d < fastest) fastest = d; - if (d > slowest) slowest = d; - sum += d; - } - const avg = sum / repaymentDurationsSec.length; - - console.log("Matched repayment pairs (verification->settled):", repayMatchedCount); - console.log("Fastest solver repayment time (s):", fastest); - console.log("Slowest solver repayment time (s):", slowest); - console.log("Average solver repayment time (s):", avg); -} - -// -------------------- 5.d) Unsettled SettlementVerificationRequested (no Settled) -------------------- -const unsettledRepayStarts: { orderId: string; txHash: string }[] = []; -for (const [orderId, startEntry] of repayStartByOrderId.entries()) { - if (!repayEndByOrderId.has(orderId)) { - unsettledRepayStarts.push({ orderId, txHash: startEntry.txHash }); - } -} - -console.log("Unsettled SettlementVerificationRequested count:", unsettledRepayStarts.length); -console.log("Unsettled SettlementVerificationRequested:", JSON.stringify(unsettledRepayStarts, null, 2)); +const sourceChainProvider = new ethers.JsonRpcProvider("https://arb1.arbitrum.io/rpc"); +const sourceChainErc7683Address = "0x996f3583bd967bba19694733aa7a7623e6d780eb"; + +const destinationChainProvider = new ethers.JsonRpcProvider("https://base-rpc.publicnode.com"); +const destinationChainErc7683Address = "0xdbA711a6c1b187479e9a5b33020E5217D0BD5A1f"; + +const sourceChainFromBlock = 418241010; +const sourceChainLatest = 418842847; +// const sourceChainLatest = await sourceChainProvider.getBlockNumber(); + +const destinationChainFromBlock = 40423900; +const destinationChainLatest = 40499026; +// const destinationChainLatest = await destinationChainProvider.getBlockNumber(); + +await analyzeERC7683Logs({ + sourceChainName: "Arbitrum", + sourceChainFromBlock, + sourceChainLatest, + sourceChainProvider, + sourceChainErc7683Address, + destinationChainName: "Base", + destinationChainFromBlock, + destinationChainLatest, + destinationChainProvider, + destinationChainErc7683Address, +}) diff --git a/contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts b/contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts new file mode 100644 index 00000000..d31714f0 --- /dev/null +++ b/contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts @@ -0,0 +1,290 @@ +import { ethers, JsonRpcProvider } from "ethers"; +import T1ERC7683 from "../../../../../artifacts/src/T1ERC7683.sol/T1ERC7683.json"; + +const step = 10_000; + +const iface = new ethers.Interface(T1ERC7683.abi); + +// Topics +const openTopic0 = iface.getEvent("Open")!.topicHash; +const filledTopic0 = iface.getEvent("Filled")!.topicHash; +const svrTopic0 = iface.getEvent("SettlementVerificationRequested")!.topicHash; +const settledTopic0 = iface.getEvent("Settled")!.topicHash; + +const norm = (x: string) => x.toLowerCase(); + +type OpenEntry = { + orderId: string; + blockNumber: number; + blockTimestamp: number; + txHash: string; + logIndex: number; +}; + +type FilledEntry = { + orderId: string; + blockNumber: number; + blockTimestamp: number; + txHash: string; + logIndex: number; +}; + +type RepaymentStartEntry = { + orderId: string; + blockNumber: number; + blockTimestamp: number; + txHash: string; + logIndex: number; +}; + +type RepaymentEndEntry = { + orderId: string; + blockNumber: number; + blockTimestamp: number; + txHash: string; + logIndex: number; +}; + +type AnalyzeBlockParams = { + sourceChainName: string; + sourceChainFromBlock: number; + sourceChainLatest: number; + sourceChainProvider: JsonRpcProvider; + sourceChainErc7683Address: `0x${string}`; + destinationChainName: string; + destinationChainFromBlock: number; + destinationChainLatest: number; + destinationChainProvider: JsonRpcProvider; + destinationChainErc7683Address: `0x${string}`; +}; + +export const analyzeERC7683Logs = async (params: AnalyzeBlockParams) => { + // -------------------- 1) Collect Opens on Source Chain -------------------- + const openedByOrderId = new Map(); // orderId -> OpenEntry + + for (let start = params.sourceChainFromBlock; start <= params.sourceChainLatest; start += step + 1) { + const end = Math.min(params.sourceChainLatest, start + step); + + const logs = await params.sourceChainProvider.getLogs({ + address: params.sourceChainErc7683Address, + fromBlock: start, + toBlock: end, + topics: [openTopic0], + }); + + for (const log of logs) { + const orderId = norm(log.topics[1]!); // indexed orderId + + // Dedup by orderId (keep first seen) + if (!openedByOrderId.has(orderId)) { + const blk = await params.sourceChainProvider.getBlock(log.blockNumber); + const blockTimestamp = Number(blk?.timestamp ?? 0); + + openedByOrderId.set(orderId, { + orderId, + blockNumber: log.blockNumber, + blockTimestamp, + txHash: log.transactionHash, + logIndex: log.index, + }); + } + } + } + + console.log(`Searched in ${params.sourceChainName} blocks from ${params.sourceChainFromBlock} to ${params.sourceChainLatest} and found...`); + console.log("Opened unique orderIds on ${params.sourceChainName}:", openedByOrderId.size); + +// -------------------- 2) Collect Fills on Destination Chain -------------------- + const filledByOrderId = new Map(); // orderId -> FilledEntry + + for (let start = params.destinationChainFromBlock; start <= params.destinationChainLatest; start += step + 1) { + const end = Math.min(params.destinationChainLatest, start + step); + + const logs = await params.destinationChainProvider.getLogs({ + address: params.destinationChainErc7683Address, + fromBlock: start, + toBlock: end, + topics: [filledTopic0], + }); + + for (const log of logs) { + const orderId = norm(log.topics[1]!); // indexed orderId + + // Dedup by orderId (keep first seen) + if (!filledByOrderId.has(orderId)) { + const blk = await params.destinationChainProvider.getBlock(log.blockNumber); + const blockTimestamp = Number(blk?.timestamp ?? 0); + + filledByOrderId.set(orderId, { + orderId, + blockNumber: log.blockNumber, + blockTimestamp, + txHash: log.transactionHash, + logIndex: log.index, + }); + } + } + } + + console.log(`Searched in ${params.destinationChainName} blocks from ${params.destinationChainFromBlock} to ${params.destinationChainLatest} and found...`); + console.log(`Filled unique orderIds on ${params.destinationChainName}: ${filledByOrderId.size}`); + +// -------------------- 3) Diff: Opened on Arb but NOT Filled on Destination Chain -------------------- + const unfilledOpenEvents: OpenEntry[] = []; + for (const [orderId, openEvent] of openedByOrderId.entries()) { + if (!filledByOrderId.has(orderId)) unfilledOpenEvents.push(openEvent); + } + + console.log("Unfilled count:", unfilledOpenEvents.length); + console.log("Unfilled orders:", JSON.stringify(unfilledOpenEvents, null, 2)); + +// -------------------- 4) Fill time stats for matched orders -------------------- + const fillDurationsSec: number[] = []; + const matchedCount = (() => { + let cnt = 0; + for (const [orderId, openEvent] of openedByOrderId.entries()) { + const filled = filledByOrderId.get(orderId); + if (filled) { + const delta = filled.blockTimestamp - openEvent.blockTimestamp; + // Only include non-negative durations + if (Number.isFinite(delta) && delta >= 0) { + fillDurationsSec.push(delta); + cnt++; + } + } + } + return cnt; + })(); + + if (matchedCount === 0) { + console.log("No matched open->fill pairs within the specified ranges. Skipping stats."); + } else { + let fastest = Infinity; + let slowest = -Infinity; + let sum = 0; + + for (const d of fillDurationsSec) { + if (d < fastest) fastest = d; + if (d > slowest) slowest = d; + sum += d; + } + const avg = sum / fillDurationsSec.length; + + console.log("Matched open->fill pairs:", matchedCount); + console.log("Fastest fill time (s):", fastest); + console.log("Slowest fill time (s):", slowest); + console.log("Average fill time (s):", avg); + } + +// -------------------- 5) Solver repayment time on Source Chain -------------------- +// Start: SettlementVerificationRequested(orderId, requestId) +// End: Settled(orderId, settlementReceiver) + const repayStartByOrderId = new Map(); + const repayEndByOrderId = new Map(); + +// 5.a) Collect SettlementVerificationRequested (start) on Source Chain + for (let start = params.sourceChainFromBlock; start <= params.sourceChainLatest; start += step + 1) { + const end = Math.min(params.sourceChainLatest, start + step); + + const logs = await params.sourceChainProvider.getLogs({ + address: params.sourceChainErc7683Address, + fromBlock: start, + toBlock: end, + topics: [svrTopic0], + }); + + for (const log of logs) { + const orderId = norm(log.topics[1]!); // indexed orderId + if (!repayStartByOrderId.has(orderId)) { + const blk = await params.sourceChainProvider.getBlock(log.blockNumber); + const blockTimestamp = Number(blk?.timestamp ?? 0); + + repayStartByOrderId.set(orderId, { + orderId, + blockNumber: log.blockNumber, + blockTimestamp, + txHash: log.transactionHash, + logIndex: log.index, + }); + } + } + } + + console.log(`SettlementVerificationRequested unique orderIds on ${params.sourceChainName}: ${repayStartByOrderId.size}`); + +// 5.b) Collect Settled (end) on Source Chain + for (let start = params.sourceChainFromBlock; start <= params.sourceChainLatest; start += step + 1) { + const end = Math.min(params.sourceChainLatest, start + step); + + const logs = await params.sourceChainProvider.getLogs({ + address: params.sourceChainErc7683Address, + fromBlock: start, + toBlock: end, + topics: [settledTopic0], + }); + + for (const log of logs) { + const orderId = norm(log.topics[1]!); // indexed orderId + if (!repayEndByOrderId.has(orderId)) { + const blk = await params.sourceChainProvider.getBlock(log.blockNumber); + const blockTimestamp = Number(blk?.timestamp ?? 0); + + repayEndByOrderId.set(orderId, { + orderId, + blockNumber: log.blockNumber, + blockTimestamp, + txHash: log.transactionHash, + logIndex: log.index, + }); + } + } + } + + console.log(`Settled unique orderIds on ${params.sourceChainName}: ${repayEndByOrderId.size}`); + +// 5.c) Repayment time stats (start->end) per orderId + const repaymentDurationsSec: number[] = []; + let repayMatchedCount = 0; + + for (const [orderId, startEntry] of repayStartByOrderId.entries()) { + const endEntry = repayEndByOrderId.get(orderId); + if (endEntry) { + const delta = endEntry.blockTimestamp - startEntry.blockTimestamp; + if (Number.isFinite(delta) && delta >= 0) { + repaymentDurationsSec.push(delta); + repayMatchedCount++; + } + } + } + + if (repayMatchedCount === 0) { + console.log(`No matched SettlementVerificationRequested -> Settled pairs within the specified ${params.sourceChainName} range. Skipping repayment stats.`); + } else { + let fastest = Infinity; + let slowest = -Infinity; + let sum = 0; + + for (const d of repaymentDurationsSec) { + if (d < fastest) fastest = d; + if (d > slowest) slowest = d; + sum += d; + } + const avg = sum / repaymentDurationsSec.length; + + console.log("Matched repayment pairs (verification->settled):", repayMatchedCount); + console.log("Fastest solver repayment time (s):", fastest); + console.log("Slowest solver repayment time (s):", slowest); + console.log("Average solver repayment time (s):", avg); + } + +// -------------------- 5.d) Unsettled SettlementVerificationRequested (no Settled) -------------------- + const unsettledRepayStarts: { orderId: string; txHash: string }[] = []; + for (const [orderId, startEntry] of repayStartByOrderId.entries()) { + if (!repayEndByOrderId.has(orderId)) { + unsettledRepayStarts.push({ orderId, txHash: startEntry.txHash }); + } + } + + console.log("Unsettled SettlementVerificationRequested count:", unsettledRepayStarts.length); + console.log("Unsettled SettlementVerificationRequested:", JSON.stringify(unsettledRepayStarts, null, 2)); +} From ec773feb4f1925d0ddec92602aaec625634068f1 Mon Sep 17 00:00:00 2001 From: KSS Date: Fri, 9 Jan 2026 14:10:46 +0100 Subject: [PATCH 5/8] refactor: use common logic in base-to-arb as well! --- .../test/7683/analyselogs/arb-to-base.ts | 9 +- .../test/7683/analyselogs/base-to-arb.ts | 115 +++++------------- 2 files changed, 32 insertions(+), 92 deletions(-) diff --git a/contracts/script/test/7683/analyselogs/arb-to-base.ts b/contracts/script/test/7683/analyselogs/arb-to-base.ts index af38527d..2403fbb3 100644 --- a/contracts/script/test/7683/analyselogs/arb-to-base.ts +++ b/contracts/script/test/7683/analyselogs/arb-to-base.ts @@ -1,19 +1,18 @@ import { ethers } from "ethers"; import { analyzeERC7683Logs } from "./src/logAnalyzer7683.ts"; -// -------------------- Config -------------------- const sourceChainProvider = new ethers.JsonRpcProvider("https://arb1.arbitrum.io/rpc"); -const sourceChainErc7683Address = "0x996f3583bd967bba19694733aa7a7623e6d780eb"; +const sourceChainErc7683Address = "0x996f3583bd967bba19694733aa7a7623e6d780eb"; const destinationChainProvider = new ethers.JsonRpcProvider("https://base-rpc.publicnode.com"); -const destinationChainErc7683Address = "0xdbA711a6c1b187479e9a5b33020E5217D0BD5A1f"; +const destinationChainErc7683Address = "0xdbA711a6c1b187479e9a5b33020E5217D0BD5A1f"; const sourceChainFromBlock = 418241010; -const sourceChainLatest = 418842847; +const sourceChainLatest = 418842847; // const sourceChainLatest = await sourceChainProvider.getBlockNumber(); const destinationChainFromBlock = 40423900; -const destinationChainLatest = 40499026; +const destinationChainLatest = 40499026; // const destinationChainLatest = await destinationChainProvider.getBlockNumber(); await analyzeERC7683Logs({ diff --git a/contracts/script/test/7683/analyselogs/base-to-arb.ts b/contracts/script/test/7683/analyselogs/base-to-arb.ts index 0effc291..5a1c94fe 100644 --- a/contracts/script/test/7683/analyselogs/base-to-arb.ts +++ b/contracts/script/test/7683/analyselogs/base-to-arb.ts @@ -1,88 +1,29 @@ import { ethers } from "ethers"; -import T1ERC7683 from "../../../../artifacts/src/T1ERC7683.sol/T1ERC7683.json"; - -// -------------------- Config -------------------- -const baseProvider = new ethers.JsonRpcProvider("https://base-rpc.publicnode.com"); -const baseErc7683Address = "0xdbA711a6c1b187479e9a5b33020E5217D0BD5A1f"; - -const arbProvider = new ethers.JsonRpcProvider("https://arb1.arbitrum.io/rpc"); -const arbErc7683Address = "0x996f3583bd967bba19694733aa7a7623e6d780eb"; - -// Your ranges (edit as needed) -const baseFromBlock = 40423900; -const baseLatest = 40499026; -// const baseLatest = await baseProvider.getBlockNumber(); - -const arbFromBlock = 418241010; -const arbLatest = 418842847; -// const arbLatest = await arbProvider.getBlockNumber(); - -const step = 10_000; - -const iface = new ethers.Interface(T1ERC7683.abi); - -const openTopic0 = iface.getEvent("Open")!.topicHash; -const filledTopic0 = iface.getEvent("Filled")!.topicHash; - -const norm = (x: string) => x.toLowerCase(); - -// -------------------- 1) Collect Opens on Base -------------------- -const openedByOrderId = new Map(); // orderId -> { orderId, blockNumber, txHash, logIndex } - -for (let start = baseFromBlock; start <= baseLatest; start += step + 1) { - const end = Math.min(baseLatest, start + step); - - const logs = await baseProvider.getLogs({ - address: baseErc7683Address, - fromBlock: start, - toBlock: end, - topics: [openTopic0], - }); - - for (const log of logs) { - const orderId = norm(log.topics[1]!); // indexed orderId - - if (!openedByOrderId.has(orderId)) { - openedByOrderId.set(orderId, { - orderId, - blockNumber: log.blockNumber, - txHash: log.transactionHash, - logIndex: log.index, - }); - } - } -} - -console.log(`Searched in Base blocks from ${baseFromBlock} to ${baseLatest} and found...`); -console.log("Opened unique orderIds on Base:", openedByOrderId.size); - -// -------------------- 2) Collect Fills on Arbitrum -------------------- -const filledOrderIds = new Set(); - -for (let start = arbFromBlock; start <= arbLatest; start += step + 1) { - const end = Math.min(arbLatest, start + step); - - const logs = await arbProvider.getLogs({ - address: arbErc7683Address, - fromBlock: start, - toBlock: end, - topics: [filledTopic0], - }); - - for (const log of logs) { - const orderId = norm(log.topics[1]!); // indexed orderId - filledOrderIds.add(orderId); - } -} - -console.log(`Searched in Arbitrum blocks from ${arbFromBlock} to ${arbLatest} and found...`); -console.log("Filled unique orderIds on Arbitrum:", filledOrderIds.size); - -// -------------------- 3) Diff: Opened on Base but NOT Filled on Arbitrum -------------------- -const unfilledOpenEvents = []; -for (const [orderId, openEvent] of openedByOrderId.entries()) { - if (!filledOrderIds.has(orderId)) unfilledOpenEvents.push(openEvent); -} - -console.log("Unfilled count:", unfilledOpenEvents.length); -console.log("Unfilled orders:", JSON.stringify(unfilledOpenEvents, null, 2)); +import { analyzeERC7683Logs } from "./src/logAnalyzer7683.ts"; + +const sourceChainProvider = new ethers.JsonRpcProvider("https://base-rpc.publicnode.com"); +const sourceChainErc7683Address = "0xdbA711a6c1b187479e9a5b33020E5217D0BD5A1f"; + +const destinationChainProvider = new ethers.JsonRpcProvider("https://arb1.arbitrum.io/rpc"); +const destinationChainErc7683Address = "0x996f3583bd967bba19694733aa7a7623e6d780eb"; + +const sourceChainFromBlock = 40423900; +const sourceChainLatest = 40499026; +// const sourceChainLatest = await sourceChainProvider.getBlockNumber(); + +const destinationChainFromBlock = 418241010; +const destinationChainLatest = 418842847; +// const destinationChainLatest = await destinationChainProvider.getBlockNumber(); + +await analyzeERC7683Logs({ + sourceChainName: "Base", + sourceChainFromBlock, + sourceChainLatest, + sourceChainProvider, + sourceChainErc7683Address, + destinationChainName: "Arbitrum", + destinationChainFromBlock, + destinationChainLatest, + destinationChainProvider, + destinationChainErc7683Address, +}) From 301c8bd002690bdfb0391e897d3886e19bf0d5fa Mon Sep 17 00:00:00 2001 From: KSS Date: Fri, 9 Jan 2026 14:27:58 +0100 Subject: [PATCH 6/8] chore: renames for clarity --- .../test/7683/analyselogs/arb-to-base.ts | 32 +++++++++---------- .../test/7683/analyselogs/base-to-arb.ts | 28 ++++++++-------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/contracts/script/test/7683/analyselogs/arb-to-base.ts b/contracts/script/test/7683/analyselogs/arb-to-base.ts index 2403fbb3..4ecd10a8 100644 --- a/contracts/script/test/7683/analyselogs/arb-to-base.ts +++ b/contracts/script/test/7683/analyselogs/arb-to-base.ts @@ -1,29 +1,29 @@ import { ethers } from "ethers"; import { analyzeERC7683Logs } from "./src/logAnalyzer7683.ts"; -const sourceChainProvider = new ethers.JsonRpcProvider("https://arb1.arbitrum.io/rpc"); -const sourceChainErc7683Address = "0x996f3583bd967bba19694733aa7a7623e6d780eb"; +const arbitrumProvider = new ethers.JsonRpcProvider("https://arb1.arbitrum.io/rpc"); +const arbitrumErc7683Address = "0x996f3583bd967bba19694733aa7a7623e6d780eb"; -const destinationChainProvider = new ethers.JsonRpcProvider("https://base-rpc.publicnode.com"); -const destinationChainErc7683Address = "0xdbA711a6c1b187479e9a5b33020E5217D0BD5A1f"; +const baseProvider = new ethers.JsonRpcProvider("https://base-rpc.publicnode.com"); +const baseErc7683Address = "0xdbA711a6c1b187479e9a5b33020E5217D0BD5A1f"; -const sourceChainFromBlock = 418241010; -const sourceChainLatest = 418842847; +const arbitrumFromBlock = 417132015; +const arbitrumToBlock = 418842847; // const sourceChainLatest = await sourceChainProvider.getBlockNumber(); -const destinationChainFromBlock = 40423900; -const destinationChainLatest = 40499026; +const baseFromBlock = 40423900; +const baseToBlock = 40499026; // const destinationChainLatest = await destinationChainProvider.getBlockNumber(); await analyzeERC7683Logs({ sourceChainName: "Arbitrum", - sourceChainFromBlock, - sourceChainLatest, - sourceChainProvider, - sourceChainErc7683Address, + sourceChainFromBlock: arbitrumFromBlock, + sourceChainLatest: arbitrumToBlock, + sourceChainProvider: arbitrumProvider, + sourceChainErc7683Address: arbitrumErc7683Address, destinationChainName: "Base", - destinationChainFromBlock, - destinationChainLatest, - destinationChainProvider, - destinationChainErc7683Address, + destinationChainFromBlock: baseFromBlock, + destinationChainLatest: baseToBlock, + destinationChainProvider: baseProvider, + destinationChainErc7683Address: baseErc7683Address, }) diff --git a/contracts/script/test/7683/analyselogs/base-to-arb.ts b/contracts/script/test/7683/analyselogs/base-to-arb.ts index 5a1c94fe..b4699b4e 100644 --- a/contracts/script/test/7683/analyselogs/base-to-arb.ts +++ b/contracts/script/test/7683/analyselogs/base-to-arb.ts @@ -1,29 +1,29 @@ import { ethers } from "ethers"; import { analyzeERC7683Logs } from "./src/logAnalyzer7683.ts"; -const sourceChainProvider = new ethers.JsonRpcProvider("https://base-rpc.publicnode.com"); -const sourceChainErc7683Address = "0xdbA711a6c1b187479e9a5b33020E5217D0BD5A1f"; +const baseProvider = new ethers.JsonRpcProvider("https://base-rpc.publicnode.com"); +const baseErc7683Address = "0xdbA711a6c1b187479e9a5b33020E5217D0BD5A1f"; const destinationChainProvider = new ethers.JsonRpcProvider("https://arb1.arbitrum.io/rpc"); const destinationChainErc7683Address = "0x996f3583bd967bba19694733aa7a7623e6d780eb"; -const sourceChainFromBlock = 40423900; -const sourceChainLatest = 40499026; -// const sourceChainLatest = await sourceChainProvider.getBlockNumber(); +const baseFromBlock = 40423900; +const baseToBlock = 40499026; +// const baseToBlock = await baseProvider.getBlockNumber(); -const destinationChainFromBlock = 418241010; -const destinationChainLatest = 418842847; -// const destinationChainLatest = await destinationChainProvider.getBlockNumber(); +const arbitrumFromBlock = 418241010; +const arbitrumToBlock = 418842847; +// const arbitrumToBlock = await destinationChainProvider.getBlockNumber(); await analyzeERC7683Logs({ sourceChainName: "Base", - sourceChainFromBlock, - sourceChainLatest, - sourceChainProvider, - sourceChainErc7683Address, + sourceChainFromBlock: baseFromBlock, + sourceChainLatest: baseToBlock, + sourceChainProvider: baseProvider, + sourceChainErc7683Address: baseErc7683Address, destinationChainName: "Arbitrum", - destinationChainFromBlock, - destinationChainLatest, + destinationChainFromBlock: arbitrumFromBlock, + destinationChainLatest: arbitrumToBlock, destinationChainProvider, destinationChainErc7683Address, }) From 5650e973def12f2819e6b0bf9ec0304d02421471 Mon Sep 17 00:00:00 2001 From: KSS Date: Fri, 9 Jan 2026 14:36:40 +0100 Subject: [PATCH 7/8] chore: better logging --- .../test/7683/analyselogs/arb-to-base.ts | 6 ++--- .../test/7683/analyselogs/base-to-arb.ts | 8 +++---- .../7683/analyselogs/src/logAnalyzer7683.ts | 24 +++++++++++++------ 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/contracts/script/test/7683/analyselogs/arb-to-base.ts b/contracts/script/test/7683/analyselogs/arb-to-base.ts index 4ecd10a8..16923d09 100644 --- a/contracts/script/test/7683/analyselogs/arb-to-base.ts +++ b/contracts/script/test/7683/analyselogs/arb-to-base.ts @@ -8,11 +8,11 @@ const baseProvider = new ethers.JsonRpcProvider("https://base-rpc.publicnode.com const baseErc7683Address = "0xdbA711a6c1b187479e9a5b33020E5217D0BD5A1f"; const arbitrumFromBlock = 417132015; -const arbitrumToBlock = 418842847; +const arbitrumToBlock = 419554979; // const sourceChainLatest = await sourceChainProvider.getBlockNumber(); -const baseFromBlock = 40423900; -const baseToBlock = 40499026; +const baseFromBlock = 40285370; +const baseToBlock = 40587883; // const destinationChainLatest = await destinationChainProvider.getBlockNumber(); await analyzeERC7683Logs({ diff --git a/contracts/script/test/7683/analyselogs/base-to-arb.ts b/contracts/script/test/7683/analyselogs/base-to-arb.ts index b4699b4e..ea63b68d 100644 --- a/contracts/script/test/7683/analyselogs/base-to-arb.ts +++ b/contracts/script/test/7683/analyselogs/base-to-arb.ts @@ -7,12 +7,12 @@ const baseErc7683Address = "0xdbA711a6c1b187479e9a5b33020E5217D0BD5A1f"; const destinationChainProvider = new ethers.JsonRpcProvider("https://arb1.arbitrum.io/rpc"); const destinationChainErc7683Address = "0x996f3583bd967bba19694733aa7a7623e6d780eb"; -const baseFromBlock = 40423900; -const baseToBlock = 40499026; +const baseFromBlock = 40285370; +const baseToBlock = 40587883; // const baseToBlock = await baseProvider.getBlockNumber(); -const arbitrumFromBlock = 418241010; -const arbitrumToBlock = 418842847; +const arbitrumFromBlock = 417132015; +const arbitrumToBlock = 419554979; // const arbitrumToBlock = await destinationChainProvider.getBlockNumber(); await analyzeERC7683Logs({ diff --git a/contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts b/contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts index d31714f0..4b6b49e6 100644 --- a/contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts +++ b/contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts @@ -62,6 +62,9 @@ export const analyzeERC7683Logs = async (params: AnalyzeBlockParams) => { // -------------------- 1) Collect Opens on Source Chain -------------------- const openedByOrderId = new Map(); // orderId -> OpenEntry + + console.log(`Searching in ${params.sourceChainName} blocks from [${params.sourceChainFromBlock}] to [${params.sourceChainLatest}] ...`); + for (let start = params.sourceChainFromBlock; start <= params.sourceChainLatest; start += step + 1) { const end = Math.min(params.sourceChainLatest, start + step); @@ -91,12 +94,14 @@ export const analyzeERC7683Logs = async (params: AnalyzeBlockParams) => { } } - console.log(`Searched in ${params.sourceChainName} blocks from ${params.sourceChainFromBlock} to ${params.sourceChainLatest} and found...`); - console.log("Opened unique orderIds on ${params.sourceChainName}:", openedByOrderId.size); + console.log(`... found [${openedByOrderId.size}] Opened unique orderIds on ${params.sourceChainName}`, ); // -------------------- 2) Collect Fills on Destination Chain -------------------- const filledByOrderId = new Map(); // orderId -> FilledEntry + + console.log(`Searching in ${params.destinationChainName} blocks from [${params.destinationChainFromBlock}] to [${params.destinationChainLatest}] ...`); + for (let start = params.destinationChainFromBlock; start <= params.destinationChainLatest; start += step + 1) { const end = Math.min(params.destinationChainLatest, start + step); @@ -126,8 +131,7 @@ export const analyzeERC7683Logs = async (params: AnalyzeBlockParams) => { } } - console.log(`Searched in ${params.destinationChainName} blocks from ${params.destinationChainFromBlock} to ${params.destinationChainLatest} and found...`); - console.log(`Filled unique orderIds on ${params.destinationChainName}: ${filledByOrderId.size}`); + console.log(`... found [${filledByOrderId.size}] Filled unique orderIds on ${params.destinationChainName}`); // -------------------- 3) Diff: Opened on Arb but NOT Filled on Destination Chain -------------------- const unfilledOpenEvents: OpenEntry[] = []; @@ -170,7 +174,7 @@ export const analyzeERC7683Logs = async (params: AnalyzeBlockParams) => { } const avg = sum / fillDurationsSec.length; - console.log("Matched open->fill pairs:", matchedCount); + console.log("Matched Open->Filled pairs:", matchedCount); console.log("Fastest fill time (s):", fastest); console.log("Slowest fill time (s):", slowest); console.log("Average fill time (s):", avg); @@ -183,6 +187,9 @@ export const analyzeERC7683Logs = async (params: AnalyzeBlockParams) => { const repayEndByOrderId = new Map(); // 5.a) Collect SettlementVerificationRequested (start) on Source Chain + + console.log(`Searching in ${params.destinationChainName} blocks from [${params.destinationChainFromBlock}] to [${params.destinationChainLatest}] ...`); + for (let start = params.sourceChainFromBlock; start <= params.sourceChainLatest; start += step + 1) { const end = Math.min(params.sourceChainLatest, start + step); @@ -210,9 +217,12 @@ export const analyzeERC7683Logs = async (params: AnalyzeBlockParams) => { } } - console.log(`SettlementVerificationRequested unique orderIds on ${params.sourceChainName}: ${repayStartByOrderId.size}`); + console.log(`... found [${repayStartByOrderId.size}] SettlementVerificationRequested unique orderIds on ${params.sourceChainName}`); // 5.b) Collect Settled (end) on Source Chain + + console.log(`Searching in ${params.destinationChainName} blocks from [${params.destinationChainFromBlock}] to [${params.destinationChainLatest}] ...`); + for (let start = params.sourceChainFromBlock; start <= params.sourceChainLatest; start += step + 1) { const end = Math.min(params.sourceChainLatest, start + step); @@ -240,7 +250,7 @@ export const analyzeERC7683Logs = async (params: AnalyzeBlockParams) => { } } - console.log(`Settled unique orderIds on ${params.sourceChainName}: ${repayEndByOrderId.size}`); + console.log(`... found [${repayEndByOrderId.size}] Settled unique orderIds on ${params.sourceChainName}`); // 5.c) Repayment time stats (start->end) per orderId const repaymentDurationsSec: number[] = []; From d54a9aa68703301d0a4ba89f0ad21ee1a8c14626 Mon Sep 17 00:00:00 2001 From: KSS Date: Fri, 9 Jan 2026 14:54:49 +0100 Subject: [PATCH 8/8] chore: correct logging --- contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts b/contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts index 4b6b49e6..75959df1 100644 --- a/contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts +++ b/contracts/script/test/7683/analyselogs/src/logAnalyzer7683.ts @@ -188,7 +188,7 @@ export const analyzeERC7683Logs = async (params: AnalyzeBlockParams) => { // 5.a) Collect SettlementVerificationRequested (start) on Source Chain - console.log(`Searching in ${params.destinationChainName} blocks from [${params.destinationChainFromBlock}] to [${params.destinationChainLatest}] ...`); + console.log(`Searching in ${params.sourceChainName} blocks from [${params.sourceChainFromBlock}] to [${params.sourceChainLatest}] ...`); for (let start = params.sourceChainFromBlock; start <= params.sourceChainLatest; start += step + 1) { const end = Math.min(params.sourceChainLatest, start + step); @@ -221,7 +221,7 @@ export const analyzeERC7683Logs = async (params: AnalyzeBlockParams) => { // 5.b) Collect Settled (end) on Source Chain - console.log(`Searching in ${params.destinationChainName} blocks from [${params.destinationChainFromBlock}] to [${params.destinationChainLatest}] ...`); + console.log(`Searching in ${params.sourceChainName} blocks from [${params.sourceChainFromBlock}] to [${params.sourceChainLatest}] ...`); for (let start = params.sourceChainFromBlock; start <= params.sourceChainLatest; start += step + 1) { const end = Math.min(params.sourceChainLatest, start + step);