UNPKG

@mysten/sui

Version:
243 lines (209 loc) 8.97 kB
// 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); } }