@notuslabs/yail 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +226 -0
- package/bin/yail.js +7 -0
- package/dist/addresses/registry.d.ts +57 -0
- package/dist/addresses/registry.d.ts.map +1 -0
- package/dist/addresses/registry.js +131 -0
- package/dist/addresses/registry.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +204 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/address.d.ts +32 -0
- package/dist/config/address.d.ts.map +1 -0
- package/dist/config/address.js +31 -0
- package/dist/config/address.js.map +1 -0
- package/dist/config/chain-ref.d.ts +5 -0
- package/dist/config/chain-ref.d.ts.map +1 -0
- package/dist/config/chain-ref.js +13 -0
- package/dist/config/chain-ref.js.map +1 -0
- package/dist/config/create-config.d.ts +9 -0
- package/dist/config/create-config.d.ts.map +1 -0
- package/dist/config/create-config.js +86 -0
- package/dist/config/create-config.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/types.d.ts +113 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/db/batch.d.ts +33 -0
- package/dist/db/batch.d.ts.map +1 -0
- package/dist/db/batch.js +71 -0
- package/dist/db/batch.js.map +1 -0
- package/dist/db/client.d.ts +50 -0
- package/dist/db/client.d.ts.map +1 -0
- package/dist/db/client.js +104 -0
- package/dist/db/client.js.map +1 -0
- package/dist/db/index.d.ts +11 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/internal.d.ts +2332 -0
- package/dist/db/internal.d.ts.map +1 -0
- package/dist/db/internal.js +75 -0
- package/dist/db/internal.js.map +1 -0
- package/dist/db/migrate.d.ts +22 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +72 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/serialize.d.ts +14 -0
- package/dist/db/serialize.d.ts.map +1 -0
- package/dist/db/serialize.js +133 -0
- package/dist/db/serialize.js.map +1 -0
- package/dist/db/sql.d.ts +44 -0
- package/dist/db/sql.d.ts.map +1 -0
- package/dist/db/sql.js +122 -0
- package/dist/db/sql.js.map +1 -0
- package/dist/http/client.d.ts +40 -0
- package/dist/http/client.d.ts.map +1 -0
- package/dist/http/client.js +128 -0
- package/dist/http/client.js.map +1 -0
- package/dist/index.d.ts +21 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/context.d.ts +84 -0
- package/dist/indexer/context.d.ts.map +1 -0
- package/dist/indexer/context.js +45 -0
- package/dist/indexer/context.js.map +1 -0
- package/dist/indexer/events.d.ts +87 -0
- package/dist/indexer/events.d.ts.map +1 -0
- package/dist/indexer/events.js +88 -0
- package/dist/indexer/events.js.map +1 -0
- package/dist/indexer/indexer.d.ts +114 -0
- package/dist/indexer/indexer.d.ts.map +1 -0
- package/dist/indexer/indexer.js +237 -0
- package/dist/indexer/indexer.js.map +1 -0
- package/dist/indexer/jobs.d.ts +61 -0
- package/dist/indexer/jobs.d.ts.map +1 -0
- package/dist/indexer/jobs.js +170 -0
- package/dist/indexer/jobs.js.map +1 -0
- package/dist/indexer/plan.d.ts +73 -0
- package/dist/indexer/plan.d.ts.map +1 -0
- package/dist/indexer/plan.js +238 -0
- package/dist/indexer/plan.js.map +1 -0
- package/dist/indexer/runtime.d.ts +100 -0
- package/dist/indexer/runtime.d.ts.map +1 -0
- package/dist/indexer/runtime.js +572 -0
- package/dist/indexer/runtime.js.map +1 -0
- package/dist/observability/logger.d.ts +23 -0
- package/dist/observability/logger.d.ts.map +1 -0
- package/dist/observability/logger.js +72 -0
- package/dist/observability/logger.js.map +1 -0
- package/dist/observability/metrics.d.ts +61 -0
- package/dist/observability/metrics.d.ts.map +1 -0
- package/dist/observability/metrics.js +131 -0
- package/dist/observability/metrics.js.map +1 -0
- package/dist/observability/otel.d.ts +28 -0
- package/dist/observability/otel.d.ts.map +1 -0
- package/dist/observability/otel.js +49 -0
- package/dist/observability/otel.js.map +1 -0
- package/dist/rpc/cached-client.d.ts +33 -0
- package/dist/rpc/cached-client.d.ts.map +1 -0
- package/dist/rpc/cached-client.js +50 -0
- package/dist/rpc/cached-client.js.map +1 -0
- package/dist/schema/column.d.ts +61 -0
- package/dist/schema/column.d.ts.map +1 -0
- package/dist/schema/column.js +76 -0
- package/dist/schema/column.js.map +1 -0
- package/dist/schema/ddl.d.ts +9 -0
- package/dist/schema/ddl.d.ts.map +1 -0
- package/dist/schema/ddl.js +58 -0
- package/dist/schema/ddl.js.map +1 -0
- package/dist/schema/index.d.ts +8 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +5 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/table.d.ts +69 -0
- package/dist/schema/table.d.ts.map +1 -0
- package/dist/schema/table.js +35 -0
- package/dist/schema/table.js.map +1 -0
- package/dist/schema/view.d.ts +19 -0
- package/dist/schema/view.d.ts.map +1 -0
- package/dist/schema/view.js +16 -0
- package/dist/schema/view.js.map +1 -0
- package/dist/server/api.d.ts +11 -0
- package/dist/server/api.d.ts.map +1 -0
- package/dist/server/api.js +71 -0
- package/dist/server/api.js.map +1 -0
- package/dist/sources/cached.d.ts +27 -0
- package/dist/sources/cached.d.ts.map +1 -0
- package/dist/sources/cached.js +111 -0
- package/dist/sources/cached.js.map +1 -0
- package/dist/sources/esplora.d.ts +22 -0
- package/dist/sources/esplora.d.ts.map +1 -0
- package/dist/sources/esplora.js +138 -0
- package/dist/sources/esplora.js.map +1 -0
- package/dist/sources/fixture.d.ts +51 -0
- package/dist/sources/fixture.d.ts.map +1 -0
- package/dist/sources/fixture.js +102 -0
- package/dist/sources/fixture.js.map +1 -0
- package/dist/sources/hypersync.d.ts +19 -0
- package/dist/sources/hypersync.d.ts.map +1 -0
- package/dist/sources/hypersync.js +169 -0
- package/dist/sources/hypersync.js.map +1 -0
- package/dist/sources/index.d.ts +13 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +7 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/rpc.d.ts +21 -0
- package/dist/sources/rpc.d.ts.map +1 -0
- package/dist/sources/rpc.js +187 -0
- package/dist/sources/rpc.js.map +1 -0
- package/dist/sources/types.d.ts +137 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +17 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/testing/index.d.ts +20 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +44 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/util.d.ts +9 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +25 -0
- package/dist/util.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
import { createPublicClient, http } from "viem";
|
|
2
|
+
import { lower } from "./types.js";
|
|
3
|
+
import { lowerOrNull } from "../util.js";
|
|
4
|
+
/**
|
|
5
|
+
* JSON-RPC source. Slower than HyperSync but works against any node,
|
|
6
|
+
* needs no token, and is what the recorded test fixtures are captured with.
|
|
7
|
+
* Account (from/to) filters require scanning full blocks; keep ranges small.
|
|
8
|
+
*/
|
|
9
|
+
export function rpc(options) {
|
|
10
|
+
const client = options.client ?? createPublicClient({ transport: http(options.url, { batch: true, retryCount: 5 }) });
|
|
11
|
+
const blockRange = options.blockRange ?? 2000;
|
|
12
|
+
const concurrency = options.concurrency ?? 4;
|
|
13
|
+
const source = {
|
|
14
|
+
kind: "evm",
|
|
15
|
+
name: `rpc(${safeHost(options.url)})`,
|
|
16
|
+
async getHeight() {
|
|
17
|
+
return Number(await client.getBlockNumber());
|
|
18
|
+
},
|
|
19
|
+
async *fetch(query, fetchOptions) {
|
|
20
|
+
let from = query.fromBlock;
|
|
21
|
+
while (from < query.toBlock) {
|
|
22
|
+
fetchOptions?.signal?.throwIfAborted();
|
|
23
|
+
const to = Math.min(from + blockRange, query.toBlock);
|
|
24
|
+
yield await fetchRange(from, to, query);
|
|
25
|
+
from = to;
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
async getBlock(number) {
|
|
29
|
+
const b = await client.getBlock({ blockNumber: BigInt(number) }).catch(() => null);
|
|
30
|
+
if (!b)
|
|
31
|
+
return null;
|
|
32
|
+
return { number: Number(b.number), hash: b.hash, parentHash: b.parentHash, timestamp: Number(b.timestamp) };
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
async function fetchRange(from, to, query) {
|
|
36
|
+
const logs = [];
|
|
37
|
+
const seenLogs = new Set();
|
|
38
|
+
for (const f of query.logs) {
|
|
39
|
+
const params = { fromBlock: hex(from), toBlock: hex(to - 1) };
|
|
40
|
+
if (f.address && f.address.length > 0)
|
|
41
|
+
params.address = f.address.map(lower);
|
|
42
|
+
if (f.topics)
|
|
43
|
+
params.topics = f.topics.map(topicAlternatives);
|
|
44
|
+
const raw = (await client.request({ method: "eth_getLogs", params: [params] }));
|
|
45
|
+
for (const l of raw) {
|
|
46
|
+
const key = `${l.blockNumber}:${l.logIndex}`;
|
|
47
|
+
if (seenLogs.has(key))
|
|
48
|
+
continue;
|
|
49
|
+
seenLogs.add(key);
|
|
50
|
+
logs.push({
|
|
51
|
+
blockNumber: Number(l.blockNumber),
|
|
52
|
+
blockHash: l.blockHash,
|
|
53
|
+
transactionHash: l.transactionHash,
|
|
54
|
+
transactionIndex: Number(l.transactionIndex),
|
|
55
|
+
logIndex: Number(l.logIndex),
|
|
56
|
+
address: lower(l.address),
|
|
57
|
+
data: l.data,
|
|
58
|
+
topics: l.topics,
|
|
59
|
+
removed: l.removed,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
logs.sort((a, b) => a.blockNumber - b.blockNumber || a.logIndex - b.logIndex);
|
|
64
|
+
const blocks = new Map();
|
|
65
|
+
const transactions = new Map();
|
|
66
|
+
const needTxOfLogs = query.includeLogTransactions === true;
|
|
67
|
+
const wantBlocks = new Set(logs.map((l) => l.blockNumber));
|
|
68
|
+
const logTxHashes = new Set();
|
|
69
|
+
if (needTxOfLogs)
|
|
70
|
+
for (const l of logs)
|
|
71
|
+
logTxHashes.add(l.transactionHash);
|
|
72
|
+
if (query.transactions.length > 0) {
|
|
73
|
+
// Account filters: scan every block in range with its transactions.
|
|
74
|
+
const numbers = Array.from({ length: to - from }, (_, i) => from + i);
|
|
75
|
+
await mapLimit(numbers, concurrency, async (n) => {
|
|
76
|
+
const b = await client.getBlock({ blockNumber: BigInt(n), includeTransactions: true });
|
|
77
|
+
blocks.set(n, { number: n, hash: b.hash, parentHash: b.parentHash, timestamp: Number(b.timestamp) });
|
|
78
|
+
for (const tx of b.transactions) {
|
|
79
|
+
if (typeof tx === "string")
|
|
80
|
+
continue;
|
|
81
|
+
if (matchesTxFilters(tx.from, tx.to, query.transactions) || logTxHashes.has(tx.hash)) {
|
|
82
|
+
transactions.set(tx.hash, toTx(tx, n));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const missingBlocks = [...wantBlocks].filter((n) => !blocks.has(n));
|
|
88
|
+
await mapLimit(missingBlocks, concurrency, async (n) => {
|
|
89
|
+
const b = await client.getBlock({ blockNumber: BigInt(n), includeTransactions: needTxOfLogs });
|
|
90
|
+
blocks.set(n, { number: n, hash: b.hash, parentHash: b.parentHash, timestamp: Number(b.timestamp) });
|
|
91
|
+
if (needTxOfLogs) {
|
|
92
|
+
const wanted = new Set(logs.filter((l) => l.blockNumber === n).map((l) => l.transactionHash));
|
|
93
|
+
for (const tx of b.transactions) {
|
|
94
|
+
if (typeof tx === "string")
|
|
95
|
+
continue;
|
|
96
|
+
if (wanted.has(tx.hash))
|
|
97
|
+
transactions.set(tx.hash, toTx(tx, n));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
if (options.receipts !== false && transactions.size > 0) {
|
|
102
|
+
await mapLimit([...transactions.values()], concurrency, async (tx) => {
|
|
103
|
+
const r = await client.getTransactionReceipt({ hash: tx.hash }).catch(() => null);
|
|
104
|
+
if (!r)
|
|
105
|
+
return;
|
|
106
|
+
tx.gasUsed = r.gasUsed;
|
|
107
|
+
tx.effectiveGasPrice = r.effectiveGasPrice;
|
|
108
|
+
tx.status = 0;
|
|
109
|
+
if (r.status === "success")
|
|
110
|
+
tx.status = 1;
|
|
111
|
+
tx.contractAddress = lowerOrNull(r.contractAddress);
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
fromBlock: from,
|
|
116
|
+
nextBlock: to,
|
|
117
|
+
blocks: [...blocks.values()].sort((a, b) => a.number - b.number),
|
|
118
|
+
transactions: [...transactions.values()].sort((a, b) => a.blockNumber - b.blockNumber || a.transactionIndex - b.transactionIndex),
|
|
119
|
+
logs,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
return source;
|
|
123
|
+
}
|
|
124
|
+
function toTx(tx, blockNumber) {
|
|
125
|
+
return {
|
|
126
|
+
hash: tx.hash,
|
|
127
|
+
blockNumber,
|
|
128
|
+
transactionIndex: Number(tx.transactionIndex),
|
|
129
|
+
from: lower(tx.from),
|
|
130
|
+
to: lowerOrNull(tx.to),
|
|
131
|
+
value: BigInt(tx.value ?? 0),
|
|
132
|
+
input: tx.input ?? "0x",
|
|
133
|
+
nonce: optionalBigInt(tx.nonce),
|
|
134
|
+
gas: optionalBigInt(tx.gas),
|
|
135
|
+
gasPrice: optionalBigInt(tx.gasPrice),
|
|
136
|
+
type: optionalHexNumber(tx.typeHex),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function optionalBigInt(value) {
|
|
140
|
+
if (value === undefined || value === null)
|
|
141
|
+
return undefined;
|
|
142
|
+
return BigInt(value);
|
|
143
|
+
}
|
|
144
|
+
function optionalHexNumber(value) {
|
|
145
|
+
if (typeof value !== "string")
|
|
146
|
+
return undefined;
|
|
147
|
+
return Number(value);
|
|
148
|
+
}
|
|
149
|
+
/** eth_getLogs wants a single topic as a string and alternatives as an array. */
|
|
150
|
+
function topicAlternatives(alts) {
|
|
151
|
+
if (alts === null)
|
|
152
|
+
return null;
|
|
153
|
+
if (alts.length === 1)
|
|
154
|
+
return alts[0];
|
|
155
|
+
return alts;
|
|
156
|
+
}
|
|
157
|
+
export function matchesTxFilters(from, to, filters) {
|
|
158
|
+
const f = lower(from);
|
|
159
|
+
const t = lowerOrNull(to);
|
|
160
|
+
return filters.some((filter) => {
|
|
161
|
+
const fromOk = !filter.from || filter.from.length === 0 || filter.from.map(lower).includes(f);
|
|
162
|
+
const toOk = !filter.to || filter.to.length === 0 || (t !== null && filter.to.map(lower).includes(t));
|
|
163
|
+
return fromOk && toOk;
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
async function mapLimit(items, limit, fn) {
|
|
167
|
+
let i = 0;
|
|
168
|
+
const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {
|
|
169
|
+
while (i < items.length) {
|
|
170
|
+
const item = items[i++];
|
|
171
|
+
await fn(item);
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
await Promise.all(workers);
|
|
175
|
+
}
|
|
176
|
+
function hex(n) {
|
|
177
|
+
return `0x${n.toString(16)}`;
|
|
178
|
+
}
|
|
179
|
+
function safeHost(url) {
|
|
180
|
+
try {
|
|
181
|
+
return new URL(url).host;
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return url;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=rpc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rpc.js","sourceRoot":"","sources":["../../src/sources/rpc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source abstraction. Every data provider (HyperSync, JSON-RPC, the cache
|
|
3
|
+
* wrapper, Esplora for Bitcoin, recorded fixtures) implements the same
|
|
4
|
+
* shape: `getHeight()` and `fetch(query)` yielding ordered, contiguous
|
|
5
|
+
* batches of blocks/transactions/logs for a block range.
|
|
6
|
+
*/
|
|
7
|
+
export interface FetchOptions {
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
}
|
|
10
|
+
export interface RangeQuery {
|
|
11
|
+
fromBlock: number;
|
|
12
|
+
/** Exclusive. */
|
|
13
|
+
toBlock: number;
|
|
14
|
+
}
|
|
15
|
+
export interface RangeBatch {
|
|
16
|
+
fromBlock: number;
|
|
17
|
+
/** Exclusive end of the range covered by this batch. Contiguous with the next batch. */
|
|
18
|
+
nextBlock: number;
|
|
19
|
+
}
|
|
20
|
+
export interface EvmLogFilter {
|
|
21
|
+
/** Contract addresses (OR). Empty/undefined = any contract. */
|
|
22
|
+
address?: string[];
|
|
23
|
+
/** Per-position topic alternatives (OR within a position, AND across positions). `null` = any. */
|
|
24
|
+
topics?: Array<string[] | null>;
|
|
25
|
+
}
|
|
26
|
+
export interface EvmTxFilter {
|
|
27
|
+
/** Sender addresses (OR). */
|
|
28
|
+
from?: string[];
|
|
29
|
+
/** Recipient addresses (OR). Combined with `from` using AND (HyperSync semantics). */
|
|
30
|
+
to?: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface EvmQuery extends RangeQuery {
|
|
33
|
+
logs: EvmLogFilter[];
|
|
34
|
+
transactions: EvmTxFilter[];
|
|
35
|
+
/** Also return the transaction of every matched log. */
|
|
36
|
+
includeLogTransactions?: boolean;
|
|
37
|
+
}
|
|
38
|
+
export interface EvmBlock {
|
|
39
|
+
number: number;
|
|
40
|
+
hash: string;
|
|
41
|
+
parentHash?: string;
|
|
42
|
+
timestamp: number;
|
|
43
|
+
}
|
|
44
|
+
export interface EvmTransaction {
|
|
45
|
+
hash: string;
|
|
46
|
+
blockNumber: number;
|
|
47
|
+
transactionIndex: number;
|
|
48
|
+
from: string;
|
|
49
|
+
to: string | null;
|
|
50
|
+
value: bigint;
|
|
51
|
+
input: string;
|
|
52
|
+
nonce?: bigint;
|
|
53
|
+
gas?: bigint;
|
|
54
|
+
gasPrice?: bigint;
|
|
55
|
+
gasUsed?: bigint;
|
|
56
|
+
effectiveGasPrice?: bigint;
|
|
57
|
+
status?: number;
|
|
58
|
+
type?: number;
|
|
59
|
+
contractAddress?: string | null;
|
|
60
|
+
}
|
|
61
|
+
export interface EvmLog {
|
|
62
|
+
blockNumber: number;
|
|
63
|
+
blockHash?: string;
|
|
64
|
+
transactionHash: string;
|
|
65
|
+
transactionIndex: number;
|
|
66
|
+
logIndex: number;
|
|
67
|
+
address: string;
|
|
68
|
+
data: string;
|
|
69
|
+
topics: string[];
|
|
70
|
+
removed?: boolean;
|
|
71
|
+
}
|
|
72
|
+
export interface RollbackGuard {
|
|
73
|
+
blockNumber: number;
|
|
74
|
+
hash: string;
|
|
75
|
+
firstBlockNumber: number;
|
|
76
|
+
firstParentHash: string;
|
|
77
|
+
}
|
|
78
|
+
export interface EvmBatch extends RangeBatch {
|
|
79
|
+
blocks: EvmBlock[];
|
|
80
|
+
transactions: EvmTransaction[];
|
|
81
|
+
logs: EvmLog[];
|
|
82
|
+
rollbackGuard?: RollbackGuard;
|
|
83
|
+
archiveHeight?: number;
|
|
84
|
+
}
|
|
85
|
+
export interface EvmSource {
|
|
86
|
+
readonly kind: "evm";
|
|
87
|
+
readonly name: string;
|
|
88
|
+
getHeight(): Promise<number>;
|
|
89
|
+
fetch(query: EvmQuery, options?: FetchOptions): AsyncIterable<EvmBatch>;
|
|
90
|
+
/** Optional: block header lookup (used for reorg checks and `startBlock: "latest"`). */
|
|
91
|
+
getBlock?(number: number): Promise<EvmBlock | null>;
|
|
92
|
+
}
|
|
93
|
+
export interface BitcoinQuery extends RangeQuery {
|
|
94
|
+
addresses: string[];
|
|
95
|
+
}
|
|
96
|
+
export interface BitcoinOutput {
|
|
97
|
+
n: number;
|
|
98
|
+
address: string | null;
|
|
99
|
+
value: bigint;
|
|
100
|
+
scriptType?: string;
|
|
101
|
+
}
|
|
102
|
+
export interface BitcoinInput {
|
|
103
|
+
txid: string;
|
|
104
|
+
vout: number;
|
|
105
|
+
prevout: {
|
|
106
|
+
address: string | null;
|
|
107
|
+
value: bigint;
|
|
108
|
+
} | null;
|
|
109
|
+
isCoinbase: boolean;
|
|
110
|
+
}
|
|
111
|
+
export interface BitcoinTransaction {
|
|
112
|
+
txid: string;
|
|
113
|
+
blockHeight: number;
|
|
114
|
+
blockHash: string;
|
|
115
|
+
blockTime: number;
|
|
116
|
+
fee: bigint;
|
|
117
|
+
vin: BitcoinInput[];
|
|
118
|
+
vout: BitcoinOutput[];
|
|
119
|
+
}
|
|
120
|
+
export interface BitcoinBatch extends RangeBatch {
|
|
121
|
+
transactions: BitcoinTransaction[];
|
|
122
|
+
}
|
|
123
|
+
export interface BitcoinSource {
|
|
124
|
+
readonly kind: "bitcoin";
|
|
125
|
+
readonly name: string;
|
|
126
|
+
getHeight(): Promise<number>;
|
|
127
|
+
fetch(query: BitcoinQuery, options?: FetchOptions): AsyncIterable<BitcoinBatch>;
|
|
128
|
+
}
|
|
129
|
+
export type Source = EvmSource | BitcoinSource;
|
|
130
|
+
export type SourceKind = Source["kind"];
|
|
131
|
+
export type QueryOf<S extends Source> = S extends EvmSource ? EvmQuery : BitcoinQuery;
|
|
132
|
+
export type BatchOf<S extends Source> = S extends EvmSource ? EvmBatch : BitcoinBatch;
|
|
133
|
+
/** Sort key for deterministic ordering of logs within a chain. */
|
|
134
|
+
export declare function logOrder(a: EvmLog, b: EvmLog): number;
|
|
135
|
+
export declare function txOrder(a: EvmTransaction, b: EvmTransaction): number;
|
|
136
|
+
export declare function lower(s: string): string;
|
|
137
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sources/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Source abstraction. Every data provider (HyperSync, JSON-RPC, the cache
|
|
3
|
+
* wrapper, Esplora for Bitcoin, recorded fixtures) implements the same
|
|
4
|
+
* shape: `getHeight()` and `fetch(query)` yielding ordered, contiguous
|
|
5
|
+
* batches of blocks/transactions/logs for a block range.
|
|
6
|
+
*/
|
|
7
|
+
/** Sort key for deterministic ordering of logs within a chain. */
|
|
8
|
+
export function logOrder(a, b) {
|
|
9
|
+
return a.blockNumber - b.blockNumber || a.transactionIndex - b.transactionIndex || a.logIndex - b.logIndex;
|
|
10
|
+
}
|
|
11
|
+
export function txOrder(a, b) {
|
|
12
|
+
return a.blockNumber - b.blockNumber || a.transactionIndex - b.transactionIndex;
|
|
13
|
+
}
|
|
14
|
+
export function lower(s) {
|
|
15
|
+
return s.toLowerCase();
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sources/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoJH,kEAAkE;AAClE,MAAM,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS;IAC3C,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;AAC7G,CAAC;AACD,MAAM,UAAU,OAAO,CAAC,CAAiB,EAAE,CAAiB;IAC1D,OAAO,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,gBAAgB,GAAG,CAAC,CAAC,gBAAgB,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,CAAS;IAC7B,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { DatabaseConfig } from "../db/client.js";
|
|
2
|
+
export { fixtureSource, readFixture, writeFixture, recordEvmFixture, recordBitcoinFixture } from "../sources/fixture.js";
|
|
3
|
+
export type { Fixture, EvmFixture, BitcoinFixture } from "../sources/fixture.js";
|
|
4
|
+
export { readMemoryLogs } from "evlog/memory";
|
|
5
|
+
export interface TestClickHouse {
|
|
6
|
+
/** Base HTTP URL with credentials, e.g. http://default:pass@localhost:32768 */
|
|
7
|
+
url: string;
|
|
8
|
+
/** `database` config for an isolated database (created by migrate). */
|
|
9
|
+
database(config?: Partial<DatabaseConfig>): DatabaseConfig;
|
|
10
|
+
stop(): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* A ClickHouse for tests. Uses `YAIL_TEST_CLICKHOUSE_URL` when set (a running
|
|
14
|
+
* server), otherwise starts a `clickhouse/clickhouse-server` container via
|
|
15
|
+
* testcontainers (needs Docker). One instance is shared per process.
|
|
16
|
+
*/
|
|
17
|
+
export declare function startTestClickHouse(options?: {
|
|
18
|
+
image?: string;
|
|
19
|
+
}): Promise<TestClickHouse>;
|
|
20
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AACzH,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,MAAM,WAAW,cAAc;IAC7B,+EAA+E;IAC/E,GAAG,EAAE,MAAM,CAAC;IACZ,uEAAuE;IACvE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAAC;IAC3D,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAID;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAoB7F"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
export { fixtureSource, readFixture, writeFixture, recordEvmFixture, recordBitcoinFixture } from "../sources/fixture.js";
|
|
3
|
+
export { readMemoryLogs } from "evlog/memory";
|
|
4
|
+
let shared;
|
|
5
|
+
/**
|
|
6
|
+
* A ClickHouse for tests. Uses `YAIL_TEST_CLICKHOUSE_URL` when set (a running
|
|
7
|
+
* server), otherwise starts a `clickhouse/clickhouse-server` container via
|
|
8
|
+
* testcontainers (needs Docker). One instance is shared per process.
|
|
9
|
+
*/
|
|
10
|
+
export function startTestClickHouse(options = {}) {
|
|
11
|
+
shared ??= (async () => {
|
|
12
|
+
const envUrl = process.env.YAIL_TEST_CLICKHOUSE_URL;
|
|
13
|
+
if (envUrl)
|
|
14
|
+
return make(envUrl, async () => { });
|
|
15
|
+
let ClickHouseContainer;
|
|
16
|
+
try {
|
|
17
|
+
({ ClickHouseContainer } = await import("@testcontainers/clickhouse"));
|
|
18
|
+
}
|
|
19
|
+
catch (cause) {
|
|
20
|
+
throw new Error("startTestClickHouse(): install the optional peer dependency `@testcontainers/clickhouse` (and have Docker running), or point YAIL_TEST_CLICKHOUSE_URL at a running ClickHouse.", { cause });
|
|
21
|
+
}
|
|
22
|
+
const container = await new ClickHouseContainer(options.image ?? process.env.YAIL_TEST_CLICKHOUSE_IMAGE ?? "clickhouse/clickhouse-server:25.8")
|
|
23
|
+
.withUsername("default")
|
|
24
|
+
.withPassword("yail")
|
|
25
|
+
.start();
|
|
26
|
+
return make(container.getConnectionUrl(), () => container.stop().then(() => { }));
|
|
27
|
+
})();
|
|
28
|
+
return shared;
|
|
29
|
+
}
|
|
30
|
+
function make(url, stop) {
|
|
31
|
+
const u = new URL(url);
|
|
32
|
+
let auth = "";
|
|
33
|
+
if (u.username)
|
|
34
|
+
auth = `${u.username}:${u.password}@`;
|
|
35
|
+
const base = `${u.protocol}//${auth}${u.host}`;
|
|
36
|
+
return {
|
|
37
|
+
url: base,
|
|
38
|
+
database(config) {
|
|
39
|
+
return { url: base, database: `yail_test_${randomUUID().slice(0, 8)}`, ...config };
|
|
40
|
+
},
|
|
41
|
+
stop,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAEzH,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAU9C,IAAI,MAA2C,CAAC;AAEhD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,OAAO,GAAuB,EAAE;IAClE,MAAM,KAAK,CAAC,KAAK,IAAI,EAAE;QACrB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC;QACpD,IAAI,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC,CAAC,CAAC;QAChD,IAAI,mBAAyF,CAAC;QAC9F,IAAI,CAAC;YACH,CAAC,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,gLAAgL,EAChL,EAAE,KAAK,EAAE,CACV,CAAC;QACJ,CAAC;QACD,MAAM,SAAS,GAAG,MAAM,IAAI,mBAAmB,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,0BAA0B,IAAI,mCAAmC,CAAC;aAC5I,YAAY,CAAC,SAAS,CAAC;aACvB,YAAY,CAAC,MAAM,CAAC;aACpB,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,EAAE,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC;IACnF,CAAC,CAAC,EAAE,CAAC;IACL,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,IAAI,CAAC,GAAW,EAAE,IAAyB;IAClD,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IACvB,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,CAAC,CAAC,QAAQ;QAAE,IAAI,GAAG,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC;IACtD,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,QAAQ,KAAK,IAAI,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,OAAO;QACL,GAAG,EAAE,IAAI;QACT,QAAQ,CAAC,MAAM;YACb,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,aAAa,UAAU,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,EAAE,CAAC;QACrF,CAAC;QACD,IAAI;KACL,CAAC;AACJ,CAAC"}
|
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Wrap a single value in an array; copy an array. */
|
|
2
|
+
export declare function toArray<T>(value: T | readonly T[]): T[];
|
|
3
|
+
/** JSON.stringify replacer that turns bigints into decimal strings. */
|
|
4
|
+
export declare function bigintReplacer(_key: string, value: unknown): unknown;
|
|
5
|
+
/** Lowercase a hex string, or null when absent. */
|
|
6
|
+
export declare function lowerOrNull(value: string | null | undefined): string | null;
|
|
7
|
+
/** URL-decode a credential from a URL, or fall back when the URL has none. */
|
|
8
|
+
export declare function decodeOr(value: string, fallback: string): string;
|
|
9
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,EAAE,CAGvD;AAED,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAGpE;AAED,mDAAmD;AACnD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAG3E;AAED,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGhE"}
|
package/dist/util.js
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** Wrap a single value in an array; copy an array. */
|
|
2
|
+
export function toArray(value) {
|
|
3
|
+
if (Array.isArray(value))
|
|
4
|
+
return [...value];
|
|
5
|
+
return [value];
|
|
6
|
+
}
|
|
7
|
+
/** JSON.stringify replacer that turns bigints into decimal strings. */
|
|
8
|
+
export function bigintReplacer(_key, value) {
|
|
9
|
+
if (typeof value === "bigint")
|
|
10
|
+
return value.toString();
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
/** Lowercase a hex string, or null when absent. */
|
|
14
|
+
export function lowerOrNull(value) {
|
|
15
|
+
if (value)
|
|
16
|
+
return value.toLowerCase();
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
/** URL-decode a credential from a URL, or fall back when the URL has none. */
|
|
20
|
+
export function decodeOr(value, fallback) {
|
|
21
|
+
if (value)
|
|
22
|
+
return decodeURIComponent(value);
|
|
23
|
+
return fallback;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,sDAAsD;AACtD,MAAM,UAAU,OAAO,CAAI,KAAuB;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,GAAI,KAAsB,CAAC,CAAC;IAC9D,OAAO,CAAC,KAAU,CAAC,CAAC;AACtB,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,KAAc;IACzD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;IACvD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,WAAW,CAAC,KAAgC;IAC1D,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IACtC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,QAAgB;IACtD,IAAI,KAAK;QAAE,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@notuslabs/yail",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Blockchain indexer with Ponder-style DX: HyperSync as the primary EVM source, Esplora for Bitcoin, ClickHouse as the only storage",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"indexer",
|
|
7
|
+
"blockchain",
|
|
8
|
+
"ethereum",
|
|
9
|
+
"evm",
|
|
10
|
+
"bitcoin",
|
|
11
|
+
"hypersync",
|
|
12
|
+
"envio",
|
|
13
|
+
"clickhouse",
|
|
14
|
+
"ponder",
|
|
15
|
+
"web3"
|
|
16
|
+
],
|
|
17
|
+
"homepage": "https://github.com/notuslabs/YAIL/tree/main/packages/yail#readme",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "git+https://github.com/notuslabs/YAIL.git",
|
|
21
|
+
"directory": "packages/yail"
|
|
22
|
+
},
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/notuslabs/YAIL/issues"
|
|
25
|
+
},
|
|
26
|
+
"author": "Thalles Passos",
|
|
27
|
+
"license": "MIT",
|
|
28
|
+
"type": "module",
|
|
29
|
+
"engines": {
|
|
30
|
+
"node": ">=20"
|
|
31
|
+
},
|
|
32
|
+
"bin": {
|
|
33
|
+
"yail": "bin/yail.js"
|
|
34
|
+
},
|
|
35
|
+
"main": "./dist/index.js",
|
|
36
|
+
"types": "./dist/index.d.ts",
|
|
37
|
+
"exports": {
|
|
38
|
+
".": {
|
|
39
|
+
"types": "./dist/index.d.ts",
|
|
40
|
+
"default": "./dist/index.js"
|
|
41
|
+
},
|
|
42
|
+
"./testing": {
|
|
43
|
+
"types": "./dist/testing/index.d.ts",
|
|
44
|
+
"default": "./dist/testing/index.js"
|
|
45
|
+
},
|
|
46
|
+
"./otel": {
|
|
47
|
+
"types": "./dist/observability/otel.d.ts",
|
|
48
|
+
"default": "./dist/observability/otel.js"
|
|
49
|
+
},
|
|
50
|
+
"./package.json": "./package.json"
|
|
51
|
+
},
|
|
52
|
+
"files": [
|
|
53
|
+
"dist",
|
|
54
|
+
"bin",
|
|
55
|
+
"README.md",
|
|
56
|
+
"LICENSE"
|
|
57
|
+
],
|
|
58
|
+
"publishConfig": {
|
|
59
|
+
"access": "public"
|
|
60
|
+
},
|
|
61
|
+
"scripts": {
|
|
62
|
+
"build": "tsc -p tsconfig.json",
|
|
63
|
+
"clean": "rm -rf dist",
|
|
64
|
+
"prepack": "pnpm run clean && pnpm run build",
|
|
65
|
+
"typecheck": "tsc -p tsconfig.test.json",
|
|
66
|
+
"test": "vitest run",
|
|
67
|
+
"test:watch": "vitest"
|
|
68
|
+
},
|
|
69
|
+
"dependencies": {
|
|
70
|
+
"@clickhouse/client": "^1.23.1",
|
|
71
|
+
"@envio-dev/hypersync-client": "^1.4.1",
|
|
72
|
+
"@hono/node-server": "^2.1.1",
|
|
73
|
+
"@opentelemetry/api": "^1.9.1",
|
|
74
|
+
"@opentelemetry/exporter-metrics-otlp-http": "^0.222.0",
|
|
75
|
+
"@opentelemetry/exporter-trace-otlp-http": "^0.222.0",
|
|
76
|
+
"@opentelemetry/resources": "^2.11.0",
|
|
77
|
+
"@opentelemetry/sdk-metrics": "^2.11.0",
|
|
78
|
+
"@opentelemetry/sdk-node": "^0.222.0",
|
|
79
|
+
"@opentelemetry/semantic-conventions": "^1.37.0",
|
|
80
|
+
"evlog": "^2.29.0",
|
|
81
|
+
"hono": "^4.13.10",
|
|
82
|
+
"tsx": "^4.23.15",
|
|
83
|
+
"viem": "^2.56.9"
|
|
84
|
+
},
|
|
85
|
+
"peerDependencies": {
|
|
86
|
+
"@testcontainers/clickhouse": ">=12"
|
|
87
|
+
},
|
|
88
|
+
"peerDependenciesMeta": {
|
|
89
|
+
"@testcontainers/clickhouse": {
|
|
90
|
+
"optional": true
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
"devDependencies": {
|
|
94
|
+
"@testcontainers/clickhouse": "^12.2.0",
|
|
95
|
+
"@types/node": "^24",
|
|
96
|
+
"testcontainers": "^12.2.0",
|
|
97
|
+
"typescript": "^7.0.2",
|
|
98
|
+
"vitest": "^5.0.2"
|
|
99
|
+
}
|
|
100
|
+
}
|