@mysten/sui 2.5.0 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/dist/bcs/index.d.mts +20 -20
- package/dist/client/core-resolver.mjs +6 -3
- package/dist/client/core-resolver.mjs.map +1 -1
- package/dist/client/core.d.mts +8 -8
- package/dist/client/core.d.mts.map +1 -1
- package/dist/client/core.mjs +11 -5
- package/dist/client/core.mjs.map +1 -1
- package/dist/client/types.d.mts +56 -18
- package/dist/client/types.d.mts.map +1 -1
- package/dist/cryptography/signature.d.mts +6 -6
- package/dist/graphql/client.d.mts +16 -1
- package/dist/graphql/client.d.mts.map +1 -1
- package/dist/graphql/client.mjs +50 -2
- package/dist/graphql/client.mjs.map +1 -1
- package/dist/graphql/core.d.mts +5 -5
- package/dist/graphql/core.d.mts.map +1 -1
- package/dist/graphql/core.mjs +7 -41
- package/dist/graphql/core.mjs.map +1 -1
- package/dist/graphql/generated/queries.d.mts.map +1 -1
- package/dist/graphql/generated/queries.mjs +7 -4
- package/dist/graphql/generated/queries.mjs.map +1 -1
- package/dist/graphql/generated/tada-env.d.mts +0 -22
- package/dist/grpc/client.d.mts +16 -1
- package/dist/grpc/client.d.mts.map +1 -1
- package/dist/grpc/client.mjs +42 -2
- package/dist/grpc/client.mjs.map +1 -1
- package/dist/grpc/core.d.mts +5 -5
- package/dist/grpc/core.d.mts.map +1 -1
- package/dist/grpc/core.mjs +3 -33
- package/dist/grpc/core.mjs.map +1 -1
- package/dist/grpc/proto/sui/rpc/v2/move_package_service.client.d.mts +4 -4
- package/dist/grpc/proto/sui/rpc/v2/signature_verification_service.client.d.mts +4 -4
- package/dist/grpc/proto/sui/rpc/v2/subscription_service.client.d.mts +4 -4
- package/dist/grpc/proto/sui/rpc/v2/transaction.d.mts.map +1 -1
- package/dist/grpc/proto/sui/rpc/v2/transaction_execution_service.client.d.mts +4 -4
- package/dist/jsonRpc/core.d.mts +6 -6
- package/dist/jsonRpc/core.d.mts.map +1 -1
- package/dist/jsonRpc/core.mjs +4 -2
- package/dist/jsonRpc/core.mjs.map +1 -1
- package/dist/keypairs/ed25519/keypair.d.mts +3 -1
- package/dist/keypairs/ed25519/keypair.d.mts.map +1 -1
- package/dist/keypairs/ed25519/keypair.mjs +5 -1
- package/dist/keypairs/ed25519/keypair.mjs.map +1 -1
- package/dist/transactions/Transaction.d.mts +3 -3
- package/dist/transactions/Transaction.d.mts.map +1 -1
- package/dist/transactions/executor/caching.mjs.map +1 -1
- package/dist/transactions/executor/parallel.d.mts +1 -1
- package/dist/transactions/executor/parallel.d.mts.map +1 -1
- package/dist/transactions/executor/parallel.mjs +1 -1
- package/dist/transactions/executor/parallel.mjs.map +1 -1
- package/dist/transactions/executor/serial.d.mts +1 -1
- package/dist/transactions/executor/serial.d.mts.map +1 -1
- package/dist/transactions/executor/serial.mjs.map +1 -1
- package/dist/version.mjs +2 -2
- package/dist/version.mjs.map +1 -1
- package/package.json +1 -1
- package/src/client/core-resolver.ts +9 -8
- package/src/client/core.ts +28 -18
- package/src/client/types.ts +57 -18
- package/src/graphql/client.ts +96 -4
- package/src/graphql/core.ts +9 -75
- package/src/graphql/generated/queries.ts +19 -30
- package/src/graphql/generated/schema.graphql +4 -17
- package/src/graphql/generated/tada-env.ts +0 -24
- package/src/graphql/queries/getDynamicFields.graphql +8 -1
- package/src/graphql/queries/transactions.graphql +1 -3
- package/src/grpc/client.ts +62 -4
- package/src/grpc/core.ts +8 -39
- package/src/jsonRpc/core.ts +9 -7
- package/src/keypairs/ed25519/keypair.ts +5 -1
- package/src/transactions/executor/caching.ts +2 -2
- package/src/transactions/executor/parallel.ts +1 -2
- package/src/transactions/executor/serial.ts +1 -1
- package/src/version.ts +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serial.d.mts","names":[],"sources":["../../../src/transactions/executor/serial.ts"],"sourcesContent":[],"mappings":";;;;;;;;UAcU,oCAAA,SAA6C,KAAK;UACnD;EADC,MAAA,EAED,MAFC;EAAkD,gBAAA,CAAA,EAAA,MAAA;;AAEnD,UAIQ,oCAAA,SAA6C,oCAJrD,CAAA;EAF8C,OAAA,CAAA,EAAA,OAAA;;AAMtC,UAIA,8CAAA,SAAuD,oCAJ0B,CAAA;EAIjF,OAAA,EAAA,gBAAA;AAIjB;AAIa,KAJD,gCAAA,GACT,oCAGmC,GAFnC,8CAEmC;AAchB,cAdT,yBAAA,CAcS;EAac,CAAA,OAAI;EAA6B,WAAA,CAAA,OAAA,EAb/C,gCAa+C;EAiBhC,YAAA,CAAA,OAAA,EAAA,OAjBD,MAAA,CAAI,kBAAA,CAAmB,UAiBtB,CAAA,EAjBgC,OAiBhC,CAAA,IAAA,CAAA;EAAW,gBAAA,CAAA,WAAA,EAAX,WAAW,CAAA,EAAA,OAAA,CAAA,UAAA,CAAA,WAAA,CAAA,CAAA;EAAA,UAAA,CAAA,CAAA,EAgFrC,OAhFqC,CAAA,IAAA,CAAA;EAAA,sBAAA,CAAA,CAAA,EAoFzB,OApFyB,CAAA,IAAA,CAAA;EAgFrC,kBAAA,CAAA,gBAQyB,cAAA,CAAe,kBARxC,GAAA,CAAA,CAAA,CAAA,CAAA,WAAA,EASI,WATJ,GASkB,UATlB,EAAA,OAAA,CAAA,EAUC,OAVD,EAAA,oBAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAYP,OAZO,CAYC,cAAA,CAAe,iBAZhB,CAYkC,OAZlC,GAAA;IAIY,OAAA,EAAA,IAAA;EAIa,CAAA,CAAA,CAAA"}
|
|
1
|
+
{"version":3,"file":"serial.d.mts","names":[],"sources":["../../../src/transactions/executor/serial.ts"],"sourcesContent":[],"mappings":";;;;;;;;UAcU,oCAAA,SAA6C,KAAK;UACnD;EADC,MAAA,EAED,MAFC;EAAkD,gBAAA,CAAA,EAAA,MAAA;;AAEnD,UAIQ,oCAAA,SAA6C,oCAJrD,CAAA;EAF8C,OAAA,CAAA,EAAA,OAAA;;AAMtC,UAIA,8CAAA,SAAuD,oCAJ0B,CAAA;EAIjF,OAAA,EAAA,gBAAA;AAIjB;AAIa,KAJD,gCAAA,GACT,oCAGmC,GAFnC,8CAEmC;AAchB,cAdT,yBAAA,CAcS;EAac,CAAA,OAAI;EAA6B,WAAA,CAAA,OAAA,EAb/C,gCAa+C;EAiBhC,YAAA,CAAA,OAAA,EAAA,OAjBD,MAAA,CAAI,kBAAA,CAAmB,UAiBtB,CAAA,EAjBgC,OAiBhC,CAAA,IAAA,CAAA;EAAW,gBAAA,CAAA,WAAA,EAAX,WAAW,CAAA,EAAA,OAAA,CAAA,UAAA,CAAA,WAAA,CAAA,CAAA;EAAA,UAAA,CAAA,CAAA,EAgFrC,OAhFqC,CAAA,IAAA,CAAA;EAAA,sBAAA,CAAA,CAAA,EAoFzB,OApFyB,CAAA,IAAA,CAAA;EAgFrC,kBAAA,CAAA,gBAQyB,cAAA,CAAe,kBARxC,GAAA,CAAA,CAAA,CAAA,CAAA,WAAA,EASI,WATJ,GASkB,UATlB,EAAA,OAAA,CAAA,EAUC,OAVD,GAUW,cAAA,CAAe,kBAV1B,EAAA,oBAAA,CAAA,EAAA,MAAA,EAAA,CAAA,EAYP,OAZO,CAYC,cAAA,CAAe,iBAZhB,CAYkC,OAZlC,GAAA;IAIY,OAAA,EAAA,IAAA;EAIa,CAAA,CAAA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serial.mjs","names":["#signer","#client","#defaultGasBudget","#gasMode","#cache","#cacheGasCoin","#queue","#buildTransaction","#getValidDuringExpiration","#ensureEpochInfo","#epochInfo","#epochInfoPromise","#fetchEpochInfo"],"sources":["../../../src/transactions/executor/serial.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { bcs } from '../../bcs/index.js';\nimport type { ClientWithCoreApi } from '../../client/core.js';\nimport type { SuiClientTypes } from '../../client/types.js';\nimport type { Signer } from '../../cryptography/keypair.js';\nimport type { ObjectCacheOptions } from '../ObjectCache.js';\nimport { isTransaction, Transaction } from '../Transaction.js';\nimport { CachingTransactionExecutor } from './caching.js';\nimport { SerialQueue } from './queue.js';\n\nconst EPOCH_BOUNDARY_WINDOW = 60_000;\n\ninterface SerialTransactionExecutorBaseOptions extends Omit<ObjectCacheOptions, 'address'> {\n\tclient: ClientWithCoreApi;\n\tsigner: Signer;\n\tdefaultGasBudget?: bigint;\n}\n\nexport interface SerialTransactionExecutorCoinOptions extends SerialTransactionExecutorBaseOptions {\n\tgasMode?: 'coins';\n}\n\nexport interface SerialTransactionExecutorAddressBalanceOptions extends SerialTransactionExecutorBaseOptions {\n\tgasMode: 'addressBalance';\n}\n\nexport type SerialTransactionExecutorOptions =\n\t| SerialTransactionExecutorCoinOptions\n\t| SerialTransactionExecutorAddressBalanceOptions;\n\nexport class SerialTransactionExecutor {\n\t#queue = new SerialQueue();\n\t#signer: Signer;\n\t#client: ClientWithCoreApi;\n\t#cache: CachingTransactionExecutor;\n\t#defaultGasBudget: bigint;\n\t#gasMode: 'coins' | 'addressBalance';\n\t#epochInfo: null | {\n\t\tepoch: string;\n\t\texpiration: number;\n\t\tchainIdentifier: string;\n\t} = null;\n\t#epochInfoPromise: Promise<void> | null = null;\n\n\tconstructor(options: SerialTransactionExecutorOptions) {\n\t\tconst { signer, defaultGasBudget = 50_000_000n, client, cache } = options;\n\t\tthis.#signer = signer;\n\t\tthis.#client = client;\n\t\tthis.#defaultGasBudget = defaultGasBudget;\n\t\tthis.#gasMode = options.gasMode ?? 'coins';\n\t\tthis.#cache = new CachingTransactionExecutor({\n\t\t\tclient,\n\t\t\tcache,\n\t\t\tonEffects: (effects) => this.#cacheGasCoin(effects),\n\t\t});\n\t}\n\n\tasync applyEffects(effects: typeof bcs.TransactionEffects.$inferType) {\n\t\treturn this.#cache.applyEffects(effects);\n\t}\n\n\t#cacheGasCoin = async (effects: typeof bcs.TransactionEffects.$inferType) => {\n\t\tif (this.#gasMode === 'addressBalance' || !effects.V2) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst gasCoin = getGasCoinFromEffects(effects).ref;\n\t\tif (gasCoin) {\n\t\t\tthis.#cache.cache.setCustom('gasCoin', gasCoin);\n\t\t} else {\n\t\t\tthis.#cache.cache.deleteCustom('gasCoin');\n\t\t}\n\t};\n\n\tasync buildTransaction(transaction: Transaction) {\n\t\treturn this.#queue.runTask(() => this.#buildTransaction(transaction));\n\t}\n\n\t#buildTransaction = async (transaction: Transaction) => {\n\t\tawait transaction.prepareForSerialization({\n\t\t\tclient: this.#client,\n\t\t\tsupportedIntents: ['CoinWithBalance'],\n\t\t});\n\t\tconst copy = Transaction.from(transaction);\n\n\t\tif (this.#gasMode === 'addressBalance') {\n\t\t\tcopy.setGasPayment([]);\n\t\t\tcopy.setExpiration(await this.#getValidDuringExpiration());\n\t\t} else {\n\t\t\t// Coin mode: use cached gas coin if available\n\t\t\tconst gasCoin = await this.#cache.cache.getCustom<{\n\t\t\t\tobjectId: string;\n\t\t\t\tversion: string;\n\t\t\t\tdigest: string;\n\t\t\t}>('gasCoin');\n\n\t\t\tif (gasCoin) {\n\t\t\t\tcopy.setGasPayment([gasCoin]);\n\t\t\t}\n\t\t}\n\n\t\tcopy.setGasBudgetIfNotSet(this.#defaultGasBudget);\n\t\tcopy.setSenderIfNotSet(this.#signer.toSuiAddress());\n\n\t\treturn this.#cache.buildTransaction({ transaction: copy });\n\t};\n\n\tasync #getValidDuringExpiration() {\n\t\tawait this.#ensureEpochInfo();\n\t\tconst currentEpoch = BigInt(this.#epochInfo!.epoch);\n\t\treturn {\n\t\t\tValidDuring: {\n\t\t\t\tminEpoch: String(currentEpoch),\n\t\t\t\tmaxEpoch: String(currentEpoch + 1n),\n\t\t\t\tminTimestamp: null,\n\t\t\t\tmaxTimestamp: null,\n\t\t\t\tchain: this.#epochInfo!.chainIdentifier,\n\t\t\t\tnonce: (Math.random() * 0x100000000) >>> 0,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync #ensureEpochInfo(): Promise<void> {\n\t\tif (this.#epochInfo && this.#epochInfo.expiration - EPOCH_BOUNDARY_WINDOW - Date.now() > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#epochInfoPromise) {\n\t\t\tawait this.#epochInfoPromise;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#epochInfoPromise = this.#fetchEpochInfo();\n\t\ttry {\n\t\t\tawait this.#epochInfoPromise;\n\t\t} finally {\n\t\t\tthis.#epochInfoPromise = null;\n\t\t}\n\t}\n\n\tasync #fetchEpochInfo(): Promise<void> {\n\t\tconst [{ systemState }, { chainIdentifier }] = await Promise.all([\n\t\t\tthis.#client.core.getCurrentSystemState(),\n\t\t\tthis.#client.core.getChainIdentifier(),\n\t\t]);\n\n\t\tthis.#epochInfo = {\n\t\t\tepoch: systemState.epoch,\n\t\t\texpiration:\n\t\t\t\tNumber(systemState.epochStartTimestampMs) + Number(systemState.parameters.epochDurationMs),\n\t\t\tchainIdentifier,\n\t\t};\n\t}\n\n\tresetCache() {\n\t\treturn this.#cache.reset();\n\t}\n\n\twaitForLastTransaction() {\n\t\treturn this.#cache.waitForLastTransaction();\n\t}\n\n\texecuteTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(\n\t\ttransaction: Transaction | Uint8Array,\n\t\tinclude?: Include,\n\t\tadditionalSignatures: string[] = [],\n\t): Promise<SuiClientTypes.TransactionResult<Include & { effects: true }>> {\n\t\treturn this.#queue.runTask(async () => {\n\t\t\tconst bytes = isTransaction(transaction)\n\t\t\t\t? await this.#buildTransaction(transaction)\n\t\t\t\t: transaction;\n\n\t\t\tconst { signature } = await this.#signer.signTransaction(bytes);\n\t\t\treturn this.#cache\n\t\t\t\t.executeTransaction({\n\t\t\t\t\tsignatures: [signature, ...additionalSignatures],\n\t\t\t\t\ttransaction: bytes,\n\t\t\t\t\tinclude,\n\t\t\t\t})\n\t\t\t\t.catch(async (error) => {\n\t\t\t\t\tawait this.resetCache();\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t});\n\t}\n}\n\nexport function getGasCoinFromEffects(effects: typeof bcs.TransactionEffects.$inferType) {\n\tif (!effects.V2) {\n\t\tthrow new Error('Unexpected effects version');\n\t}\n\n\tconst gasObjectChange = effects.V2.changedObjects[effects.V2.gasObjectIndex!];\n\n\tif (!gasObjectChange) {\n\t\tthrow new Error('Gas object not found in effects');\n\t}\n\n\tconst [objectId, { outputState }] = gasObjectChange;\n\n\tif (!outputState.ObjectWrite) {\n\t\tthrow new Error('Unexpected gas object state');\n\t}\n\n\tconst [digest, owner] = outputState.ObjectWrite;\n\n\treturn {\n\t\tref: {\n\t\t\tobjectId,\n\t\t\tdigest,\n\t\t\tversion: effects.V2.lamportVersion,\n\t\t},\n\t\towner: owner.AddressOwner || owner.ObjectOwner!,\n\t};\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"serial.mjs","names":["#signer","#client","#defaultGasBudget","#gasMode","#cache","#cacheGasCoin","#queue","#buildTransaction","#getValidDuringExpiration","#ensureEpochInfo","#epochInfo","#epochInfoPromise","#fetchEpochInfo"],"sources":["../../../src/transactions/executor/serial.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { bcs } from '../../bcs/index.js';\nimport type { ClientWithCoreApi } from '../../client/core.js';\nimport type { SuiClientTypes } from '../../client/types.js';\nimport type { Signer } from '../../cryptography/keypair.js';\nimport type { ObjectCacheOptions } from '../ObjectCache.js';\nimport { isTransaction, Transaction } from '../Transaction.js';\nimport { CachingTransactionExecutor } from './caching.js';\nimport { SerialQueue } from './queue.js';\n\nconst EPOCH_BOUNDARY_WINDOW = 60_000;\n\ninterface SerialTransactionExecutorBaseOptions extends Omit<ObjectCacheOptions, 'address'> {\n\tclient: ClientWithCoreApi;\n\tsigner: Signer;\n\tdefaultGasBudget?: bigint;\n}\n\nexport interface SerialTransactionExecutorCoinOptions extends SerialTransactionExecutorBaseOptions {\n\tgasMode?: 'coins';\n}\n\nexport interface SerialTransactionExecutorAddressBalanceOptions extends SerialTransactionExecutorBaseOptions {\n\tgasMode: 'addressBalance';\n}\n\nexport type SerialTransactionExecutorOptions =\n\t| SerialTransactionExecutorCoinOptions\n\t| SerialTransactionExecutorAddressBalanceOptions;\n\nexport class SerialTransactionExecutor {\n\t#queue = new SerialQueue();\n\t#signer: Signer;\n\t#client: ClientWithCoreApi;\n\t#cache: CachingTransactionExecutor;\n\t#defaultGasBudget: bigint;\n\t#gasMode: 'coins' | 'addressBalance';\n\t#epochInfo: null | {\n\t\tepoch: string;\n\t\texpiration: number;\n\t\tchainIdentifier: string;\n\t} = null;\n\t#epochInfoPromise: Promise<void> | null = null;\n\n\tconstructor(options: SerialTransactionExecutorOptions) {\n\t\tconst { signer, defaultGasBudget = 50_000_000n, client, cache } = options;\n\t\tthis.#signer = signer;\n\t\tthis.#client = client;\n\t\tthis.#defaultGasBudget = defaultGasBudget;\n\t\tthis.#gasMode = options.gasMode ?? 'coins';\n\t\tthis.#cache = new CachingTransactionExecutor({\n\t\t\tclient,\n\t\t\tcache,\n\t\t\tonEffects: (effects) => this.#cacheGasCoin(effects),\n\t\t});\n\t}\n\n\tasync applyEffects(effects: typeof bcs.TransactionEffects.$inferType) {\n\t\treturn this.#cache.applyEffects(effects);\n\t}\n\n\t#cacheGasCoin = async (effects: typeof bcs.TransactionEffects.$inferType) => {\n\t\tif (this.#gasMode === 'addressBalance' || !effects.V2) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst gasCoin = getGasCoinFromEffects(effects).ref;\n\t\tif (gasCoin) {\n\t\t\tthis.#cache.cache.setCustom('gasCoin', gasCoin);\n\t\t} else {\n\t\t\tthis.#cache.cache.deleteCustom('gasCoin');\n\t\t}\n\t};\n\n\tasync buildTransaction(transaction: Transaction) {\n\t\treturn this.#queue.runTask(() => this.#buildTransaction(transaction));\n\t}\n\n\t#buildTransaction = async (transaction: Transaction) => {\n\t\tawait transaction.prepareForSerialization({\n\t\t\tclient: this.#client,\n\t\t\tsupportedIntents: ['CoinWithBalance'],\n\t\t});\n\t\tconst copy = Transaction.from(transaction);\n\n\t\tif (this.#gasMode === 'addressBalance') {\n\t\t\tcopy.setGasPayment([]);\n\t\t\tcopy.setExpiration(await this.#getValidDuringExpiration());\n\t\t} else {\n\t\t\t// Coin mode: use cached gas coin if available\n\t\t\tconst gasCoin = await this.#cache.cache.getCustom<{\n\t\t\t\tobjectId: string;\n\t\t\t\tversion: string;\n\t\t\t\tdigest: string;\n\t\t\t}>('gasCoin');\n\n\t\t\tif (gasCoin) {\n\t\t\t\tcopy.setGasPayment([gasCoin]);\n\t\t\t}\n\t\t}\n\n\t\tcopy.setGasBudgetIfNotSet(this.#defaultGasBudget);\n\t\tcopy.setSenderIfNotSet(this.#signer.toSuiAddress());\n\n\t\treturn this.#cache.buildTransaction({ transaction: copy });\n\t};\n\n\tasync #getValidDuringExpiration() {\n\t\tawait this.#ensureEpochInfo();\n\t\tconst currentEpoch = BigInt(this.#epochInfo!.epoch);\n\t\treturn {\n\t\t\tValidDuring: {\n\t\t\t\tminEpoch: String(currentEpoch),\n\t\t\t\tmaxEpoch: String(currentEpoch + 1n),\n\t\t\t\tminTimestamp: null,\n\t\t\t\tmaxTimestamp: null,\n\t\t\t\tchain: this.#epochInfo!.chainIdentifier,\n\t\t\t\tnonce: (Math.random() * 0x100000000) >>> 0,\n\t\t\t},\n\t\t};\n\t}\n\n\tasync #ensureEpochInfo(): Promise<void> {\n\t\tif (this.#epochInfo && this.#epochInfo.expiration - EPOCH_BOUNDARY_WINDOW - Date.now() > 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.#epochInfoPromise) {\n\t\t\tawait this.#epochInfoPromise;\n\t\t\treturn;\n\t\t}\n\n\t\tthis.#epochInfoPromise = this.#fetchEpochInfo();\n\t\ttry {\n\t\t\tawait this.#epochInfoPromise;\n\t\t} finally {\n\t\t\tthis.#epochInfoPromise = null;\n\t\t}\n\t}\n\n\tasync #fetchEpochInfo(): Promise<void> {\n\t\tconst [{ systemState }, { chainIdentifier }] = await Promise.all([\n\t\t\tthis.#client.core.getCurrentSystemState(),\n\t\t\tthis.#client.core.getChainIdentifier(),\n\t\t]);\n\n\t\tthis.#epochInfo = {\n\t\t\tepoch: systemState.epoch,\n\t\t\texpiration:\n\t\t\t\tNumber(systemState.epochStartTimestampMs) + Number(systemState.parameters.epochDurationMs),\n\t\t\tchainIdentifier,\n\t\t};\n\t}\n\n\tresetCache() {\n\t\treturn this.#cache.reset();\n\t}\n\n\twaitForLastTransaction() {\n\t\treturn this.#cache.waitForLastTransaction();\n\t}\n\n\texecuteTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(\n\t\ttransaction: Transaction | Uint8Array,\n\t\tinclude?: Include & SuiClientTypes.TransactionInclude,\n\t\tadditionalSignatures: string[] = [],\n\t): Promise<SuiClientTypes.TransactionResult<Include & { effects: true }>> {\n\t\treturn this.#queue.runTask(async () => {\n\t\t\tconst bytes = isTransaction(transaction)\n\t\t\t\t? await this.#buildTransaction(transaction)\n\t\t\t\t: transaction;\n\n\t\t\tconst { signature } = await this.#signer.signTransaction(bytes);\n\t\t\treturn this.#cache\n\t\t\t\t.executeTransaction({\n\t\t\t\t\tsignatures: [signature, ...additionalSignatures],\n\t\t\t\t\ttransaction: bytes,\n\t\t\t\t\tinclude,\n\t\t\t\t})\n\t\t\t\t.catch(async (error) => {\n\t\t\t\t\tawait this.resetCache();\n\t\t\t\t\tthrow error;\n\t\t\t\t});\n\t\t});\n\t}\n}\n\nexport function getGasCoinFromEffects(effects: typeof bcs.TransactionEffects.$inferType) {\n\tif (!effects.V2) {\n\t\tthrow new Error('Unexpected effects version');\n\t}\n\n\tconst gasObjectChange = effects.V2.changedObjects[effects.V2.gasObjectIndex!];\n\n\tif (!gasObjectChange) {\n\t\tthrow new Error('Gas object not found in effects');\n\t}\n\n\tconst [objectId, { outputState }] = gasObjectChange;\n\n\tif (!outputState.ObjectWrite) {\n\t\tthrow new Error('Unexpected gas object state');\n\t}\n\n\tconst [digest, owner] = outputState.ObjectWrite;\n\n\treturn {\n\t\tref: {\n\t\t\tobjectId,\n\t\t\tdigest,\n\t\t\tversion: effects.V2.lamportVersion,\n\t\t},\n\t\towner: owner.AddressOwner || owner.ObjectOwner!,\n\t};\n}\n"],"mappings":"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"}
|
package/dist/version.mjs
CHANGED
package/dist/version.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.mjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n// This file is generated by genversion.mjs. Do not edit it directly.\n\nexport const PACKAGE_VERSION = '2.
|
|
1
|
+
{"version":3,"file":"version.mjs","names":[],"sources":["../src/version.ts"],"sourcesContent":["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n// This file is generated by genversion.mjs. Do not edit it directly.\n\nexport const PACKAGE_VERSION = '2.6.0';\nexport const TARGETED_RPC_VERSION = '1.68.0';\n"],"mappings":";AAKA,MAAa,kBAAkB;AAC/B,MAAa,uBAAuB"}
|
package/package.json
CHANGED
|
@@ -112,7 +112,12 @@ async function setGasBudget(transactionData: TransactionDataBuilder, client: Cli
|
|
|
112
112
|
// The current default is just picking _all_ coins we can which may not be ideal.
|
|
113
113
|
async function setGasPayment(transactionData: TransactionDataBuilder, client: ClientWithCoreApi) {
|
|
114
114
|
if (!transactionData.gasData.payment) {
|
|
115
|
-
const gasPayer = transactionData.gasData.owner ?? transactionData.sender
|
|
115
|
+
const gasPayer = transactionData.gasData.owner ?? transactionData.sender;
|
|
116
|
+
if (!gasPayer) {
|
|
117
|
+
throw new Error('Either a gas owner or sender must be set to determine gas payment.');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const normalizedGasPayer = normalizeSuiAddress(gasPayer);
|
|
116
121
|
let usesGasCoin = false;
|
|
117
122
|
let withdrawals = 0n;
|
|
118
123
|
|
|
@@ -127,7 +132,7 @@ async function setGasPayment(transactionData: TransactionDataBuilder, client: Cl
|
|
|
127
132
|
? transactionData.sender
|
|
128
133
|
: gasPayer;
|
|
129
134
|
|
|
130
|
-
if (withdrawalOwner ===
|
|
135
|
+
if (withdrawalOwner && normalizeSuiAddress(withdrawalOwner) === normalizedGasPayer) {
|
|
131
136
|
if (input.FundsWithdrawal.reservation.$kind === 'MaxAmountU64') {
|
|
132
137
|
withdrawals += BigInt(input.FundsWithdrawal.reservation.MaxAmountU64);
|
|
133
138
|
}
|
|
@@ -139,13 +144,9 @@ async function setGasPayment(transactionData: TransactionDataBuilder, client: Cl
|
|
|
139
144
|
});
|
|
140
145
|
|
|
141
146
|
const [suiBalance, coins] = await Promise.all([
|
|
142
|
-
usesGasCoin
|
|
143
|
-
? null
|
|
144
|
-
: client.core.getBalance({
|
|
145
|
-
owner: transactionData.gasData.owner,
|
|
146
|
-
}),
|
|
147
|
+
usesGasCoin ? null : client.core.getBalance({ owner: gasPayer }),
|
|
147
148
|
client.core.listCoins({
|
|
148
|
-
owner:
|
|
149
|
+
owner: gasPayer,
|
|
149
150
|
coinType: SUI_TYPE_ARG,
|
|
150
151
|
}),
|
|
151
152
|
]);
|
package/src/client/core.ts
CHANGED
|
@@ -39,11 +39,11 @@ export abstract class CoreClient extends BaseClient implements SuiClientTypes.Tr
|
|
|
39
39
|
});
|
|
40
40
|
}
|
|
41
41
|
|
|
42
|
-
abstract getObjects<Include extends SuiClientTypes.ObjectInclude =
|
|
42
|
+
abstract getObjects<Include extends SuiClientTypes.ObjectInclude = {}>(
|
|
43
43
|
options: SuiClientTypes.GetObjectsOptions<Include>,
|
|
44
44
|
): Promise<SuiClientTypes.GetObjectsResponse<Include>>;
|
|
45
45
|
|
|
46
|
-
async getObject<Include extends SuiClientTypes.ObjectInclude =
|
|
46
|
+
async getObject<Include extends SuiClientTypes.ObjectInclude = {}>(
|
|
47
47
|
options: SuiClientTypes.GetObjectOptions<Include>,
|
|
48
48
|
): Promise<SuiClientTypes.GetObjectResponse<Include>> {
|
|
49
49
|
const { objectId } = options;
|
|
@@ -64,7 +64,7 @@ export abstract class CoreClient extends BaseClient implements SuiClientTypes.Tr
|
|
|
64
64
|
options: SuiClientTypes.ListCoinsOptions,
|
|
65
65
|
): Promise<SuiClientTypes.ListCoinsResponse>;
|
|
66
66
|
|
|
67
|
-
abstract listOwnedObjects<Include extends SuiClientTypes.ObjectInclude =
|
|
67
|
+
abstract listOwnedObjects<Include extends SuiClientTypes.ObjectInclude = {}>(
|
|
68
68
|
options: SuiClientTypes.ListOwnedObjectsOptions<Include>,
|
|
69
69
|
): Promise<SuiClientTypes.ListOwnedObjectsResponse<Include>>;
|
|
70
70
|
|
|
@@ -80,15 +80,15 @@ export abstract class CoreClient extends BaseClient implements SuiClientTypes.Tr
|
|
|
80
80
|
options: SuiClientTypes.GetCoinMetadataOptions,
|
|
81
81
|
): Promise<SuiClientTypes.GetCoinMetadataResponse>;
|
|
82
82
|
|
|
83
|
-
abstract getTransaction<Include extends SuiClientTypes.TransactionInclude =
|
|
83
|
+
abstract getTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(
|
|
84
84
|
options: SuiClientTypes.GetTransactionOptions<Include>,
|
|
85
85
|
): Promise<SuiClientTypes.TransactionResult<Include>>;
|
|
86
86
|
|
|
87
|
-
abstract executeTransaction<Include extends SuiClientTypes.TransactionInclude =
|
|
87
|
+
abstract executeTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(
|
|
88
88
|
options: SuiClientTypes.ExecuteTransactionOptions<Include>,
|
|
89
89
|
): Promise<SuiClientTypes.TransactionResult<Include>>;
|
|
90
90
|
|
|
91
|
-
abstract simulateTransaction<Include extends SuiClientTypes.SimulateTransactionInclude =
|
|
91
|
+
abstract simulateTransaction<Include extends SuiClientTypes.SimulateTransactionInclude = {}>(
|
|
92
92
|
options: SuiClientTypes.SimulateTransactionOptions<Include>,
|
|
93
93
|
): Promise<SuiClientTypes.SimulateTransactionResult<Include>>;
|
|
94
94
|
|
|
@@ -151,8 +151,22 @@ export abstract class CoreClient extends BaseClient implements SuiClientTypes.Tr
|
|
|
151
151
|
const fieldType = parseStructTag(fieldObject.type);
|
|
152
152
|
const content = await fieldObject.content;
|
|
153
153
|
|
|
154
|
+
const nameTypeParam = fieldType.typeParams[0];
|
|
155
|
+
const isDynamicObject =
|
|
156
|
+
typeof nameTypeParam !== 'string' &&
|
|
157
|
+
nameTypeParam.module === 'dynamic_object_field' &&
|
|
158
|
+
nameTypeParam.name === 'Wrapper';
|
|
159
|
+
|
|
160
|
+
const valueBcs = content.slice(SUI_ADDRESS_LENGTH + options.name.bcs.length);
|
|
161
|
+
|
|
162
|
+
const valueType =
|
|
163
|
+
typeof fieldType.typeParams[1] === 'string'
|
|
164
|
+
? fieldType.typeParams[1]
|
|
165
|
+
: normalizeStructTag(fieldType.typeParams[1]);
|
|
166
|
+
|
|
154
167
|
return {
|
|
155
168
|
dynamicField: {
|
|
169
|
+
$kind: isDynamicObject ? 'DynamicObject' : 'DynamicField',
|
|
156
170
|
fieldId: fieldObject.objectId,
|
|
157
171
|
digest: fieldObject.digest,
|
|
158
172
|
version: fieldObject.version,
|
|
@@ -160,23 +174,19 @@ export abstract class CoreClient extends BaseClient implements SuiClientTypes.Tr
|
|
|
160
174
|
previousTransaction: fieldObject.previousTransaction,
|
|
161
175
|
name: {
|
|
162
176
|
type:
|
|
163
|
-
typeof
|
|
164
|
-
? fieldType.typeParams[0]
|
|
165
|
-
: normalizeStructTag(fieldType.typeParams[0]),
|
|
177
|
+
typeof nameTypeParam === 'string' ? nameTypeParam : normalizeStructTag(nameTypeParam),
|
|
166
178
|
bcs: options.name.bcs,
|
|
167
179
|
},
|
|
168
180
|
value: {
|
|
169
|
-
type:
|
|
170
|
-
|
|
171
|
-
? fieldType.typeParams[1]
|
|
172
|
-
: normalizeStructTag(fieldType.typeParams[1]),
|
|
173
|
-
bcs: content.slice(SUI_ADDRESS_LENGTH + options.name.bcs.length),
|
|
181
|
+
type: valueType,
|
|
182
|
+
bcs: valueBcs,
|
|
174
183
|
},
|
|
175
|
-
|
|
184
|
+
childId: isDynamicObject ? bcs.Address.parse(valueBcs) : undefined,
|
|
185
|
+
} as SuiClientTypes.GetDynamicFieldResponse['dynamicField'],
|
|
176
186
|
};
|
|
177
187
|
}
|
|
178
188
|
|
|
179
|
-
async getDynamicObjectField<Include extends SuiClientTypes.ObjectInclude =
|
|
189
|
+
async getDynamicObjectField<Include extends SuiClientTypes.ObjectInclude = {}>(
|
|
180
190
|
options: SuiClientTypes.GetDynamicObjectFieldOptions<Include>,
|
|
181
191
|
): Promise<SuiClientTypes.GetDynamicObjectFieldResponse<Include>> {
|
|
182
192
|
const resolvedNameType = (
|
|
@@ -196,7 +206,7 @@ export abstract class CoreClient extends BaseClient implements SuiClientTypes.Tr
|
|
|
196
206
|
});
|
|
197
207
|
|
|
198
208
|
const { object } = await this.getObject({
|
|
199
|
-
objectId:
|
|
209
|
+
objectId: dynamicField.childId!,
|
|
200
210
|
signal: options.signal,
|
|
201
211
|
include: options.include,
|
|
202
212
|
});
|
|
@@ -204,7 +214,7 @@ export abstract class CoreClient extends BaseClient implements SuiClientTypes.Tr
|
|
|
204
214
|
return { object };
|
|
205
215
|
}
|
|
206
216
|
|
|
207
|
-
async waitForTransaction<Include extends SuiClientTypes.TransactionInclude =
|
|
217
|
+
async waitForTransaction<Include extends SuiClientTypes.TransactionInclude = {}>(
|
|
208
218
|
options: SuiClientTypes.WaitForTransactionOptions<Include>,
|
|
209
219
|
): Promise<SuiClientTypes.TransactionResult<Include>> {
|
|
210
220
|
const { signal, timeout = 60 * 1000, include } = options;
|
package/src/client/types.ts
CHANGED
|
@@ -58,9 +58,32 @@ export namespace SuiClientTypes {
|
|
|
58
58
|
}
|
|
59
59
|
|
|
60
60
|
export interface ObjectInclude {
|
|
61
|
+
/**
|
|
62
|
+
* Include the BCS-encoded Move struct content of the object.
|
|
63
|
+
*
|
|
64
|
+
* Returns the raw bytes of the object's Move struct fields — pass directly to
|
|
65
|
+
* generated BCS types (e.g., `MyStruct.parse(object.content)`).
|
|
66
|
+
*/
|
|
61
67
|
content?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Include the digest of the transaction that last mutated this object.
|
|
70
|
+
*/
|
|
62
71
|
previousTransaction?: boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Include the full BCS-encoded object envelope. Rarely needed — most metadata
|
|
74
|
+
* (owner, version, type) is already available as fields on the object response.
|
|
75
|
+
*
|
|
76
|
+
* Parse with `bcs.Object.parse(object.objectBcs)` from `@mysten/sui/bcs`.
|
|
77
|
+
* Do not pass to a Move struct parser — use `content` for that instead.
|
|
78
|
+
*/
|
|
63
79
|
objectBcs?: boolean;
|
|
80
|
+
/**
|
|
81
|
+
* Include the JSON representation of the object's Move struct content.
|
|
82
|
+
*
|
|
83
|
+
* **Warning:** The exact shape and field names of this data may vary between different
|
|
84
|
+
* API implementations (JSON-RPC vs gRPC or GraphQL). For consistent data across APIs,
|
|
85
|
+
* use the `content` field and parse the BCS data directly.
|
|
86
|
+
*/
|
|
64
87
|
json?: boolean;
|
|
65
88
|
}
|
|
66
89
|
|
|
@@ -68,14 +91,14 @@ export namespace SuiClientTypes {
|
|
|
68
91
|
Include extends ObjectInclude = {},
|
|
69
92
|
> extends CoreClientMethodOptions {
|
|
70
93
|
objectIds: string[];
|
|
71
|
-
include?: Include;
|
|
94
|
+
include?: Include & ObjectInclude;
|
|
72
95
|
}
|
|
73
96
|
|
|
74
97
|
export interface GetObjectOptions<
|
|
75
98
|
Include extends ObjectInclude = {},
|
|
76
99
|
> extends CoreClientMethodOptions {
|
|
77
100
|
objectId: string;
|
|
78
|
-
include?: Include;
|
|
101
|
+
include?: Include & ObjectInclude;
|
|
79
102
|
}
|
|
80
103
|
|
|
81
104
|
export interface ListOwnedObjectsOptions<
|
|
@@ -85,7 +108,7 @@ export namespace SuiClientTypes {
|
|
|
85
108
|
limit?: number;
|
|
86
109
|
cursor?: string | null;
|
|
87
110
|
type?: string;
|
|
88
|
-
include?: Include;
|
|
111
|
+
include?: Include & ObjectInclude;
|
|
89
112
|
}
|
|
90
113
|
|
|
91
114
|
export interface ListCoinsOptions extends CoreClientMethodOptions {
|
|
@@ -133,8 +156,10 @@ export namespace SuiClientTypes {
|
|
|
133
156
|
digest: string;
|
|
134
157
|
owner: ObjectOwner;
|
|
135
158
|
type: string;
|
|
159
|
+
/** BCS-encoded Move struct content — pass to generated BCS type parsers. */
|
|
136
160
|
content: Include extends { content: true } ? Uint8Array<ArrayBuffer> : undefined;
|
|
137
161
|
previousTransaction: Include extends { previousTransaction: true } ? string | null : undefined;
|
|
162
|
+
/** Full BCS-encoded object envelope — parse with `bcs.Object` not a struct parser. */
|
|
138
163
|
objectBcs: Include extends { objectBcs: true } ? Uint8Array<ArrayBuffer> : undefined;
|
|
139
164
|
/**
|
|
140
165
|
* The JSON representation of the object's Move struct content.
|
|
@@ -162,6 +187,13 @@ export namespace SuiClientTypes {
|
|
|
162
187
|
valueType: string;
|
|
163
188
|
} & ({ $kind: 'DynamicField'; childId?: never } | { $kind: 'DynamicObject'; childId: string });
|
|
164
189
|
|
|
190
|
+
export type DynamicField = DynamicFieldEntry & {
|
|
191
|
+
value: DynamicFieldValue;
|
|
192
|
+
version: string;
|
|
193
|
+
digest: string;
|
|
194
|
+
previousTransaction: string | null;
|
|
195
|
+
};
|
|
196
|
+
|
|
165
197
|
export interface ListDynamicFieldsResponse {
|
|
166
198
|
hasNextPage: boolean;
|
|
167
199
|
cursor: string | null;
|
|
@@ -169,15 +201,7 @@ export namespace SuiClientTypes {
|
|
|
169
201
|
}
|
|
170
202
|
|
|
171
203
|
export interface GetDynamicFieldResponse {
|
|
172
|
-
dynamicField:
|
|
173
|
-
name: DynamicFieldName;
|
|
174
|
-
value: DynamicFieldValue;
|
|
175
|
-
fieldId: string;
|
|
176
|
-
version: string;
|
|
177
|
-
digest: string;
|
|
178
|
-
type: string;
|
|
179
|
-
previousTransaction: string | null;
|
|
180
|
-
};
|
|
204
|
+
dynamicField: DynamicField;
|
|
181
205
|
}
|
|
182
206
|
|
|
183
207
|
export interface GetDynamicObjectFieldOptions<
|
|
@@ -185,7 +209,7 @@ export namespace SuiClientTypes {
|
|
|
185
209
|
> extends CoreClientMethodOptions {
|
|
186
210
|
parentId: string;
|
|
187
211
|
name: DynamicFieldName;
|
|
188
|
-
include?: Include;
|
|
212
|
+
include?: Include & ObjectInclude;
|
|
189
213
|
}
|
|
190
214
|
|
|
191
215
|
export interface GetDynamicObjectFieldResponse<out Include extends ObjectInclude = {}> {
|
|
@@ -313,15 +337,22 @@ export namespace SuiClientTypes {
|
|
|
313
337
|
};
|
|
314
338
|
|
|
315
339
|
export interface TransactionInclude {
|
|
340
|
+
/** Include balance changes caused by the transaction. */
|
|
316
341
|
balanceChanges?: boolean;
|
|
342
|
+
/** Include parsed transaction effects (gas used, changed objects, status, etc.). */
|
|
317
343
|
effects?: boolean;
|
|
344
|
+
/** Include events emitted by the transaction. */
|
|
318
345
|
events?: boolean;
|
|
346
|
+
/** Include a map of object IDs to their types for all changed objects. */
|
|
319
347
|
objectTypes?: boolean;
|
|
348
|
+
/** Include the parsed transaction data (sender, gas config, inputs, commands). */
|
|
320
349
|
transaction?: boolean;
|
|
350
|
+
/** Include the raw BCS-encoded transaction bytes. */
|
|
321
351
|
bcs?: boolean;
|
|
322
352
|
}
|
|
323
353
|
|
|
324
354
|
export interface SimulateTransactionInclude extends TransactionInclude {
|
|
355
|
+
/** Include return values and mutated references from each command (simulation only). */
|
|
325
356
|
commandResults?: boolean;
|
|
326
357
|
}
|
|
327
358
|
|
|
@@ -346,7 +377,7 @@ export namespace SuiClientTypes {
|
|
|
346
377
|
Include extends TransactionInclude = {},
|
|
347
378
|
> extends CoreClientMethodOptions {
|
|
348
379
|
digest: string;
|
|
349
|
-
include?: Include;
|
|
380
|
+
include?: Include & TransactionInclude;
|
|
350
381
|
}
|
|
351
382
|
|
|
352
383
|
export type WaitForTransactionOptions<Include extends TransactionInclude = {}> =
|
|
@@ -364,7 +395,7 @@ export namespace SuiClientTypes {
|
|
|
364
395
|
Include extends TransactionInclude = {},
|
|
365
396
|
> extends CoreClientMethodOptions {
|
|
366
397
|
result: TransactionResult<any>;
|
|
367
|
-
include?: Include;
|
|
398
|
+
include?: Include & TransactionInclude;
|
|
368
399
|
timeout?: number;
|
|
369
400
|
digest?: never;
|
|
370
401
|
}
|
|
@@ -374,7 +405,7 @@ export namespace SuiClientTypes {
|
|
|
374
405
|
> extends CoreClientMethodOptions {
|
|
375
406
|
transaction: Uint8Array;
|
|
376
407
|
signatures: string[];
|
|
377
|
-
include?: Include;
|
|
408
|
+
include?: Include & TransactionInclude;
|
|
378
409
|
}
|
|
379
410
|
|
|
380
411
|
export interface SignAndExecuteTransactionOptions<
|
|
@@ -383,14 +414,14 @@ export namespace SuiClientTypes {
|
|
|
383
414
|
transaction: Uint8Array | TransactionInstance;
|
|
384
415
|
signer: Signer;
|
|
385
416
|
additionalSignatures?: string[];
|
|
386
|
-
include?: Include;
|
|
417
|
+
include?: Include & TransactionInclude;
|
|
387
418
|
}
|
|
388
419
|
|
|
389
420
|
export interface SimulateTransactionOptions<
|
|
390
421
|
Include extends SimulateTransactionInclude = {},
|
|
391
422
|
> extends CoreClientMethodOptions {
|
|
392
423
|
transaction: Uint8Array | TransactionInstance;
|
|
393
|
-
include?: Include;
|
|
424
|
+
include?: Include & SimulateTransactionInclude;
|
|
394
425
|
}
|
|
395
426
|
|
|
396
427
|
export interface GetReferenceGasPriceOptions extends CoreClientMethodOptions {}
|
|
@@ -816,6 +847,14 @@ export namespace SuiClientTypes {
|
|
|
816
847
|
sender: string;
|
|
817
848
|
eventType: string;
|
|
818
849
|
bcs: Uint8Array;
|
|
850
|
+
/**
|
|
851
|
+
* The JSON representation of the event's Move struct data.
|
|
852
|
+
*
|
|
853
|
+
* **Warning:** The exact shape and field names of this data may vary between different
|
|
854
|
+
* API implementations (JSON-RPC vs gRPC or GraphQL). For consistent data across APIs use
|
|
855
|
+
* the `bcs` field and parse the BCS data directly.
|
|
856
|
+
*/
|
|
857
|
+
json: Record<string, unknown> | null;
|
|
819
858
|
}
|
|
820
859
|
|
|
821
860
|
export interface MoveAbort {
|
package/src/graphql/client.ts
CHANGED
|
@@ -9,6 +9,10 @@ import { BaseClient } from '../client/index.js';
|
|
|
9
9
|
import type { SuiClientTypes } from '../client/index.js';
|
|
10
10
|
import { GraphQLCoreClient } from './core.js';
|
|
11
11
|
import type { TypedDocumentString } from './generated/queries.js';
|
|
12
|
+
import { GetDynamicFieldsDocument } from './generated/queries.js';
|
|
13
|
+
import { fromBase64 } from '@mysten/utils';
|
|
14
|
+
import { normalizeStructTag } from '../utils/sui-types.js';
|
|
15
|
+
import { deriveDynamicFieldID } from '../utils/dynamic-fields.js';
|
|
12
16
|
import type { TransactionPlugin } from '../transactions/index.js';
|
|
13
17
|
|
|
14
18
|
export type GraphQLDocument<
|
|
@@ -66,6 +70,21 @@ export function isSuiGraphQLClient(client: unknown): client is SuiGraphQLClient
|
|
|
66
70
|
);
|
|
67
71
|
}
|
|
68
72
|
|
|
73
|
+
export interface DynamicFieldInclude {
|
|
74
|
+
value?: boolean;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export type DynamicFieldEntryWithValue<Include extends DynamicFieldInclude = {}> =
|
|
78
|
+
SuiClientTypes.DynamicFieldEntry & {
|
|
79
|
+
value: Include extends { value: true } ? SuiClientTypes.DynamicFieldValue : undefined;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export interface ListDynamicFieldsWithValueResponse<Include extends DynamicFieldInclude = {}> {
|
|
83
|
+
hasNextPage: boolean;
|
|
84
|
+
cursor: string | null;
|
|
85
|
+
dynamicFields: DynamicFieldEntryWithValue<Include>[];
|
|
86
|
+
}
|
|
87
|
+
|
|
69
88
|
export class SuiGraphQLClient<Queries extends Record<string, GraphQLDocument> = {}>
|
|
70
89
|
extends BaseClient
|
|
71
90
|
implements SuiClientTypes.TransportMethods
|
|
@@ -220,10 +239,83 @@ export class SuiGraphQLClient<Queries extends Record<string, GraphQLDocument> =
|
|
|
220
239
|
return this.core.getReferenceGasPrice();
|
|
221
240
|
}
|
|
222
241
|
|
|
223
|
-
listDynamicFields(
|
|
224
|
-
input: SuiClientTypes.ListDynamicFieldsOptions,
|
|
225
|
-
): Promise<
|
|
226
|
-
|
|
242
|
+
async listDynamicFields<Include extends DynamicFieldInclude = {}>(
|
|
243
|
+
input: SuiClientTypes.ListDynamicFieldsOptions & { include?: Include & DynamicFieldInclude },
|
|
244
|
+
): Promise<ListDynamicFieldsWithValueResponse<Include>> {
|
|
245
|
+
const includeValue = input.include?.value ?? false;
|
|
246
|
+
|
|
247
|
+
const { data, errors } = await this.query({
|
|
248
|
+
query: GetDynamicFieldsDocument,
|
|
249
|
+
variables: {
|
|
250
|
+
parentId: input.parentId,
|
|
251
|
+
first: input.limit,
|
|
252
|
+
cursor: input.cursor,
|
|
253
|
+
includeValue,
|
|
254
|
+
},
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
if (errors?.length) {
|
|
258
|
+
throw errors.length === 1
|
|
259
|
+
? new Error(errors[0].message)
|
|
260
|
+
: new AggregateError(errors.map((e) => new Error(e.message)));
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
const result = data?.address?.dynamicFields;
|
|
264
|
+
if (!result) {
|
|
265
|
+
throw new Error('Missing response data');
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return {
|
|
269
|
+
dynamicFields: result.nodes.map((dynamicField): DynamicFieldEntryWithValue<Include> => {
|
|
270
|
+
const valueType =
|
|
271
|
+
dynamicField.value?.__typename === 'MoveObject'
|
|
272
|
+
? dynamicField.value.contents?.type?.repr!
|
|
273
|
+
: dynamicField.value?.type?.repr!;
|
|
274
|
+
const isDynamicObject = dynamicField.value?.__typename === 'MoveObject';
|
|
275
|
+
const derivedNameType = isDynamicObject
|
|
276
|
+
? `0x2::dynamic_object_field::Wrapper<${dynamicField.name?.type?.repr}>`
|
|
277
|
+
: dynamicField.name?.type?.repr!;
|
|
278
|
+
|
|
279
|
+
let value: SuiClientTypes.DynamicFieldValue | undefined;
|
|
280
|
+
if (includeValue) {
|
|
281
|
+
let valueBcs: Uint8Array;
|
|
282
|
+
if (dynamicField.value?.__typename === 'MoveValue') {
|
|
283
|
+
valueBcs = fromBase64(dynamicField.value.bcs ?? '');
|
|
284
|
+
} else if (dynamicField.value?.__typename === 'MoveObject') {
|
|
285
|
+
valueBcs = fromBase64(dynamicField.value.contents?.bcs ?? '');
|
|
286
|
+
} else {
|
|
287
|
+
valueBcs = new Uint8Array();
|
|
288
|
+
}
|
|
289
|
+
value = { type: valueType, bcs: valueBcs };
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
return {
|
|
293
|
+
$kind: isDynamicObject ? 'DynamicObject' : 'DynamicField',
|
|
294
|
+
fieldId: deriveDynamicFieldID(
|
|
295
|
+
input.parentId,
|
|
296
|
+
derivedNameType,
|
|
297
|
+
fromBase64(dynamicField.name?.bcs!),
|
|
298
|
+
),
|
|
299
|
+
type: normalizeStructTag(
|
|
300
|
+
isDynamicObject
|
|
301
|
+
? `0x2::dynamic_field::Field<0x2::dynamic_object_field::Wrapper<${dynamicField.name?.type?.repr}>,0x2::object::ID>`
|
|
302
|
+
: `0x2::dynamic_field::Field<${dynamicField.name?.type?.repr},${valueType}>`,
|
|
303
|
+
),
|
|
304
|
+
name: {
|
|
305
|
+
type: dynamicField.name?.type?.repr!,
|
|
306
|
+
bcs: fromBase64(dynamicField.name?.bcs!),
|
|
307
|
+
},
|
|
308
|
+
valueType,
|
|
309
|
+
childId:
|
|
310
|
+
isDynamicObject && dynamicField.value?.__typename === 'MoveObject'
|
|
311
|
+
? dynamicField.value.address
|
|
312
|
+
: undefined,
|
|
313
|
+
value: (includeValue ? value : undefined) as DynamicFieldEntryWithValue<Include>['value'],
|
|
314
|
+
} as DynamicFieldEntryWithValue<Include>;
|
|
315
|
+
}),
|
|
316
|
+
cursor: result.pageInfo.endCursor ?? null,
|
|
317
|
+
hasNextPage: result.pageInfo.hasNextPage,
|
|
318
|
+
};
|
|
227
319
|
}
|
|
228
320
|
|
|
229
321
|
getDynamicField(
|