@iota/graphql-transport 0.19.0 → 0.19.1
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/CHANGELOG.md +12 -0
- package/dist/cjs/generated/queries.d.ts +58 -53
- package/dist/cjs/generated/queries.d.ts.map +1 -1
- package/dist/cjs/generated/queries.js.map +2 -2
- package/dist/cjs/graphql-websocket-client.js +1 -1
- package/dist/cjs/graphql-websocket-client.js.map +1 -1
- package/dist/cjs/methods.d.ts.map +1 -1
- package/dist/cjs/methods.js.map +1 -1
- package/dist/esm/generated/queries.d.ts +58 -53
- package/dist/esm/generated/queries.d.ts.map +1 -1
- package/dist/esm/generated/queries.js.map +2 -2
- package/dist/esm/graphql-websocket-client.js +1 -1
- package/dist/esm/graphql-websocket-client.js.map +1 -1
- package/dist/esm/methods.d.ts.map +1 -1
- package/dist/esm/methods.js.map +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +2 -8
|
@@ -226,7 +226,7 @@ reconnect_fn = async function() {
|
|
|
226
226
|
};
|
|
227
227
|
class GraphQLSubscription {
|
|
228
228
|
constructor(request) {
|
|
229
|
-
//
|
|
229
|
+
// oxlint-disable-next-line @typescript-eslint/no-explicit-any
|
|
230
230
|
__privateAdd(this, _request);
|
|
231
231
|
__privateAdd(this, _active, false);
|
|
232
232
|
__privateAdd(this, _socket, null);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/graphql-websocket-client.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright (c) 2026 IOTA Stiftung\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { GraphQLDocument } from '@iota/iota-sdk/graphql';\nimport { print } from 'graphql';\n\ninterface ConnectionInitMessage {\n type: 'connection_init';\n payload?: Record<string, unknown>;\n}\n\ninterface ConnectionAckMessage {\n type: 'connection_ack';\n payload?: Record<string, unknown>;\n}\n\ninterface SubscribeMessage {\n id: string;\n type: 'subscribe';\n payload: {\n query: string;\n variables?: Record<string, unknown>;\n operationName?: string;\n extensions?: Record<string, unknown>;\n };\n}\n\ninterface NextMessage {\n id: string;\n type: 'next';\n payload: {\n data?: unknown;\n errors?: Array<{ message: string }>;\n };\n}\n\ninterface ErrorMessage {\n id: string;\n type: 'error';\n payload: Array<{ message: string }>;\n}\n\ninterface CompleteMessage {\n id: string;\n type: 'complete';\n}\n\ninterface PingMessage {\n type: 'ping';\n payload?: Record<string, unknown>;\n}\n\ninterface PongMessage {\n type: 'pong';\n payload?: Record<string, unknown>;\n}\n\ntype ServerMessage =\n | ConnectionAckMessage\n | NextMessage\n | ErrorMessage\n | CompleteMessage\n | PingMessage;\n\n/** The socket or handshake failed, as opposed to the server refusing one operation. */\nexport class GraphQLWebSocketConnectionError extends Error {}\n\nexport type GraphQLSubscriptionVariables = Record<string, unknown>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type GraphQLSubscriptionRequest<T = any> = {\n query: GraphQLDocument;\n /** Resolved on every send, so a resubscribe can carry a resume cursor. */\n variables?: GraphQLSubscriptionVariables | (() => GraphQLSubscriptionVariables | undefined);\n onMessage: (data: T) => void;\n onError?: (errors: Array<{ message: string }>) => void;\n onComplete?: () => void;\n signal?: AbortSignal;\n};\n\n/**\n * Configuration options for the GraphQL WebSocket client.\n */\nexport type GraphQLWebSocketClientOptions = {\n /**\n * Custom WebSocket class to use.\n * Defaults to the global WebSocket class, if available.\n */\n WebSocketConstructor?: typeof WebSocket;\n /**\n * Optional payload to send with the `connection_init` message.\n * Can be used for authentication tokens or other connection-level metadata.\n */\n connectionParams?: Record<string, unknown> | undefined;\n /**\n * Milliseconds to wait for the `connection_ack` message before timing out.\n * @default 30000\n */\n connectionAckTimeout?: number;\n /**\n * Milliseconds between reconnection attempts.\n * @default 3000\n */\n reconnectTimeout?: number;\n /**\n * Maximum number of reconnection attempts before giving up.\n * @default 5\n */\n maxReconnects?: number;\n /**\n * Milliseconds to wait for the server to refuse the operation. graphql-ws does not\n * acknowledge a `subscribe`, so an `error` frame is the only signal. Inside this window it\n * rejects `subscribe()`, after it it goes to `onError`. Messages arrive throughout.\n * @default 250\n */\n startupErrorGrace?: number;\n};\n\ntype ResolvedGraphQLWebSocketClientOptions = {\n WebSocketConstructor: typeof WebSocket;\n connectionParams: Record<string, unknown> | undefined;\n connectionAckTimeout: number;\n reconnectTimeout: number;\n maxReconnects: number;\n startupErrorGrace: number;\n};\n\nconst DEFAULT_OPTIONS: ResolvedGraphQLWebSocketClientOptions = {\n WebSocketConstructor: (typeof WebSocket !== 'undefined'\n ? WebSocket\n : undefined) as typeof WebSocket,\n connectionParams: undefined,\n connectionAckTimeout: 30_000,\n reconnectTimeout: 3_000,\n maxReconnects: 5,\n startupErrorGrace: 250,\n};\n\n/** Codegen's string-mode documents stringify themselves; only a real AST needs printing. */\nfunction toQueryString(query: GraphQLDocument): string {\n if (typeof query === 'string') {\n return query;\n }\n\n return 'kind' in query ? print(query) : String(query);\n}\n\nfunction toWebSocketUrl(httpUrl: string): string {\n const url = new URL(httpUrl);\n url.protocol = url.protocol.replace('http', 'ws');\n return url.toString();\n}\n\nexport class GraphQLWebSocketClient {\n #endpoint: string;\n #options: ResolvedGraphQLWebSocketClientOptions;\n #subscriptionId = 0;\n #disconnects = 0;\n #webSocket: WebSocket | null = null;\n #connectionPromise: Promise<WebSocket> | null = null;\n #subscriptions = new Map<string, GraphQLSubscription>();\n\n constructor(endpoint: string, options: GraphQLWebSocketClientOptions = {}) {\n this.#options = { ...DEFAULT_OPTIONS, ...options };\n\n if (!this.#options.WebSocketConstructor) {\n throw new GraphQLWebSocketConnectionError(\n 'Missing WebSocket constructor. Provide a WebSocketConstructor option or ensure the global WebSocket is available.',\n );\n }\n\n this.#endpoint = endpoint.startsWith('ws') ? endpoint : toWebSocketUrl(endpoint);\n }\n\n async subscribe<T>(request: GraphQLSubscriptionRequest<T>): Promise<() => Promise<boolean>> {\n if (request.signal?.aborted) {\n return async () => false;\n }\n\n const subscription = new GraphQLSubscription(request);\n const id = this.#nextId();\n this.#subscriptions.set(id, subscription);\n\n try {\n await subscription.subscribe(this, id);\n } catch (e) {\n this.#subscriptions.delete(id);\n throw e;\n }\n\n const startupError = await subscription.settleStartup(this.#options.startupErrorGrace);\n\n if (startupError) {\n this.#subscriptions.delete(id);\n throw new Error(\n `GraphQL subscription was rejected: ${startupError\n .map((error) => error.message)\n .join(', ')}`,\n );\n }\n\n const cleanup = async () => {\n const result = await subscription.unsubscribe(this, id);\n this.#subscriptions.delete(id);\n return result;\n };\n\n // A listener added to an already-aborted signal never runs, and the handshake\n // above is awaited.\n if (request.signal?.aborted) {\n await cleanup();\n return async () => false;\n }\n\n request.signal?.addEventListener('abort', cleanup, { once: true });\n\n return cleanup;\n }\n\n async send(\n message: ConnectionInitMessage | SubscribeMessage | CompleteMessage | PongMessage,\n ): Promise<WebSocket> {\n const ws = await this.#setupWebSocket();\n ws.send(JSON.stringify(message));\n return ws;\n }\n\n close(): void {\n for (const subscription of this.#subscriptions.values()) {\n subscription.onComplete();\n }\n this.#subscriptions.clear();\n this.#webSocket?.close();\n this.#webSocket = null;\n this.#connectionPromise = null;\n this.#disconnects = 0;\n }\n\n #nextId(): string {\n this.#subscriptionId += 1;\n return String(this.#subscriptionId);\n }\n\n #setupWebSocket(): Promise<WebSocket> {\n if (this.#connectionPromise) {\n return this.#connectionPromise;\n }\n\n this.#connectionPromise = new Promise<WebSocket>((resolve, reject) => {\n const ws = new this.#options.WebSocketConstructor(\n this.#endpoint,\n 'graphql-transport-ws',\n );\n this.#webSocket = ws;\n\n // Timeout for the connection_ack\n const ackTimeout = setTimeout(() => {\n ws.close();\n reject(new GraphQLWebSocketConnectionError('Connection acknowledgement timeout'));\n }, this.#options.connectionAckTimeout);\n\n let acknowledged = false;\n\n ws.addEventListener('open', () => {\n const initMessage: ConnectionInitMessage = {\n type: 'connection_init',\n ...(this.#options.connectionParams\n ? { payload: this.#options.connectionParams }\n : {}),\n };\n ws.send(JSON.stringify(initMessage));\n });\n\n ws.addEventListener('message', ({ data }: { data: string }) => {\n let message: ServerMessage;\n try {\n message = JSON.parse(data) as ServerMessage;\n } catch (error) {\n console.error(\n new Error(`Failed to parse GraphQL WebSocket message: ${data}`, {\n cause: error,\n }),\n );\n return;\n }\n\n switch (message.type) {\n case 'connection_ack':\n clearTimeout(ackTimeout);\n acknowledged = true;\n this.#disconnects = 0;\n resolve(ws);\n break;\n\n case 'next':\n this.#subscriptions.get(message.id)?.onMessage(message.payload);\n break;\n\n case 'error':\n this.#subscriptions.get(message.id)?.onError(message.payload);\n this.#subscriptions.delete(message.id);\n break;\n\n case 'complete':\n this.#subscriptions.get(message.id)?.onComplete();\n this.#subscriptions.delete(message.id);\n break;\n\n case 'ping':\n // Respond to server keep-alive\n ws.send(JSON.stringify({ type: 'pong' } satisfies PongMessage));\n break;\n }\n });\n\n ws.addEventListener('close', () => {\n if (this.#webSocket !== ws) {\n return;\n }\n\n this.#connectionPromise = null;\n this.#webSocket = null;\n\n if (!acknowledged) {\n clearTimeout(ackTimeout);\n reject(\n new GraphQLWebSocketConnectionError(\n 'WebSocket closed before connection was acknowledged',\n ),\n );\n }\n\n this.#scheduleReconnect();\n });\n\n ws.addEventListener('error', () => {\n if (!acknowledged) {\n clearTimeout(ackTimeout);\n reject(new GraphQLWebSocketConnectionError('WebSocket connection error'));\n }\n });\n });\n\n return this.#connectionPromise;\n }\n\n #scheduleReconnect(): void {\n const live = [...this.#subscriptions.values()].filter(\n (subscription) => subscription.isActive,\n );\n\n if (live.length === 0) {\n return;\n }\n\n this.#disconnects++;\n\n if (this.#disconnects > this.#options.maxReconnects) {\n for (const subscription of live) {\n subscription.onError([{ message: 'WebSocket connection lost' }]);\n }\n this.#subscriptions.clear();\n return;\n }\n\n setTimeout(() => {\n this.#reconnect();\n }, this.#options.reconnectTimeout);\n }\n\n async #reconnect(): Promise<void> {\n // A subscribe() during the reconnect delay is already live on the new socket.\n // A duplicate id makes graphql-transport-ws close the connection with 4409.\n const entries = [...this.#subscriptions.entries()].filter(\n ([, subscription]) => subscription.socket !== this.#webSocket,\n );\n\n await Promise.allSettled(\n entries.map(([id, subscription]) => subscription.subscribe(this, id)),\n );\n }\n}\n\nclass GraphQLSubscription {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n #request: GraphQLSubscriptionRequest<any>;\n #active = false;\n #socket: WebSocket | null = null;\n #startingUp = true;\n #startupError: Array<{ message: string }> | null = null;\n\n constructor(request: GraphQLSubscriptionRequest) {\n this.#request = request;\n }\n\n get isActive(): boolean {\n return this.#active;\n }\n\n /** The socket this operation's `subscribe` frame was last sent on. */\n get socket(): WebSocket | null {\n return this.#socket;\n }\n\n async subscribe(client: GraphQLWebSocketClient, id: string): Promise<void> {\n const variables =\n typeof this.#request.variables === 'function'\n ? this.#request.variables()\n : this.#request.variables;\n\n this.#socket = await client.send({\n id,\n type: 'subscribe',\n payload: {\n query: toQueryString(this.#request.query),\n ...(variables ? { variables } : {}),\n },\n });\n this.#active = true;\n }\n\n async unsubscribe(client: GraphQLWebSocketClient, id: string): Promise<boolean> {\n if (!this.#active) return false;\n this.#active = false;\n try {\n await client.send({ id, type: 'complete' });\n return true;\n } catch {\n return false;\n }\n }\n\n onMessage(payload: NextMessage['payload']): void {\n if (!this.#active) return;\n\n if (payload.errors && payload.errors.length > 0) {\n this.#request.onError?.(payload.errors);\n return;\n }\n\n if (payload.data != null) {\n this.#request.onMessage(payload.data);\n }\n }\n\n /** Closes the startup window and reports an error the server sent inside it, if any. */\n async settleStartup(grace: number): Promise<Array<{ message: string }> | null> {\n await new Promise((resolve) => setTimeout(resolve, grace));\n this.#startingUp = false;\n return this.#startupError;\n }\n\n onError(errors: ErrorMessage['payload']): void {\n this.#active = false;\n\n if (this.#startingUp) {\n this.#startupError = errors;\n return;\n }\n\n this.#request.onError?.(errors);\n }\n\n onComplete(): void {\n this.#active = false;\n this.#request.onComplete?.();\n }\n}\n"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) 2026 IOTA Stiftung\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { GraphQLDocument } from '@iota/iota-sdk/graphql';\nimport { print } from 'graphql';\n\ninterface ConnectionInitMessage {\n type: 'connection_init';\n payload?: Record<string, unknown>;\n}\n\ninterface ConnectionAckMessage {\n type: 'connection_ack';\n payload?: Record<string, unknown>;\n}\n\ninterface SubscribeMessage {\n id: string;\n type: 'subscribe';\n payload: {\n query: string;\n variables?: Record<string, unknown>;\n operationName?: string;\n extensions?: Record<string, unknown>;\n };\n}\n\ninterface NextMessage {\n id: string;\n type: 'next';\n payload: {\n data?: unknown;\n errors?: Array<{ message: string }>;\n };\n}\n\ninterface ErrorMessage {\n id: string;\n type: 'error';\n payload: Array<{ message: string }>;\n}\n\ninterface CompleteMessage {\n id: string;\n type: 'complete';\n}\n\ninterface PingMessage {\n type: 'ping';\n payload?: Record<string, unknown>;\n}\n\ninterface PongMessage {\n type: 'pong';\n payload?: Record<string, unknown>;\n}\n\ntype ServerMessage =\n | ConnectionAckMessage\n | NextMessage\n | ErrorMessage\n | CompleteMessage\n | PingMessage;\n\n/** The socket or handshake failed, as opposed to the server refusing one operation. */\nexport class GraphQLWebSocketConnectionError extends Error {}\n\nexport type GraphQLSubscriptionVariables = Record<string, unknown>;\n\n// oxlint-disable-next-line @typescript-eslint/no-explicit-any\nexport type GraphQLSubscriptionRequest<T = any> = {\n query: GraphQLDocument;\n /** Resolved on every send, so a resubscribe can carry a resume cursor. */\n variables?: GraphQLSubscriptionVariables | (() => GraphQLSubscriptionVariables | undefined);\n onMessage: (data: T) => void;\n onError?: (errors: Array<{ message: string }>) => void;\n onComplete?: () => void;\n signal?: AbortSignal;\n};\n\n/**\n * Configuration options for the GraphQL WebSocket client.\n */\nexport type GraphQLWebSocketClientOptions = {\n /**\n * Custom WebSocket class to use.\n * Defaults to the global WebSocket class, if available.\n */\n WebSocketConstructor?: typeof WebSocket;\n /**\n * Optional payload to send with the `connection_init` message.\n * Can be used for authentication tokens or other connection-level metadata.\n */\n connectionParams?: Record<string, unknown> | undefined;\n /**\n * Milliseconds to wait for the `connection_ack` message before timing out.\n * @default 30000\n */\n connectionAckTimeout?: number;\n /**\n * Milliseconds between reconnection attempts.\n * @default 3000\n */\n reconnectTimeout?: number;\n /**\n * Maximum number of reconnection attempts before giving up.\n * @default 5\n */\n maxReconnects?: number;\n /**\n * Milliseconds to wait for the server to refuse the operation. graphql-ws does not\n * acknowledge a `subscribe`, so an `error` frame is the only signal. Inside this window it\n * rejects `subscribe()`, after it it goes to `onError`. Messages arrive throughout.\n * @default 250\n */\n startupErrorGrace?: number;\n};\n\ntype ResolvedGraphQLWebSocketClientOptions = {\n WebSocketConstructor: typeof WebSocket;\n connectionParams: Record<string, unknown> | undefined;\n connectionAckTimeout: number;\n reconnectTimeout: number;\n maxReconnects: number;\n startupErrorGrace: number;\n};\n\nconst DEFAULT_OPTIONS: ResolvedGraphQLWebSocketClientOptions = {\n WebSocketConstructor: (typeof WebSocket !== 'undefined'\n ? WebSocket\n : undefined) as typeof WebSocket,\n connectionParams: undefined,\n connectionAckTimeout: 30_000,\n reconnectTimeout: 3_000,\n maxReconnects: 5,\n startupErrorGrace: 250,\n};\n\n/** Codegen's string-mode documents stringify themselves; only a real AST needs printing. */\nfunction toQueryString(query: GraphQLDocument): string {\n if (typeof query === 'string') {\n return query;\n }\n\n return 'kind' in query ? print(query) : String(query);\n}\n\nfunction toWebSocketUrl(httpUrl: string): string {\n const url = new URL(httpUrl);\n url.protocol = url.protocol.replace('http', 'ws');\n return url.toString();\n}\n\nexport class GraphQLWebSocketClient {\n #endpoint: string;\n #options: ResolvedGraphQLWebSocketClientOptions;\n #subscriptionId = 0;\n #disconnects = 0;\n #webSocket: WebSocket | null = null;\n #connectionPromise: Promise<WebSocket> | null = null;\n #subscriptions = new Map<string, GraphQLSubscription>();\n\n constructor(endpoint: string, options: GraphQLWebSocketClientOptions = {}) {\n this.#options = { ...DEFAULT_OPTIONS, ...options };\n\n if (!this.#options.WebSocketConstructor) {\n throw new GraphQLWebSocketConnectionError(\n 'Missing WebSocket constructor. Provide a WebSocketConstructor option or ensure the global WebSocket is available.',\n );\n }\n\n this.#endpoint = endpoint.startsWith('ws') ? endpoint : toWebSocketUrl(endpoint);\n }\n\n async subscribe<T>(request: GraphQLSubscriptionRequest<T>): Promise<() => Promise<boolean>> {\n if (request.signal?.aborted) {\n return async () => false;\n }\n\n const subscription = new GraphQLSubscription(request);\n const id = this.#nextId();\n this.#subscriptions.set(id, subscription);\n\n try {\n await subscription.subscribe(this, id);\n } catch (e) {\n this.#subscriptions.delete(id);\n throw e;\n }\n\n const startupError = await subscription.settleStartup(this.#options.startupErrorGrace);\n\n if (startupError) {\n this.#subscriptions.delete(id);\n throw new Error(\n `GraphQL subscription was rejected: ${startupError\n .map((error) => error.message)\n .join(', ')}`,\n );\n }\n\n const cleanup = async () => {\n const result = await subscription.unsubscribe(this, id);\n this.#subscriptions.delete(id);\n return result;\n };\n\n // A listener added to an already-aborted signal never runs, and the handshake\n // above is awaited.\n if (request.signal?.aborted) {\n await cleanup();\n return async () => false;\n }\n\n request.signal?.addEventListener('abort', cleanup, { once: true });\n\n return cleanup;\n }\n\n async send(\n message: ConnectionInitMessage | SubscribeMessage | CompleteMessage | PongMessage,\n ): Promise<WebSocket> {\n const ws = await this.#setupWebSocket();\n ws.send(JSON.stringify(message));\n return ws;\n }\n\n close(): void {\n for (const subscription of this.#subscriptions.values()) {\n subscription.onComplete();\n }\n this.#subscriptions.clear();\n this.#webSocket?.close();\n this.#webSocket = null;\n this.#connectionPromise = null;\n this.#disconnects = 0;\n }\n\n #nextId(): string {\n this.#subscriptionId += 1;\n return String(this.#subscriptionId);\n }\n\n #setupWebSocket(): Promise<WebSocket> {\n if (this.#connectionPromise) {\n return this.#connectionPromise;\n }\n\n this.#connectionPromise = new Promise<WebSocket>((resolve, reject) => {\n const ws = new this.#options.WebSocketConstructor(\n this.#endpoint,\n 'graphql-transport-ws',\n );\n this.#webSocket = ws;\n\n // Timeout for the connection_ack\n const ackTimeout = setTimeout(() => {\n ws.close();\n reject(new GraphQLWebSocketConnectionError('Connection acknowledgement timeout'));\n }, this.#options.connectionAckTimeout);\n\n let acknowledged = false;\n\n ws.addEventListener('open', () => {\n const initMessage: ConnectionInitMessage = {\n type: 'connection_init',\n ...(this.#options.connectionParams\n ? { payload: this.#options.connectionParams }\n : {}),\n };\n ws.send(JSON.stringify(initMessage));\n });\n\n ws.addEventListener('message', ({ data }: { data: string }) => {\n let message: ServerMessage;\n try {\n message = JSON.parse(data) as ServerMessage;\n } catch (error) {\n console.error(\n new Error(`Failed to parse GraphQL WebSocket message: ${data}`, {\n cause: error,\n }),\n );\n return;\n }\n\n switch (message.type) {\n case 'connection_ack':\n clearTimeout(ackTimeout);\n acknowledged = true;\n this.#disconnects = 0;\n resolve(ws);\n break;\n\n case 'next':\n this.#subscriptions.get(message.id)?.onMessage(message.payload);\n break;\n\n case 'error':\n this.#subscriptions.get(message.id)?.onError(message.payload);\n this.#subscriptions.delete(message.id);\n break;\n\n case 'complete':\n this.#subscriptions.get(message.id)?.onComplete();\n this.#subscriptions.delete(message.id);\n break;\n\n case 'ping':\n // Respond to server keep-alive\n ws.send(JSON.stringify({ type: 'pong' } satisfies PongMessage));\n break;\n }\n });\n\n ws.addEventListener('close', () => {\n if (this.#webSocket !== ws) {\n return;\n }\n\n this.#connectionPromise = null;\n this.#webSocket = null;\n\n if (!acknowledged) {\n clearTimeout(ackTimeout);\n reject(\n new GraphQLWebSocketConnectionError(\n 'WebSocket closed before connection was acknowledged',\n ),\n );\n }\n\n this.#scheduleReconnect();\n });\n\n ws.addEventListener('error', () => {\n if (!acknowledged) {\n clearTimeout(ackTimeout);\n reject(new GraphQLWebSocketConnectionError('WebSocket connection error'));\n }\n });\n });\n\n return this.#connectionPromise;\n }\n\n #scheduleReconnect(): void {\n const live = [...this.#subscriptions.values()].filter(\n (subscription) => subscription.isActive,\n );\n\n if (live.length === 0) {\n return;\n }\n\n this.#disconnects++;\n\n if (this.#disconnects > this.#options.maxReconnects) {\n for (const subscription of live) {\n subscription.onError([{ message: 'WebSocket connection lost' }]);\n }\n this.#subscriptions.clear();\n return;\n }\n\n setTimeout(() => {\n this.#reconnect();\n }, this.#options.reconnectTimeout);\n }\n\n async #reconnect(): Promise<void> {\n // A subscribe() during the reconnect delay is already live on the new socket.\n // A duplicate id makes graphql-transport-ws close the connection with 4409.\n const entries = [...this.#subscriptions.entries()].filter(\n ([, subscription]) => subscription.socket !== this.#webSocket,\n );\n\n await Promise.allSettled(\n entries.map(([id, subscription]) => subscription.subscribe(this, id)),\n );\n }\n}\n\nclass GraphQLSubscription {\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n #request: GraphQLSubscriptionRequest<any>;\n #active = false;\n #socket: WebSocket | null = null;\n #startingUp = true;\n #startupError: Array<{ message: string }> | null = null;\n\n constructor(request: GraphQLSubscriptionRequest) {\n this.#request = request;\n }\n\n get isActive(): boolean {\n return this.#active;\n }\n\n /** The socket this operation's `subscribe` frame was last sent on. */\n get socket(): WebSocket | null {\n return this.#socket;\n }\n\n async subscribe(client: GraphQLWebSocketClient, id: string): Promise<void> {\n const variables =\n typeof this.#request.variables === 'function'\n ? this.#request.variables()\n : this.#request.variables;\n\n this.#socket = await client.send({\n id,\n type: 'subscribe',\n payload: {\n query: toQueryString(this.#request.query),\n ...(variables ? { variables } : {}),\n },\n });\n this.#active = true;\n }\n\n async unsubscribe(client: GraphQLWebSocketClient, id: string): Promise<boolean> {\n if (!this.#active) return false;\n this.#active = false;\n try {\n await client.send({ id, type: 'complete' });\n return true;\n } catch {\n return false;\n }\n }\n\n onMessage(payload: NextMessage['payload']): void {\n if (!this.#active) return;\n\n if (payload.errors && payload.errors.length > 0) {\n this.#request.onError?.(payload.errors);\n return;\n }\n\n if (payload.data != null) {\n this.#request.onMessage(payload.data);\n }\n }\n\n /** Closes the startup window and reports an error the server sent inside it, if any. */\n async settleStartup(grace: number): Promise<Array<{ message: string }> | null> {\n await new Promise((resolve) => setTimeout(resolve, grace));\n this.#startingUp = false;\n return this.#startupError;\n }\n\n onError(errors: ErrorMessage['payload']): void {\n this.#active = false;\n\n if (this.#startingUp) {\n this.#startupError = errors;\n return;\n }\n\n this.#request.onError?.(errors);\n }\n\n onComplete(): void {\n this.#active = false;\n this.#request.onComplete?.();\n }\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../../src/methods.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAIR,UAAU,EAIb,MAAM,uBAAuB,CAAC;AA0E/B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAEjE,UAAU,aAAa;IACnB,gBAAgB,EAAE;QACd,IAAI,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC9B,CAAC;CACL;AAED,eAAO,MAAM,WAAW,EAAE;
|
|
1
|
+
{"version":3,"file":"methods.d.ts","sourceRoot":"","sources":["../../src/methods.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAIR,UAAU,EAIb,MAAM,uBAAuB,CAAC;AA0E/B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAC;AAEjE,UAAU,aAAa;IACnB,gBAAgB,EAAE;QACd,IAAI,EAAE;YAAE,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC9B,CAAC;CACL;AAED,eAAO,MAAM,WAAW,EAAE;KAElB,CAAC,IAAI,MAAM,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAC9F,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,GAC/C,CACI,SAAS,EAAE,0BAA0B,EACrC,MAAM,EAAE,GAAG,EAAE,KACZ,CAAC,SAAS,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAClE,KAAK;CAq4Cd,CAAC;AAEF,qBAAa,qBAAsB,SAAQ,KAAK;gBAChC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;CAG5C;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACjC,MAAM,EAAE,MAAM;CAG7B"}
|
package/dist/esm/methods.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/methods.ts"],
|
|
4
|
-
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// Modifications Copyright (c) 2024 IOTA Stiftung\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64 } from '@iota/bcs';\nimport type {\n MoveValue,\n ProtocolConfigValue,\n IotaArgument,\n IotaClient,\n IotaMoveNormalizedModule,\n IotaTransactionKind,\n IotaMoveViewCallResults,\n} from '@iota/iota-sdk/client';\nimport { Transaction } from '@iota/iota-sdk/transactions';\nimport {\n normalizeStructTag,\n normalizeIotaAddress,\n parseStructTag,\n IOTA_TYPE_ARG,\n} from '@iota/iota-sdk/utils';\n\nimport type {\n ObjectFilter,\n QueryEventsQueryVariables,\n QueryTransactionBlocksQueryVariables,\n Rpc_Checkpoint_FieldsFragment,\n Rpc_Transaction_FieldsFragment,\n} from './generated/queries.js';\nimport {\n DevInspectTransactionBlockDocument,\n DryRunTransactionBlockDocument,\n ExecuteTransactionBlockDocument,\n GetAllBalancesDocument,\n GetBalanceDocument,\n GetChainIdentifierDocument,\n GetCheckpointDocument,\n GetCheckpointsDocument,\n GetCoinMetadataDocument,\n GetCoinsDocument,\n GetCommitteeInfoDocument,\n GetCurrentEpochDocument,\n GetDynamicFieldObjectDocument,\n GetDynamicFieldsDocument,\n GetLatestCheckpointSequenceNumberDocument,\n GetLatestIotaSystemStateDocument,\n GetMoveFunctionArgTypesDocument,\n GetNormalizedMoveFunctionDocument,\n GetNormalizedMoveModuleDocument,\n GetNormalizedMoveModulesByPackageDocument,\n GetNormalizedMoveStructDocument,\n GetObjectDocument,\n GetOwnedObjectsDocument,\n GetProtocolConfigDocument,\n GetReferenceGasPriceDocument,\n GetStakesByIdsDocument,\n GetStakesDocument,\n GetTotalSupplyDocument,\n GetTotalTransactionBlocksDocument,\n GetTransactionBlockDocument,\n GetTypeLayoutDocument,\n GetValidatorsApyDocument,\n IsTransactionIndexedOnNodeDocument,\n MultiGetObjectsDocument,\n MultiGetTransactionBlocksDocument,\n PaginateCheckpointTransactionBlocksDocument,\n PaginateEpochValidatorsDocument,\n PaginateMoveModuleListsDocument,\n PaginateTransactionBlockListsDocument,\n QueryEventsDocument,\n QueryTransactionBlocksDocument,\n TryGetPastObjectDocument,\n ViewDocument,\n} from './generated/queries.js';\nimport { mapJsonToBcs } from './mappers/bcs.js';\nimport { mapGraphQLCheckpointToRpcCheckpoint } from './mappers/checkpoint.js';\nimport {\n mapNormalizedMoveFunction,\n mapNormalizedMoveModule,\n mapNormalizedMoveStruct,\n moveDataToRpcContent,\n} from './mappers/move.js';\nimport { mapGraphQLMoveObjectToRpcObject, mapGraphQLObjectToRpcObject } from './mappers/object.js';\nimport { mapGraphQLStakeToRpcStake } from './mappers/stakes.js';\nimport { mapGraphQLTransactionBlockToRpcTransactionBlock } from './mappers/transaction-block.js';\nimport { isNumericString, toGraphQLTransactionKind, toShortTypeString } from './mappers/util.js';\nimport { mapGraphQlValidatorToRpcValidator } from './mappers/validator.js';\nimport type { IotaClientGraphQLTransport } from './transport.js';\n\ninterface ResponseTypes {\n getRpcApiVersion: {\n info: { version?: string };\n };\n}\n\nexport const RPC_METHODS: {\n [K in keyof IotaClient as IotaClient[K] extends (...args: any[]) => Promise<any>\n ? K\n : never]?: IotaClient[K] extends (...args: any[]) => infer R\n ? (\n transport: IotaClientGraphQLTransport,\n inputs: any[],\n ) => K extends keyof ResponseTypes ? Promise<ResponseTypes[K]> : R\n : never;\n} = {\n async getRpcApiVersion(transport) {\n const res = await transport.graphqlRequest({\n query: 'query { __typename }',\n variables: {},\n });\n\n if (!res.ok) {\n throw new Error('Failed to fetch');\n }\n\n return {\n info: {\n version: res.headers.get('x-iota-rpc-version') ?? undefined,\n },\n };\n },\n\n async getCoins(transport, [owner, coinType, cursor, limit]) {\n const { nodes: coins, pageInfo } = await transport.graphqlQuery(\n {\n query: GetCoinsDocument,\n variables: {\n owner,\n type: coinType,\n cursor: cursor,\n first: limit,\n },\n },\n (data) => data.address?.coins,\n );\n\n return {\n data: coins.map((coin) => ({\n balance: coin.coinBalance,\n coinObjectId: coin.address,\n coinType: toShortTypeString(\n normalizeStructTag(parseStructTag(coin.contents?.type.repr!).typeParams[0]),\n ),\n digest: coin.digest!,\n previousTransaction: coin.previousTransactionBlock?.digest!,\n version: String(coin.version!),\n })),\n nextCursor: pageInfo.endCursor,\n hasNextPage: pageInfo.hasNextPage,\n };\n },\n\n async getAllCoins(transport, inputs) {\n const { nodes: coins, pageInfo } = await transport.graphqlQuery(\n {\n query: GetCoinsDocument,\n variables: {\n owner: inputs[0],\n cursor: inputs[1],\n first: inputs[2],\n },\n },\n (data) => data.address?.coins,\n );\n\n return {\n data: coins.map((coin) => ({\n balance: coin.coinBalance,\n coinObjectId: coin.address,\n coinType: toShortTypeString(\n normalizeStructTag(parseStructTag(coin.contents?.type.repr!).typeParams[0]),\n ),\n digest: coin.digest!,\n previousTransaction: coin.previousTransactionBlock?.digest!,\n version: String(coin.version!),\n })),\n nextCursor: pageInfo.endCursor,\n hasNextPage: pageInfo.hasNextPage,\n };\n },\n\n async getBalance(transport, inputs) {\n try {\n const balance = await transport.graphqlQuery(\n {\n query: GetBalanceDocument,\n variables: {\n owner: inputs[0],\n type: inputs[1],\n },\n },\n (data) => data.address?.balance,\n );\n\n return {\n coinType: toShortTypeString(balance.coinType?.repr!) || IOTA_TYPE_ARG,\n coinObjectCount: balance.coinObjectCount || 0,\n totalBalance: balance.totalBalance || 0,\n };\n } catch (error) {\n console.warn('GraphQL getBalance failed, falling back to default values:', error);\n return {\n coinType: normalizeStructTag(inputs[1] ?? IOTA_TYPE_ARG),\n coinObjectCount: 0,\n totalBalance: '0',\n };\n }\n },\n\n async getAllBalances(transport, inputs) {\n const balances = await transport.graphqlQuery(\n {\n query: GetAllBalancesDocument,\n variables: {\n owner: inputs[0],\n },\n },\n (data) => data.address?.balances?.nodes,\n );\n\n return balances.map((balance) => ({\n coinType: toShortTypeString(balance.coinType?.repr!),\n coinObjectCount: balance.coinObjectCount!,\n totalBalance: balance.totalBalance,\n }));\n },\n async getCoinMetadata(transport, inputs) {\n const metadata = await transport.graphqlQuery(\n {\n query: GetCoinMetadataDocument,\n variables: {\n coinType: inputs[0],\n },\n },\n (data) => data.coinMetadata,\n );\n\n return {\n decimals: metadata.decimals!,\n name: metadata.name!,\n symbol: metadata.symbol!,\n description: metadata.description!,\n iconUrl: metadata.iconUrl,\n id: metadata.address,\n };\n },\n async getTotalSupply(transport, inputs) {\n const metadata = await transport.graphqlQuery(\n {\n query: GetTotalSupplyDocument,\n variables: {\n coinType: inputs[0],\n },\n },\n (data) => data.coinMetadata,\n );\n\n return {\n value: BigInt(metadata.supply!).toString(),\n };\n },\n async getMoveFunctionArgTypes(transport, [pkg, module, fn]) {\n const moveModule = await transport.graphqlQuery(\n {\n query: GetMoveFunctionArgTypesDocument,\n variables: {\n module: module,\n packageId: pkg,\n function: fn,\n },\n },\n (data) => data.object?.asMovePackage?.module?.function?.parameters,\n );\n\n return moveModule.map((parameter) => {\n if (!parameter.signature.body.datatype) {\n return 'Pure';\n }\n\n return {\n Object:\n parameter.signature.ref === '&'\n ? 'ByImmutableReference'\n : parameter.signature.ref === '&mut'\n ? 'ByMutableReference'\n : 'ByValue',\n };\n });\n },\n async getNormalizedMoveFunction(transport, [pkg, module, fn]) {\n const moveFunction = await transport.graphqlQuery(\n {\n query: GetNormalizedMoveFunctionDocument,\n variables: {\n module: module,\n packageId: pkg,\n function: fn,\n },\n },\n (data) => data.object?.asMovePackage?.module?.function,\n );\n\n return mapNormalizedMoveFunction(moveFunction);\n },\n async getNormalizedMoveModulesByPackage(transport, [pkg]) {\n const movePackage = await transport.graphqlQuery(\n {\n query: GetNormalizedMoveModulesByPackageDocument,\n variables: {\n packageId: pkg,\n },\n },\n (data) => data.object?.asMovePackage,\n );\n\n let hasNextPage = movePackage.modules?.pageInfo.hasNextPage ?? false;\n let cursor = movePackage.modules?.pageInfo.endCursor;\n while (hasNextPage) {\n const page = await transport.graphqlQuery(\n {\n query: GetNormalizedMoveModulesByPackageDocument,\n variables: {\n packageId: pkg,\n cursor,\n },\n },\n (data) => data.object?.asMovePackage,\n );\n\n movePackage.modules?.nodes.push(...(page.modules?.nodes ?? []));\n hasNextPage = page.modules?.pageInfo.hasNextPage ?? false;\n cursor = page.modules?.pageInfo.endCursor;\n }\n\n const address = toShortTypeString(movePackage.address);\n const modules: Record<string, IotaMoveNormalizedModule> = {};\n\n for (const moveModule of movePackage.modules?.nodes ?? []) {\n let hasMoreFriends = moveModule.friends?.pageInfo.hasNextPage ?? false;\n let hasMoreFunctions = moveModule.functions?.pageInfo.hasNextPage ?? false;\n let hasMoreStructs = moveModule.structs?.pageInfo.hasNextPage ?? false;\n let hasMoreEnums = moveModule.enums?.pageInfo.hasNextPage ?? false;\n let afterFriends = moveModule.friends?.pageInfo.endCursor;\n let afterFunctions = moveModule.functions?.pageInfo.endCursor;\n let afterStructs = moveModule.structs?.pageInfo.endCursor;\n let afterEnums = moveModule.enums?.pageInfo.endCursor;\n\n while (hasMoreFriends || hasMoreStructs || hasMoreFunctions || hasMoreEnums) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateMoveModuleListsDocument,\n variables: {\n module: moveModule.name,\n packageId: pkg,\n hasMoreFriends,\n hasMoreFunctions,\n hasMoreStructs,\n hasMoreEnums,\n afterFriends,\n afterFunctions,\n afterStructs,\n afterEnums,\n },\n },\n (data) => data.object?.asMovePackage?.module,\n );\n\n moveModule.friends.nodes.push(...(page.friends?.nodes ?? []));\n moveModule.functions?.nodes.push(...(page.functions?.nodes ?? []));\n moveModule.structs?.nodes.push(...(page.structs?.nodes ?? []));\n moveModule.enums?.nodes.push(...(page.enums?.nodes ?? []));\n hasMoreFriends = page.friends?.pageInfo.hasNextPage ?? false;\n hasMoreFunctions = page.functions?.pageInfo.hasNextPage ?? false;\n hasMoreStructs = page.structs?.pageInfo.hasNextPage ?? false;\n hasMoreEnums = page.enums?.pageInfo.hasNextPage ?? false;\n afterFriends = page.friends?.pageInfo.endCursor;\n afterFunctions = page.functions?.pageInfo.endCursor;\n afterStructs = page.structs?.pageInfo.endCursor;\n afterEnums = page.enums?.pageInfo.endCursor;\n }\n }\n\n movePackage.modules?.nodes.forEach((module) => {\n modules[module.name] = mapNormalizedMoveModule(module, address);\n });\n\n return modules;\n },\n async getNormalizedMoveModule(transport, [pkg, module]) {\n const moveModule = await transport.graphqlQuery(\n {\n query: GetNormalizedMoveModuleDocument,\n variables: {\n module,\n packageId: pkg,\n },\n },\n (data) => data.object?.asMovePackage?.module,\n );\n\n let hasMoreFriends = moveModule.friends?.pageInfo.hasNextPage ?? false;\n let hasMoreFunctions = moveModule.functions?.pageInfo.hasNextPage ?? false;\n let hasMoreStructs = moveModule.structs?.pageInfo.hasNextPage ?? false;\n let hasMoreEnums = moveModule.enums?.pageInfo.hasNextPage ?? false;\n let afterFriends = moveModule.friends?.pageInfo.endCursor;\n let afterFunctions = moveModule.functions?.pageInfo.endCursor;\n let afterStructs = moveModule.structs?.pageInfo.endCursor;\n let afterEnums = moveModule.enums?.pageInfo.endCursor;\n\n while (hasMoreFriends || hasMoreStructs || hasMoreFunctions || hasMoreEnums) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateMoveModuleListsDocument,\n variables: {\n module,\n packageId: pkg,\n hasMoreFriends,\n hasMoreFunctions,\n hasMoreStructs,\n hasMoreEnums,\n afterFriends,\n afterFunctions,\n afterStructs,\n afterEnums,\n },\n },\n (data) => data.object?.asMovePackage?.module,\n );\n\n moveModule.friends.nodes.push(...(page.friends?.nodes ?? []));\n moveModule.functions?.nodes.push(...(page.functions?.nodes ?? []));\n moveModule.structs?.nodes.push(...(page.structs?.nodes ?? []));\n moveModule.enums?.nodes.push(...(page.enums?.nodes ?? []));\n hasMoreFriends = page.friends?.pageInfo.hasNextPage ?? false;\n hasMoreFunctions = page.functions?.pageInfo.hasNextPage ?? false;\n hasMoreStructs = page.structs?.pageInfo.hasNextPage ?? false;\n hasMoreEnums = page.enums?.pageInfo.hasNextPage ?? false;\n afterFriends = page.friends?.pageInfo.endCursor;\n afterFunctions = page.functions?.pageInfo.endCursor;\n afterStructs = page.structs?.pageInfo.endCursor;\n afterEnums = page.enums?.pageInfo.endCursor;\n }\n\n return mapNormalizedMoveModule(moveModule, normalizeIotaAddress(pkg));\n },\n async getNormalizedMoveStruct(transport, [pkg, module, struct]) {\n const moveStruct = await transport.graphqlQuery(\n {\n query: GetNormalizedMoveStructDocument,\n variables: {\n packageId: pkg,\n module,\n struct,\n },\n },\n (data) => data.object?.asMovePackage?.module?.struct,\n );\n\n return mapNormalizedMoveStruct(moveStruct);\n },\n async getOwnedObjects(transport, [owner, { filter: inputFilter, options }, cursor, limit]) {\n let filter: ObjectFilter | undefined;\n let typeFilter: string | undefined;\n\n if (inputFilter) {\n if ('Package' in inputFilter) {\n typeFilter = inputFilter.Package;\n } else if ('MoveModule' in inputFilter) {\n typeFilter = `${inputFilter.MoveModule.package}::${inputFilter.MoveModule.module}`;\n } else if ('StructType' in inputFilter) {\n typeFilter = inputFilter.StructType;\n }\n\n filter = {\n objectIds:\n 'ObjectIds' in inputFilter\n ? inputFilter.ObjectIds\n : 'ObjectId' in inputFilter\n ? [inputFilter.ObjectId]\n : undefined,\n type: typeFilter,\n owner:\n 'ObjectOwner' in inputFilter\n ? inputFilter.ObjectOwner\n : 'AddressOwner' in inputFilter\n ? inputFilter.AddressOwner\n : undefined,\n };\n\n // GraphQL's ObjectFilter doesn't support complex filter composition or version filtering.\n const unsupportedFilters = ['MatchAll', 'MatchAny', 'MatchNone', 'Version'];\n\n for (const unsupportedFilter of unsupportedFilters) {\n if (unsupportedFilter in inputFilter) {\n throw new UnsupportedParamError('getOwnedObjects', unsupportedFilter);\n }\n }\n }\n\n const { nodes: objects, pageInfo } = await transport.graphqlQuery(\n {\n query: GetOwnedObjectsDocument,\n variables: {\n owner,\n limit,\n cursor,\n showBcs: options?.showBcs,\n showContent: options?.showContent,\n showDisplay: options?.showDisplay,\n showOwner: options?.showOwner,\n showPreviousTransaction: options?.showPreviousTransaction,\n showStorageRebate: options?.showStorageRebate,\n showType: options?.showType,\n filter,\n },\n },\n (data) => data.address?.objects,\n );\n\n return {\n hasNextPage: pageInfo.hasNextPage,\n nextCursor: pageInfo.endCursor,\n data: objects.map((object) => ({\n data: mapGraphQLMoveObjectToRpcObject(object, options ?? {}),\n })),\n };\n },\n async getObject(transport, [id, options]) {\n try {\n const object = await transport.graphqlQuery(\n {\n query: GetObjectDocument,\n variables: {\n id,\n showBcs: options?.showBcs,\n showContent: options?.showContent,\n showDisplay: options?.showDisplay,\n showOwner: options?.showOwner,\n showPreviousTransaction: options?.showPreviousTransaction,\n showStorageRebate: options?.showStorageRebate,\n showType: options?.showType,\n },\n },\n (data) => data.object,\n );\n\n return {\n data: mapGraphQLObjectToRpcObject(object, options ?? {}),\n };\n } catch (_) {\n return {\n error: {\n code: 'notExists',\n object_id: id,\n },\n };\n }\n },\n async tryGetPastObject(transport, [id, version, options]) {\n const data = await transport.graphqlQuery({\n query: TryGetPastObjectDocument,\n variables: {\n id,\n version,\n showBcs: options?.showBcs,\n showContent: options?.showContent,\n showDisplay: options?.showDisplay,\n showOwner: options?.showOwner,\n showPreviousTransaction: options?.showPreviousTransaction,\n showStorageRebate: options?.showStorageRebate,\n showType: options?.showType,\n },\n });\n\n if (!data.current) {\n return {\n details: id,\n status: 'ObjectNotExists',\n };\n }\n\n if (!data.object) {\n return data.current.version < Number(version)\n ? {\n status: 'VersionTooHigh',\n details: {\n asked_version: String(version),\n latest_version: String(data.current.version),\n object_id: data.current.address,\n },\n }\n : {\n status: 'VersionNotFound',\n details: [data.current.address, String(version)],\n };\n }\n\n return {\n status: 'VersionFound',\n details: mapGraphQLObjectToRpcObject(data.object, options ?? {}),\n };\n },\n async multiGetObjects(transport, [ids, options]) {\n const objects = await transport.graphqlQuery(\n {\n query: MultiGetObjectsDocument,\n variables: {\n ids,\n showBcs: options?.showBcs,\n showContent: options?.showContent,\n showDisplay: options?.showDisplay,\n showOwner: options?.showOwner,\n showPreviousTransaction: options?.showPreviousTransaction,\n showStorageRebate: options?.showStorageRebate,\n showType: options?.showType,\n limit: ids.length,\n },\n },\n (data) => data.objects?.nodes,\n );\n\n return objects.map((object) => ({\n data: mapGraphQLObjectToRpcObject(object, options ?? {}),\n }));\n },\n async queryTransactionBlocks(transport, [{ filter, options }, cursor, limit = 20, descending]) {\n const pagination: Partial<QueryTransactionBlocksQueryVariables> = descending\n ? {\n last: limit,\n before: cursor,\n }\n : {\n first: limit,\n after: cursor,\n };\n\n const unsupportedFilters = ['FromOrToAddress', 'FromAndToAddress', 'TransactionKindIn'];\n\n if (filter) {\n for (const unsupportedFilter of unsupportedFilters) {\n if (unsupportedFilter in filter) {\n throw new UnsupportedParamError('queryTransactionBlocks', unsupportedFilter);\n }\n }\n }\n\n const graphqlTransactionKindFilter =\n 'TransactionKind' in filter\n ? toGraphQLTransactionKind(filter.TransactionKind as IotaTransactionKind)\n : undefined;\n\n const { nodes: transactionBlocks, pageInfo } = await transport.graphqlQuery(\n {\n query: QueryTransactionBlocksDocument,\n variables: {\n ...pagination,\n showBalanceChanges: options?.showBalanceChanges,\n showEffects: options?.showEffects,\n showEvents: options?.showEvents,\n showInput: options?.showInput,\n showObjectChanges: options?.showObjectChanges,\n showRawEffects: options?.showRawEffects,\n showRawInput: options?.showRawInput,\n filter: filter\n ? {\n atCheckpoint:\n 'Checkpoint' in filter\n ? Number.parseInt(filter.Checkpoint)\n : undefined,\n function:\n 'MoveFunction' in filter\n ? `${filter.MoveFunction.package}::${filter.MoveFunction.module}::${filter.MoveFunction.function}`\n : undefined,\n inputObject: 'InputObject' in filter ? filter.InputObject : undefined,\n changedObject:\n 'ChangedObject' in filter ? filter.ChangedObject : undefined,\n sentAddress: 'FromAddress' in filter ? filter.FromAddress : undefined,\n recvAddress: 'ToAddress' in filter ? filter.ToAddress : undefined,\n kind: graphqlTransactionKindFilter,\n }\n : {},\n },\n },\n (data) => data.transactionBlocks,\n );\n\n for (const transactionBlock of transactionBlocks) {\n await paginateTransactionBlockLists(transport, transactionBlock);\n }\n\n if (pagination.last) {\n transactionBlocks.reverse();\n }\n\n return {\n hasNextPage: pagination.last ? pageInfo.hasPreviousPage : pageInfo.hasNextPage,\n nextCursor: pagination.last ? pageInfo.startCursor : pageInfo.endCursor,\n data: transactionBlocks.map((transactionBlock) =>\n mapGraphQLTransactionBlockToRpcTransactionBlock(transactionBlock, options ?? {}),\n ),\n };\n },\n async getTransactionBlock(transport, [digest, options]) {\n const transactionBlock = await transport.graphqlQuery(\n {\n query: GetTransactionBlockDocument,\n variables: {\n digest,\n showBalanceChanges: options?.showBalanceChanges,\n showEffects: options?.showEffects,\n showEvents: options?.showEvents,\n showInput: options?.showInput,\n showObjectChanges: options?.showObjectChanges,\n showRawEffects: options?.showRawEffects,\n showRawInput: options?.showRawInput,\n },\n },\n (data) => data.transactionBlock,\n );\n\n await paginateTransactionBlockLists(transport, transactionBlock);\n\n return mapGraphQLTransactionBlockToRpcTransactionBlock(transactionBlock, options);\n },\n\n async multiGetTransactionBlocks(transport, [digests, options]) {\n const transactionBlocks = await transport.graphqlQuery(\n {\n query: MultiGetTransactionBlocksDocument,\n variables: {\n digests: digests,\n showBalanceChanges: options?.showBalanceChanges,\n showEffects: options?.showEffects,\n showEvents: options?.showEvents,\n showInput: options?.showInput,\n showObjectChanges: options?.showObjectChanges,\n showRawEffects: options?.showEffects,\n showRawInput: options?.showRawInput,\n limit: digests.length,\n },\n },\n (data) => data.transactionBlocks?.nodes,\n );\n\n for (const transactionBlock of transactionBlocks) {\n await paginateTransactionBlockLists(transport, transactionBlock);\n }\n\n return transactionBlocks.map((transactionBlock) =>\n mapGraphQLTransactionBlockToRpcTransactionBlock(transactionBlock, options),\n );\n },\n async getTotalTransactionBlocks(transport): Promise<bigint> {\n return transport.graphqlQuery(\n {\n query: GetTotalTransactionBlocksDocument,\n },\n (data) => BigInt(data.checkpoint?.networkTotalTransactions!),\n );\n },\n async getReferenceGasPrice(transport) {\n const epoch = await transport.graphqlQuery(\n {\n query: GetReferenceGasPriceDocument,\n variables: {},\n },\n (data) => data.epoch,\n );\n\n return BigInt(epoch.referenceGasPrice);\n },\n async getStakes(transport, [owner]) {\n const stakes = await transport.graphqlQuery(\n {\n query: GetStakesDocument,\n variables: {\n owner,\n },\n },\n (data) => data.address?.stakedIotas?.nodes,\n );\n\n return mapGraphQLStakeToRpcStake(stakes);\n },\n async getStakesByIds(transport, [stakedIotaIds]) {\n const stakes = await transport.graphqlQuery(\n {\n query: GetStakesByIdsDocument,\n variables: {\n ids: stakedIotaIds,\n },\n },\n (data) =>\n data.objects?.nodes\n .map((node) => node?.asMoveObject?.asStakedIota!)\n .filter(Boolean),\n );\n\n return mapGraphQLStakeToRpcStake(stakes);\n },\n async getLatestIotaSystemStateV2(transport) {\n const systemState = await transport.graphqlQuery(\n {\n query: GetLatestIotaSystemStateDocument,\n },\n (data) => data.epoch,\n );\n\n // fetch all active validators\n let hasMoreActiveValidators =\n systemState.validatorSet?.activeValidators?.pageInfo.hasNextPage ?? false;\n let afterActiveValidators = systemState.validatorSet?.activeValidators?.pageInfo.endCursor;\n while (hasMoreActiveValidators) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateEpochValidatorsDocument,\n variables: {\n id: systemState.epochId,\n after: afterActiveValidators,\n },\n },\n (data) => data.epoch,\n );\n systemState.validatorSet?.activeValidators?.nodes.push(\n ...(page.validatorSet?.activeValidators?.nodes ?? []),\n );\n hasMoreActiveValidators =\n page.validatorSet?.activeValidators?.pageInfo.hasNextPage ?? false;\n afterActiveValidators = page.validatorSet?.activeValidators?.pageInfo.endCursor;\n }\n\n // fetch all committee members\n let hasMoreCommitteeMembers =\n systemState.validatorSet?.committeeMembers?.pageInfo.hasNextPage ?? false;\n let afterCommitteeMembers = systemState.validatorSet?.committeeMembers?.pageInfo.endCursor;\n while (hasMoreCommitteeMembers) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateEpochValidatorsDocument,\n variables: {\n id: systemState.epochId,\n after: afterCommitteeMembers,\n },\n },\n (data) => data.epoch,\n );\n systemState.validatorSet?.committeeMembers?.nodes.push(\n ...(page.validatorSet?.committeeMembers?.nodes ?? []),\n );\n hasMoreCommitteeMembers =\n page.validatorSet?.committeeMembers?.pageInfo.hasNextPage ?? false;\n afterCommitteeMembers = page.validatorSet?.committeeMembers?.pageInfo.endCursor;\n }\n\n return {\n V2: {\n activeValidators: systemState.validatorSet?.activeValidators?.nodes.map(\n mapGraphQlValidatorToRpcValidator,\n )!,\n committeeMembers: systemState.validatorSet?.committeeMembers?.nodes?.map(\n (_, index) => index.toString(),\n )!,\n atRiskValidators: systemState.validatorSet?.activeValidators.nodes\n ?.filter((validator) => validator.atRisk)\n .map((validator) => [\n validator.address.address!,\n validator.atRisk!.toString(),\n ])!,\n epoch: String(systemState.epochId),\n epochDurationMs: String(\n new Date(systemState.endTimestamp).getTime() -\n new Date(systemState.startTimestamp).getTime(),\n ),\n epochStartTimestampMs: String(new Date(systemState.startTimestamp).getTime()),\n inactivePoolsSize: String(systemState.validatorSet?.inactivePoolsSize),\n iotaTotalSupply: String(systemState.iotaTotalSupply),\n iotaTreasuryCapId: String(systemState.iotaTreasuryCapId),\n maxValidatorCount: String(systemState.systemParameters?.maxValidatorCount),\n minValidatorCount: String(systemState.systemParameters?.minValidatorCount),\n minValidatorJoiningStake: String(\n systemState.systemParameters?.minValidatorJoiningStake,\n ),\n pendingActiveValidatorsSize: String(\n systemState.validatorSet?.pendingActiveValidatorsSize,\n ),\n pendingRemovals:\n systemState.validatorSet?.pendingRemovals?.map((idx) => String(idx)) ?? [],\n protocolVersion: String(systemState.protocolConfigs?.protocolVersion),\n referenceGasPrice: String(systemState.referenceGasPrice),\n safeMode: systemState.safeMode?.enabled!,\n safeModeComputationCharges: String(\n systemState.safeMode?.gasSummary?.computationCost,\n ),\n safeModeComputationChargesBurned: String(\n systemState.safeMode?.gasSummary?.computationCostBurned,\n ),\n safeModeNonRefundableStorageFee: String(\n systemState.safeMode?.gasSummary?.nonRefundableStorageFee,\n ),\n safeModeStorageRebates: String(systemState.safeMode?.gasSummary?.storageRebate),\n safeModeStorageCharges: String(systemState.safeMode?.gasSummary?.storageCost),\n stakingPoolMappingsSize: String(systemState.validatorSet?.stakingPoolMappingsSize),\n storageFundNonRefundableBalance: String(\n systemState.storageFund?.nonRefundableBalance,\n ),\n storageFundTotalObjectStorageRebates: String(\n systemState.storageFund?.totalObjectStorageRebates,\n ),\n systemStateVersion: String(systemState.systemStateVersion),\n totalStake: systemState.validatorSet?.totalStake,\n validatorCandidatesSize:\n systemState.validatorSet?.validatorCandidatesSize?.toString()!,\n validatorLowStakeGracePeriod:\n systemState.systemParameters?.validatorLowStakeGracePeriod,\n validatorLowStakeThreshold:\n systemState.systemParameters?.validatorLowStakeThreshold,\n validatorReportRecords: [], // TODO\n validatorVeryLowStakeThreshold:\n systemState.systemParameters?.validatorVeryLowStakeThreshold,\n validatorCandidatesId: systemState.validatorSet?.validatorCandidatesId,\n inactivePoolsId: systemState.validatorSet?.inactivePoolsId,\n pendingActiveValidatorsId: systemState.validatorSet?.pendingActiveValidatorsId,\n stakingPoolMappingsId: systemState.validatorSet?.stakingPoolMappingsId,\n },\n };\n },\n async queryEvents(transport, [query, cursor, limit, descending]) {\n const pagination: Partial<QueryEventsQueryVariables> = descending\n ? { last: limit, before: cursor as never }\n : { first: limit, after: cursor as never };\n\n const filter: QueryEventsQueryVariables['filter'] = {\n sender: 'Sender' in query ? query.Sender : undefined,\n transactionDigest: 'Transaction' in query ? query.Transaction : undefined,\n eventType: 'MoveEventType' in query ? query.MoveEventType : undefined,\n emittingModule:\n 'MoveModule' in query\n ? `${query.MoveModule.package}::${query.MoveModule.module}`\n : undefined,\n };\n\n if ('MoveEventType' in query) {\n filter.eventType = query.MoveEventType;\n } else if ('MoveEventModule' in query) {\n filter.eventType = `${query.MoveEventModule.package}::${query.MoveEventModule.module}`;\n }\n\n const unsupportedFilters = [\n 'Package',\n 'MoveEventField',\n 'Any',\n 'All',\n 'And',\n 'Or',\n 'TimeRange',\n ];\n\n if (query) {\n for (const unsupportedFilter of unsupportedFilters) {\n if (unsupportedFilter in query) {\n throw new UnsupportedParamError('queryEvents', unsupportedFilter);\n }\n }\n }\n\n const { nodes: events, pageInfo } = await transport.graphqlQuery(\n {\n query: QueryEventsDocument,\n variables: {\n ...pagination,\n filter,\n },\n },\n (data) => data.events,\n );\n\n if (pagination.last) {\n events.reverse();\n }\n\n return {\n hasNextPage: pagination.last ? pageInfo.hasPreviousPage : pageInfo.hasNextPage,\n nextCursor: (pagination.last ? pageInfo.startCursor : pageInfo.endCursor) as never,\n data: events.map((event) => ({\n bcs: event.bcs,\n bcsEncoding: 'base64',\n id: {\n eventSeq: '', // TODO\n txDigest: '', // TODO\n },\n packageId: event.sendingModule?.package.address!,\n parsedJson: event.json,\n sender: event.sender?.address,\n timestampMs: new Date(event.timestamp).getTime().toString(),\n transactionModule: `${event.sendingModule?.package.address}::${event.sendingModule?.name}`,\n type: toShortTypeString(event.type?.repr)!,\n })),\n };\n },\n async devInspectTransactionBlock(transport, [sender, devInspectTxBytes, gasPrice]) {\n const { transaction, error, results } = await transport.graphqlQuery(\n {\n query: DevInspectTransactionBlockDocument,\n variables: {\n txBytes: devInspectTxBytes,\n txMeta: {\n gasPrice: Number.parseInt(gasPrice),\n sender: sender,\n },\n showEffects: true,\n showEvents: true,\n },\n },\n (data) => data.dryRunTransactionBlock,\n );\n\n if (!transaction) {\n throw new Error('Unexpected error during dry run');\n }\n\n const result = mapGraphQLTransactionBlockToRpcTransactionBlock(transaction, {\n showEffects: true,\n showEvents: true,\n });\n\n return {\n error,\n effects: result.effects!,\n events: result.events!,\n results: results?.map((result) => ({\n mutableReferenceOutputs: result.mutatedReferences?.map(\n (ref): [IotaArgument, number[], string] => [\n ref.input.__typename === 'GasCoin'\n ? 'GasCoin'\n : ref.input.__typename === 'Input'\n ? {\n Input: ref.input.inputIndex,\n }\n : typeof ref.input.resultIndex === 'number'\n ? {\n NestedResult: [ref.input.cmd, ref.input.resultIndex!] as [\n number,\n number,\n ],\n }\n : {\n Result: ref.input.cmd,\n },\n Array.from(fromBase64(ref.bcs)),\n toShortTypeString(ref.type.repr),\n ],\n ),\n returnValues: result.returnValues?.map((value) => [\n Array.from(fromBase64(value.bcs)),\n toShortTypeString(value.type.repr),\n ]),\n })),\n };\n },\n async getDynamicFields(transport, [parentId, cursor, limit]) {\n const { nodes: fields, pageInfo } = await transport.graphqlQuery(\n {\n query: GetDynamicFieldsDocument,\n variables: {\n parentId,\n first: limit,\n cursor,\n },\n },\n (data) => data.owner?.dynamicFields,\n );\n\n return {\n data: fields.map((field) => ({\n bcsName: field.name?.bcs,\n bcsEncoding: 'base64',\n digest: (field.value?.__typename === 'MoveObject'\n ? field.value.digest\n : undefined)!,\n name: {\n type: toShortTypeString(field.name?.type.repr)!,\n value: field.name?.json,\n },\n objectId:\n field.value?.__typename === 'MoveObject' ? field.value.address : undefined,\n objectType: (field.value?.__typename === 'MoveObject'\n ? field.value.contents?.type.repr\n : field.value?.type.repr)!,\n type: field.value?.__typename === 'MoveObject' ? 'DynamicObject' : 'DynamicField',\n version: (field.value?.__typename === 'MoveObject'\n ? field.value.version\n : undefined) as unknown as string,\n })),\n nextCursor: pageInfo.endCursor ?? null,\n hasNextPage: pageInfo.hasNextPage,\n };\n },\n async getDynamicFieldObjectV2(transport, inputs) {\n return await getDynamicFieldObject!(transport, inputs);\n },\n /**\n * @deprecated The V1 of this method is deprecated, use `getDynamicFieldObjectV2` instead.\n */\n async getDynamicFieldObject(transport, [parentId, name]) {\n return await getDynamicFieldObject!(transport, [\n parentId,\n name,\n {\n // These are the same defaults as in the JSON RPC.\n showBcs: true,\n showContent: true,\n showDisplay: true,\n showOwner: true,\n showPreviousTransaction: true,\n showStorageRebate: true,\n showType: true,\n },\n ]);\n },\n\n async executeTransactionBlock(transport, [txBytes, signatures, options]) {\n const { effects, errors } = await transport.graphqlQuery(\n {\n query: ExecuteTransactionBlockDocument,\n variables: {\n txBytes,\n signatures,\n showBalanceChanges: options?.showBalanceChanges,\n showEffects: options?.showEffects,\n showEvents: options?.showEvents,\n showInput: options?.showInput,\n showObjectChanges: options?.showObjectChanges,\n showRawEffects: options?.showRawEffects,\n showRawInput: options?.showRawInput,\n },\n },\n (data) => data.executeTransactionBlock,\n );\n\n if (!effects?.transactionBlock) {\n const tx = Transaction.from(fromBase64(txBytes));\n return { errors: errors ?? undefined, digest: await tx.getDigest() };\n }\n\n await paginateTransactionBlockLists(transport, effects.transactionBlock);\n\n return mapGraphQLTransactionBlockToRpcTransactionBlock(\n effects.transactionBlock,\n options,\n errors,\n );\n },\n async dryRunTransactionBlock(transport, [txBytes]) {\n const tx = Transaction.from(fromBase64(txBytes));\n const { transaction, error } = await transport.graphqlQuery(\n {\n query: DryRunTransactionBlockDocument,\n variables: {\n txBytes,\n showBalanceChanges: true,\n showEffects: true,\n showEvents: true,\n showInput: true,\n showObjectChanges: true,\n },\n },\n (data) => data.dryRunTransactionBlock,\n );\n\n if (error || !transaction) {\n throw new Error(error ?? 'Unexpected error during dry run');\n }\n\n const result = mapGraphQLTransactionBlockToRpcTransactionBlock(\n { ...transaction, digest: await tx.getDigest() },\n {\n showBalanceChanges: true,\n showEffects: true,\n showEvents: true,\n showInput: true,\n showObjectChanges: true,\n },\n );\n\n return {\n input: result.transaction?.data!,\n balanceChanges: result.balanceChanges!,\n effects: result.effects!,\n events: result.events!,\n objectChanges: result.objectChanges!,\n };\n },\n async getLatestCheckpointSequenceNumber(transport) {\n const sequenceNumber = await transport.graphqlQuery(\n {\n query: GetLatestCheckpointSequenceNumberDocument,\n },\n (data) => data.checkpoint?.sequenceNumber,\n );\n\n return sequenceNumber.toString();\n },\n async getCheckpoint(transport, [id]) {\n const checkpoint = await transport.graphqlQuery(\n {\n query: GetCheckpointDocument,\n variables: {\n id:\n typeof id === 'number' || isNumericString(id)\n ? {\n sequenceNumber: Number.parseInt(id.toString(), 10),\n }\n : {\n digest: id,\n },\n },\n },\n (data) => data.checkpoint,\n );\n\n await paginateCheckpointLists(transport, checkpoint);\n return mapGraphQLCheckpointToRpcCheckpoint(checkpoint);\n },\n async getCheckpoints(transport, [cursor, limit, descendingOrder]) {\n const pagination: Partial<QueryEventsQueryVariables> = descendingOrder\n ? { last: limit, before: cursor as never }\n : { first: limit, after: cursor as never };\n\n const { nodes: checkpoints, pageInfo } = await transport.graphqlQuery(\n {\n query: GetCheckpointsDocument,\n variables: {\n ...pagination,\n },\n },\n (data) => data.checkpoints,\n );\n\n for (const checkpoint of checkpoints) {\n await paginateCheckpointLists(transport, checkpoint);\n }\n\n if (pagination.last) {\n checkpoints.reverse();\n }\n\n return {\n hasNextPage: pagination.last ? pageInfo.hasPreviousPage : pageInfo.hasNextPage,\n nextCursor: (pagination.last ? pageInfo.startCursor : pageInfo.endCursor) as never,\n data: checkpoints.map((checkpoint) => mapGraphQLCheckpointToRpcCheckpoint(checkpoint)),\n };\n },\n async getCommitteeInfo(transport, [epoch]) {\n const { validatorSet, epochId } = await transport.graphqlQuery(\n {\n query: GetCommitteeInfoDocument,\n variables: {\n epochId: epoch ? Number.parseInt(epoch) : undefined,\n },\n },\n (data) => data.epoch,\n );\n\n let hasNextPage = validatorSet?.committeeMembers?.pageInfo.hasNextPage;\n let after = validatorSet?.committeeMembers?.pageInfo.endCursor;\n\n while (hasNextPage) {\n const page = await transport.graphqlQuery(\n {\n query: GetCommitteeInfoDocument,\n variables: {\n epochId: epoch ? Number.parseInt(epoch) : undefined,\n after,\n },\n },\n (data) => data.epoch?.validatorSet?.committeeMembers,\n );\n\n validatorSet?.committeeMembers.nodes.push(...page.nodes);\n hasNextPage = page.pageInfo.hasNextPage;\n after = page.pageInfo.endCursor;\n }\n\n return {\n epoch: epochId.toString(),\n validators: validatorSet?.committeeMembers?.nodes.map((val) => [\n val.credentials?.authorityPubKey!,\n String(val.votingPower),\n ])!,\n };\n },\n async getCurrentEpoch(transport) {\n const epoch = await transport.graphqlQuery(\n {\n query: GetCurrentEpochDocument,\n },\n (data) => data.epoch,\n );\n\n // fetch all active validators\n let hasNextPageActiveValidators =\n epoch.validatorSet?.activeValidators?.pageInfo.hasNextPage;\n let afterActiveValidators = epoch.validatorSet?.activeValidators?.pageInfo.endCursor;\n while (hasNextPageActiveValidators) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateEpochValidatorsDocument,\n variables: {\n id: epoch.epochId,\n after: afterActiveValidators,\n },\n },\n (data) => data.epoch?.validatorSet?.activeValidators,\n );\n epoch.validatorSet?.activeValidators?.nodes.push(...page.nodes);\n hasNextPageActiveValidators = page.pageInfo.hasNextPage;\n afterActiveValidators = page.pageInfo.endCursor;\n }\n // fetch all committee members\n let hasNextPageCommitteeMembers =\n epoch.validatorSet?.committeeMembers?.pageInfo.hasNextPage;\n let afterCommitteeMembers = epoch.validatorSet?.committeeMembers?.pageInfo.endCursor;\n while (hasNextPageCommitteeMembers) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateEpochValidatorsDocument,\n variables: {\n id: epoch.epochId,\n after: afterCommitteeMembers,\n },\n },\n (data) => data.epoch?.validatorSet?.committeeMembers,\n );\n epoch.validatorSet?.committeeMembers?.nodes.push(...page.nodes);\n hasNextPageCommitteeMembers = page.pageInfo.hasNextPage;\n afterCommitteeMembers = page.pageInfo.endCursor;\n }\n\n // Committee validators: each element is an index pointing to `validators`\n const validatorsAddresses =\n epoch.validatorSet?.activeValidators?.nodes.map((val) => val.address.address!) ?? [];\n const committeeMembersAddresses =\n epoch.validatorSet?.committeeMembers?.nodes.map((val) => val.address.address!) ?? [];\n const committeeValidatorsIndexes = committeeMembersAddresses.map((val) =>\n validatorsAddresses.indexOf(val)?.toString(),\n );\n\n return {\n epoch: String(epoch.epochId),\n validators: epoch.validatorSet?.activeValidators?.nodes.map(\n mapGraphQlValidatorToRpcValidator,\n )!,\n committeeMembers: committeeValidatorsIndexes,\n epochTotalTransactions: '0', // TODO\n firstCheckpointId: epoch.firstCheckpoint?.nodes[0]?.sequenceNumber.toString()!,\n endOfEpochInfo: null,\n referenceGasPrice: epoch.referenceGasPrice,\n epochStartTimestamp: new Date(epoch.startTimestamp).getTime().toString(),\n };\n },\n async getValidatorsApy(transport) {\n const epoch = await transport.graphqlQuery(\n {\n query: GetValidatorsApyDocument,\n },\n (data) => data.epoch,\n );\n\n let hasNextPage = epoch.validatorSet?.activeValidators?.pageInfo.hasNextPage;\n let after = epoch.validatorSet?.activeValidators?.pageInfo.endCursor;\n\n while (hasNextPage) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateEpochValidatorsDocument,\n variables: {\n id: epoch.epochId,\n after,\n },\n },\n (data) => data.epoch,\n );\n\n epoch.validatorSet?.activeValidators?.nodes.push(\n ...(page.validatorSet?.activeValidators?.nodes ?? []),\n );\n hasNextPage = page.validatorSet?.activeValidators?.pageInfo.hasNextPage;\n after = page.validatorSet?.activeValidators?.pageInfo.endCursor;\n }\n\n return {\n epoch: String(epoch.epochId),\n apys: epoch.validatorSet?.activeValidators?.nodes.map((validator) => ({\n address: validator.address.address!,\n apy: (typeof validator.apy === 'number' ? validator.apy / 100 : null) as number,\n }))!,\n };\n },\n async getChainIdentifier(transport): Promise<string> {\n const identifier = await transport.graphqlQuery(\n {\n query: GetChainIdentifierDocument,\n },\n (data) => data.chainIdentifier,\n );\n\n return identifier;\n },\n async getProtocolConfig(transport, [version]) {\n const protocolConfig = await transport.graphqlQuery(\n {\n query: GetProtocolConfigDocument,\n variables: {\n protocolVersion: version ? Number.parseInt(version) : undefined,\n },\n },\n (data) => data.protocolConfig,\n );\n\n const featureFlags: Record<string, boolean> = {};\n const attributes: Record<string, ProtocolConfigValue | null> = {};\n\n const configTypeMap: Record<string, string> = {\n max_arguments: 'u32',\n max_gas_payment_objects: 'u32',\n max_modules_in_publish: 'u32',\n max_programmable_tx_commands: 'u32',\n max_pure_argument_size: 'u32',\n max_type_argument_depth: 'u32',\n max_type_arguments: 'u32',\n move_binary_format_version: 'u32',\n min_move_binary_format_version: 'u32',\n random_beacon_reduction_allowed_delta: 'u16',\n random_beacon_dkg_timeout_round: 'u32',\n random_beacon_reduction_lower_bound: 'u32',\n scoring_decision_cutoff_value: 'f64',\n scoring_decision_mad_divisor: 'f64',\n group_ops_bls12381_msm_max_len: 'u32',\n binary_module_handles: 'u16',\n binary_struct_handles: 'u16',\n binary_function_handles: 'u16',\n binary_function_instantiations: 'u16',\n binary_signatures: 'u16',\n binary_constant_pool: 'u16',\n binary_identifiers: 'u16',\n binary_address_identifiers: 'u16',\n binary_struct_defs: 'u16',\n binary_struct_def_instantiations: 'u16',\n binary_function_defs: 'u16',\n binary_field_handles: 'u16',\n binary_field_instantiations: 'u16',\n binary_friend_decls: 'u16',\n max_package_dependencies: 'u32',\n bridge_should_try_to_finalize_committee: 'bool',\n consensus_gc_depth: 'u32',\n scorer_version: 'u16',\n };\n\n for (const { key, value } of protocolConfig.configs) {\n attributes[key] =\n value === null\n ? null\n : ({\n [configTypeMap[key] ?? 'u64']: value,\n } as ProtocolConfigValue);\n }\n\n for (const { key, value } of protocolConfig.featureFlags) {\n featureFlags[key] = value;\n }\n\n return {\n maxSupportedProtocolVersion: protocolConfig.protocolVersion?.toString(),\n minSupportedProtocolVersion: '1',\n protocolVersion: protocolConfig.protocolVersion?.toString(),\n attributes,\n featureFlags,\n };\n },\n\n async isTransactionIndexedOnNode(transport, [digest]): Promise<boolean> {\n const isTransactionIndexedOnNode = await transport.graphqlQuery(\n {\n query: IsTransactionIndexedOnNodeDocument,\n variables: {\n digest,\n },\n },\n (data) => data.isTransactionIndexedOnNode,\n );\n return isTransactionIndexedOnNode;\n },\n\n async view(transport, [functionName, typeArgs, callArgs]): Promise<IotaMoveViewCallResults> {\n return await transport.graphqlQuery(\n {\n query: ViewDocument,\n variables: {\n functionName,\n typeArgs,\n arguments: callArgs,\n },\n },\n (data) => {\n if (data.moveViewCall.error) {\n return {\n executionError: data.moveViewCall.error,\n } as IotaMoveViewCallResults;\n } else {\n return {\n functionReturnValues: data.moveViewCall.results,\n } as IotaMoveViewCallResults;\n }\n },\n );\n },\n};\n\nexport class UnsupportedParamError extends Error {\n constructor(method: string, param: string) {\n super(`Parameter ${param} is not supported for ${method} in the GraphQL API`);\n }\n}\n\nexport class UnsupportedMethodError extends Error {\n constructor(method: string) {\n super(`Method ${method} is not supported in the GraphQL API`);\n }\n}\n\nasync function paginateTransactionBlockLists(\n transport: IotaClientGraphQLTransport,\n transactionBlock: Rpc_Transaction_FieldsFragment,\n) {\n let hasMoreEvents = transactionBlock.effects?.events?.pageInfo.hasNextPage ?? false;\n let hasMoreBalanceChanges =\n transactionBlock.effects?.balanceChanges?.pageInfo.hasNextPage ?? false;\n let hasMoreObjectChanges =\n transactionBlock.effects?.objectChanges?.pageInfo.hasNextPage ?? false;\n let afterEvents = transactionBlock.effects?.events?.pageInfo.endCursor;\n let afterBalanceChanges = transactionBlock.effects?.balanceChanges?.pageInfo.endCursor;\n let afterObjectChanges = transactionBlock.effects?.objectChanges?.pageInfo.endCursor;\n\n while (hasMoreEvents || hasMoreBalanceChanges || hasMoreObjectChanges) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateTransactionBlockListsDocument,\n variables: {\n digest: transactionBlock.digest!,\n afterEvents,\n afterBalanceChanges,\n afterObjectChanges,\n hasMoreEvents,\n hasMoreBalanceChanges,\n hasMoreObjectChanges,\n },\n },\n (data) => data.transactionBlock?.effects,\n );\n\n transactionBlock.effects?.events?.nodes.push(...(page.events?.nodes ?? []));\n transactionBlock.effects?.balanceChanges?.nodes.push(...(page.balanceChanges?.nodes ?? []));\n transactionBlock.effects?.objectChanges?.nodes.push(...(page.objectChanges?.nodes ?? []));\n hasMoreEvents = page.events?.pageInfo.hasNextPage ?? false;\n hasMoreBalanceChanges = page.balanceChanges?.pageInfo.hasNextPage ?? false;\n hasMoreObjectChanges = page.objectChanges?.pageInfo.hasNextPage ?? false;\n afterEvents = page.events?.pageInfo.endCursor;\n afterBalanceChanges = page.balanceChanges?.pageInfo.endCursor;\n afterObjectChanges = page.objectChanges?.pageInfo.endCursor;\n }\n}\n\nasync function paginateCheckpointLists(\n transport: IotaClientGraphQLTransport,\n checkpoint: Rpc_Checkpoint_FieldsFragment,\n) {\n let hasNextPage = checkpoint.transactionBlocks.pageInfo.hasNextPage;\n let after = checkpoint.transactionBlocks.pageInfo.endCursor;\n while (hasNextPage) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateCheckpointTransactionBlocksDocument,\n variables: {\n id: { digest: checkpoint.digest! },\n after,\n },\n },\n (data) => data.checkpoint?.transactionBlocks,\n );\n\n checkpoint.transactionBlocks.nodes.push(...page.nodes);\n hasNextPage = page.pageInfo.hasNextPage;\n after = page.pageInfo.endCursor;\n }\n\n const endOfEpochTx = checkpoint.endOfEpoch.nodes[0];\n\n if (\n endOfEpochTx?.kind?.__typename === 'EndOfEpochTransaction' &&\n endOfEpochTx.kind?.transactions.nodes[0].__typename === 'ChangeEpochTransactionV2' &&\n endOfEpochTx.kind.transactions.nodes[0].epoch?.epochId\n ) {\n const validatorSet = endOfEpochTx.kind.transactions.nodes[0].epoch.validatorSet;\n let hasNextPage = validatorSet?.committeeMembers.pageInfo.hasNextPage;\n let after = validatorSet?.committeeMembers.pageInfo.endCursor;\n\n while (hasNextPage) {\n const page = await transport.graphqlQuery(\n {\n query: GetCommitteeInfoDocument,\n variables: {\n epochId: endOfEpochTx.kind.transactions.nodes[0].epoch?.epochId,\n after,\n },\n },\n (data) => data.epoch?.validatorSet?.committeeMembers,\n );\n\n validatorSet?.committeeMembers.nodes.push(...page.nodes);\n hasNextPage = page.pageInfo?.hasNextPage;\n after = page.pageInfo?.endCursor;\n }\n }\n}\n\nasync function getDynamicFieldObject(\n transport: IotaClientGraphQLTransport,\n [parentId, name, options]: any[],\n) {\n const nameLayout = await transport.graphqlQuery(\n {\n query: GetTypeLayoutDocument,\n variables: {\n type: name.type,\n },\n },\n (data) => data.type.layout,\n );\n\n const bcsName = mapJsonToBcs(name.value, nameLayout);\n\n const parent = await transport.graphqlQuery(\n {\n query: GetDynamicFieldObjectDocument,\n variables: {\n parentId: parentId,\n name: {\n type: name.type,\n bcs: bcsName,\n },\n showBcs: options?.showBcs,\n showContent: options?.showContent,\n showDisplay: options?.showDisplay,\n showOwner: options?.showOwner,\n showPreviousTransaction: options?.showPreviousTransaction,\n showStorageRebate: options?.showStorageRebate,\n showType: options?.showType,\n },\n },\n (data) => {\n return data.owner?.dynamicObjectField?.value?.__typename === 'MoveObject'\n ? data.owner.dynamicObjectField.value.owner?.__typename === 'Parent'\n ? data.owner.dynamicObjectField.value.owner.parent\n : undefined\n : undefined;\n },\n );\n\n return {\n data: {\n content: parent.asMoveObject\n ? {\n dataType: 'moveObject' as const,\n ...(moveDataToRpcContent(\n parent.asMoveObject?.contents?.data!,\n parent.asMoveObject?.contents?.type.layout!,\n ) as {\n fields: {\n [key: string]: MoveValue;\n };\n type: string;\n }),\n }\n : undefined,\n digest: parent?.digest!,\n objectId: parent?.address,\n type: parent?.asMoveObject\n ? toShortTypeString(parent.asMoveObject.contents?.type.repr)\n : undefined,\n version: parent?.version.toString()!,\n storageRebate: parent.storageRebate,\n previousTransaction: parent.previousTransactionBlock?.digest,\n owner:\n parent.owner?.__typename === 'Parent'\n ? {\n ObjectOwner: parent.owner.parent?.address,\n }\n : undefined,\n },\n };\n}\n"],
|
|
4
|
+
"sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// Modifications Copyright (c) 2024 IOTA Stiftung\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64 } from '@iota/bcs';\nimport type {\n MoveValue,\n ProtocolConfigValue,\n IotaArgument,\n IotaClient,\n IotaMoveNormalizedModule,\n IotaTransactionKind,\n IotaMoveViewCallResults,\n} from '@iota/iota-sdk/client';\nimport { Transaction } from '@iota/iota-sdk/transactions';\nimport {\n normalizeStructTag,\n normalizeIotaAddress,\n parseStructTag,\n IOTA_TYPE_ARG,\n} from '@iota/iota-sdk/utils';\n\nimport type {\n ObjectFilter,\n QueryEventsQueryVariables,\n QueryTransactionBlocksQueryVariables,\n Rpc_Checkpoint_FieldsFragment,\n Rpc_Transaction_FieldsFragment,\n} from './generated/queries.js';\nimport {\n DevInspectTransactionBlockDocument,\n DryRunTransactionBlockDocument,\n ExecuteTransactionBlockDocument,\n GetAllBalancesDocument,\n GetBalanceDocument,\n GetChainIdentifierDocument,\n GetCheckpointDocument,\n GetCheckpointsDocument,\n GetCoinMetadataDocument,\n GetCoinsDocument,\n GetCommitteeInfoDocument,\n GetCurrentEpochDocument,\n GetDynamicFieldObjectDocument,\n GetDynamicFieldsDocument,\n GetLatestCheckpointSequenceNumberDocument,\n GetLatestIotaSystemStateDocument,\n GetMoveFunctionArgTypesDocument,\n GetNormalizedMoveFunctionDocument,\n GetNormalizedMoveModuleDocument,\n GetNormalizedMoveModulesByPackageDocument,\n GetNormalizedMoveStructDocument,\n GetObjectDocument,\n GetOwnedObjectsDocument,\n GetProtocolConfigDocument,\n GetReferenceGasPriceDocument,\n GetStakesByIdsDocument,\n GetStakesDocument,\n GetTotalSupplyDocument,\n GetTotalTransactionBlocksDocument,\n GetTransactionBlockDocument,\n GetTypeLayoutDocument,\n GetValidatorsApyDocument,\n IsTransactionIndexedOnNodeDocument,\n MultiGetObjectsDocument,\n MultiGetTransactionBlocksDocument,\n PaginateCheckpointTransactionBlocksDocument,\n PaginateEpochValidatorsDocument,\n PaginateMoveModuleListsDocument,\n PaginateTransactionBlockListsDocument,\n QueryEventsDocument,\n QueryTransactionBlocksDocument,\n TryGetPastObjectDocument,\n ViewDocument,\n} from './generated/queries.js';\nimport { mapJsonToBcs } from './mappers/bcs.js';\nimport { mapGraphQLCheckpointToRpcCheckpoint } from './mappers/checkpoint.js';\nimport {\n mapNormalizedMoveFunction,\n mapNormalizedMoveModule,\n mapNormalizedMoveStruct,\n moveDataToRpcContent,\n} from './mappers/move.js';\nimport { mapGraphQLMoveObjectToRpcObject, mapGraphQLObjectToRpcObject } from './mappers/object.js';\nimport { mapGraphQLStakeToRpcStake } from './mappers/stakes.js';\nimport { mapGraphQLTransactionBlockToRpcTransactionBlock } from './mappers/transaction-block.js';\nimport { isNumericString, toGraphQLTransactionKind, toShortTypeString } from './mappers/util.js';\nimport { mapGraphQlValidatorToRpcValidator } from './mappers/validator.js';\nimport type { IotaClientGraphQLTransport } from './transport.js';\n\ninterface ResponseTypes {\n getRpcApiVersion: {\n info: { version?: string };\n };\n}\n\nexport const RPC_METHODS: {\n [\n K in keyof IotaClient as IotaClient[K] extends (...args: any[]) => Promise<any> ? K : never\n ]?: IotaClient[K] extends (...args: any[]) => infer R\n ? (\n transport: IotaClientGraphQLTransport,\n inputs: any[],\n ) => K extends keyof ResponseTypes ? Promise<ResponseTypes[K]> : R\n : never;\n} = {\n async getRpcApiVersion(transport) {\n const res = await transport.graphqlRequest({\n query: 'query { __typename }',\n variables: {},\n });\n\n if (!res.ok) {\n throw new Error('Failed to fetch');\n }\n\n return {\n info: {\n version: res.headers.get('x-iota-rpc-version') ?? undefined,\n },\n };\n },\n\n async getCoins(transport, [owner, coinType, cursor, limit]) {\n const { nodes: coins, pageInfo } = await transport.graphqlQuery(\n {\n query: GetCoinsDocument,\n variables: {\n owner,\n type: coinType,\n cursor: cursor,\n first: limit,\n },\n },\n (data) => data.address?.coins,\n );\n\n return {\n data: coins.map((coin) => ({\n balance: coin.coinBalance,\n coinObjectId: coin.address,\n coinType: toShortTypeString(\n normalizeStructTag(parseStructTag(coin.contents?.type.repr!).typeParams[0]),\n ),\n digest: coin.digest!,\n previousTransaction: coin.previousTransactionBlock?.digest!,\n version: String(coin.version!),\n })),\n nextCursor: pageInfo.endCursor,\n hasNextPage: pageInfo.hasNextPage,\n };\n },\n\n async getAllCoins(transport, inputs) {\n const { nodes: coins, pageInfo } = await transport.graphqlQuery(\n {\n query: GetCoinsDocument,\n variables: {\n owner: inputs[0],\n cursor: inputs[1],\n first: inputs[2],\n },\n },\n (data) => data.address?.coins,\n );\n\n return {\n data: coins.map((coin) => ({\n balance: coin.coinBalance,\n coinObjectId: coin.address,\n coinType: toShortTypeString(\n normalizeStructTag(parseStructTag(coin.contents?.type.repr!).typeParams[0]),\n ),\n digest: coin.digest!,\n previousTransaction: coin.previousTransactionBlock?.digest!,\n version: String(coin.version!),\n })),\n nextCursor: pageInfo.endCursor,\n hasNextPage: pageInfo.hasNextPage,\n };\n },\n\n async getBalance(transport, inputs) {\n try {\n const balance = await transport.graphqlQuery(\n {\n query: GetBalanceDocument,\n variables: {\n owner: inputs[0],\n type: inputs[1],\n },\n },\n (data) => data.address?.balance,\n );\n\n return {\n coinType: toShortTypeString(balance.coinType?.repr!) || IOTA_TYPE_ARG,\n coinObjectCount: balance.coinObjectCount || 0,\n totalBalance: balance.totalBalance || 0,\n };\n } catch (error) {\n console.warn('GraphQL getBalance failed, falling back to default values:', error);\n return {\n coinType: normalizeStructTag(inputs[1] ?? IOTA_TYPE_ARG),\n coinObjectCount: 0,\n totalBalance: '0',\n };\n }\n },\n\n async getAllBalances(transport, inputs) {\n const balances = await transport.graphqlQuery(\n {\n query: GetAllBalancesDocument,\n variables: {\n owner: inputs[0],\n },\n },\n (data) => data.address?.balances?.nodes,\n );\n\n return balances.map((balance) => ({\n coinType: toShortTypeString(balance.coinType?.repr!),\n coinObjectCount: balance.coinObjectCount!,\n totalBalance: balance.totalBalance,\n }));\n },\n async getCoinMetadata(transport, inputs) {\n const metadata = await transport.graphqlQuery(\n {\n query: GetCoinMetadataDocument,\n variables: {\n coinType: inputs[0],\n },\n },\n (data) => data.coinMetadata,\n );\n\n return {\n decimals: metadata.decimals!,\n name: metadata.name!,\n symbol: metadata.symbol!,\n description: metadata.description!,\n iconUrl: metadata.iconUrl,\n id: metadata.address,\n };\n },\n async getTotalSupply(transport, inputs) {\n const metadata = await transport.graphqlQuery(\n {\n query: GetTotalSupplyDocument,\n variables: {\n coinType: inputs[0],\n },\n },\n (data) => data.coinMetadata,\n );\n\n return {\n value: BigInt(metadata.supply!).toString(),\n };\n },\n async getMoveFunctionArgTypes(transport, [pkg, module, fn]) {\n const moveModule = await transport.graphqlQuery(\n {\n query: GetMoveFunctionArgTypesDocument,\n variables: {\n module: module,\n packageId: pkg,\n function: fn,\n },\n },\n (data) => data.object?.asMovePackage?.module?.function?.parameters,\n );\n\n return moveModule.map((parameter) => {\n if (!parameter.signature.body.datatype) {\n return 'Pure';\n }\n\n return {\n Object:\n parameter.signature.ref === '&'\n ? 'ByImmutableReference'\n : parameter.signature.ref === '&mut'\n ? 'ByMutableReference'\n : 'ByValue',\n };\n });\n },\n async getNormalizedMoveFunction(transport, [pkg, module, fn]) {\n const moveFunction = await transport.graphqlQuery(\n {\n query: GetNormalizedMoveFunctionDocument,\n variables: {\n module: module,\n packageId: pkg,\n function: fn,\n },\n },\n (data) => data.object?.asMovePackage?.module?.function,\n );\n\n return mapNormalizedMoveFunction(moveFunction);\n },\n async getNormalizedMoveModulesByPackage(transport, [pkg]) {\n const movePackage = await transport.graphqlQuery(\n {\n query: GetNormalizedMoveModulesByPackageDocument,\n variables: {\n packageId: pkg,\n },\n },\n (data) => data.object?.asMovePackage,\n );\n\n let hasNextPage = movePackage.modules?.pageInfo.hasNextPage ?? false;\n let cursor = movePackage.modules?.pageInfo.endCursor;\n while (hasNextPage) {\n const page = await transport.graphqlQuery(\n {\n query: GetNormalizedMoveModulesByPackageDocument,\n variables: {\n packageId: pkg,\n cursor,\n },\n },\n (data) => data.object?.asMovePackage,\n );\n\n movePackage.modules?.nodes.push(...(page.modules?.nodes ?? []));\n hasNextPage = page.modules?.pageInfo.hasNextPage ?? false;\n cursor = page.modules?.pageInfo.endCursor;\n }\n\n const address = toShortTypeString(movePackage.address);\n const modules: Record<string, IotaMoveNormalizedModule> = {};\n\n for (const moveModule of movePackage.modules?.nodes ?? []) {\n let hasMoreFriends = moveModule.friends?.pageInfo.hasNextPage ?? false;\n let hasMoreFunctions = moveModule.functions?.pageInfo.hasNextPage ?? false;\n let hasMoreStructs = moveModule.structs?.pageInfo.hasNextPage ?? false;\n let hasMoreEnums = moveModule.enums?.pageInfo.hasNextPage ?? false;\n let afterFriends = moveModule.friends?.pageInfo.endCursor;\n let afterFunctions = moveModule.functions?.pageInfo.endCursor;\n let afterStructs = moveModule.structs?.pageInfo.endCursor;\n let afterEnums = moveModule.enums?.pageInfo.endCursor;\n\n while (hasMoreFriends || hasMoreStructs || hasMoreFunctions || hasMoreEnums) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateMoveModuleListsDocument,\n variables: {\n module: moveModule.name,\n packageId: pkg,\n hasMoreFriends,\n hasMoreFunctions,\n hasMoreStructs,\n hasMoreEnums,\n afterFriends,\n afterFunctions,\n afterStructs,\n afterEnums,\n },\n },\n (data) => data.object?.asMovePackage?.module,\n );\n\n moveModule.friends.nodes.push(...(page.friends?.nodes ?? []));\n moveModule.functions?.nodes.push(...(page.functions?.nodes ?? []));\n moveModule.structs?.nodes.push(...(page.structs?.nodes ?? []));\n moveModule.enums?.nodes.push(...(page.enums?.nodes ?? []));\n hasMoreFriends = page.friends?.pageInfo.hasNextPage ?? false;\n hasMoreFunctions = page.functions?.pageInfo.hasNextPage ?? false;\n hasMoreStructs = page.structs?.pageInfo.hasNextPage ?? false;\n hasMoreEnums = page.enums?.pageInfo.hasNextPage ?? false;\n afterFriends = page.friends?.pageInfo.endCursor;\n afterFunctions = page.functions?.pageInfo.endCursor;\n afterStructs = page.structs?.pageInfo.endCursor;\n afterEnums = page.enums?.pageInfo.endCursor;\n }\n }\n\n movePackage.modules?.nodes.forEach((module) => {\n modules[module.name] = mapNormalizedMoveModule(module, address);\n });\n\n return modules;\n },\n async getNormalizedMoveModule(transport, [pkg, module]) {\n const moveModule = await transport.graphqlQuery(\n {\n query: GetNormalizedMoveModuleDocument,\n variables: {\n module,\n packageId: pkg,\n },\n },\n (data) => data.object?.asMovePackage?.module,\n );\n\n let hasMoreFriends = moveModule.friends?.pageInfo.hasNextPage ?? false;\n let hasMoreFunctions = moveModule.functions?.pageInfo.hasNextPage ?? false;\n let hasMoreStructs = moveModule.structs?.pageInfo.hasNextPage ?? false;\n let hasMoreEnums = moveModule.enums?.pageInfo.hasNextPage ?? false;\n let afterFriends = moveModule.friends?.pageInfo.endCursor;\n let afterFunctions = moveModule.functions?.pageInfo.endCursor;\n let afterStructs = moveModule.structs?.pageInfo.endCursor;\n let afterEnums = moveModule.enums?.pageInfo.endCursor;\n\n while (hasMoreFriends || hasMoreStructs || hasMoreFunctions || hasMoreEnums) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateMoveModuleListsDocument,\n variables: {\n module,\n packageId: pkg,\n hasMoreFriends,\n hasMoreFunctions,\n hasMoreStructs,\n hasMoreEnums,\n afterFriends,\n afterFunctions,\n afterStructs,\n afterEnums,\n },\n },\n (data) => data.object?.asMovePackage?.module,\n );\n\n moveModule.friends.nodes.push(...(page.friends?.nodes ?? []));\n moveModule.functions?.nodes.push(...(page.functions?.nodes ?? []));\n moveModule.structs?.nodes.push(...(page.structs?.nodes ?? []));\n moveModule.enums?.nodes.push(...(page.enums?.nodes ?? []));\n hasMoreFriends = page.friends?.pageInfo.hasNextPage ?? false;\n hasMoreFunctions = page.functions?.pageInfo.hasNextPage ?? false;\n hasMoreStructs = page.structs?.pageInfo.hasNextPage ?? false;\n hasMoreEnums = page.enums?.pageInfo.hasNextPage ?? false;\n afterFriends = page.friends?.pageInfo.endCursor;\n afterFunctions = page.functions?.pageInfo.endCursor;\n afterStructs = page.structs?.pageInfo.endCursor;\n afterEnums = page.enums?.pageInfo.endCursor;\n }\n\n return mapNormalizedMoveModule(moveModule, normalizeIotaAddress(pkg));\n },\n async getNormalizedMoveStruct(transport, [pkg, module, struct]) {\n const moveStruct = await transport.graphqlQuery(\n {\n query: GetNormalizedMoveStructDocument,\n variables: {\n packageId: pkg,\n module,\n struct,\n },\n },\n (data) => data.object?.asMovePackage?.module?.struct,\n );\n\n return mapNormalizedMoveStruct(moveStruct);\n },\n async getOwnedObjects(transport, [owner, { filter: inputFilter, options }, cursor, limit]) {\n let filter: ObjectFilter | undefined;\n let typeFilter: string | undefined;\n\n if (inputFilter) {\n if ('Package' in inputFilter) {\n typeFilter = inputFilter.Package;\n } else if ('MoveModule' in inputFilter) {\n typeFilter = `${inputFilter.MoveModule.package}::${inputFilter.MoveModule.module}`;\n } else if ('StructType' in inputFilter) {\n typeFilter = inputFilter.StructType;\n }\n\n filter = {\n objectIds:\n 'ObjectIds' in inputFilter\n ? inputFilter.ObjectIds\n : 'ObjectId' in inputFilter\n ? [inputFilter.ObjectId]\n : undefined,\n type: typeFilter,\n owner:\n 'ObjectOwner' in inputFilter\n ? inputFilter.ObjectOwner\n : 'AddressOwner' in inputFilter\n ? inputFilter.AddressOwner\n : undefined,\n };\n\n // GraphQL's ObjectFilter doesn't support complex filter composition or version filtering.\n const unsupportedFilters = ['MatchAll', 'MatchAny', 'MatchNone', 'Version'];\n\n for (const unsupportedFilter of unsupportedFilters) {\n if (unsupportedFilter in inputFilter) {\n throw new UnsupportedParamError('getOwnedObjects', unsupportedFilter);\n }\n }\n }\n\n const { nodes: objects, pageInfo } = await transport.graphqlQuery(\n {\n query: GetOwnedObjectsDocument,\n variables: {\n owner,\n limit,\n cursor,\n showBcs: options?.showBcs,\n showContent: options?.showContent,\n showDisplay: options?.showDisplay,\n showOwner: options?.showOwner,\n showPreviousTransaction: options?.showPreviousTransaction,\n showStorageRebate: options?.showStorageRebate,\n showType: options?.showType,\n filter,\n },\n },\n (data) => data.address?.objects,\n );\n\n return {\n hasNextPage: pageInfo.hasNextPage,\n nextCursor: pageInfo.endCursor,\n data: objects.map((object) => ({\n data: mapGraphQLMoveObjectToRpcObject(object, options ?? {}),\n })),\n };\n },\n async getObject(transport, [id, options]) {\n try {\n const object = await transport.graphqlQuery(\n {\n query: GetObjectDocument,\n variables: {\n id,\n showBcs: options?.showBcs,\n showContent: options?.showContent,\n showDisplay: options?.showDisplay,\n showOwner: options?.showOwner,\n showPreviousTransaction: options?.showPreviousTransaction,\n showStorageRebate: options?.showStorageRebate,\n showType: options?.showType,\n },\n },\n (data) => data.object,\n );\n\n return {\n data: mapGraphQLObjectToRpcObject(object, options ?? {}),\n };\n } catch (_) {\n return {\n error: {\n code: 'notExists',\n object_id: id,\n },\n };\n }\n },\n async tryGetPastObject(transport, [id, version, options]) {\n const data = await transport.graphqlQuery({\n query: TryGetPastObjectDocument,\n variables: {\n id,\n version,\n showBcs: options?.showBcs,\n showContent: options?.showContent,\n showDisplay: options?.showDisplay,\n showOwner: options?.showOwner,\n showPreviousTransaction: options?.showPreviousTransaction,\n showStorageRebate: options?.showStorageRebate,\n showType: options?.showType,\n },\n });\n\n if (!data.current) {\n return {\n details: id,\n status: 'ObjectNotExists',\n };\n }\n\n if (!data.object) {\n return data.current.version < Number(version)\n ? {\n status: 'VersionTooHigh',\n details: {\n asked_version: String(version),\n latest_version: String(data.current.version),\n object_id: data.current.address,\n },\n }\n : {\n status: 'VersionNotFound',\n details: [data.current.address, String(version)],\n };\n }\n\n return {\n status: 'VersionFound',\n details: mapGraphQLObjectToRpcObject(data.object, options ?? {}),\n };\n },\n async multiGetObjects(transport, [ids, options]) {\n const objects = await transport.graphqlQuery(\n {\n query: MultiGetObjectsDocument,\n variables: {\n ids,\n showBcs: options?.showBcs,\n showContent: options?.showContent,\n showDisplay: options?.showDisplay,\n showOwner: options?.showOwner,\n showPreviousTransaction: options?.showPreviousTransaction,\n showStorageRebate: options?.showStorageRebate,\n showType: options?.showType,\n limit: ids.length,\n },\n },\n (data) => data.objects?.nodes,\n );\n\n return objects.map((object) => ({\n data: mapGraphQLObjectToRpcObject(object, options ?? {}),\n }));\n },\n async queryTransactionBlocks(transport, [{ filter, options }, cursor, limit = 20, descending]) {\n const pagination: Partial<QueryTransactionBlocksQueryVariables> = descending\n ? {\n last: limit,\n before: cursor,\n }\n : {\n first: limit,\n after: cursor,\n };\n\n const unsupportedFilters = ['FromOrToAddress', 'FromAndToAddress', 'TransactionKindIn'];\n\n if (filter) {\n for (const unsupportedFilter of unsupportedFilters) {\n if (unsupportedFilter in filter) {\n throw new UnsupportedParamError('queryTransactionBlocks', unsupportedFilter);\n }\n }\n }\n\n const graphqlTransactionKindFilter =\n 'TransactionKind' in filter\n ? toGraphQLTransactionKind(filter.TransactionKind as IotaTransactionKind)\n : undefined;\n\n const { nodes: transactionBlocks, pageInfo } = await transport.graphqlQuery(\n {\n query: QueryTransactionBlocksDocument,\n variables: {\n ...pagination,\n showBalanceChanges: options?.showBalanceChanges,\n showEffects: options?.showEffects,\n showEvents: options?.showEvents,\n showInput: options?.showInput,\n showObjectChanges: options?.showObjectChanges,\n showRawEffects: options?.showRawEffects,\n showRawInput: options?.showRawInput,\n filter: filter\n ? {\n atCheckpoint:\n 'Checkpoint' in filter\n ? Number.parseInt(filter.Checkpoint)\n : undefined,\n function:\n 'MoveFunction' in filter\n ? `${filter.MoveFunction.package}::${filter.MoveFunction.module}::${filter.MoveFunction.function}`\n : undefined,\n inputObject: 'InputObject' in filter ? filter.InputObject : undefined,\n changedObject:\n 'ChangedObject' in filter ? filter.ChangedObject : undefined,\n sentAddress: 'FromAddress' in filter ? filter.FromAddress : undefined,\n recvAddress: 'ToAddress' in filter ? filter.ToAddress : undefined,\n kind: graphqlTransactionKindFilter,\n }\n : {},\n },\n },\n (data) => data.transactionBlocks,\n );\n\n for (const transactionBlock of transactionBlocks) {\n await paginateTransactionBlockLists(transport, transactionBlock);\n }\n\n if (pagination.last) {\n transactionBlocks.reverse();\n }\n\n return {\n hasNextPage: pagination.last ? pageInfo.hasPreviousPage : pageInfo.hasNextPage,\n nextCursor: pagination.last ? pageInfo.startCursor : pageInfo.endCursor,\n data: transactionBlocks.map((transactionBlock) =>\n mapGraphQLTransactionBlockToRpcTransactionBlock(transactionBlock, options ?? {}),\n ),\n };\n },\n async getTransactionBlock(transport, [digest, options]) {\n const transactionBlock = await transport.graphqlQuery(\n {\n query: GetTransactionBlockDocument,\n variables: {\n digest,\n showBalanceChanges: options?.showBalanceChanges,\n showEffects: options?.showEffects,\n showEvents: options?.showEvents,\n showInput: options?.showInput,\n showObjectChanges: options?.showObjectChanges,\n showRawEffects: options?.showRawEffects,\n showRawInput: options?.showRawInput,\n },\n },\n (data) => data.transactionBlock,\n );\n\n await paginateTransactionBlockLists(transport, transactionBlock);\n\n return mapGraphQLTransactionBlockToRpcTransactionBlock(transactionBlock, options);\n },\n\n async multiGetTransactionBlocks(transport, [digests, options]) {\n const transactionBlocks = await transport.graphqlQuery(\n {\n query: MultiGetTransactionBlocksDocument,\n variables: {\n digests: digests,\n showBalanceChanges: options?.showBalanceChanges,\n showEffects: options?.showEffects,\n showEvents: options?.showEvents,\n showInput: options?.showInput,\n showObjectChanges: options?.showObjectChanges,\n showRawEffects: options?.showEffects,\n showRawInput: options?.showRawInput,\n limit: digests.length,\n },\n },\n (data) => data.transactionBlocks?.nodes,\n );\n\n for (const transactionBlock of transactionBlocks) {\n await paginateTransactionBlockLists(transport, transactionBlock);\n }\n\n return transactionBlocks.map((transactionBlock) =>\n mapGraphQLTransactionBlockToRpcTransactionBlock(transactionBlock, options),\n );\n },\n async getTotalTransactionBlocks(transport): Promise<bigint> {\n return transport.graphqlQuery(\n {\n query: GetTotalTransactionBlocksDocument,\n },\n (data) => BigInt(data.checkpoint?.networkTotalTransactions!),\n );\n },\n async getReferenceGasPrice(transport) {\n const epoch = await transport.graphqlQuery(\n {\n query: GetReferenceGasPriceDocument,\n variables: {},\n },\n (data) => data.epoch,\n );\n\n return BigInt(epoch.referenceGasPrice);\n },\n async getStakes(transport, [owner]) {\n const stakes = await transport.graphqlQuery(\n {\n query: GetStakesDocument,\n variables: {\n owner,\n },\n },\n (data) => data.address?.stakedIotas?.nodes,\n );\n\n return mapGraphQLStakeToRpcStake(stakes);\n },\n async getStakesByIds(transport, [stakedIotaIds]) {\n const stakes = await transport.graphqlQuery(\n {\n query: GetStakesByIdsDocument,\n variables: {\n ids: stakedIotaIds,\n },\n },\n (data) =>\n data.objects?.nodes\n .map((node) => node?.asMoveObject?.asStakedIota!)\n .filter(Boolean),\n );\n\n return mapGraphQLStakeToRpcStake(stakes);\n },\n async getLatestIotaSystemStateV2(transport) {\n const systemState = await transport.graphqlQuery(\n {\n query: GetLatestIotaSystemStateDocument,\n },\n (data) => data.epoch,\n );\n\n // fetch all active validators\n let hasMoreActiveValidators =\n systemState.validatorSet?.activeValidators?.pageInfo.hasNextPage ?? false;\n let afterActiveValidators = systemState.validatorSet?.activeValidators?.pageInfo.endCursor;\n while (hasMoreActiveValidators) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateEpochValidatorsDocument,\n variables: {\n id: systemState.epochId,\n after: afterActiveValidators,\n },\n },\n (data) => data.epoch,\n );\n systemState.validatorSet?.activeValidators?.nodes.push(\n ...(page.validatorSet?.activeValidators?.nodes ?? []),\n );\n hasMoreActiveValidators =\n page.validatorSet?.activeValidators?.pageInfo.hasNextPage ?? false;\n afterActiveValidators = page.validatorSet?.activeValidators?.pageInfo.endCursor;\n }\n\n // fetch all committee members\n let hasMoreCommitteeMembers =\n systemState.validatorSet?.committeeMembers?.pageInfo.hasNextPage ?? false;\n let afterCommitteeMembers = systemState.validatorSet?.committeeMembers?.pageInfo.endCursor;\n while (hasMoreCommitteeMembers) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateEpochValidatorsDocument,\n variables: {\n id: systemState.epochId,\n after: afterCommitteeMembers,\n },\n },\n (data) => data.epoch,\n );\n systemState.validatorSet?.committeeMembers?.nodes.push(\n ...(page.validatorSet?.committeeMembers?.nodes ?? []),\n );\n hasMoreCommitteeMembers =\n page.validatorSet?.committeeMembers?.pageInfo.hasNextPage ?? false;\n afterCommitteeMembers = page.validatorSet?.committeeMembers?.pageInfo.endCursor;\n }\n\n return {\n V2: {\n activeValidators: systemState.validatorSet?.activeValidators?.nodes.map(\n mapGraphQlValidatorToRpcValidator,\n )!,\n committeeMembers: systemState.validatorSet?.committeeMembers?.nodes?.map(\n (_, index) => index.toString(),\n )!,\n atRiskValidators: systemState.validatorSet?.activeValidators.nodes\n ?.filter((validator) => validator.atRisk)\n .map((validator) => [\n validator.address.address!,\n validator.atRisk!.toString(),\n ])!,\n epoch: String(systemState.epochId),\n epochDurationMs: String(\n new Date(systemState.endTimestamp).getTime() -\n new Date(systemState.startTimestamp).getTime(),\n ),\n epochStartTimestampMs: String(new Date(systemState.startTimestamp).getTime()),\n inactivePoolsSize: String(systemState.validatorSet?.inactivePoolsSize),\n iotaTotalSupply: String(systemState.iotaTotalSupply),\n iotaTreasuryCapId: String(systemState.iotaTreasuryCapId),\n maxValidatorCount: String(systemState.systemParameters?.maxValidatorCount),\n minValidatorCount: String(systemState.systemParameters?.minValidatorCount),\n minValidatorJoiningStake: String(\n systemState.systemParameters?.minValidatorJoiningStake,\n ),\n pendingActiveValidatorsSize: String(\n systemState.validatorSet?.pendingActiveValidatorsSize,\n ),\n pendingRemovals:\n systemState.validatorSet?.pendingRemovals?.map((idx) => String(idx)) ?? [],\n protocolVersion: String(systemState.protocolConfigs?.protocolVersion),\n referenceGasPrice: String(systemState.referenceGasPrice),\n safeMode: systemState.safeMode?.enabled!,\n safeModeComputationCharges: String(\n systemState.safeMode?.gasSummary?.computationCost,\n ),\n safeModeComputationChargesBurned: String(\n systemState.safeMode?.gasSummary?.computationCostBurned,\n ),\n safeModeNonRefundableStorageFee: String(\n systemState.safeMode?.gasSummary?.nonRefundableStorageFee,\n ),\n safeModeStorageRebates: String(systemState.safeMode?.gasSummary?.storageRebate),\n safeModeStorageCharges: String(systemState.safeMode?.gasSummary?.storageCost),\n stakingPoolMappingsSize: String(systemState.validatorSet?.stakingPoolMappingsSize),\n storageFundNonRefundableBalance: String(\n systemState.storageFund?.nonRefundableBalance,\n ),\n storageFundTotalObjectStorageRebates: String(\n systemState.storageFund?.totalObjectStorageRebates,\n ),\n systemStateVersion: String(systemState.systemStateVersion),\n totalStake: systemState.validatorSet?.totalStake,\n validatorCandidatesSize:\n systemState.validatorSet?.validatorCandidatesSize?.toString()!,\n validatorLowStakeGracePeriod:\n systemState.systemParameters?.validatorLowStakeGracePeriod,\n validatorLowStakeThreshold:\n systemState.systemParameters?.validatorLowStakeThreshold,\n validatorReportRecords: [], // TODO\n validatorVeryLowStakeThreshold:\n systemState.systemParameters?.validatorVeryLowStakeThreshold,\n validatorCandidatesId: systemState.validatorSet?.validatorCandidatesId,\n inactivePoolsId: systemState.validatorSet?.inactivePoolsId,\n pendingActiveValidatorsId: systemState.validatorSet?.pendingActiveValidatorsId,\n stakingPoolMappingsId: systemState.validatorSet?.stakingPoolMappingsId,\n },\n };\n },\n async queryEvents(transport, [query, cursor, limit, descending]) {\n const pagination: Partial<QueryEventsQueryVariables> = descending\n ? { last: limit, before: cursor as never }\n : { first: limit, after: cursor as never };\n\n const filter: QueryEventsQueryVariables['filter'] = {\n sender: 'Sender' in query ? query.Sender : undefined,\n transactionDigest: 'Transaction' in query ? query.Transaction : undefined,\n eventType: 'MoveEventType' in query ? query.MoveEventType : undefined,\n emittingModule:\n 'MoveModule' in query\n ? `${query.MoveModule.package}::${query.MoveModule.module}`\n : undefined,\n };\n\n if ('MoveEventType' in query) {\n filter.eventType = query.MoveEventType;\n } else if ('MoveEventModule' in query) {\n filter.eventType = `${query.MoveEventModule.package}::${query.MoveEventModule.module}`;\n }\n\n const unsupportedFilters = [\n 'Package',\n 'MoveEventField',\n 'Any',\n 'All',\n 'And',\n 'Or',\n 'TimeRange',\n ];\n\n if (query) {\n for (const unsupportedFilter of unsupportedFilters) {\n if (unsupportedFilter in query) {\n throw new UnsupportedParamError('queryEvents', unsupportedFilter);\n }\n }\n }\n\n const { nodes: events, pageInfo } = await transport.graphqlQuery(\n {\n query: QueryEventsDocument,\n variables: {\n ...pagination,\n filter,\n },\n },\n (data) => data.events,\n );\n\n if (pagination.last) {\n events.reverse();\n }\n\n return {\n hasNextPage: pagination.last ? pageInfo.hasPreviousPage : pageInfo.hasNextPage,\n nextCursor: (pagination.last ? pageInfo.startCursor : pageInfo.endCursor) as never,\n data: events.map((event) => ({\n bcs: event.bcs,\n bcsEncoding: 'base64',\n id: {\n eventSeq: '', // TODO\n txDigest: '', // TODO\n },\n packageId: event.sendingModule?.package.address!,\n parsedJson: event.json,\n sender: event.sender?.address,\n timestampMs: new Date(event.timestamp).getTime().toString(),\n transactionModule: `${event.sendingModule?.package.address}::${event.sendingModule?.name}`,\n type: toShortTypeString(event.type?.repr)!,\n })),\n };\n },\n async devInspectTransactionBlock(transport, [sender, devInspectTxBytes, gasPrice]) {\n const { transaction, error, results } = await transport.graphqlQuery(\n {\n query: DevInspectTransactionBlockDocument,\n variables: {\n txBytes: devInspectTxBytes,\n txMeta: {\n gasPrice: Number.parseInt(gasPrice),\n sender: sender,\n },\n showEffects: true,\n showEvents: true,\n },\n },\n (data) => data.dryRunTransactionBlock,\n );\n\n if (!transaction) {\n throw new Error('Unexpected error during dry run');\n }\n\n const result = mapGraphQLTransactionBlockToRpcTransactionBlock(transaction, {\n showEffects: true,\n showEvents: true,\n });\n\n return {\n error,\n effects: result.effects!,\n events: result.events!,\n results: results?.map((result) => ({\n mutableReferenceOutputs: result.mutatedReferences?.map(\n (ref): [IotaArgument, number[], string] => [\n ref.input.__typename === 'GasCoin'\n ? 'GasCoin'\n : ref.input.__typename === 'Input'\n ? {\n Input: ref.input.inputIndex,\n }\n : typeof ref.input.resultIndex === 'number'\n ? {\n NestedResult: [ref.input.cmd, ref.input.resultIndex!] as [\n number,\n number,\n ],\n }\n : {\n Result: ref.input.cmd,\n },\n Array.from(fromBase64(ref.bcs)),\n toShortTypeString(ref.type.repr),\n ],\n ),\n returnValues: result.returnValues?.map((value) => [\n Array.from(fromBase64(value.bcs)),\n toShortTypeString(value.type.repr),\n ]),\n })),\n };\n },\n async getDynamicFields(transport, [parentId, cursor, limit]) {\n const { nodes: fields, pageInfo } = await transport.graphqlQuery(\n {\n query: GetDynamicFieldsDocument,\n variables: {\n parentId,\n first: limit,\n cursor,\n },\n },\n (data) => data.owner?.dynamicFields,\n );\n\n return {\n data: fields.map((field) => ({\n bcsName: field.name?.bcs,\n bcsEncoding: 'base64',\n digest: (field.value?.__typename === 'MoveObject'\n ? field.value.digest\n : undefined)!,\n name: {\n type: toShortTypeString(field.name?.type.repr)!,\n value: field.name?.json,\n },\n objectId:\n field.value?.__typename === 'MoveObject' ? field.value.address : undefined,\n objectType: (field.value?.__typename === 'MoveObject'\n ? field.value.contents?.type.repr\n : field.value?.type.repr)!,\n type: field.value?.__typename === 'MoveObject' ? 'DynamicObject' : 'DynamicField',\n version: (field.value?.__typename === 'MoveObject'\n ? field.value.version\n : undefined) as unknown as string,\n })),\n nextCursor: pageInfo.endCursor ?? null,\n hasNextPage: pageInfo.hasNextPage,\n };\n },\n async getDynamicFieldObjectV2(transport, inputs) {\n return await getDynamicFieldObject!(transport, inputs);\n },\n /**\n * @deprecated The V1 of this method is deprecated, use `getDynamicFieldObjectV2` instead.\n */\n async getDynamicFieldObject(transport, [parentId, name]) {\n return await getDynamicFieldObject!(transport, [\n parentId,\n name,\n {\n // These are the same defaults as in the JSON RPC.\n showBcs: true,\n showContent: true,\n showDisplay: true,\n showOwner: true,\n showPreviousTransaction: true,\n showStorageRebate: true,\n showType: true,\n },\n ]);\n },\n\n async executeTransactionBlock(transport, [txBytes, signatures, options]) {\n const { effects, errors } = await transport.graphqlQuery(\n {\n query: ExecuteTransactionBlockDocument,\n variables: {\n txBytes,\n signatures,\n showBalanceChanges: options?.showBalanceChanges,\n showEffects: options?.showEffects,\n showEvents: options?.showEvents,\n showInput: options?.showInput,\n showObjectChanges: options?.showObjectChanges,\n showRawEffects: options?.showRawEffects,\n showRawInput: options?.showRawInput,\n },\n },\n (data) => data.executeTransactionBlock,\n );\n\n if (!effects?.transactionBlock) {\n const tx = Transaction.from(fromBase64(txBytes));\n return { errors: errors ?? undefined, digest: await tx.getDigest() };\n }\n\n await paginateTransactionBlockLists(transport, effects.transactionBlock);\n\n return mapGraphQLTransactionBlockToRpcTransactionBlock(\n effects.transactionBlock,\n options,\n errors,\n );\n },\n async dryRunTransactionBlock(transport, [txBytes]) {\n const tx = Transaction.from(fromBase64(txBytes));\n const { transaction, error } = await transport.graphqlQuery(\n {\n query: DryRunTransactionBlockDocument,\n variables: {\n txBytes,\n showBalanceChanges: true,\n showEffects: true,\n showEvents: true,\n showInput: true,\n showObjectChanges: true,\n },\n },\n (data) => data.dryRunTransactionBlock,\n );\n\n if (error || !transaction) {\n throw new Error(error ?? 'Unexpected error during dry run');\n }\n\n const result = mapGraphQLTransactionBlockToRpcTransactionBlock(\n { ...transaction, digest: await tx.getDigest() },\n {\n showBalanceChanges: true,\n showEffects: true,\n showEvents: true,\n showInput: true,\n showObjectChanges: true,\n },\n );\n\n return {\n input: result.transaction?.data!,\n balanceChanges: result.balanceChanges!,\n effects: result.effects!,\n events: result.events!,\n objectChanges: result.objectChanges!,\n };\n },\n async getLatestCheckpointSequenceNumber(transport) {\n const sequenceNumber = await transport.graphqlQuery(\n {\n query: GetLatestCheckpointSequenceNumberDocument,\n },\n (data) => data.checkpoint?.sequenceNumber,\n );\n\n return sequenceNumber.toString();\n },\n async getCheckpoint(transport, [id]) {\n const checkpoint = await transport.graphqlQuery(\n {\n query: GetCheckpointDocument,\n variables: {\n id:\n typeof id === 'number' || isNumericString(id)\n ? {\n sequenceNumber: Number.parseInt(id.toString(), 10),\n }\n : {\n digest: id,\n },\n },\n },\n (data) => data.checkpoint,\n );\n\n await paginateCheckpointLists(transport, checkpoint);\n return mapGraphQLCheckpointToRpcCheckpoint(checkpoint);\n },\n async getCheckpoints(transport, [cursor, limit, descendingOrder]) {\n const pagination: Partial<QueryEventsQueryVariables> = descendingOrder\n ? { last: limit, before: cursor as never }\n : { first: limit, after: cursor as never };\n\n const { nodes: checkpoints, pageInfo } = await transport.graphqlQuery(\n {\n query: GetCheckpointsDocument,\n variables: {\n ...pagination,\n },\n },\n (data) => data.checkpoints,\n );\n\n for (const checkpoint of checkpoints) {\n await paginateCheckpointLists(transport, checkpoint);\n }\n\n if (pagination.last) {\n checkpoints.reverse();\n }\n\n return {\n hasNextPage: pagination.last ? pageInfo.hasPreviousPage : pageInfo.hasNextPage,\n nextCursor: (pagination.last ? pageInfo.startCursor : pageInfo.endCursor) as never,\n data: checkpoints.map((checkpoint) => mapGraphQLCheckpointToRpcCheckpoint(checkpoint)),\n };\n },\n async getCommitteeInfo(transport, [epoch]) {\n const { validatorSet, epochId } = await transport.graphqlQuery(\n {\n query: GetCommitteeInfoDocument,\n variables: {\n epochId: epoch ? Number.parseInt(epoch) : undefined,\n },\n },\n (data) => data.epoch,\n );\n\n let hasNextPage = validatorSet?.committeeMembers?.pageInfo.hasNextPage;\n let after = validatorSet?.committeeMembers?.pageInfo.endCursor;\n\n while (hasNextPage) {\n const page = await transport.graphqlQuery(\n {\n query: GetCommitteeInfoDocument,\n variables: {\n epochId: epoch ? Number.parseInt(epoch) : undefined,\n after,\n },\n },\n (data) => data.epoch?.validatorSet?.committeeMembers,\n );\n\n validatorSet?.committeeMembers.nodes.push(...page.nodes);\n hasNextPage = page.pageInfo.hasNextPage;\n after = page.pageInfo.endCursor;\n }\n\n return {\n epoch: epochId.toString(),\n validators: validatorSet?.committeeMembers?.nodes.map((val) => [\n val.credentials?.authorityPubKey!,\n String(val.votingPower),\n ])!,\n };\n },\n async getCurrentEpoch(transport) {\n const epoch = await transport.graphqlQuery(\n {\n query: GetCurrentEpochDocument,\n },\n (data) => data.epoch,\n );\n\n // fetch all active validators\n let hasNextPageActiveValidators =\n epoch.validatorSet?.activeValidators?.pageInfo.hasNextPage;\n let afterActiveValidators = epoch.validatorSet?.activeValidators?.pageInfo.endCursor;\n while (hasNextPageActiveValidators) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateEpochValidatorsDocument,\n variables: {\n id: epoch.epochId,\n after: afterActiveValidators,\n },\n },\n (data) => data.epoch?.validatorSet?.activeValidators,\n );\n epoch.validatorSet?.activeValidators?.nodes.push(...page.nodes);\n hasNextPageActiveValidators = page.pageInfo.hasNextPage;\n afterActiveValidators = page.pageInfo.endCursor;\n }\n // fetch all committee members\n let hasNextPageCommitteeMembers =\n epoch.validatorSet?.committeeMembers?.pageInfo.hasNextPage;\n let afterCommitteeMembers = epoch.validatorSet?.committeeMembers?.pageInfo.endCursor;\n while (hasNextPageCommitteeMembers) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateEpochValidatorsDocument,\n variables: {\n id: epoch.epochId,\n after: afterCommitteeMembers,\n },\n },\n (data) => data.epoch?.validatorSet?.committeeMembers,\n );\n epoch.validatorSet?.committeeMembers?.nodes.push(...page.nodes);\n hasNextPageCommitteeMembers = page.pageInfo.hasNextPage;\n afterCommitteeMembers = page.pageInfo.endCursor;\n }\n\n // Committee validators: each element is an index pointing to `validators`\n const validatorsAddresses =\n epoch.validatorSet?.activeValidators?.nodes.map((val) => val.address.address!) ?? [];\n const committeeMembersAddresses =\n epoch.validatorSet?.committeeMembers?.nodes.map((val) => val.address.address!) ?? [];\n const committeeValidatorsIndexes = committeeMembersAddresses.map((val) =>\n validatorsAddresses.indexOf(val)?.toString(),\n );\n\n return {\n epoch: String(epoch.epochId),\n validators: epoch.validatorSet?.activeValidators?.nodes.map(\n mapGraphQlValidatorToRpcValidator,\n )!,\n committeeMembers: committeeValidatorsIndexes,\n epochTotalTransactions: '0', // TODO\n firstCheckpointId: epoch.firstCheckpoint?.nodes[0]?.sequenceNumber.toString()!,\n endOfEpochInfo: null,\n referenceGasPrice: epoch.referenceGasPrice,\n epochStartTimestamp: new Date(epoch.startTimestamp).getTime().toString(),\n };\n },\n async getValidatorsApy(transport) {\n const epoch = await transport.graphqlQuery(\n {\n query: GetValidatorsApyDocument,\n },\n (data) => data.epoch,\n );\n\n let hasNextPage = epoch.validatorSet?.activeValidators?.pageInfo.hasNextPage;\n let after = epoch.validatorSet?.activeValidators?.pageInfo.endCursor;\n\n while (hasNextPage) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateEpochValidatorsDocument,\n variables: {\n id: epoch.epochId,\n after,\n },\n },\n (data) => data.epoch,\n );\n\n epoch.validatorSet?.activeValidators?.nodes.push(\n ...(page.validatorSet?.activeValidators?.nodes ?? []),\n );\n hasNextPage = page.validatorSet?.activeValidators?.pageInfo.hasNextPage;\n after = page.validatorSet?.activeValidators?.pageInfo.endCursor;\n }\n\n return {\n epoch: String(epoch.epochId),\n apys: epoch.validatorSet?.activeValidators?.nodes.map((validator) => ({\n address: validator.address.address!,\n apy: (typeof validator.apy === 'number' ? validator.apy / 100 : null) as number,\n }))!,\n };\n },\n async getChainIdentifier(transport): Promise<string> {\n const identifier = await transport.graphqlQuery(\n {\n query: GetChainIdentifierDocument,\n },\n (data) => data.chainIdentifier,\n );\n\n return identifier;\n },\n async getProtocolConfig(transport, [version]) {\n const protocolConfig = await transport.graphqlQuery(\n {\n query: GetProtocolConfigDocument,\n variables: {\n protocolVersion: version ? Number.parseInt(version) : undefined,\n },\n },\n (data) => data.protocolConfig,\n );\n\n const featureFlags: Record<string, boolean> = {};\n const attributes: Record<string, ProtocolConfigValue | null> = {};\n\n const configTypeMap: Record<string, string> = {\n max_arguments: 'u32',\n max_gas_payment_objects: 'u32',\n max_modules_in_publish: 'u32',\n max_programmable_tx_commands: 'u32',\n max_pure_argument_size: 'u32',\n max_type_argument_depth: 'u32',\n max_type_arguments: 'u32',\n move_binary_format_version: 'u32',\n min_move_binary_format_version: 'u32',\n random_beacon_reduction_allowed_delta: 'u16',\n random_beacon_dkg_timeout_round: 'u32',\n random_beacon_reduction_lower_bound: 'u32',\n scoring_decision_cutoff_value: 'f64',\n scoring_decision_mad_divisor: 'f64',\n group_ops_bls12381_msm_max_len: 'u32',\n binary_module_handles: 'u16',\n binary_struct_handles: 'u16',\n binary_function_handles: 'u16',\n binary_function_instantiations: 'u16',\n binary_signatures: 'u16',\n binary_constant_pool: 'u16',\n binary_identifiers: 'u16',\n binary_address_identifiers: 'u16',\n binary_struct_defs: 'u16',\n binary_struct_def_instantiations: 'u16',\n binary_function_defs: 'u16',\n binary_field_handles: 'u16',\n binary_field_instantiations: 'u16',\n binary_friend_decls: 'u16',\n max_package_dependencies: 'u32',\n bridge_should_try_to_finalize_committee: 'bool',\n consensus_gc_depth: 'u32',\n scorer_version: 'u16',\n };\n\n for (const { key, value } of protocolConfig.configs) {\n attributes[key] =\n value === null\n ? null\n : ({\n [configTypeMap[key] ?? 'u64']: value,\n } as ProtocolConfigValue);\n }\n\n for (const { key, value } of protocolConfig.featureFlags) {\n featureFlags[key] = value;\n }\n\n return {\n maxSupportedProtocolVersion: protocolConfig.protocolVersion?.toString(),\n minSupportedProtocolVersion: '1',\n protocolVersion: protocolConfig.protocolVersion?.toString(),\n attributes,\n featureFlags,\n };\n },\n\n async isTransactionIndexedOnNode(transport, [digest]): Promise<boolean> {\n const isTransactionIndexedOnNode = await transport.graphqlQuery(\n {\n query: IsTransactionIndexedOnNodeDocument,\n variables: {\n digest,\n },\n },\n (data) => data.isTransactionIndexedOnNode,\n );\n return isTransactionIndexedOnNode;\n },\n\n async view(transport, [functionName, typeArgs, callArgs]): Promise<IotaMoveViewCallResults> {\n return await transport.graphqlQuery(\n {\n query: ViewDocument,\n variables: {\n functionName,\n typeArgs,\n arguments: callArgs,\n },\n },\n (data) => {\n if (data.moveViewCall.error) {\n return {\n executionError: data.moveViewCall.error,\n } as IotaMoveViewCallResults;\n } else {\n return {\n functionReturnValues: data.moveViewCall.results,\n } as IotaMoveViewCallResults;\n }\n },\n );\n },\n};\n\nexport class UnsupportedParamError extends Error {\n constructor(method: string, param: string) {\n super(`Parameter ${param} is not supported for ${method} in the GraphQL API`);\n }\n}\n\nexport class UnsupportedMethodError extends Error {\n constructor(method: string) {\n super(`Method ${method} is not supported in the GraphQL API`);\n }\n}\n\nasync function paginateTransactionBlockLists(\n transport: IotaClientGraphQLTransport,\n transactionBlock: Rpc_Transaction_FieldsFragment,\n) {\n let hasMoreEvents = transactionBlock.effects?.events?.pageInfo.hasNextPage ?? false;\n let hasMoreBalanceChanges =\n transactionBlock.effects?.balanceChanges?.pageInfo.hasNextPage ?? false;\n let hasMoreObjectChanges =\n transactionBlock.effects?.objectChanges?.pageInfo.hasNextPage ?? false;\n let afterEvents = transactionBlock.effects?.events?.pageInfo.endCursor;\n let afterBalanceChanges = transactionBlock.effects?.balanceChanges?.pageInfo.endCursor;\n let afterObjectChanges = transactionBlock.effects?.objectChanges?.pageInfo.endCursor;\n\n while (hasMoreEvents || hasMoreBalanceChanges || hasMoreObjectChanges) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateTransactionBlockListsDocument,\n variables: {\n digest: transactionBlock.digest!,\n afterEvents,\n afterBalanceChanges,\n afterObjectChanges,\n hasMoreEvents,\n hasMoreBalanceChanges,\n hasMoreObjectChanges,\n },\n },\n (data) => data.transactionBlock?.effects,\n );\n\n transactionBlock.effects?.events?.nodes.push(...(page.events?.nodes ?? []));\n transactionBlock.effects?.balanceChanges?.nodes.push(...(page.balanceChanges?.nodes ?? []));\n transactionBlock.effects?.objectChanges?.nodes.push(...(page.objectChanges?.nodes ?? []));\n hasMoreEvents = page.events?.pageInfo.hasNextPage ?? false;\n hasMoreBalanceChanges = page.balanceChanges?.pageInfo.hasNextPage ?? false;\n hasMoreObjectChanges = page.objectChanges?.pageInfo.hasNextPage ?? false;\n afterEvents = page.events?.pageInfo.endCursor;\n afterBalanceChanges = page.balanceChanges?.pageInfo.endCursor;\n afterObjectChanges = page.objectChanges?.pageInfo.endCursor;\n }\n}\n\nasync function paginateCheckpointLists(\n transport: IotaClientGraphQLTransport,\n checkpoint: Rpc_Checkpoint_FieldsFragment,\n) {\n let hasNextPage = checkpoint.transactionBlocks.pageInfo.hasNextPage;\n let after = checkpoint.transactionBlocks.pageInfo.endCursor;\n while (hasNextPage) {\n const page = await transport.graphqlQuery(\n {\n query: PaginateCheckpointTransactionBlocksDocument,\n variables: {\n id: { digest: checkpoint.digest! },\n after,\n },\n },\n (data) => data.checkpoint?.transactionBlocks,\n );\n\n checkpoint.transactionBlocks.nodes.push(...page.nodes);\n hasNextPage = page.pageInfo.hasNextPage;\n after = page.pageInfo.endCursor;\n }\n\n const endOfEpochTx = checkpoint.endOfEpoch.nodes[0];\n\n if (\n endOfEpochTx?.kind?.__typename === 'EndOfEpochTransaction' &&\n endOfEpochTx.kind?.transactions.nodes[0].__typename === 'ChangeEpochTransactionV2' &&\n endOfEpochTx.kind.transactions.nodes[0].epoch?.epochId\n ) {\n const validatorSet = endOfEpochTx.kind.transactions.nodes[0].epoch.validatorSet;\n let hasNextPage = validatorSet?.committeeMembers.pageInfo.hasNextPage;\n let after = validatorSet?.committeeMembers.pageInfo.endCursor;\n\n while (hasNextPage) {\n const page = await transport.graphqlQuery(\n {\n query: GetCommitteeInfoDocument,\n variables: {\n epochId: endOfEpochTx.kind.transactions.nodes[0].epoch?.epochId,\n after,\n },\n },\n (data) => data.epoch?.validatorSet?.committeeMembers,\n );\n\n validatorSet?.committeeMembers.nodes.push(...page.nodes);\n hasNextPage = page.pageInfo?.hasNextPage;\n after = page.pageInfo?.endCursor;\n }\n }\n}\n\nasync function getDynamicFieldObject(\n transport: IotaClientGraphQLTransport,\n [parentId, name, options]: any[],\n) {\n const nameLayout = await transport.graphqlQuery(\n {\n query: GetTypeLayoutDocument,\n variables: {\n type: name.type,\n },\n },\n (data) => data.type.layout,\n );\n\n const bcsName = mapJsonToBcs(name.value, nameLayout);\n\n const parent = await transport.graphqlQuery(\n {\n query: GetDynamicFieldObjectDocument,\n variables: {\n parentId: parentId,\n name: {\n type: name.type,\n bcs: bcsName,\n },\n showBcs: options?.showBcs,\n showContent: options?.showContent,\n showDisplay: options?.showDisplay,\n showOwner: options?.showOwner,\n showPreviousTransaction: options?.showPreviousTransaction,\n showStorageRebate: options?.showStorageRebate,\n showType: options?.showType,\n },\n },\n (data) => {\n return data.owner?.dynamicObjectField?.value?.__typename === 'MoveObject'\n ? data.owner.dynamicObjectField.value.owner?.__typename === 'Parent'\n ? data.owner.dynamicObjectField.value.owner.parent\n : undefined\n : undefined;\n },\n );\n\n return {\n data: {\n content: parent.asMoveObject\n ? {\n dataType: 'moveObject' as const,\n ...(moveDataToRpcContent(\n parent.asMoveObject?.contents?.data!,\n parent.asMoveObject?.contents?.type.layout!,\n ) as {\n fields: {\n [key: string]: MoveValue;\n };\n type: string;\n }),\n }\n : undefined,\n digest: parent?.digest!,\n objectId: parent?.address,\n type: parent?.asMoveObject\n ? toShortTypeString(parent.asMoveObject.contents?.type.repr)\n : undefined,\n version: parent?.version.toString()!,\n storageRebate: parent.storageRebate,\n previousTransaction: parent.previousTransactionBlock?.digest,\n owner:\n parent.owner?.__typename === 'Parent'\n ? {\n ObjectOwner: parent.owner.parent?.address,\n }\n : undefined,\n },\n };\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["result", "hasNextPage", "after"]
|
|
7
7
|
}
|