@artblocks/abx-sdk 0.1.0-alpha.4 → 0.1.0-alpha.41

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 (159) hide show
  1. package/CHANGELOG.md +72 -0
  2. package/README.md +130 -0
  3. package/dist/abi/generated.d.ts +8502 -129
  4. package/dist/abi/generated.d.ts.map +1 -1
  5. package/dist/abi/generated.js +40 -22
  6. package/dist/abi/generated.js.map +1 -1
  7. package/dist/abi/index.d.ts +2645 -168
  8. package/dist/abi/index.d.ts.map +1 -1
  9. package/dist/abi/index.js +34 -7
  10. package/dist/abi/index.js.map +1 -1
  11. package/dist/anchors.d.ts +325 -0
  12. package/dist/anchors.d.ts.map +1 -0
  13. package/dist/anchors.js +740 -0
  14. package/dist/anchors.js.map +1 -0
  15. package/dist/chain-support.d.ts +28 -0
  16. package/dist/chain-support.d.ts.map +1 -0
  17. package/dist/chain-support.js +65 -0
  18. package/dist/chain-support.js.map +1 -0
  19. package/dist/chain-support.json +60 -0
  20. package/dist/chains.d.ts +24 -10
  21. package/dist/chains.d.ts.map +1 -1
  22. package/dist/chains.js +51 -17
  23. package/dist/chains.js.map +1 -1
  24. package/dist/chunks.d.ts +162 -31
  25. package/dist/chunks.d.ts.map +1 -1
  26. package/dist/chunks.js +179 -14
  27. package/dist/chunks.js.map +1 -1
  28. package/dist/clients.d.ts +23 -11
  29. package/dist/clients.d.ts.map +1 -1
  30. package/dist/clients.js +17 -18
  31. package/dist/clients.js.map +1 -1
  32. package/dist/contract-generations.d.ts +58 -0
  33. package/dist/contract-generations.d.ts.map +1 -0
  34. package/dist/contract-generations.js +109 -0
  35. package/dist/contract-generations.js.map +1 -0
  36. package/dist/contract-generations.json +48 -0
  37. package/dist/create2.d.ts +84 -1
  38. package/dist/create2.d.ts.map +1 -1
  39. package/dist/create2.js +158 -2
  40. package/dist/create2.js.map +1 -1
  41. package/dist/creator-token.d.ts +132 -0
  42. package/dist/creator-token.d.ts.map +1 -0
  43. package/dist/creator-token.js +183 -0
  44. package/dist/creator-token.js.map +1 -0
  45. package/dist/deploy.d.ts +234 -14
  46. package/dist/deploy.d.ts.map +1 -1
  47. package/dist/deploy.js +289 -111
  48. package/dist/deploy.js.map +1 -1
  49. package/dist/deployments.d.ts +38 -5
  50. package/dist/deployments.d.ts.map +1 -1
  51. package/dist/deployments.js +157 -30
  52. package/dist/deployments.js.map +1 -1
  53. package/dist/deps.d.ts +123 -6
  54. package/dist/deps.d.ts.map +1 -1
  55. package/dist/deps.js +249 -7
  56. package/dist/deps.js.map +1 -1
  57. package/dist/env.d.ts +5 -4
  58. package/dist/env.d.ts.map +1 -1
  59. package/dist/env.js +20 -5
  60. package/dist/env.js.map +1 -1
  61. package/dist/errors.d.ts +109 -0
  62. package/dist/errors.d.ts.map +1 -0
  63. package/dist/errors.js +148 -0
  64. package/dist/errors.js.map +1 -0
  65. package/dist/execute.d.ts +118 -0
  66. package/dist/execute.d.ts.map +1 -0
  67. package/dist/execute.js +159 -0
  68. package/dist/execute.js.map +1 -0
  69. package/dist/gateways.d.ts +79 -0
  70. package/dist/gateways.d.ts.map +1 -0
  71. package/dist/gateways.js +156 -0
  72. package/dist/gateways.js.map +1 -0
  73. package/dist/generator-document.d.ts +57 -0
  74. package/dist/generator-document.d.ts.map +1 -0
  75. package/dist/generator-document.js +123 -0
  76. package/dist/generator-document.js.map +1 -0
  77. package/dist/generator.d.ts +44 -2
  78. package/dist/generator.d.ts.map +1 -1
  79. package/dist/generator.js +29 -0
  80. package/dist/generator.js.map +1 -1
  81. package/dist/index.d.ts +19 -3
  82. package/dist/index.d.ts.map +1 -1
  83. package/dist/index.js +19 -3
  84. package/dist/index.js.map +1 -1
  85. package/dist/inspect.d.ts +48 -0
  86. package/dist/inspect.d.ts.map +1 -0
  87. package/dist/inspect.js +295 -0
  88. package/dist/inspect.js.map +1 -0
  89. package/dist/migrate.d.ts +41 -0
  90. package/dist/migrate.d.ts.map +1 -0
  91. package/dist/migrate.js +142 -0
  92. package/dist/migrate.js.map +1 -0
  93. package/dist/mime.d.ts +11 -0
  94. package/dist/mime.d.ts.map +1 -0
  95. package/dist/mime.js +40 -0
  96. package/dist/mime.js.map +1 -0
  97. package/dist/node.d.ts +69 -0
  98. package/dist/node.d.ts.map +1 -0
  99. package/dist/node.js +92 -0
  100. package/dist/node.js.map +1 -0
  101. package/dist/onchain-uri.d.ts +110 -0
  102. package/dist/onchain-uri.d.ts.map +1 -0
  103. package/dist/onchain-uri.js +276 -0
  104. package/dist/onchain-uri.js.map +1 -0
  105. package/dist/ops.d.ts +507 -14
  106. package/dist/ops.d.ts.map +1 -1
  107. package/dist/ops.js +850 -34
  108. package/dist/ops.js.map +1 -1
  109. package/dist/policy.d.ts +57 -0
  110. package/dist/policy.d.ts.map +1 -0
  111. package/dist/policy.js +35 -0
  112. package/dist/policy.js.map +1 -0
  113. package/dist/probe.d.ts +58 -0
  114. package/dist/probe.d.ts.map +1 -1
  115. package/dist/probe.js +190 -9
  116. package/dist/probe.js.map +1 -1
  117. package/dist/reconstruct.d.ts +141 -3
  118. package/dist/reconstruct.d.ts.map +1 -1
  119. package/dist/reconstruct.js +479 -100
  120. package/dist/reconstruct.js.map +1 -1
  121. package/dist/resume.d.ts +147 -0
  122. package/dist/resume.d.ts.map +1 -0
  123. package/dist/resume.js +146 -0
  124. package/dist/resume.js.map +1 -0
  125. package/dist/script-chunks.d.ts +105 -0
  126. package/dist/script-chunks.d.ts.map +1 -0
  127. package/dist/script-chunks.js +158 -0
  128. package/dist/script-chunks.js.map +1 -0
  129. package/dist/service.d.ts +155 -9
  130. package/dist/service.d.ts.map +1 -1
  131. package/dist/service.js +103 -11
  132. package/dist/service.js.map +1 -1
  133. package/dist/spine.d.ts +47 -4
  134. package/dist/spine.d.ts.map +1 -1
  135. package/dist/spine.js +0 -0
  136. package/dist/spine.js.map +1 -1
  137. package/dist/staging.d.ts +139 -0
  138. package/dist/staging.d.ts.map +1 -0
  139. package/dist/staging.js +139 -0
  140. package/dist/staging.js.map +1 -0
  141. package/dist/token.d.ts +11 -1
  142. package/dist/token.d.ts.map +1 -1
  143. package/dist/token.js +32 -1
  144. package/dist/token.js.map +1 -1
  145. package/dist/tokendata.d.ts +63 -3
  146. package/dist/tokendata.d.ts.map +1 -1
  147. package/dist/tokendata.js +81 -19
  148. package/dist/tokendata.js.map +1 -1
  149. package/dist/tokens.d.ts +119 -0
  150. package/dist/tokens.d.ts.map +1 -0
  151. package/dist/tokens.js +317 -0
  152. package/dist/tokens.js.map +1 -0
  153. package/dist/types.d.ts +107 -5
  154. package/dist/types.d.ts.map +1 -1
  155. package/dist/util.d.ts +74 -0
  156. package/dist/util.d.ts.map +1 -0
  157. package/dist/util.js +106 -0
  158. package/dist/util.js.map +1 -0
  159. package/package.json +15 -6
package/dist/tokens.js ADDED
@@ -0,0 +1,317 @@
1
+ import { zeroAddress } from 'viem';
2
+ import { editionCodeAbi, seriesCodeAbi } from './abi/index.js';
3
+ import { readParamSchema } from './ops.js';
4
+ import { AUTH_OPTIONS, decodeTag, encodeTag, PARAM_TYPES } from './spine.js';
5
+ import { decodeParam } from './tokendata.js';
6
+ /**
7
+ * The whole collection's tokens — seeds, owners, and params — read **from chain alone**.
8
+ *
9
+ * No indexer projection, no event scan, no running resolver: every input is a plain `eth_call`
10
+ * against the token contract, because the params store maintains its own key lists inside its
11
+ * write paths (`tokenParamKeys` / `contractParamKeys`) and the seed is just a reserved param.
12
+ * That matters for the question this answers — *for a generative collection the seed list IS the
13
+ * collection* — since it means the answer is available to anyone with an RPC URL, including
14
+ * before any indexing has happened, and it can never disagree with the chain.
15
+ *
16
+ * Deliberately not built on {@link reconstructProject}: that folds the event spine (a `getLogs`
17
+ * range scan, which a range-capped RPC can refuse) to recover *structure*. Here every value
18
+ * wanted is a head read, so a scan would be strictly more fragile for strictly less.
19
+ */
20
+ /** The reserved param the seed source writes at mint. Never in the enumerable key lists (every
21
+ * consumer reads it as a tokenData coordinate), so it is read by name. */
22
+ const SEED_KEY = 'seed';
23
+ /** How many tokens to read concurrently. Each token costs ~2 + (params) `eth_call`s, so a
24
+ * 1000-token collection is a few thousand reads — wide enough to be quick, narrow enough that a
25
+ * free-tier RPC doesn't rate-limit. */
26
+ const DEFAULT_CONCURRENCY = 8;
27
+ /**
28
+ * Read an edition id's cap without re-deriving the rule at each call site — the derivation this
29
+ * protocol got wrong twice, in opposite directions: the on-chain getter overloads `0`, and the
30
+ * event fold used to miss the collection default entirely.
31
+ *
32
+ * Pass a folded {@link TokenState} (from `reconstructProject`) to get all three states. Pass a
33
+ * head-read {@link TokenRow}, which has no `maxSupplyOverridden` because a state read cannot know
34
+ * it, and a `'0'` cap reads `open` — the documented on-chain convention, and the reason
35
+ * `IAbxEditionSupply` tells an integrator rendering a buy button to consult the log.
36
+ *
37
+ * `null` ⇒ no cap information at all (a 721 token, or a row from a projection written before
38
+ * `DefaultMaxSupplySet` was folded).
39
+ */
40
+ export function editionCapOf(token) {
41
+ if (token.maxSupply === undefined)
42
+ return null;
43
+ if (token.maxSupply !== '0')
44
+ return { kind: 'capped', cap: token.maxSupply };
45
+ return token.maxSupplyOverridden ? { kind: 'closed' } : { kind: 'open' };
46
+ }
47
+ /** Minimal ERC-165 fragment — shared by any capability check that only needs `supportsInterface`
48
+ * (no need to pull in a whole token ABI just for this one function). */
49
+ const ERC165_PROBE_ABI = [
50
+ {
51
+ type: 'function',
52
+ name: 'supportsInterface',
53
+ stateMutability: 'view',
54
+ inputs: [{ name: 'interfaceId', type: 'bytes4' }],
55
+ outputs: [{ name: '', type: 'bool' }],
56
+ },
57
+ ];
58
+ /** The standard's own ERC-165 id — the cheapest capability check that can never collide with a
59
+ * 721 token (which doesn't implement ERC-1155 at all, so this reverts/returns false there). */
60
+ const ERC1155_INTERFACE_ID = '0xd9b67a26';
61
+ /** Whether `address` is an ERC-1155 edition (vs. the 721 family) — the probe {@link listTokens}
62
+ * branches on before choosing its read path. */
63
+ async function probeIsEdition(client, address) {
64
+ try {
65
+ return (await client.readContract({
66
+ address,
67
+ abi: ERC165_PROBE_ABI,
68
+ functionName: 'supportsInterface',
69
+ args: [ERC1155_INTERFACE_ID],
70
+ }));
71
+ }
72
+ catch {
73
+ return false;
74
+ }
75
+ }
76
+ /** Every token's owner, seed, and params, straight from the contract. */
77
+ export async function listTokens(client, address, opts = {}) {
78
+ if (await probeIsEdition(client, address))
79
+ return listEditionTokens(client, address, opts);
80
+ const read = async (functionName, args = []) => {
81
+ try {
82
+ // dynamic dispatch over the superset ABI — cast past viem's literal-name inference. Every
83
+ // getter here is absent on at least one token type, so the try/catch IS the capability probe.
84
+ return (await client.readContract({ address, abi: seriesCodeAbi, functionName, args }));
85
+ }
86
+ catch {
87
+ return null; // absent on this token type, or an unminted id — the caller decides what that means
88
+ }
89
+ };
90
+ const [chainId, nextTokenId, totalSupply, maxInvocations, contractKeys] = await Promise.all([
91
+ client.getChainId(),
92
+ read('nextTokenId'),
93
+ read('totalSupply'),
94
+ read('maxInvocations'),
95
+ read('contractParamKeys'),
96
+ ]);
97
+ // The params surface is probed by a read that only a params-bearing token answers. `seed` is the
98
+ // cheapest such probe that works on a LEGACY project too (deployed before enumeration shipped),
99
+ // so the two capabilities are detected separately rather than collapsed.
100
+ const seedProbe = await read('tokenParam', [0n, encodeTag(SEED_KEY)]);
101
+ const hasParams = seedProbe !== null || contractKeys !== null;
102
+ const hasParamEnumeration = contractKeys !== null;
103
+ // Schemas are read once per key and shared across every token — on a 1000-token collection this
104
+ // is the difference between one read per key and one per key PER TOKEN.
105
+ const schemaCache = new Map();
106
+ const schemaOf = (key) => {
107
+ let hit = schemaCache.get(key);
108
+ if (!hit) {
109
+ hit = schemaFor(client, address, key);
110
+ schemaCache.set(key, hit);
111
+ }
112
+ return hit;
113
+ };
114
+ const contractParams = {};
115
+ for (const raw of contractKeys ?? []) {
116
+ const key = decodeTag(raw);
117
+ const slot = await read('contractParam', [raw]);
118
+ if (!slot?.[2])
119
+ continue; // not set
120
+ const p = { key, value: slot[0], valueIsHash: slot[1], updatedBy: address };
121
+ contractParams[key] = (await decodeParam(client, address, '0', p, false, await schemaOf(key))).value;
122
+ }
123
+ // The id range — an ID SPACE, never a live count. `nextTokenId` is the mint frontier; a token type
124
+ // without one is a 1/1, whose id space is token 0 alone and stays that way forever.
125
+ //
126
+ // This used to fall back to `totalSupply`, which is live (mints − burns): burn a 1/1's only token
127
+ // and the listing enumerated ZERO ids, so `abx tokens` on a burned 1/1 printed nothing at all —
128
+ // indistinguishable from a collection with no tokens, when the honest answer is one id whose state
129
+ // the chain cannot pin down (see {@link TokenRow.lifecycle}'s `'unknown'`). Found by burning a real
130
+ // token on Sepolia rather than by a fixture, which is the only way this one shows up.
131
+ const count = nextTokenId !== null ? Number(nextTokenId) : 1;
132
+ const from = Math.max(0, opts.from ?? 0);
133
+ const end = opts.limit === undefined ? count : Math.min(count, from + Math.max(0, opts.limit));
134
+ const ids = Array.from({ length: Math.max(0, end - from) }, (_, i) => from + i);
135
+ let done = 0;
136
+ const tokens = await pool(ids, opts.concurrency ?? DEFAULT_CONCURRENCY, async (id) => {
137
+ const tokenId = String(id);
138
+ const [owner, seedSlot, keys] = await Promise.all([
139
+ read('ownerOf', [BigInt(id)]),
140
+ hasParams ? read('tokenParam', [BigInt(id), encodeTag(SEED_KEY)]) : null,
141
+ hasParamEnumeration ? read('tokenParamKeys', [BigInt(id)]) : null,
142
+ ]);
143
+ const params = {};
144
+ for (const raw of keys ?? []) {
145
+ const key = decodeTag(raw);
146
+ const slot = await read('tokenParam', [BigInt(id), raw]);
147
+ if (!slot?.[2])
148
+ continue;
149
+ const p = { key, value: slot[0], valueIsHash: slot[1], updatedBy: address };
150
+ params[key] = (await decodeParam(client, address, tokenId, p, true, await schemaOf(key))).value;
151
+ }
152
+ opts.onProgress?.(++done, ids.length);
153
+ // With a frontier, a missing owner below it is a burn — without one (a 1/1), it is not evidence.
154
+ const lifecycle = owner
155
+ ? 'live'
156
+ : nextTokenId === null
157
+ ? 'unknown'
158
+ : BigInt(id) < nextTokenId
159
+ ? 'burned'
160
+ : 'unminted';
161
+ return { tokenId, owner, lifecycle, seed: seedSlot?.[2] ? seedSlot[0] : null, params };
162
+ });
163
+ return {
164
+ chainId,
165
+ address,
166
+ nextTokenId: nextTokenId === null ? null : Number(nextTokenId),
167
+ totalSupply: totalSupply === null ? null : Number(totalSupply),
168
+ burnedCount: nextTokenId === null || totalSupply === null ? null : Number(nextTokenId - totalSupply),
169
+ maxInvocations: maxInvocations === null ? null : Number(maxInvocations),
170
+ hasParams,
171
+ hasParamEnumeration,
172
+ contractParams,
173
+ tokens,
174
+ };
175
+ }
176
+ /**
177
+ * The edition (ERC-1155) path {@link listTokens} delegates to once {@link probeIsEdition} says
178
+ * yes — a parallel implementation, not a set of `if (isEdition)` branches threaded through the
179
+ * 721 path above, so that path stays byte-identical. Reads against `editionCodeAbi` (the
180
+ * narrowest-common-superset ABI for the family, same role `seriesCodeAbi` plays on the 721
181
+ * side): per id, `totalSupply(id)`/`maxSupply(id)` instead of `ownerOf` — `owner` is always
182
+ * `null` here (a multi-holder id has no single owner, and *which* holders isn't chain-enumerable
183
+ * outside the event log). `params`/`seed` still apply — EditionCode composes the same Params/
184
+ * ConfigurableParams extensions as SeriesCode, unchanged — but are absent (every read reverts,
185
+ * same honest "absent" answer as a 1/1 image) on `OneOfOneEdition`/`EditionImage`.
186
+ */
187
+ async function listEditionTokens(client, address, opts) {
188
+ const read = async (functionName, args = []) => {
189
+ try {
190
+ return (await client.readContract({ address, abi: editionCodeAbi, functionName, args }));
191
+ }
192
+ catch {
193
+ return null;
194
+ }
195
+ };
196
+ const [chainId, maxInvocations, contractKeys] = await Promise.all([
197
+ client.getChainId(),
198
+ read('maxInvocations'), // absent on OneOfOneEdition — its id space is fixed to {0}
199
+ read('contractParamKeys'),
200
+ ]);
201
+ const seedProbe = await read('tokenParam', [0n, encodeTag(SEED_KEY)]);
202
+ const hasParams = seedProbe !== null || contractKeys !== null;
203
+ const hasParamEnumeration = contractKeys !== null;
204
+ const schemaCache = new Map();
205
+ const schemaOf = (key) => {
206
+ let hit = schemaCache.get(key);
207
+ if (!hit) {
208
+ hit = schemaFor(client, address, key);
209
+ schemaCache.set(key, hit);
210
+ }
211
+ return hit;
212
+ };
213
+ const contractParams = {};
214
+ for (const raw of contractKeys ?? []) {
215
+ const key = decodeTag(raw);
216
+ const slot = await read('contractParam', [raw]);
217
+ if (!slot?.[2])
218
+ continue;
219
+ const p = { key, value: slot[0], valueIsHash: slot[1], updatedBy: address };
220
+ contractParams[key] = (await decodeParam(client, address, '0', p, false, await schemaOf(key))).value;
221
+ }
222
+ // The id space: the id-space cap (`maxInvocations`) when the token has one (EditionImage/
223
+ // EditionCode); `OneOfOneEdition` has no id-space extension at all — its id space is the
224
+ // single work, id 0 alone (mirrors the 1/1 count fallback on the 721 path above).
225
+ const count = maxInvocations !== null ? Number(maxInvocations) : 1;
226
+ const from = Math.max(0, opts.from ?? 0);
227
+ const end = opts.limit === undefined ? count : Math.min(count, from + Math.max(0, opts.limit));
228
+ const ids = Array.from({ length: Math.max(0, end - from) }, (_, i) => from + i);
229
+ let done = 0;
230
+ const tokens = await pool(ids, opts.concurrency ?? DEFAULT_CONCURRENCY, async (id) => {
231
+ const tokenId = String(id);
232
+ const [supply, maxSupply, seedSlot, keys] = await Promise.all([
233
+ read('totalSupply', [BigInt(id)]),
234
+ read('maxSupply', [BigInt(id)]),
235
+ hasParams ? read('tokenParam', [BigInt(id), encodeTag(SEED_KEY)]) : null,
236
+ hasParamEnumeration ? read('tokenParamKeys', [BigInt(id)]) : null,
237
+ ]);
238
+ const params = {};
239
+ for (const raw of keys ?? []) {
240
+ const key = decodeTag(raw);
241
+ const slot = await read('tokenParam', [BigInt(id), raw]);
242
+ if (!slot?.[2])
243
+ continue;
244
+ const p = { key, value: slot[0], valueIsHash: slot[1], updatedBy: address };
245
+ params[key] = (await decodeParam(client, address, tokenId, p, true, await schemaOf(key))).value;
246
+ }
247
+ opts.onProgress?.(++done, ids.length);
248
+ return {
249
+ tokenId,
250
+ owner: null, // not chain-enumerable for a multi-holder id — indexer territory
251
+ // Zero live copies. The fold says exactly this for the same id (it declines to spend its extra
252
+ // history knowledge on a distinction with no consumer), so the two lanes agree by construction
253
+ // rather than by a docstring promising they do.
254
+ lifecycle: (supply ?? 0n) > 0n ? 'live' : 'no-live-copies',
255
+ seed: seedSlot?.[2] ? seedSlot[0] : null,
256
+ params,
257
+ supply: supply === null ? undefined : supply.toString(),
258
+ maxSupply: maxSupply === null ? undefined : maxSupply.toString(),
259
+ };
260
+ });
261
+ return {
262
+ chainId,
263
+ address,
264
+ nextTokenId: null, // editions have no sequential mint cursor — ids are caller-named
265
+ totalSupply: null, // no unconditional whole-contract total; supply is per id (see each row)
266
+ burnedCount: null, // per id, not per contract — and undecidable at head anyway (see each row)
267
+ maxInvocations: maxInvocations === null ? null : Number(maxInvocations),
268
+ hasParams,
269
+ hasParamEnumeration,
270
+ contractParams,
271
+ tokens,
272
+ };
273
+ }
274
+ /**
275
+ * One key's declared schema in the shape {@link decodeParam} wants, or `undefined` when the key is
276
+ * un-governed or the contract has no schema surface. A schema-less param is a normal, supported
277
+ * state — its value simply stays raw, which is exactly what `seed` relies on.
278
+ *
279
+ * Delegates the read to {@link readParamSchema} (the one implementation, which also backs the
280
+ * read-modify-write in `set-schema`) and only maps its numeric enums onto their canonical names.
281
+ */
282
+ async function schemaFor(client, address, key) {
283
+ try {
284
+ const s = await readParamSchema(client, address, key);
285
+ if (!s.exists)
286
+ return undefined;
287
+ return {
288
+ key,
289
+ paramType: PARAM_TYPES[s.paramType] ?? String(s.paramType),
290
+ auth: AUTH_OPTIONS[s.auth] ?? String(s.auth),
291
+ authAddress: s.authAddress === zeroAddress ? null : s.authAddress,
292
+ lockAfter: String(s.lockAfter),
293
+ min: s.min,
294
+ max: s.max,
295
+ selectOptions: s.selectOptions,
296
+ };
297
+ }
298
+ catch {
299
+ return undefined; // no schema surface on this token type
300
+ }
301
+ }
302
+ /** Bounded-concurrency map, order-preserving. */
303
+ async function pool(items, width, fn) {
304
+ const out = new Array(items.length);
305
+ let next = 0;
306
+ const workers = Array.from({ length: Math.max(1, Math.min(width, items.length)) }, async () => {
307
+ for (;;) {
308
+ const i = next++;
309
+ if (i >= items.length)
310
+ return;
311
+ out[i] = await fn(items[i]);
312
+ }
313
+ });
314
+ await Promise.all(workers);
315
+ return out;
316
+ }
317
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -8,7 +8,7 @@ export interface ExtensionInfo {
8
8
  /**
9
9
  * One on-chain metadata value, decoded from the spine: a `field` (the *what*, e.g.
10
10
  * "image") carried in a `representation` (the *how*, e.g. "inline" / "keccak256" /
11
- * "arweave"). See the protocol registry (specs/protocol/onchain-metadata.md).
11
+ * "arweave"). See the protocol registry (site/content/docs/protocol/metadata.mdx).
12
12
  */
13
13
  export interface MetadataField {
14
14
  field: string;
@@ -33,11 +33,18 @@ export interface ParamSchema {
33
33
  max: Hex;
34
34
  selectOptions: string[];
35
35
  }
36
- /** The three param lifecycle hooks (any may be null = none). */
36
+ /** The three param lifecycle hooks (any may be null = none), plus whether the set is frozen. */
37
37
  export interface ParamHooks {
38
38
  configureHook: Address | null;
39
39
  augmentHook: Address | null;
40
+ /** Ownership-change lifecycle — a **VETO**: its revert fails the transfer, and a mint is a
41
+ * transfer from `0x0`, so a reverting hook also stops minting. Read `locked` next to it. */
40
42
  transferHook: Address | null;
43
+ /** `lockParamHooks()` was sent: the three addresses above can never change again. The read that
44
+ * turns "the hooks are whatever the owner currently says" into something a buyer can verify —
45
+ * it matters most for `transferHook`, an unlocked one being a standing power over a collector's
46
+ * ability to sell. Folded from `ParamHooksFrozen`. */
47
+ locked: boolean;
41
48
  }
42
49
  /** One declared code dependency (Dependencies extension); index 0 = the runtime. */
43
50
  export interface DependencyInfo {
@@ -71,13 +78,76 @@ export interface SpineEvent {
71
78
  }
72
79
  export interface TokenState {
73
80
  tokenId: string;
74
- minted: boolean;
81
+ /**
82
+ * Does a token exist at this id **right now** — the one question a consumer is actually asking.
83
+ *
84
+ * - `'unminted'` — ERC-721: a valid id never issued (the deployed-but-unminted state a resolver
85
+ * serves warming metadata for). Valid state, not a gap.
86
+ * - `'live'` — a token exists: a 721 with a holder, or an edition id with `supply > 0`.
87
+ * - `'burned'` — **terminal, and ERC-721 only.** The id was issued and destroyed, the contract
88
+ * disowns it (`tokenURI` reverts `NonexistentToken`), and it can never come back: ABX mints from
89
+ * a monotonic `nextTokenId`, so no mint path can reissue that id. This is the word a consumer
90
+ * may act on irreversibly — drop it from a gallery, answer `410 Gone`.
91
+ * - `'no-live-copies'` — **ERC-1155 editions only, and never terminal.** Zero live copies of this
92
+ * id right now: never minted, or every copy burned, or minted and fully burned twice over. It
93
+ * makes no claim about history *because the two have no different consequence* — the id can mint
94
+ * again either way, so anything that treats it as gone forever is wrong. `supply`/`holders`
95
+ * carry the numbers; the event log carries the history.
96
+ *
97
+ * **Why `'burned'` is not shared across the standards**, though the first draft of this enum shared
98
+ * it: the correct response to destruction differs by standard, so one word covering both put every
99
+ * consumer one forgotten branch away from serving `410 Gone` for an edition id that can mint again.
100
+ * Splitting the word moves the rule out of prose that must be
101
+ * remembered and into the type: **`lifecycle === 'burned'` is safe to treat as permanent on either
102
+ * standard, with no carve-out**, which is the only version of this rule that survives a refactor.
103
+ *
104
+ * It replaced a `minted: boolean` that latched `true` at mint and was never recomputed on the 721
105
+ * lane, so a burned token reconstructed as live, held by `0x0`. "Was it ever issued" is
106
+ * `lifecycle !== 'unminted'` on a 721; on an edition, ask the log.
107
+ */
108
+ lifecycle: 'unminted' | 'live' | 'burned' | 'no-live-copies';
109
+ /** 721 only — the current holder; `null` when `'unminted'` or `'burned'` (a destroyed token has
110
+ * no holder — the zero address is never written here, so this field never has to be read as a
111
+ * sentinel). Always `null` for an edition (an id can have many concurrent holders; see
112
+ * {@link holders}). */
75
113
  owner: Address | null;
76
114
  tokenURI: string | null;
77
115
  fields: MetadataField[];
78
116
  lockedFields: string[];
79
117
  /** Token-scope params (Params extension) — `seed`, PostParam values, … Absent/empty ⇒ none. */
80
118
  params?: ParamValue[];
119
+ /** ERC-1155 editions only — total live copies of this id (minted − burned), folded from
120
+ * `TransferSingle`/`TransferBatch`. Absent for a 721 token. */
121
+ supply?: string;
122
+ /**
123
+ * ERC-1155 editions only — this id's **effective** supply cap: its own override when one exists,
124
+ * otherwise the collection default ({@link ProjectState.defaultMaxSupply}). Absent for a 721
125
+ * token. Equals the on-chain `maxSupply(id)` view, and therefore its head-read twin
126
+ * (`TokenRow.maxSupply` in `tokens.ts`) — one field name, one meaning, whichever lane produced it.
127
+ *
128
+ * It used to fold `MaxSupplyUpdated` alone, which made the two lanes disagree on the DEFAULT
129
+ * shape: `--copies 10` sets the cap at `initialize` and never calls `setMaxSupply`, so no id had
130
+ * an event of its own and this read *absent* — "open, uncapped" — for every capped edition ever
131
+ * deployed. The head read said `10`. That is the sibling-drift class, on the field that decides
132
+ * whether a buy button renders.
133
+ *
134
+ * `'0'` carries the on-chain overload deliberately: **open** when {@link maxSupplyOverridden} is
135
+ * false, **closed forever** when it is true.
136
+ */
137
+ maxSupply?: string;
138
+ /** ERC-1155 editions only — has this id ever been explicitly overridden (`setMaxSupply`)? The
139
+ * distinction the on-chain getter cannot make and the log can, now that `DefaultMaxSupplySet`
140
+ * completes the log: it disambiguates a `'0'` cap (open vs deliberately closed) and tells you
141
+ * whether the monotonic never-increase rule is already in force for this id. Absent ⇒ false. */
142
+ maxSupplyOverridden?: boolean;
143
+ /** ERC-1155 editions only — current balances by holder address, folded from
144
+ * `TransferSingle`/`TransferBatch`. Zero balances are deleted, so a key's presence IS "holds
145
+ * at least one copy." Omitted/empty when unknown (a 721 token, or an edition with no folded
146
+ * history). Not chain-enumerable outside the event log — this is why {@link owner} can't
147
+ * simply generalize to "the current holders": a chain-only head read (no event scan) has no
148
+ * way to list them (see `tokens.ts`'s `listTokens`, which is exactly that head-read-only path
149
+ * and therefore never populates this field). */
150
+ holders?: Record<Address, string>;
81
151
  }
82
152
  /**
83
153
  * The full reconstructed state of an ABX project — rebuilt from the event log
@@ -102,16 +172,48 @@ export interface ProjectState {
102
172
  receiver: Address;
103
173
  bps: number;
104
174
  } | null;
175
+ /**
176
+ * The royalty **ceiling** — owner-set at deploy, reduce-only forever after, folded from
177
+ * `MaxRoyaltyBpsUpdated` (last-writer-wins, so a later `reduceMaxRoyaltyBps` beats the deploy-time
178
+ * value). Tri-state, and the third state carries weight: `null` means **the spine never stated
179
+ * one** — an implementation with no `maxRoyaltyBps()` at all — which is a different fact from a
180
+ * collection that published a ceiling of 1000. Never report a default for a ceiling the contract
181
+ * never published.
182
+ *
183
+ * Deliberately NOT nested inside {@link royalty}: clearing the royalty to `(0x0, 0)` sets that
184
+ * field to `null`, and the ceiling survives that on chain — nesting would drop a still-binding
185
+ * fact. Present them together in any readout, though: a rate without its ceiling is half the fact
186
+ * (a ceiling above the live rate means the owner can raise the rate unilaterally, and a buyer
187
+ * cannot see that from a listing — so reducing the cap to the current rate is what turns "5%
188
+ * today" into a promise).
189
+ */
190
+ maxRoyaltyBps?: number | null;
191
+ /**
192
+ * Did this collection opt into burning (`BurnConfigured`, emitted once at deploy and fixed
193
+ * thereafter)? Tri-state on the same rule as {@link maxRoyaltyBps}: `null` = the spine never
194
+ * stated it, which is not `false`. An implementation predating the opt-in has no `burn`
195
+ * entrypoint at all; a collection with `burnable: false` has one that refuses.
196
+ */
197
+ burnable?: boolean | null;
105
198
  tokenURIRenderer: Address | null;
106
199
  tokenURILocked: boolean | null;
107
200
  contractURIRenderer: Address | null;
108
201
  contractURILocked: boolean | null;
109
202
  collectionFields: MetadataField[];
110
203
  lockedCollectionFields: string[];
111
- /** Which concrete token type this is, inferred from the enabled extensions. */
112
- contractType?: '1of1' | 'series' | 'code';
204
+ /** Which concrete token type this is, inferred from the enabled extensions. The `-edition`
205
+ * suffix is the ERC-1155 family (detected via the Edition Supply extension), a parallel
206
+ * ladder to the ERC-721 one: `1of1-edition` ↔ `1of1`, `edition` ↔ `series`,
207
+ * `edition-code` ↔ `code`. */
208
+ contractType?: '1of1' | 'series' | 'code' | '1of1-edition' | 'edition' | 'edition-code';
113
209
  /** Supply cap "X of Y" (Max Invocations extension); null/absent ⇒ uncapped 1/1. */
114
210
  maxInvocations?: string | null;
211
+ /** ERC-1155 editions only — the collection-wide DEFAULT per-id cap (`editionSize` at
212
+ * `initialize`), folded from `DefaultMaxSupplySet`. `'0'` ⇒ open by default; null ⇒ not an
213
+ * edition. The 1155 analogue of {@link maxInvocations}: it is the project-level ceiling, while
214
+ * {@link TokenState.maxSupply} is a single id's. Every id that has never been overridden carries
215
+ * this, which is why the event exists — see `IAbxEditionSupply`. */
216
+ defaultMaxSupply?: string | null;
115
217
  /** The single authorized minter (External Minter extension); null ⇒ owner-only. */
116
218
  minter?: Address | null;
117
219
  /** Whether minting is paused (Paused extension) — true ⇒ owner-only. Absent/false ⇒ open. */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,OAAO,EAAE,GAAG,EAAC,MAAM,MAAM,CAAC;AAEvC,sFAAsF;AACtF,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,GAAG,CAAC;IACR,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,2FAA2F;AAC3F,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,GAAG,CAAC;IACX,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,6FAA6F;AAC7F,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,GAAG,CAAC;IACT,GAAG,EAAE,GAAG,CAAC;IACT,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,gEAAgE;AAChE,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,YAAY,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B;AAED,oFAAoF;AACpF,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,UAAU,GAAG,SAAS,CAAC;IACnC,GAAG,EAAE,GAAG,CAAC;IACT,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,sFAAsF;AACtF,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,OAAO,CAAC;IAChB;+EAC2E;IAC3E,MAAM,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;CACrB;AAED,mFAAmF;AACnF,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,cAAc,EAAE,CAAC;IACvB,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACzB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,uEAAuE;AACvE,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,GAAG,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,+FAA+F;IAC/F,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;CACvB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAGhB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAG5B,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAC,GAAG,IAAI,CAAC;IAKjD,gBAAgB,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/B,mBAAmB,EAAE,OAAO,GAAG,IAAI,CAAC;IACpC,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;IAGlC,gBAAgB,EAAE,aAAa,EAAE,CAAC;IAClC,sBAAsB,EAAE,MAAM,EAAE,CAAC;IAGjC,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC1C,mFAAmF;IACnF,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IACxB,6FAA6F;IAC7F,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,8EAA8E;IAC9E,YAAY,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAG9B,gDAAgD;IAChD,cAAc,CAAC,EAAE,UAAU,EAAE,CAAC;IAC9B,uFAAuF;IACvF,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,iFAAiF;IACjF,UAAU,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC/B;8FAC0F;IAC1F,gBAAgB,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAClC,+EAA+E;IAC/E,UAAU,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,oFAAoF;IACpF,MAAM,CAAC,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,oFAAoF;IACpF,YAAY,CAAC,EAAE,iBAAiB,GAAG,IAAI,CAAC;IAExC,UAAU,EAAE,aAAa,EAAE,CAAC;IAC5B,MAAM,EAAE,UAAU,EAAE,CAAC;IAGrB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/util.d.ts ADDED
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Small, environment-neutral helpers shared across the SDK core. Nothing here imports
3
+ * `node:*` or references a Node-only global (`Buffer`, `process` unguarded) — this module
4
+ * is reachable from the browser bundle (see `test/browser-bundle.test.ts`), so it has to
5
+ * run identically wherever a caller (Node, a bundler, a browser tab) loads it.
6
+ */
7
+ import type { Address, PublicClient } from 'viem';
8
+ /** `process.env[name]`, or `undefined` — safe to call even where `process` doesn't exist
9
+ * (a browser bundle). The SDK core never assumes Node; a host (the CLI, the effects
10
+ * runner) is where `process.env` is actually meaningful. */
11
+ export declare function readEnv(name: string): string | undefined;
12
+ /** Wait `ms` milliseconds. The one place the SDK debounces/retries, so every caller shares
13
+ * the same primitive instead of re-declaring `new Promise((r) => setTimeout(r, ms))`. */
14
+ export declare function sleep(ms: number): Promise<void>;
15
+ /** The delay before retry `attempt` (1-indexed) under a LINEAR backoff: `attempt * baseMs`.
16
+ * Matches the shape `service.ts`'s request ladder already used (`retryDelayMs * attempt`) —
17
+ * pulled out here so every linear-backoff retry loop (the service client, the effects
18
+ * runner's resolver poll) computes the same delay the same way. */
19
+ export declare function linearBackoffDelay(attempt: number, baseMs: number): number;
20
+ /**
21
+ * The delay before retry `attempt` (1-indexed) under an EXPONENTIAL backoff, capped:
22
+ * `min(baseMs * 2^(attempt-1), capMs)`. Attempt 1 waits `baseMs`, attempt 2 waits `2*baseMs`,
23
+ * attempt 3 `4*baseMs`, and so on until the cap takes over.
24
+ *
25
+ * Prefer this over {@link linearBackoffDelay} for a SUSTAINED rate limit or an overloaded
26
+ * upstream, where a caller wants each retry to back off faster than the last so a burst of
27
+ * callers doesn't keep landing on the same wall-clock second (linear backoff's delays grow by a
28
+ * constant step, which under sustained pressure just re-synchronizes the retry storm at a lower
29
+ * frequency instead of spreading it out). Prefer `linearBackoffDelay` for a transient/one-off
30
+ * failure (a dropped connection, a single flaky read) where the retry ladder just needs to not
31
+ * hammer immediately — exponential growth there overshoots into multi-minute waits for what was
32
+ * likely a one-time blip.
33
+ */
34
+ export declare function exponentialBackoffDelay(attempt: number, baseMs: number, capMs: number): number;
35
+ /**
36
+ * A parsed `data:` URI (RFC 2397) — the most permissive of the three ad hoc parses this
37
+ * replaces (a bare `data:,...`, a `;base64` flag anywhere in the parameter list, and an
38
+ * arbitrary `;charset=...` alongside it). `mime` is empty-string-normalized to `text/plain`
39
+ * (RFC 2397's own default); `body` is returned VERBATIM — still percent-encoded for a
40
+ * non-base64 URI, still base64 text for one that is — so the caller decodes it exactly the
41
+ * way it always did (`decodeURIComponent` vs a base64 decode).
42
+ */
43
+ export interface ParsedDataUri {
44
+ mime: string;
45
+ base64: boolean;
46
+ body: string;
47
+ }
48
+ /** Parse a `data:` URI, or `null` if `uri` isn't one. */
49
+ export declare function parseDataUri(uri: string): ParsedDataUri | null;
50
+ /**
51
+ * Read a contract, swallowing any failure ("no data" from a codeless address, a revert on
52
+ * an extension the target doesn't compose) into `undefined` rather than a throw — the shape
53
+ * every "does this getter exist / is there even a contract here" caller wants. Replaces the
54
+ * three near-identical try/catch wrappers this SDK's callers each hand-rolled (a resume
55
+ * planner's field-by-field read, a state dump's per-getter read, an owner-op's diagnostic
56
+ * read) with one implementation.
57
+ *
58
+ * A caller that wants to DISTINGUISH "no contract at all" from "contract exists but this
59
+ * call reverted" (the CLI's `assertContractExists` diagnostic) still does that itself — this
60
+ * helper only knows "did the read come back", not why it didn't.
61
+ */
62
+ export declare function tryReadContract<T>(client: PublicClient, args: {
63
+ address: Address;
64
+ abi: readonly unknown[];
65
+ functionName: string;
66
+ args?: readonly unknown[];
67
+ }): Promise<T | undefined>;
68
+ /** Bytes → base64 (RFC 4648). No `Buffer`, no `btoa` — both are runtime-conditional (Node
69
+ * lacks the latter, and a stricter embedder than a browser can lack the former too), and the
70
+ * SDK core needs exactly one behavior everywhere it runs. */
71
+ export declare function bytesToBase64(bytes: Uint8Array): string;
72
+ /** base64 → bytes — the inverse of {@link bytesToBase64}. */
73
+ export declare function base64ToBytes(b64: string): Uint8Array;
74
+ //# sourceMappingURL=util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAC,OAAO,EAAE,YAAY,EAAC,MAAM,MAAM,CAAC;AAEhD;;6DAE6D;AAC7D,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGxD;AAED;0FAC0F;AAC1F,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/C;AAED;;;oEAGoE;AACpE,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1E;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9F;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAID,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAS9D;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,EAAE,SAAS,OAAO,EAAE,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAA;CAAC,GACjG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC,CAMxB;AAID;;8DAE8D;AAC9D,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAYvD;AAED,6DAA6D;AAC7D,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAcrD"}