UNPKG

@mysten/sui

Version:
1 lines 13.6 kB
{"version":3,"file":"core.mjs","names":["bcs"],"sources":["../../src/client/core.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { TypeTagSerializer } from '../bcs/type-tag-serializer.js';\nimport type { TransactionPlugin } from '../transactions/index.js';\nimport { deriveDynamicFieldID } from '../utils/dynamic-fields.js';\nimport { normalizeStructTag, parseStructTag, SUI_ADDRESS_LENGTH } from '../utils/sui-types.js';\nimport { BaseClient } from './client.js';\nimport type { ClientWithExtensions, SuiClientTypes } from './types.js';\nimport { MvrClient } from './mvr.js';\nimport { bcs } from '../bcs/index.js';\n\nexport type ClientWithCoreApi = ClientWithExtensions<{\n\tcore: CoreClient;\n}>;\n\nexport interface CoreClientOptions extends SuiClientTypes.SuiClientOptions {\n\tbase: BaseClient;\n\tmvr?: SuiClientTypes.MvrOptions;\n}\n\nconst DEFAULT_MVR_URLS: Record<string, string> = {\n\tmainnet: 'https://mainnet.mvr.mystenlabs.com',\n\ttestnet: 'https://testnet.mvr.mystenlabs.com',\n};\n\nexport abstract class CoreClient extends BaseClient implements SuiClientTypes.TransportMethods {\n\tcore = this;\n\tmvr: SuiClientTypes.MvrMethods;\n\n\tconstructor(options: CoreClientOptions) {\n\t\tsuper(options);\n\n\t\tthis.mvr = new MvrClient({\n\t\t\tcache: this.cache.scope('core.mvr'),\n\t\t\turl: options.mvr?.url ?? DEFAULT_MVR_URLS[this.network],\n\t\t\tpageSize: options.mvr?.pageSize,\n\t\t\toverrides: options.mvr?.overrides,\n\t\t});\n\t}\n\n\tabstract getObjects<Include extends SuiClientTypes.ObjectInclude = {}>(\n\t\toptions: SuiClientTypes.GetObjectsOptions<Include>,\n\t): Promise<SuiClientTypes.GetObjectsResponse<Include>>;\n\n\tasync getObject<Include extends SuiClientTypes.ObjectInclude = {}>(\n\t\toptions: SuiClientTypes.GetObjectOptions<Include>,\n\t): Promise<SuiClientTypes.GetObjectResponse<Include>> {\n\t\tconst { objectId } = options;\n\t\tconst {\n\t\t\tobjects: [result],\n\t\t} = await this.getObjects({\n\t\t\tobjectIds: [objectId],\n\t\t\tsignal: options.signal,\n\t\t\tinclude: options.include,\n\t\t});\n\t\tif (result instanceof Error) {\n\t\t\tthrow result;\n\t\t}\n\t\treturn { object: result };\n\t}\n\n\tabstract listCoins(\n\t\toptions: SuiClientTypes.ListCoinsOptions,\n\t): Promise<SuiClientTypes.ListCoinsResponse>;\n\n\tabstract listOwnedObjects<Include extends SuiClientTypes.ObjectInclude = {}>(\n\t\toptions: SuiClientTypes.ListOwnedObjectsOptions<Include>,\n\t): Promise<SuiClientTypes.ListOwnedObjectsResponse<Include>>;\n\n\tabstract getBalance(\n\t\toptions: SuiClientTypes.GetBalanceOptions,\n\t): Promise<SuiClientTypes.GetBalanceResponse>;\n\n\tabstract listBalances(\n\t\toptions: SuiClientTypes.ListBalancesOptions,\n\t): Promise<SuiClientTypes.ListBalancesResponse>;\n\n\tabstract getCoinMetadata(\n\t\toptions: SuiClientTypes.GetCoinMetadataOptions,\n\t): Promise<SuiClientTypes.GetCoinMetadataResponse>;\n\n\tabstract getTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(\n\t\toptions: SuiClientTypes.GetTransactionOptions<Include>,\n\t): Promise<SuiClientTypes.TransactionResult<Include>>;\n\n\tabstract executeTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(\n\t\toptions: SuiClientTypes.ExecuteTransactionOptions<Include>,\n\t): Promise<SuiClientTypes.TransactionResult<Include>>;\n\n\tabstract simulateTransaction<Include extends SuiClientTypes.SimulateTransactionInclude = {}>(\n\t\toptions: SuiClientTypes.SimulateTransactionOptions<Include>,\n\t): Promise<SuiClientTypes.SimulateTransactionResult<Include>>;\n\n\tabstract getReferenceGasPrice(\n\t\toptions?: SuiClientTypes.GetReferenceGasPriceOptions,\n\t): Promise<SuiClientTypes.GetReferenceGasPriceResponse>;\n\n\tabstract getCurrentSystemState(\n\t\toptions?: SuiClientTypes.GetCurrentSystemStateOptions,\n\t): Promise<SuiClientTypes.GetCurrentSystemStateResponse>;\n\n\tabstract getProtocolConfig(\n\t\toptions?: SuiClientTypes.GetProtocolConfigOptions,\n\t): Promise<SuiClientTypes.GetProtocolConfigResponse>;\n\n\tabstract getChainIdentifier(\n\t\toptions?: SuiClientTypes.GetChainIdentifierOptions,\n\t): Promise<SuiClientTypes.GetChainIdentifierResponse>;\n\n\tabstract listDynamicFields(\n\t\toptions: SuiClientTypes.ListDynamicFieldsOptions,\n\t): Promise<SuiClientTypes.ListDynamicFieldsResponse>;\n\n\tabstract resolveTransactionPlugin(): TransactionPlugin;\n\n\tabstract verifyZkLoginSignature(\n\t\toptions: SuiClientTypes.VerifyZkLoginSignatureOptions,\n\t): Promise<SuiClientTypes.ZkLoginVerifyResponse>;\n\n\tabstract getMoveFunction(\n\t\toptions: SuiClientTypes.GetMoveFunctionOptions,\n\t): Promise<SuiClientTypes.GetMoveFunctionResponse>;\n\n\tabstract defaultNameServiceName(\n\t\toptions: SuiClientTypes.DefaultNameServiceNameOptions,\n\t): Promise<SuiClientTypes.DefaultNameServiceNameResponse>;\n\n\tasync getDynamicField(\n\t\toptions: SuiClientTypes.GetDynamicFieldOptions,\n\t): Promise<SuiClientTypes.GetDynamicFieldResponse> {\n\t\tconst normalizedNameType = TypeTagSerializer.parseFromStr(\n\t\t\t(\n\t\t\t\tawait this.core.mvr.resolveType({\n\t\t\t\t\ttype: options.name.type,\n\t\t\t\t})\n\t\t\t).type,\n\t\t);\n\t\tconst fieldId = deriveDynamicFieldID(options.parentId, normalizedNameType, options.name.bcs);\n\t\tconst {\n\t\t\tobjects: [fieldObject],\n\t\t} = await this.getObjects({\n\t\t\tobjectIds: [fieldId],\n\t\t\tsignal: options.signal,\n\t\t\tinclude: {\n\t\t\t\tpreviousTransaction: true,\n\t\t\t\tcontent: true,\n\t\t\t},\n\t\t});\n\n\t\tif (fieldObject instanceof Error) {\n\t\t\tthrow fieldObject;\n\t\t}\n\n\t\tconst fieldType = parseStructTag(fieldObject.type);\n\t\tconst content = await fieldObject.content;\n\n\t\tconst nameTypeParam = fieldType.typeParams[0];\n\t\tconst isDynamicObject =\n\t\t\ttypeof nameTypeParam !== 'string' &&\n\t\t\tnameTypeParam.module === 'dynamic_object_field' &&\n\t\t\tnameTypeParam.name === 'Wrapper';\n\n\t\tconst valueBcs = content.slice(SUI_ADDRESS_LENGTH + options.name.bcs.length);\n\n\t\tconst valueType =\n\t\t\ttypeof fieldType.typeParams[1] === 'string'\n\t\t\t\t? fieldType.typeParams[1]\n\t\t\t\t: normalizeStructTag(fieldType.typeParams[1]);\n\n\t\treturn {\n\t\t\tdynamicField: {\n\t\t\t\t$kind: isDynamicObject ? 'DynamicObject' : 'DynamicField',\n\t\t\t\tfieldId: fieldObject.objectId,\n\t\t\t\tdigest: fieldObject.digest,\n\t\t\t\tversion: fieldObject.version,\n\t\t\t\ttype: fieldObject.type,\n\t\t\t\tpreviousTransaction: fieldObject.previousTransaction,\n\t\t\t\tname: {\n\t\t\t\t\ttype:\n\t\t\t\t\t\ttypeof nameTypeParam === 'string' ? nameTypeParam : normalizeStructTag(nameTypeParam),\n\t\t\t\t\tbcs: options.name.bcs,\n\t\t\t\t},\n\t\t\t\tvalue: {\n\t\t\t\t\ttype: valueType,\n\t\t\t\t\tbcs: valueBcs,\n\t\t\t\t},\n\t\t\t\tchildId: isDynamicObject ? bcs.Address.parse(valueBcs) : undefined,\n\t\t\t} as SuiClientTypes.GetDynamicFieldResponse['dynamicField'],\n\t\t};\n\t}\n\n\tasync getDynamicObjectField<Include extends SuiClientTypes.ObjectInclude = {}>(\n\t\toptions: SuiClientTypes.GetDynamicObjectFieldOptions<Include>,\n\t): Promise<SuiClientTypes.GetDynamicObjectFieldResponse<Include>> {\n\t\tconst resolvedNameType = (\n\t\t\tawait this.core.mvr.resolveType({\n\t\t\t\ttype: options.name.type,\n\t\t\t})\n\t\t).type;\n\t\tconst wrappedType = `0x2::dynamic_object_field::Wrapper<${resolvedNameType}>`;\n\n\t\tconst { dynamicField } = await this.getDynamicField({\n\t\t\tparentId: options.parentId,\n\t\t\tname: {\n\t\t\t\ttype: wrappedType,\n\t\t\t\tbcs: options.name.bcs,\n\t\t\t},\n\t\t\tsignal: options.signal,\n\t\t});\n\n\t\tconst { object } = await this.getObject({\n\t\t\tobjectId: dynamicField.childId!,\n\t\t\tsignal: options.signal,\n\t\t\tinclude: options.include,\n\t\t});\n\n\t\treturn { object };\n\t}\n\n\tasync waitForTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(\n\t\toptions: SuiClientTypes.WaitForTransactionOptions<Include>,\n\t): Promise<SuiClientTypes.TransactionResult<Include>> {\n\t\tconst { signal, timeout = 60 * 1000, pollSchedule, include } = options;\n\n\t\tconst digest =\n\t\t\t'result' in options && options.result\n\t\t\t\t? (options.result.Transaction ?? options.result.FailedTransaction)!.digest\n\t\t\t\t: options.digest;\n\n\t\tconst abortSignal = signal\n\t\t\t? AbortSignal.any([AbortSignal.timeout(timeout), signal])\n\t\t\t: AbortSignal.timeout(timeout);\n\n\t\tconst abortPromise = new Promise((_, reject) => {\n\t\t\tabortSignal.addEventListener('abort', () => reject(abortSignal.reason));\n\t\t});\n\n\t\tabortPromise.catch(() => {\n\t\t\t// Swallow unhandled rejections that might be thrown after early return\n\t\t});\n\n\t\t// Default schedule tuned to testnet measurements:\n\t\t// - Fullnode (gRPC/JSON-RPC): p50=130ms, p95=330ms\n\t\t// - GraphQL indexer: p50=1300ms, p95=1430ms\n\t\t// After schedule exhausted, repeats the last interval.\n\t\tconst schedule = pollSchedule ?? [0, 300, 600, 1500, 3500];\n\t\tconst t0 = Date.now();\n\t\tlet scheduleIndex = 0;\n\t\tconst lastInterval =\n\t\t\tschedule.length > 0\n\t\t\t\t? schedule[schedule.length - 1] - (schedule[schedule.length - 2] ?? 0)\n\t\t\t\t: 2_000;\n\n\t\twhile (true) {\n\t\t\tif (scheduleIndex < schedule.length) {\n\t\t\t\tconst remaining = t0 + schedule[scheduleIndex] - Date.now();\n\t\t\t\tscheduleIndex++;\n\t\t\t\tif (remaining > 0) {\n\t\t\t\t\tawait Promise.race([\n\t\t\t\t\t\tnew Promise((resolve) => setTimeout(resolve, remaining)),\n\t\t\t\t\t\tabortPromise,\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tawait Promise.race([\n\t\t\t\t\tnew Promise((resolve) => setTimeout(resolve, lastInterval)),\n\t\t\t\t\tabortPromise,\n\t\t\t\t]);\n\t\t\t}\n\n\t\t\tabortSignal.throwIfAborted();\n\t\t\ttry {\n\t\t\t\treturn await this.getTransaction({\n\t\t\t\t\tdigest,\n\t\t\t\t\tinclude,\n\t\t\t\t\tsignal: abortSignal,\n\t\t\t\t});\n\t\t\t} catch {}\n\t\t}\n\t}\n\n\tasync signAndExecuteTransaction<Include extends SuiClientTypes.TransactionInclude = {}>({\n\t\ttransaction,\n\t\tsigner,\n\t\tadditionalSignatures = [],\n\t\t...input\n\t}: SuiClientTypes.SignAndExecuteTransactionOptions<Include>): Promise<\n\t\tSuiClientTypes.TransactionResult<Include>\n\t> {\n\t\tlet transactionBytes;\n\n\t\tif (transaction instanceof Uint8Array) {\n\t\t\ttransactionBytes = transaction;\n\t\t} else {\n\t\t\ttransaction.setSenderIfNotSet(signer.toSuiAddress());\n\t\t\ttransactionBytes = await transaction.build({ client: this });\n\t\t}\n\n\t\tconst { signature } = await signer.signTransaction(transactionBytes);\n\n\t\treturn this.executeTransaction({\n\t\t\ttransaction: transactionBytes,\n\t\t\tsignatures: [signature, ...additionalSignatures],\n\t\t\t...input,\n\t\t});\n\t}\n}\n"],"mappings":"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"}