@mysten/sui
Version:
Sui TypeScript API
243 lines (209 loc) • 8.97 kB
text/typescript
// Copyright (c) Mysten Labs, Inc.
// SPDX-License-Identifier: Apache-2.0
import type { GrpcWebOptions } from '@protobuf-ts/grpcweb-transport';
import { GrpcWebFetchTransport } from '@protobuf-ts/grpcweb-transport';
import { TransactionExecutionServiceClient } from './proto/sui/rpc/v2/transaction_execution_service.client.js';
import { LedgerServiceClient } from './proto/sui/rpc/v2/ledger_service.client.js';
import { MovePackageServiceClient } from './proto/sui/rpc/v2/move_package_service.client.js';
import { SignatureVerificationServiceClient } from './proto/sui/rpc/v2/signature_verification_service.client.js';
import type { RpcTransport } from '@protobuf-ts/runtime-rpc';
import { StateServiceClient } from './proto/sui/rpc/v2/state_service.client.js';
import { SubscriptionServiceClient } from './proto/sui/rpc/v2/subscription_service.client.js';
import { GrpcCoreClient } from './core.js';
import type { SuiClientTypes } from '../client/index.js';
import { BaseClient } from '../client/index.js';
import { DynamicField_DynamicFieldKind } from './proto/sui/rpc/v2/state_service.js';
import { normalizeStructTag } from '../utils/sui-types.js';
import { fromBase64, toBase64 } from '@mysten/utils';
import { NameServiceClient } from './proto/sui/rpc/v2/name_service.client.js';
import type { TransactionPlugin } from '../transactions/index.js';
interface SuiGrpcTransportOptions extends GrpcWebOptions {
transport?: never;
}
export type SuiGrpcClientOptions = {
network: SuiClientTypes.Network;
mvr?: SuiClientTypes.MvrOptions;
} & (
| {
transport: RpcTransport;
}
| SuiGrpcTransportOptions
);
const SUI_CLIENT_BRAND = Symbol.for('@mysten/SuiGrpcClient') as never;
export function isSuiGrpcClient(client: unknown): client is SuiGrpcClient {
return (
typeof client === 'object' && client !== null && (client as any)[SUI_CLIENT_BRAND] === true
);
}
export interface DynamicFieldInclude {
value?: boolean;
}
export type DynamicFieldEntryWithValue<Include extends DynamicFieldInclude = {}> =
SuiClientTypes.DynamicFieldEntry & {
value: Include extends { value: true } ? SuiClientTypes.DynamicFieldValue : undefined;
};
export interface ListDynamicFieldsWithValueResponse<Include extends DynamicFieldInclude = {}> {
hasNextPage: boolean;
cursor: string | null;
dynamicFields: DynamicFieldEntryWithValue<Include>[];
}
export class SuiGrpcClient extends BaseClient implements SuiClientTypes.TransportMethods {
core: GrpcCoreClient;
get mvr(): SuiClientTypes.MvrMethods {
return this.core.mvr;
}
transactionExecutionService: TransactionExecutionServiceClient;
ledgerService: LedgerServiceClient;
stateService: StateServiceClient;
subscriptionService: SubscriptionServiceClient;
movePackageService: MovePackageServiceClient;
signatureVerificationService: SignatureVerificationServiceClient;
nameService: NameServiceClient;
get [SUI_CLIENT_BRAND]() {
return true;
}
constructor(options: SuiGrpcClientOptions) {
super({ network: options.network });
const transport =
options.transport ??
new GrpcWebFetchTransport({ baseUrl: options.baseUrl, fetchInit: options.fetchInit });
this.transactionExecutionService = new TransactionExecutionServiceClient(transport);
this.ledgerService = new LedgerServiceClient(transport);
this.stateService = new StateServiceClient(transport);
this.subscriptionService = new SubscriptionServiceClient(transport);
this.movePackageService = new MovePackageServiceClient(transport);
this.signatureVerificationService = new SignatureVerificationServiceClient(transport);
this.nameService = new NameServiceClient(transport);
this.core = new GrpcCoreClient({
client: this,
base: this,
network: options.network,
mvr: options.mvr,
});
}
getObjects<Include extends SuiClientTypes.ObjectInclude = {}>(
input: SuiClientTypes.GetObjectsOptions<Include>,
): Promise<SuiClientTypes.GetObjectsResponse<Include>> {
return this.core.getObjects(input);
}
getObject<Include extends SuiClientTypes.ObjectInclude = {}>(
input: SuiClientTypes.GetObjectOptions<Include>,
): Promise<SuiClientTypes.GetObjectResponse<Include>> {
return this.core.getObject(input);
}
listCoins(input: SuiClientTypes.ListCoinsOptions): Promise<SuiClientTypes.ListCoinsResponse> {
return this.core.listCoins(input);
}
listOwnedObjects<Include extends SuiClientTypes.ObjectInclude = {}>(
input: SuiClientTypes.ListOwnedObjectsOptions<Include>,
): Promise<SuiClientTypes.ListOwnedObjectsResponse<Include>> {
return this.core.listOwnedObjects(input);
}
getBalance(input: SuiClientTypes.GetBalanceOptions): Promise<SuiClientTypes.GetBalanceResponse> {
return this.core.getBalance(input);
}
listBalances(
input: SuiClientTypes.ListBalancesOptions,
): Promise<SuiClientTypes.ListBalancesResponse> {
return this.core.listBalances(input);
}
getCoinMetadata(
input: SuiClientTypes.GetCoinMetadataOptions,
): Promise<SuiClientTypes.GetCoinMetadataResponse> {
return this.core.getCoinMetadata(input);
}
getTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(
input: SuiClientTypes.GetTransactionOptions<Include>,
): Promise<SuiClientTypes.TransactionResult<Include>> {
return this.core.getTransaction(input);
}
executeTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(
input: SuiClientTypes.ExecuteTransactionOptions<Include>,
): Promise<SuiClientTypes.TransactionResult<Include>> {
return this.core.executeTransaction(input);
}
signAndExecuteTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(
input: SuiClientTypes.SignAndExecuteTransactionOptions<Include>,
): Promise<SuiClientTypes.TransactionResult<Include>> {
return this.core.signAndExecuteTransaction(input);
}
waitForTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(
input: SuiClientTypes.WaitForTransactionOptions<Include>,
): Promise<SuiClientTypes.TransactionResult<Include>> {
return this.core.waitForTransaction(input);
}
simulateTransaction<Include extends SuiClientTypes.SimulateTransactionInclude = {}>(
input: SuiClientTypes.SimulateTransactionOptions<Include>,
): Promise<SuiClientTypes.SimulateTransactionResult<Include>> {
return this.core.simulateTransaction(input);
}
getReferenceGasPrice(): Promise<SuiClientTypes.GetReferenceGasPriceResponse> {
return this.core.getReferenceGasPrice();
}
async listDynamicFields<Include extends DynamicFieldInclude = {}>(
input: SuiClientTypes.ListDynamicFieldsOptions & { include?: Include & DynamicFieldInclude },
): Promise<ListDynamicFieldsWithValueResponse<Include>> {
const includeValue = input.include?.value ?? false;
const paths = ['field_id', 'name', 'value_type', 'kind', 'child_id'];
if (includeValue) {
paths.push('value');
}
const response = await this.stateService.listDynamicFields({
parent: input.parentId,
pageToken: input.cursor ? fromBase64(input.cursor) : undefined,
pageSize: input.limit,
readMask: {
paths,
},
});
return {
dynamicFields: response.response.dynamicFields.map(
(field): DynamicFieldEntryWithValue<Include> => {
const isDynamicObject = field.kind === DynamicField_DynamicFieldKind.OBJECT;
const fieldType = isDynamicObject
? `0x2::dynamic_field::Field<0x2::dynamic_object_field::Wrapper<${field.name?.name!}>,0x2::object::ID>`
: `0x2::dynamic_field::Field<${field.name?.name!},${field.valueType!}>`;
return {
$kind: isDynamicObject ? 'DynamicObject' : 'DynamicField',
fieldId: field.fieldId!,
name: {
type: field.name?.name!,
bcs: field.name?.value!,
},
valueType: field.valueType!,
type: normalizeStructTag(fieldType),
childId: field.childId,
value: (includeValue
? { type: field.valueType!, bcs: field.value?.value ?? new Uint8Array() }
: undefined) as DynamicFieldEntryWithValue<Include>['value'],
} as DynamicFieldEntryWithValue<Include>;
},
),
cursor: response.response.nextPageToken ? toBase64(response.response.nextPageToken) : null,
hasNextPage: response.response.nextPageToken !== undefined,
};
}
getDynamicField(
input: SuiClientTypes.GetDynamicFieldOptions,
): Promise<SuiClientTypes.GetDynamicFieldResponse> {
return this.core.getDynamicField(input);
}
getMoveFunction(
input: SuiClientTypes.GetMoveFunctionOptions,
): Promise<SuiClientTypes.GetMoveFunctionResponse> {
return this.core.getMoveFunction(input);
}
resolveTransactionPlugin(): TransactionPlugin {
return this.core.resolveTransactionPlugin();
}
verifyZkLoginSignature(
input: SuiClientTypes.VerifyZkLoginSignatureOptions,
): Promise<SuiClientTypes.ZkLoginVerifyResponse> {
return this.core.verifyZkLoginSignature(input);
}
defaultNameServiceName(
input: SuiClientTypes.DefaultNameServiceNameOptions,
): Promise<SuiClientTypes.DefaultNameServiceNameResponse> {
return this.core.defaultNameServiceName(input);
}
}