@artblocks/abx-sdk 0.1.0-alpha.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.
Files changed (86) hide show
  1. package/LICENSE +21 -0
  2. package/dist/abi/generated.d.ts +6185 -0
  3. package/dist/abi/generated.d.ts.map +1 -0
  4. package/dist/abi/generated.js +28 -0
  5. package/dist/abi/generated.js.map +1 -0
  6. package/dist/abi/index.d.ts +3227 -0
  7. package/dist/abi/index.d.ts.map +1 -0
  8. package/dist/abi/index.js +38 -0
  9. package/dist/abi/index.js.map +1 -0
  10. package/dist/chains.d.ts +27 -0
  11. package/dist/chains.d.ts.map +1 -0
  12. package/dist/chains.js +71 -0
  13. package/dist/chains.js.map +1 -0
  14. package/dist/chunks.d.ts +168 -0
  15. package/dist/chunks.d.ts.map +1 -0
  16. package/dist/chunks.js +232 -0
  17. package/dist/chunks.js.map +1 -0
  18. package/dist/clients.d.ts +42 -0
  19. package/dist/clients.d.ts.map +1 -0
  20. package/dist/clients.js +90 -0
  21. package/dist/clients.js.map +1 -0
  22. package/dist/create2.d.ts +42 -0
  23. package/dist/create2.d.ts.map +1 -0
  24. package/dist/create2.js +47 -0
  25. package/dist/create2.js.map +1 -0
  26. package/dist/deploy.d.ts +192 -0
  27. package/dist/deploy.d.ts.map +1 -0
  28. package/dist/deploy.js +231 -0
  29. package/dist/deploy.js.map +1 -0
  30. package/dist/deployments.d.ts +60 -0
  31. package/dist/deployments.d.ts.map +1 -0
  32. package/dist/deployments.js +81 -0
  33. package/dist/deployments.js.map +1 -0
  34. package/dist/deps.d.ts +109 -0
  35. package/dist/deps.d.ts.map +1 -0
  36. package/dist/deps.js +103 -0
  37. package/dist/deps.js.map +1 -0
  38. package/dist/env.d.ts +2 -0
  39. package/dist/env.d.ts.map +1 -0
  40. package/dist/env.js +45 -0
  41. package/dist/env.js.map +1 -0
  42. package/dist/fastlz.d.ts +20 -0
  43. package/dist/fastlz.d.ts.map +1 -0
  44. package/dist/fastlz.js +123 -0
  45. package/dist/fastlz.js.map +1 -0
  46. package/dist/generator.d.ts +129 -0
  47. package/dist/generator.d.ts.map +1 -0
  48. package/dist/generator.js +81 -0
  49. package/dist/generator.js.map +1 -0
  50. package/dist/index.d.ts +31 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +20 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/ops.d.ts +379 -0
  55. package/dist/ops.d.ts.map +1 -0
  56. package/dist/ops.js +811 -0
  57. package/dist/ops.js.map +1 -0
  58. package/dist/probe.d.ts +30 -0
  59. package/dist/probe.d.ts.map +1 -0
  60. package/dist/probe.js +74 -0
  61. package/dist/probe.js.map +1 -0
  62. package/dist/reconstruct.d.ts +97 -0
  63. package/dist/reconstruct.d.ts.map +1 -0
  64. package/dist/reconstruct.js +597 -0
  65. package/dist/reconstruct.js.map +1 -0
  66. package/dist/spine.d.ts +110 -0
  67. package/dist/spine.d.ts.map +1 -0
  68. package/dist/spine.js +0 -0
  69. package/dist/spine.js.map +1 -0
  70. package/dist/token.d.ts +33 -0
  71. package/dist/token.d.ts.map +1 -0
  72. package/dist/token.js +66 -0
  73. package/dist/token.js.map +1 -0
  74. package/dist/tokendata.d.ts +50 -0
  75. package/dist/tokendata.d.ts.map +1 -0
  76. package/dist/tokendata.js +178 -0
  77. package/dist/tokendata.js.map +1 -0
  78. package/dist/traits.d.ts +38 -0
  79. package/dist/traits.d.ts.map +1 -0
  80. package/dist/traits.js +92 -0
  81. package/dist/traits.js.map +1 -0
  82. package/dist/types.d.ts +145 -0
  83. package/dist/types.d.ts.map +1 -0
  84. package/dist/types.js +2 -0
  85. package/dist/types.js.map +1 -0
  86. package/package.json +53 -0
@@ -0,0 +1,597 @@
1
+ import { concat as concatHex, keccak256, parseEventLogs, } from 'viem';
2
+ import { oneOfOneImageAbi, oneOfOneImageFactoryAbi, seriesCodeAbi, spineEventAbi } from './abi/index.js';
3
+ import { AUTH_OPTIONS, decodeTag, DELEGATE_REGISTRY_DEFAULT, extensionName, EXTENSION_ID, PARAM_TYPES, SPINE_EVENT_DOC, } from './spine.js';
4
+ /**
5
+ * Rebuild a project's full state from the chain alone — the canonical replay.
6
+ *
7
+ * Structure comes from folding the event spine (idempotent, last-writer-wins);
8
+ * string *values* the events only ping (tokenURI, contractURI, name/symbol) are
9
+ * read at head — exactly the spine's design. No provider is involved, and the
10
+ * result is byte-for-byte reproducible from the same chain range. This is the
11
+ * durability proof: delete the projection, run this, get identical state.
12
+ */
13
+ export async function reconstructProject(client, opts) {
14
+ const { address, fromBlock, factory } = opts;
15
+ const toBlockNum = opts.toBlock === 'latest' || opts.toBlock === undefined ? await client.getBlockNumber() : opts.toBlock;
16
+ const rawLogs = await getLogsAdaptive(client, address, fromBlock, toBlockNum);
17
+ const events = decodedToSpineEvents(parseEventLogs({ abi: spineEventAbi, logs: rawLogs })).sort(byOrder);
18
+ return assembleState(client, address, events, foldSpine(events), fromBlock, toBlockNum, factory);
19
+ }
20
+ /**
21
+ * The same state, but resumed from a prior reconstruction's checkpoint — so a
22
+ * re-index only fetches the blocks added since (a wide head gap costs nothing),
23
+ * yet the result is identical to a full replay. We fetch strictly `prior.toBlock + 1`
24
+ * onward (no reorg lookback — post-PoS reorgs are rare enough that the repair is the
25
+ * deterministic full replay: `abx index <addr> --full`), merge + de-dup with the prior
26
+ * event log, re-fold the complete sorted spine in-memory, and re-read head values fresh.
27
+ * Folding the whole history each time is microseconds; not re-fetching it is the win.
28
+ */
29
+ export async function reconstructIncremental(client, prior, opts = {}) {
30
+ const address = prior.address;
31
+ const factory = opts.factory ?? prior.factory ?? undefined;
32
+ const head = await client.getBlockNumber();
33
+ const priorTo = BigInt(prior.toBlock);
34
+ const origin = BigInt(prior.deployBlock ?? prior.fromBlock);
35
+ const resumeFrom = priorTo + 1n > origin ? priorTo + 1n : origin;
36
+ let fresh = [];
37
+ if (head >= resumeFrom) {
38
+ const rawLogs = await getLogsAdaptive(client, address, resumeFrom, head);
39
+ fresh = decodedToSpineEvents(parseEventLogs({ abi: spineEventAbi, logs: rawLogs }));
40
+ }
41
+ // Merge the prior log with the freshly-fetched tail, de-duping by position so an
42
+ // overlapping/duplicate re-run can't double-count, then fold the complete spine.
43
+ const seen = new Set();
44
+ const all = [];
45
+ for (const ev of [...prior.events, ...fresh]) {
46
+ const key = `${ev.blockNumber}:${ev.logIndex}:${ev.txHash}`;
47
+ if (seen.has(key))
48
+ continue;
49
+ seen.add(key);
50
+ all.push(ev);
51
+ }
52
+ all.sort(byOrder);
53
+ const toBlock = head >= priorTo ? head : priorTo;
54
+ return assembleState(client, address, all, foldSpine(all), BigInt(prior.fromBlock), toBlock, factory);
55
+ }
56
+ /** Turn decoded viem logs into the canonical, serializable {@link SpineEvent} list. */
57
+ function decodedToSpineEvents(decoded) {
58
+ return decoded.map((log) => {
59
+ const name = log.eventName ?? 'Unknown';
60
+ const args = (log.args ?? {});
61
+ const doc = SPINE_EVENT_DOC[name] ?? { register: 2, what: '' };
62
+ return {
63
+ name,
64
+ register: doc.register,
65
+ what: doc.what,
66
+ blockNumber: (log.blockNumber ?? 0n).toString(),
67
+ logIndex: log.logIndex ?? 0,
68
+ txHash: (log.transactionHash ?? '0x'),
69
+ args: stringifyArgs(args),
70
+ };
71
+ });
72
+ }
73
+ function tokenIn(tokens, id) {
74
+ let t = tokens.get(id);
75
+ if (!t) {
76
+ t = { tokenId: id, minted: false, owner: null, tokenURI: null, fields: [], lockedFields: [] };
77
+ tokens.set(id, t);
78
+ }
79
+ return t;
80
+ }
81
+ const isZeroAddr = (v) => {
82
+ try {
83
+ return BigInt(v ?? '0') === 0n;
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ };
89
+ /**
90
+ * Fold an *ordered* spine into structure. Operates on {@link SpineEvent} (string
91
+ * args) so full and incremental use one implementation, and a stored event log
92
+ * re-folds identically. Idempotent + last-writer-wins, so re-folding the same
93
+ * events (e.g. the reorg overlap) yields the same result.
94
+ */
95
+ export function foldSpine(events) {
96
+ const fold = {
97
+ abxVersion: null,
98
+ deployBlock: null,
99
+ deployTx: null,
100
+ owner: null,
101
+ royalty: null,
102
+ extById: new Map(),
103
+ tokens: new Map(),
104
+ tokenFields: new Map(),
105
+ tokenLocked: new Map(),
106
+ collectionFields: new Map(),
107
+ collectionLocked: new Set(),
108
+ maxInvocations: null,
109
+ minter: null,
110
+ paused: false,
111
+ primaryPayee: null,
112
+ tokenParams: new Map(),
113
+ contractParams: new Map(),
114
+ paramSchemas: new Map(),
115
+ paramHooks: null,
116
+ delegateRegistry: undefined,
117
+ seedSource: null,
118
+ scriptLocked: false,
119
+ dependencies: [],
120
+ dependencyRegistry: null,
121
+ dependenciesLocked: false,
122
+ };
123
+ for (const ev of events) {
124
+ const a = ev.args;
125
+ switch (ev.name) {
126
+ case 'AbxDeployed': {
127
+ if (fold.deployBlock === null) {
128
+ fold.abxVersion = Number(a.abxVersion ?? 0);
129
+ fold.deployBlock = ev.blockNumber;
130
+ fold.deployTx = ev.txHash;
131
+ }
132
+ break;
133
+ }
134
+ case 'AbxExtensionVersionSet': {
135
+ const id = (a.extensionId ?? '0x');
136
+ fold.extById.set(id.toLowerCase(), { id, name: extensionName(id), version: Number(a.version ?? 0) });
137
+ break;
138
+ }
139
+ case 'RoyaltyChangedForAll': {
140
+ const receiver = a.account;
141
+ const bps = Number(a.basisPoints ?? 0);
142
+ fold.royalty = isZeroAddr(receiver) && bps === 0 ? null : { receiver, bps };
143
+ break;
144
+ }
145
+ case 'OwnershipTransferred':
146
+ fold.owner = a.newOwner;
147
+ break;
148
+ case 'Transfer': {
149
+ const t = tokenIn(fold.tokens, String(a.tokenId ?? a.id ?? '0'));
150
+ t.owner = a.to;
151
+ if (isZeroAddr(a.from))
152
+ t.minted = true; // mint signal
153
+ break;
154
+ }
155
+ case 'TokenFieldSet': {
156
+ const id = String(a.tokenId ?? '0');
157
+ const field = decodeTag((a.field ?? '0x'));
158
+ const representation = decodeTag((a.representation ?? '0x'));
159
+ let m = fold.tokenFields.get(id);
160
+ if (!m)
161
+ fold.tokenFields.set(id, (m = new Map()));
162
+ m.set(field, { field, representation, value: (a.value ?? '0x') }); // one active rep per field — last wins
163
+ break;
164
+ }
165
+ case 'TokenFieldLocked': {
166
+ const id = String(a.tokenId ?? '0');
167
+ let s = fold.tokenLocked.get(id);
168
+ if (!s)
169
+ fold.tokenLocked.set(id, (s = new Set()));
170
+ s.add(decodeTag((a.field ?? '0x')));
171
+ break;
172
+ }
173
+ case 'ContractFieldSet': {
174
+ const field = decodeTag((a.field ?? '0x'));
175
+ const representation = decodeTag((a.representation ?? '0x'));
176
+ fold.collectionFields.set(field, { field, representation, value: (a.value ?? '0x') }); // last wins
177
+ break;
178
+ }
179
+ case 'ContractFieldLocked':
180
+ fold.collectionLocked.add(decodeTag((a.field ?? '0x')));
181
+ break;
182
+ case 'MaxInvocationsUpdated':
183
+ fold.maxInvocations = String(a.maxInvocations ?? '0'); // last-writer-wins (monotonic on-chain)
184
+ break;
185
+ case 'MinterSet':
186
+ fold.minter = isZeroAddr(a.minter) ? null : a.minter; // last-writer-wins
187
+ break;
188
+ case 'PausedStatusChanged':
189
+ fold.paused = String(a.paused) === 'true'; // last-writer-wins (absent ⇒ false)
190
+ break;
191
+ case 'PrimaryPayeeChanged':
192
+ fold.primaryPayee = isZeroAddr(a.account) ? null : a.account;
193
+ break;
194
+ case 'TokenParamConfigured': {
195
+ const id = String(a.tokenId ?? '0');
196
+ const key = decodeTag((a.key ?? '0x'));
197
+ let m = fold.tokenParams.get(id);
198
+ if (!m)
199
+ fold.tokenParams.set(id, (m = new Map()));
200
+ m.set(key, {
201
+ key,
202
+ value: (a.value ?? '0x'),
203
+ valueIsHash: String(a.valueIsHash) === 'true',
204
+ updatedBy: a.updatedBy,
205
+ });
206
+ break;
207
+ }
208
+ case 'TokenParamCleared': {
209
+ fold.tokenParams.get(String(a.tokenId ?? '0'))?.delete(decodeTag((a.key ?? '0x')));
210
+ break;
211
+ }
212
+ case 'ContractParamConfigured': {
213
+ const key = decodeTag((a.key ?? '0x'));
214
+ fold.contractParams.set(key, {
215
+ key,
216
+ value: (a.value ?? '0x'),
217
+ valueIsHash: String(a.valueIsHash) === 'true',
218
+ updatedBy: a.updatedBy,
219
+ });
220
+ break;
221
+ }
222
+ case 'ContractParamCleared':
223
+ fold.contractParams.delete(decodeTag((a.key ?? '0x')));
224
+ break;
225
+ case 'ParamSchemaConfigured': {
226
+ const key = decodeTag((a.key ?? '0x'));
227
+ fold.paramSchemas.set(key, {
228
+ key,
229
+ paramType: PARAM_TYPES[Number(a.paramType ?? 0)] ?? String(a.paramType),
230
+ auth: AUTH_OPTIONS[Number(a.auth ?? 0)] ?? String(a.auth),
231
+ authAddress: isZeroAddr(a.authAddress) ? null : a.authAddress,
232
+ lockAfter: String(a.lockAfter ?? '0'),
233
+ min: (a.min ?? '0x'),
234
+ max: (a.max ?? '0x'),
235
+ selectOptions: parseStringArray(a.selectOptions),
236
+ });
237
+ break;
238
+ }
239
+ case 'HooksConfigured': {
240
+ const z = (v) => (isZeroAddr(v) ? null : v);
241
+ fold.paramHooks = {
242
+ configureHook: z(a.configureHook),
243
+ augmentHook: z(a.augmentHook),
244
+ transferHook: z(a.transferHook),
245
+ };
246
+ break;
247
+ }
248
+ case 'DelegateRegistrySet':
249
+ fold.delegateRegistry = isZeroAddr(a.registry) ? null : a.registry;
250
+ break;
251
+ case 'SeedSourceSet':
252
+ fold.seedSource = isZeroAddr(a.seedSource) ? null : a.seedSource;
253
+ break;
254
+ case 'ScriptLocked':
255
+ fold.scriptLocked = true;
256
+ break;
257
+ case 'DependencyUpdated': {
258
+ const idx = Number(a.index ?? 0);
259
+ const raw = (a.ref ?? '0x');
260
+ const onchain = String(a.resolution) === '1';
261
+ const dep = {
262
+ resolution: onchain ? 'onchain' : 'registry',
263
+ ref: raw,
264
+ refDecoded: onchain ? '0x' + raw.slice(2, 42) : decodeTag(raw),
265
+ };
266
+ if (idx === fold.dependencies.length)
267
+ fold.dependencies.push(dep);
268
+ else if (idx < fold.dependencies.length)
269
+ fold.dependencies[idx] = dep;
270
+ break;
271
+ }
272
+ case 'DependencyRemoved':
273
+ fold.dependencies.pop(); // the list stays dense — only the last is removable
274
+ break;
275
+ case 'DependencyRegistrySet':
276
+ fold.dependencyRegistry = isZeroAddr(a.registry) ? null : a.registry;
277
+ break;
278
+ case 'DependenciesLocked':
279
+ fold.dependenciesLocked = true;
280
+ break;
281
+ default:
282
+ break;
283
+ }
284
+ }
285
+ return fold;
286
+ }
287
+ /** Build the full {@link ProjectState} from a fold + provenance, then overlay head reads. */
288
+ async function assembleState(client, address, events, fold, fromBlock, toBlock, factory) {
289
+ // ensure a TokenState exists for every token referenced by on-chain fields/locks/params
290
+ // (a deployed-but-unminted token can carry fields before any Transfer)
291
+ for (const id of fold.tokenFields.keys())
292
+ tokenIn(fold.tokens, id);
293
+ for (const id of fold.tokenLocked.keys())
294
+ tokenIn(fold.tokens, id);
295
+ for (const id of fold.tokenParams.keys())
296
+ tokenIn(fold.tokens, id);
297
+ // A 1/1 has token id 0 from deploy, even before mint — seed it so the resolver can
298
+ // serve metadata (warming marketplaces) the instant the contract exists.
299
+ if (fold.tokens.size === 0 && fold.deployBlock !== null)
300
+ tokenIn(fold.tokens, '0');
301
+ // attach on-chain fields + per-field locks + params onto tokens
302
+ for (const t of fold.tokens.values()) {
303
+ t.fields = [...(fold.tokenFields.get(t.tokenId)?.values() ?? [])];
304
+ t.lockedFields = [...(fold.tokenLocked.get(t.tokenId) ?? [])];
305
+ const params = fold.tokenParams.get(t.tokenId);
306
+ if (params?.size)
307
+ t.params = [...params.values()];
308
+ }
309
+ // A contract is a Series if it enabled the supply-cap extension; a Series that also
310
+ // speaks Params is a code project (SeriesCode's composition).
311
+ const isSeries = fold.extById.has(EXTENSION_ID.maxInvocations.toLowerCase());
312
+ const has = (id) => fold.extById.has(id.toLowerCase());
313
+ const hasParams = has(EXTENSION_ID.params);
314
+ const hasConfigurableParams = has(EXTENSION_ID.configurableParams);
315
+ const hasScript = has(EXTENSION_ID.onChainScript);
316
+ const hasDependencies = has(EXTENSION_ID.dependencies);
317
+ const hasSeedSource = has(EXTENSION_ID.seedSource);
318
+ const state = {
319
+ address,
320
+ chainId: client.chain?.id ?? 0,
321
+ abxVersion: fold.abxVersion,
322
+ deployBlock: fold.deployBlock,
323
+ deployTx: fold.deployTx,
324
+ factory: factory ?? null,
325
+ implementation: null,
326
+ isCanonical: null,
327
+ name: null,
328
+ symbol: null,
329
+ owner: fold.owner,
330
+ contractURI: null,
331
+ tokenURIRenderer: null,
332
+ tokenURILocked: null,
333
+ contractURIRenderer: null,
334
+ contractURILocked: null,
335
+ royalty: fold.royalty,
336
+ collectionFields: [...fold.collectionFields.values()],
337
+ lockedCollectionFields: [...fold.collectionLocked],
338
+ contractType: fold.deployBlock !== null ? (isSeries ? (hasParams ? 'code' : 'series') : '1of1') : undefined,
339
+ maxInvocations: fold.maxInvocations,
340
+ minter: fold.minter,
341
+ paused: fold.paused,
342
+ primaryPayee: fold.primaryPayee,
343
+ contractParams: hasParams ? [...fold.contractParams.values()] : undefined,
344
+ paramSchemas: hasConfigurableParams ? [...fold.paramSchemas.values()] : undefined,
345
+ paramHooks: hasConfigurableParams
346
+ ? (fold.paramHooks ?? { configureHook: null, augmentHook: null, transferHook: null })
347
+ : null,
348
+ // absence of the event ⇒ the canonical delegate.xyz default (the emit-non-default rule)
349
+ delegateRegistry: hasConfigurableParams
350
+ ? fold.delegateRegistry !== undefined
351
+ ? fold.delegateRegistry
352
+ : DELEGATE_REGISTRY_DEFAULT
353
+ : null,
354
+ seedSource: hasSeedSource ? fold.seedSource : null,
355
+ script: hasScript ? { chunkCount: null, locked: fold.scriptLocked } : null,
356
+ dependencies: hasDependencies
357
+ ? {
358
+ list: [...fold.dependencies],
359
+ registry: fold.dependencyRegistry,
360
+ locked: fold.dependenciesLocked,
361
+ }
362
+ : null,
363
+ extensions: [...fold.extById.values()].sort((a, b) => a.name.localeCompare(b.name)),
364
+ tokens: [...fold.tokens.values()].sort((a, b) => Number(a.tokenId) - Number(b.tokenId)),
365
+ events: [...events].sort(byOrder),
366
+ fromBlock: fromBlock.toString(),
367
+ toBlock: toBlock.toString(),
368
+ eventCount: events.length,
369
+ reconstructedAt: new Date().toISOString(),
370
+ rpcUrl: client.transport?.url,
371
+ };
372
+ await applyHeadReads(client, state, factory);
373
+ return state;
374
+ }
375
+ /** Default safety cap on chunk count; raise via ABX_GETLOGS_MAX_CHUNKS (the CLI's --yes does). */
376
+ const DEFAULT_MAX_CHUNKS = 3000;
377
+ function maxChunks() {
378
+ const v = Number(process.env.ABX_GETLOGS_MAX_CHUNKS);
379
+ return Number.isFinite(v) && v > 0 ? v : DEFAULT_MAX_CHUNKS;
380
+ }
381
+ /** Does this error look like an RPC rejecting the block range (vs a real failure)? */
382
+ export function isGetLogsRangeError(err) {
383
+ const m = (err?.message ?? '').toLowerCase();
384
+ return /block range|range should work|too large|out of bounds|response size|query returned more|results|limited|\d+\s*block|exceeds|max(imum)?\b/.test(m);
385
+ }
386
+ /** Thrown when a reconstruction would need more getLogs requests than the cap allows. */
387
+ export class GetLogsScanTooLargeError extends Error {
388
+ spanBlocks;
389
+ window;
390
+ estimatedRequests;
391
+ cap;
392
+ constructor(spanBlocks, window, estimatedRequests, cap) {
393
+ super(`Reconstructing ${spanBlocks} blocks needs ~${estimatedRequests} eth_getLogs requests at this RPC's range limit ` +
394
+ `(~${window} blocks/call) — over the ${cap}-request safety cap. A higher-range RPC is the real fix ` +
395
+ `(set ABX_RPC_URL, then re-check with \`abx doctor\`). To chunk through it anyway, raise ABX_GETLOGS_MAX_CHUNKS (the CLI's --yes does this).`);
396
+ this.spanBlocks = spanBlocks;
397
+ this.window = window;
398
+ this.estimatedRequests = estimatedRequests;
399
+ this.cap = cap;
400
+ this.name = 'GetLogsScanTooLargeError';
401
+ }
402
+ }
403
+ /**
404
+ * Discover the block a contract's code first appears — its deployment block — by binary
405
+ * searching `eth_getCode` between genesis and head. ~log2(head) calls (~24 on Sepolia),
406
+ * NONE of them `eth_getLogs`, so it's independent of an RPC's log-range cap. This is the
407
+ * scan floor for a fresh reconstruction: without it an `add` defaults to genesis and
408
+ * sweeps the whole chain (millions of blocks) — the difference between an instant index
409
+ * and a rate-limited grind (and the root cause of a hosted resolver "not indexing").
410
+ *
411
+ * **Fail-safe by design.** It reads archive-depth `getCode`, and a pruned/non-archive node
412
+ * can make old blocks read empty (breaking the search's monotonicity) and return a too-HIGH
413
+ * floor — which is worse than genesis, because you'd silently miss the deploy event and
414
+ * index an incomplete project. So any `getCode` error, or no code at head, returns `null`,
415
+ * and the caller must require an explicit `--from-block` rather than guess. Assumes the
416
+ * contract has no code at block 0 (true for every ABX clone — deployed long after genesis).
417
+ */
418
+ export async function discoverDeployBlock(client, address, toBlock) {
419
+ try {
420
+ const head = toBlock ?? (await client.getBlockNumber());
421
+ const codeAtHead = await client.getCode({ address, blockNumber: head });
422
+ if (!codeAtHead || codeAtHead === '0x')
423
+ return null; // no contract at head — nothing to find
424
+ // Invariant across the search: code absent at `lo`, present at `hi`; narrow to adjacent.
425
+ let lo = 0n;
426
+ let hi = head;
427
+ while (lo + 1n < hi) {
428
+ const mid = (lo + hi) / 2n;
429
+ const code = await client.getCode({ address, blockNumber: mid });
430
+ if (code && code !== '0x')
431
+ hi = mid;
432
+ else
433
+ lo = mid;
434
+ }
435
+ return hi;
436
+ }
437
+ catch {
438
+ return null; // archive/getCode unsupported — caller falls back to an explicit --from-block
439
+ }
440
+ }
441
+ /**
442
+ * Pull a contract's logs over a block range, adapting to RPC range caps. Providers
443
+ * cap `eth_getLogs` very differently and the numbers change, so we don't hard-code a
444
+ * window: try the whole range, and when the RPC rejects it, halve the window and
445
+ * sweep — adopting the smaller window for the rest of the run. So reconstruction is a
446
+ * single request on a generous RPC, still completes on a constrained one, and (for a
447
+ * 1/1, whose events cluster at the deploy block) stays cheap. `ABX_GETLOGS_RANGE`
448
+ * overrides the starting window.
449
+ *
450
+ * Once the working window is known we estimate the whole job *before* grinding it: if
451
+ * it would exceed the cap, we stop early (only the probe calls spent) and throw
452
+ * {@link GetLogsScanTooLargeError} so the caller can offer the real fix (a higher-range
453
+ * RPC) or an explicit opt-in to chunk through it.
454
+ */
455
+ async function getLogsAdaptive(client, address, fromBlock, toBlock) {
456
+ const span = toBlock - fromBlock + 1n;
457
+ const envRange = process.env.ABX_GETLOGS_RANGE;
458
+ let window = envRange && BigInt(envRange) > 0n ? BigInt(envRange) : span;
459
+ const out = [];
460
+ let start = fromBlock;
461
+ let estimated = false;
462
+ while (start <= toBlock) {
463
+ const end = start + window - 1n < toBlock ? start + window - 1n : toBlock;
464
+ let logs;
465
+ try {
466
+ logs = (await client.getLogs({ address, fromBlock: start, toBlock: end }));
467
+ }
468
+ catch (err) {
469
+ if (isGetLogsRangeError(err) && window > 1n) {
470
+ window = window > 2n ? window / 2n : 1n; // RPC rejected this window — shrink and retry
471
+ continue;
472
+ }
473
+ throw err; // genuine failure, or already at one block per call
474
+ }
475
+ out.push(...logs);
476
+ start = end + 1n;
477
+ // Window now proven. Estimate the whole job once and bail *before* grinding if absurd.
478
+ if (!estimated) {
479
+ estimated = true;
480
+ const remaining = toBlock - start + 1n;
481
+ const need = (remaining > 0n ? Number(remaining / window) + 1 : 0) + 1; // +1 for the chunk just done
482
+ const cap = maxChunks();
483
+ if (need > cap)
484
+ throw new GetLogsScanTooLargeError(span, window, need, cap);
485
+ }
486
+ }
487
+ return out;
488
+ }
489
+ /** Multicall the read surface to resolve current string values + trust facts. */
490
+ async function applyHeadReads(client, state, factory) {
491
+ const token = { address: state.address, abi: oneOfOneImageAbi };
492
+ const tokenIds = state.tokens.map((t) => t.tokenId);
493
+ // Mixed-ABI multicall — type it loosely; results are validated per-call below.
494
+ const contracts = [
495
+ { ...token, functionName: 'name' },
496
+ { ...token, functionName: 'symbol' },
497
+ { ...token, functionName: 'owner' },
498
+ { ...token, functionName: 'contractURI' },
499
+ ...tokenIds.map((id) => ({ ...token, functionName: 'tokenURI', args: [BigInt(id)] })),
500
+ ];
501
+ if (factory) {
502
+ contracts.push({ address: factory, abi: oneOfOneImageFactoryAbi, functionName: 'isAbxClone', args: [state.address] }, { address: factory, abi: oneOfOneImageFactoryAbi, functionName: 'implementation' });
503
+ }
504
+ // URI resolution config (the off-chain↔on-chain toggle + freeze)
505
+ const cfgBase = contracts.length;
506
+ contracts.push({ ...token, functionName: 'tokenURIRenderer' }, { ...token, functionName: 'tokenURILocked' }, { ...token, functionName: 'contractURIRenderer' }, { ...token, functionName: 'contractURILocked' });
507
+ // On-chain script: chunk content is too large to log, so the count is a head read.
508
+ const scriptIdx = contracts.length;
509
+ if (state.script) {
510
+ contracts.push({ address: state.address, abi: seriesCodeAbi, functionName: 'scriptChunkCount' });
511
+ }
512
+ const results = (await client.multicall({
513
+ contracts: contracts,
514
+ allowFailure: true,
515
+ }));
516
+ const val = (i) => (results[i]?.status === 'success' ? results[i].result : null);
517
+ state.name = val(0) ?? null;
518
+ state.symbol = val(1) ?? null;
519
+ state.owner = val(2) ?? state.owner;
520
+ state.contractURI = val(3) ?? null;
521
+ tokenIds.forEach((id, k) => {
522
+ const tok = state.tokens.find((t) => t.tokenId === id);
523
+ if (tok)
524
+ tok.tokenURI = val(4 + k) ?? null;
525
+ });
526
+ if (factory) {
527
+ const base = 4 + tokenIds.length;
528
+ state.isCanonical = val(base) ?? null;
529
+ state.implementation = val(base + 1) ?? null;
530
+ }
531
+ const nonZero = (a) => a && a !== '0x0000000000000000000000000000000000000000' ? a : null;
532
+ state.tokenURIRenderer = nonZero(val(cfgBase));
533
+ state.tokenURILocked = val(cfgBase + 1) ?? null;
534
+ state.contractURIRenderer = nonZero(val(cfgBase + 2));
535
+ state.contractURILocked = val(cfgBase + 3) ?? null;
536
+ if (state.script) {
537
+ const count = val(scriptIdx);
538
+ state.script.chunkCount = count === null ? null : Number(count);
539
+ // digest = keccak over the concatenated chunks — the content half of effect inputsHash
540
+ // values. Chunks are few and bounded (~24 KB each), so this is a cheap second multicall.
541
+ const n = state.script.chunkCount ?? 0;
542
+ if (n > 0) {
543
+ const chunkReads = (await client.multicall({
544
+ contracts: Array.from({ length: n }, (_, i) => ({
545
+ address: state.address,
546
+ abi: seriesCodeAbi,
547
+ functionName: 'scriptChunk',
548
+ args: [BigInt(i)],
549
+ })),
550
+ allowFailure: true,
551
+ }));
552
+ const parts = [];
553
+ for (const r of chunkReads) {
554
+ if (r.status !== 'success')
555
+ return; // partial read — leave digest unset rather than wrong
556
+ parts.push(r.result);
557
+ }
558
+ state.script.digest = keccak256(concatHex(parts));
559
+ }
560
+ else {
561
+ state.script.digest = null;
562
+ }
563
+ }
564
+ }
565
+ function stringifyArgs(args) {
566
+ const out = {};
567
+ for (const [k, v] of Object.entries(args)) {
568
+ if (typeof k === 'string' && /^\d+$/.test(k))
569
+ continue; // skip positional dupes
570
+ // arrays (e.g. a schema's selectOptions) keep fidelity as JSON — String() would
571
+ // comma-join and lose options containing commas.
572
+ if (Array.isArray(v))
573
+ out[k] = JSON.stringify(v.map(String));
574
+ else
575
+ out[k] = typeof v === 'bigint' ? v.toString() : String(v);
576
+ }
577
+ return out;
578
+ }
579
+ /** Parse an array arg back out of a {@link SpineEvent} (JSON per {@link stringifyArgs}). */
580
+ function parseStringArray(v) {
581
+ if (!v)
582
+ return [];
583
+ try {
584
+ const parsed = JSON.parse(v);
585
+ return Array.isArray(parsed) ? parsed.map(String) : [];
586
+ }
587
+ catch {
588
+ return [];
589
+ }
590
+ }
591
+ function byOrder(a, b) {
592
+ const bn = BigInt(a.blockNumber) - BigInt(b.blockNumber);
593
+ if (bn !== 0n)
594
+ return bn < 0n ? -1 : 1;
595
+ return a.logIndex - b.logIndex;
596
+ }
597
+ //# sourceMappingURL=reconstruct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconstruct.js","sourceRoot":"","sources":["../src/reconstruct.ts"],"names":[],"mappings":"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"}