@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.
- package/LICENSE +21 -0
- package/dist/abi/generated.d.ts +6185 -0
- package/dist/abi/generated.d.ts.map +1 -0
- package/dist/abi/generated.js +28 -0
- package/dist/abi/generated.js.map +1 -0
- package/dist/abi/index.d.ts +3227 -0
- package/dist/abi/index.d.ts.map +1 -0
- package/dist/abi/index.js +38 -0
- package/dist/abi/index.js.map +1 -0
- package/dist/chains.d.ts +27 -0
- package/dist/chains.d.ts.map +1 -0
- package/dist/chains.js +71 -0
- package/dist/chains.js.map +1 -0
- package/dist/chunks.d.ts +168 -0
- package/dist/chunks.d.ts.map +1 -0
- package/dist/chunks.js +232 -0
- package/dist/chunks.js.map +1 -0
- package/dist/clients.d.ts +42 -0
- package/dist/clients.d.ts.map +1 -0
- package/dist/clients.js +90 -0
- package/dist/clients.js.map +1 -0
- package/dist/create2.d.ts +42 -0
- package/dist/create2.d.ts.map +1 -0
- package/dist/create2.js +47 -0
- package/dist/create2.js.map +1 -0
- package/dist/deploy.d.ts +192 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +231 -0
- package/dist/deploy.js.map +1 -0
- package/dist/deployments.d.ts +60 -0
- package/dist/deployments.d.ts.map +1 -0
- package/dist/deployments.js +81 -0
- package/dist/deployments.js.map +1 -0
- package/dist/deps.d.ts +109 -0
- package/dist/deps.d.ts.map +1 -0
- package/dist/deps.js +103 -0
- package/dist/deps.js.map +1 -0
- package/dist/env.d.ts +2 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +45 -0
- package/dist/env.js.map +1 -0
- package/dist/fastlz.d.ts +20 -0
- package/dist/fastlz.d.ts.map +1 -0
- package/dist/fastlz.js +123 -0
- package/dist/fastlz.js.map +1 -0
- package/dist/generator.d.ts +129 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +81 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/ops.d.ts +379 -0
- package/dist/ops.d.ts.map +1 -0
- package/dist/ops.js +811 -0
- package/dist/ops.js.map +1 -0
- package/dist/probe.d.ts +30 -0
- package/dist/probe.d.ts.map +1 -0
- package/dist/probe.js +74 -0
- package/dist/probe.js.map +1 -0
- package/dist/reconstruct.d.ts +97 -0
- package/dist/reconstruct.d.ts.map +1 -0
- package/dist/reconstruct.js +597 -0
- package/dist/reconstruct.js.map +1 -0
- package/dist/spine.d.ts +110 -0
- package/dist/spine.d.ts.map +1 -0
- package/dist/spine.js +0 -0
- package/dist/spine.js.map +1 -0
- package/dist/token.d.ts +33 -0
- package/dist/token.d.ts.map +1 -0
- package/dist/token.js +66 -0
- package/dist/token.js.map +1 -0
- package/dist/tokendata.d.ts +50 -0
- package/dist/tokendata.d.ts.map +1 -0
- package/dist/tokendata.js +178 -0
- package/dist/tokendata.js.map +1 -0
- package/dist/traits.d.ts +38 -0
- package/dist/traits.d.ts.map +1 -0
- package/dist/traits.js +92 -0
- package/dist/traits.js.map +1 -0
- package/dist/types.d.ts +145 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- 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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"}
|