@mysten/sui
Version:
Sui TypeScript API
166 lines (164 loc) • 5.52 kB
JavaScript
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