@iota/graphql-transport 0.0.0-dev-20251015065834

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 (92) hide show
  1. package/CHANGELOG.md +248 -0
  2. package/LICENSE +201 -0
  3. package/README.md +104 -0
  4. package/dist/cjs/generated/queries.d.ts +9099 -0
  5. package/dist/cjs/generated/queries.js +3021 -0
  6. package/dist/cjs/generated/queries.js.map +7 -0
  7. package/dist/cjs/index.d.ts +1 -0
  8. package/dist/cjs/index.js +19 -0
  9. package/dist/cjs/index.js.map +7 -0
  10. package/dist/cjs/mappers/bcs.d.ts +4 -0
  11. package/dist/cjs/mappers/bcs.js +71 -0
  12. package/dist/cjs/mappers/bcs.js.map +7 -0
  13. package/dist/cjs/mappers/checkpoint.d.ts +3 -0
  14. package/dist/cjs/mappers/checkpoint.js +64 -0
  15. package/dist/cjs/mappers/checkpoint.js.map +7 -0
  16. package/dist/cjs/mappers/display.d.ts +8 -0
  17. package/dist/cjs/mappers/display.js +43 -0
  18. package/dist/cjs/mappers/display.js.map +7 -0
  19. package/dist/cjs/mappers/move.d.ts +57 -0
  20. package/dist/cjs/mappers/move.js +231 -0
  21. package/dist/cjs/mappers/move.js.map +7 -0
  22. package/dist/cjs/mappers/object.d.ts +10 -0
  23. package/dist/cjs/mappers/object.js +79 -0
  24. package/dist/cjs/mappers/object.js.map +7 -0
  25. package/dist/cjs/mappers/owner.d.ts +3 -0
  26. package/dist/cjs/mappers/owner.js +48 -0
  27. package/dist/cjs/mappers/owner.js.map +7 -0
  28. package/dist/cjs/mappers/stakes.d.ts +3 -0
  29. package/dist/cjs/mappers/stakes.js +48 -0
  30. package/dist/cjs/mappers/stakes.js.map +7 -0
  31. package/dist/cjs/mappers/transaction-block.d.ts +7 -0
  32. package/dist/cjs/mappers/transaction-block.js +487 -0
  33. package/dist/cjs/mappers/transaction-block.js.map +7 -0
  34. package/dist/cjs/mappers/util.d.ts +2 -0
  35. package/dist/cjs/mappers/util.js +31 -0
  36. package/dist/cjs/mappers/util.js.map +7 -0
  37. package/dist/cjs/mappers/validator.d.ts +3 -0
  38. package/dist/cjs/mappers/validator.js +64 -0
  39. package/dist/cjs/mappers/validator.js.map +7 -0
  40. package/dist/cjs/methods.d.ts +19 -0
  41. package/dist/cjs/methods.js +1377 -0
  42. package/dist/cjs/methods.js.map +7 -0
  43. package/dist/cjs/package.json +5 -0
  44. package/dist/cjs/transport.d.ts +44 -0
  45. package/dist/cjs/transport.js +155 -0
  46. package/dist/cjs/transport.js.map +7 -0
  47. package/dist/esm/generated/queries.d.ts +9099 -0
  48. package/dist/esm/generated/queries.js +3001 -0
  49. package/dist/esm/generated/queries.js.map +7 -0
  50. package/dist/esm/index.d.ts +1 -0
  51. package/dist/esm/index.js +2 -0
  52. package/dist/esm/index.js.map +7 -0
  53. package/dist/esm/mappers/bcs.d.ts +4 -0
  54. package/dist/esm/mappers/bcs.js +51 -0
  55. package/dist/esm/mappers/bcs.js.map +7 -0
  56. package/dist/esm/mappers/checkpoint.d.ts +3 -0
  57. package/dist/esm/mappers/checkpoint.js +44 -0
  58. package/dist/esm/mappers/checkpoint.js.map +7 -0
  59. package/dist/esm/mappers/display.d.ts +8 -0
  60. package/dist/esm/mappers/display.js +23 -0
  61. package/dist/esm/mappers/display.js.map +7 -0
  62. package/dist/esm/mappers/move.d.ts +57 -0
  63. package/dist/esm/mappers/move.js +211 -0
  64. package/dist/esm/mappers/move.js.map +7 -0
  65. package/dist/esm/mappers/object.d.ts +10 -0
  66. package/dist/esm/mappers/object.js +59 -0
  67. package/dist/esm/mappers/object.js.map +7 -0
  68. package/dist/esm/mappers/owner.d.ts +3 -0
  69. package/dist/esm/mappers/owner.js +28 -0
  70. package/dist/esm/mappers/owner.js.map +7 -0
  71. package/dist/esm/mappers/stakes.d.ts +3 -0
  72. package/dist/esm/mappers/stakes.js +28 -0
  73. package/dist/esm/mappers/stakes.js.map +7 -0
  74. package/dist/esm/mappers/transaction-block.d.ts +7 -0
  75. package/dist/esm/mappers/transaction-block.js +467 -0
  76. package/dist/esm/mappers/transaction-block.js.map +7 -0
  77. package/dist/esm/mappers/util.d.ts +2 -0
  78. package/dist/esm/mappers/util.js +11 -0
  79. package/dist/esm/mappers/util.js.map +7 -0
  80. package/dist/esm/mappers/validator.d.ts +3 -0
  81. package/dist/esm/mappers/validator.js +44 -0
  82. package/dist/esm/mappers/validator.js.map +7 -0
  83. package/dist/esm/methods.d.ts +19 -0
  84. package/dist/esm/methods.js +1406 -0
  85. package/dist/esm/methods.js.map +7 -0
  86. package/dist/esm/package.json +5 -0
  87. package/dist/esm/transport.d.ts +44 -0
  88. package/dist/esm/transport.js +135 -0
  89. package/dist/esm/transport.js.map +7 -0
  90. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  91. package/dist/tsconfig.tsbuildinfo +1 -0
  92. package/package.json +67 -0
@@ -0,0 +1,1406 @@
1
+ import { fromBase64 } from "@iota/bcs";
2
+ import { Transaction } from "@iota/iota-sdk/transactions";
3
+ import { normalizeStructTag, normalizeIotaAddress, parseStructTag } from "@iota/iota-sdk/utils";
4
+ import {
5
+ DevInspectTransactionBlockDocument,
6
+ DryRunTransactionBlockDocument,
7
+ ExecuteTransactionBlockDocument,
8
+ GetAllBalancesDocument,
9
+ GetBalanceDocument,
10
+ GetChainIdentifierDocument,
11
+ GetCheckpointDocument,
12
+ GetCheckpointsDocument,
13
+ GetCoinMetadataDocument,
14
+ GetCoinsDocument,
15
+ GetCommitteeInfoDocument,
16
+ GetCurrentEpochDocument,
17
+ GetDynamicFieldObjectDocument,
18
+ GetDynamicFieldsDocument,
19
+ GetLatestCheckpointSequenceNumberDocument,
20
+ GetLatestIotaSystemStateDocument,
21
+ GetMoveFunctionArgTypesDocument,
22
+ GetNormalizedMoveFunctionDocument,
23
+ GetNormalizedMoveModuleDocument,
24
+ GetNormalizedMoveModulesByPackageDocument,
25
+ GetNormalizedMoveStructDocument,
26
+ GetObjectDocument,
27
+ GetOwnedObjectsDocument,
28
+ GetProtocolConfigDocument,
29
+ GetReferenceGasPriceDocument,
30
+ GetStakesByIdsDocument,
31
+ GetStakesDocument,
32
+ GetTotalSupplyDocument,
33
+ GetTotalTransactionBlocksDocument,
34
+ GetTransactionBlockDocument,
35
+ GetTypeLayoutDocument,
36
+ GetValidatorsApyDocument,
37
+ IsTransactionIndexedOnNodeDocument,
38
+ MultiGetObjectsDocument,
39
+ MultiGetTransactionBlocksDocument,
40
+ PaginateCheckpointTransactionBlocksDocument,
41
+ PaginateEpochValidatorsDocument,
42
+ PaginateMoveModuleListsDocument,
43
+ PaginateTransactionBlockListsDocument,
44
+ QueryEventsDocument,
45
+ QueryTransactionBlocksDocument,
46
+ TransactionBlockKindInput,
47
+ TryGetPastObjectDocument
48
+ } from "./generated/queries.js";
49
+ import { mapJsonToBcs } from "./mappers/bcs.js";
50
+ import { mapGraphQLCheckpointToRpcCheckpoint } from "./mappers/checkpoint.js";
51
+ import {
52
+ mapNormalizedMoveFunction,
53
+ mapNormalizedMoveModule,
54
+ mapNormalizedMoveStruct,
55
+ moveDataToRpcContent
56
+ } from "./mappers/move.js";
57
+ import { mapGraphQLMoveObjectToRpcObject, mapGraphQLObjectToRpcObject } from "./mappers/object.js";
58
+ import { mapGraphQLStakeToRpcStake } from "./mappers/stakes.js";
59
+ import { mapGraphQLTransactionBlockToRpcTransactionBlock } from "./mappers/transaction-block.js";
60
+ import { isNumericString, toShortTypeString } from "./mappers/util.js";
61
+ import { mapGraphQlValidatorToRpcValidator } from "./mappers/validator.js";
62
+ const RPC_METHODS = {
63
+ async getRpcApiVersion(transport) {
64
+ const res = await transport.graphqlRequest({
65
+ query: "query { __typename }",
66
+ variables: {}
67
+ });
68
+ if (!res.ok) {
69
+ throw new Error("Failed to fetch");
70
+ }
71
+ return {
72
+ info: {
73
+ version: res.headers.get("x-iota-rpc-version") ?? void 0
74
+ }
75
+ };
76
+ },
77
+ async getCoins(transport, [owner, coinType, cursor, limit]) {
78
+ const { nodes: coins, pageInfo } = await transport.graphqlQuery(
79
+ {
80
+ query: GetCoinsDocument,
81
+ variables: {
82
+ owner,
83
+ type: coinType,
84
+ cursor,
85
+ first: limit
86
+ }
87
+ },
88
+ (data) => data.address?.coins
89
+ );
90
+ return {
91
+ data: coins.map((coin) => ({
92
+ balance: coin.coinBalance,
93
+ coinObjectId: coin.address,
94
+ coinType: toShortTypeString(
95
+ normalizeStructTag(parseStructTag(coin.contents?.type.repr).typeParams[0])
96
+ ),
97
+ digest: coin.digest,
98
+ previousTransaction: coin.previousTransactionBlock?.digest,
99
+ version: String(coin.version)
100
+ })),
101
+ nextCursor: pageInfo.endCursor,
102
+ hasNextPage: pageInfo.hasNextPage
103
+ };
104
+ },
105
+ async getAllCoins(transport, inputs) {
106
+ const { nodes: coins, pageInfo } = await transport.graphqlQuery(
107
+ {
108
+ query: GetCoinsDocument,
109
+ variables: {
110
+ owner: inputs[0],
111
+ cursor: inputs[1],
112
+ first: inputs[2]
113
+ }
114
+ },
115
+ (data) => data.address?.coins
116
+ );
117
+ return {
118
+ data: coins.map((coin) => ({
119
+ balance: coin.coinBalance,
120
+ coinObjectId: coin.address,
121
+ coinType: toShortTypeString(
122
+ normalizeStructTag(parseStructTag(coin.contents?.type.repr).typeParams[0])
123
+ ),
124
+ digest: coin.digest,
125
+ previousTransaction: coin.previousTransactionBlock?.digest,
126
+ version: String(coin.version)
127
+ })),
128
+ nextCursor: pageInfo.endCursor,
129
+ hasNextPage: pageInfo.hasNextPage
130
+ };
131
+ },
132
+ async getBalance(transport, inputs) {
133
+ const balance = await transport.graphqlQuery(
134
+ {
135
+ query: GetBalanceDocument,
136
+ variables: {
137
+ owner: inputs[0],
138
+ type: inputs[1]
139
+ }
140
+ },
141
+ (data) => data.address?.balance
142
+ );
143
+ return {
144
+ coinType: toShortTypeString(balance.coinType?.repr),
145
+ coinObjectCount: balance.coinObjectCount,
146
+ totalBalance: balance.totalBalance
147
+ };
148
+ },
149
+ async getAllBalances(transport, inputs) {
150
+ const balances = await transport.graphqlQuery(
151
+ {
152
+ query: GetAllBalancesDocument,
153
+ variables: {
154
+ owner: inputs[0]
155
+ }
156
+ },
157
+ (data) => data.address?.balances?.nodes
158
+ );
159
+ return balances.map((balance) => ({
160
+ coinType: toShortTypeString(balance.coinType?.repr),
161
+ coinObjectCount: balance.coinObjectCount,
162
+ totalBalance: balance.totalBalance
163
+ }));
164
+ },
165
+ async getCoinMetadata(transport, inputs) {
166
+ const metadata = await transport.graphqlQuery(
167
+ {
168
+ query: GetCoinMetadataDocument,
169
+ variables: {
170
+ coinType: inputs[0]
171
+ }
172
+ },
173
+ (data) => data.coinMetadata
174
+ );
175
+ return {
176
+ decimals: metadata.decimals,
177
+ name: metadata.name,
178
+ symbol: metadata.symbol,
179
+ description: metadata.description,
180
+ iconUrl: metadata.iconUrl,
181
+ id: metadata.address
182
+ };
183
+ },
184
+ async getTotalSupply(transport, inputs) {
185
+ const metadata = await transport.graphqlQuery(
186
+ {
187
+ query: GetTotalSupplyDocument,
188
+ variables: {
189
+ coinType: inputs[0]
190
+ }
191
+ },
192
+ (data) => data.coinMetadata
193
+ );
194
+ return {
195
+ value: BigInt(metadata.supply).toString()
196
+ };
197
+ },
198
+ async getMoveFunctionArgTypes(transport, [pkg, module, fn]) {
199
+ const moveModule = await transport.graphqlQuery(
200
+ {
201
+ query: GetMoveFunctionArgTypesDocument,
202
+ variables: {
203
+ module,
204
+ packageId: pkg,
205
+ function: fn
206
+ }
207
+ },
208
+ (data) => data.object?.asMovePackage?.module?.function?.parameters
209
+ );
210
+ return moveModule.map((parameter) => {
211
+ if (!parameter.signature.body.datatype) {
212
+ return "Pure";
213
+ }
214
+ return {
215
+ Object: parameter.signature.ref === "&" ? "ByImmutableReference" : parameter.signature.ref === "&mut" ? "ByMutableReference" : "ByValue"
216
+ };
217
+ });
218
+ },
219
+ async getNormalizedMoveFunction(transport, [pkg, module, fn]) {
220
+ const moveFunction = await transport.graphqlQuery(
221
+ {
222
+ query: GetNormalizedMoveFunctionDocument,
223
+ variables: {
224
+ module,
225
+ packageId: pkg,
226
+ function: fn
227
+ }
228
+ },
229
+ (data) => data.object?.asMovePackage?.module?.function
230
+ );
231
+ return mapNormalizedMoveFunction(moveFunction);
232
+ },
233
+ async getNormalizedMoveModulesByPackage(transport, [pkg]) {
234
+ const movePackage = await transport.graphqlQuery(
235
+ {
236
+ query: GetNormalizedMoveModulesByPackageDocument,
237
+ variables: {
238
+ packageId: pkg
239
+ }
240
+ },
241
+ (data) => data.object?.asMovePackage
242
+ );
243
+ let hasNextPage = movePackage.modules?.pageInfo.hasNextPage ?? false;
244
+ let cursor = movePackage.modules?.pageInfo.endCursor;
245
+ while (hasNextPage) {
246
+ const page = await transport.graphqlQuery(
247
+ {
248
+ query: GetNormalizedMoveModulesByPackageDocument,
249
+ variables: {
250
+ packageId: pkg,
251
+ cursor
252
+ }
253
+ },
254
+ (data) => data.object?.asMovePackage
255
+ );
256
+ movePackage.modules?.nodes.push(...page.modules?.nodes ?? []);
257
+ hasNextPage = page.modules?.pageInfo.hasNextPage ?? false;
258
+ cursor = page.modules?.pageInfo.endCursor;
259
+ }
260
+ const address = toShortTypeString(movePackage.address);
261
+ const modules = {};
262
+ for (const moveModule of movePackage.modules?.nodes ?? []) {
263
+ let hasMoreFriends = moveModule.friends?.pageInfo.hasNextPage ?? false;
264
+ let hasMoreFunctions = moveModule.functions?.pageInfo.hasNextPage ?? false;
265
+ let hasMoreStructs = moveModule.structs?.pageInfo.hasNextPage ?? false;
266
+ let afterFriends = moveModule.friends?.pageInfo.endCursor;
267
+ let afterFunctions = moveModule.functions?.pageInfo.endCursor;
268
+ let afterStructs = moveModule.structs?.pageInfo.endCursor;
269
+ while (hasMoreFriends || hasMoreStructs || hasMoreFunctions) {
270
+ const page = await transport.graphqlQuery(
271
+ {
272
+ query: PaginateMoveModuleListsDocument,
273
+ variables: {
274
+ module: moveModule.name,
275
+ packageId: pkg,
276
+ hasMoreFriends,
277
+ hasMoreFunctions,
278
+ hasMoreStructs,
279
+ afterFriends,
280
+ afterFunctions,
281
+ afterStructs
282
+ }
283
+ },
284
+ (data) => data.object?.asMovePackage?.module
285
+ );
286
+ moveModule.friends.nodes.push(...page.friends?.nodes ?? []);
287
+ moveModule.functions?.nodes.push(...page.functions?.nodes ?? []);
288
+ moveModule.structs?.nodes.push(...page.structs?.nodes ?? []);
289
+ hasMoreFriends = page.friends?.pageInfo.hasNextPage ?? false;
290
+ hasMoreFunctions = page.functions?.pageInfo.hasNextPage ?? false;
291
+ hasMoreStructs = page.structs?.pageInfo.hasNextPage ?? false;
292
+ afterFriends = page.friends?.pageInfo.endCursor;
293
+ afterFunctions = page.functions?.pageInfo.endCursor;
294
+ afterStructs = page.structs?.pageInfo.endCursor;
295
+ }
296
+ }
297
+ movePackage.modules?.nodes.forEach((module) => {
298
+ modules[module.name] = mapNormalizedMoveModule(module, address);
299
+ });
300
+ return modules;
301
+ },
302
+ async getNormalizedMoveModule(transport, [pkg, module]) {
303
+ const moveModule = await transport.graphqlQuery(
304
+ {
305
+ query: GetNormalizedMoveModuleDocument,
306
+ variables: {
307
+ module,
308
+ packageId: pkg
309
+ }
310
+ },
311
+ (data) => data.object?.asMovePackage?.module
312
+ );
313
+ let hasMoreFriends = moveModule.friends?.pageInfo.hasNextPage ?? false;
314
+ let hasMoreFunctions = moveModule.functions?.pageInfo.hasNextPage ?? false;
315
+ let hasMoreStructs = moveModule.structs?.pageInfo.hasNextPage ?? false;
316
+ let afterFriends = moveModule.friends?.pageInfo.endCursor;
317
+ let afterFunctions = moveModule.functions?.pageInfo.endCursor;
318
+ let afterStructs = moveModule.structs?.pageInfo.endCursor;
319
+ while (hasMoreFriends || hasMoreStructs || hasMoreFunctions) {
320
+ const page = await transport.graphqlQuery(
321
+ {
322
+ query: PaginateMoveModuleListsDocument,
323
+ variables: {
324
+ module,
325
+ packageId: pkg,
326
+ hasMoreFriends,
327
+ hasMoreFunctions,
328
+ hasMoreStructs,
329
+ afterFriends,
330
+ afterFunctions,
331
+ afterStructs
332
+ }
333
+ },
334
+ (data) => data.object?.asMovePackage?.module
335
+ );
336
+ moveModule.friends.nodes.push(...page.friends?.nodes ?? []);
337
+ moveModule.functions?.nodes.push(...page.functions?.nodes ?? []);
338
+ moveModule.structs?.nodes.push(...page.structs?.nodes ?? []);
339
+ hasMoreFriends = page.friends?.pageInfo.hasNextPage ?? false;
340
+ hasMoreFunctions = page.functions?.pageInfo.hasNextPage ?? false;
341
+ hasMoreStructs = page.structs?.pageInfo.hasNextPage ?? false;
342
+ afterFriends = page.friends?.pageInfo.endCursor;
343
+ afterFunctions = page.functions?.pageInfo.endCursor;
344
+ afterStructs = page.structs?.pageInfo.endCursor;
345
+ }
346
+ return mapNormalizedMoveModule(moveModule, normalizeIotaAddress(pkg));
347
+ },
348
+ async getNormalizedMoveStruct(transport, [pkg, module, struct]) {
349
+ const moveStruct = await transport.graphqlQuery(
350
+ {
351
+ query: GetNormalizedMoveStructDocument,
352
+ variables: {
353
+ packageId: pkg,
354
+ module,
355
+ struct
356
+ }
357
+ },
358
+ (data) => data.object?.asMovePackage?.module?.struct
359
+ );
360
+ return mapNormalizedMoveStruct(moveStruct);
361
+ },
362
+ async getOwnedObjects(transport, [owner, { filter: inputFilter, options }, cursor, limit]) {
363
+ let filter;
364
+ let typeFilter;
365
+ if (inputFilter) {
366
+ if ("Package" in inputFilter) {
367
+ typeFilter = inputFilter.Package;
368
+ } else if ("MoveModule" in inputFilter) {
369
+ typeFilter = `${inputFilter.MoveModule.package}::${inputFilter.MoveModule.module}`;
370
+ } else if ("StructType" in inputFilter) {
371
+ typeFilter = inputFilter.StructType;
372
+ }
373
+ filter = {
374
+ objectIds: "ObjectIds" in inputFilter ? inputFilter.ObjectIds : "ObjectId" in inputFilter ? [inputFilter.ObjectId] : void 0,
375
+ type: typeFilter,
376
+ owner: "ObjectOwner" in inputFilter ? inputFilter.ObjectOwner : "AddressOwner" in inputFilter ? inputFilter.AddressOwner : void 0
377
+ };
378
+ const unsupportedFilters = [];
379
+ for (const unsupportedFilter of unsupportedFilters) {
380
+ if (unsupportedFilter in inputFilter) {
381
+ throw new UnsupportedParamError("getOwnedObjects", unsupportedFilter);
382
+ }
383
+ }
384
+ }
385
+ const { nodes: objects, pageInfo } = await transport.graphqlQuery(
386
+ {
387
+ query: GetOwnedObjectsDocument,
388
+ variables: {
389
+ owner,
390
+ limit,
391
+ cursor,
392
+ showBcs: options?.showBcs,
393
+ showContent: options?.showContent,
394
+ showDisplay: options?.showDisplay,
395
+ showOwner: options?.showOwner,
396
+ showPreviousTransaction: options?.showPreviousTransaction,
397
+ showStorageRebate: options?.showStorageRebate,
398
+ showType: options?.showType,
399
+ filter
400
+ }
401
+ },
402
+ (data) => data.address?.objects
403
+ );
404
+ return {
405
+ hasNextPage: pageInfo.hasNextPage,
406
+ nextCursor: pageInfo.endCursor,
407
+ data: objects.map((object) => ({
408
+ data: mapGraphQLMoveObjectToRpcObject(object, options ?? {})
409
+ }))
410
+ };
411
+ },
412
+ async getObject(transport, [id, options]) {
413
+ const object = await transport.graphqlQuery(
414
+ {
415
+ query: GetObjectDocument,
416
+ variables: {
417
+ id,
418
+ showBcs: options?.showBcs,
419
+ showContent: options?.showContent,
420
+ showDisplay: options?.showDisplay,
421
+ showOwner: options?.showOwner,
422
+ showPreviousTransaction: options?.showPreviousTransaction,
423
+ showStorageRebate: options?.showStorageRebate,
424
+ showType: options?.showType
425
+ }
426
+ },
427
+ (data) => data.object
428
+ );
429
+ return {
430
+ data: mapGraphQLObjectToRpcObject(object, options ?? {})
431
+ };
432
+ },
433
+ async tryGetPastObject(transport, [id, version, options]) {
434
+ const data = await transport.graphqlQuery({
435
+ query: TryGetPastObjectDocument,
436
+ variables: {
437
+ id,
438
+ version,
439
+ showBcs: options?.showBcs,
440
+ showContent: options?.showContent,
441
+ showDisplay: options?.showDisplay,
442
+ showOwner: options?.showOwner,
443
+ showPreviousTransaction: options?.showPreviousTransaction,
444
+ showStorageRebate: options?.showStorageRebate,
445
+ showType: options?.showType
446
+ }
447
+ });
448
+ if (!data.current) {
449
+ return {
450
+ details: "Could not find the referenced object",
451
+ status: "ObjectNotExists"
452
+ };
453
+ }
454
+ if (!data.object) {
455
+ return data.current.version < Number(version) ? {
456
+ status: "VersionTooHigh",
457
+ details: {
458
+ asked_version: String(version),
459
+ latest_version: String(data.current.version),
460
+ object_id: data.current.address
461
+ }
462
+ } : {
463
+ status: "VersionNotFound",
464
+ details: [data.current.address, String(version)]
465
+ };
466
+ }
467
+ return {
468
+ status: "VersionFound",
469
+ details: mapGraphQLObjectToRpcObject(data.object, options ?? {})
470
+ };
471
+ },
472
+ async multiGetObjects(transport, [ids, options]) {
473
+ const objects = await transport.graphqlQuery(
474
+ {
475
+ query: MultiGetObjectsDocument,
476
+ variables: {
477
+ ids,
478
+ showBcs: options?.showBcs,
479
+ showContent: options?.showContent,
480
+ showDisplay: options?.showDisplay,
481
+ showOwner: options?.showOwner,
482
+ showPreviousTransaction: options?.showPreviousTransaction,
483
+ showStorageRebate: options?.showStorageRebate,
484
+ showType: options?.showType,
485
+ limit: ids.length
486
+ }
487
+ },
488
+ (data) => data.objects?.nodes
489
+ );
490
+ return objects.map((object) => ({
491
+ data: mapGraphQLObjectToRpcObject(object, options ?? {})
492
+ }));
493
+ },
494
+ async queryTransactionBlocks(transport, [{ filter, options }, cursor, limit = 20, descending]) {
495
+ const pagination = descending ? {
496
+ last: limit,
497
+ before: cursor
498
+ } : {
499
+ first: limit,
500
+ after: cursor
501
+ };
502
+ const unsupportedFilters = ["FromOrToAddress", "FromAndToAddress", "TransactionKindIn"];
503
+ if (filter) {
504
+ for (const unsupportedFilter of unsupportedFilters) {
505
+ if (unsupportedFilter in filter) {
506
+ throw new UnsupportedParamError("queryTransactionBlocks", unsupportedFilter);
507
+ }
508
+ }
509
+ }
510
+ let graphqlTransactionKindFilter;
511
+ if ("TransactionKind" in filter) {
512
+ switch (filter.TransactionKind) {
513
+ case "ProgrammableTransaction":
514
+ graphqlTransactionKindFilter = TransactionBlockKindInput.ProgrammableTx;
515
+ break;
516
+ case "Genesis":
517
+ graphqlTransactionKindFilter = TransactionBlockKindInput.Genesis;
518
+ break;
519
+ case "ConsensusCommitPrologueV1":
520
+ graphqlTransactionKindFilter = TransactionBlockKindInput.ConsensusCommitPrologueV1;
521
+ break;
522
+ case "AuthenticatorStateUpdateV1":
523
+ graphqlTransactionKindFilter = TransactionBlockKindInput.AuthenticatorStateUpdateV1;
524
+ break;
525
+ case "RandomnessStateUpdate":
526
+ graphqlTransactionKindFilter = TransactionBlockKindInput.RandomnessStateUpdate;
527
+ break;
528
+ case "EndOfEpochTransaction":
529
+ graphqlTransactionKindFilter = TransactionBlockKindInput.EndOfEpochTx;
530
+ break;
531
+ case "SystemTransaction":
532
+ graphqlTransactionKindFilter = TransactionBlockKindInput.SystemTx;
533
+ break;
534
+ }
535
+ }
536
+ const { nodes: transactionBlocks, pageInfo } = await transport.graphqlQuery(
537
+ {
538
+ query: QueryTransactionBlocksDocument,
539
+ variables: {
540
+ ...pagination,
541
+ showBalanceChanges: options?.showBalanceChanges,
542
+ showEffects: options?.showEffects,
543
+ showEvents: options?.showEvents,
544
+ showInput: options?.showInput,
545
+ showObjectChanges: options?.showObjectChanges,
546
+ showRawEffects: options?.showRawEffects,
547
+ showRawInput: options?.showRawInput,
548
+ filter: filter ? {
549
+ atCheckpoint: "Checkpoint" in filter ? Number.parseInt(filter.Checkpoint) : void 0,
550
+ function: "MoveFunction" in filter ? `${filter.MoveFunction.package}::${filter.MoveFunction.module}::${filter.MoveFunction.function}` : void 0,
551
+ inputObject: "InputObject" in filter ? filter.InputObject : void 0,
552
+ changedObject: "ChangedObject" in filter ? filter.ChangedObject : void 0,
553
+ signAddress: "FromAddress" in filter ? filter.FromAddress : void 0,
554
+ recvAddress: "ToAddress" in filter ? filter.ToAddress : void 0,
555
+ kind: graphqlTransactionKindFilter
556
+ } : {}
557
+ }
558
+ },
559
+ (data) => data.transactionBlocks
560
+ );
561
+ for (const transactionBlock of transactionBlocks) {
562
+ await paginateTransactionBlockLists(transport, transactionBlock);
563
+ }
564
+ if (pagination.last) {
565
+ transactionBlocks.reverse();
566
+ }
567
+ return {
568
+ hasNextPage: pagination.last ? pageInfo.hasPreviousPage : pageInfo.hasNextPage,
569
+ nextCursor: pagination.last ? pageInfo.startCursor : pageInfo.endCursor,
570
+ data: transactionBlocks.map(
571
+ (transactionBlock) => mapGraphQLTransactionBlockToRpcTransactionBlock(transactionBlock, options ?? {})
572
+ )
573
+ };
574
+ },
575
+ async getTransactionBlock(transport, [digest, options]) {
576
+ const transactionBlock = await transport.graphqlQuery(
577
+ {
578
+ query: GetTransactionBlockDocument,
579
+ variables: {
580
+ digest,
581
+ showBalanceChanges: options?.showBalanceChanges,
582
+ showEffects: options?.showEffects,
583
+ showEvents: options?.showEvents,
584
+ showInput: options?.showInput,
585
+ showObjectChanges: options?.showObjectChanges,
586
+ showRawEffects: options?.showRawEffects,
587
+ showRawInput: options?.showRawInput
588
+ }
589
+ },
590
+ (data) => data.transactionBlock
591
+ );
592
+ await paginateTransactionBlockLists(transport, transactionBlock);
593
+ return mapGraphQLTransactionBlockToRpcTransactionBlock(transactionBlock, options);
594
+ },
595
+ async multiGetTransactionBlocks(transport, [digests, options]) {
596
+ const transactionBlocks = await transport.graphqlQuery(
597
+ {
598
+ query: MultiGetTransactionBlocksDocument,
599
+ variables: {
600
+ digests,
601
+ showBalanceChanges: options?.showBalanceChanges,
602
+ showEffects: options?.showEffects,
603
+ showEvents: options?.showEvents,
604
+ showInput: options?.showInput,
605
+ showObjectChanges: options?.showObjectChanges,
606
+ showRawEffects: options?.showEffects,
607
+ showRawInput: options?.showRawInput,
608
+ limit: digests.length
609
+ }
610
+ },
611
+ (data) => data.transactionBlocks?.nodes
612
+ );
613
+ for (const transactionBlock of transactionBlocks) {
614
+ await paginateTransactionBlockLists(transport, transactionBlock);
615
+ }
616
+ return transactionBlocks.map(
617
+ (transactionBlock) => mapGraphQLTransactionBlockToRpcTransactionBlock(transactionBlock, options)
618
+ );
619
+ },
620
+ async getTotalTransactionBlocks(transport) {
621
+ return transport.graphqlQuery(
622
+ {
623
+ query: GetTotalTransactionBlocksDocument
624
+ },
625
+ (data) => BigInt(data.checkpoint?.networkTotalTransactions)
626
+ );
627
+ },
628
+ async getReferenceGasPrice(transport) {
629
+ const epoch = await transport.graphqlQuery(
630
+ {
631
+ query: GetReferenceGasPriceDocument,
632
+ variables: {}
633
+ },
634
+ (data) => data.epoch
635
+ );
636
+ return BigInt(epoch.referenceGasPrice);
637
+ },
638
+ async getStakes(transport, [owner]) {
639
+ const stakes = await transport.graphqlQuery(
640
+ {
641
+ query: GetStakesDocument,
642
+ variables: {
643
+ owner
644
+ }
645
+ },
646
+ (data) => data.address?.stakedIotas?.nodes
647
+ );
648
+ return mapGraphQLStakeToRpcStake(stakes);
649
+ },
650
+ async getStakesByIds(transport, [stakedIotaIds]) {
651
+ const stakes = await transport.graphqlQuery(
652
+ {
653
+ query: GetStakesByIdsDocument,
654
+ variables: {
655
+ ids: stakedIotaIds
656
+ }
657
+ },
658
+ (data) => data.objects?.nodes.map((node) => node?.asMoveObject?.asStakedIota).filter(Boolean)
659
+ );
660
+ return mapGraphQLStakeToRpcStake(stakes);
661
+ },
662
+ async getLatestIotaSystemStateV2(transport) {
663
+ const systemState = await transport.graphqlQuery(
664
+ {
665
+ query: GetLatestIotaSystemStateDocument
666
+ },
667
+ (data) => data.epoch
668
+ );
669
+ let hasMoreActiveValidators = systemState.validatorSet?.activeValidators?.pageInfo.hasNextPage ?? false;
670
+ let afterActiveValidators = systemState.validatorSet?.activeValidators?.pageInfo.endCursor;
671
+ while (hasMoreActiveValidators) {
672
+ const page = await transport.graphqlQuery(
673
+ {
674
+ query: PaginateEpochValidatorsDocument,
675
+ variables: {
676
+ id: systemState.epochId,
677
+ after: afterActiveValidators
678
+ }
679
+ },
680
+ (data) => data.epoch
681
+ );
682
+ systemState.validatorSet?.activeValidators?.nodes.push(
683
+ ...page.validatorSet?.activeValidators?.nodes ?? []
684
+ );
685
+ hasMoreActiveValidators = page.validatorSet?.activeValidators?.pageInfo.hasNextPage ?? false;
686
+ afterActiveValidators = page.validatorSet?.activeValidators?.pageInfo.endCursor;
687
+ }
688
+ let hasMoreCommitteeMembers = systemState.validatorSet?.committeeMembers?.pageInfo.hasNextPage ?? false;
689
+ let afterCommitteeMembers = systemState.validatorSet?.committeeMembers?.pageInfo.endCursor;
690
+ while (hasMoreCommitteeMembers) {
691
+ const page = await transport.graphqlQuery(
692
+ {
693
+ query: PaginateEpochValidatorsDocument,
694
+ variables: {
695
+ id: systemState.epochId,
696
+ after: afterCommitteeMembers
697
+ }
698
+ },
699
+ (data) => data.epoch
700
+ );
701
+ systemState.validatorSet?.committeeMembers?.nodes.push(
702
+ ...page.validatorSet?.committeeMembers?.nodes ?? []
703
+ );
704
+ hasMoreCommitteeMembers = page.validatorSet?.committeeMembers?.pageInfo.hasNextPage ?? false;
705
+ afterCommitteeMembers = page.validatorSet?.committeeMembers?.pageInfo.endCursor;
706
+ }
707
+ return {
708
+ V2: {
709
+ activeValidators: systemState.validatorSet?.activeValidators?.nodes.map(
710
+ mapGraphQlValidatorToRpcValidator
711
+ ),
712
+ committeeMembers: systemState.validatorSet?.committeeMembers?.nodes?.map(
713
+ (_, index) => index.toString()
714
+ ),
715
+ atRiskValidators: systemState.validatorSet?.activeValidators.nodes?.filter((validator) => validator.atRisk).map((validator) => [
716
+ validator.address.address,
717
+ validator.atRisk.toString()
718
+ ]),
719
+ epoch: String(systemState.epochId),
720
+ epochDurationMs: String(
721
+ new Date(systemState.endTimestamp).getTime() - new Date(systemState.startTimestamp).getTime()
722
+ ),
723
+ epochStartTimestampMs: String(new Date(systemState.startTimestamp).getTime()),
724
+ inactivePoolsSize: String(systemState.validatorSet?.inactivePoolsSize),
725
+ iotaTotalSupply: String(systemState.iotaTotalSupply),
726
+ iotaTreasuryCapId: String(systemState.iotaTreasuryCapId),
727
+ maxValidatorCount: String(systemState.systemParameters?.maxValidatorCount),
728
+ minValidatorCount: String(systemState.systemParameters?.minValidatorCount),
729
+ minValidatorJoiningStake: String(
730
+ systemState.systemParameters?.minValidatorJoiningStake
731
+ ),
732
+ pendingActiveValidatorsSize: String(
733
+ systemState.validatorSet?.pendingActiveValidatorsSize
734
+ ),
735
+ pendingRemovals: systemState.validatorSet?.pendingRemovals?.map((idx) => String(idx)) ?? [],
736
+ protocolVersion: String(systemState.protocolConfigs?.protocolVersion),
737
+ referenceGasPrice: String(systemState.referenceGasPrice),
738
+ safeMode: systemState.safeMode?.enabled,
739
+ safeModeComputationCharges: String(
740
+ systemState.safeMode?.gasSummary?.computationCost
741
+ ),
742
+ safeModeComputationChargesBurned: String(
743
+ systemState.safeMode?.gasSummary?.computationCostBurned
744
+ ),
745
+ safeModeNonRefundableStorageFee: String(
746
+ systemState.safeMode?.gasSummary?.nonRefundableStorageFee
747
+ ),
748
+ safeModeStorageRebates: String(systemState.safeMode?.gasSummary?.storageRebate),
749
+ safeModeStorageCharges: String(systemState.safeMode?.gasSummary?.storageCost),
750
+ stakingPoolMappingsSize: String(systemState.validatorSet?.stakingPoolMappingsSize),
751
+ storageFundNonRefundableBalance: String(
752
+ systemState.storageFund?.nonRefundableBalance
753
+ ),
754
+ storageFundTotalObjectStorageRebates: String(
755
+ systemState.storageFund?.totalObjectStorageRebates
756
+ ),
757
+ systemStateVersion: String(systemState.systemStateVersion),
758
+ totalStake: systemState.validatorSet?.totalStake,
759
+ validatorCandidatesSize: systemState.validatorSet?.validatorCandidatesSize?.toString(),
760
+ validatorLowStakeGracePeriod: systemState.systemParameters?.validatorLowStakeGracePeriod,
761
+ validatorLowStakeThreshold: systemState.systemParameters?.validatorLowStakeThreshold,
762
+ validatorReportRecords: [],
763
+ // TODO
764
+ validatorVeryLowStakeThreshold: systemState.systemParameters?.validatorVeryLowStakeThreshold,
765
+ validatorCandidatesId: systemState.validatorSet?.validatorCandidatesId,
766
+ inactivePoolsId: systemState.validatorSet?.inactivePoolsId,
767
+ pendingActiveValidatorsId: systemState.validatorSet?.pendingActiveValidatorsId,
768
+ stakingPoolMappingsId: systemState.validatorSet?.stakingPoolMappingsId
769
+ }
770
+ };
771
+ },
772
+ async queryEvents(transport, [query, cursor, limit, descending]) {
773
+ const pagination = descending ? { last: limit, before: cursor } : { first: limit, after: cursor };
774
+ const filter = {
775
+ sender: "Sender" in query ? query.Sender : void 0,
776
+ transactionDigest: "Transaction" in query ? query.Transaction : void 0,
777
+ eventType: "MoveEventType" in query ? query.MoveEventType : void 0,
778
+ emittingModule: "MoveModule" in query ? `${query.MoveModule.package}::${query.MoveModule.module}` : void 0
779
+ };
780
+ if ("MoveEventType" in query) {
781
+ filter.eventType = query.MoveEventType;
782
+ } else if ("MoveEventModule" in query) {
783
+ filter.eventType = `${query.MoveEventModule.package}::${query.MoveEventModule.module}`;
784
+ }
785
+ const unsupportedFilters = [
786
+ "Package",
787
+ "MoveEventField",
788
+ "Any",
789
+ "All",
790
+ "And",
791
+ "Or",
792
+ "TimeRange"
793
+ ];
794
+ if (query) {
795
+ for (const unsupportedFilter of unsupportedFilters) {
796
+ if (unsupportedFilter in query) {
797
+ throw new UnsupportedParamError("queryEvents", unsupportedFilter);
798
+ }
799
+ }
800
+ }
801
+ const { nodes: events, pageInfo } = await transport.graphqlQuery(
802
+ {
803
+ query: QueryEventsDocument,
804
+ variables: {
805
+ ...pagination,
806
+ filter
807
+ }
808
+ },
809
+ (data) => data.events
810
+ );
811
+ if (pagination.last) {
812
+ events.reverse();
813
+ }
814
+ return {
815
+ hasNextPage: pagination.last ? pageInfo.hasPreviousPage : pageInfo.hasNextPage,
816
+ nextCursor: pagination.last ? pageInfo.startCursor : pageInfo.endCursor,
817
+ data: events.map((event) => ({
818
+ bcs: event.bcs,
819
+ bcsEncoding: "base64",
820
+ id: {
821
+ eventSeq: "",
822
+ // TODO
823
+ txDigest: ""
824
+ // TODO
825
+ },
826
+ packageId: event.sendingModule?.package.address,
827
+ parsedJson: event.json,
828
+ sender: event.sender?.address,
829
+ timestampMs: new Date(event.timestamp).getTime().toString(),
830
+ transactionModule: `${event.sendingModule?.package.address}::${event.sendingModule?.name}`,
831
+ type: toShortTypeString(event.type?.repr)
832
+ }))
833
+ };
834
+ },
835
+ async devInspectTransactionBlock(transport, [sender, devInspectTxBytes, gasPrice]) {
836
+ const { transaction, error, results } = await transport.graphqlQuery(
837
+ {
838
+ query: DevInspectTransactionBlockDocument,
839
+ variables: {
840
+ txBytes: devInspectTxBytes,
841
+ txMeta: {
842
+ gasPrice: Number.parseInt(gasPrice),
843
+ sender
844
+ },
845
+ showEffects: true,
846
+ showEvents: true
847
+ }
848
+ },
849
+ (data) => data.dryRunTransactionBlock
850
+ );
851
+ if (!transaction) {
852
+ throw new Error("Unexpected error during dry run");
853
+ }
854
+ const result = mapGraphQLTransactionBlockToRpcTransactionBlock(transaction, {
855
+ showEffects: true,
856
+ showEvents: true
857
+ });
858
+ return {
859
+ error,
860
+ effects: result.effects,
861
+ events: result.events,
862
+ results: results?.map((result2) => ({
863
+ mutableReferenceOutputs: result2.mutatedReferences?.map(
864
+ (ref) => [
865
+ ref.input.__typename === "GasCoin" ? "GasCoin" : ref.input.__typename === "Input" ? {
866
+ Input: ref.input.inputIndex
867
+ } : typeof ref.input.resultIndex === "number" ? {
868
+ NestedResult: [ref.input.cmd, ref.input.resultIndex]
869
+ } : {
870
+ Result: ref.input.cmd
871
+ },
872
+ Array.from(fromBase64(ref.bcs)),
873
+ toShortTypeString(ref.type.repr)
874
+ ]
875
+ ),
876
+ returnValues: result2.returnValues?.map((value) => [
877
+ Array.from(fromBase64(value.bcs)),
878
+ toShortTypeString(value.type.repr)
879
+ ])
880
+ }))
881
+ };
882
+ },
883
+ async getDynamicFields(transport, [parentId, cursor, limit]) {
884
+ const { nodes: fields, pageInfo } = await transport.graphqlQuery(
885
+ {
886
+ query: GetDynamicFieldsDocument,
887
+ variables: {
888
+ parentId,
889
+ first: limit,
890
+ cursor
891
+ }
892
+ },
893
+ (data) => data.owner?.dynamicFields
894
+ );
895
+ return {
896
+ data: fields.map((field) => ({
897
+ bcsName: field.name?.bcs,
898
+ bcsEncoding: "base64",
899
+ digest: field.value?.__typename === "MoveObject" ? field.value.digest : void 0,
900
+ name: {
901
+ type: toShortTypeString(field.name?.type.repr),
902
+ value: field.name?.json
903
+ },
904
+ objectId: field.value?.__typename === "MoveObject" ? field.value.address : void 0,
905
+ objectType: field.value?.__typename === "MoveObject" ? field.value.contents?.type.repr : field.value?.type.repr,
906
+ type: field.value?.__typename === "MoveObject" ? "DynamicObject" : "DynamicField",
907
+ version: field.value?.__typename === "MoveObject" ? field.value.version : void 0
908
+ })),
909
+ nextCursor: pageInfo.endCursor ?? null,
910
+ hasNextPage: pageInfo.hasNextPage
911
+ };
912
+ },
913
+ async getDynamicFieldObjectV2(transport, inputs) {
914
+ return await getDynamicFieldObject(transport, inputs);
915
+ },
916
+ /**
917
+ * @deprecated The V1 of this method is deprecated, use `getDynamicFieldObjectV2` instead.
918
+ */
919
+ async getDynamicFieldObject(transport, [parentId, name]) {
920
+ return await getDynamicFieldObject(transport, [
921
+ parentId,
922
+ name,
923
+ {
924
+ // These are the same defaults as in the JSON RPC.
925
+ showBcs: true,
926
+ showContent: true,
927
+ showDisplay: true,
928
+ showOwner: true,
929
+ showPreviousTransaction: true,
930
+ showStorageRebate: true,
931
+ showType: true
932
+ }
933
+ ]);
934
+ },
935
+ async executeTransactionBlock(transport, [txBytes, signatures, options]) {
936
+ const { effects, errors } = await transport.graphqlQuery(
937
+ {
938
+ query: ExecuteTransactionBlockDocument,
939
+ variables: {
940
+ txBytes,
941
+ signatures,
942
+ showBalanceChanges: options?.showBalanceChanges,
943
+ showEffects: options?.showEffects,
944
+ showEvents: options?.showEvents,
945
+ showInput: options?.showInput,
946
+ showObjectChanges: options?.showObjectChanges,
947
+ showRawEffects: options?.showRawEffects,
948
+ showRawInput: options?.showRawInput
949
+ }
950
+ },
951
+ (data) => data.executeTransactionBlock
952
+ );
953
+ if (!effects?.transactionBlock) {
954
+ const tx = Transaction.from(fromBase64(txBytes));
955
+ return { errors: errors ?? void 0, digest: await tx.getDigest() };
956
+ }
957
+ await paginateTransactionBlockLists(transport, effects.transactionBlock);
958
+ return mapGraphQLTransactionBlockToRpcTransactionBlock(
959
+ effects.transactionBlock,
960
+ options,
961
+ errors
962
+ );
963
+ },
964
+ async dryRunTransactionBlock(transport, [txBytes]) {
965
+ const tx = Transaction.from(fromBase64(txBytes));
966
+ const { transaction, error } = await transport.graphqlQuery(
967
+ {
968
+ query: DryRunTransactionBlockDocument,
969
+ variables: {
970
+ txBytes,
971
+ showBalanceChanges: true,
972
+ showEffects: true,
973
+ showEvents: true,
974
+ showInput: true,
975
+ showObjectChanges: true
976
+ }
977
+ },
978
+ (data) => data.dryRunTransactionBlock
979
+ );
980
+ if (error || !transaction) {
981
+ throw new Error(error ?? "Unexpected error during dry run");
982
+ }
983
+ const result = mapGraphQLTransactionBlockToRpcTransactionBlock(
984
+ { ...transaction, digest: await tx.getDigest() },
985
+ {
986
+ showBalanceChanges: true,
987
+ showEffects: true,
988
+ showEvents: true,
989
+ showInput: true,
990
+ showObjectChanges: true
991
+ }
992
+ );
993
+ return {
994
+ input: result.transaction?.data,
995
+ balanceChanges: result.balanceChanges,
996
+ effects: result.effects,
997
+ events: result.events,
998
+ objectChanges: result.objectChanges
999
+ };
1000
+ },
1001
+ async getLatestCheckpointSequenceNumber(transport) {
1002
+ const sequenceNumber = await transport.graphqlQuery(
1003
+ {
1004
+ query: GetLatestCheckpointSequenceNumberDocument
1005
+ },
1006
+ (data) => data.checkpoint?.sequenceNumber
1007
+ );
1008
+ return sequenceNumber.toString();
1009
+ },
1010
+ async getCheckpoint(transport, [id]) {
1011
+ const checkpoint = await transport.graphqlQuery(
1012
+ {
1013
+ query: GetCheckpointDocument,
1014
+ variables: {
1015
+ id: typeof id === "number" || isNumericString(id) ? {
1016
+ sequenceNumber: Number.parseInt(id.toString(), 10)
1017
+ } : {
1018
+ digest: id
1019
+ }
1020
+ }
1021
+ },
1022
+ (data) => data.checkpoint
1023
+ );
1024
+ await paginateCheckpointLists(transport, checkpoint);
1025
+ return mapGraphQLCheckpointToRpcCheckpoint(checkpoint);
1026
+ },
1027
+ async getCheckpoints(transport, [cursor, limit, descendingOrder]) {
1028
+ const pagination = descendingOrder ? { last: limit, before: cursor } : { first: limit, after: cursor };
1029
+ const { nodes: checkpoints, pageInfo } = await transport.graphqlQuery(
1030
+ {
1031
+ query: GetCheckpointsDocument,
1032
+ variables: {
1033
+ ...pagination
1034
+ }
1035
+ },
1036
+ (data) => data.checkpoints
1037
+ );
1038
+ for (const checkpoint of checkpoints) {
1039
+ await paginateCheckpointLists(transport, checkpoint);
1040
+ }
1041
+ if (pagination.last) {
1042
+ checkpoints.reverse();
1043
+ }
1044
+ return {
1045
+ hasNextPage: pagination.last ? pageInfo.hasPreviousPage : pageInfo.hasNextPage,
1046
+ nextCursor: pagination.last ? pageInfo.startCursor : pageInfo.endCursor,
1047
+ data: checkpoints.map((checkpoint) => mapGraphQLCheckpointToRpcCheckpoint(checkpoint))
1048
+ };
1049
+ },
1050
+ async getCommitteeInfo(transport, [epoch]) {
1051
+ const { validatorSet, epochId } = await transport.graphqlQuery(
1052
+ {
1053
+ query: GetCommitteeInfoDocument,
1054
+ variables: {
1055
+ epochId: epoch ? Number.parseInt(epoch) : void 0
1056
+ }
1057
+ },
1058
+ (data) => data.epoch
1059
+ );
1060
+ let hasNextPage = validatorSet?.committeeMembers?.pageInfo.hasNextPage;
1061
+ let after = validatorSet?.committeeMembers?.pageInfo.endCursor;
1062
+ while (hasNextPage) {
1063
+ const page = await transport.graphqlQuery(
1064
+ {
1065
+ query: GetCommitteeInfoDocument,
1066
+ variables: {
1067
+ epochId: epoch ? Number.parseInt(epoch) : void 0,
1068
+ after
1069
+ }
1070
+ },
1071
+ (data) => data.epoch?.validatorSet?.committeeMembers
1072
+ );
1073
+ validatorSet?.committeeMembers.nodes.push(...page.nodes);
1074
+ hasNextPage = page.pageInfo.hasNextPage;
1075
+ after = page.pageInfo.endCursor;
1076
+ }
1077
+ return {
1078
+ epoch: epochId.toString(),
1079
+ validators: validatorSet?.committeeMembers?.nodes.map((val) => [
1080
+ val.credentials?.authorityPubKey,
1081
+ String(val.votingPower)
1082
+ ])
1083
+ };
1084
+ },
1085
+ async getCurrentEpoch(transport) {
1086
+ const epoch = await transport.graphqlQuery(
1087
+ {
1088
+ query: GetCurrentEpochDocument
1089
+ },
1090
+ (data) => data.epoch
1091
+ );
1092
+ let hasNextPageActiveValidators = epoch.validatorSet?.activeValidators?.pageInfo.hasNextPage;
1093
+ let afterActiveValidators = epoch.validatorSet?.activeValidators?.pageInfo.endCursor;
1094
+ while (hasNextPageActiveValidators) {
1095
+ const page = await transport.graphqlQuery(
1096
+ {
1097
+ query: PaginateEpochValidatorsDocument,
1098
+ variables: {
1099
+ id: epoch.epochId,
1100
+ after: afterActiveValidators
1101
+ }
1102
+ },
1103
+ (data) => data.epoch?.validatorSet?.activeValidators
1104
+ );
1105
+ epoch.validatorSet?.activeValidators?.nodes.push(...page.nodes);
1106
+ hasNextPageActiveValidators = page.pageInfo.hasNextPage;
1107
+ afterActiveValidators = page.pageInfo.endCursor;
1108
+ }
1109
+ let hasNextPageCommitteeMembers = epoch.validatorSet?.committeeMembers?.pageInfo.hasNextPage;
1110
+ let afterCommitteeMembers = epoch.validatorSet?.committeeMembers?.pageInfo.endCursor;
1111
+ while (hasNextPageCommitteeMembers) {
1112
+ const page = await transport.graphqlQuery(
1113
+ {
1114
+ query: PaginateEpochValidatorsDocument,
1115
+ variables: {
1116
+ id: epoch.epochId,
1117
+ after: afterCommitteeMembers
1118
+ }
1119
+ },
1120
+ (data) => data.epoch?.validatorSet?.committeeMembers
1121
+ );
1122
+ epoch.validatorSet?.committeeMembers?.nodes.push(...page.nodes);
1123
+ hasNextPageCommitteeMembers = page.pageInfo.hasNextPage;
1124
+ afterCommitteeMembers = page.pageInfo.endCursor;
1125
+ }
1126
+ const validatorsAddresses = epoch.validatorSet?.activeValidators?.nodes.map((val) => val.address.address) ?? [];
1127
+ const committeeMembersAddresses = epoch.validatorSet?.committeeMembers?.nodes.map((val) => val.address.address) ?? [];
1128
+ const committeeValidatorsIndexes = committeeMembersAddresses.map(
1129
+ (val) => validatorsAddresses.indexOf(val)?.toString()
1130
+ );
1131
+ return {
1132
+ epoch: String(epoch.epochId),
1133
+ validators: epoch.validatorSet?.activeValidators?.nodes.map(
1134
+ mapGraphQlValidatorToRpcValidator
1135
+ ),
1136
+ committeeMembers: committeeValidatorsIndexes,
1137
+ epochTotalTransactions: "0",
1138
+ // TODO
1139
+ firstCheckpointId: epoch.firstCheckpoint?.nodes[0]?.sequenceNumber.toString(),
1140
+ endOfEpochInfo: null,
1141
+ referenceGasPrice: epoch.referenceGasPrice,
1142
+ epochStartTimestamp: new Date(epoch.startTimestamp).getTime().toString()
1143
+ };
1144
+ },
1145
+ async getValidatorsApy(transport) {
1146
+ const epoch = await transport.graphqlQuery(
1147
+ {
1148
+ query: GetValidatorsApyDocument
1149
+ },
1150
+ (data) => data.epoch
1151
+ );
1152
+ let hasNextPage = epoch.validatorSet?.activeValidators?.pageInfo.hasNextPage;
1153
+ let after = epoch.validatorSet?.activeValidators?.pageInfo.endCursor;
1154
+ while (hasNextPage) {
1155
+ const page = await transport.graphqlQuery(
1156
+ {
1157
+ query: PaginateEpochValidatorsDocument,
1158
+ variables: {
1159
+ id: epoch.epochId,
1160
+ after
1161
+ }
1162
+ },
1163
+ (data) => data.epoch
1164
+ );
1165
+ epoch.validatorSet?.activeValidators?.nodes.push(
1166
+ ...page.validatorSet?.activeValidators?.nodes ?? []
1167
+ );
1168
+ hasNextPage = page.validatorSet?.activeValidators?.pageInfo.hasNextPage;
1169
+ after = page.validatorSet?.activeValidators?.pageInfo.endCursor;
1170
+ }
1171
+ return {
1172
+ epoch: String(epoch.epochId),
1173
+ apys: epoch.validatorSet?.activeValidators?.nodes.map((validator) => ({
1174
+ address: validator.address.address,
1175
+ apy: typeof validator.apy === "number" ? validator.apy / 100 : null
1176
+ }))
1177
+ };
1178
+ },
1179
+ async getChainIdentifier(transport) {
1180
+ const identifier = await transport.graphqlQuery(
1181
+ {
1182
+ query: GetChainIdentifierDocument
1183
+ },
1184
+ (data) => data.chainIdentifier
1185
+ );
1186
+ return identifier;
1187
+ },
1188
+ async getProtocolConfig(transport, [version]) {
1189
+ const protocolConfig = await transport.graphqlQuery(
1190
+ {
1191
+ query: GetProtocolConfigDocument,
1192
+ variables: {
1193
+ protocolVersion: version ? Number.parseInt(version) : void 0
1194
+ }
1195
+ },
1196
+ (data) => data.protocolConfig
1197
+ );
1198
+ const featureFlags = {};
1199
+ const attributes = {};
1200
+ const configTypeMap = {
1201
+ max_arguments: "u32",
1202
+ max_gas_payment_objects: "u32",
1203
+ max_modules_in_publish: "u32",
1204
+ max_programmable_tx_commands: "u32",
1205
+ max_pure_argument_size: "u32",
1206
+ max_type_argument_depth: "u32",
1207
+ max_type_arguments: "u32",
1208
+ move_binary_format_version: "u32",
1209
+ min_move_binary_format_version: "u32",
1210
+ random_beacon_reduction_allowed_delta: "u16",
1211
+ random_beacon_dkg_timeout_round: "u32",
1212
+ random_beacon_reduction_lower_bound: "u32",
1213
+ scoring_decision_cutoff_value: "f64",
1214
+ scoring_decision_mad_divisor: "f64",
1215
+ group_ops_bls12381_msm_max_len: "u32",
1216
+ binary_module_handles: "u16",
1217
+ binary_struct_handles: "u16",
1218
+ binary_function_handles: "u16",
1219
+ binary_function_instantiations: "u16",
1220
+ binary_signatures: "u16",
1221
+ binary_constant_pool: "u16",
1222
+ binary_identifiers: "u16",
1223
+ binary_address_identifiers: "u16",
1224
+ binary_struct_defs: "u16",
1225
+ binary_struct_def_instantiations: "u16",
1226
+ binary_function_defs: "u16",
1227
+ binary_field_handles: "u16",
1228
+ binary_field_instantiations: "u16",
1229
+ binary_friend_decls: "u16",
1230
+ max_package_dependencies: "u32",
1231
+ bridge_should_try_to_finalize_committee: "bool",
1232
+ consensus_gc_depth: "u32"
1233
+ };
1234
+ for (const { key, value } of protocolConfig.configs) {
1235
+ attributes[key] = value === null ? null : {
1236
+ [configTypeMap[key] ?? "u64"]: value
1237
+ };
1238
+ }
1239
+ for (const { key, value } of protocolConfig.featureFlags) {
1240
+ featureFlags[key] = value;
1241
+ }
1242
+ return {
1243
+ maxSupportedProtocolVersion: protocolConfig.protocolVersion?.toString(),
1244
+ minSupportedProtocolVersion: "1",
1245
+ protocolVersion: protocolConfig.protocolVersion?.toString(),
1246
+ attributes,
1247
+ featureFlags
1248
+ };
1249
+ },
1250
+ async isTransactionIndexedOnNode(transport, [digest]) {
1251
+ const isTransactionIndexedOnNode = await transport.graphqlQuery(
1252
+ {
1253
+ query: IsTransactionIndexedOnNodeDocument,
1254
+ variables: {
1255
+ digest
1256
+ }
1257
+ },
1258
+ (data) => data.isTransactionIndexedOnNode
1259
+ );
1260
+ return isTransactionIndexedOnNode;
1261
+ }
1262
+ };
1263
+ class UnsupportedParamError extends Error {
1264
+ constructor(method, param) {
1265
+ super(`Parameter ${param} is not supported for ${method} in the GraphQL API`);
1266
+ }
1267
+ }
1268
+ class UnsupportedMethodError extends Error {
1269
+ constructor(method) {
1270
+ super(`Method ${method} is not supported in the GraphQL API`);
1271
+ }
1272
+ }
1273
+ async function paginateTransactionBlockLists(transport, transactionBlock) {
1274
+ let hasMoreEvents = transactionBlock.effects?.events?.pageInfo.hasNextPage ?? false;
1275
+ let hasMoreBalanceChanges = transactionBlock.effects?.balanceChanges?.pageInfo.hasNextPage ?? false;
1276
+ let hasMoreObjectChanges = transactionBlock.effects?.objectChanges?.pageInfo.hasNextPage ?? false;
1277
+ let afterEvents = transactionBlock.effects?.events?.pageInfo.endCursor;
1278
+ let afterBalanceChanges = transactionBlock.effects?.balanceChanges?.pageInfo.endCursor;
1279
+ let afterObjectChanges = transactionBlock.effects?.objectChanges?.pageInfo.endCursor;
1280
+ while (hasMoreEvents || hasMoreBalanceChanges || hasMoreObjectChanges) {
1281
+ const page = await transport.graphqlQuery(
1282
+ {
1283
+ query: PaginateTransactionBlockListsDocument,
1284
+ variables: {
1285
+ digest: transactionBlock.digest,
1286
+ afterEvents,
1287
+ afterBalanceChanges,
1288
+ afterObjectChanges,
1289
+ hasMoreEvents,
1290
+ hasMoreBalanceChanges,
1291
+ hasMoreObjectChanges
1292
+ }
1293
+ },
1294
+ (data) => data.transactionBlock?.effects
1295
+ );
1296
+ transactionBlock.effects?.events?.nodes.push(...page.events?.nodes ?? []);
1297
+ transactionBlock.effects?.balanceChanges?.nodes.push(...page.balanceChanges?.nodes ?? []);
1298
+ transactionBlock.effects?.objectChanges?.nodes.push(...page.objectChanges?.nodes ?? []);
1299
+ hasMoreEvents = page.events?.pageInfo.hasNextPage ?? false;
1300
+ hasMoreBalanceChanges = page.balanceChanges?.pageInfo.hasNextPage ?? false;
1301
+ hasMoreObjectChanges = page.objectChanges?.pageInfo.hasNextPage ?? false;
1302
+ afterEvents = page.events?.pageInfo.endCursor;
1303
+ afterBalanceChanges = page.balanceChanges?.pageInfo.endCursor;
1304
+ afterObjectChanges = page.objectChanges?.pageInfo.endCursor;
1305
+ }
1306
+ }
1307
+ async function paginateCheckpointLists(transport, checkpoint) {
1308
+ let hasNextPage = checkpoint.transactionBlocks.pageInfo.hasNextPage;
1309
+ let after = checkpoint.transactionBlocks.pageInfo.endCursor;
1310
+ while (hasNextPage) {
1311
+ const page = await transport.graphqlQuery(
1312
+ {
1313
+ query: PaginateCheckpointTransactionBlocksDocument,
1314
+ variables: {
1315
+ id: { digest: checkpoint.digest },
1316
+ after
1317
+ }
1318
+ },
1319
+ (data) => data.checkpoint?.transactionBlocks
1320
+ );
1321
+ checkpoint.transactionBlocks.nodes.push(...page.nodes);
1322
+ hasNextPage = page.pageInfo.hasNextPage;
1323
+ after = page.pageInfo.endCursor;
1324
+ }
1325
+ const endOfEpochTx = checkpoint.endOfEpoch.nodes[0];
1326
+ if (endOfEpochTx?.kind?.__typename === "EndOfEpochTransaction" && endOfEpochTx.kind?.transactions.nodes[0].__typename === "ChangeEpochTransactionV2" && endOfEpochTx.kind.transactions.nodes[0].epoch?.epochId) {
1327
+ const validatorSet = endOfEpochTx.kind.transactions.nodes[0].epoch.validatorSet;
1328
+ let hasNextPage2 = validatorSet?.committeeMembers.pageInfo.hasNextPage;
1329
+ let after2 = validatorSet?.committeeMembers.pageInfo.endCursor;
1330
+ while (hasNextPage2) {
1331
+ const page = await transport.graphqlQuery(
1332
+ {
1333
+ query: GetCommitteeInfoDocument,
1334
+ variables: {
1335
+ epochId: endOfEpochTx.kind.transactions.nodes[0].epoch?.epochId,
1336
+ after: after2
1337
+ }
1338
+ },
1339
+ (data) => data.epoch?.validatorSet?.committeeMembers
1340
+ );
1341
+ validatorSet?.committeeMembers.nodes.push(...page.nodes);
1342
+ hasNextPage2 = page.pageInfo?.hasNextPage;
1343
+ after2 = page.pageInfo?.endCursor;
1344
+ }
1345
+ }
1346
+ }
1347
+ async function getDynamicFieldObject(transport, [parentId, name, options]) {
1348
+ const nameLayout = await transport.graphqlQuery(
1349
+ {
1350
+ query: GetTypeLayoutDocument,
1351
+ variables: {
1352
+ type: name.type
1353
+ }
1354
+ },
1355
+ (data) => data.type.layout
1356
+ );
1357
+ const bcsName = mapJsonToBcs(name.value, nameLayout);
1358
+ const parent = await transport.graphqlQuery(
1359
+ {
1360
+ query: GetDynamicFieldObjectDocument,
1361
+ variables: {
1362
+ parentId,
1363
+ name: {
1364
+ type: name.type,
1365
+ bcs: bcsName
1366
+ },
1367
+ showBcs: options?.showBcs,
1368
+ showContent: options?.showContent,
1369
+ showDisplay: options?.showDisplay,
1370
+ showOwner: options?.showOwner,
1371
+ showPreviousTransaction: options?.showPreviousTransaction,
1372
+ showStorageRebate: options?.showStorageRebate,
1373
+ showType: options?.showType
1374
+ }
1375
+ },
1376
+ (data) => {
1377
+ return data.owner?.dynamicObjectField?.value?.__typename === "MoveObject" ? data.owner.dynamicObjectField.value.owner?.__typename === "Parent" ? data.owner.dynamicObjectField.value.owner.parent : void 0 : void 0;
1378
+ }
1379
+ );
1380
+ return {
1381
+ data: {
1382
+ content: parent.asMoveObject ? {
1383
+ dataType: "moveObject",
1384
+ ...moveDataToRpcContent(
1385
+ parent.asMoveObject?.contents?.data,
1386
+ parent.asMoveObject?.contents?.type.layout
1387
+ )
1388
+ } : void 0,
1389
+ digest: parent?.digest,
1390
+ objectId: parent?.address,
1391
+ type: parent?.asMoveObject ? toShortTypeString(parent.asMoveObject.contents?.type.repr) : void 0,
1392
+ version: parent?.version.toString(),
1393
+ storageRebate: parent.storageRebate,
1394
+ previousTransaction: parent.previousTransactionBlock?.digest,
1395
+ owner: parent.owner?.__typename === "Parent" ? {
1396
+ ObjectOwner: parent.owner.parent?.address
1397
+ } : void 0
1398
+ }
1399
+ };
1400
+ }
1401
+ export {
1402
+ RPC_METHODS,
1403
+ UnsupportedMethodError,
1404
+ UnsupportedParamError
1405
+ };
1406
+ //# sourceMappingURL=methods.js.map