envio 3.7.0 → 3.9.0-resolvers.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +2 -2
  2. package/evm.schema.json +7 -0
  3. package/fuel.schema.json +7 -0
  4. package/index.d.ts +674 -161
  5. package/index.js +10 -0
  6. package/package.json +6 -7
  7. package/src/AddressRows.res +121 -0
  8. package/src/AddressRows.res.mjs +143 -0
  9. package/src/Batch.res +11 -0
  10. package/src/Batch.res.mjs +2 -1
  11. package/src/Bin.res +47 -0
  12. package/src/Bin.res.mjs +34 -1
  13. package/src/ChainState.res +108 -98
  14. package/src/ChainState.res.mjs +86 -67
  15. package/src/ChainState.resi +28 -15
  16. package/src/Config.res +61 -131
  17. package/src/Config.res.mjs +47 -79
  18. package/src/ContractMapping.res +66 -0
  19. package/src/ContractMapping.res.mjs +73 -0
  20. package/src/Core.res +24 -0
  21. package/src/Core.res.mjs +4 -0
  22. package/src/Ecosystem.res +7 -2
  23. package/src/Env.res +128 -1
  24. package/src/Env.res.mjs +123 -1
  25. package/src/Envio.res +54 -76
  26. package/src/EventConfigBuilder.res +316 -46
  27. package/src/EventConfigBuilder.res.mjs +231 -28
  28. package/src/FetchState.res +59 -67
  29. package/src/FetchState.res.mjs +34 -44
  30. package/src/HandlerRegister.res +26 -15
  31. package/src/HandlerRegister.res.mjs +27 -7
  32. package/src/Hasura.res +30 -22
  33. package/src/Hasura.res.mjs +11 -5
  34. package/src/InMemoryStore.res +23 -38
  35. package/src/InMemoryStore.res.mjs +13 -27
  36. package/src/IndexerState.res +40 -3
  37. package/src/IndexerState.res.mjs +30 -4
  38. package/src/IndexerState.resi +4 -1
  39. package/src/Internal.res +49 -30
  40. package/src/Internal.res.mjs +12 -16
  41. package/src/Main.res +27 -20
  42. package/src/Main.res.mjs +19 -14
  43. package/src/Metrics.res +15 -1
  44. package/src/Metrics.res.mjs +5 -1
  45. package/src/Persistence.res +46 -21
  46. package/src/Persistence.res.mjs +8 -5
  47. package/src/PgStorage.res +238 -79
  48. package/src/PgStorage.res.mjs +115 -73
  49. package/src/PruneStaleHistory.res +1 -1
  50. package/src/PruneStaleHistory.res.mjs +1 -1
  51. package/src/Rollback.res +62 -41
  52. package/src/Rollback.res.mjs +61 -19
  53. package/src/RollbackCommit.res +7 -9
  54. package/src/RollbackCommit.res.mjs +5 -6
  55. package/src/SimulateItems.res +254 -9
  56. package/src/SimulateItems.res.mjs +214 -47
  57. package/src/Sink.res +35 -26
  58. package/src/Sink.res.mjs +20 -16
  59. package/src/TestIndexer.res +121 -123
  60. package/src/TestIndexer.res.mjs +97 -102
  61. package/src/Utils.res +38 -0
  62. package/src/Utils.res.mjs +39 -2
  63. package/src/Writing.res +4 -2
  64. package/src/Writing.res.mjs +3 -2
  65. package/src/bindings/ClickHouse.res +311 -656
  66. package/src/bindings/ClickHouse.res.mjs +294 -395
  67. package/src/bindings/ClickHouseSink.res +303 -0
  68. package/src/bindings/ClickHouseSink.res.mjs +216 -0
  69. package/src/bindings/NodeJs.res +9 -0
  70. package/src/bindings/NodeJs.res.mjs +8 -1
  71. package/src/bindings/Postgres.res +9 -0
  72. package/src/bindings/Postgres.res.mjs +3 -0
  73. package/src/db/EntityHistory.res +29 -24
  74. package/src/db/EntityHistory.res.mjs +11 -19
  75. package/src/db/InternalTable.res +258 -83
  76. package/src/db/InternalTable.res.mjs +223 -85
  77. package/src/db/RollbackScope.res +29 -0
  78. package/src/db/RollbackScope.res.mjs +31 -0
  79. package/src/db/Table.res +28 -1
  80. package/src/db/Table.res.mjs +26 -2
  81. package/src/resolvers/ResolverProcess.res +809 -0
  82. package/src/resolvers/ResolverProcess.res.mjs +667 -0
  83. package/src/resolvers/ResolverQuery.res +317 -0
  84. package/src/resolvers/ResolverQuery.res.mjs +220 -0
  85. package/src/resolvers/collisions.js +108 -0
  86. package/src/resolvers/db.js +363 -0
  87. package/src/resolvers/dispatch.js +165 -0
  88. package/src/resolvers/errors.js +30 -0
  89. package/src/resolvers/graphqlSelection.js +292 -0
  90. package/src/resolvers/hasuraAction.js +84 -0
  91. package/src/resolvers/hasuraApply.js +323 -0
  92. package/src/resolvers/hasuraMetadata.js +119 -0
  93. package/src/resolvers/index.js +95 -0
  94. package/src/resolvers/manifest.js +370 -0
  95. package/src/resolvers/server.js +270 -0
  96. package/src/sources/AddressSet.res +0 -22
  97. package/src/sources/AddressStore.res +48 -88
  98. package/src/sources/AddressStore.res.mjs +11 -22
  99. package/src/sources/Evm.res +2 -0
  100. package/src/sources/Evm.res.mjs +2 -0
  101. package/src/sources/EvmHyperSyncSource.res +3 -2
  102. package/src/sources/Fuel.res +2 -0
  103. package/src/sources/Fuel.res.mjs +2 -0
  104. package/src/sources/SimulateSource.res +8 -4
  105. package/src/sources/SimulateSource.res.mjs +7 -3
  106. package/src/sources/Svm.res +36 -7
  107. package/src/sources/Svm.res.mjs +34 -4
  108. package/src/sources/SvmHyperSyncClient.res +20 -116
  109. package/src/sources/SvmHyperSyncClient.res.mjs +5 -7
  110. package/src/sources/SvmHyperSyncSource.res +89 -37
  111. package/src/sources/SvmHyperSyncSource.res.mjs +71 -39
  112. package/src/sources/TransactionStore.res +38 -0
  113. package/src/sources/TransactionStore.res.mjs +5 -0
  114. package/src/tui/Tui.res +1 -1
  115. package/src/tui/Tui.res.mjs +1 -1
  116. package/svm.schema.json +44 -156
  117. package/src/MemoryStorage.res +0 -724
  118. package/src/MemoryStorage.res.mjs +0 -601
@@ -3,51 +3,81 @@
3
3
  import * as Source from "./Source.res.mjs";
4
4
  import * as HyperSync from "./HyperSync.res.mjs";
5
5
  import * as Performance from "../bindings/Performance.res.mjs";
6
+ import * as Stdlib_Null from "@rescript/runtime/lib/es6/Stdlib_Null.js";
6
7
  import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
7
8
  import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
8
9
  import * as SvmHyperSyncClient from "./SvmHyperSyncClient.res.mjs";
9
10
  import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
10
11
 
11
- function parseDecoded(d) {
12
- let args;
13
- try {
14
- args = JSON.parse(d.argsJson);
15
- } catch (exn) {
16
- args = {};
12
+ function namedAccounts(idlNames, accountArguments) {
13
+ let out = {};
14
+ idlNames.forEach((name, i) => {
15
+ let address = accountArguments[i];
16
+ if (address !== undefined) {
17
+ out[name] = {
18
+ address: address,
19
+ accountName: name,
20
+ instructionAccountIndex: i
21
+ };
22
+ return;
23
+ }
24
+ });
25
+ return out;
26
+ }
27
+
28
+ function selectedLog(log, logFields) {
29
+ let out = {};
30
+ if (logFields.has("kind")) {
31
+ let kind = log.kind;
32
+ if (kind !== null) {
33
+ out["kind"] = kind;
34
+ }
17
35
  }
18
- let accounts;
19
- try {
20
- accounts = JSON.parse(d.accountsJson);
21
- } catch (exn$1) {
22
- accounts = {};
36
+ if (logFields.has("message")) {
37
+ let message = log.message;
38
+ if (message !== null) {
39
+ out["message"] = message;
40
+ }
23
41
  }
24
- return {
25
- name: d.name,
26
- args: args,
27
- accounts: accounts,
28
- extraAccounts: d.extraAccounts
29
- };
42
+ return out;
30
43
  }
31
44
 
32
- function toSvmInstruction(item, programName, instructionName) {
33
- return {
34
- programName: programName,
35
- instructionName: instructionName,
36
- programId: item.programId,
37
- data: item.data,
38
- accounts: item.accounts,
39
- instructionAddress: item.instructionAddress,
40
- isInner: item.isInner,
41
- d1: item.d1,
42
- d2: item.d2,
43
- d4: item.d4,
44
- d8: item.d8,
45
- params: Stdlib_Option.map(item.decoded, parseDecoded),
46
- logs: Stdlib_Option.map(item.logs, logs => logs.map(log => ({
47
- kind: log.kind,
48
- message: log.message
49
- })))
50
- };
45
+ function setField(out, name, value) {
46
+ out[name] = value;
47
+ }
48
+
49
+ function toSvmInstruction(item, programName, instructionName, eventConfig, fieldSelection) {
50
+ let d = eventConfig.discriminator;
51
+ let discriminator = d !== undefined ? d : item.data;
52
+ let out = {};
53
+ setField(out, "programName", programName);
54
+ setField(out, "instructionName", instructionName);
55
+ setField(out, "discriminator", discriminator);
56
+ if (fieldSelection.instructionFields.has("programId")) {
57
+ setField(out, "programId", item.programId);
58
+ }
59
+ if (fieldSelection.instructionFields.has("data")) {
60
+ setField(out, "data", item.data);
61
+ }
62
+ if (fieldSelection.instructionFields.has("path")) {
63
+ setField(out, "path", item.path);
64
+ }
65
+ if (fieldSelection.instructionFields.has("isInner")) {
66
+ setField(out, "isInner", item.isInner);
67
+ }
68
+ if (fieldSelection.instructionFields.has("args")) {
69
+ setField(out, "args", JSON.parse(item.argsJson));
70
+ }
71
+ if (fieldSelection.instructionFields.has("accounts")) {
72
+ setField(out, "accounts", namedAccounts(eventConfig.accounts, item.accounts));
73
+ }
74
+ if (fieldSelection.instructionFields.has("accountArguments")) {
75
+ setField(out, "accountArguments", item.accounts);
76
+ }
77
+ if (fieldSelection.logFields.size > 0) {
78
+ setField(out, "logs", Stdlib_Null.getOr(item.logs, []).map(log => selectedLog(log, fieldSelection.logFields)));
79
+ }
80
+ return out;
51
81
  }
52
82
 
53
83
  function make(param) {
@@ -97,14 +127,14 @@ function make(param) {
97
127
  let parsedQueueItems = resp.items.map(item => {
98
128
  let onEventRegistration = onEventRegistrations[item.onEventRegistrationIndex];
99
129
  let eventConfig = onEventRegistration.eventConfig;
100
- let payload = toSvmInstruction(item, eventConfig.contractName, eventConfig.name);
130
+ let payload = toSvmInstruction(item, eventConfig.contractName, eventConfig.name, eventConfig, onEventRegistration.fieldSelection);
101
131
  return {
102
132
  kind: 0,
103
133
  onEventRegistration: onEventRegistration,
104
134
  chainId: chainId,
105
135
  blockNumber: item.slot,
106
136
  logIndex: item.transactionIndex,
107
- orderPath: item.instructionAddress,
137
+ orderPath: item.path,
108
138
  transactionIndex: item.transactionIndex,
109
139
  payload: payload
110
140
  };
@@ -152,7 +182,9 @@ function make(param) {
152
182
  }
153
183
 
154
184
  export {
155
- parseDecoded,
185
+ namedAccounts,
186
+ selectedLog,
187
+ setField,
156
188
  toSvmInstruction,
157
189
  make,
158
190
  }
@@ -31,6 +31,44 @@ let fieldCodes = FieldMask.fieldCodes
31
31
  // Drain another store (a fetch-response page) into this one.
32
32
  @send external merge: (t, t) => unit = "merge"
33
33
 
34
+ type svmTxInput = {
35
+ slot: int,
36
+ transactionIndex: int,
37
+ signature?: string,
38
+ allSignatures?: array<string>,
39
+ feePayer?: string,
40
+ success?: bool,
41
+ err?: string,
42
+ fee?: bigint,
43
+ computeUnitsConsumed?: bigint,
44
+ accountKeys?: array<string>,
45
+ recentBlockhash?: string,
46
+ version?: string,
47
+ }
48
+
49
+ type svmActivityInput = {
50
+ slot: int,
51
+ transactionIndex: int,
52
+ account: string,
53
+ accountIndex?: int,
54
+ isSigner?: bool,
55
+ isWritable?: bool,
56
+ preBalance?: bigint,
57
+ postBalance?: bigint,
58
+ mint?: string,
59
+ owner?: string,
60
+ decimals?: int,
61
+ preAmount?: bigint,
62
+ postAmount?: bigint,
63
+ }
64
+
65
+ @send
66
+ external fromJsSvm: (Core.transactionStoreCtor, array<svmTxInput>, array<svmActivityInput>) => t =
67
+ "fromJsSvm"
68
+
69
+ let fromSvmJs = (transactions: array<svmTxInput>, activities: array<svmActivityInput>): t =>
70
+ Core.getAddon().transactionStore->fromJsSvm(transactions, activities)
71
+
34
72
  // Bulk-materialise transactions off the JS thread, one row per
35
73
  // (blockNumbers[i], transactionIndices[i]) key, decoding only the fields set in
36
74
  // that row's own masks[i]. Result is aligned with the input.
@@ -15,6 +15,10 @@ function make(ecosystem, shouldChecksum) {
15
15
  }
16
16
  }
17
17
 
18
+ function fromSvmJs(transactions, activities) {
19
+ return Core.getAddon().TransactionStore.fromJsSvm(transactions, activities);
20
+ }
21
+
18
22
  let makeMaskFn = FieldMask.makeMaskFn;
19
23
 
20
24
  let orMask = FieldMask.orMask;
@@ -26,5 +30,6 @@ export {
26
30
  makeMaskFn,
27
31
  orMask,
28
32
  fieldCodes,
33
+ fromSvmJs,
29
34
  }
30
35
  /* Core Not a pure module */
package/src/tui/Tui.res CHANGED
@@ -304,7 +304,7 @@ module App = {
304
304
  <Newline />
305
305
  <Box flexDirection={Row}>
306
306
  <Text> {"GraphQL: "->React.string} </Text>
307
- <Text color={Info} underline=true> {Env.Hasura.url->React.string} </Text>
307
+ <Text color={Info} underline=true> {Env.Hasura.url()->React.string} </Text>
308
308
  {
309
309
  let defaultPassword = "testing"
310
310
  if Env.Hasura.secret == defaultPassword {
@@ -371,7 +371,7 @@ function Tui$App(props) {
371
371
  children: "GraphQL: "
372
372
  }),
373
373
  JsxRuntime.jsx(Ink$1.Text, {
374
- children: Env.Hasura.url,
374
+ children: Env.Hasura.url(),
375
375
  color: "#6CBFEE",
376
376
  underline: true
377
377
  }),
package/svm.schema.json CHANGED
@@ -29,6 +29,13 @@
29
29
  "null"
30
30
  ]
31
31
  },
32
+ "resolvers": {
33
+ "description": "Optional relative path to the custom GraphQL resolvers, either a single module (e.g. 'src/Resolvers.ts') or a directory (e.g. 'src/resolvers'), in which case every .js/.mjs/.ts file beneath it is loaded, tests excluded. The resolvers they export are served as additional root fields on the indexer's GraphQL endpoint.",
34
+ "type": [
35
+ "string",
36
+ "null"
37
+ ]
38
+ },
32
39
  "full_batch_size": {
33
40
  "description": "Target number of events to be processed per batch. Set it to smaller number if you have many Effect API calls which are slow to resolve and can't be batched. (Default: 5000)",
34
41
  "type": [
@@ -212,6 +219,10 @@
212
219
  "Chain": {
213
220
  "type": "object",
214
221
  "properties": {
222
+ "id": {
223
+ "description": "Identifies the Svm cluster: the label \"solana\" (7565164) or \"solana-devnet\" (7565165), or an explicit number of your choosing for other clusters (up to Number.MAX_SAFE_INTEGER). Svm has no native numeric chain id, so the label ids are assigned by Envio and match the ids used for HyperSync usage attribution.",
224
+ "$ref": "#/$defs/ChainId"
225
+ },
215
226
  "skip": {
216
227
  "description": "Excludes the chain from indexing and migrations. Code generation is unaffected. For testing, prefer using a test framework instead.",
217
228
  "type": [
@@ -264,15 +275,44 @@
264
275
  },
265
276
  "additionalProperties": false,
266
277
  "required": [
278
+ "id",
267
279
  "start_block"
268
280
  ]
269
281
  },
282
+ "ChainId": {
283
+ "description": "The chain id of an Svm chain: either a known cluster label or an\nexplicit number (for private chains, rollups, or custom clusters).",
284
+ "anyOf": [
285
+ {
286
+ "$ref": "#/$defs/ChainLabel"
287
+ },
288
+ {
289
+ "type": "integer",
290
+ "format": "uint64",
291
+ "minimum": 0,
292
+ "maximum": 9007199254740991
293
+ }
294
+ ]
295
+ },
296
+ "ChainLabel": {
297
+ "type": "string",
298
+ "enum": [
299
+ "solana",
300
+ "solana-devnet"
301
+ ]
302
+ },
270
303
  "Experimental": {
271
304
  "type": "object",
272
305
  "properties": {
273
306
  "hypersync_config": {
274
- "description": "HyperSync Config for fetching historical instructions on this chain.",
275
- "$ref": "#/$defs/HypersyncConfig"
307
+ "description": "HyperSync Config for fetching historical instructions on this chain. Optional for the `solana` and `solana-devnet` chain ids, which default to their public HyperSync endpoints; required for any other chain id.",
308
+ "anyOf": [
309
+ {
310
+ "$ref": "#/$defs/HypersyncConfig"
311
+ },
312
+ {
313
+ "type": "null"
314
+ }
315
+ ]
276
316
  },
277
317
  "programs": {
278
318
  "description": "Solana programs to index on this chain.",
@@ -284,7 +324,6 @@
284
324
  },
285
325
  "additionalProperties": false,
286
326
  "required": [
287
- "hypersync_config",
288
327
  "programs"
289
328
  ]
290
329
  },
@@ -292,7 +331,7 @@
292
331
  "type": "object",
293
332
  "properties": {
294
333
  "url": {
295
- "description": "URL of the HyperSync endpoint (default: the public Solana HyperSync endpoint at https://solana.hypersync.xyz)",
334
+ "description": "URL of the HyperSync endpoint (defaults to the public endpoint of the chain id: https://solana.hypersync.xyz for `solana`, https://solana-devnet.hypersync.xyz for `solana-devnet`)",
296
335
  "type": "string"
297
336
  }
298
337
  },
@@ -355,37 +394,8 @@
355
394
  "null"
356
395
  ]
357
396
  },
358
- "is_inner": {
359
- "description": "Filter on inner-vs-outer instructions. None / absent matches both.",
360
- "type": [
361
- "boolean",
362
- "null"
363
- ]
364
- },
365
- "account_filters": {
366
- "description": "Optional positional account filters. Two shapes are accepted: a flat list of `{position, values}` entries (AND across positions, OR within `values`); or `{any_of: [[...]] }`, a list of AND-groups that are OR-ed together. Positions must be in 0..=5; positions 6..=9 are reserved for a future extension.",
367
- "anyOf": [
368
- {
369
- "$ref": "#/$defs/AccountFilters"
370
- },
371
- {
372
- "type": "null"
373
- }
374
- ]
375
- },
376
- "field_selection": {
377
- "description": "Select which additional data to fetch for each matched instruction. Each key accepts `true` (include all fields) or a list of field names (per-field selection, not yet supported). When absent, only the instruction itself is included.",
378
- "anyOf": [
379
- {
380
- "$ref": "#/$defs/SvmFieldSelection"
381
- },
382
- {
383
- "type": "null"
384
- }
385
- ]
386
- },
387
397
  "accounts": {
388
- "description": "Optional positional account names. The Nth entry names account slot N on the dispatched instruction; surfaces as `event.instruction.decoded.accounts.<name>`. Accounts beyond the named list become `extra_accounts`.",
398
+ "description": "Optional positional account names. The Nth entry names account slot N on the dispatched instruction; surfaces as `instruction.accounts.<name>` when `fields.instruction` includes `accounts`.",
389
399
  "type": [
390
400
  "array",
391
401
  "null"
@@ -410,128 +420,6 @@
410
420
  "name"
411
421
  ]
412
422
  },
413
- "AccountFilters": {
414
- "anyOf": [
415
- {
416
- "type": "array",
417
- "items": {
418
- "$ref": "#/$defs/AccountFilter"
419
- }
420
- },
421
- {
422
- "$ref": "#/$defs/AnyOfAccountFilters"
423
- }
424
- ]
425
- },
426
- "AccountFilter": {
427
- "type": "object",
428
- "properties": {
429
- "position": {
430
- "description": "Account position within the instruction (0..=5).",
431
- "type": "integer",
432
- "format": "uint8",
433
- "minimum": 0,
434
- "maximum": 255
435
- },
436
- "values": {
437
- "description": "Allowed base58 pubkeys for this account position.",
438
- "type": "array",
439
- "items": {
440
- "type": "string"
441
- }
442
- }
443
- },
444
- "additionalProperties": false,
445
- "required": [
446
- "position",
447
- "values"
448
- ]
449
- },
450
- "AnyOfAccountFilters": {
451
- "type": "object",
452
- "properties": {
453
- "any_of": {
454
- "description": "A non-empty list of AND-groups. Each group is itself a non-empty list of `{position, values}` entries that must all match the same instruction. An instruction matches `any_of` when any one group matches.",
455
- "type": "array",
456
- "items": {
457
- "type": "array",
458
- "items": {
459
- "$ref": "#/$defs/AccountFilter"
460
- }
461
- }
462
- }
463
- },
464
- "additionalProperties": false,
465
- "required": [
466
- "any_of"
467
- ]
468
- },
469
- "SvmFieldSelection": {
470
- "type": "object",
471
- "properties": {
472
- "transaction_fields": {
473
- "description": "Parent-transaction fields to include on each matched instruction, as a list of field names. Omit (or pass an empty list) to include no transaction.",
474
- "type": [
475
- "array",
476
- "null"
477
- ],
478
- "items": {
479
- "$ref": "#/$defs/SvmTransactionField"
480
- }
481
- },
482
- "block_fields": {
483
- "description": "Block fields to include on each matched instruction's `block`, as a list of field names. `slot`/`time`/`hash` are always included; this adds `height`/`parentSlot`/`parentHash`.",
484
- "type": [
485
- "array",
486
- "null"
487
- ],
488
- "items": {
489
- "$ref": "#/$defs/SvmBlockField"
490
- }
491
- },
492
- "log_fields": {
493
- "description": "Set to `true` to include program logs scoped to each matched instruction.",
494
- "type": [
495
- "boolean",
496
- "null"
497
- ]
498
- },
499
- "token_balance_fields": {
500
- "description": "Set to `true` to include SPL Token / Token-2022 balance snapshots for the parent transaction, exposed as `transaction.tokenBalances`. Independent of `transaction_fields`.",
501
- "type": [
502
- "boolean",
503
- "null"
504
- ]
505
- }
506
- },
507
- "additionalProperties": false
508
- },
509
- "SvmTransactionField": {
510
- "description": "Selectable parent-transaction field names (camelCase), matching the\npublic `svmTransaction` shape. `tokenBalances` is selected via the\nseparate `token_balance_fields` toggle, so it isn't listed here.",
511
- "type": "string",
512
- "enum": [
513
- "transactionIndex",
514
- "signature",
515
- "feePayer",
516
- "success",
517
- "err",
518
- "fee",
519
- "computeUnitsConsumed",
520
- "accountKeys",
521
- "recentBlockhash",
522
- "version",
523
- "allSignatures"
524
- ]
525
- },
526
- "SvmBlockField": {
527
- "description": "Selectable block field names (camelCase), matching the public\n`instruction.block` shape. `slot`/`time`/`hash` are always included,\nso everything here is opt-in on top of that trio.",
528
- "type": "string",
529
- "enum": [
530
- "height",
531
- "parentSlot",
532
- "parentHash"
533
- ]
534
- },
535
423
  "ArgDef": {
536
424
  "description": "One named argument of an instruction. Mirrors\n`hypersync_client_solana::decode::NamedField`.",
537
425
  "type": "object",