@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,204 @@
|
|
|
1
|
+
import { parseArgs } from "node:util";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { existsSync, watch } from "node:fs";
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import { pathToFileURL } from "node:url";
|
|
6
|
+
import { schemaDdl } from "../db/migrate.js";
|
|
7
|
+
import { recordEvmFixture, recordBitcoinFixture, writeFixture } from "../sources/fixture.js";
|
|
8
|
+
import { bigintReplacer } from "../util.js";
|
|
9
|
+
import { buildBitcoinQuery, buildEvmQuery } from "../indexer/plan.js";
|
|
10
|
+
const HELP = `yail <command> [options]
|
|
11
|
+
|
|
12
|
+
Commands
|
|
13
|
+
start [entry] run the indexer (default entry: src/index.ts)
|
|
14
|
+
dev [entry] run and restart on file changes
|
|
15
|
+
migrate [entry] create database, tables and materialized views
|
|
16
|
+
--populate backfill materialized views from existing data
|
|
17
|
+
--reset drop and recreate user tables (dev only)
|
|
18
|
+
ddl [entry] print the DDL statements
|
|
19
|
+
reindex [entry] --chain <name> (--from <block> --to <block> | --scope <name> --value <id>)
|
|
20
|
+
addresses add [entry] --set <name> [--chain <name>] [--from-block <n>] <address...>
|
|
21
|
+
addresses list [entry] [--set <name>] [--chain <name>] [--status <s>]
|
|
22
|
+
record [entry] --chain <name> --from <block> --to <block> --out <file.json>
|
|
23
|
+
status fetch /status from a running indexer (--url http://localhost:42069)
|
|
24
|
+
|
|
25
|
+
The entry module must export the indexer (default export or \`indexer\`).`;
|
|
26
|
+
export async function run(argv) {
|
|
27
|
+
const { values, positionals } = parseArgs({
|
|
28
|
+
args: argv,
|
|
29
|
+
allowPositionals: true,
|
|
30
|
+
options: {
|
|
31
|
+
help: { type: "boolean", short: "h" },
|
|
32
|
+
populate: { type: "boolean" },
|
|
33
|
+
reset: { type: "boolean" },
|
|
34
|
+
chain: { type: "string" },
|
|
35
|
+
from: { type: "string" },
|
|
36
|
+
to: { type: "string" },
|
|
37
|
+
scope: { type: "string" },
|
|
38
|
+
value: { type: "string" },
|
|
39
|
+
set: { type: "string" },
|
|
40
|
+
status: { type: "string" },
|
|
41
|
+
"from-block": { type: "string" },
|
|
42
|
+
out: { type: "string" },
|
|
43
|
+
url: { type: "string" },
|
|
44
|
+
"no-server": { type: "boolean" },
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
const [command, ...rest] = positionals;
|
|
48
|
+
if (command && !["start", "dev"].includes(command))
|
|
49
|
+
process.env.YAIL_QUIET ??= "1";
|
|
50
|
+
if (!command || values.help) {
|
|
51
|
+
console.log(HELP);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (command === "status") {
|
|
55
|
+
const res = await fetch(`${values.url ?? "http://localhost:42069"}/status`);
|
|
56
|
+
console.log(JSON.stringify(await res.json(), null, 2));
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (command === "addresses") {
|
|
60
|
+
const [sub, ...more] = rest;
|
|
61
|
+
const entry = more.find((a) => a.endsWith(".ts") || a.endsWith(".js"));
|
|
62
|
+
const indexer = await loadIndexer(entry);
|
|
63
|
+
if (sub === "add") {
|
|
64
|
+
if (!values.set)
|
|
65
|
+
fail("--set is required");
|
|
66
|
+
const addrs = more.filter((a) => !(a.endsWith(".ts") || a.endsWith(".js")));
|
|
67
|
+
if (addrs.length === 0)
|
|
68
|
+
fail("at least one address is required");
|
|
69
|
+
const rows = await indexer.addresses.register(addrs.map((address) => ({ set: values.set, address, chain: values.chain, fromBlock: optionalNumber(values["from-block"]) })));
|
|
70
|
+
console.log(JSON.stringify(rows, bigintReplacer, 2));
|
|
71
|
+
await indexer.stop();
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (sub === "list") {
|
|
75
|
+
await indexer.init();
|
|
76
|
+
console.log(JSON.stringify(indexer.addresses.list({ set: values.set, chain: values.chain, status: values.status }), bigintReplacer, 2));
|
|
77
|
+
await indexer.stop();
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
fail(`unknown addresses subcommand "${sub}"`);
|
|
81
|
+
}
|
|
82
|
+
const entry = rest[0];
|
|
83
|
+
switch (command) {
|
|
84
|
+
case "start": {
|
|
85
|
+
const indexer = await loadIndexer(entry);
|
|
86
|
+
const stop = () => indexer.stop().then(() => process.exit(0));
|
|
87
|
+
process.on("SIGINT", stop);
|
|
88
|
+
process.on("SIGTERM", stop);
|
|
89
|
+
await indexer.start({ server: !values["no-server"] });
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
case "dev": {
|
|
93
|
+
devLoop(entry);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
case "migrate": {
|
|
97
|
+
const indexer = await loadIndexer(entry);
|
|
98
|
+
await indexer.migrate({ populate: values.populate, reset: values.reset, log: (m) => console.log(`[migrate] ${m}`) });
|
|
99
|
+
await indexer.stop();
|
|
100
|
+
console.log("migrated");
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
case "ddl": {
|
|
104
|
+
const indexer = await loadIndexer(entry);
|
|
105
|
+
console.log(schemaDdl(indexer.schema, indexer.config.database.database).join(";\n\n") + ";");
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
case "reindex": {
|
|
109
|
+
if (!values.chain)
|
|
110
|
+
fail("--chain is required");
|
|
111
|
+
const indexer = await loadIndexer(entry);
|
|
112
|
+
const rows = await indexer.reindex({
|
|
113
|
+
chain: values.chain,
|
|
114
|
+
fromBlock: optionalNumber(values.from),
|
|
115
|
+
toBlock: optionalNumber(values.to),
|
|
116
|
+
scope: values.scope,
|
|
117
|
+
value: values.value,
|
|
118
|
+
});
|
|
119
|
+
console.log(`queued ${rows.length} job(s): ${rows.map((r) => r.id).join(", ")}. A running indexer picks them up within 10s.`);
|
|
120
|
+
await indexer.stop();
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
case "record": {
|
|
124
|
+
if (!values.chain || !values.from || !values.to || !values.out)
|
|
125
|
+
fail("--chain, --from, --to and --out are required");
|
|
126
|
+
const indexer = await loadIndexer(entry);
|
|
127
|
+
await indexer.init();
|
|
128
|
+
const plan = indexer.internals.plans.get(values.chain);
|
|
129
|
+
if (!plan)
|
|
130
|
+
fail(`unknown chain ${values.chain}`);
|
|
131
|
+
const registry = indexer.internals.registry;
|
|
132
|
+
const from = Number(values.from);
|
|
133
|
+
const to = Number(values.to);
|
|
134
|
+
const source = plan.config.source;
|
|
135
|
+
let fixture;
|
|
136
|
+
if (plan.kind === "evm") {
|
|
137
|
+
fixture = await recordEvmFixture(source, buildEvmQuery(plan, from, to, registry), { name: values.chain, chainId: Number(plan.config.id) });
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
fixture = await recordBitcoinFixture(source, buildBitcoinQuery(plan, from, to, registry), { name: values.chain });
|
|
141
|
+
}
|
|
142
|
+
writeFixture(resolve(values.out), fixture);
|
|
143
|
+
console.log(`wrote ${values.out}`);
|
|
144
|
+
await indexer.stop();
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
default:
|
|
148
|
+
fail(`unknown command "${command}"\n\n${HELP}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
async function loadIndexer(entry = "src/index.ts") {
|
|
152
|
+
const path = resolve(process.cwd(), entry);
|
|
153
|
+
if (!existsSync(path))
|
|
154
|
+
fail(`entry not found: ${path}`);
|
|
155
|
+
const { tsImport } = await import("tsx/esm/api");
|
|
156
|
+
const mod = await tsImport(pathToFileURL(path).href, import.meta.url);
|
|
157
|
+
const indexer = mod.default ?? mod.indexer;
|
|
158
|
+
if (!indexer || typeof indexer.on !== "function")
|
|
159
|
+
fail(`${entry} must export the indexer as default export or \`indexer\``);
|
|
160
|
+
return indexer;
|
|
161
|
+
}
|
|
162
|
+
function devLoop(entry) {
|
|
163
|
+
let child;
|
|
164
|
+
let timer;
|
|
165
|
+
const startChild = () => {
|
|
166
|
+
const args = [process.argv[1], "start"];
|
|
167
|
+
if (entry)
|
|
168
|
+
args.push(entry);
|
|
169
|
+
child = spawn(process.execPath, args, { stdio: "inherit", env: { ...process.env, NODE_ENV: process.env.NODE_ENV ?? "development" } });
|
|
170
|
+
child.on("exit", (code) => {
|
|
171
|
+
if (code !== null && code !== 0)
|
|
172
|
+
console.error(`[yail dev] indexer exited with code ${code}, waiting for changes...`);
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
const restart = () => {
|
|
176
|
+
clearTimeout(timer);
|
|
177
|
+
timer = setTimeout(() => {
|
|
178
|
+
console.log("[yail dev] change detected, restarting");
|
|
179
|
+
if (child && child.exitCode === null) {
|
|
180
|
+
child.once("exit", startChild);
|
|
181
|
+
child.kill("SIGTERM");
|
|
182
|
+
}
|
|
183
|
+
else
|
|
184
|
+
startChild();
|
|
185
|
+
}, 300);
|
|
186
|
+
};
|
|
187
|
+
const dirs = [resolve(process.cwd(), "src")].filter(existsSync);
|
|
188
|
+
for (const d of dirs)
|
|
189
|
+
watch(d, { recursive: true }, restart);
|
|
190
|
+
for (const f of ["yail.config.ts", "yail.config.js"])
|
|
191
|
+
if (existsSync(f))
|
|
192
|
+
watch(f, restart);
|
|
193
|
+
startChild();
|
|
194
|
+
}
|
|
195
|
+
function fail(msg) {
|
|
196
|
+
console.error(msg);
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
function optionalNumber(value) {
|
|
200
|
+
if (value === undefined)
|
|
201
|
+
return undefined;
|
|
202
|
+
return Number(value);
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { AbiEvent } from "viem";
|
|
2
|
+
/** Reference to a dynamic address set, persisted in ClickHouse and extensible at runtime. */
|
|
3
|
+
export interface AddressSetRef {
|
|
4
|
+
readonly __brand: "yail.addressSet";
|
|
5
|
+
readonly set: string;
|
|
6
|
+
}
|
|
7
|
+
/** Ponder-style factory: child addresses discovered from an event of a factory contract. */
|
|
8
|
+
export interface FactoryRef {
|
|
9
|
+
readonly __brand: "yail.factory";
|
|
10
|
+
readonly address: string | string[];
|
|
11
|
+
readonly event: AbiEvent;
|
|
12
|
+
readonly parameter: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Refer to a dynamic address set. Addresses are registered at runtime
|
|
16
|
+
* (`indexer.addresses.register`, `POST /addresses`, `yail addresses add`)
|
|
17
|
+
* and backfilled from the contract's `startBlock` (or a per-address block).
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* contracts: { Erc20: { abi, chain: "base", filter: { event: "Transfer", args: { to: addressSet("wallets") } } } }
|
|
21
|
+
*/
|
|
22
|
+
export declare function addressSet(name: string): AddressSetRef;
|
|
23
|
+
export declare function factory(def: {
|
|
24
|
+
address: string | string[];
|
|
25
|
+
event: AbiEvent;
|
|
26
|
+
parameter: string;
|
|
27
|
+
}): FactoryRef;
|
|
28
|
+
export declare function isAddressSet(v: unknown): v is AddressSetRef;
|
|
29
|
+
export declare function isFactory(v: unknown): v is FactoryRef;
|
|
30
|
+
/** Internal set name that stores discovered factory children for a contract/chain. */
|
|
31
|
+
export declare function factorySetName(contract: string): string;
|
|
32
|
+
//# sourceMappingURL=address.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../src/config/address.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErC,6FAA6F;AAC7F,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,4FAA4F;AAC5F,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAGtD;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE;IAAE,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAM3G;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,aAAa,CAE3D;AACD,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,CAErD;AAED,sFAAsF;AACtF,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvD"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refer to a dynamic address set. Addresses are registered at runtime
|
|
3
|
+
* (`indexer.addresses.register`, `POST /addresses`, `yail addresses add`)
|
|
4
|
+
* and backfilled from the contract's `startBlock` (or a per-address block).
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* contracts: { Erc20: { abi, chain: "base", filter: { event: "Transfer", args: { to: addressSet("wallets") } } } }
|
|
8
|
+
*/
|
|
9
|
+
export function addressSet(name) {
|
|
10
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(name))
|
|
11
|
+
throw new Error(`Invalid address set name "${name}"`);
|
|
12
|
+
return { __brand: "yail.addressSet", set: name };
|
|
13
|
+
}
|
|
14
|
+
export function factory(def) {
|
|
15
|
+
const names = def.event.inputs.map((i) => i.name);
|
|
16
|
+
if (!names.includes(def.parameter)) {
|
|
17
|
+
throw new Error(`factory(): event ${def.event.name} has no parameter "${def.parameter}" (has ${names.join(", ")})`);
|
|
18
|
+
}
|
|
19
|
+
return { __brand: "yail.factory", address: def.address, event: def.event, parameter: def.parameter };
|
|
20
|
+
}
|
|
21
|
+
export function isAddressSet(v) {
|
|
22
|
+
return typeof v === "object" && v !== null && v.__brand === "yail.addressSet";
|
|
23
|
+
}
|
|
24
|
+
export function isFactory(v) {
|
|
25
|
+
return typeof v === "object" && v !== null && v.__brand === "yail.factory";
|
|
26
|
+
}
|
|
27
|
+
/** Internal set name that stores discovered factory children for a contract/chain. */
|
|
28
|
+
export function factorySetName(contract) {
|
|
29
|
+
return `__factory:${contract}`;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"address.js","sourceRoot":"","sources":["../../src/config/address.ts"],"names":[],"mappings":"AAgBA;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,IAAI,GAAG,CAAC,CAAC;IAC1F,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,GAAuE;IAC7F,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,oBAAoB,GAAG,CAAC,KAAK,CAAC,IAAI,sBAAsB,GAAG,CAAC,SAAS,UAAU,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAAmB,CAAC,OAAO,KAAK,iBAAiB,CAAC;AACnG,CAAC;AACD,MAAM,UAAU,SAAS,CAAC,CAAU;IAClC,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAK,CAAgB,CAAC,OAAO,KAAK,cAAc,CAAC;AAC7F,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,OAAO,aAAa,QAAQ,EAAE,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Chain names referenced by a `chain` field: a single name or a per-chain override map. */
|
|
2
|
+
export declare function chainNames(ref: string | Readonly<Record<string, unknown>>): string[];
|
|
3
|
+
/** Per-chain overrides for a `chain` field; a single name maps to an empty override. */
|
|
4
|
+
export declare function perChain<T>(ref: string | Readonly<Record<string, T>>): Record<string, Partial<T>>;
|
|
5
|
+
//# sourceMappingURL=chain-ref.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-ref.d.ts","sourceRoot":"","sources":["../../src/config/chain-ref.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,EAAE,CAGpF;AAED,wFAAwF;AACxF,wBAAgB,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAGjG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Chain names referenced by a `chain` field: a single name or a per-chain override map. */
|
|
2
|
+
export function chainNames(ref) {
|
|
3
|
+
if (typeof ref === "string")
|
|
4
|
+
return [ref];
|
|
5
|
+
return Object.keys(ref);
|
|
6
|
+
}
|
|
7
|
+
/** Per-chain overrides for a `chain` field; a single name maps to an empty override. */
|
|
8
|
+
export function perChain(ref) {
|
|
9
|
+
if (typeof ref === "string")
|
|
10
|
+
return { [ref]: {} };
|
|
11
|
+
return { ...ref };
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=chain-ref.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chain-ref.js","sourceRoot":"","sources":["../../src/config/chain-ref.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,MAAM,UAAU,UAAU,CAAC,GAA+C;IACxE,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1C,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,QAAQ,CAAI,GAAyC;IACnE,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC;IAClD,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AccountConfig, ChainConfig, Config, ContractConfig } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Define the indexer configuration. Returns the object unchanged; the
|
|
4
|
+
* generics preserve literal types so `indexer.on("Contract:Event")` and
|
|
5
|
+
* `event.args` are fully typed.
|
|
6
|
+
*/
|
|
7
|
+
export declare function createConfig<const chains extends Record<string, ChainConfig>, const contracts extends Record<string, ContractConfig<any>> = {}, const accounts extends Record<string, AccountConfig> = {}>(config: Config<chains, contracts, accounts>): Config<chains, contracts, accounts>;
|
|
8
|
+
export declare function validateConfig(config: Config<any, any, any>): void;
|
|
9
|
+
//# sourceMappingURL=create-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-config.d.ts","sourceRoot":"","sources":["../../src/config/create-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAKrF;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,KAAK,CAAC,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EAChD,KAAK,CAAC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAChE,KAAK,CAAC,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,GAAG,EAAE,EACzD,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAGlF;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,IAAI,CAoDlE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { isAddressSet, isFactory } from "./address.js";
|
|
2
|
+
import { chainNames } from "./chain-ref.js";
|
|
3
|
+
import { toArray } from "../util.js";
|
|
4
|
+
/**
|
|
5
|
+
* Define the indexer configuration. Returns the object unchanged; the
|
|
6
|
+
* generics preserve literal types so `indexer.on("Contract:Event")` and
|
|
7
|
+
* `event.args` are fully typed.
|
|
8
|
+
*/
|
|
9
|
+
export function createConfig(config) {
|
|
10
|
+
validateConfig(config);
|
|
11
|
+
return config;
|
|
12
|
+
}
|
|
13
|
+
export function validateConfig(config) {
|
|
14
|
+
if (!config.database?.url)
|
|
15
|
+
throw new Error("config.database.url is required");
|
|
16
|
+
const configuredChains = Object.keys(config.chains ?? {});
|
|
17
|
+
if (configuredChains.length === 0)
|
|
18
|
+
throw new Error("config.chains must define at least one chain");
|
|
19
|
+
for (const [name, chain] of Object.entries(config.chains)) {
|
|
20
|
+
if (!chain.source)
|
|
21
|
+
throw new Error(`chain "${name}": source is required`);
|
|
22
|
+
if (chain.id === undefined)
|
|
23
|
+
throw new Error(`chain "${name}": id is required`);
|
|
24
|
+
}
|
|
25
|
+
const sets = new Set(Object.keys(config.addressSets ?? {}));
|
|
26
|
+
const checkChainRef = (owner, ref) => {
|
|
27
|
+
for (const n of chainNames(ref))
|
|
28
|
+
if (!config.chains[n])
|
|
29
|
+
throw new Error(`${owner}: unknown chain "${n}"`);
|
|
30
|
+
};
|
|
31
|
+
const checkAddress = (owner, spec) => {
|
|
32
|
+
if (spec === undefined)
|
|
33
|
+
return;
|
|
34
|
+
if (isAddressSet(spec)) {
|
|
35
|
+
sets.add(spec.set);
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
if (isFactory(spec))
|
|
39
|
+
return;
|
|
40
|
+
for (const a of toArray(spec)) {
|
|
41
|
+
if (typeof a !== "string" || !/^0x[0-9a-fA-F]{40}$/.test(a))
|
|
42
|
+
throw new Error(`${owner}: invalid EVM address "${String(a)}"`);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
for (const [name, c] of Object.entries((config.contracts ?? {}))) {
|
|
46
|
+
if (!c.abi)
|
|
47
|
+
throw new Error(`contract "${name}": abi is required`);
|
|
48
|
+
checkChainRef(`contract "${name}"`, c.chain);
|
|
49
|
+
checkAddress(`contract "${name}"`, c.address);
|
|
50
|
+
if (typeof c.chain !== "string")
|
|
51
|
+
for (const [cn, o] of Object.entries(c.chain))
|
|
52
|
+
checkAddress(`contract "${name}" on ${cn}`, o.address);
|
|
53
|
+
const filters = toArray(c.filter ?? []);
|
|
54
|
+
for (const f of filters) {
|
|
55
|
+
const ev = c.abi.find((x) => x.type === "event" && x.name === f.event);
|
|
56
|
+
if (!ev)
|
|
57
|
+
throw new Error(`contract "${name}": filter references unknown event "${f.event}"`);
|
|
58
|
+
for (const arg of Object.keys(f.args ?? {})) {
|
|
59
|
+
const input = ev.inputs.find((i) => i.name === arg);
|
|
60
|
+
if (!input)
|
|
61
|
+
throw new Error(`contract "${name}": filter for ${f.event} references unknown argument "${arg}"`);
|
|
62
|
+
if (!input.indexed)
|
|
63
|
+
throw new Error(`contract "${name}": filter argument "${arg}" of ${f.event} must be indexed`);
|
|
64
|
+
const v = f.args[arg];
|
|
65
|
+
if (isAddressSet(v))
|
|
66
|
+
sets.add(v.set);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
for (const [name, a] of Object.entries((config.accounts ?? {}))) {
|
|
71
|
+
checkChainRef(`account "${name}"`, a.chain);
|
|
72
|
+
if (a.address === undefined)
|
|
73
|
+
throw new Error(`account "${name}": address is required`);
|
|
74
|
+
if (isFactory(a.address))
|
|
75
|
+
throw new Error(`account "${name}": factory() is not supported for accounts`);
|
|
76
|
+
if (!isAddressSet(a.address)) {
|
|
77
|
+
const evm = chainNames(a.chain).every((cn) => config.chains[cn].source.kind === "evm");
|
|
78
|
+
if (evm)
|
|
79
|
+
checkAddress(`account "${name}"`, a.address);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
config.addressSets = { ...(config.addressSets ?? {}) };
|
|
83
|
+
for (const s of sets)
|
|
84
|
+
config.addressSets[s] ??= {};
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=create-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-config.js","sourceRoot":"","sources":["../../src/config/create-config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { createConfig, validateConfig } from "./create-config.js";
|
|
2
|
+
export { addressSet, factory, isAddressSet, isFactory, factorySetName } from "./address.js";
|
|
3
|
+
export type { AddressSetRef, FactoryRef } from "./address.js";
|
|
4
|
+
export type * from "./types.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC5F,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC9D,mBAAmB,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import type { Abi } from "viem";
|
|
2
|
+
import type { DatabaseConfig } from "../db/client.js";
|
|
3
|
+
import type { Source } from "../sources/types.js";
|
|
4
|
+
import type { AddressSetRef, FactoryRef } from "./address.js";
|
|
5
|
+
export type AddressSpec = string | readonly string[] | AddressSetRef | FactoryRef;
|
|
6
|
+
export interface ChainConfig<S extends Source = Source> {
|
|
7
|
+
/** Chain id (EVM) or a string id such as "bitcoin". */
|
|
8
|
+
id: number | string;
|
|
9
|
+
/** Data source: `hypersync()`, `rpc()`, `esplora()`, or any of them wrapped in `cached()`. */
|
|
10
|
+
source: S;
|
|
11
|
+
/** Optional JSON-RPC URL, enables `context.client.readContract` (EVM only). */
|
|
12
|
+
rpc?: string;
|
|
13
|
+
/** Blocks behind the source head treated as final. Default: 20 (EVM), 3 (Bitcoin). */
|
|
14
|
+
finality?: number;
|
|
15
|
+
/** Poll interval in ms once caught up. Default: 2000 (EVM), 30000 (Bitcoin). */
|
|
16
|
+
pollInterval?: number;
|
|
17
|
+
/** Max blocks per planned query. Default: 100000 (HyperSync), 2000 (RPC), 50000 (Bitcoin). */
|
|
18
|
+
maxBlockRange?: number;
|
|
19
|
+
}
|
|
20
|
+
export type BlockRef = number | "latest";
|
|
21
|
+
export interface EventFilterArgs {
|
|
22
|
+
[param: string]: string | number | bigint | boolean | ReadonlyArray<string | number | bigint | boolean> | AddressSetRef;
|
|
23
|
+
}
|
|
24
|
+
export interface EventFilter<eventName extends string = string> {
|
|
25
|
+
event: eventName;
|
|
26
|
+
args: EventFilterArgs;
|
|
27
|
+
}
|
|
28
|
+
export interface ChainScopedContract {
|
|
29
|
+
address?: AddressSpec;
|
|
30
|
+
startBlock?: BlockRef;
|
|
31
|
+
endBlock?: number;
|
|
32
|
+
filter?: EventFilter | readonly EventFilter[];
|
|
33
|
+
}
|
|
34
|
+
export interface ContractConfig<abi extends Abi = Abi> {
|
|
35
|
+
abi: abi;
|
|
36
|
+
/** Chain name, or a per-chain map of overrides (Ponder style). */
|
|
37
|
+
chain: string | Readonly<Record<string, ChainScopedContract>>;
|
|
38
|
+
/** Static address(es), an `addressSet()`, or a `factory()`. Omit to match every contract. */
|
|
39
|
+
address?: AddressSpec;
|
|
40
|
+
startBlock?: BlockRef;
|
|
41
|
+
endBlock?: number;
|
|
42
|
+
/** Only index logs matching these indexed-argument filters (OR between filters). Values may be `addressSet()` refs. */
|
|
43
|
+
filter?: EventFilter | readonly EventFilter[];
|
|
44
|
+
/** Attach `event.transaction` to every event (extra data from the source). Default false. */
|
|
45
|
+
includeTransactions?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export interface ChainScopedAccount {
|
|
48
|
+
address?: AddressSpec;
|
|
49
|
+
startBlock?: BlockRef;
|
|
50
|
+
endBlock?: number;
|
|
51
|
+
}
|
|
52
|
+
/** Index transactions sent from/to a set of addresses (EVM native transfers, Bitcoin UTXO movements). */
|
|
53
|
+
export interface AccountConfig {
|
|
54
|
+
chain: string | Readonly<Record<string, ChainScopedAccount>>;
|
|
55
|
+
address: AddressSpec;
|
|
56
|
+
startBlock?: BlockRef;
|
|
57
|
+
endBlock?: number;
|
|
58
|
+
}
|
|
59
|
+
export interface AddressSetConfig {
|
|
60
|
+
/** Addresses to seed the set with (registered on first start, per chain that uses the set). */
|
|
61
|
+
initial?: ReadonlyArray<string | {
|
|
62
|
+
address: string;
|
|
63
|
+
chain?: string;
|
|
64
|
+
fromBlock?: number;
|
|
65
|
+
}>;
|
|
66
|
+
}
|
|
67
|
+
export interface CacheConfig {
|
|
68
|
+
/** Cache raw source batches in ClickHouse (`_yail_source_cache`). Same effect as wrapping sources in `cached()`. */
|
|
69
|
+
source?: boolean;
|
|
70
|
+
/** Persist `context.http` responses in ClickHouse. Default true. */
|
|
71
|
+
http?: boolean;
|
|
72
|
+
/** Persist `context.client.readContract` results in ClickHouse. Default true. */
|
|
73
|
+
rpc?: boolean;
|
|
74
|
+
}
|
|
75
|
+
export interface ObservabilityConfig {
|
|
76
|
+
/** Service name for logs/metrics/traces. Default: "yail". */
|
|
77
|
+
serviceName?: string;
|
|
78
|
+
/** OTLP HTTP endpoint (base URL). Falls back to OTEL_EXPORTER_OTLP_ENDPOINT / OTLP_ENDPOINT. */
|
|
79
|
+
otlpEndpoint?: string;
|
|
80
|
+
otlpHeaders?: Record<string, string>;
|
|
81
|
+
/** Pretty console output. Default: true outside production. */
|
|
82
|
+
pretty?: boolean;
|
|
83
|
+
logLevel?: "debug" | "info" | "warn" | "error";
|
|
84
|
+
/** Also store wide events in ClickHouse table `_yail_logs` (queryable observability with zero extra infra). Default false. */
|
|
85
|
+
logsToClickHouse?: boolean;
|
|
86
|
+
/** Emit one wide event per source batch. Default true. */
|
|
87
|
+
batchEvents?: boolean;
|
|
88
|
+
}
|
|
89
|
+
export interface ServerConfig {
|
|
90
|
+
/** Port for the status/admin HTTP API. Default 42069. `false` disables the server. */
|
|
91
|
+
port?: number | false;
|
|
92
|
+
hostname?: string;
|
|
93
|
+
}
|
|
94
|
+
export interface IndexingConfig {
|
|
95
|
+
/** Flush buffered rows when this many are pending, even mid-batch. Default 50000. */
|
|
96
|
+
flushMaxRows?: number;
|
|
97
|
+
/** How many address-backfill / reindex jobs run concurrently per chain. Default 2. */
|
|
98
|
+
jobConcurrency?: number;
|
|
99
|
+
/** Max addresses per source filter chunk. Default 500. */
|
|
100
|
+
addressChunk?: number;
|
|
101
|
+
}
|
|
102
|
+
export interface Config<chains extends Record<string, ChainConfig> = Record<string, ChainConfig>, contracts extends Record<string, ContractConfig<any>> = Record<string, ContractConfig<any>>, accounts extends Record<string, AccountConfig> = Record<string, AccountConfig>> {
|
|
103
|
+
database: DatabaseConfig;
|
|
104
|
+
chains: chains;
|
|
105
|
+
contracts?: contracts;
|
|
106
|
+
accounts?: accounts;
|
|
107
|
+
addressSets?: Record<string, AddressSetConfig>;
|
|
108
|
+
cache?: CacheConfig;
|
|
109
|
+
observability?: ObservabilityConfig;
|
|
110
|
+
server?: ServerConfig;
|
|
111
|
+
indexing?: IndexingConfig;
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { InferRow, InsertRow, Table } from "../schema/table.js";
|
|
2
|
+
import type { Db } from "./client.js";
|
|
3
|
+
import { type RowMeta } from "./serialize.js";
|
|
4
|
+
/**
|
|
5
|
+
* Buffers rows per table and flushes them in one INSERT per table.
|
|
6
|
+
* ClickHouse wants few, large inserts; handlers want to write row-by-row.
|
|
7
|
+
* The indexer flushes after every source batch, before writing the checkpoint.
|
|
8
|
+
*/
|
|
9
|
+
export declare class BatchWriter {
|
|
10
|
+
private readonly db;
|
|
11
|
+
private readonly options;
|
|
12
|
+
private pending;
|
|
13
|
+
private rowCount;
|
|
14
|
+
constructor(db: Db, options?: {
|
|
15
|
+
maxRows?: number;
|
|
16
|
+
onFlush?: (stats: {
|
|
17
|
+
table: string;
|
|
18
|
+
rows: number;
|
|
19
|
+
ms: number;
|
|
20
|
+
}) => void;
|
|
21
|
+
});
|
|
22
|
+
get size(): number;
|
|
23
|
+
add<T extends Table<any>>(table: T, row: InsertRow<T>, meta?: RowMeta): void;
|
|
24
|
+
/** Latest buffered logical row matching the full ORDER BY key, if any. */
|
|
25
|
+
peek<T extends Table<any>>(table: T, key: Partial<InferRow<T>>): InferRow<T> | null;
|
|
26
|
+
flush(): Promise<{
|
|
27
|
+
tables: number;
|
|
28
|
+
rows: number;
|
|
29
|
+
}>;
|
|
30
|
+
shouldFlush(): boolean;
|
|
31
|
+
discard(): void;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=batch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch.d.ts","sourceRoot":"","sources":["../../src/db/batch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAgB,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAS5D;;;;GAIG;AACH,qBAAa,WAAW;IAKpB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAL1B,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,QAAQ,CAAK;IAErB,YACmB,EAAE,EAAE,EAAE,EACN,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,KAAK,IAAI,CAAA;KAAO,EACzH;IAEJ,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,IAAI,CAS3E;IAED,0EAA0E;IAC1E,IAAI,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,IAAI,CAMlF;IAEK,KAAK,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAWvD;IAED,WAAW,IAAI,OAAO,CAErB;IAED,OAAO,IAAI,IAAI,CAGd;CACF"}
|