UNPKG

@mysten/sui

Version:
166 lines (164 loc) 5.52 kB
import { normalizeStructTag } from "../utils/sui-types.mjs"; import { BaseClient } from "../client/client.mjs"; import { deriveDynamicFieldID } from "../utils/dynamic-fields.mjs"; import { GetDynamicFieldsDocument } from "./generated/queries.mjs"; import { GraphQLCoreClient } from "./core.mjs"; import { fromBase64 } from "@mysten/utils"; import { print } from "graphql"; //#region src/graphql/client.ts var SuiGraphQLRequestError = class extends Error {}; const SUI_CLIENT_BRAND = Symbol.for("@mysten/SuiGraphQLClient"); function isSuiGraphQLClient(client) { return typeof client === "object" && client !== null && client[SUI_CLIENT_BRAND] === true; } var SuiGraphQLClient = class extends BaseClient { #url; #queries; #headers; #fetch; get mvr() { return this.core.mvr; } get [SUI_CLIENT_BRAND]() { return true; } constructor({ url, fetch: fetchFn = fetch, headers = {}, queries = {}, network, mvr }) { super({ network }); this.#url = url; this.#queries = queries; this.#headers = headers; this.#fetch = (...args) => fetchFn(...args); this.core = new GraphQLCoreClient({ graphqlClient: this, mvr }); } async query(options) { const res = await this.#fetch(this.#url, { method: "POST", headers: { "Content-Type": "application/json", ...this.#headers }, body: JSON.stringify({ query: typeof options.query === "string" || options.query instanceof String ? String(options.query) : print(options.query), variables: options.variables, extensions: options.extensions, operationName: options.operationName }), signal: options.signal }); if (!res.ok) throw new SuiGraphQLRequestError(`GraphQL request failed: ${res.statusText} (${res.status})`); return await res.json(); } async execute(query, options) { return this.query({ ...options, query: this.#queries[query] }); } getObjects(input) { return this.core.getObjects(input); } getObject(input) { return this.core.getObject(input); } listCoins(input) { return this.core.listCoins(input); } listOwnedObjects(input) { return this.core.listOwnedObjects(input); } getBalance(input) { return this.core.getBalance(input); } listBalances(input) { return this.core.listBalances(input); } getCoinMetadata(input) { return this.core.getCoinMetadata(input); } getTransaction(input) { return this.core.getTransaction(input); } executeTransaction(input) { return this.core.executeTransaction(input); } signAndExecuteTransaction(input) { return this.core.signAndExecuteTransaction(input); } waitForTransaction(input) { return this.core.waitForTransaction(input); } simulateTransaction(input) { return this.core.simulateTransaction(input); } getReferenceGasPrice() { return this.core.getReferenceGasPrice(); } async listDynamicFields(input) { const includeValue = input.include?.value ?? false; const { data, errors } = await this.query({ query: GetDynamicFieldsDocument, variables: { parentId: input.parentId, first: input.limit, cursor: input.cursor, includeValue } }); if (errors?.length) throw errors.length === 1 ? new Error(errors[0].message) : new AggregateError(errors.map((e) => new Error(e.message))); const result = data?.address?.dynamicFields; if (!result) throw new Error("Missing response data"); return { dynamicFields: result.nodes.map((dynamicField) => { const valueType = dynamicField.value?.__typename === "MoveObject" ? dynamicField.value.contents?.type?.repr : dynamicField.value?.type?.repr; const isDynamicObject = dynamicField.value?.__typename === "MoveObject"; const derivedNameType = isDynamicObject ? `0x2::dynamic_object_field::Wrapper<${dynamicField.name?.type?.repr}>` : dynamicField.name?.type?.repr; let value; if (includeValue) { let valueBcs; if (dynamicField.value?.__typename === "MoveValue") valueBcs = fromBase64(dynamicField.value.bcs ?? ""); else if (dynamicField.value?.__typename === "MoveObject") valueBcs = fromBase64(dynamicField.value.contents?.bcs ?? ""); else valueBcs = new Uint8Array(); value = { type: valueType, bcs: valueBcs }; } return { $kind: isDynamicObject ? "DynamicObject" : "DynamicField", fieldId: deriveDynamicFieldID(input.parentId, derivedNameType, fromBase64(dynamicField.name?.bcs)), type: normalizeStructTag(isDynamicObject ? `0x2::dynamic_field::Field<0x2::dynamic_object_field::Wrapper<${dynamicField.name?.type?.repr}>,0x2::object::ID>` : `0x2::dynamic_field::Field<${dynamicField.name?.type?.repr},${valueType}>`), name: { type: dynamicField.name?.type?.repr, bcs: fromBase64(dynamicField.name?.bcs) }, valueType, childId: isDynamicObject && dynamicField.value?.__typename === "MoveObject" ? dynamicField.value.address : void 0, value: includeValue ? value : void 0 }; }), cursor: result.pageInfo.endCursor ?? null, hasNextPage: result.pageInfo.hasNextPage }; } getDynamicField(input) { return this.core.getDynamicField(input); } getMoveFunction(input) { return this.core.getMoveFunction(input); } resolveTransactionPlugin() { return this.core.resolveTransactionPlugin(); } verifyZkLoginSignature(input) { return this.core.verifyZkLoginSignature(input); } defaultNameServiceName(input) { return this.core.defaultNameServiceName(input); } }; //#endregion export { SuiGraphQLClient, SuiGraphQLRequestError, isSuiGraphQLClient }; //# sourceMappingURL=client.mjs.map