@secondlayer/subgraphs 8.0.3 → 8.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -12,6 +12,7 @@ import { logger as logger2 } from "@secondlayer/shared/logger";
12
12
 
13
13
  // src/runtime/block-source.ts
14
14
  import { getSourceDb } from "@secondlayer/shared/db";
15
+ import { resolveChainTip } from "@secondlayer/shared/db/queries/integrity";
15
16
  import {
16
17
  BillingPausedError,
17
18
  createInternalIndexHttpClient
@@ -23,7 +24,7 @@ import { createHash } from "node:crypto";
23
24
  // package.json
24
25
  var package_default = {
25
26
  name: "@secondlayer/subgraphs",
26
- version: "8.0.3",
27
+ version: "8.1.0",
27
28
  description: "Describe the Stacks data you want as one TypeScript file; it fills itself and survives reorgs.",
28
29
  license: "MIT",
29
30
  repository: {
@@ -79,9 +80,9 @@ var package_default = {
79
80
  prepublishOnly: "bun run build"
80
81
  },
81
82
  dependencies: {
82
- "@secondlayer/shared": "^15.0.2",
83
+ "@secondlayer/shared": "^15.3.0",
83
84
  "@secondlayer/stacks": "^6.5.4",
84
- "@secondlayer/verify": "^0.6.1",
85
+ "@secondlayer/verify": "^0.6.3",
85
86
  esbuild: "^0.28.2",
86
87
  kysely: "0.28.17",
87
88
  zod: "^4.6.7"
@@ -928,8 +929,7 @@ class PostgresBlockSource {
928
929
  this.feed = feed;
929
930
  }
930
931
  async getTip() {
931
- const progress = await getSourceDb().selectFrom("index_progress").selectAll().where("network", "=", process.env.NETWORK ?? "mainnet").executeTakeFirst();
932
- return progress ? Number(progress.highest_seen_block) : 0;
932
+ return await resolveChainTip(getSourceDb(), "seen") ?? 0;
933
933
  }
934
934
  loadBlockRange(fromHeight, toHeight) {
935
935
  return loadBlockRange(getSourceDb(), fromHeight, toHeight, {
@@ -1153,8 +1153,9 @@ function databaseChainDataReader(db) {
1153
1153
  traitContractIds(trait, asOfBlock) {
1154
1154
  return resolveTraitContractIds(db, trait, asOfBlock);
1155
1155
  },
1156
- settlementsConfirmedAfter(after) {
1157
- return db.selectFrom("sbtc_settlements as s").innerJoin("sbtc_events as e", (join) => join.onRef("e.sweep_txid", "=", "s.sweep_txid").on("e.topic", "=", "withdrawal-accept").on("e.canonical", "=", true)).innerJoin("blocks as b", (join) => join.onRef("b.height", "=", "e.block_height").on("b.canonical", "=", true)).where("s.settlement_confirmed", "=", true).where("s.confirmed_at", ">", after).select([
1156
+ async settlementsSince(scan) {
1157
+ const rows = await db.selectFrom("sbtc_settlements as s").innerJoin("sbtc_events as e", (join) => join.onRef("e.sweep_txid", "=", "s.sweep_txid").on("e.topic", "=", "withdrawal-accept").on("e.canonical", "=", true)).innerJoin("blocks as b", (join) => join.onRef("b.height", "=", "e.block_height").on("b.canonical", "=", true)).where("s.settlement_confirmed", "=", true).where((eb) => ("afterSeq" in scan) ? eb("s.seq", ">", scan.afterSeq) : eb("s.confirmed_at", ">", scan.confirmedAfter)).select([
1158
+ "s.seq",
1158
1159
  "s.sweep_txid",
1159
1160
  "s.request_id",
1160
1161
  "s.btc_confirmations",
@@ -1166,7 +1167,8 @@ function databaseChainDataReader(db) {
1166
1167
  "e.sender",
1167
1168
  "b.hash as block_hash",
1168
1169
  "b.timestamp as block_timestamp"
1169
- ]).execute();
1170
+ ]).orderBy("s.seq").execute();
1171
+ return rows.map((row) => ({ ...row, seq: Number(row.seq) }));
1170
1172
  }
1171
1173
  };
1172
1174
  }
@@ -1248,8 +1250,8 @@ function hostedChainDataReader(client, opts = {}) {
1248
1250
  }
1249
1251
  return ids;
1250
1252
  },
1251
- async settlementsConfirmedAfter(after) {
1252
- const withdrawals = oneWithdrawalPerSweep(await client.fetchSettledWithdrawals(after));
1253
+ async settlementsSince(scan) {
1254
+ const withdrawals = oneWithdrawalPerSweep(await client.fetchSettledWithdrawals(scan)).sort((a, b) => Number(a.settlement_seq) - Number(b.settlement_seq));
1253
1255
  const out = [];
1254
1256
  for (const w of withdrawals) {
1255
1257
  const accepts = await client.fetchSbtcEvents(0, THROUGH_TIP, ["withdrawal-accept"], { requestId: w.request_id });
@@ -1260,6 +1262,7 @@ function hostedChainDataReader(client, opts = {}) {
1260
1262
  if (!block)
1261
1263
  continue;
1262
1264
  out.push({
1265
+ seq: Number(w.settlement_seq),
1263
1266
  sweep_txid: w.sweep_txid,
1264
1267
  request_id: w.request_id,
1265
1268
  btc_confirmations: w.btc_confirmations ?? 0,
@@ -1292,7 +1295,7 @@ function chainDataReader(opts) {
1292
1295
  return {
1293
1296
  sbtcEvents: async (...args) => (await reader()).sbtcEvents(...args),
1294
1297
  traitContractIds: async (...args) => (await reader()).traitContractIds(...args),
1295
- settlementsConfirmedAfter: async (...args) => (await reader()).settlementsConfirmedAfter(...args)
1298
+ settlementsSince: async (...args) => (await reader()).settlementsSince(...args)
1296
1299
  };
1297
1300
  }
1298
1301
  var processHttpClient;
@@ -2044,13 +2047,25 @@ async function replayWebhook(input, opts) {
2044
2047
  });
2045
2048
  try {
2046
2049
  const result = await replayChainWebhook(db, sub, input, opts);
2047
- await finishScan(db, replayId, {
2050
+ const finished = await finishScan(db, replayId, {
2048
2051
  scanned: result.scannedCount,
2049
2052
  enqueued: result.enqueuedCount
2050
2053
  });
2054
+ if (!finished) {
2055
+ logger2.warn("Replay scan finished but the replay was no longer scanning", {
2056
+ replayId,
2057
+ webhookId: sub.id
2058
+ });
2059
+ }
2051
2060
  return result;
2052
2061
  } catch (err) {
2053
- await failScan(db, replayId, getErrorMessage(err));
2062
+ const failed = await failScan(db, replayId, getErrorMessage(err));
2063
+ if (!failed) {
2064
+ logger2.warn("Replay scan failed but the replay was no longer scanning", {
2065
+ replayId,
2066
+ webhookId: sub.id
2067
+ });
2068
+ }
2054
2069
  throw err;
2055
2070
  }
2056
2071
  }
@@ -2103,5 +2118,5 @@ export {
2103
2118
  replayWebhook
2104
2119
  };
2105
2120
 
2106
- //# debugId=39B901D4E6180ED664756E2164756E21
2121
+ //# debugId=C124846F6D3815F864756E2164756E21
2107
2122
  //# sourceMappingURL=replay.js.map