@secondlayer/sdk 6.41.0 → 6.42.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.
@@ -0,0 +1,356 @@
1
+ import { StreamsEventType } from "@secondlayer/shared";
2
+ /** A Clarity value as Streams serves it: the canonical hex string, a typed
3
+ * object carrying that hex (`{ hex }`), or a decoded Clarity-JSON object.
4
+ * Decode helpers (`decodeNftTransfer`, etc.) resolve it to a concrete value. */
5
+ type StreamsClarityValue = string | {
6
+ hex: string
7
+ } | Record<string, unknown>;
8
+ type StxTransferPayload = {
9
+ sender: string
10
+ recipient: string
11
+ amount: string
12
+ memo?: string
13
+ };
14
+ type StxMintPayload = {
15
+ recipient: string
16
+ amount: string
17
+ };
18
+ type StxBurnPayload = {
19
+ sender: string
20
+ amount: string
21
+ };
22
+ type StxLockPayload = {
23
+ locked_address: string
24
+ locked_amount: string
25
+ unlock_height: string
26
+ };
27
+ type FtTransferPayload = {
28
+ asset_identifier: string
29
+ sender: string
30
+ recipient: string
31
+ amount: string
32
+ };
33
+ type FtMintPayload = {
34
+ asset_identifier: string
35
+ recipient: string
36
+ amount: string
37
+ };
38
+ type FtBurnPayload = {
39
+ asset_identifier: string
40
+ sender: string
41
+ amount: string
42
+ };
43
+ type NftTransferPayload = {
44
+ asset_identifier: string
45
+ sender: string
46
+ recipient: string
47
+ value: StreamsClarityValue
48
+ /** Canonical serialized hex of `value`, when the stream carries it. */
49
+ raw_value?: string
50
+ };
51
+ type NftMintPayload = {
52
+ asset_identifier: string
53
+ recipient: string
54
+ value: StreamsClarityValue
55
+ raw_value?: string
56
+ };
57
+ type NftBurnPayload = {
58
+ asset_identifier: string
59
+ sender: string
60
+ value: StreamsClarityValue
61
+ raw_value?: string
62
+ };
63
+ type PrintPayload = {
64
+ contract_id?: string | null
65
+ topic?: string
66
+ value?: unknown
67
+ raw_value?: string
68
+ };
69
+ type StreamsEventBase = {
70
+ /**
71
+ * Globally unique, monotonic position of this event (`<block>:<index>`). Use
72
+ * it as the primary key of your projection rows — replaying a batch then
73
+ * upserts cleanly. Don't synthesize your own id from `tx_id`/`event_index`.
74
+ */
75
+ cursor: string
76
+ block_height: number
77
+ block_hash: string
78
+ burn_block_height: number
79
+ tx_id: string
80
+ tx_index: number
81
+ event_index: number
82
+ contract_id: string | null
83
+ ts: string
84
+ /**
85
+ * True when this event's block is past the finality boundary (immutable).
86
+ * Optional for back-compat; the API always sets it on Streams responses.
87
+ */
88
+ finalized?: boolean
89
+ /**
90
+ * Labels whose filter group this event satisfied, present only when the
91
+ * request used a labelled `filters` map. The SDK dispatches on it for you
92
+ * (`on.<label>`), so handlers rarely read it directly.
93
+ */
94
+ matched?: string[]
95
+ };
96
+ type StreamsEventOf<
97
+ T extends StreamsEventType,
98
+ P
99
+ > = StreamsEventBase & {
100
+ event_type: T
101
+ payload: P
102
+ };
103
+ /** A raw Streams event. Discriminated on `event_type`, so `event.payload`
104
+ * narrows to the matching payload shape once the type is checked. */
105
+ type StreamsEvent = StreamsEventOf<"stx_transfer", StxTransferPayload> | StreamsEventOf<"stx_mint", StxMintPayload> | StreamsEventOf<"stx_burn", StxBurnPayload> | StreamsEventOf<"stx_lock", StxLockPayload> | StreamsEventOf<"ft_transfer", FtTransferPayload> | StreamsEventOf<"ft_mint", FtMintPayload> | StreamsEventOf<"ft_burn", FtBurnPayload> | StreamsEventOf<"nft_transfer", NftTransferPayload> | StreamsEventOf<"nft_mint", NftMintPayload> | StreamsEventOf<"nft_burn", NftBurnPayload> | StreamsEventOf<"print", PrintPayload>;
106
+ type FtTransferEvent = Extract<StreamsEvent, {
107
+ event_type: "ft_transfer"
108
+ }>;
109
+ type DecodedFtTransferPayload = {
110
+ asset_identifier: string
111
+ contract_id: string
112
+ token_name: string | null
113
+ sender: string
114
+ recipient: string
115
+ amount: string
116
+ };
117
+ type DecodedFtTransfer = {
118
+ cursor: string
119
+ block_height: number
120
+ tx_id: string
121
+ tx_index: number
122
+ event_index: number
123
+ event_type: "ft_transfer"
124
+ decoded_payload: DecodedFtTransferPayload
125
+ source_cursor: string
126
+ };
127
+ declare function isFtTransfer(event: StreamsEvent): event is FtTransferEvent;
128
+ declare function decodeFtTransfer(event: StreamsEvent): DecodedFtTransfer;
129
+ type NftTransferEvent = Extract<StreamsEvent, {
130
+ event_type: "nft_transfer"
131
+ }>;
132
+ type DecodedNftTransferPayload = {
133
+ asset_identifier: string
134
+ contract_id: string
135
+ token_name: string | null
136
+ sender: string
137
+ recipient: string
138
+ value: string
139
+ };
140
+ type DecodedNftTransfer = {
141
+ cursor: string
142
+ block_height: number
143
+ tx_id: string
144
+ tx_index: number
145
+ event_index: number
146
+ event_type: "nft_transfer"
147
+ decoded_payload: DecodedNftTransferPayload
148
+ source_cursor: string
149
+ };
150
+ declare function isNftTransfer(event: StreamsEvent): event is NftTransferEvent;
151
+ declare function decodeNftTransfer(event: StreamsEvent): DecodedNftTransfer;
152
+ type DecodedStxTransferPayload = {
153
+ sender: string
154
+ recipient: string
155
+ amount: string
156
+ memo: string | null
157
+ };
158
+ type DecodedStxTransfer = {
159
+ cursor: string
160
+ block_height: number
161
+ tx_id: string
162
+ tx_index: number
163
+ event_index: number
164
+ event_type: "stx_transfer"
165
+ decoded_payload: DecodedStxTransferPayload
166
+ source_cursor: string
167
+ };
168
+ type DecodedStxMintPayload = {
169
+ recipient: string
170
+ amount: string
171
+ };
172
+ type DecodedStxMint = {
173
+ cursor: string
174
+ block_height: number
175
+ tx_id: string
176
+ tx_index: number
177
+ event_index: number
178
+ event_type: "stx_mint"
179
+ decoded_payload: DecodedStxMintPayload
180
+ source_cursor: string
181
+ };
182
+ type DecodedStxBurnPayload = {
183
+ sender: string
184
+ amount: string
185
+ };
186
+ type DecodedStxBurn = {
187
+ cursor: string
188
+ block_height: number
189
+ tx_id: string
190
+ tx_index: number
191
+ event_index: number
192
+ event_type: "stx_burn"
193
+ decoded_payload: DecodedStxBurnPayload
194
+ source_cursor: string
195
+ };
196
+ declare function isStxTransfer(event: StreamsEvent): event is StreamsEvent & {
197
+ event_type: "stx_transfer"
198
+ };
199
+ declare function decodeStxTransfer(event: StreamsEvent): DecodedStxTransfer;
200
+ declare function isStxMint(event: StreamsEvent): event is StreamsEvent & {
201
+ event_type: "stx_mint"
202
+ };
203
+ declare function decodeStxMint(event: StreamsEvent): DecodedStxMint;
204
+ declare function isStxBurn(event: StreamsEvent): event is StreamsEvent & {
205
+ event_type: "stx_burn"
206
+ };
207
+ declare function decodeStxBurn(event: StreamsEvent): DecodedStxBurn;
208
+ type DecodedStxLockPayload = {
209
+ sender: string
210
+ amount: string
211
+ payload: {
212
+ unlock_height: string | null
213
+ }
214
+ };
215
+ type DecodedStxLock = {
216
+ cursor: string
217
+ block_height: number
218
+ tx_id: string
219
+ tx_index: number
220
+ event_index: number
221
+ event_type: "stx_lock"
222
+ decoded_payload: DecodedStxLockPayload
223
+ source_cursor: string
224
+ };
225
+ declare function isStxLock(event: StreamsEvent): event is StreamsEvent & {
226
+ event_type: "stx_lock"
227
+ };
228
+ declare function decodeStxLock(event: StreamsEvent): DecodedStxLock;
229
+ type DecodedFtMintPayload = {
230
+ asset_identifier: string
231
+ contract_id: string
232
+ token_name: string | null
233
+ recipient: string
234
+ amount: string
235
+ };
236
+ type DecodedFtMint = {
237
+ cursor: string
238
+ block_height: number
239
+ tx_id: string
240
+ tx_index: number
241
+ event_index: number
242
+ event_type: "ft_mint"
243
+ decoded_payload: DecodedFtMintPayload
244
+ source_cursor: string
245
+ };
246
+ type DecodedFtBurnPayload = {
247
+ asset_identifier: string
248
+ contract_id: string
249
+ token_name: string | null
250
+ sender: string
251
+ amount: string
252
+ };
253
+ type DecodedFtBurn = {
254
+ cursor: string
255
+ block_height: number
256
+ tx_id: string
257
+ tx_index: number
258
+ event_index: number
259
+ event_type: "ft_burn"
260
+ decoded_payload: DecodedFtBurnPayload
261
+ source_cursor: string
262
+ };
263
+ type DecodedNftMintPayload = {
264
+ asset_identifier: string
265
+ contract_id: string
266
+ token_name: string | null
267
+ recipient: string
268
+ value: string
269
+ };
270
+ type DecodedNftMint = {
271
+ cursor: string
272
+ block_height: number
273
+ tx_id: string
274
+ tx_index: number
275
+ event_index: number
276
+ event_type: "nft_mint"
277
+ decoded_payload: DecodedNftMintPayload
278
+ source_cursor: string
279
+ };
280
+ type DecodedNftBurnPayload = {
281
+ asset_identifier: string
282
+ contract_id: string
283
+ token_name: string | null
284
+ sender: string
285
+ value: string
286
+ };
287
+ type DecodedNftBurn = {
288
+ cursor: string
289
+ block_height: number
290
+ tx_id: string
291
+ tx_index: number
292
+ event_index: number
293
+ event_type: "nft_burn"
294
+ decoded_payload: DecodedNftBurnPayload
295
+ source_cursor: string
296
+ };
297
+ declare function isFtMint(event: StreamsEvent): event is StreamsEvent & {
298
+ event_type: "ft_mint"
299
+ };
300
+ declare function decodeFtMint(event: StreamsEvent): DecodedFtMint;
301
+ declare function isFtBurn(event: StreamsEvent): event is StreamsEvent & {
302
+ event_type: "ft_burn"
303
+ };
304
+ declare function decodeFtBurn(event: StreamsEvent): DecodedFtBurn;
305
+ declare function isNftMint(event: StreamsEvent): event is StreamsEvent & {
306
+ event_type: "nft_mint"
307
+ };
308
+ declare function decodeNftMint(event: StreamsEvent): DecodedNftMint;
309
+ declare function isNftBurn(event: StreamsEvent): event is StreamsEvent & {
310
+ event_type: "nft_burn"
311
+ };
312
+ declare function decodeNftBurn(event: StreamsEvent): DecodedNftBurn;
313
+ /** Decoded form of a Clarity `print` event:
314
+ * - `topic`: the print topic, when the contract emits a `{ topic, ... }` tuple
315
+ * - `value`: the Clarity value decoded to JSON (uints as strings, buffers as
316
+ * `0x…` hex, tuples as objects)
317
+ * - `raw_value`: the canonical serialized hex, for byte-exact consumers */
318
+ type DecodedPrintValue = {
319
+ topic: string | null
320
+ value: unknown
321
+ raw_value: string | null
322
+ };
323
+ type DecodedPrintPayload = {
324
+ contract_id: string | null
325
+ payload: DecodedPrintValue
326
+ };
327
+ type DecodedPrint = {
328
+ cursor: string
329
+ block_height: number
330
+ tx_id: string
331
+ tx_index: number
332
+ event_index: number
333
+ event_type: "print"
334
+ decoded_payload: DecodedPrintPayload
335
+ source_cursor: string
336
+ };
337
+ declare function isPrint(event: StreamsEvent): event is StreamsEvent & {
338
+ event_type: "print"
339
+ };
340
+ declare function decodePrint(event: StreamsEvent): DecodedPrint;
341
+ /** Superset of the columns the decoded_events table holds. Every decoded
342
+ * event's `decoded_payload` is assignable to this, so the indexer's writer
343
+ * can map columns generically instead of per-event-type. */
344
+ type DecodedEventColumns = {
345
+ contract_id?: string | null
346
+ asset_identifier?: string | null
347
+ sender?: string | null
348
+ recipient?: string | null
349
+ amount?: string | null
350
+ value?: string | null
351
+ memo?: string | null
352
+ /** JSONB overflow for non-flat types (e.g. print's decoded value). */
353
+ payload?: unknown
354
+ };
355
+ type DecodedEventRow = DecodedFtTransfer | DecodedNftTransfer | DecodedStxTransfer | DecodedStxMint | DecodedStxBurn | DecodedStxLock | DecodedFtMint | DecodedFtBurn | DecodedNftMint | DecodedNftBurn | DecodedPrint;
356
+ export { isStxTransfer, isStxMint, isStxLock, isStxBurn, isPrint, isNftTransfer, isNftMint, isNftBurn, isFtTransfer, isFtMint, isFtBurn, decodeStxTransfer, decodeStxMint, decodeStxLock, decodeStxBurn, decodePrint, decodeNftTransfer, decodeNftMint, decodeNftBurn, decodeFtTransfer, decodeFtMint, decodeFtBurn, DecodedStxTransfer, DecodedStxMint, DecodedStxLock, DecodedStxBurn, DecodedPrintPayload, DecodedPrint, DecodedNftTransferPayload, DecodedNftTransfer, DecodedNftMint, DecodedNftBurn, DecodedFtTransferPayload, DecodedFtTransfer, DecodedFtMint, DecodedFtBurn, DecodedEventRow, DecodedEventColumns };
@@ -0,0 +1,306 @@
1
+ // src/streams/_payload.ts
2
+ function requireString(payload, field, eventType) {
3
+ const value = payload[field];
4
+ if (typeof value !== "string" || value.length === 0) {
5
+ throw new Error(`${eventType} payload missing ${field}`);
6
+ }
7
+ return value;
8
+ }
9
+ function optionalString(value) {
10
+ return typeof value === "string" && value.length > 0 ? value : null;
11
+ }
12
+ function requireAmountField(payload, field, eventType) {
13
+ const amount = requireString(payload, field, eventType);
14
+ if (!/^(0|[1-9]\d*)$/.test(amount)) {
15
+ throw new Error(`${eventType} payload has malformed ${field}`);
16
+ }
17
+ return amount;
18
+ }
19
+ function requireAmount(payload, eventType) {
20
+ return requireAmountField(payload, "amount", eventType);
21
+ }
22
+ function parseAssetIdentifier(assetIdentifier, eventType) {
23
+ const [contractId, tokenName] = assetIdentifier.split("::");
24
+ if (!contractId) {
25
+ throw new Error(`${eventType} payload has malformed asset_identifier`);
26
+ }
27
+ return {
28
+ contract_id: contractId,
29
+ token_name: tokenName && tokenName.length > 0 ? tokenName : null
30
+ };
31
+ }
32
+ function requireHexValue(payload, eventType) {
33
+ const rawValue = payload.raw_value;
34
+ if (typeof rawValue === "string") {
35
+ if (!/^0x[0-9a-fA-F]*$/.test(rawValue)) {
36
+ throw new Error(`${eventType} payload has malformed value`);
37
+ }
38
+ return rawValue;
39
+ }
40
+ const value = payload.value;
41
+ const hex = typeof value === "string" ? value : value && typeof value === "object" && typeof value.hex === "string" ? value.hex : null;
42
+ if (!hex) {
43
+ throw new Error(`${eventType} payload missing value`);
44
+ }
45
+ if (!/^0x[0-9a-fA-F]*$/.test(hex)) {
46
+ throw new Error(`${eventType} payload has malformed value`);
47
+ }
48
+ return hex;
49
+ }
50
+ function decodedRow(event, eventType, decoded_payload) {
51
+ return {
52
+ cursor: event.cursor,
53
+ block_height: event.block_height,
54
+ tx_id: event.tx_id,
55
+ tx_index: event.tx_index,
56
+ event_index: event.event_index,
57
+ event_type: eventType,
58
+ decoded_payload,
59
+ source_cursor: event.cursor
60
+ };
61
+ }
62
+
63
+ // src/streams/ft-transfer.ts
64
+ function isFtTransfer(event) {
65
+ return event.event_type === "ft_transfer";
66
+ }
67
+ function decodeFtTransfer(event) {
68
+ if (!isFtTransfer(event)) {
69
+ throw new Error(`Expected ft_transfer event, got ${event.event_type}`);
70
+ }
71
+ const payload = event.payload;
72
+ const assetIdentifier = requireString(payload, "asset_identifier", "ft_transfer");
73
+ const sender = requireString(payload, "sender", "ft_transfer");
74
+ const recipient = requireString(payload, "recipient", "ft_transfer");
75
+ const amount = requireAmount(payload, "ft_transfer");
76
+ const { contract_id, token_name } = parseAssetIdentifier(assetIdentifier, "ft_transfer");
77
+ return decodedRow(event, "ft_transfer", {
78
+ asset_identifier: assetIdentifier,
79
+ contract_id: event.contract_id ?? contract_id,
80
+ token_name,
81
+ sender,
82
+ recipient,
83
+ amount
84
+ });
85
+ }
86
+ // src/streams/nft-transfer.ts
87
+ function isNftTransfer(event) {
88
+ return event.event_type === "nft_transfer";
89
+ }
90
+ function decodeNftTransfer(event) {
91
+ if (!isNftTransfer(event)) {
92
+ throw new Error(`Expected nft_transfer event, got ${event.event_type}`);
93
+ }
94
+ const payload = event.payload;
95
+ const assetIdentifier = requireString(payload, "asset_identifier", "nft_transfer");
96
+ const sender = requireString(payload, "sender", "nft_transfer");
97
+ const recipient = requireString(payload, "recipient", "nft_transfer");
98
+ const value = requireHexValue(payload, "nft_transfer");
99
+ const { contract_id, token_name } = parseAssetIdentifier(assetIdentifier, "nft_transfer");
100
+ return decodedRow(event, "nft_transfer", {
101
+ asset_identifier: assetIdentifier,
102
+ contract_id: event.contract_id ?? contract_id,
103
+ token_name,
104
+ sender,
105
+ recipient,
106
+ value
107
+ });
108
+ }
109
+ // src/clarity.ts
110
+ import { cvToValue, deserializeCV } from "@secondlayer/stacks/clarity";
111
+ function toJsonSafe(value) {
112
+ if (typeof value === "bigint")
113
+ return value.toString();
114
+ if (Array.isArray(value))
115
+ return value.map(toJsonSafe);
116
+ if (value && typeof value === "object") {
117
+ const out = {};
118
+ for (const [key, val] of Object.entries(value)) {
119
+ out[key] = toJsonSafe(val);
120
+ }
121
+ return out;
122
+ }
123
+ return value;
124
+ }
125
+ function decodeClarityValue(hex) {
126
+ try {
127
+ const clean = hex.startsWith("0x") ? hex.slice(2) : hex;
128
+ return toJsonSafe(cvToValue(deserializeCV(clean)));
129
+ } catch {
130
+ return hex;
131
+ }
132
+ }
133
+
134
+ // src/streams/print.ts
135
+ function printValueHex(payload) {
136
+ if (typeof payload.raw_value === "string")
137
+ return payload.raw_value;
138
+ const value = payload.value;
139
+ if (typeof value === "string" && value.startsWith("0x"))
140
+ return value;
141
+ if (value && typeof value === "object" && typeof value.hex === "string") {
142
+ return value.hex;
143
+ }
144
+ return null;
145
+ }
146
+ function isPrint(event) {
147
+ return event.event_type === "print";
148
+ }
149
+ function decodePrint(event) {
150
+ if (!isPrint(event)) {
151
+ throw new Error(`Expected print event, got ${event.event_type}`);
152
+ }
153
+ const payload = event.payload;
154
+ const topic = optionalString(payload.topic);
155
+ const rawValue = printValueHex(payload);
156
+ const value = rawValue ? decodeClarityValue(rawValue) : toJsonSafe(payload.value ?? null);
157
+ return decodedRow(event, "print", {
158
+ contract_id: event.contract_id ?? optionalString(payload.contract_id),
159
+ payload: { topic, value, raw_value: rawValue }
160
+ });
161
+ }
162
+ // src/streams/stx-events.ts
163
+ function isStxTransfer(event) {
164
+ return event.event_type === "stx_transfer";
165
+ }
166
+ function decodeStxTransfer(event) {
167
+ if (!isStxTransfer(event)) {
168
+ throw new Error(`Expected stx_transfer event, got ${event.event_type}`);
169
+ }
170
+ const payload = event.payload;
171
+ return decodedRow(event, "stx_transfer", {
172
+ sender: requireString(payload, "sender", "stx_transfer"),
173
+ recipient: requireString(payload, "recipient", "stx_transfer"),
174
+ amount: requireAmount(payload, "stx_transfer"),
175
+ memo: optionalString(payload.memo)
176
+ });
177
+ }
178
+ function isStxMint(event) {
179
+ return event.event_type === "stx_mint";
180
+ }
181
+ function decodeStxMint(event) {
182
+ if (!isStxMint(event)) {
183
+ throw new Error(`Expected stx_mint event, got ${event.event_type}`);
184
+ }
185
+ const payload = event.payload;
186
+ return decodedRow(event, "stx_mint", {
187
+ recipient: requireString(payload, "recipient", "stx_mint"),
188
+ amount: requireAmount(payload, "stx_mint")
189
+ });
190
+ }
191
+ function isStxBurn(event) {
192
+ return event.event_type === "stx_burn";
193
+ }
194
+ function decodeStxBurn(event) {
195
+ if (!isStxBurn(event)) {
196
+ throw new Error(`Expected stx_burn event, got ${event.event_type}`);
197
+ }
198
+ const payload = event.payload;
199
+ return decodedRow(event, "stx_burn", {
200
+ sender: requireString(payload, "sender", "stx_burn"),
201
+ amount: requireAmount(payload, "stx_burn")
202
+ });
203
+ }
204
+ function isStxLock(event) {
205
+ return event.event_type === "stx_lock";
206
+ }
207
+ function decodeStxLock(event) {
208
+ if (!isStxLock(event)) {
209
+ throw new Error(`Expected stx_lock event, got ${event.event_type}`);
210
+ }
211
+ const payload = event.payload;
212
+ return decodedRow(event, "stx_lock", {
213
+ sender: requireString(payload, "locked_address", "stx_lock"),
214
+ amount: requireAmountField(payload, "locked_amount", "stx_lock"),
215
+ payload: { unlock_height: optionalString(payload.unlock_height) }
216
+ });
217
+ }
218
+ // src/streams/token-mint-burn.ts
219
+ function assetFields(event, eventType) {
220
+ const assetIdentifier = requireString(event.payload, "asset_identifier", eventType);
221
+ const { contract_id, token_name } = parseAssetIdentifier(assetIdentifier, eventType);
222
+ return {
223
+ asset_identifier: assetIdentifier,
224
+ contract_id: event.contract_id ?? contract_id,
225
+ token_name
226
+ };
227
+ }
228
+ function isFtMint(event) {
229
+ return event.event_type === "ft_mint";
230
+ }
231
+ function decodeFtMint(event) {
232
+ if (!isFtMint(event)) {
233
+ throw new Error(`Expected ft_mint event, got ${event.event_type}`);
234
+ }
235
+ return decodedRow(event, "ft_mint", {
236
+ ...assetFields(event, "ft_mint"),
237
+ recipient: requireString(event.payload, "recipient", "ft_mint"),
238
+ amount: requireAmount(event.payload, "ft_mint")
239
+ });
240
+ }
241
+ function isFtBurn(event) {
242
+ return event.event_type === "ft_burn";
243
+ }
244
+ function decodeFtBurn(event) {
245
+ if (!isFtBurn(event)) {
246
+ throw new Error(`Expected ft_burn event, got ${event.event_type}`);
247
+ }
248
+ return decodedRow(event, "ft_burn", {
249
+ ...assetFields(event, "ft_burn"),
250
+ sender: requireString(event.payload, "sender", "ft_burn"),
251
+ amount: requireAmount(event.payload, "ft_burn")
252
+ });
253
+ }
254
+ function isNftMint(event) {
255
+ return event.event_type === "nft_mint";
256
+ }
257
+ function decodeNftMint(event) {
258
+ if (!isNftMint(event)) {
259
+ throw new Error(`Expected nft_mint event, got ${event.event_type}`);
260
+ }
261
+ return decodedRow(event, "nft_mint", {
262
+ ...assetFields(event, "nft_mint"),
263
+ recipient: requireString(event.payload, "recipient", "nft_mint"),
264
+ value: requireHexValue(event.payload, "nft_mint")
265
+ });
266
+ }
267
+ function isNftBurn(event) {
268
+ return event.event_type === "nft_burn";
269
+ }
270
+ function decodeNftBurn(event) {
271
+ if (!isNftBurn(event)) {
272
+ throw new Error(`Expected nft_burn event, got ${event.event_type}`);
273
+ }
274
+ return decodedRow(event, "nft_burn", {
275
+ ...assetFields(event, "nft_burn"),
276
+ sender: requireString(event.payload, "sender", "nft_burn"),
277
+ value: requireHexValue(event.payload, "nft_burn")
278
+ });
279
+ }
280
+ export {
281
+ isStxTransfer,
282
+ isStxMint,
283
+ isStxLock,
284
+ isStxBurn,
285
+ isPrint,
286
+ isNftTransfer,
287
+ isNftMint,
288
+ isNftBurn,
289
+ isFtTransfer,
290
+ isFtMint,
291
+ isFtBurn,
292
+ decodeStxTransfer,
293
+ decodeStxMint,
294
+ decodeStxLock,
295
+ decodeStxBurn,
296
+ decodePrint,
297
+ decodeNftTransfer,
298
+ decodeNftMint,
299
+ decodeNftBurn,
300
+ decodeFtTransfer,
301
+ decodeFtMint,
302
+ decodeFtBurn
303
+ };
304
+
305
+ //# debugId=1AF7A1B9E39F783164756E2164756E21
306
+ //# sourceMappingURL=rows.js.map
@@ -0,0 +1,16 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/streams/_payload.ts", "../src/streams/ft-transfer.ts", "../src/streams/nft-transfer.ts", "../src/clarity.ts", "../src/streams/print.ts", "../src/streams/stx-events.ts", "../src/streams/token-mint-burn.ts"],
4
+ "sourcesContent": [
5
+ "import type { StreamsEvent } from \"./types.ts\";\n\n/** Superset of the columns the decoded_events table holds. Every decoded\n * event's `decoded_payload` is assignable to this, so the indexer's writer\n * can map columns generically instead of per-event-type. */\nexport type DecodedEventColumns = {\n\tcontract_id?: string | null;\n\tasset_identifier?: string | null;\n\tsender?: string | null;\n\trecipient?: string | null;\n\tamount?: string | null;\n\tvalue?: string | null;\n\tmemo?: string | null;\n\t/** JSONB overflow for non-flat types (e.g. print's decoded value). */\n\tpayload?: unknown;\n};\n\nexport function requireString(\n\tpayload: Record<string, unknown>,\n\tfield: string,\n\teventType: string,\n): string {\n\tconst value = payload[field];\n\tif (typeof value !== \"string\" || value.length === 0) {\n\t\tthrow new Error(`${eventType} payload missing ${field}`);\n\t}\n\treturn value;\n}\n\nexport function optionalString(value: unknown): string | null {\n\treturn typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nexport function requireAmountField(\n\tpayload: Record<string, unknown>,\n\tfield: string,\n\teventType: string,\n): string {\n\tconst amount = requireString(payload, field, eventType);\n\tif (!/^(0|[1-9]\\d*)$/.test(amount)) {\n\t\tthrow new Error(`${eventType} payload has malformed ${field}`);\n\t}\n\treturn amount;\n}\n\nexport function requireAmount(\n\tpayload: Record<string, unknown>,\n\teventType: string,\n): string {\n\treturn requireAmountField(payload, \"amount\", eventType);\n}\n\nexport function parseAssetIdentifier(\n\tassetIdentifier: string,\n\teventType: string,\n): { contract_id: string; token_name: string | null } {\n\tconst [contractId, tokenName] = assetIdentifier.split(\"::\");\n\tif (!contractId) {\n\t\tthrow new Error(`${eventType} payload has malformed asset_identifier`);\n\t}\n\treturn {\n\t\tcontract_id: contractId,\n\t\ttoken_name: tokenName && tokenName.length > 0 ? tokenName : null,\n\t};\n}\n\n/** NFT token id: live streams emits a typed Clarity value at `value` and the\n * canonical hex at `raw_value`; prefer raw_value when present. */\nexport function requireHexValue(\n\tpayload: Record<string, unknown>,\n\teventType: string,\n): string {\n\tconst rawValue = payload.raw_value;\n\tif (typeof rawValue === \"string\") {\n\t\tif (!/^0x[0-9a-fA-F]*$/.test(rawValue)) {\n\t\t\tthrow new Error(`${eventType} payload has malformed value`);\n\t\t}\n\t\treturn rawValue;\n\t}\n\n\tconst value = payload.value;\n\tconst hex =\n\t\ttypeof value === \"string\"\n\t\t\t? value\n\t\t\t: value &&\n\t\t\t\t\ttypeof value === \"object\" &&\n\t\t\t\t\ttypeof (value as { hex?: unknown }).hex === \"string\"\n\t\t\t\t? (value as { hex: string }).hex\n\t\t\t\t: null;\n\n\tif (!hex) {\n\t\tthrow new Error(`${eventType} payload missing value`);\n\t}\n\tif (!/^0x[0-9a-fA-F]*$/.test(hex)) {\n\t\tthrow new Error(`${eventType} payload has malformed value`);\n\t}\n\treturn hex;\n}\n\n/** Common envelope fields shared by every decoded event, lifted off the\n * source StreamsEvent. The decoder supplies event_type + decoded_payload. */\nexport function decodedRow<T extends string, P>(\n\tevent: StreamsEvent,\n\teventType: T,\n\tdecoded_payload: P,\n): {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: T;\n\tdecoded_payload: P;\n\tsource_cursor: string;\n} {\n\treturn {\n\t\tcursor: event.cursor,\n\t\tblock_height: event.block_height,\n\t\ttx_id: event.tx_id,\n\t\ttx_index: event.tx_index,\n\t\tevent_index: event.event_index,\n\t\tevent_type: eventType,\n\t\tdecoded_payload,\n\t\tsource_cursor: event.cursor,\n\t};\n}\n",
6
+ "import {\n\tdecodedRow,\n\tparseAssetIdentifier,\n\trequireAmount,\n\trequireString,\n} from \"./_payload.ts\";\nimport type { StreamsEvent } from \"./types.ts\";\n\nexport type { FtTransferPayload } from \"./types.ts\";\n\nexport type FtTransferEvent = Extract<\n\tStreamsEvent,\n\t{ event_type: \"ft_transfer\" }\n>;\n\nexport type DecodedFtTransferPayload = {\n\tasset_identifier: string;\n\tcontract_id: string;\n\ttoken_name: string | null;\n\tsender: string;\n\trecipient: string;\n\tamount: string;\n};\n\nexport type DecodedFtTransfer = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"ft_transfer\";\n\tdecoded_payload: DecodedFtTransferPayload;\n\tsource_cursor: string;\n};\n\nexport function isFtTransfer(event: StreamsEvent): event is FtTransferEvent {\n\treturn event.event_type === \"ft_transfer\";\n}\n\nexport function decodeFtTransfer(event: StreamsEvent): DecodedFtTransfer {\n\tif (!isFtTransfer(event)) {\n\t\tthrow new Error(`Expected ft_transfer event, got ${event.event_type}`);\n\t}\n\n\tconst payload = event.payload;\n\tconst assetIdentifier = requireString(\n\t\tpayload,\n\t\t\"asset_identifier\",\n\t\t\"ft_transfer\",\n\t);\n\tconst sender = requireString(payload, \"sender\", \"ft_transfer\");\n\tconst recipient = requireString(payload, \"recipient\", \"ft_transfer\");\n\tconst amount = requireAmount(payload, \"ft_transfer\");\n\tconst { contract_id, token_name } = parseAssetIdentifier(\n\t\tassetIdentifier,\n\t\t\"ft_transfer\",\n\t);\n\n\treturn decodedRow(event, \"ft_transfer\", {\n\t\tasset_identifier: assetIdentifier,\n\t\tcontract_id: event.contract_id ?? contract_id,\n\t\ttoken_name,\n\t\tsender,\n\t\trecipient,\n\t\tamount,\n\t});\n}\n",
7
+ "import {\n\tdecodedRow,\n\tparseAssetIdentifier,\n\trequireHexValue,\n\trequireString,\n} from \"./_payload.ts\";\nimport type { StreamsEvent } from \"./types.ts\";\n\nexport type { NftTransferPayload } from \"./types.ts\";\n\nexport type NftTransferEvent = Extract<\n\tStreamsEvent,\n\t{ event_type: \"nft_transfer\" }\n>;\n\nexport type DecodedNftTransferPayload = {\n\tasset_identifier: string;\n\tcontract_id: string;\n\ttoken_name: string | null;\n\tsender: string;\n\trecipient: string;\n\tvalue: string;\n};\n\nexport type DecodedNftTransfer = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"nft_transfer\";\n\tdecoded_payload: DecodedNftTransferPayload;\n\tsource_cursor: string;\n};\n\nexport function isNftTransfer(event: StreamsEvent): event is NftTransferEvent {\n\treturn event.event_type === \"nft_transfer\";\n}\n\nexport function decodeNftTransfer(event: StreamsEvent): DecodedNftTransfer {\n\tif (!isNftTransfer(event)) {\n\t\tthrow new Error(`Expected nft_transfer event, got ${event.event_type}`);\n\t}\n\n\tconst payload = event.payload;\n\tconst assetIdentifier = requireString(\n\t\tpayload,\n\t\t\"asset_identifier\",\n\t\t\"nft_transfer\",\n\t);\n\tconst sender = requireString(payload, \"sender\", \"nft_transfer\");\n\tconst recipient = requireString(payload, \"recipient\", \"nft_transfer\");\n\tconst value = requireHexValue(payload, \"nft_transfer\");\n\tconst { contract_id, token_name } = parseAssetIdentifier(\n\t\tassetIdentifier,\n\t\t\"nft_transfer\",\n\t);\n\n\treturn decodedRow(event, \"nft_transfer\", {\n\t\tasset_identifier: assetIdentifier,\n\t\tcontract_id: event.contract_id ?? contract_id,\n\t\ttoken_name,\n\t\tsender,\n\t\trecipient,\n\t\tvalue,\n\t});\n}\n",
8
+ "import { cvToValue, deserializeCV } from \"@secondlayer/stacks/clarity\";\n\n/** Make a cvToValue result JSON-serializable: Clarity (u)ints decode to bigint,\n * which JSON.stringify can't handle — convert recursively to strings. */\nexport function toJsonSafe(value: unknown): unknown {\n\tif (typeof value === \"bigint\") return value.toString();\n\tif (Array.isArray(value)) return value.map(toJsonSafe);\n\tif (value && typeof value === \"object\") {\n\t\tconst out: Record<string, unknown> = {};\n\t\tfor (const [key, val] of Object.entries(value)) {\n\t\t\tout[key] = toJsonSafe(val);\n\t\t}\n\t\treturn out;\n\t}\n\treturn value;\n}\n\n/** Decode a hex-encoded Clarity value to JSON-safe JS (uints as strings,\n * buffers as `0x…` hex, tuples as objects). Returns the input hex on failure. */\nexport function decodeClarityValue(hex: string): unknown {\n\ttry {\n\t\tconst clean = hex.startsWith(\"0x\") ? hex.slice(2) : hex;\n\t\treturn toJsonSafe(cvToValue(deserializeCV(clean)));\n\t} catch {\n\t\treturn hex;\n\t}\n}\n",
9
+ "import { decodeClarityValue, toJsonSafe } from \"../clarity.ts\";\nimport { decodedRow, optionalString } from \"./_payload.ts\";\nimport type { StreamsEvent } from \"./types.ts\";\n\n/** Decoded form of a Clarity `print` event:\n * - `topic`: the print topic, when the contract emits a `{ topic, ... }` tuple\n * - `value`: the Clarity value decoded to JSON (uints as strings, buffers as\n * `0x…` hex, tuples as objects)\n * - `raw_value`: the canonical serialized hex, for byte-exact consumers */\nexport type DecodedPrintValue = {\n\ttopic: string | null;\n\tvalue: unknown;\n\traw_value: string | null;\n};\n\nexport type DecodedPrintPayload = {\n\tcontract_id: string | null;\n\tpayload: DecodedPrintValue;\n};\n\nexport type DecodedPrint = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"print\";\n\tdecoded_payload: DecodedPrintPayload;\n\tsource_cursor: string;\n};\n\nfunction printValueHex(payload: Record<string, unknown>): string | null {\n\tif (typeof payload.raw_value === \"string\") return payload.raw_value;\n\tconst value = payload.value;\n\tif (typeof value === \"string\" && value.startsWith(\"0x\")) return value;\n\tif (\n\t\tvalue &&\n\t\ttypeof value === \"object\" &&\n\t\ttypeof (value as { hex?: unknown }).hex === \"string\"\n\t) {\n\t\treturn (value as { hex: string }).hex;\n\t}\n\treturn null;\n}\n\nexport function isPrint(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"print\" } {\n\treturn event.event_type === \"print\";\n}\n\nexport function decodePrint(event: StreamsEvent): DecodedPrint {\n\tif (!isPrint(event)) {\n\t\tthrow new Error(`Expected print event, got ${event.event_type}`);\n\t}\n\tconst payload = event.payload;\n\tconst topic = optionalString(payload.topic);\n\tconst rawValue = printValueHex(payload);\n\n\tconst value = rawValue\n\t\t? decodeClarityValue(rawValue)\n\t\t: toJsonSafe(payload.value ?? null);\n\n\treturn decodedRow(event, \"print\", {\n\t\tcontract_id: event.contract_id ?? optionalString(payload.contract_id),\n\t\tpayload: { topic, value, raw_value: rawValue },\n\t});\n}\n",
10
+ "import {\n\tdecodedRow,\n\toptionalString,\n\trequireAmount,\n\trequireAmountField,\n\trequireString,\n} from \"./_payload.ts\";\nimport type { StreamsEvent } from \"./types.ts\";\n\nexport type DecodedStxTransferPayload = {\n\tsender: string;\n\trecipient: string;\n\tamount: string;\n\tmemo: string | null;\n};\n\nexport type DecodedStxTransfer = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"stx_transfer\";\n\tdecoded_payload: DecodedStxTransferPayload;\n\tsource_cursor: string;\n};\n\nexport type DecodedStxMintPayload = {\n\trecipient: string;\n\tamount: string;\n};\n\nexport type DecodedStxMint = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"stx_mint\";\n\tdecoded_payload: DecodedStxMintPayload;\n\tsource_cursor: string;\n};\n\nexport type DecodedStxBurnPayload = {\n\tsender: string;\n\tamount: string;\n};\n\nexport type DecodedStxBurn = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"stx_burn\";\n\tdecoded_payload: DecodedStxBurnPayload;\n\tsource_cursor: string;\n};\n\nexport function isStxTransfer(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"stx_transfer\" } {\n\treturn event.event_type === \"stx_transfer\";\n}\n\nexport function decodeStxTransfer(event: StreamsEvent): DecodedStxTransfer {\n\tif (!isStxTransfer(event)) {\n\t\tthrow new Error(`Expected stx_transfer event, got ${event.event_type}`);\n\t}\n\tconst payload = event.payload;\n\treturn decodedRow(event, \"stx_transfer\", {\n\t\tsender: requireString(payload, \"sender\", \"stx_transfer\"),\n\t\trecipient: requireString(payload, \"recipient\", \"stx_transfer\"),\n\t\tamount: requireAmount(payload, \"stx_transfer\"),\n\t\tmemo: optionalString(payload.memo),\n\t});\n}\n\nexport function isStxMint(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"stx_mint\" } {\n\treturn event.event_type === \"stx_mint\";\n}\n\nexport function decodeStxMint(event: StreamsEvent): DecodedStxMint {\n\tif (!isStxMint(event)) {\n\t\tthrow new Error(`Expected stx_mint event, got ${event.event_type}`);\n\t}\n\tconst payload = event.payload;\n\treturn decodedRow(event, \"stx_mint\", {\n\t\trecipient: requireString(payload, \"recipient\", \"stx_mint\"),\n\t\tamount: requireAmount(payload, \"stx_mint\"),\n\t});\n}\n\nexport function isStxBurn(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"stx_burn\" } {\n\treturn event.event_type === \"stx_burn\";\n}\n\nexport function decodeStxBurn(event: StreamsEvent): DecodedStxBurn {\n\tif (!isStxBurn(event)) {\n\t\tthrow new Error(`Expected stx_burn event, got ${event.event_type}`);\n\t}\n\tconst payload = event.payload;\n\treturn decodedRow(event, \"stx_burn\", {\n\t\tsender: requireString(payload, \"sender\", \"stx_burn\"),\n\t\tamount: requireAmount(payload, \"stx_burn\"),\n\t});\n}\n\nexport type DecodedStxLockPayload = {\n\t// The locked principal maps to `sender` and the locked uSTX to `amount` so\n\t// stx_lock is filterable like the other STX types; the lock-specific\n\t// unlock_height rides in the jsonb `payload` overflow.\n\tsender: string;\n\tamount: string;\n\tpayload: { unlock_height: string | null };\n};\n\nexport type DecodedStxLock = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"stx_lock\";\n\tdecoded_payload: DecodedStxLockPayload;\n\tsource_cursor: string;\n};\n\nexport function isStxLock(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"stx_lock\" } {\n\treturn event.event_type === \"stx_lock\";\n}\n\nexport function decodeStxLock(event: StreamsEvent): DecodedStxLock {\n\tif (!isStxLock(event)) {\n\t\tthrow new Error(`Expected stx_lock event, got ${event.event_type}`);\n\t}\n\tconst payload = event.payload;\n\treturn decodedRow(event, \"stx_lock\", {\n\t\tsender: requireString(payload, \"locked_address\", \"stx_lock\"),\n\t\tamount: requireAmountField(payload, \"locked_amount\", \"stx_lock\"),\n\t\tpayload: { unlock_height: optionalString(payload.unlock_height) },\n\t});\n}\n",
11
+ "import {\n\tdecodedRow,\n\tparseAssetIdentifier,\n\trequireAmount,\n\trequireHexValue,\n\trequireString,\n} from \"./_payload.ts\";\nimport type { StreamsEvent } from \"./types.ts\";\n\nexport type DecodedFtMintPayload = {\n\tasset_identifier: string;\n\tcontract_id: string;\n\ttoken_name: string | null;\n\trecipient: string;\n\tamount: string;\n};\n\nexport type DecodedFtMint = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"ft_mint\";\n\tdecoded_payload: DecodedFtMintPayload;\n\tsource_cursor: string;\n};\n\nexport type DecodedFtBurnPayload = {\n\tasset_identifier: string;\n\tcontract_id: string;\n\ttoken_name: string | null;\n\tsender: string;\n\tamount: string;\n};\n\nexport type DecodedFtBurn = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"ft_burn\";\n\tdecoded_payload: DecodedFtBurnPayload;\n\tsource_cursor: string;\n};\n\nexport type DecodedNftMintPayload = {\n\tasset_identifier: string;\n\tcontract_id: string;\n\ttoken_name: string | null;\n\trecipient: string;\n\tvalue: string;\n};\n\nexport type DecodedNftMint = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"nft_mint\";\n\tdecoded_payload: DecodedNftMintPayload;\n\tsource_cursor: string;\n};\n\nexport type DecodedNftBurnPayload = {\n\tasset_identifier: string;\n\tcontract_id: string;\n\ttoken_name: string | null;\n\tsender: string;\n\tvalue: string;\n};\n\nexport type DecodedNftBurn = {\n\tcursor: string;\n\tblock_height: number;\n\ttx_id: string;\n\ttx_index: number;\n\tevent_index: number;\n\tevent_type: \"nft_burn\";\n\tdecoded_payload: DecodedNftBurnPayload;\n\tsource_cursor: string;\n};\n\nfunction assetFields(event: StreamsEvent, eventType: string) {\n\tconst assetIdentifier = requireString(\n\t\tevent.payload,\n\t\t\"asset_identifier\",\n\t\teventType,\n\t);\n\tconst { contract_id, token_name } = parseAssetIdentifier(\n\t\tassetIdentifier,\n\t\teventType,\n\t);\n\treturn {\n\t\tasset_identifier: assetIdentifier,\n\t\tcontract_id: event.contract_id ?? contract_id,\n\t\ttoken_name,\n\t};\n}\n\nexport function isFtMint(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"ft_mint\" } {\n\treturn event.event_type === \"ft_mint\";\n}\n\nexport function decodeFtMint(event: StreamsEvent): DecodedFtMint {\n\tif (!isFtMint(event)) {\n\t\tthrow new Error(`Expected ft_mint event, got ${event.event_type}`);\n\t}\n\treturn decodedRow(event, \"ft_mint\", {\n\t\t...assetFields(event, \"ft_mint\"),\n\t\trecipient: requireString(event.payload, \"recipient\", \"ft_mint\"),\n\t\tamount: requireAmount(event.payload, \"ft_mint\"),\n\t});\n}\n\nexport function isFtBurn(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"ft_burn\" } {\n\treturn event.event_type === \"ft_burn\";\n}\n\nexport function decodeFtBurn(event: StreamsEvent): DecodedFtBurn {\n\tif (!isFtBurn(event)) {\n\t\tthrow new Error(`Expected ft_burn event, got ${event.event_type}`);\n\t}\n\treturn decodedRow(event, \"ft_burn\", {\n\t\t...assetFields(event, \"ft_burn\"),\n\t\tsender: requireString(event.payload, \"sender\", \"ft_burn\"),\n\t\tamount: requireAmount(event.payload, \"ft_burn\"),\n\t});\n}\n\nexport function isNftMint(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"nft_mint\" } {\n\treturn event.event_type === \"nft_mint\";\n}\n\nexport function decodeNftMint(event: StreamsEvent): DecodedNftMint {\n\tif (!isNftMint(event)) {\n\t\tthrow new Error(`Expected nft_mint event, got ${event.event_type}`);\n\t}\n\treturn decodedRow(event, \"nft_mint\", {\n\t\t...assetFields(event, \"nft_mint\"),\n\t\trecipient: requireString(event.payload, \"recipient\", \"nft_mint\"),\n\t\tvalue: requireHexValue(event.payload, \"nft_mint\"),\n\t});\n}\n\nexport function isNftBurn(\n\tevent: StreamsEvent,\n): event is StreamsEvent & { event_type: \"nft_burn\" } {\n\treturn event.event_type === \"nft_burn\";\n}\n\nexport function decodeNftBurn(event: StreamsEvent): DecodedNftBurn {\n\tif (!isNftBurn(event)) {\n\t\tthrow new Error(`Expected nft_burn event, got ${event.event_type}`);\n\t}\n\treturn decodedRow(event, \"nft_burn\", {\n\t\t...assetFields(event, \"nft_burn\"),\n\t\tsender: requireString(event.payload, \"sender\", \"nft_burn\"),\n\t\tvalue: requireHexValue(event.payload, \"nft_burn\"),\n\t});\n}\n"
12
+ ],
13
+ "mappings": "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",
14
+ "debugId": "1AF7A1B9E39F783164756E2164756E21",
15
+ "names": []
16
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@secondlayer/sdk",
3
- "version": "6.41.0",
3
+ "version": "6.42.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -20,6 +20,10 @@
20
20
  "types": "./dist/streams/index.d.ts",
21
21
  "import": "./dist/streams/index.js"
22
22
  },
23
+ "./streams/rows": {
24
+ "types": "./dist/streams/rows.d.ts",
25
+ "import": "./dist/streams/rows.js"
26
+ },
23
27
  "./subgraphs": {
24
28
  "types": "./dist/subgraphs/index.d.ts",
25
29
  "import": "./dist/subgraphs/index.js"
@@ -46,7 +50,7 @@
46
50
  "prepublishOnly": "bun run build"
47
51
  },
48
52
  "dependencies": {
49
- "@secondlayer/shared": "^7.3.1",
53
+ "@secondlayer/shared": "^7.4.0",
50
54
  "@secondlayer/stacks": "^3.0.0",
51
55
  "@secondlayer/subgraphs": "^3.23.1"
52
56
  },