@secondlayer/sdk 5.9.0 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -19,9 +19,12 @@ const sl = new SecondLayer({
19
19
  });
20
20
  ```
21
21
 
22
- Reads are public during open beta — no key needed. Writes require an `sk-sl_`
23
- API key, created in the platform console at
24
- https://secondlayer.tools/platform/api-keys.
22
+ `sl.index` and `sl.subgraphs` reads are anonymous — no key needed. **`sl.streams`
23
+ reads require a bearer token** (`apiKey`) and resolve a per-tier tenant; a
24
+ publicly-known free-tier token exists but a bearer is always required. Writes
25
+ require an `sk-sl_` API key, created in the platform console at
26
+ https://secondlayer.tools/platform/api-keys. (Public Streams bulk dumps —
27
+ `client.dumps`, `events.replay` — need no key.)
25
28
 
26
29
  ## Mental model
27
30
 
@@ -31,16 +34,20 @@ https://secondlayer.tools/platform/api-keys.
31
34
 
32
35
  ## Stacks Streams
33
36
 
34
- Typed L1 HTTP client. Reads are public no key needed.
37
+ Typed L1 HTTP client. Reads require a bearer token (`apiKey`).
35
38
 
36
39
  ```typescript
37
40
  const tip = await sl.streams.tip();
41
+ // tip.finalized_height — highest immutable (past Bitcoin-anchored finality) block
38
42
  const page = await sl.streams.events.list({
39
43
  types: ["ft_transfer"],
40
44
  contractId: "SP...sbtc-token",
45
+ sender: "SP...", // exact payload sender (events that have one)
46
+ recipient: "SP...", // exact payload recipient
47
+ assetIdentifier: "SP...token::asset", // exact FT/NFT asset id
41
48
  limit: 10,
42
49
  });
43
-
50
+ // each event carries `finalized: boolean`
44
51
  console.log({ tip, firstCursor: page.events[0]?.cursor });
45
52
  ```
46
53
 
@@ -50,10 +57,19 @@ console.log({ tip, firstCursor: page.events[0]?.cursor });
50
57
  import { createStreamsClient } from "@secondlayer/sdk";
51
58
 
52
59
  const streams = createStreamsClient({
53
- apiKey: process.env.SL_API_KEY!, // sk-sl_...
60
+ apiKey: process.env.SL_API_KEY!, // sk-sl_... — required for reads
61
+ // verify: true, // verify ed25519 X-Signature on every read
62
+ // // (auto-fetches the public key; { publicKey } pins a PEM)
63
+ // dumpsBaseUrl: process.env.SL_STREAMS_DUMPS_URL, // required to use client.dumps
54
64
  });
55
65
  ```
56
66
 
67
+ Verified responses: every Streams read is signed (ed25519 `X-Signature` +
68
+ `X-Signature-KeyId`). Pass `verify: true` to check it on every read (or
69
+ `{ publicKey }` to pin a PEM); a missing/bad signature throws
70
+ `StreamsSignatureError`. The public key is at
71
+ `GET /public/streams/signing-key`.
72
+
57
73
  Convenience reads:
58
74
 
59
75
  ```typescript
@@ -102,6 +118,46 @@ for await (const event of streams.events.stream({
102
118
  }
103
119
  ```
104
120
 
121
+ Bulk parquet dumps.
122
+
123
+ Finalized history is published as public parquet files. Set `dumpsBaseUrl`
124
+ (or `SL_STREAMS_DUMPS_URL`) — no API key needed for dumps. The SDK does **not**
125
+ decode parquet; `download` hands you sha256-verified bytes to process with your
126
+ own tooling.
127
+
128
+ ```typescript
129
+ const streams = createStreamsClient({
130
+ apiKey: process.env.SL_API_KEY!,
131
+ dumpsBaseUrl: process.env.SL_STREAMS_DUMPS_URL!,
132
+ });
133
+
134
+ const manifest = await streams.dumps.list(); // parse the manifest
135
+ for (const file of manifest.files) {
136
+ const bytes = await streams.dumps.download(file); // fetch + verify sha256
137
+ await myParquetReader(bytes);
138
+ }
139
+ ```
140
+
141
+ Backfill then tail (`events.replay`).
142
+
143
+ Backfills from bulk dumps, then tails live from the manifest's
144
+ `latest_finalized_cursor` — no gap or dupe at the seam. `onDumpFile` hands you
145
+ each finalized file; `onBatch` receives live events after the seam.
146
+
147
+ ```typescript
148
+ await streams.events.replay({
149
+ from: lastCheckpoint,
150
+ async onDumpFile(file) {
151
+ const bytes = await streams.dumps.download(file);
152
+ await ingestParquet(bytes); // your tooling
153
+ },
154
+ async onBatch(events, envelope) {
155
+ for (const event of events) await handle(event);
156
+ return envelope.next_cursor;
157
+ },
158
+ });
159
+ ```
160
+
105
161
  Decoder helper.
106
162
 
107
163
  ```typescript
package/dist/index.d.ts CHANGED
@@ -346,8 +346,82 @@ declare class Index extends BaseClient {
346
346
  }
347
347
  declare const STREAMS_EVENT_TYPES: readonly ["stx_transfer", "stx_mint", "stx_burn", "stx_lock", "ft_transfer", "ft_mint", "ft_burn", "nft_transfer", "nft_mint", "nft_burn", "print"];
348
348
  type StreamsEventType = (typeof STREAMS_EVENT_TYPES)[number];
349
- type StreamsEventPayload = Record<string, unknown>;
350
- type StreamsEvent = {
349
+ /** A Clarity value as Streams serves it: the canonical hex string, a typed
350
+ * object carrying that hex (`{ hex }`), or a decoded Clarity-JSON object.
351
+ * Decode helpers (`decodeNftTransfer`, etc.) resolve it to a concrete value. */
352
+ type StreamsClarityValue = string | {
353
+ hex: string
354
+ } | Record<string, unknown>;
355
+ type StxTransferPayload = {
356
+ sender: string
357
+ recipient: string
358
+ amount: string
359
+ memo?: string
360
+ };
361
+ type StxMintPayload = {
362
+ recipient: string
363
+ amount: string
364
+ };
365
+ type StxBurnPayload = {
366
+ sender: string
367
+ amount: string
368
+ };
369
+ type StxLockPayload = {
370
+ locked_address: string
371
+ locked_amount: string
372
+ unlock_height: string
373
+ };
374
+ type FtTransferPayload = {
375
+ asset_identifier: string
376
+ sender: string
377
+ recipient: string
378
+ amount: string
379
+ };
380
+ type FtMintPayload = {
381
+ asset_identifier: string
382
+ recipient: string
383
+ amount: string
384
+ };
385
+ type FtBurnPayload = {
386
+ asset_identifier: string
387
+ sender: string
388
+ amount: string
389
+ };
390
+ type NftTransferPayload = {
391
+ asset_identifier: string
392
+ sender: string
393
+ recipient: string
394
+ value: StreamsClarityValue
395
+ /** Canonical serialized hex of `value`, when the stream carries it. */
396
+ raw_value?: string
397
+ };
398
+ type NftMintPayload = {
399
+ asset_identifier: string
400
+ recipient: string
401
+ value: StreamsClarityValue
402
+ raw_value?: string
403
+ };
404
+ type NftBurnPayload = {
405
+ asset_identifier: string
406
+ sender: string
407
+ value: StreamsClarityValue
408
+ raw_value?: string
409
+ };
410
+ type PrintPayload = {
411
+ contract_id?: string | null
412
+ topic?: string
413
+ value?: unknown
414
+ raw_value?: string
415
+ };
416
+ /** Union of every Streams payload shape, discriminated by `event_type` on the
417
+ * parent `StreamsEvent`. */
418
+ type StreamsEventPayload = StxTransferPayload | StxMintPayload | StxBurnPayload | StxLockPayload | FtTransferPayload | FtMintPayload | FtBurnPayload | NftTransferPayload | NftMintPayload | NftBurnPayload | PrintPayload;
419
+ type StreamsEventBase = {
420
+ /**
421
+ * Globally unique, monotonic position of this event (`<block>:<index>`). Use
422
+ * it as the primary key of your projection rows — replaying a batch then
423
+ * upserts cleanly. Don't synthesize your own id from `tx_id`/`event_index`.
424
+ */
351
425
  cursor: string
352
426
  block_height: number
353
427
  block_hash: string
@@ -355,9 +429,7 @@ type StreamsEvent = {
355
429
  tx_id: string
356
430
  tx_index: number
357
431
  event_index: number
358
- event_type: StreamsEventType
359
432
  contract_id: string | null
360
- payload: StreamsEventPayload
361
433
  ts: string
362
434
  /**
363
435
  * True when this event's block is past the finality boundary (immutable).
@@ -365,6 +437,16 @@ type StreamsEvent = {
365
437
  */
366
438
  finalized?: boolean
367
439
  };
440
+ type StreamsEventOf<
441
+ T extends StreamsEventType,
442
+ P
443
+ > = StreamsEventBase & {
444
+ event_type: T
445
+ payload: P
446
+ };
447
+ /** A raw Streams event. Discriminated on `event_type`, so `event.payload`
448
+ * narrows to the matching payload shape once the type is checked. */
449
+ 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>;
368
450
  type StreamsTip = {
369
451
  block_height: number
370
452
  block_hash: string
@@ -407,23 +489,28 @@ type StreamsReorgsListEnvelope = {
407
489
  reorgs: StreamsReorg[]
408
490
  next_since: string | null
409
491
  };
492
+ /** A filter that matches a single value or any value in a list. */
493
+ type StreamsFilterValue = string | readonly string[];
410
494
  type StreamsEventsListParams = {
411
495
  cursor?: string | null
412
496
  fromHeight?: number
413
497
  toHeight?: number
414
498
  types?: readonly StreamsEventType[]
415
- contractId?: string
416
- sender?: string
417
- recipient?: string
499
+ /** Event types to exclude (applied after `types`). */
500
+ notTypes?: readonly StreamsEventType[]
501
+ contractId?: StreamsFilterValue
502
+ sender?: StreamsFilterValue
503
+ recipient?: StreamsFilterValue
418
504
  assetIdentifier?: string
419
505
  limit?: number
420
506
  };
421
507
  type StreamsEventsStreamParams = {
422
508
  fromCursor?: string | null
423
509
  types?: readonly StreamsEventType[]
424
- contractId?: string
425
- sender?: string
426
- recipient?: string
510
+ notTypes?: readonly StreamsEventType[]
511
+ contractId?: StreamsFilterValue
512
+ sender?: StreamsFilterValue
513
+ recipient?: StreamsFilterValue
427
514
  assetIdentifier?: string
428
515
  batchSize?: number
429
516
  emptyBackoffMs?: number
@@ -431,16 +518,53 @@ type StreamsEventsStreamParams = {
431
518
  maxEmptyPolls?: number
432
519
  signal?: AbortSignal
433
520
  };
521
+ /**
522
+ * The checkpoint the SDK computes for a batch. Persist `cursor` inside the same
523
+ * transaction as your projection writes, then resume from it via `fromCursor`.
524
+ * It is the position to advance to: `next_cursor` normally, or the last
525
+ * finalized event when `finalizedOnly` is set.
526
+ */
527
+ type StreamsBatchContext = {
528
+ cursor: string | null
529
+ };
530
+ /**
531
+ * The checkpoint for a reorg rollback. Persist `cursor` (the rewind position)
532
+ * inside the same transaction as your rollback so the two commit atomically.
533
+ */
534
+ type StreamsReorgContext = {
535
+ cursor: string
536
+ };
434
537
  type StreamsEventsConsumeParams = {
435
538
  fromCursor?: string | null
436
539
  mode?: "tail" | "bounded"
540
+ /**
541
+ * Emit only finalized (immutable) events and never surface reorgs. The SDK
542
+ * checkpoints at the last finalized event and re-reads the unfinalized tail
543
+ * until it settles. Trades finality lag for zero reorg handling; `onReorg` is
544
+ * ignored.
545
+ */
546
+ finalizedOnly?: boolean
437
547
  types?: readonly StreamsEventType[]
438
- contractId?: string
439
- sender?: string
440
- recipient?: string
548
+ notTypes?: readonly StreamsEventType[]
549
+ contractId?: StreamsFilterValue
550
+ sender?: StreamsFilterValue
551
+ recipient?: StreamsFilterValue
441
552
  assetIdentifier?: string
442
553
  batchSize?: number
443
- onBatch: (events: StreamsEvent[], envelope: StreamsEventsEnvelope) => Promise<string | null | undefined> | string | null | undefined
554
+ /**
555
+ * Apply a page of canonical events. Persist `ctx.cursor` in the same
556
+ * transaction as your writes. Returning a cursor overrides `ctx.cursor` as
557
+ * the resume point (advanced manual control); returning nothing uses it.
558
+ */
559
+ onBatch: (events: StreamsEvent[], envelope: StreamsEventsEnvelope, ctx: StreamsBatchContext) => void | string | null | undefined | Promise<void> | Promise<string | null | undefined>
560
+ /**
561
+ * Roll your projection back to `reorg.fork_point_height`, persisting
562
+ * `ctx.cursor` in the same transaction. Called once per *new* reorg
563
+ * (deduped in-memory, fork-ascending) before the SDK rewinds and re-reads the
564
+ * now-canonical events. Omit it to ignore reorgs (events stay canonical, but
565
+ * stale rows from an orphaned fork are left in place).
566
+ */
567
+ onReorg?: (reorg: StreamsReorg, ctx: StreamsReorgContext) => Promise<void> | void
444
568
  emptyBackoffMs?: number
445
569
  maxPages?: number
446
570
  maxEmptyPolls?: number
@@ -647,16 +771,9 @@ declare class StreamsServerError extends Error {
647
771
  declare class StreamsSignatureError extends Error {
648
772
  constructor(message?: string);
649
773
  }
650
- type FtTransferPayload = {
651
- asset_identifier: string
652
- sender: string
653
- recipient: string
654
- amount: string
655
- };
656
- type FtTransferEvent = StreamsEvent & {
774
+ type FtTransferEvent = Extract<StreamsEvent, {
657
775
  event_type: "ft_transfer"
658
- payload: FtTransferPayload
659
- };
776
+ }>;
660
777
  type DecodedFtTransferPayload = {
661
778
  asset_identifier: string
662
779
  contract_id: string
@@ -677,18 +794,9 @@ type DecodedFtTransfer = {
677
794
  };
678
795
  declare function isFtTransfer(event: StreamsEvent): event is FtTransferEvent;
679
796
  declare function decodeFtTransfer(event: StreamsEvent): DecodedFtTransfer;
680
- type NftTransferPayload = {
681
- asset_identifier: string
682
- sender: string
683
- recipient: string
684
- value: string | {
685
- hex: string
686
- }
687
- };
688
- type NftTransferEvent = StreamsEvent & {
797
+ type NftTransferEvent = Extract<StreamsEvent, {
689
798
  event_type: "nft_transfer"
690
- payload: NftTransferPayload
691
- };
799
+ }>;
692
800
  type DecodedNftTransferPayload = {
693
801
  asset_identifier: string
694
802
  contract_id: string
@@ -912,6 +1020,25 @@ type DecodedEventColumns = {
912
1020
  /** JSONB overflow for non-flat types (e.g. print's decoded value). */
913
1021
  payload?: unknown
914
1022
  };
1023
+ /**
1024
+ * Helpers for Streams cursors. A cursor is the opaque `<block>:<index>` string
1025
+ * that marks a position in the event stream; treat the format as an
1026
+ * implementation detail and go through these helpers instead of string-building
1027
+ * it at call sites.
1028
+ */
1029
+ declare const Cursor: {
1030
+ /**
1031
+ * Cursor at the foot of `height`. Resuming from it re-reads every event
1032
+ * strictly above block `height` (cursors are exclusive), so this is the
1033
+ * position to rewind to after a reorg whose fork point is `height`.
1034
+ */
1035
+ atHeight(height: number): string
1036
+ /** Parse a `<block>:<index>` cursor. Throws `ValidationError` if malformed. */
1037
+ parse(cursor: string): {
1038
+ blockHeight: number
1039
+ eventIndex: number
1040
+ }
1041
+ };
915
1042
  type DecodedEventRow = DecodedFtTransfer | DecodedNftTransfer | DecodedStxTransfer | DecodedStxMint | DecodedStxBurn | DecodedStxLock | DecodedFtMint | DecodedFtBurn | DecodedNftMint | DecodedNftBurn | DecodedPrint;
916
1043
  /**
917
1044
  * Typed client for the Foundation Datasets REST API (`/v1/datasets/*`).
@@ -1036,7 +1163,9 @@ declare class Datasets extends BaseClient {
1036
1163
  summary: DatasetRow
1037
1164
  }>;
1038
1165
  private get;
1039
- private buildParams;
1166
+ /** Map camelCase filter fields to snake_case query keys (dropping pagination
1167
+ * controls) and build the canonical query suffix. */
1168
+ private paramsToQuery;
1040
1169
  private cursorDataset;
1041
1170
  }
1042
1171
  import { SubgraphAgentSchema as SubgraphAgentSchema3, SubgraphSpecFormat as SubgraphSpecFormat2, SubgraphSpecOptions as SubgraphSpecOptions3 } from "@secondlayer/shared/subgraphs/spec";
@@ -1157,4 +1286,4 @@ declare function toJsonSafe(value: unknown): unknown;
1157
1286
  /** Decode a hex-encoded Clarity value to JSON-safe JS (uints as strings,
1158
1287
  * buffers as `0x…` hex, tuples as objects). Returns the input hex on failure. */
1159
1288
  declare function decodeClarityValue(hex: string): unknown;
1160
- export { verifyWebhookSignature, toJsonSafe, isStxTransfer, isStxMint, isStxLock, isStxBurn, isPrint, isNftTransfer, isNftMint, isNftBurn, isFtTransfer, isFtMint, isFtBurn, getSubgraph, decodeStxTransfer, decodeStxMint, decodeStxLock, decodeStxBurn, decodePrint, decodeNftTransfer, decodeNftMint, decodeNftBurn, decodeFtTransfer, decodeFtMint, decodeFtBurn, decodeClarityValue, createStreamsClient, VersionConflictError, ValidationError, UpdateSubscriptionRequest2 as UpdateSubscriptionRequest, Subscriptions, SubscriptionSummary2 as SubscriptionSummary, SubscriptionStatus, SubscriptionRuntime, SubscriptionFormat, SubscriptionDetail2 as SubscriptionDetail, Subgraphs, SubgraphSpecOptions3 as SubgraphSpecOptions, SubgraphSpecFormat2 as SubgraphSpecFormat, SubgraphAgentSchema3 as SubgraphAgentSchema, StreamsTip, StreamsSignatureError, StreamsServerError, StreamsReorgsListParams, StreamsReorgsListEnvelope, StreamsReorg, StreamsEventsStreamParams, StreamsEventsListParams, StreamsEventsListEnvelope, StreamsEventsEnvelope, StreamsEventsConsumeResult, StreamsEventsConsumeParams, StreamsEventType, StreamsEventPayload, StreamsEvent, StreamsDumpsManifest, StreamsDumps, StreamsDumpFile, StreamsClient, StreamsCanonicalBlock, SecondLayerOptions, SecondLayer, RotateSecretResponse2 as RotateSecretResponse, ReplayResult2 as ReplayResult, RateLimitError, Pox4CallsParams, NftTransfersWalkParams, NftTransfersListParams, NftTransfersEnvelope, NftTransferPayload, NftTransferEvent, NftTransfer, IndexTip, IndexEventType, IndexEvent, IndexContractCall, Index, FtTransfersWalkParams, FtTransfersListParams, FtTransfersEnvelope, FtTransferPayload, FtTransferEvent, FtTransfer, FetchLike2 as FetchLike, EventsWalkParams, EventsListParams, EventsEnvelope, DeliveryRow2 as DeliveryRow, DecodedStxTransferPayload, DecodedStxTransfer, DecodedStxMintPayload, DecodedStxMint, DecodedStxLockPayload, DecodedStxLock, DecodedStxBurnPayload, DecodedStxBurn, DecodedPrintValue, DecodedPrintPayload, DecodedPrint, DecodedNftTransferPayload, DecodedNftTransfer, DecodedNftMintPayload, DecodedNftMint, DecodedNftBurnPayload, DecodedNftBurn, DecodedFtTransferPayload, DecodedFtTransfer, DecodedFtMintPayload, DecodedFtMint, DecodedFtBurnPayload, DecodedFtBurn, DecodedEventRow, DecodedEventColumns, DeadRow2 as DeadRow, Datasets, DatasetRow, CursorListParams, CursorEnvelope, CreateSubscriptionResponse2 as CreateSubscriptionResponse, CreateSubscriptionRequest2 as CreateSubscriptionRequest, ContractCallsWalkParams, ContractCallsListParams, ContractCallsEnvelope, CURSOR_SLUGS, AuthError, ApiError };
1289
+ export { verifyWebhookSignature, toJsonSafe, isStxTransfer, isStxMint, isStxLock, isStxBurn, isPrint, isNftTransfer, isNftMint, isNftBurn, isFtTransfer, isFtMint, isFtBurn, getSubgraph, decodeStxTransfer, decodeStxMint, decodeStxLock, decodeStxBurn, decodePrint, decodeNftTransfer, decodeNftMint, decodeNftBurn, decodeFtTransfer, decodeFtMint, decodeFtBurn, decodeClarityValue, createStreamsClient, VersionConflictError, ValidationError, UpdateSubscriptionRequest2 as UpdateSubscriptionRequest, Subscriptions, SubscriptionSummary2 as SubscriptionSummary, SubscriptionStatus, SubscriptionRuntime, SubscriptionFormat, SubscriptionDetail2 as SubscriptionDetail, Subgraphs, SubgraphSpecOptions3 as SubgraphSpecOptions, SubgraphSpecFormat2 as SubgraphSpecFormat, SubgraphAgentSchema3 as SubgraphAgentSchema, StreamsTip, StreamsSignatureError, StreamsServerError, StreamsReorgsListParams, StreamsReorgsListEnvelope, StreamsReorgContext, StreamsReorg, StreamsEventsStreamParams, StreamsEventsListParams, StreamsEventsListEnvelope, StreamsEventsEnvelope, StreamsEventsConsumeResult, StreamsEventsConsumeParams, StreamsEventType, StreamsEventPayload, StreamsEvent, StreamsDumpsManifest, StreamsDumps, StreamsDumpFile, StreamsClient, StreamsCanonicalBlock, StreamsBatchContext, SecondLayerOptions, SecondLayer, RotateSecretResponse2 as RotateSecretResponse, ReplayResult2 as ReplayResult, RateLimitError, Pox4CallsParams, NftTransfersWalkParams, NftTransfersListParams, NftTransfersEnvelope, NftTransferPayload, NftTransferEvent, NftTransfer, IndexTip, IndexEventType, IndexEvent, IndexContractCall, Index, FtTransfersWalkParams, FtTransfersListParams, FtTransfersEnvelope, FtTransferPayload, FtTransferEvent, FtTransfer, FetchLike2 as FetchLike, EventsWalkParams, EventsListParams, EventsEnvelope, DeliveryRow2 as DeliveryRow, DecodedStxTransferPayload, DecodedStxTransfer, DecodedStxMintPayload, DecodedStxMint, DecodedStxLockPayload, DecodedStxLock, DecodedStxBurnPayload, DecodedStxBurn, DecodedPrintValue, DecodedPrintPayload, DecodedPrint, DecodedNftTransferPayload, DecodedNftTransfer, DecodedNftMintPayload, DecodedNftMint, DecodedNftBurnPayload, DecodedNftBurn, DecodedFtTransferPayload, DecodedFtTransfer, DecodedFtMintPayload, DecodedFtMint, DecodedFtBurnPayload, DecodedFtBurn, DecodedEventRow, DecodedEventColumns, DeadRow2 as DeadRow, Datasets, DatasetRow, CursorListParams, CursorEnvelope, Cursor, CreateSubscriptionResponse2 as CreateSubscriptionResponse, CreateSubscriptionRequest2 as CreateSubscriptionRequest, ContractCallsWalkParams, ContractCallsListParams, ContractCallsEnvelope, CURSOR_SLUGS, AuthError, ApiError };