@mysten/sui 1.9.0 → 1.11.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.
Files changed (175) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/dist/cjs/bcs/bcs.js +14 -14
  3. package/dist/cjs/bcs/bcs.js.map +2 -2
  4. package/dist/cjs/client/client.js +6 -6
  5. package/dist/cjs/client/client.js.map +2 -2
  6. package/dist/cjs/client/types/generated.d.ts +1 -2
  7. package/dist/cjs/client/types/generated.js.map +1 -1
  8. package/dist/cjs/cryptography/keypair.js +2 -2
  9. package/dist/cjs/cryptography/keypair.js.map +2 -2
  10. package/dist/cjs/cryptography/mnemonics.js +1 -1
  11. package/dist/cjs/cryptography/mnemonics.js.map +1 -1
  12. package/dist/cjs/cryptography/publickey.js +2 -2
  13. package/dist/cjs/cryptography/publickey.js.map +2 -2
  14. package/dist/cjs/cryptography/signature.js +2 -2
  15. package/dist/cjs/cryptography/signature.js.map +2 -2
  16. package/dist/cjs/keypairs/ed25519/ed25519-hd-key.js +1 -1
  17. package/dist/cjs/keypairs/ed25519/ed25519-hd-key.js.map +1 -1
  18. package/dist/cjs/keypairs/ed25519/keypair.d.ts +2 -2
  19. package/dist/cjs/keypairs/ed25519/keypair.js +8 -1
  20. package/dist/cjs/keypairs/ed25519/keypair.js.map +2 -2
  21. package/dist/cjs/keypairs/ed25519/publickey.js +1 -1
  22. package/dist/cjs/keypairs/ed25519/publickey.js.map +2 -2
  23. package/dist/cjs/keypairs/secp256k1/keypair.d.ts +2 -2
  24. package/dist/cjs/keypairs/secp256k1/keypair.js +8 -1
  25. package/dist/cjs/keypairs/secp256k1/keypair.js.map +2 -2
  26. package/dist/cjs/keypairs/secp256k1/publickey.js +1 -1
  27. package/dist/cjs/keypairs/secp256k1/publickey.js.map +2 -2
  28. package/dist/cjs/keypairs/secp256r1/keypair.d.ts +2 -2
  29. package/dist/cjs/keypairs/secp256r1/keypair.js +8 -1
  30. package/dist/cjs/keypairs/secp256r1/keypair.js.map +2 -2
  31. package/dist/cjs/keypairs/secp256r1/publickey.js +1 -1
  32. package/dist/cjs/keypairs/secp256r1/publickey.js.map +2 -2
  33. package/dist/cjs/multisig/publickey.js +2 -2
  34. package/dist/cjs/multisig/publickey.js.map +2 -2
  35. package/dist/cjs/multisig/signer.js +2 -2
  36. package/dist/cjs/multisig/signer.js.map +2 -2
  37. package/dist/cjs/transactions/Commands.js +2 -2
  38. package/dist/cjs/transactions/Commands.js.map +2 -2
  39. package/dist/cjs/transactions/Inputs.js +1 -1
  40. package/dist/cjs/transactions/Inputs.js.map +2 -2
  41. package/dist/cjs/transactions/Transaction.js +2 -2
  42. package/dist/cjs/transactions/Transaction.js.map +2 -2
  43. package/dist/cjs/transactions/TransactionData.js +1 -1
  44. package/dist/cjs/transactions/TransactionData.js.map +2 -2
  45. package/dist/cjs/transactions/data/v1.js +6 -6
  46. package/dist/cjs/transactions/data/v1.js.map +2 -2
  47. package/dist/cjs/transactions/executor/parallel.js +1 -1
  48. package/dist/cjs/transactions/executor/parallel.js.map +2 -2
  49. package/dist/cjs/transactions/executor/serial.js +1 -1
  50. package/dist/cjs/transactions/executor/serial.js.map +2 -2
  51. package/dist/cjs/transactions/plugins/NamedPackagesPlugin.d.ts +3 -3
  52. package/dist/cjs/transactions/plugins/NamedPackagesPlugin.js.map +1 -1
  53. package/dist/cjs/transactions/plugins/utils.js +26 -7
  54. package/dist/cjs/transactions/plugins/utils.js.map +2 -2
  55. package/dist/cjs/utils/index.d.ts +1 -1
  56. package/dist/cjs/utils/index.js +7 -1
  57. package/dist/cjs/utils/index.js.map +2 -2
  58. package/dist/cjs/utils/move-registry.js +12 -3
  59. package/dist/cjs/utils/move-registry.js.map +2 -2
  60. package/dist/cjs/utils/sui-types.js +1 -1
  61. package/dist/cjs/utils/sui-types.js.map +2 -2
  62. package/dist/cjs/verify/verify.js +1 -1
  63. package/dist/cjs/verify/verify.js.map +2 -2
  64. package/dist/cjs/version.d.ts +2 -2
  65. package/dist/cjs/version.js +2 -2
  66. package/dist/cjs/version.js.map +1 -1
  67. package/dist/cjs/zklogin/publickey.js +5 -5
  68. package/dist/cjs/zklogin/publickey.js.map +2 -2
  69. package/dist/cjs/zklogin/signature.js +3 -3
  70. package/dist/cjs/zklogin/signature.js.map +2 -2
  71. package/dist/esm/bcs/bcs.js +15 -15
  72. package/dist/esm/bcs/bcs.js.map +2 -2
  73. package/dist/esm/client/client.js +7 -7
  74. package/dist/esm/client/client.js.map +2 -2
  75. package/dist/esm/client/types/generated.d.ts +1 -2
  76. package/dist/esm/cryptography/keypair.js +3 -3
  77. package/dist/esm/cryptography/keypair.js.map +2 -2
  78. package/dist/esm/cryptography/mnemonics.js +2 -2
  79. package/dist/esm/cryptography/mnemonics.js.map +1 -1
  80. package/dist/esm/cryptography/publickey.js +3 -3
  81. package/dist/esm/cryptography/publickey.js.map +2 -2
  82. package/dist/esm/cryptography/signature.js +3 -3
  83. package/dist/esm/cryptography/signature.js.map +2 -2
  84. package/dist/esm/keypairs/ed25519/ed25519-hd-key.js +2 -2
  85. package/dist/esm/keypairs/ed25519/ed25519-hd-key.js.map +1 -1
  86. package/dist/esm/keypairs/ed25519/keypair.d.ts +2 -2
  87. package/dist/esm/keypairs/ed25519/keypair.js +14 -2
  88. package/dist/esm/keypairs/ed25519/keypair.js.map +2 -2
  89. package/dist/esm/keypairs/ed25519/publickey.js +2 -2
  90. package/dist/esm/keypairs/ed25519/publickey.js.map +2 -2
  91. package/dist/esm/keypairs/secp256k1/keypair.d.ts +2 -2
  92. package/dist/esm/keypairs/secp256k1/keypair.js +9 -2
  93. package/dist/esm/keypairs/secp256k1/keypair.js.map +2 -2
  94. package/dist/esm/keypairs/secp256k1/publickey.js +2 -2
  95. package/dist/esm/keypairs/secp256k1/publickey.js.map +2 -2
  96. package/dist/esm/keypairs/secp256r1/keypair.d.ts +2 -2
  97. package/dist/esm/keypairs/secp256r1/keypair.js +9 -2
  98. package/dist/esm/keypairs/secp256r1/keypair.js.map +2 -2
  99. package/dist/esm/keypairs/secp256r1/publickey.js +2 -2
  100. package/dist/esm/keypairs/secp256r1/publickey.js.map +2 -2
  101. package/dist/esm/multisig/publickey.js +3 -3
  102. package/dist/esm/multisig/publickey.js.map +2 -2
  103. package/dist/esm/multisig/signer.js +3 -3
  104. package/dist/esm/multisig/signer.js.map +2 -2
  105. package/dist/esm/transactions/Commands.js +3 -3
  106. package/dist/esm/transactions/Commands.js.map +2 -2
  107. package/dist/esm/transactions/Inputs.js +2 -2
  108. package/dist/esm/transactions/Inputs.js.map +2 -2
  109. package/dist/esm/transactions/Transaction.js +3 -3
  110. package/dist/esm/transactions/Transaction.js.map +2 -2
  111. package/dist/esm/transactions/TransactionData.js +2 -2
  112. package/dist/esm/transactions/TransactionData.js.map +2 -2
  113. package/dist/esm/transactions/data/v1.js +7 -7
  114. package/dist/esm/transactions/data/v1.js.map +2 -2
  115. package/dist/esm/transactions/executor/parallel.js +2 -2
  116. package/dist/esm/transactions/executor/parallel.js.map +2 -2
  117. package/dist/esm/transactions/executor/serial.js +2 -2
  118. package/dist/esm/transactions/executor/serial.js.map +2 -2
  119. package/dist/esm/transactions/plugins/NamedPackagesPlugin.d.ts +3 -3
  120. package/dist/esm/transactions/plugins/NamedPackagesPlugin.js.map +1 -1
  121. package/dist/esm/transactions/plugins/utils.js +26 -7
  122. package/dist/esm/transactions/plugins/utils.js.map +2 -2
  123. package/dist/esm/utils/index.d.ts +1 -1
  124. package/dist/esm/utils/index.js +19 -2
  125. package/dist/esm/utils/index.js.map +2 -2
  126. package/dist/esm/utils/move-registry.js +12 -3
  127. package/dist/esm/utils/move-registry.js.map +2 -2
  128. package/dist/esm/utils/sui-types.js +2 -2
  129. package/dist/esm/utils/sui-types.js.map +2 -2
  130. package/dist/esm/verify/verify.js +2 -2
  131. package/dist/esm/verify/verify.js.map +2 -2
  132. package/dist/esm/version.d.ts +2 -2
  133. package/dist/esm/version.js +2 -2
  134. package/dist/esm/version.js.map +1 -1
  135. package/dist/esm/zklogin/publickey.js +6 -6
  136. package/dist/esm/zklogin/publickey.js.map +2 -2
  137. package/dist/esm/zklogin/signature.js +4 -4
  138. package/dist/esm/zklogin/signature.js.map +2 -2
  139. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  140. package/dist/tsconfig.tsbuildinfo +1 -1
  141. package/package.json +3 -3
  142. package/src/bcs/bcs.ts +15 -15
  143. package/src/client/client.ts +7 -7
  144. package/src/client/types/generated.ts +1 -2
  145. package/src/cryptography/keypair.ts +3 -3
  146. package/src/cryptography/mnemonics.ts +2 -2
  147. package/src/cryptography/publickey.ts +3 -3
  148. package/src/cryptography/signature.ts +3 -3
  149. package/src/keypairs/ed25519/ed25519-hd-key.ts +2 -2
  150. package/src/keypairs/ed25519/keypair.ts +18 -3
  151. package/src/keypairs/ed25519/publickey.ts +2 -2
  152. package/src/keypairs/secp256k1/keypair.ts +13 -3
  153. package/src/keypairs/secp256k1/publickey.ts +2 -2
  154. package/src/keypairs/secp256r1/keypair.ts +13 -3
  155. package/src/keypairs/secp256r1/publickey.ts +2 -2
  156. package/src/multisig/publickey.ts +3 -3
  157. package/src/multisig/signer.ts +3 -3
  158. package/src/transactions/Commands.ts +3 -3
  159. package/src/transactions/Inputs.ts +2 -2
  160. package/src/transactions/Transaction.ts +3 -3
  161. package/src/transactions/TransactionData.ts +2 -2
  162. package/src/transactions/__tests__/Transaction.test.ts +2 -2
  163. package/src/transactions/__tests__/bcs.test.ts +2 -2
  164. package/src/transactions/data/v1.ts +7 -7
  165. package/src/transactions/executor/parallel.ts +2 -2
  166. package/src/transactions/executor/serial.ts +2 -2
  167. package/src/transactions/plugins/NamedPackagesPlugin.ts +3 -3
  168. package/src/transactions/plugins/utils.ts +33 -7
  169. package/src/utils/index.ts +12 -1
  170. package/src/utils/move-registry.ts +24 -5
  171. package/src/utils/sui-types.ts +2 -2
  172. package/src/verify/verify.ts +2 -2
  173. package/src/version.ts +2 -2
  174. package/src/zklogin/publickey.ts +6 -6
  175. package/src/zklogin/signature.ts +5 -4
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/transactions/executor/parallel.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { toB64 } from '@mysten/bcs';\n\nimport { bcs } from '../../bcs/index.js';\nimport type { SuiObjectRef } from '../../bcs/types.js';\nimport type {\n\tSuiClient,\n\tSuiTransactionBlockResponse,\n\tSuiTransactionBlockResponseOptions,\n} from '../../client/index.js';\nimport type { Signer } from '../../cryptography/index.js';\nimport type { ObjectCacheOptions } from '../ObjectCache.js';\nimport { Transaction } from '../Transaction.js';\nimport { TransactionDataBuilder } from '../TransactionData.js';\nimport { CachingTransactionExecutor } from './caching.js';\nimport { ParallelQueue, SerialQueue } from './queue.js';\nimport { getGasCoinFromEffects } from './serial.js';\n\nconst PARALLEL_EXECUTOR_DEFAULTS = {\n\tcoinBatchSize: 20,\n\tinitialCoinBalance: 200_000_000n,\n\tminimumCoinBalance: 50_000_000n,\n\tmaxPoolSize: 50,\n\tepochBoundaryWindow: 1_000,\n} satisfies Omit<ParallelTransactionExecutorOptions, 'signer' | 'client'>;\nexport interface ParallelTransactionExecutorOptions extends Omit<ObjectCacheOptions, 'address'> {\n\tclient: SuiClient;\n\tsigner: Signer;\n\t/** The number of coins to create in a batch when refilling the gas pool */\n\tcoinBatchSize?: number;\n\t/** The initial balance of each coin created for the gas pool */\n\tinitialCoinBalance?: bigint;\n\t/** The minimum balance of a coin that can be reused for future transactions. If the gasCoin is below this value, it will be used when refilling the gasPool */\n\tminimumCoinBalance?: bigint;\n\t/** The gasBudget to use if the transaction has not defined it's own gasBudget, defaults to `minimumCoinBalance` */\n\tdefaultGasBudget?: bigint;\n\t/**\n\t * Time to wait before/after the expected epoch boundary before re-fetching the gas pool (in milliseconds).\n\t * Building transactions will be paused for up to 2x this duration around each epoch boundary to ensure the\n\t * gas price is up-to-date for the next epoch.\n\t * */\n\tepochBoundaryWindow?: number;\n\t/** The maximum number of transactions that can be execute in parallel, this also determines the maximum number of gas coins that will be created */\n\tmaxPoolSize?: number;\n\t/** An initial list of coins used to fund the gas pool, uses all owned SUI coins by default */\n\tsourceCoins?: string[];\n}\n\ninterface CoinWithBalance {\n\tid: string;\n\tversion: string;\n\tdigest: string;\n\tbalance: bigint;\n}\nexport class ParallelTransactionExecutor {\n\t#signer: Signer;\n\t#client: SuiClient;\n\t#coinBatchSize: number;\n\t#initialCoinBalance: bigint;\n\t#minimumCoinBalance: bigint;\n\t#epochBoundaryWindow: number;\n\t#defaultGasBudget: bigint;\n\t#maxPoolSize: number;\n\t#sourceCoins: Map<string, SuiObjectRef | null> | null;\n\t#coinPool: CoinWithBalance[] = [];\n\t#cache: CachingTransactionExecutor;\n\t#objectIdQueues = new Map<string, (() => void)[]>();\n\t#buildQueue = new SerialQueue();\n\t#executeQueue: ParallelQueue;\n\t#lastDigest: string | null = null;\n\t#cacheLock: Promise<void> | null = null;\n\t#pendingTransactions = 0;\n\t#gasPrice: null | {\n\t\tprice: bigint;\n\t\texpiration: number;\n\t} = null;\n\n\tconstructor(options: ParallelTransactionExecutorOptions) {\n\t\tthis.#signer = options.signer;\n\t\tthis.#client = options.client;\n\t\tthis.#coinBatchSize = options.coinBatchSize ?? PARALLEL_EXECUTOR_DEFAULTS.coinBatchSize;\n\t\tthis.#initialCoinBalance =\n\t\t\toptions.initialCoinBalance ?? PARALLEL_EXECUTOR_DEFAULTS.initialCoinBalance;\n\t\tthis.#minimumCoinBalance =\n\t\t\toptions.minimumCoinBalance ?? PARALLEL_EXECUTOR_DEFAULTS.minimumCoinBalance;\n\t\tthis.#defaultGasBudget = options.defaultGasBudget ?? this.#minimumCoinBalance;\n\t\tthis.#epochBoundaryWindow =\n\t\t\toptions.epochBoundaryWindow ?? PARALLEL_EXECUTOR_DEFAULTS.epochBoundaryWindow;\n\t\tthis.#maxPoolSize = options.maxPoolSize ?? PARALLEL_EXECUTOR_DEFAULTS.maxPoolSize;\n\t\tthis.#cache = new CachingTransactionExecutor({\n\t\t\tclient: options.client,\n\t\t\tcache: options.cache,\n\t\t});\n\t\tthis.#executeQueue = new ParallelQueue(this.#maxPoolSize);\n\t\tthis.#sourceCoins = options.sourceCoins\n\t\t\t? new Map(options.sourceCoins.map((id) => [id, null]))\n\t\t\t: null;\n\t}\n\n\tresetCache() {\n\t\tthis.#gasPrice = null;\n\t\treturn this.#updateCache(() => this.#cache.reset());\n\t}\n\n\tasync waitForLastTransaction() {\n\t\tawait this.#updateCache(() => this.#waitForLastDigest());\n\t}\n\n\tasync executeTransaction(transaction: Transaction, options?: SuiTransactionBlockResponseOptions) {\n\t\tconst { promise, resolve, reject } = promiseWithResolvers<{\n\t\t\tdigest: string;\n\t\t\teffects: string;\n\t\t\tdata: SuiTransactionBlockResponse;\n\t\t}>();\n\t\tconst usedObjects = await this.#getUsedObjects(transaction);\n\n\t\tconst execute = () => {\n\t\t\tthis.#executeQueue.runTask(() => {\n\t\t\t\tconst promise = this.#execute(transaction, usedObjects, options);\n\n\t\t\t\treturn promise.then(resolve, reject);\n\t\t\t});\n\t\t};\n\n\t\tconst conflicts = new Set<string>();\n\n\t\tusedObjects.forEach((objectId) => {\n\t\t\tconst queue = this.#objectIdQueues.get(objectId);\n\t\t\tif (queue) {\n\t\t\t\tconflicts.add(objectId);\n\t\t\t\tthis.#objectIdQueues.get(objectId)!.push(() => {\n\t\t\t\t\tconflicts.delete(objectId);\n\t\t\t\t\tif (conflicts.size === 0) {\n\t\t\t\t\t\texecute();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.#objectIdQueues.set(objectId, []);\n\t\t\t}\n\t\t});\n\n\t\tif (conflicts.size === 0) {\n\t\t\texecute();\n\t\t}\n\n\t\treturn promise;\n\t}\n\n\tasync #getUsedObjects(transaction: Transaction) {\n\t\tconst usedObjects = new Set<string>();\n\t\tlet serialized = false;\n\n\t\ttransaction.addSerializationPlugin(async (blockData, _options, next) => {\n\t\t\tawait next();\n\n\t\t\tif (serialized) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tserialized = true;\n\n\t\t\tblockData.inputs.forEach((input) => {\n\t\t\t\tif (input.Object?.ImmOrOwnedObject?.objectId) {\n\t\t\t\t\tusedObjects.add(input.Object.ImmOrOwnedObject.objectId);\n\t\t\t\t} else if (input.Object?.Receiving?.objectId) {\n\t\t\t\t\tusedObjects.add(input.Object.Receiving.objectId);\n\t\t\t\t} else if (\n\t\t\t\t\tinput.UnresolvedObject?.objectId &&\n\t\t\t\t\t!input.UnresolvedObject.initialSharedVersion\n\t\t\t\t) {\n\t\t\t\t\tusedObjects.add(input.UnresolvedObject.objectId);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tawait transaction.prepareForSerialization({ client: this.#client });\n\n\t\treturn usedObjects;\n\t}\n\n\tasync #execute(\n\t\ttransaction: Transaction,\n\t\tusedObjects: Set<string>,\n\t\toptions?: SuiTransactionBlockResponseOptions,\n\t) {\n\t\tlet gasCoin!: CoinWithBalance;\n\t\ttry {\n\t\t\ttransaction.setSenderIfNotSet(this.#signer.toSuiAddress());\n\n\t\t\tawait this.#buildQueue.runTask(async () => {\n\t\t\t\tconst data = transaction.getData();\n\n\t\t\t\tif (!data.gasData.price) {\n\t\t\t\t\ttransaction.setGasPrice(await this.#getGasPrice());\n\t\t\t\t}\n\n\t\t\t\ttransaction.setGasBudgetIfNotSet(this.#defaultGasBudget);\n\n\t\t\t\tawait this.#updateCache();\n\t\t\t\tgasCoin = await this.#getGasCoin();\n\t\t\t\tthis.#pendingTransactions++;\n\t\t\t\ttransaction.setGasPayment([\n\t\t\t\t\t{\n\t\t\t\t\t\tobjectId: gasCoin.id,\n\t\t\t\t\t\tversion: gasCoin.version,\n\t\t\t\t\t\tdigest: gasCoin.digest,\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\t// Resolve cached references\n\t\t\t\tawait this.#cache.buildTransaction({ transaction, onlyTransactionKind: true });\n\t\t\t});\n\n\t\t\tconst bytes = await transaction.build({ client: this.#client });\n\n\t\t\tconst { signature } = await this.#signer.signTransaction(bytes);\n\n\t\t\tconst results = await this.#cache.executeTransaction({\n\t\t\t\ttransaction: bytes,\n\t\t\t\tsignature,\n\t\t\t\toptions: {\n\t\t\t\t\t...options,\n\t\t\t\t\tshowEffects: true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst effectsBytes = Uint8Array.from(results.rawEffects!);\n\t\t\tconst effects = bcs.TransactionEffects.parse(effectsBytes);\n\n\t\t\tconst gasResult = getGasCoinFromEffects(effects);\n\t\t\tconst gasUsed = effects.V2?.gasUsed;\n\n\t\t\tif (gasCoin && gasUsed && gasResult.owner === this.#signer.toSuiAddress()) {\n\t\t\t\tconst totalUsed =\n\t\t\t\t\tBigInt(gasUsed.computationCost) +\n\t\t\t\t\tBigInt(gasUsed.storageCost) +\n\t\t\t\t\tBigInt(gasUsed.storageCost) -\n\t\t\t\t\tBigInt(gasUsed.storageRebate);\n\n\t\t\t\tlet usesGasCoin = false;\n\t\t\t\tnew TransactionDataBuilder(transaction.getData()).mapArguments((arg) => {\n\t\t\t\t\tif (arg.$kind === 'GasCoin') {\n\t\t\t\t\t\tusesGasCoin = true;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn arg;\n\t\t\t\t});\n\n\t\t\t\tif (!usesGasCoin && gasCoin.balance >= this.#minimumCoinBalance) {\n\t\t\t\t\tthis.#coinPool.push({\n\t\t\t\t\t\tid: gasResult.ref.objectId,\n\t\t\t\t\t\tversion: gasResult.ref.version,\n\t\t\t\t\t\tdigest: gasResult.ref.digest,\n\t\t\t\t\t\tbalance: gasCoin.balance - totalUsed,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.#sourceCoins) {\n\t\t\t\t\t\tthis.#sourceCoins = new Map();\n\t\t\t\t\t}\n\t\t\t\t\tthis.#sourceCoins.set(gasResult.ref.objectId, gasResult.ref);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.#lastDigest = results.digest;\n\n\t\t\treturn {\n\t\t\t\tdigest: results.digest,\n\t\t\t\teffects: toB64(effectsBytes),\n\t\t\t\tdata: results,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (gasCoin) {\n\t\t\t\tif (!this.#sourceCoins) {\n\t\t\t\t\tthis.#sourceCoins = new Map();\n\t\t\t\t}\n\n\t\t\t\tthis.#sourceCoins.set(gasCoin.id, null);\n\t\t\t}\n\n\t\t\tawait this.#updateCache(async () => {\n\t\t\t\tawait Promise.all([\n\t\t\t\t\tthis.#cache.cache.deleteObjects([...usedObjects]),\n\t\t\t\t\tthis.#waitForLastDigest(),\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tusedObjects.forEach((objectId) => {\n\t\t\t\tconst queue = this.#objectIdQueues.get(objectId);\n\t\t\t\tif (queue && queue.length > 0) {\n\t\t\t\t\tqueue.shift()!();\n\t\t\t\t} else if (queue) {\n\t\t\t\t\tthis.#objectIdQueues.delete(objectId);\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.#pendingTransactions--;\n\t\t}\n\t}\n\n\t/** Helper for synchronizing cache updates, by ensuring only one update happens at a time. This can also be used to wait for any pending cache updates */\n\tasync #updateCache(fn?: () => Promise<void>) {\n\t\tif (this.#cacheLock) {\n\t\t\tawait this.#cacheLock;\n\t\t}\n\n\t\tthis.#cacheLock =\n\t\t\tfn?.().then(\n\t\t\t\t() => {\n\t\t\t\t\tthis.#cacheLock = null;\n\t\t\t\t},\n\t\t\t\t() => {},\n\t\t\t) ?? null;\n\t}\n\n\tasync #waitForLastDigest() {\n\t\tconst digest = this.#lastDigest;\n\t\tif (digest) {\n\t\t\tthis.#lastDigest = null;\n\t\t\tawait this.#client.waitForTransaction({ digest });\n\t\t}\n\t}\n\n\tasync #getGasCoin() {\n\t\tif (this.#coinPool.length === 0 && this.#pendingTransactions <= this.#maxPoolSize) {\n\t\t\tawait this.#refillCoinPool();\n\t\t}\n\n\t\tif (this.#coinPool.length === 0) {\n\t\t\tthrow new Error('No coins available');\n\t\t}\n\n\t\tconst coin = this.#coinPool.shift()!;\n\t\treturn coin;\n\t}\n\n\tasync #getGasPrice(): Promise<bigint> {\n\t\tconst remaining = this.#gasPrice\n\t\t\t? this.#gasPrice.expiration - this.#epochBoundaryWindow - Date.now()\n\t\t\t: 0;\n\n\t\tif (remaining > 0) {\n\t\t\treturn this.#gasPrice!.price;\n\t\t}\n\n\t\tif (this.#gasPrice) {\n\t\t\tconst timeToNextEpoch = Math.max(\n\t\t\t\tthis.#gasPrice.expiration + this.#epochBoundaryWindow - Date.now(),\n\t\t\t\t1_000,\n\t\t\t);\n\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, timeToNextEpoch));\n\t\t}\n\n\t\tconst state = await this.#client.getLatestSuiSystemState();\n\n\t\tthis.#gasPrice = {\n\t\t\tprice: BigInt(state.referenceGasPrice),\n\t\t\texpiration:\n\t\t\t\tNumber.parseInt(state.epochStartTimestampMs, 10) +\n\t\t\t\tNumber.parseInt(state.epochDurationMs, 10),\n\t\t};\n\n\t\treturn this.#getGasPrice();\n\t}\n\n\tasync #refillCoinPool() {\n\t\tconst batchSize = Math.min(\n\t\t\tthis.#coinBatchSize,\n\t\t\tthis.#maxPoolSize - (this.#coinPool.length + this.#pendingTransactions) + 1,\n\t\t);\n\n\t\tif (batchSize === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst txb = new Transaction();\n\t\tconst address = this.#signer.toSuiAddress();\n\t\ttxb.setSender(address);\n\n\t\tif (this.#sourceCoins) {\n\t\t\tconst refs = [];\n\t\t\tconst ids = [];\n\t\t\tfor (const [id, ref] of this.#sourceCoins) {\n\t\t\t\tif (ref) {\n\t\t\t\t\trefs.push(ref);\n\t\t\t\t} else {\n\t\t\t\t\tids.push(id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ids.length > 0) {\n\t\t\t\tconst coins = await this.#client.multiGetObjects({\n\t\t\t\t\tids,\n\t\t\t\t});\n\t\t\t\trefs.push(\n\t\t\t\t\t...coins\n\t\t\t\t\t\t.filter((coin): coin is typeof coin & { data: object } => coin.data !== null)\n\t\t\t\t\t\t.map(({ data }) => ({\n\t\t\t\t\t\t\tobjectId: data.objectId,\n\t\t\t\t\t\t\tversion: data.version,\n\t\t\t\t\t\t\tdigest: data.digest,\n\t\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\ttxb.setGasPayment(refs);\n\t\t\tthis.#sourceCoins = new Map();\n\t\t}\n\n\t\tconst amounts = new Array(batchSize).fill(this.#initialCoinBalance);\n\t\tconst results = txb.splitCoins(txb.gas, amounts);\n\t\tconst coinResults = [];\n\t\tfor (let i = 0; i < amounts.length; i++) {\n\t\t\tcoinResults.push(results[i]);\n\t\t}\n\t\ttxb.transferObjects(coinResults, address);\n\n\t\tawait this.waitForLastTransaction();\n\n\t\tconst result = await this.#client.signAndExecuteTransaction({\n\t\t\ttransaction: txb,\n\t\t\tsigner: this.#signer,\n\t\t\toptions: {\n\t\t\t\tshowRawEffects: true,\n\t\t\t},\n\t\t});\n\n\t\tconst effects = bcs.TransactionEffects.parse(Uint8Array.from(result.rawEffects!));\n\t\teffects.V2?.changedObjects.forEach(([id, { outputState }], i) => {\n\t\t\tif (i === effects.V2?.gasObjectIndex || !outputState.ObjectWrite) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.#coinPool.push({\n\t\t\t\tid,\n\t\t\t\tversion: effects.V2!.lamportVersion,\n\t\t\t\tdigest: outputState.ObjectWrite[0],\n\t\t\t\tbalance: BigInt(this.#initialCoinBalance),\n\t\t\t});\n\t\t});\n\n\t\tif (!this.#sourceCoins) {\n\t\t\tthis.#sourceCoins = new Map();\n\t\t}\n\n\t\tconst gasObject = getGasCoinFromEffects(effects).ref;\n\t\tthis.#sourceCoins!.set(gasObject.objectId, gasObject);\n\n\t\tawait this.#client.waitForTransaction({ digest: result.digest });\n\t}\n}\n\nfunction promiseWithResolvers<T>() {\n\tlet resolve: (value: T) => void;\n\tlet reject: (reason: any) => void;\n\n\tconst promise = new Promise<T>((_resolve, _reject) => {\n\t\tresolve = _resolve;\n\t\treject = _reject;\n\t});\n\n\treturn { promise, resolve: resolve!, reject: reject! };\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { toBase64 } from '@mysten/bcs';\n\nimport { bcs } from '../../bcs/index.js';\nimport type { SuiObjectRef } from '../../bcs/types.js';\nimport type {\n\tSuiClient,\n\tSuiTransactionBlockResponse,\n\tSuiTransactionBlockResponseOptions,\n} from '../../client/index.js';\nimport type { Signer } from '../../cryptography/index.js';\nimport type { ObjectCacheOptions } from '../ObjectCache.js';\nimport { Transaction } from '../Transaction.js';\nimport { TransactionDataBuilder } from '../TransactionData.js';\nimport { CachingTransactionExecutor } from './caching.js';\nimport { ParallelQueue, SerialQueue } from './queue.js';\nimport { getGasCoinFromEffects } from './serial.js';\n\nconst PARALLEL_EXECUTOR_DEFAULTS = {\n\tcoinBatchSize: 20,\n\tinitialCoinBalance: 200_000_000n,\n\tminimumCoinBalance: 50_000_000n,\n\tmaxPoolSize: 50,\n\tepochBoundaryWindow: 1_000,\n} satisfies Omit<ParallelTransactionExecutorOptions, 'signer' | 'client'>;\nexport interface ParallelTransactionExecutorOptions extends Omit<ObjectCacheOptions, 'address'> {\n\tclient: SuiClient;\n\tsigner: Signer;\n\t/** The number of coins to create in a batch when refilling the gas pool */\n\tcoinBatchSize?: number;\n\t/** The initial balance of each coin created for the gas pool */\n\tinitialCoinBalance?: bigint;\n\t/** The minimum balance of a coin that can be reused for future transactions. If the gasCoin is below this value, it will be used when refilling the gasPool */\n\tminimumCoinBalance?: bigint;\n\t/** The gasBudget to use if the transaction has not defined it's own gasBudget, defaults to `minimumCoinBalance` */\n\tdefaultGasBudget?: bigint;\n\t/**\n\t * Time to wait before/after the expected epoch boundary before re-fetching the gas pool (in milliseconds).\n\t * Building transactions will be paused for up to 2x this duration around each epoch boundary to ensure the\n\t * gas price is up-to-date for the next epoch.\n\t * */\n\tepochBoundaryWindow?: number;\n\t/** The maximum number of transactions that can be execute in parallel, this also determines the maximum number of gas coins that will be created */\n\tmaxPoolSize?: number;\n\t/** An initial list of coins used to fund the gas pool, uses all owned SUI coins by default */\n\tsourceCoins?: string[];\n}\n\ninterface CoinWithBalance {\n\tid: string;\n\tversion: string;\n\tdigest: string;\n\tbalance: bigint;\n}\nexport class ParallelTransactionExecutor {\n\t#signer: Signer;\n\t#client: SuiClient;\n\t#coinBatchSize: number;\n\t#initialCoinBalance: bigint;\n\t#minimumCoinBalance: bigint;\n\t#epochBoundaryWindow: number;\n\t#defaultGasBudget: bigint;\n\t#maxPoolSize: number;\n\t#sourceCoins: Map<string, SuiObjectRef | null> | null;\n\t#coinPool: CoinWithBalance[] = [];\n\t#cache: CachingTransactionExecutor;\n\t#objectIdQueues = new Map<string, (() => void)[]>();\n\t#buildQueue = new SerialQueue();\n\t#executeQueue: ParallelQueue;\n\t#lastDigest: string | null = null;\n\t#cacheLock: Promise<void> | null = null;\n\t#pendingTransactions = 0;\n\t#gasPrice: null | {\n\t\tprice: bigint;\n\t\texpiration: number;\n\t} = null;\n\n\tconstructor(options: ParallelTransactionExecutorOptions) {\n\t\tthis.#signer = options.signer;\n\t\tthis.#client = options.client;\n\t\tthis.#coinBatchSize = options.coinBatchSize ?? PARALLEL_EXECUTOR_DEFAULTS.coinBatchSize;\n\t\tthis.#initialCoinBalance =\n\t\t\toptions.initialCoinBalance ?? PARALLEL_EXECUTOR_DEFAULTS.initialCoinBalance;\n\t\tthis.#minimumCoinBalance =\n\t\t\toptions.minimumCoinBalance ?? PARALLEL_EXECUTOR_DEFAULTS.minimumCoinBalance;\n\t\tthis.#defaultGasBudget = options.defaultGasBudget ?? this.#minimumCoinBalance;\n\t\tthis.#epochBoundaryWindow =\n\t\t\toptions.epochBoundaryWindow ?? PARALLEL_EXECUTOR_DEFAULTS.epochBoundaryWindow;\n\t\tthis.#maxPoolSize = options.maxPoolSize ?? PARALLEL_EXECUTOR_DEFAULTS.maxPoolSize;\n\t\tthis.#cache = new CachingTransactionExecutor({\n\t\t\tclient: options.client,\n\t\t\tcache: options.cache,\n\t\t});\n\t\tthis.#executeQueue = new ParallelQueue(this.#maxPoolSize);\n\t\tthis.#sourceCoins = options.sourceCoins\n\t\t\t? new Map(options.sourceCoins.map((id) => [id, null]))\n\t\t\t: null;\n\t}\n\n\tresetCache() {\n\t\tthis.#gasPrice = null;\n\t\treturn this.#updateCache(() => this.#cache.reset());\n\t}\n\n\tasync waitForLastTransaction() {\n\t\tawait this.#updateCache(() => this.#waitForLastDigest());\n\t}\n\n\tasync executeTransaction(transaction: Transaction, options?: SuiTransactionBlockResponseOptions) {\n\t\tconst { promise, resolve, reject } = promiseWithResolvers<{\n\t\t\tdigest: string;\n\t\t\teffects: string;\n\t\t\tdata: SuiTransactionBlockResponse;\n\t\t}>();\n\t\tconst usedObjects = await this.#getUsedObjects(transaction);\n\n\t\tconst execute = () => {\n\t\t\tthis.#executeQueue.runTask(() => {\n\t\t\t\tconst promise = this.#execute(transaction, usedObjects, options);\n\n\t\t\t\treturn promise.then(resolve, reject);\n\t\t\t});\n\t\t};\n\n\t\tconst conflicts = new Set<string>();\n\n\t\tusedObjects.forEach((objectId) => {\n\t\t\tconst queue = this.#objectIdQueues.get(objectId);\n\t\t\tif (queue) {\n\t\t\t\tconflicts.add(objectId);\n\t\t\t\tthis.#objectIdQueues.get(objectId)!.push(() => {\n\t\t\t\t\tconflicts.delete(objectId);\n\t\t\t\t\tif (conflicts.size === 0) {\n\t\t\t\t\t\texecute();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tthis.#objectIdQueues.set(objectId, []);\n\t\t\t}\n\t\t});\n\n\t\tif (conflicts.size === 0) {\n\t\t\texecute();\n\t\t}\n\n\t\treturn promise;\n\t}\n\n\tasync #getUsedObjects(transaction: Transaction) {\n\t\tconst usedObjects = new Set<string>();\n\t\tlet serialized = false;\n\n\t\ttransaction.addSerializationPlugin(async (blockData, _options, next) => {\n\t\t\tawait next();\n\n\t\t\tif (serialized) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tserialized = true;\n\n\t\t\tblockData.inputs.forEach((input) => {\n\t\t\t\tif (input.Object?.ImmOrOwnedObject?.objectId) {\n\t\t\t\t\tusedObjects.add(input.Object.ImmOrOwnedObject.objectId);\n\t\t\t\t} else if (input.Object?.Receiving?.objectId) {\n\t\t\t\t\tusedObjects.add(input.Object.Receiving.objectId);\n\t\t\t\t} else if (\n\t\t\t\t\tinput.UnresolvedObject?.objectId &&\n\t\t\t\t\t!input.UnresolvedObject.initialSharedVersion\n\t\t\t\t) {\n\t\t\t\t\tusedObjects.add(input.UnresolvedObject.objectId);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tawait transaction.prepareForSerialization({ client: this.#client });\n\n\t\treturn usedObjects;\n\t}\n\n\tasync #execute(\n\t\ttransaction: Transaction,\n\t\tusedObjects: Set<string>,\n\t\toptions?: SuiTransactionBlockResponseOptions,\n\t) {\n\t\tlet gasCoin!: CoinWithBalance;\n\t\ttry {\n\t\t\ttransaction.setSenderIfNotSet(this.#signer.toSuiAddress());\n\n\t\t\tawait this.#buildQueue.runTask(async () => {\n\t\t\t\tconst data = transaction.getData();\n\n\t\t\t\tif (!data.gasData.price) {\n\t\t\t\t\ttransaction.setGasPrice(await this.#getGasPrice());\n\t\t\t\t}\n\n\t\t\t\ttransaction.setGasBudgetIfNotSet(this.#defaultGasBudget);\n\n\t\t\t\tawait this.#updateCache();\n\t\t\t\tgasCoin = await this.#getGasCoin();\n\t\t\t\tthis.#pendingTransactions++;\n\t\t\t\ttransaction.setGasPayment([\n\t\t\t\t\t{\n\t\t\t\t\t\tobjectId: gasCoin.id,\n\t\t\t\t\t\tversion: gasCoin.version,\n\t\t\t\t\t\tdigest: gasCoin.digest,\n\t\t\t\t\t},\n\t\t\t\t]);\n\n\t\t\t\t// Resolve cached references\n\t\t\t\tawait this.#cache.buildTransaction({ transaction, onlyTransactionKind: true });\n\t\t\t});\n\n\t\t\tconst bytes = await transaction.build({ client: this.#client });\n\n\t\t\tconst { signature } = await this.#signer.signTransaction(bytes);\n\n\t\t\tconst results = await this.#cache.executeTransaction({\n\t\t\t\ttransaction: bytes,\n\t\t\t\tsignature,\n\t\t\t\toptions: {\n\t\t\t\t\t...options,\n\t\t\t\t\tshowEffects: true,\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst effectsBytes = Uint8Array.from(results.rawEffects!);\n\t\t\tconst effects = bcs.TransactionEffects.parse(effectsBytes);\n\n\t\t\tconst gasResult = getGasCoinFromEffects(effects);\n\t\t\tconst gasUsed = effects.V2?.gasUsed;\n\n\t\t\tif (gasCoin && gasUsed && gasResult.owner === this.#signer.toSuiAddress()) {\n\t\t\t\tconst totalUsed =\n\t\t\t\t\tBigInt(gasUsed.computationCost) +\n\t\t\t\t\tBigInt(gasUsed.storageCost) +\n\t\t\t\t\tBigInt(gasUsed.storageCost) -\n\t\t\t\t\tBigInt(gasUsed.storageRebate);\n\n\t\t\t\tlet usesGasCoin = false;\n\t\t\t\tnew TransactionDataBuilder(transaction.getData()).mapArguments((arg) => {\n\t\t\t\t\tif (arg.$kind === 'GasCoin') {\n\t\t\t\t\t\tusesGasCoin = true;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn arg;\n\t\t\t\t});\n\n\t\t\t\tif (!usesGasCoin && gasCoin.balance >= this.#minimumCoinBalance) {\n\t\t\t\t\tthis.#coinPool.push({\n\t\t\t\t\t\tid: gasResult.ref.objectId,\n\t\t\t\t\t\tversion: gasResult.ref.version,\n\t\t\t\t\t\tdigest: gasResult.ref.digest,\n\t\t\t\t\t\tbalance: gasCoin.balance - totalUsed,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tif (!this.#sourceCoins) {\n\t\t\t\t\t\tthis.#sourceCoins = new Map();\n\t\t\t\t\t}\n\t\t\t\t\tthis.#sourceCoins.set(gasResult.ref.objectId, gasResult.ref);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.#lastDigest = results.digest;\n\n\t\t\treturn {\n\t\t\t\tdigest: results.digest,\n\t\t\t\teffects: toBase64(effectsBytes),\n\t\t\t\tdata: results,\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tif (gasCoin) {\n\t\t\t\tif (!this.#sourceCoins) {\n\t\t\t\t\tthis.#sourceCoins = new Map();\n\t\t\t\t}\n\n\t\t\t\tthis.#sourceCoins.set(gasCoin.id, null);\n\t\t\t}\n\n\t\t\tawait this.#updateCache(async () => {\n\t\t\t\tawait Promise.all([\n\t\t\t\t\tthis.#cache.cache.deleteObjects([...usedObjects]),\n\t\t\t\t\tthis.#waitForLastDigest(),\n\t\t\t\t]);\n\t\t\t});\n\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\tusedObjects.forEach((objectId) => {\n\t\t\t\tconst queue = this.#objectIdQueues.get(objectId);\n\t\t\t\tif (queue && queue.length > 0) {\n\t\t\t\t\tqueue.shift()!();\n\t\t\t\t} else if (queue) {\n\t\t\t\t\tthis.#objectIdQueues.delete(objectId);\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis.#pendingTransactions--;\n\t\t}\n\t}\n\n\t/** Helper for synchronizing cache updates, by ensuring only one update happens at a time. This can also be used to wait for any pending cache updates */\n\tasync #updateCache(fn?: () => Promise<void>) {\n\t\tif (this.#cacheLock) {\n\t\t\tawait this.#cacheLock;\n\t\t}\n\n\t\tthis.#cacheLock =\n\t\t\tfn?.().then(\n\t\t\t\t() => {\n\t\t\t\t\tthis.#cacheLock = null;\n\t\t\t\t},\n\t\t\t\t() => {},\n\t\t\t) ?? null;\n\t}\n\n\tasync #waitForLastDigest() {\n\t\tconst digest = this.#lastDigest;\n\t\tif (digest) {\n\t\t\tthis.#lastDigest = null;\n\t\t\tawait this.#client.waitForTransaction({ digest });\n\t\t}\n\t}\n\n\tasync #getGasCoin() {\n\t\tif (this.#coinPool.length === 0 && this.#pendingTransactions <= this.#maxPoolSize) {\n\t\t\tawait this.#refillCoinPool();\n\t\t}\n\n\t\tif (this.#coinPool.length === 0) {\n\t\t\tthrow new Error('No coins available');\n\t\t}\n\n\t\tconst coin = this.#coinPool.shift()!;\n\t\treturn coin;\n\t}\n\n\tasync #getGasPrice(): Promise<bigint> {\n\t\tconst remaining = this.#gasPrice\n\t\t\t? this.#gasPrice.expiration - this.#epochBoundaryWindow - Date.now()\n\t\t\t: 0;\n\n\t\tif (remaining > 0) {\n\t\t\treturn this.#gasPrice!.price;\n\t\t}\n\n\t\tif (this.#gasPrice) {\n\t\t\tconst timeToNextEpoch = Math.max(\n\t\t\t\tthis.#gasPrice.expiration + this.#epochBoundaryWindow - Date.now(),\n\t\t\t\t1_000,\n\t\t\t);\n\n\t\t\tawait new Promise((resolve) => setTimeout(resolve, timeToNextEpoch));\n\t\t}\n\n\t\tconst state = await this.#client.getLatestSuiSystemState();\n\n\t\tthis.#gasPrice = {\n\t\t\tprice: BigInt(state.referenceGasPrice),\n\t\t\texpiration:\n\t\t\t\tNumber.parseInt(state.epochStartTimestampMs, 10) +\n\t\t\t\tNumber.parseInt(state.epochDurationMs, 10),\n\t\t};\n\n\t\treturn this.#getGasPrice();\n\t}\n\n\tasync #refillCoinPool() {\n\t\tconst batchSize = Math.min(\n\t\t\tthis.#coinBatchSize,\n\t\t\tthis.#maxPoolSize - (this.#coinPool.length + this.#pendingTransactions) + 1,\n\t\t);\n\n\t\tif (batchSize === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst txb = new Transaction();\n\t\tconst address = this.#signer.toSuiAddress();\n\t\ttxb.setSender(address);\n\n\t\tif (this.#sourceCoins) {\n\t\t\tconst refs = [];\n\t\t\tconst ids = [];\n\t\t\tfor (const [id, ref] of this.#sourceCoins) {\n\t\t\t\tif (ref) {\n\t\t\t\t\trefs.push(ref);\n\t\t\t\t} else {\n\t\t\t\t\tids.push(id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (ids.length > 0) {\n\t\t\t\tconst coins = await this.#client.multiGetObjects({\n\t\t\t\t\tids,\n\t\t\t\t});\n\t\t\t\trefs.push(\n\t\t\t\t\t...coins\n\t\t\t\t\t\t.filter((coin): coin is typeof coin & { data: object } => coin.data !== null)\n\t\t\t\t\t\t.map(({ data }) => ({\n\t\t\t\t\t\t\tobjectId: data.objectId,\n\t\t\t\t\t\t\tversion: data.version,\n\t\t\t\t\t\t\tdigest: data.digest,\n\t\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t}\n\n\t\t\ttxb.setGasPayment(refs);\n\t\t\tthis.#sourceCoins = new Map();\n\t\t}\n\n\t\tconst amounts = new Array(batchSize).fill(this.#initialCoinBalance);\n\t\tconst results = txb.splitCoins(txb.gas, amounts);\n\t\tconst coinResults = [];\n\t\tfor (let i = 0; i < amounts.length; i++) {\n\t\t\tcoinResults.push(results[i]);\n\t\t}\n\t\ttxb.transferObjects(coinResults, address);\n\n\t\tawait this.waitForLastTransaction();\n\n\t\tconst result = await this.#client.signAndExecuteTransaction({\n\t\t\ttransaction: txb,\n\t\t\tsigner: this.#signer,\n\t\t\toptions: {\n\t\t\t\tshowRawEffects: true,\n\t\t\t},\n\t\t});\n\n\t\tconst effects = bcs.TransactionEffects.parse(Uint8Array.from(result.rawEffects!));\n\t\teffects.V2?.changedObjects.forEach(([id, { outputState }], i) => {\n\t\t\tif (i === effects.V2?.gasObjectIndex || !outputState.ObjectWrite) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.#coinPool.push({\n\t\t\t\tid,\n\t\t\t\tversion: effects.V2!.lamportVersion,\n\t\t\t\tdigest: outputState.ObjectWrite[0],\n\t\t\t\tbalance: BigInt(this.#initialCoinBalance),\n\t\t\t});\n\t\t});\n\n\t\tif (!this.#sourceCoins) {\n\t\t\tthis.#sourceCoins = new Map();\n\t\t}\n\n\t\tconst gasObject = getGasCoinFromEffects(effects).ref;\n\t\tthis.#sourceCoins!.set(gasObject.objectId, gasObject);\n\n\t\tawait this.#client.waitForTransaction({ digest: result.digest });\n\t}\n}\n\nfunction promiseWithResolvers<T>() {\n\tlet resolve: (value: T) => void;\n\tlet reject: (reason: any) => void;\n\n\tconst promise = new Promise<T>((_resolve, _reject) => {\n\t\tresolve = _resolve;\n\t\treject = _reject;\n\t});\n\n\treturn { promise, resolve: resolve!, reject: reject! };\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["promise"]
7
7
  }
@@ -6,7 +6,7 @@ var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read fr
6
6
  var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
7
7
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
8
8
  var _queue, _signer, _cache, _defaultGasBudget, _cacheGasCoin, _buildTransaction;
9
- import { toB64 } from "@mysten/bcs";
9
+ import { toBase64 } from "@mysten/bcs";
10
10
  import { bcs } from "../../bcs/index.js";
11
11
  import { isTransaction, Transaction } from "../Transaction.js";
12
12
  import { CachingTransactionExecutor } from "./caching.js";
@@ -78,7 +78,7 @@ class SerialTransactionExecutor {
78
78
  await this.applyEffects(effects);
79
79
  return {
80
80
  digest: results.digest,
81
- effects: toB64(effectsBytes),
81
+ effects: toBase64(effectsBytes),
82
82
  data: results
83
83
  };
84
84
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/transactions/executor/serial.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { toB64 } from '@mysten/bcs';\n\nimport { bcs } from '../../bcs/index.js';\nimport type { SuiClient, SuiTransactionBlockResponseOptions } from '../../client/index.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\nexport class SerialTransactionExecutor {\n\t#queue = new SerialQueue();\n\t#signer: Signer;\n\t#cache: CachingTransactionExecutor;\n\t#defaultGasBudget: bigint;\n\n\tconstructor({\n\t\tsigner,\n\t\tdefaultGasBudget = 50_000_000n,\n\t\t...options\n\t}: Omit<ObjectCacheOptions, 'address'> & {\n\t\tclient: SuiClient;\n\t\tsigner: Signer;\n\t\t/** The gasBudget to use if the transaction has not defined it's own gasBudget, defaults to `50_000_000n` */\n\t\tdefaultGasBudget?: bigint;\n\t}) {\n\t\tthis.#signer = signer;\n\t\tthis.#defaultGasBudget = defaultGasBudget;\n\t\tthis.#cache = new CachingTransactionExecutor({\n\t\t\tclient: options.client,\n\t\t\tcache: options.cache,\n\t\t});\n\t}\n\n\tasync applyEffects(effects: typeof bcs.TransactionEffects.$inferType) {\n\t\treturn Promise.all([this.#cacheGasCoin(effects), this.#cache.cache.applyEffects(effects)]);\n\t}\n\n\t#cacheGasCoin = async (effects: typeof bcs.TransactionEffects.$inferType) => {\n\t\tif (!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\tconst gasCoin = await this.#cache.cache.getCustom<{\n\t\t\tobjectId: string;\n\t\t\tversion: string;\n\t\t\tdigest: string;\n\t\t}>('gasCoin');\n\n\t\tconst copy = Transaction.from(transaction);\n\t\tif (gasCoin) {\n\t\t\tcopy.setGasPayment([gasCoin]);\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\tresetCache() {\n\t\treturn this.#cache.reset();\n\t}\n\n\twaitForLastTransaction() {\n\t\treturn this.#cache.waitForLastTransaction();\n\t}\n\n\texecuteTransaction(\n\t\ttransaction: Transaction | Uint8Array,\n\t\toptions?: SuiTransactionBlockResponseOptions,\n\t) {\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\tconst results = await this.#cache\n\t\t\t\t.executeTransaction({\n\t\t\t\t\tsignature,\n\t\t\t\t\ttransaction: bytes,\n\t\t\t\t\toptions,\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\n\t\t\tconst effectsBytes = Uint8Array.from(results.rawEffects!);\n\t\t\tconst effects = bcs.TransactionEffects.parse(effectsBytes);\n\t\t\tawait this.applyEffects(effects);\n\n\t\t\treturn {\n\t\t\t\tdigest: results.digest,\n\t\t\t\teffects: toB64(effectsBytes),\n\t\t\t\tdata: results,\n\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"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { toBase64 } from '@mysten/bcs';\n\nimport { bcs } from '../../bcs/index.js';\nimport type { SuiClient, SuiTransactionBlockResponseOptions } from '../../client/index.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\nexport class SerialTransactionExecutor {\n\t#queue = new SerialQueue();\n\t#signer: Signer;\n\t#cache: CachingTransactionExecutor;\n\t#defaultGasBudget: bigint;\n\n\tconstructor({\n\t\tsigner,\n\t\tdefaultGasBudget = 50_000_000n,\n\t\t...options\n\t}: Omit<ObjectCacheOptions, 'address'> & {\n\t\tclient: SuiClient;\n\t\tsigner: Signer;\n\t\t/** The gasBudget to use if the transaction has not defined it's own gasBudget, defaults to `50_000_000n` */\n\t\tdefaultGasBudget?: bigint;\n\t}) {\n\t\tthis.#signer = signer;\n\t\tthis.#defaultGasBudget = defaultGasBudget;\n\t\tthis.#cache = new CachingTransactionExecutor({\n\t\t\tclient: options.client,\n\t\t\tcache: options.cache,\n\t\t});\n\t}\n\n\tasync applyEffects(effects: typeof bcs.TransactionEffects.$inferType) {\n\t\treturn Promise.all([this.#cacheGasCoin(effects), this.#cache.cache.applyEffects(effects)]);\n\t}\n\n\t#cacheGasCoin = async (effects: typeof bcs.TransactionEffects.$inferType) => {\n\t\tif (!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\tconst gasCoin = await this.#cache.cache.getCustom<{\n\t\t\tobjectId: string;\n\t\t\tversion: string;\n\t\t\tdigest: string;\n\t\t}>('gasCoin');\n\n\t\tconst copy = Transaction.from(transaction);\n\t\tif (gasCoin) {\n\t\t\tcopy.setGasPayment([gasCoin]);\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\tresetCache() {\n\t\treturn this.#cache.reset();\n\t}\n\n\twaitForLastTransaction() {\n\t\treturn this.#cache.waitForLastTransaction();\n\t}\n\n\texecuteTransaction(\n\t\ttransaction: Transaction | Uint8Array,\n\t\toptions?: SuiTransactionBlockResponseOptions,\n\t) {\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\tconst results = await this.#cache\n\t\t\t\t.executeTransaction({\n\t\t\t\t\tsignature,\n\t\t\t\t\ttransaction: bytes,\n\t\t\t\t\toptions,\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\n\t\t\tconst effectsBytes = Uint8Array.from(results.rawEffects!);\n\t\t\tconst effects = bcs.TransactionEffects.parse(effectsBytes);\n\t\t\tawait this.applyEffects(effects);\n\n\t\t\treturn {\n\t\t\t\tdigest: results.digest,\n\t\t\t\teffects: toBase64(effectsBytes),\n\t\t\t\tdata: results,\n\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"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -22,10 +22,10 @@ export type NamedPackagesPluginOptions = {
22
22
  * Expected format example:
23
23
  * {
24
24
  * packages: {
25
- * 'std@framework': '0x1234',
25
+ * '@framework/std': '0x1234',
26
26
  * },
27
27
  * types: {
28
- * 'std@framework::string::String': '0x1234::string::String',
28
+ * '@framework/std::string::String': '0x1234::string::String',
29
29
  * },
30
30
  * }
31
31
  *
@@ -36,7 +36,7 @@ export type NamedPackagesPluginOptions = {
36
36
  * @experimental This plugin is in experimental phase and there might be breaking changes in the future
37
37
  *
38
38
  * Adds named resolution so that you can use .move names in your transactions.
39
- * e.g. `app@org::type::Type` will be resolved to `0x1234::type::Type`.
39
+ * e.g. `@org/app::type::Type` will be resolved to `0x1234::type::Type`.
40
40
  * This plugin will resolve all names & types in the transaction block.
41
41
  *
42
42
  * To install this plugin globally in your app, use:
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/transactions/plugins/NamedPackagesPlugin.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { SuiGraphQLClient } from '../../graphql/client.js';\nimport type { BuildTransactionOptions } from '../json-rpc-resolver.js';\nimport type { TransactionDataBuilder } from '../TransactionData.js';\nimport type { NamedPackagesPluginCache, NameResolutionRequest } from './utils.js';\nimport { findTransactionBlockNames, listToRequests, replaceNames } from './utils.js';\n\nexport type NamedPackagesPluginOptions = {\n\t/**\n\t * The SuiGraphQLClient to use for resolving names.\n\t * The endpoint should be the GraphQL endpoint of the network you are targeting.\n\t * For non-mainnet networks, if the plugin doesn't work as expected, you need to validate that the\n\t * RPC provider has support for the `packageByName` and `typeByName` queries (using external resolver).\n\t */\n\tsuiGraphQLClient: SuiGraphQLClient;\n\t/**\n\t * The number of names to resolve in each batch request.\n\t * Needs to be calculated based on the GraphQL query limits.\n\t */\n\tpageSize?: number;\n\t/**\n\t * Local overrides for the resolution plugin. Pass this to pre-populate\n\t * the cache with known packages / types (especially useful for local or CI testing).\n\t *\n\t * \tExpected format example:\n\t * {\n\t * \t\tpackages: {\n\t * \t\t\t'std@framework': '0x1234',\n\t * \t\t},\n\t * \t\ttypes: {\n\t * \t\t\t'std@framework::string::String': '0x1234::string::String',\n\t * \t\t},\n\t * \t}\n\t *\n\t */\n\toverrides?: NamedPackagesPluginCache;\n};\n\n/**\n * @experimental This plugin is in experimental phase and there might be breaking changes in the future\n *\n * Adds named resolution so that you can use .move names in your transactions.\n * e.g. `app@org::type::Type` will be resolved to `0x1234::type::Type`.\n * This plugin will resolve all names & types in the transaction block.\n *\n * To install this plugin globally in your app, use:\n * ```\n * Transaction.registerGlobalSerializationPlugin(\"namedPackagesPlugin\", namedPackagesPlugin({ suiGraphQLClient }));\n * ```\n *\n * You can also define `overrides` to pre-populate name resolutions locally (removes the GraphQL request).\n */\nexport const namedPackagesPlugin = ({\n\tsuiGraphQLClient,\n\tpageSize = 10,\n\toverrides = { packages: {}, types: {} },\n}: NamedPackagesPluginOptions) => {\n\tconst cache = {\n\t\tpackages: { ...overrides.packages },\n\t\ttypes: { ...overrides.types },\n\t};\n\n\treturn async (\n\t\ttransactionData: TransactionDataBuilder,\n\t\t_buildOptions: BuildTransactionOptions,\n\t\tnext: () => Promise<void>,\n\t) => {\n\t\tconst names = findTransactionBlockNames(transactionData);\n\t\tconst batches = listToRequests(\n\t\t\t{\n\t\t\t\tpackages: names.packages.filter((x) => !cache.packages[x]),\n\t\t\t\ttypes: names.types.filter((x) => !cache.types[x]),\n\t\t\t},\n\t\t\tpageSize,\n\t\t);\n\n\t\t// now we need to bulk resolve all the names + types, and replace them in the transaction data.\n\t\t(await Promise.all(batches.map((batch) => query(suiGraphQLClient, batch)))).forEach((res) => {\n\t\t\tObject.assign(cache.types, res.types);\n\t\t\tObject.assign(cache.packages, res.packages);\n\t\t});\n\n\t\treplaceNames(transactionData, cache);\n\n\t\tawait next();\n\t};\n\n\tasync function query(client: SuiGraphQLClient, requests: NameResolutionRequest[]) {\n\t\tconst results: NamedPackagesPluginCache = { packages: {}, types: {} };\n\t\t// avoid making a request if there are no names to resolve.\n\t\tif (requests.length === 0) return results;\n\n\t\t// Create multiple queries for each name / type we need to resolve\n\t\t// TODO: Replace with bulk APIs when available.\n\t\tconst gqlQuery = `{\n ${requests.map((req) => {\n\t\t\t\t\tconst request = req.type === 'package' ? 'packageByName' : 'typeByName';\n\t\t\t\t\tconst fields = req.type === 'package' ? 'address' : 'repr';\n\n\t\t\t\t\treturn `${gqlQueryKey(req.id)}: ${request}(name:\"${req.name}\") {\n ${fields}\n }`;\n\t\t\t\t})}\n }`;\n\n\t\tconst result = await client.query({\n\t\t\tquery: gqlQuery,\n\t\t\tvariables: undefined,\n\t\t});\n\n\t\tif (result.errors) throw new Error(JSON.stringify({ query: gqlQuery, errors: result.errors }));\n\n\t\t// Parse the results and create a map of `<name|type> -> <address|repr>`\n\t\tfor (const req of requests) {\n\t\t\tconst key = gqlQueryKey(req.id);\n\t\t\tif (!result.data || !result.data[key]) throw new Error(`No result found for: ${req.name}`);\n\t\t\tconst data = result.data[key] as { address?: string; repr?: string };\n\n\t\t\tif (req.type === 'package') results.packages[req.name] = data.address!;\n\t\t\tif (req.type === 'moveType') results.types[req.name] = data.repr!;\n\t\t}\n\n\t\treturn results;\n\t}\n};\n\nconst gqlQueryKey = (idx: number) => `key_${idx}`;\n"],
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport type { SuiGraphQLClient } from '../../graphql/client.js';\nimport type { BuildTransactionOptions } from '../json-rpc-resolver.js';\nimport type { TransactionDataBuilder } from '../TransactionData.js';\nimport type { NamedPackagesPluginCache, NameResolutionRequest } from './utils.js';\nimport { findTransactionBlockNames, listToRequests, replaceNames } from './utils.js';\n\nexport type NamedPackagesPluginOptions = {\n\t/**\n\t * The SuiGraphQLClient to use for resolving names.\n\t * The endpoint should be the GraphQL endpoint of the network you are targeting.\n\t * For non-mainnet networks, if the plugin doesn't work as expected, you need to validate that the\n\t * RPC provider has support for the `packageByName` and `typeByName` queries (using external resolver).\n\t */\n\tsuiGraphQLClient: SuiGraphQLClient;\n\t/**\n\t * The number of names to resolve in each batch request.\n\t * Needs to be calculated based on the GraphQL query limits.\n\t */\n\tpageSize?: number;\n\t/**\n\t * Local overrides for the resolution plugin. Pass this to pre-populate\n\t * the cache with known packages / types (especially useful for local or CI testing).\n\t *\n\t * \tExpected format example:\n\t * {\n\t * \t\tpackages: {\n\t * \t\t\t'@framework/std': '0x1234',\n\t * \t\t},\n\t * \t\ttypes: {\n\t * \t\t\t'@framework/std::string::String': '0x1234::string::String',\n\t * \t\t},\n\t * \t}\n\t *\n\t */\n\toverrides?: NamedPackagesPluginCache;\n};\n\n/**\n * @experimental This plugin is in experimental phase and there might be breaking changes in the future\n *\n * Adds named resolution so that you can use .move names in your transactions.\n * e.g. `@org/app::type::Type` will be resolved to `0x1234::type::Type`.\n * This plugin will resolve all names & types in the transaction block.\n *\n * To install this plugin globally in your app, use:\n * ```\n * Transaction.registerGlobalSerializationPlugin(\"namedPackagesPlugin\", namedPackagesPlugin({ suiGraphQLClient }));\n * ```\n *\n * You can also define `overrides` to pre-populate name resolutions locally (removes the GraphQL request).\n */\nexport const namedPackagesPlugin = ({\n\tsuiGraphQLClient,\n\tpageSize = 10,\n\toverrides = { packages: {}, types: {} },\n}: NamedPackagesPluginOptions) => {\n\tconst cache = {\n\t\tpackages: { ...overrides.packages },\n\t\ttypes: { ...overrides.types },\n\t};\n\n\treturn async (\n\t\ttransactionData: TransactionDataBuilder,\n\t\t_buildOptions: BuildTransactionOptions,\n\t\tnext: () => Promise<void>,\n\t) => {\n\t\tconst names = findTransactionBlockNames(transactionData);\n\t\tconst batches = listToRequests(\n\t\t\t{\n\t\t\t\tpackages: names.packages.filter((x) => !cache.packages[x]),\n\t\t\t\ttypes: names.types.filter((x) => !cache.types[x]),\n\t\t\t},\n\t\t\tpageSize,\n\t\t);\n\n\t\t// now we need to bulk resolve all the names + types, and replace them in the transaction data.\n\t\t(await Promise.all(batches.map((batch) => query(suiGraphQLClient, batch)))).forEach((res) => {\n\t\t\tObject.assign(cache.types, res.types);\n\t\t\tObject.assign(cache.packages, res.packages);\n\t\t});\n\n\t\treplaceNames(transactionData, cache);\n\n\t\tawait next();\n\t};\n\n\tasync function query(client: SuiGraphQLClient, requests: NameResolutionRequest[]) {\n\t\tconst results: NamedPackagesPluginCache = { packages: {}, types: {} };\n\t\t// avoid making a request if there are no names to resolve.\n\t\tif (requests.length === 0) return results;\n\n\t\t// Create multiple queries for each name / type we need to resolve\n\t\t// TODO: Replace with bulk APIs when available.\n\t\tconst gqlQuery = `{\n ${requests.map((req) => {\n\t\t\t\t\tconst request = req.type === 'package' ? 'packageByName' : 'typeByName';\n\t\t\t\t\tconst fields = req.type === 'package' ? 'address' : 'repr';\n\n\t\t\t\t\treturn `${gqlQueryKey(req.id)}: ${request}(name:\"${req.name}\") {\n ${fields}\n }`;\n\t\t\t\t})}\n }`;\n\n\t\tconst result = await client.query({\n\t\t\tquery: gqlQuery,\n\t\t\tvariables: undefined,\n\t\t});\n\n\t\tif (result.errors) throw new Error(JSON.stringify({ query: gqlQuery, errors: result.errors }));\n\n\t\t// Parse the results and create a map of `<name|type> -> <address|repr>`\n\t\tfor (const req of requests) {\n\t\t\tconst key = gqlQueryKey(req.id);\n\t\t\tif (!result.data || !result.data[key]) throw new Error(`No result found for: ${req.name}`);\n\t\t\tconst data = result.data[key] as { address?: string; repr?: string };\n\n\t\t\tif (req.type === 'package') results.packages[req.name] = data.address!;\n\t\t\tif (req.type === 'moveType') results.types[req.name] = data.repr!;\n\t\t}\n\n\t\treturn results;\n\t}\n};\n\nconst gqlQueryKey = (idx: number) => `key_${idx}`;\n"],
5
5
  "mappings": "AAOA,SAAS,2BAA2B,gBAAgB,oBAAoB;AA+CjE,MAAM,sBAAsB,CAAC;AAAA,EACnC;AAAA,EACA,WAAW;AAAA,EACX,YAAY,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,EAAE;AACvC,MAAkC;AACjC,QAAM,QAAQ;AAAA,IACb,UAAU,EAAE,GAAG,UAAU,SAAS;AAAA,IAClC,OAAO,EAAE,GAAG,UAAU,MAAM;AAAA,EAC7B;AAEA,SAAO,OACN,iBACA,eACA,SACI;AACJ,UAAM,QAAQ,0BAA0B,eAAe;AACvD,UAAM,UAAU;AAAA,MACf;AAAA,QACC,UAAU,MAAM,SAAS,OAAO,CAAC,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;AAAA,QACzD,OAAO,MAAM,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,MAAM,CAAC,CAAC;AAAA,MACjD;AAAA,MACA;AAAA,IACD;AAGA,KAAC,MAAM,QAAQ,IAAI,QAAQ,IAAI,CAAC,UAAU,MAAM,kBAAkB,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,QAAQ;AAC5F,aAAO,OAAO,MAAM,OAAO,IAAI,KAAK;AACpC,aAAO,OAAO,MAAM,UAAU,IAAI,QAAQ;AAAA,IAC3C,CAAC;AAED,iBAAa,iBAAiB,KAAK;AAEnC,UAAM,KAAK;AAAA,EACZ;AAEA,iBAAe,MAAM,QAA0B,UAAmC;AACjF,UAAM,UAAoC,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,EAAE;AAEpE,QAAI,SAAS,WAAW,EAAG,QAAO;AAIlC,UAAM,WAAW;AAAA,UACT,SAAS,IAAI,CAAC,QAAQ;AAC3B,YAAM,UAAU,IAAI,SAAS,YAAY,kBAAkB;AAC3D,YAAM,SAAS,IAAI,SAAS,YAAY,YAAY;AAEpD,aAAO,GAAG,YAAY,IAAI,EAAE,CAAC,KAAK,OAAO,UAAU,IAAI,IAAI;AAAA,sBAC1C,MAAM;AAAA;AAAA,IAExB,CAAC,CAAC;AAAA;AAGJ,UAAM,SAAS,MAAM,OAAO,MAAM;AAAA,MACjC,OAAO;AAAA,MACP,WAAW;AAAA,IACZ,CAAC;AAED,QAAI,OAAO,OAAQ,OAAM,IAAI,MAAM,KAAK,UAAU,EAAE,OAAO,UAAU,QAAQ,OAAO,OAAO,CAAC,CAAC;AAG7F,eAAW,OAAO,UAAU;AAC3B,YAAM,MAAM,YAAY,IAAI,EAAE;AAC9B,UAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,KAAK,GAAG,EAAG,OAAM,IAAI,MAAM,wBAAwB,IAAI,IAAI,EAAE;AACzF,YAAM,OAAO,OAAO,KAAK,GAAG;AAE5B,UAAI,IAAI,SAAS,UAAW,SAAQ,SAAS,IAAI,IAAI,IAAI,KAAK;AAC9D,UAAI,IAAI,SAAS,WAAY,SAAQ,MAAM,IAAI,IAAI,IAAI,KAAK;AAAA,IAC7D;AAEA,WAAO;AAAA,EACR;AACD;AAEA,MAAM,cAAc,CAAC,QAAgB,OAAO,GAAG;",
6
6
  "names": []
7
7
  }
@@ -1,9 +1,15 @@
1
1
  import { isValidNamedPackage, isValidNamedType } from "../../utils/move-registry.js";
2
- const NAME_SEPARATOR = "@";
2
+ const NAME_SEPARATOR = "/";
3
3
  const findTransactionBlockNames = (builder) => {
4
4
  const packages = /* @__PURE__ */ new Set();
5
5
  const types = /* @__PURE__ */ new Set();
6
6
  for (const command of builder.commands) {
7
+ if (command.MakeMoveVec?.type) {
8
+ getNamesFromTypeList([command.MakeMoveVec.type]).forEach((type) => {
9
+ types.add(type);
10
+ });
11
+ continue;
12
+ }
7
13
  if (!("MoveCall" in command)) continue;
8
14
  const tx = command.MoveCall;
9
15
  if (!tx) continue;
@@ -12,20 +18,33 @@ const findTransactionBlockNames = (builder) => {
12
18
  if (!isValidNamedPackage(pkg)) throw new Error(`Invalid package name: ${pkg}`);
13
19
  packages.add(pkg);
14
20
  }
15
- for (const type of tx.typeArguments ?? []) {
16
- if (type.includes(NAME_SEPARATOR)) {
17
- if (!isValidNamedType(type)) throw new Error(`Invalid type with names: ${type}`);
18
- types.add(type);
19
- }
20
- }
21
+ getNamesFromTypeList(tx.typeArguments ?? []).forEach((type) => {
22
+ types.add(type);
23
+ });
21
24
  }
22
25
  return {
23
26
  packages: [...packages],
24
27
  types: [...types]
25
28
  };
26
29
  };
30
+ function getNamesFromTypeList(types) {
31
+ const names = /* @__PURE__ */ new Set();
32
+ for (const type of types) {
33
+ if (type.includes(NAME_SEPARATOR)) {
34
+ if (!isValidNamedType(type)) throw new Error(`Invalid type with names: ${type}`);
35
+ names.add(type);
36
+ }
37
+ }
38
+ return [...names];
39
+ }
27
40
  const replaceNames = (builder, cache) => {
28
41
  for (const command of builder.commands) {
42
+ if (command.MakeMoveVec?.type) {
43
+ if (!command.MakeMoveVec.type.includes(NAME_SEPARATOR)) continue;
44
+ if (!cache.types[command.MakeMoveVec.type])
45
+ throw new Error(`No resolution found for type: ${command.MakeMoveVec.type}`);
46
+ command.MakeMoveVec.type = cache.types[command.MakeMoveVec.type];
47
+ }
29
48
  const tx = command.MoveCall;
30
49
  if (!tx) continue;
31
50
  const nameParts = tx.package.split("::");
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/transactions/plugins/utils.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { isValidNamedPackage, isValidNamedType } from '../../utils/move-registry.js';\nimport type { TransactionDataBuilder } from '../TransactionData.js';\n\nexport type NamedPackagesPluginCache = {\n\tpackages: Record<string, string>;\n\ttypes: Record<string, string>;\n};\n\nconst NAME_SEPARATOR = '@';\n\nexport type NameResolutionRequest = {\n\tid: number;\n\ttype: 'package' | 'moveType';\n\tname: string;\n};\n\n/**\n * Looks up all `.move` names in a transaction block.\n * Returns a list of all the names found.\n */\nexport const findTransactionBlockNames = (\n\tbuilder: TransactionDataBuilder,\n): { packages: string[]; types: string[] } => {\n\tconst packages: Set<string> = new Set();\n\tconst types: Set<string> = new Set();\n\n\tfor (const command of builder.commands) {\n\t\tif (!('MoveCall' in command)) continue;\n\t\tconst tx = command.MoveCall;\n\n\t\tif (!tx) continue;\n\n\t\tconst pkg = tx.package.split('::')[0];\n\t\tif (pkg.includes(NAME_SEPARATOR)) {\n\t\t\tif (!isValidNamedPackage(pkg)) throw new Error(`Invalid package name: ${pkg}`);\n\t\t\tpackages.add(pkg);\n\t\t}\n\n\t\tfor (const type of tx.typeArguments ?? []) {\n\t\t\tif (type.includes(NAME_SEPARATOR)) {\n\t\t\t\tif (!isValidNamedType(type)) throw new Error(`Invalid type with names: ${type}`);\n\t\t\t\ttypes.add(type);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn {\n\t\tpackages: [...packages],\n\t\ttypes: [...types],\n\t};\n};\n\n/**\n * Replace all names & types in a transaction block\n * with their resolved names/types.\n */\nexport const replaceNames = (builder: TransactionDataBuilder, cache: NamedPackagesPluginCache) => {\n\tfor (const command of builder.commands) {\n\t\tconst tx = command.MoveCall;\n\t\tif (!tx) continue;\n\n\t\tconst nameParts = tx.package.split('::');\n\t\tconst name = nameParts[0];\n\n\t\tif (name.includes(NAME_SEPARATOR) && !cache.packages[name])\n\t\t\tthrow new Error(`No address found for package: ${name}`);\n\n\t\tnameParts[0] = cache.packages[name];\n\t\ttx.package = nameParts.join('::');\n\n\t\tconst types = tx.typeArguments;\n\t\tif (!types) continue;\n\n\t\tfor (let i = 0; i < types.length; i++) {\n\t\t\tif (!types[i].includes(NAME_SEPARATOR)) continue;\n\n\t\t\tif (!cache.types[types[i]]) throw new Error(`No resolution found for type: ${types[i]}`);\n\t\t\ttypes[i] = cache.types[types[i]];\n\t\t}\n\n\t\ttx.typeArguments = types;\n\t}\n};\n\nexport const listToRequests = (\n\tnames: { packages: string[]; types: string[] },\n\tbatchSize: number,\n): NameResolutionRequest[][] => {\n\tconst results: NameResolutionRequest[] = [];\n\tconst uniqueNames = deduplicate(names.packages);\n\tconst uniqueTypes = deduplicate(names.types);\n\n\tfor (const [idx, name] of uniqueNames.entries()) {\n\t\tresults.push({ id: idx, type: 'package', name } as NameResolutionRequest);\n\t}\n\tfor (const [idx, type] of uniqueTypes.entries()) {\n\t\tresults.push({\n\t\t\tid: idx + uniqueNames.length,\n\t\t\ttype: 'moveType',\n\t\t\tname: type,\n\t\t} as NameResolutionRequest);\n\t}\n\n\treturn batch(results, batchSize);\n};\n\nconst deduplicate = <T>(arr: T[]): T[] => [...new Set(arr)];\n\nconst batch = <T>(arr: T[], size: number): T[][] => {\n\tconst batches = [];\n\tfor (let i = 0; i < arr.length; i += size) {\n\t\tbatches.push(arr.slice(i, i + size));\n\t}\n\treturn batches;\n};\n"],
5
- "mappings": "AAGA,SAAS,qBAAqB,wBAAwB;AAQtD,MAAM,iBAAiB;AAYhB,MAAM,4BAA4B,CACxC,YAC6C;AAC7C,QAAM,WAAwB,oBAAI,IAAI;AACtC,QAAM,QAAqB,oBAAI,IAAI;AAEnC,aAAW,WAAW,QAAQ,UAAU;AACvC,QAAI,EAAE,cAAc,SAAU;AAC9B,UAAM,KAAK,QAAQ;AAEnB,QAAI,CAAC,GAAI;AAET,UAAM,MAAM,GAAG,QAAQ,MAAM,IAAI,EAAE,CAAC;AACpC,QAAI,IAAI,SAAS,cAAc,GAAG;AACjC,UAAI,CAAC,oBAAoB,GAAG,EAAG,OAAM,IAAI,MAAM,yBAAyB,GAAG,EAAE;AAC7E,eAAS,IAAI,GAAG;AAAA,IACjB;AAEA,eAAW,QAAQ,GAAG,iBAAiB,CAAC,GAAG;AAC1C,UAAI,KAAK,SAAS,cAAc,GAAG;AAClC,YAAI,CAAC,iBAAiB,IAAI,EAAG,OAAM,IAAI,MAAM,4BAA4B,IAAI,EAAE;AAC/E,cAAM,IAAI,IAAI;AAAA,MACf;AAAA,IACD;AAAA,EACD;AAEA,SAAO;AAAA,IACN,UAAU,CAAC,GAAG,QAAQ;AAAA,IACtB,OAAO,CAAC,GAAG,KAAK;AAAA,EACjB;AACD;AAMO,MAAM,eAAe,CAAC,SAAiC,UAAoC;AACjG,aAAW,WAAW,QAAQ,UAAU;AACvC,UAAM,KAAK,QAAQ;AACnB,QAAI,CAAC,GAAI;AAET,UAAM,YAAY,GAAG,QAAQ,MAAM,IAAI;AACvC,UAAM,OAAO,UAAU,CAAC;AAExB,QAAI,KAAK,SAAS,cAAc,KAAK,CAAC,MAAM,SAAS,IAAI;AACxD,YAAM,IAAI,MAAM,iCAAiC,IAAI,EAAE;AAExD,cAAU,CAAC,IAAI,MAAM,SAAS,IAAI;AAClC,OAAG,UAAU,UAAU,KAAK,IAAI;AAEhC,UAAM,QAAQ,GAAG;AACjB,QAAI,CAAC,MAAO;AAEZ,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,UAAI,CAAC,MAAM,CAAC,EAAE,SAAS,cAAc,EAAG;AAExC,UAAI,CAAC,MAAM,MAAM,MAAM,CAAC,CAAC,EAAG,OAAM,IAAI,MAAM,iCAAiC,MAAM,CAAC,CAAC,EAAE;AACvF,YAAM,CAAC,IAAI,MAAM,MAAM,MAAM,CAAC,CAAC;AAAA,IAChC;AAEA,OAAG,gBAAgB;AAAA,EACpB;AACD;AAEO,MAAM,iBAAiB,CAC7B,OACA,cAC+B;AAC/B,QAAM,UAAmC,CAAC;AAC1C,QAAM,cAAc,YAAY,MAAM,QAAQ;AAC9C,QAAM,cAAc,YAAY,MAAM,KAAK;AAE3C,aAAW,CAAC,KAAK,IAAI,KAAK,YAAY,QAAQ,GAAG;AAChD,YAAQ,KAAK,EAAE,IAAI,KAAK,MAAM,WAAW,KAAK,CAA0B;AAAA,EACzE;AACA,aAAW,CAAC,KAAK,IAAI,KAAK,YAAY,QAAQ,GAAG;AAChD,YAAQ,KAAK;AAAA,MACZ,IAAI,MAAM,YAAY;AAAA,MACtB,MAAM;AAAA,MACN,MAAM;AAAA,IACP,CAA0B;AAAA,EAC3B;AAEA,SAAO,MAAM,SAAS,SAAS;AAChC;AAEA,MAAM,cAAc,CAAI,QAAkB,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC;AAE1D,MAAM,QAAQ,CAAI,KAAU,SAAwB;AACnD,QAAM,UAAU,CAAC;AACjB,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,MAAM;AAC1C,YAAQ,KAAK,IAAI,MAAM,GAAG,IAAI,IAAI,CAAC;AAAA,EACpC;AACA,SAAO;AACR;",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { isValidNamedPackage, isValidNamedType } from '../../utils/move-registry.js';\nimport type { TransactionDataBuilder } from '../TransactionData.js';\n\nexport type NamedPackagesPluginCache = {\n\tpackages: Record<string, string>;\n\ttypes: Record<string, string>;\n};\n\nconst NAME_SEPARATOR = '/';\n\nexport type NameResolutionRequest = {\n\tid: number;\n\ttype: 'package' | 'moveType';\n\tname: string;\n};\n\n/**\n * Looks up all `.move` names in a transaction block.\n * Returns a list of all the names found.\n */\nexport const findTransactionBlockNames = (\n\tbuilder: TransactionDataBuilder,\n): { packages: string[]; types: string[] } => {\n\tconst packages: Set<string> = new Set();\n\tconst types: Set<string> = new Set();\n\n\tfor (const command of builder.commands) {\n\t\tif (command.MakeMoveVec?.type) {\n\t\t\tgetNamesFromTypeList([command.MakeMoveVec.type]).forEach((type) => {\n\t\t\t\ttypes.add(type);\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\t\tif (!('MoveCall' in command)) continue;\n\t\tconst tx = command.MoveCall;\n\n\t\tif (!tx) continue;\n\n\t\tconst pkg = tx.package.split('::')[0];\n\t\tif (pkg.includes(NAME_SEPARATOR)) {\n\t\t\tif (!isValidNamedPackage(pkg)) throw new Error(`Invalid package name: ${pkg}`);\n\t\t\tpackages.add(pkg);\n\t\t}\n\n\t\tgetNamesFromTypeList(tx.typeArguments ?? []).forEach((type) => {\n\t\t\ttypes.add(type);\n\t\t});\n\t}\n\n\treturn {\n\t\tpackages: [...packages],\n\t\ttypes: [...types],\n\t};\n};\n\n/**\n * Returns a list of unique types that include a name\n * from the given list.\n * */\nfunction getNamesFromTypeList(types: string[]) {\n\tconst names = new Set<string>();\n\tfor (const type of types) {\n\t\tif (type.includes(NAME_SEPARATOR)) {\n\t\t\tif (!isValidNamedType(type)) throw new Error(`Invalid type with names: ${type}`);\n\t\t\tnames.add(type);\n\t\t}\n\t}\n\treturn [...names];\n}\n\n/**\n * Replace all names & types in a transaction block\n * with their resolved names/types.\n */\nexport const replaceNames = (builder: TransactionDataBuilder, cache: NamedPackagesPluginCache) => {\n\tfor (const command of builder.commands) {\n\t\t// Replacements for `MakeMoveVec` commands (that can include types)\n\t\tif (command.MakeMoveVec?.type) {\n\t\t\tif (!command.MakeMoveVec.type.includes(NAME_SEPARATOR)) continue;\n\t\t\tif (!cache.types[command.MakeMoveVec.type])\n\t\t\t\tthrow new Error(`No resolution found for type: ${command.MakeMoveVec.type}`);\n\t\t\tcommand.MakeMoveVec.type = cache.types[command.MakeMoveVec.type];\n\t\t}\n\t\t// Replacements for `MoveCall` commands (that can include packages & types)\n\t\tconst tx = command.MoveCall;\n\t\tif (!tx) continue;\n\n\t\tconst nameParts = tx.package.split('::');\n\t\tconst name = nameParts[0];\n\n\t\tif (name.includes(NAME_SEPARATOR) && !cache.packages[name])\n\t\t\tthrow new Error(`No address found for package: ${name}`);\n\n\t\tnameParts[0] = cache.packages[name];\n\t\ttx.package = nameParts.join('::');\n\n\t\tconst types = tx.typeArguments;\n\t\tif (!types) continue;\n\n\t\tfor (let i = 0; i < types.length; i++) {\n\t\t\tif (!types[i].includes(NAME_SEPARATOR)) continue;\n\n\t\t\tif (!cache.types[types[i]]) throw new Error(`No resolution found for type: ${types[i]}`);\n\t\t\ttypes[i] = cache.types[types[i]];\n\t\t}\n\n\t\ttx.typeArguments = types;\n\t}\n};\n\nexport const listToRequests = (\n\tnames: { packages: string[]; types: string[] },\n\tbatchSize: number,\n): NameResolutionRequest[][] => {\n\tconst results: NameResolutionRequest[] = [];\n\tconst uniqueNames = deduplicate(names.packages);\n\tconst uniqueTypes = deduplicate(names.types);\n\n\tfor (const [idx, name] of uniqueNames.entries()) {\n\t\tresults.push({ id: idx, type: 'package', name } as NameResolutionRequest);\n\t}\n\tfor (const [idx, type] of uniqueTypes.entries()) {\n\t\tresults.push({\n\t\t\tid: idx + uniqueNames.length,\n\t\t\ttype: 'moveType',\n\t\t\tname: type,\n\t\t} as NameResolutionRequest);\n\t}\n\n\treturn batch(results, batchSize);\n};\n\nconst deduplicate = <T>(arr: T[]): T[] => [...new Set(arr)];\n\nconst batch = <T>(arr: T[], size: number): T[][] => {\n\tconst batches = [];\n\tfor (let i = 0; i < arr.length; i += size) {\n\t\tbatches.push(arr.slice(i, i + size));\n\t}\n\treturn batches;\n};\n"],
5
+ "mappings": "AAGA,SAAS,qBAAqB,wBAAwB;AAQtD,MAAM,iBAAiB;AAYhB,MAAM,4BAA4B,CACxC,YAC6C;AAC7C,QAAM,WAAwB,oBAAI,IAAI;AACtC,QAAM,QAAqB,oBAAI,IAAI;AAEnC,aAAW,WAAW,QAAQ,UAAU;AACvC,QAAI,QAAQ,aAAa,MAAM;AAC9B,2BAAqB,CAAC,QAAQ,YAAY,IAAI,CAAC,EAAE,QAAQ,CAAC,SAAS;AAClE,cAAM,IAAI,IAAI;AAAA,MACf,CAAC;AACD;AAAA,IACD;AACA,QAAI,EAAE,cAAc,SAAU;AAC9B,UAAM,KAAK,QAAQ;AAEnB,QAAI,CAAC,GAAI;AAET,UAAM,MAAM,GAAG,QAAQ,MAAM,IAAI,EAAE,CAAC;AACpC,QAAI,IAAI,SAAS,cAAc,GAAG;AACjC,UAAI,CAAC,oBAAoB,GAAG,EAAG,OAAM,IAAI,MAAM,yBAAyB,GAAG,EAAE;AAC7E,eAAS,IAAI,GAAG;AAAA,IACjB;AAEA,yBAAqB,GAAG,iBAAiB,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS;AAC9D,YAAM,IAAI,IAAI;AAAA,IACf,CAAC;AAAA,EACF;AAEA,SAAO;AAAA,IACN,UAAU,CAAC,GAAG,QAAQ;AAAA,IACtB,OAAO,CAAC,GAAG,KAAK;AAAA,EACjB;AACD;AAMA,SAAS,qBAAqB,OAAiB;AAC9C,QAAM,QAAQ,oBAAI,IAAY;AAC9B,aAAW,QAAQ,OAAO;AACzB,QAAI,KAAK,SAAS,cAAc,GAAG;AAClC,UAAI,CAAC,iBAAiB,IAAI,EAAG,OAAM,IAAI,MAAM,4BAA4B,IAAI,EAAE;AAC/E,YAAM,IAAI,IAAI;AAAA,IACf;AAAA,EACD;AACA,SAAO,CAAC,GAAG,KAAK;AACjB;AAMO,MAAM,eAAe,CAAC,SAAiC,UAAoC;AACjG,aAAW,WAAW,QAAQ,UAAU;AAEvC,QAAI,QAAQ,aAAa,MAAM;AAC9B,UAAI,CAAC,QAAQ,YAAY,KAAK,SAAS,cAAc,EAAG;AACxD,UAAI,CAAC,MAAM,MAAM,QAAQ,YAAY,IAAI;AACxC,cAAM,IAAI,MAAM,iCAAiC,QAAQ,YAAY,IAAI,EAAE;AAC5E,cAAQ,YAAY,OAAO,MAAM,MAAM,QAAQ,YAAY,IAAI;AAAA,IAChE;AAEA,UAAM,KAAK,QAAQ;AACnB,QAAI,CAAC,GAAI;AAET,UAAM,YAAY,GAAG,QAAQ,MAAM,IAAI;AACvC,UAAM,OAAO,UAAU,CAAC;AAExB,QAAI,KAAK,SAAS,cAAc,KAAK,CAAC,MAAM,SAAS,IAAI;AACxD,YAAM,IAAI,MAAM,iCAAiC,IAAI,EAAE;AAExD,cAAU,CAAC,IAAI,MAAM,SAAS,IAAI;AAClC,OAAG,UAAU,UAAU,KAAK,IAAI;AAEhC,UAAM,QAAQ,GAAG;AACjB,QAAI,CAAC,MAAO;AAEZ,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACtC,UAAI,CAAC,MAAM,CAAC,EAAE,SAAS,cAAc,EAAG;AAExC,UAAI,CAAC,MAAM,MAAM,MAAM,CAAC,CAAC,EAAG,OAAM,IAAI,MAAM,iCAAiC,MAAM,CAAC,CAAC,EAAE;AACvF,YAAM,CAAC,IAAI,MAAM,MAAM,MAAM,CAAC,CAAC;AAAA,IAChC;AAEA,OAAG,gBAAgB;AAAA,EACpB;AACD;AAEO,MAAM,iBAAiB,CAC7B,OACA,cAC+B;AAC/B,QAAM,UAAmC,CAAC;AAC1C,QAAM,cAAc,YAAY,MAAM,QAAQ;AAC9C,QAAM,cAAc,YAAY,MAAM,KAAK;AAE3C,aAAW,CAAC,KAAK,IAAI,KAAK,YAAY,QAAQ,GAAG;AAChD,YAAQ,KAAK,EAAE,IAAI,KAAK,MAAM,WAAW,KAAK,CAA0B;AAAA,EACzE;AACA,aAAW,CAAC,KAAK,IAAI,KAAK,YAAY,QAAQ,GAAG;AAChD,YAAQ,KAAK;AAAA,MACZ,IAAI,MAAM,YAAY;AAAA,MACtB,MAAM;AAAA,MACN,MAAM;AAAA,IACP,CAA0B;AAAA,EAC3B;AAEA,SAAO,MAAM,SAAS,SAAS;AAChC;AAEA,MAAM,cAAc,CAAI,QAAkB,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC;AAE1D,MAAM,QAAQ,CAAI,KAAU,SAAwB;AACnD,QAAM,UAAU,CAAC;AACjB,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,MAAM;AAC1C,YAAQ,KAAK,IAAI,MAAM,GAAG,IAAI,IAAI,CAAC;AAAA,EACpC;AACA,SAAO;AACR;",
6
6
  "names": []
7
7
  }
@@ -1,6 +1,6 @@
1
1
  export { formatAddress, formatDigest } from './format.js';
2
2
  export { isValidSuiAddress, isValidSuiObjectId, isValidTransactionDigest, normalizeStructTag, normalizeSuiAddress, normalizeSuiObjectId, parseStructTag, SUI_ADDRESS_LENGTH, } from './sui-types.js';
3
- export { fromB64, toB64, fromHEX, toHEX } from '@mysten/bcs';
3
+ export { fromB64, toB64, fromHEX, toHex, toHEX, fromHex, fromBase64, toBase64, fromBase58, toBase58, } from '@mysten/bcs';
4
4
  export { isValidSuiNSName, normalizeSuiNSName } from './suins.js';
5
5
  export { SUI_DECIMALS, MIST_PER_SUI, MOVE_STDLIB_ADDRESS, SUI_FRAMEWORK_ADDRESS, SUI_SYSTEM_ADDRESS, SUI_CLOCK_OBJECT_ID, SUI_SYSTEM_MODULE_NAME, SUI_TYPE_ARG, SUI_SYSTEM_STATE_OBJECT_ID, } from './constants.js';
6
6
  export { isValidNamedPackage, isValidNamedType } from './move-registry.js';
@@ -9,7 +9,18 @@ import {
9
9
  parseStructTag,
10
10
  SUI_ADDRESS_LENGTH
11
11
  } from "./sui-types.js";
12
- import { fromB64, toB64, fromHEX, toHEX } from "@mysten/bcs";
12
+ import {
13
+ fromB64,
14
+ toB64,
15
+ fromHEX,
16
+ toHex,
17
+ toHEX,
18
+ fromHex,
19
+ fromBase64,
20
+ toBase64,
21
+ fromBase58,
22
+ toBase58
23
+ } from "@mysten/bcs";
13
24
  import { isValidSuiNSName, normalizeSuiNSName } from "./suins.js";
14
25
  import {
15
26
  SUI_DECIMALS,
@@ -37,7 +48,10 @@ export {
37
48
  formatAddress,
38
49
  formatDigest,
39
50
  fromB64,
51
+ fromBase58,
52
+ fromBase64,
40
53
  fromHEX,
54
+ fromHex,
41
55
  isValidNamedPackage,
42
56
  isValidNamedType,
43
57
  isValidSuiAddress,
@@ -50,6 +64,9 @@ export {
50
64
  normalizeSuiObjectId,
51
65
  parseStructTag,
52
66
  toB64,
53
- toHEX
67
+ toBase58,
68
+ toBase64,
69
+ toHEX,
70
+ toHex
54
71
  };
55
72
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/utils/index.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport { formatAddress, formatDigest } from './format.js';\nexport {\n\tisValidSuiAddress,\n\tisValidSuiObjectId,\n\tisValidTransactionDigest,\n\tnormalizeStructTag,\n\tnormalizeSuiAddress,\n\tnormalizeSuiObjectId,\n\tparseStructTag,\n\tSUI_ADDRESS_LENGTH,\n} from './sui-types.js';\n\nexport { fromB64, toB64, fromHEX, toHEX } from '@mysten/bcs';\nexport { isValidSuiNSName, normalizeSuiNSName } from './suins.js';\n\nexport {\n\tSUI_DECIMALS,\n\tMIST_PER_SUI,\n\tMOVE_STDLIB_ADDRESS,\n\tSUI_FRAMEWORK_ADDRESS,\n\tSUI_SYSTEM_ADDRESS,\n\tSUI_CLOCK_OBJECT_ID,\n\tSUI_SYSTEM_MODULE_NAME,\n\tSUI_TYPE_ARG,\n\tSUI_SYSTEM_STATE_OBJECT_ID,\n} from './constants.js';\n\nexport { isValidNamedPackage, isValidNamedType } from './move-registry.js';\n"],
5
- "mappings": "AAGA,SAAS,eAAe,oBAAoB;AAC5C;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,SAAS,SAAS,OAAO,SAAS,aAAa;AAC/C,SAAS,kBAAkB,0BAA0B;AAErD;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,SAAS,qBAAqB,wBAAwB;",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nexport { formatAddress, formatDigest } from './format.js';\nexport {\n\tisValidSuiAddress,\n\tisValidSuiObjectId,\n\tisValidTransactionDigest,\n\tnormalizeStructTag,\n\tnormalizeSuiAddress,\n\tnormalizeSuiObjectId,\n\tparseStructTag,\n\tSUI_ADDRESS_LENGTH,\n} from './sui-types.js';\n\nexport {\n\tfromB64,\n\ttoB64,\n\tfromHEX,\n\ttoHex,\n\ttoHEX,\n\tfromHex,\n\tfromBase64,\n\ttoBase64,\n\tfromBase58,\n\ttoBase58,\n} from '@mysten/bcs';\nexport { isValidSuiNSName, normalizeSuiNSName } from './suins.js';\n\nexport {\n\tSUI_DECIMALS,\n\tMIST_PER_SUI,\n\tMOVE_STDLIB_ADDRESS,\n\tSUI_FRAMEWORK_ADDRESS,\n\tSUI_SYSTEM_ADDRESS,\n\tSUI_CLOCK_OBJECT_ID,\n\tSUI_SYSTEM_MODULE_NAME,\n\tSUI_TYPE_ARG,\n\tSUI_SYSTEM_STATE_OBJECT_ID,\n} from './constants.js';\n\nexport { isValidNamedPackage, isValidNamedType } from './move-registry.js';\n"],
5
+ "mappings": "AAGA,SAAS,eAAe,oBAAoB;AAC5C;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AACP,SAAS,kBAAkB,0BAA0B;AAErD;AAAA,EACC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACM;AAEP,SAAS,qBAAqB,wBAAwB;",
6
6
  "names": []
7
7
  }
@@ -1,11 +1,20 @@
1
- const NAME_PATTERN = /^([a-z0-9]+(?:-[a-z0-9]+)*)@([a-z0-9]+(?:-[a-z0-9]+)*)(?:\/v(\d+))?$/;
1
+ import { isValidSuiNSName } from "./suins.js";
2
+ const NAME_PATTERN = /^([a-z0-9]+(?:-[a-z0-9]+)*)$/;
3
+ const VERSION_REGEX = /^\d+$/;
4
+ const MAX_APP_SIZE = 64;
5
+ const NAME_SEPARATOR = "/";
2
6
  const isValidNamedPackage = (name) => {
3
- return NAME_PATTERN.test(name);
7
+ const parts = name.split(NAME_SEPARATOR);
8
+ if (parts.length < 2 || parts.length > 3) return false;
9
+ const [org, app, version] = parts;
10
+ if (version !== void 0 && !VERSION_REGEX.test(version)) return false;
11
+ if (!isValidSuiNSName(org)) return false;
12
+ return NAME_PATTERN.test(app) && app.length < MAX_APP_SIZE;
4
13
  };
5
14
  const isValidNamedType = (type) => {
6
15
  const splitType = type.split(/::|<|>|,/);
7
16
  for (const t of splitType) {
8
- if (t.includes("@") && !isValidNamedPackage(t)) return false;
17
+ if (t.includes(NAME_SEPARATOR) && !isValidNamedPackage(t)) return false;
9
18
  }
10
19
  return true;
11
20
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/utils/move-registry.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\n/** The pattern to find an optionally versioned name */\nconst NAME_PATTERN = /^([a-z0-9]+(?:-[a-z0-9]+)*)@([a-z0-9]+(?:-[a-z0-9]+)*)(?:\\/v(\\d+))?$/;\n\nexport const isValidNamedPackage = (name: string): boolean => {\n\treturn NAME_PATTERN.test(name);\n};\n\n/**\n * Checks if a type contains valid named packages.\n * This DOES NOT check if the type is a valid Move type.\n */\nexport const isValidNamedType = (type: string): boolean => {\n\t// split our type by all possible type delimeters.\n\tconst splitType = type.split(/::|<|>|,/);\n\tfor (const t of splitType) {\n\t\tif (t.includes('@') && !isValidNamedPackage(t)) return false;\n\t}\n\t// TODO: Add `isValidStructTag` check once\n\t// it's generally introduced.\n\treturn true;\n};\n"],
5
- "mappings": "AAIA,MAAM,eAAe;AAEd,MAAM,sBAAsB,CAAC,SAA0B;AAC7D,SAAO,aAAa,KAAK,IAAI;AAC9B;AAMO,MAAM,mBAAmB,CAAC,SAA0B;AAE1D,QAAM,YAAY,KAAK,MAAM,UAAU;AACvC,aAAW,KAAK,WAAW;AAC1B,QAAI,EAAE,SAAS,GAAG,KAAK,CAAC,oBAAoB,CAAC,EAAG,QAAO;AAAA,EACxD;AAGA,SAAO;AACR;",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { isValidSuiNSName } from './suins.js';\n\n/** The pattern to find an optionally versioned name */\nconst NAME_PATTERN = /^([a-z0-9]+(?:-[a-z0-9]+)*)$/;\n/** The pattern for a valid version number */\nconst VERSION_REGEX = /^\\d+$/;\n/** The maximum size for an app */\nconst MAX_APP_SIZE = 64;\n/** The separator for the name */\nconst NAME_SEPARATOR = '/';\n\nexport const isValidNamedPackage = (name: string): boolean => {\n\tconst parts = name.split(NAME_SEPARATOR);\n\t// The name has to have 2 parts (without-version), or 3 parts (with version).\n\tif (parts.length < 2 || parts.length > 3) return false;\n\n\tconst [org, app, version] = parts; // split by {org} {app} {optional version}\n\n\t// If the version exists, it must be a number.\n\tif (version !== undefined && !VERSION_REGEX.test(version)) return false;\n\t// Check if the org is a valid SuiNS name.\n\tif (!isValidSuiNSName(org)) return false;\n\n\t// Check if the app is a valid name.\n\treturn NAME_PATTERN.test(app) && app.length < MAX_APP_SIZE;\n};\n\n/**\n * Checks if a type contains valid named packages.\n * This DOES NOT check if the type is a valid Move type.\n */\nexport const isValidNamedType = (type: string): boolean => {\n\t// split our type by all possible type delimeters.\n\tconst splitType = type.split(/::|<|>|,/);\n\tfor (const t of splitType) {\n\t\tif (t.includes(NAME_SEPARATOR) && !isValidNamedPackage(t)) return false;\n\t}\n\t// TODO: Add `isValidStructTag` check once it's introduced.\n\treturn true;\n};\n"],
5
+ "mappings": "AAGA,SAAS,wBAAwB;AAGjC,MAAM,eAAe;AAErB,MAAM,gBAAgB;AAEtB,MAAM,eAAe;AAErB,MAAM,iBAAiB;AAEhB,MAAM,sBAAsB,CAAC,SAA0B;AAC7D,QAAM,QAAQ,KAAK,MAAM,cAAc;AAEvC,MAAI,MAAM,SAAS,KAAK,MAAM,SAAS,EAAG,QAAO;AAEjD,QAAM,CAAC,KAAK,KAAK,OAAO,IAAI;AAG5B,MAAI,YAAY,UAAa,CAAC,cAAc,KAAK,OAAO,EAAG,QAAO;AAElE,MAAI,CAAC,iBAAiB,GAAG,EAAG,QAAO;AAGnC,SAAO,aAAa,KAAK,GAAG,KAAK,IAAI,SAAS;AAC/C;AAMO,MAAM,mBAAmB,CAAC,SAA0B;AAE1D,QAAM,YAAY,KAAK,MAAM,UAAU;AACvC,aAAW,KAAK,WAAW;AAC1B,QAAI,EAAE,SAAS,cAAc,KAAK,CAAC,oBAAoB,CAAC,EAAG,QAAO;AAAA,EACnE;AAEA,SAAO;AACR;",
6
6
  "names": []
7
7
  }
@@ -1,8 +1,8 @@
1
- import { fromB58, splitGenericParameters } from "@mysten/bcs";
1
+ import { fromBase58, splitGenericParameters } from "@mysten/bcs";
2
2
  const TX_DIGEST_LENGTH = 32;
3
3
  function isValidTransactionDigest(value) {
4
4
  try {
5
- const buffer = fromB58(value);
5
+ const buffer = fromBase58(value);
6
6
  return buffer.length === TX_DIGEST_LENGTH;
7
7
  } catch (e) {
8
8
  return false;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/utils/sui-types.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromB58, splitGenericParameters } from '@mysten/bcs';\n\nconst TX_DIGEST_LENGTH = 32;\n\n/** Returns whether the tx digest is valid based on the serialization format */\nexport function isValidTransactionDigest(value: string): value is string {\n\ttry {\n\t\tconst buffer = fromB58(value);\n\t\treturn buffer.length === TX_DIGEST_LENGTH;\n\t} catch (e) {\n\t\treturn false;\n\t}\n}\n\n// TODO - can we automatically sync this with rust length definition?\n// Source of truth is\n// https://github.com/MystenLabs/sui/blob/acb2b97ae21f47600e05b0d28127d88d0725561d/crates/sui-types/src/base_types.rs#L67\n// which uses the Move account address length\n// https://github.com/move-language/move/blob/67ec40dc50c66c34fd73512fcc412f3b68d67235/language/move-core/types/src/account_address.rs#L23 .\n\nexport const SUI_ADDRESS_LENGTH = 32;\nexport function isValidSuiAddress(value: string): value is string {\n\treturn isHex(value) && getHexByteLength(value) === SUI_ADDRESS_LENGTH;\n}\n\nexport function isValidSuiObjectId(value: string): boolean {\n\treturn isValidSuiAddress(value);\n}\n\ntype StructTag = {\n\taddress: string;\n\tmodule: string;\n\tname: string;\n\ttypeParams: (string | StructTag)[];\n};\n\nfunction parseTypeTag(type: string): string | StructTag {\n\tif (!type.includes('::')) return type;\n\n\treturn parseStructTag(type);\n}\n\nexport function parseStructTag(type: string): StructTag {\n\tconst [address, module] = type.split('::');\n\n\tconst rest = type.slice(address.length + module.length + 4);\n\tconst name = rest.includes('<') ? rest.slice(0, rest.indexOf('<')) : rest;\n\tconst typeParams = rest.includes('<')\n\t\t? splitGenericParameters(rest.slice(rest.indexOf('<') + 1, rest.lastIndexOf('>'))).map(\n\t\t\t\t(typeParam) => parseTypeTag(typeParam.trim()),\n\t\t\t)\n\t\t: [];\n\n\treturn {\n\t\taddress: normalizeSuiAddress(address),\n\t\tmodule,\n\t\tname,\n\t\ttypeParams,\n\t};\n}\n\nexport function normalizeStructTag(type: string | StructTag): string {\n\tconst { address, module, name, typeParams } =\n\t\ttypeof type === 'string' ? parseStructTag(type) : type;\n\n\tconst formattedTypeParams =\n\t\ttypeParams?.length > 0\n\t\t\t? `<${typeParams\n\t\t\t\t\t.map((typeParam) =>\n\t\t\t\t\t\ttypeof typeParam === 'string' ? typeParam : normalizeStructTag(typeParam),\n\t\t\t\t\t)\n\t\t\t\t\t.join(',')}>`\n\t\t\t: '';\n\n\treturn `${address}::${module}::${name}${formattedTypeParams}`;\n}\n\n/**\n * Perform the following operations:\n * 1. Make the address lower case\n * 2. Prepend `0x` if the string does not start with `0x`.\n * 3. Add more zeros if the length of the address(excluding `0x`) is less than `SUI_ADDRESS_LENGTH`\n *\n * WARNING: if the address value itself starts with `0x`, e.g., `0x0x`, the default behavior\n * is to treat the first `0x` not as part of the address. The default behavior can be overridden by\n * setting `forceAdd0x` to true\n *\n */\nexport function normalizeSuiAddress(value: string, forceAdd0x: boolean = false): string {\n\tlet address = value.toLowerCase();\n\tif (!forceAdd0x && address.startsWith('0x')) {\n\t\taddress = address.slice(2);\n\t}\n\treturn `0x${address.padStart(SUI_ADDRESS_LENGTH * 2, '0')}`;\n}\n\nexport function normalizeSuiObjectId(value: string, forceAdd0x: boolean = false): string {\n\treturn normalizeSuiAddress(value, forceAdd0x);\n}\n\nfunction isHex(value: string): boolean {\n\treturn /^(0x|0X)?[a-fA-F0-9]+$/.test(value) && value.length % 2 === 0;\n}\n\nfunction getHexByteLength(value: string): number {\n\treturn /^(0x|0X)/.test(value) ? (value.length - 2) / 2 : value.length / 2;\n}\n"],
5
- "mappings": "AAGA,SAAS,SAAS,8BAA8B;AAEhD,MAAM,mBAAmB;AAGlB,SAAS,yBAAyB,OAAgC;AACxE,MAAI;AACH,UAAM,SAAS,QAAQ,KAAK;AAC5B,WAAO,OAAO,WAAW;AAAA,EAC1B,SAAS,GAAG;AACX,WAAO;AAAA,EACR;AACD;AAQO,MAAM,qBAAqB;AAC3B,SAAS,kBAAkB,OAAgC;AACjE,SAAO,MAAM,KAAK,KAAK,iBAAiB,KAAK,MAAM;AACpD;AAEO,SAAS,mBAAmB,OAAwB;AAC1D,SAAO,kBAAkB,KAAK;AAC/B;AASA,SAAS,aAAa,MAAkC;AACvD,MAAI,CAAC,KAAK,SAAS,IAAI,EAAG,QAAO;AAEjC,SAAO,eAAe,IAAI;AAC3B;AAEO,SAAS,eAAe,MAAyB;AACvD,QAAM,CAAC,SAAS,MAAM,IAAI,KAAK,MAAM,IAAI;AAEzC,QAAM,OAAO,KAAK,MAAM,QAAQ,SAAS,OAAO,SAAS,CAAC;AAC1D,QAAM,OAAO,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,KAAK,QAAQ,GAAG,CAAC,IAAI;AACrE,QAAM,aAAa,KAAK,SAAS,GAAG,IACjC,uBAAuB,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAI,GAAG,KAAK,YAAY,GAAG,CAAC,CAAC,EAAE;AAAA,IACjF,CAAC,cAAc,aAAa,UAAU,KAAK,CAAC;AAAA,EAC7C,IACC,CAAC;AAEJ,SAAO;AAAA,IACN,SAAS,oBAAoB,OAAO;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAEO,SAAS,mBAAmB,MAAkC;AACpE,QAAM,EAAE,SAAS,QAAQ,MAAM,WAAW,IACzC,OAAO,SAAS,WAAW,eAAe,IAAI,IAAI;AAEnD,QAAM,sBACL,YAAY,SAAS,IAClB,IAAI,WACH;AAAA,IAAI,CAAC,cACL,OAAO,cAAc,WAAW,YAAY,mBAAmB,SAAS;AAAA,EACzE,EACC,KAAK,GAAG,CAAC,MACV;AAEJ,SAAO,GAAG,OAAO,KAAK,MAAM,KAAK,IAAI,GAAG,mBAAmB;AAC5D;AAaO,SAAS,oBAAoB,OAAe,aAAsB,OAAe;AACvF,MAAI,UAAU,MAAM,YAAY;AAChC,MAAI,CAAC,cAAc,QAAQ,WAAW,IAAI,GAAG;AAC5C,cAAU,QAAQ,MAAM,CAAC;AAAA,EAC1B;AACA,SAAO,KAAK,QAAQ,SAAS,qBAAqB,GAAG,GAAG,CAAC;AAC1D;AAEO,SAAS,qBAAqB,OAAe,aAAsB,OAAe;AACxF,SAAO,oBAAoB,OAAO,UAAU;AAC7C;AAEA,SAAS,MAAM,OAAwB;AACtC,SAAO,yBAAyB,KAAK,KAAK,KAAK,MAAM,SAAS,MAAM;AACrE;AAEA,SAAS,iBAAiB,OAAuB;AAChD,SAAO,WAAW,KAAK,KAAK,KAAK,MAAM,SAAS,KAAK,IAAI,MAAM,SAAS;AACzE;",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase58, splitGenericParameters } from '@mysten/bcs';\n\nconst TX_DIGEST_LENGTH = 32;\n\n/** Returns whether the tx digest is valid based on the serialization format */\nexport function isValidTransactionDigest(value: string): value is string {\n\ttry {\n\t\tconst buffer = fromBase58(value);\n\t\treturn buffer.length === TX_DIGEST_LENGTH;\n\t} catch (e) {\n\t\treturn false;\n\t}\n}\n\n// TODO - can we automatically sync this with rust length definition?\n// Source of truth is\n// https://github.com/MystenLabs/sui/blob/acb2b97ae21f47600e05b0d28127d88d0725561d/crates/sui-types/src/base_types.rs#L67\n// which uses the Move account address length\n// https://github.com/move-language/move/blob/67ec40dc50c66c34fd73512fcc412f3b68d67235/language/move-core/types/src/account_address.rs#L23 .\n\nexport const SUI_ADDRESS_LENGTH = 32;\nexport function isValidSuiAddress(value: string): value is string {\n\treturn isHex(value) && getHexByteLength(value) === SUI_ADDRESS_LENGTH;\n}\n\nexport function isValidSuiObjectId(value: string): boolean {\n\treturn isValidSuiAddress(value);\n}\n\ntype StructTag = {\n\taddress: string;\n\tmodule: string;\n\tname: string;\n\ttypeParams: (string | StructTag)[];\n};\n\nfunction parseTypeTag(type: string): string | StructTag {\n\tif (!type.includes('::')) return type;\n\n\treturn parseStructTag(type);\n}\n\nexport function parseStructTag(type: string): StructTag {\n\tconst [address, module] = type.split('::');\n\n\tconst rest = type.slice(address.length + module.length + 4);\n\tconst name = rest.includes('<') ? rest.slice(0, rest.indexOf('<')) : rest;\n\tconst typeParams = rest.includes('<')\n\t\t? splitGenericParameters(rest.slice(rest.indexOf('<') + 1, rest.lastIndexOf('>'))).map(\n\t\t\t\t(typeParam) => parseTypeTag(typeParam.trim()),\n\t\t\t)\n\t\t: [];\n\n\treturn {\n\t\taddress: normalizeSuiAddress(address),\n\t\tmodule,\n\t\tname,\n\t\ttypeParams,\n\t};\n}\n\nexport function normalizeStructTag(type: string | StructTag): string {\n\tconst { address, module, name, typeParams } =\n\t\ttypeof type === 'string' ? parseStructTag(type) : type;\n\n\tconst formattedTypeParams =\n\t\ttypeParams?.length > 0\n\t\t\t? `<${typeParams\n\t\t\t\t\t.map((typeParam) =>\n\t\t\t\t\t\ttypeof typeParam === 'string' ? typeParam : normalizeStructTag(typeParam),\n\t\t\t\t\t)\n\t\t\t\t\t.join(',')}>`\n\t\t\t: '';\n\n\treturn `${address}::${module}::${name}${formattedTypeParams}`;\n}\n\n/**\n * Perform the following operations:\n * 1. Make the address lower case\n * 2. Prepend `0x` if the string does not start with `0x`.\n * 3. Add more zeros if the length of the address(excluding `0x`) is less than `SUI_ADDRESS_LENGTH`\n *\n * WARNING: if the address value itself starts with `0x`, e.g., `0x0x`, the default behavior\n * is to treat the first `0x` not as part of the address. The default behavior can be overridden by\n * setting `forceAdd0x` to true\n *\n */\nexport function normalizeSuiAddress(value: string, forceAdd0x: boolean = false): string {\n\tlet address = value.toLowerCase();\n\tif (!forceAdd0x && address.startsWith('0x')) {\n\t\taddress = address.slice(2);\n\t}\n\treturn `0x${address.padStart(SUI_ADDRESS_LENGTH * 2, '0')}`;\n}\n\nexport function normalizeSuiObjectId(value: string, forceAdd0x: boolean = false): string {\n\treturn normalizeSuiAddress(value, forceAdd0x);\n}\n\nfunction isHex(value: string): boolean {\n\treturn /^(0x|0X)?[a-fA-F0-9]+$/.test(value) && value.length % 2 === 0;\n}\n\nfunction getHexByteLength(value: string): number {\n\treturn /^(0x|0X)/.test(value) ? (value.length - 2) / 2 : value.length / 2;\n}\n"],
5
+ "mappings": "AAGA,SAAS,YAAY,8BAA8B;AAEnD,MAAM,mBAAmB;AAGlB,SAAS,yBAAyB,OAAgC;AACxE,MAAI;AACH,UAAM,SAAS,WAAW,KAAK;AAC/B,WAAO,OAAO,WAAW;AAAA,EAC1B,SAAS,GAAG;AACX,WAAO;AAAA,EACR;AACD;AAQO,MAAM,qBAAqB;AAC3B,SAAS,kBAAkB,OAAgC;AACjE,SAAO,MAAM,KAAK,KAAK,iBAAiB,KAAK,MAAM;AACpD;AAEO,SAAS,mBAAmB,OAAwB;AAC1D,SAAO,kBAAkB,KAAK;AAC/B;AASA,SAAS,aAAa,MAAkC;AACvD,MAAI,CAAC,KAAK,SAAS,IAAI,EAAG,QAAO;AAEjC,SAAO,eAAe,IAAI;AAC3B;AAEO,SAAS,eAAe,MAAyB;AACvD,QAAM,CAAC,SAAS,MAAM,IAAI,KAAK,MAAM,IAAI;AAEzC,QAAM,OAAO,KAAK,MAAM,QAAQ,SAAS,OAAO,SAAS,CAAC;AAC1D,QAAM,OAAO,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,KAAK,QAAQ,GAAG,CAAC,IAAI;AACrE,QAAM,aAAa,KAAK,SAAS,GAAG,IACjC,uBAAuB,KAAK,MAAM,KAAK,QAAQ,GAAG,IAAI,GAAG,KAAK,YAAY,GAAG,CAAC,CAAC,EAAE;AAAA,IACjF,CAAC,cAAc,aAAa,UAAU,KAAK,CAAC;AAAA,EAC7C,IACC,CAAC;AAEJ,SAAO;AAAA,IACN,SAAS,oBAAoB,OAAO;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAEO,SAAS,mBAAmB,MAAkC;AACpE,QAAM,EAAE,SAAS,QAAQ,MAAM,WAAW,IACzC,OAAO,SAAS,WAAW,eAAe,IAAI,IAAI;AAEnD,QAAM,sBACL,YAAY,SAAS,IAClB,IAAI,WACH;AAAA,IAAI,CAAC,cACL,OAAO,cAAc,WAAW,YAAY,mBAAmB,SAAS;AAAA,EACzE,EACC,KAAK,GAAG,CAAC,MACV;AAEJ,SAAO,GAAG,OAAO,KAAK,MAAM,KAAK,IAAI,GAAG,mBAAmB;AAC5D;AAaO,SAAS,oBAAoB,OAAe,aAAsB,OAAe;AACvF,MAAI,UAAU,MAAM,YAAY;AAChC,MAAI,CAAC,cAAc,QAAQ,WAAW,IAAI,GAAG;AAC5C,cAAU,QAAQ,MAAM,CAAC;AAAA,EAC1B;AACA,SAAO,KAAK,QAAQ,SAAS,qBAAqB,GAAG,GAAG,CAAC;AAC1D;AAEO,SAAS,qBAAqB,OAAe,aAAsB,OAAe;AACxF,SAAO,oBAAoB,OAAO,UAAU;AAC7C;AAEA,SAAS,MAAM,OAAwB;AACtC,SAAO,yBAAyB,KAAK,KAAK,KAAK,MAAM,SAAS,MAAM;AACrE;AAEA,SAAS,iBAAiB,OAAuB;AAChD,SAAO,WAAW,KAAK,KAAK,KAAK,MAAM,SAAS,KAAK,IAAI,MAAM,SAAS;AACzE;",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,4 @@
1
- import { fromB64 } from "@mysten/bcs";
1
+ import { fromBase64 } from "@mysten/bcs";
2
2
  import { parseSerializedSignature, SIGNATURE_FLAG_TO_SCHEME } from "../cryptography/index.js";
3
3
  import { Ed25519PublicKey } from "../keypairs/ed25519/publickey.js";
4
4
  import { Secp256k1PublicKey } from "../keypairs/secp256k1/publickey.js";
@@ -67,7 +67,7 @@ function publicKeyFromRawBytes(signatureScheme, bytes, options = {}) {
67
67
  }
68
68
  }
69
69
  function publicKeyFromSuiBytes(publicKey, options = {}) {
70
- const bytes = typeof publicKey === "string" ? fromB64(publicKey) : publicKey;
70
+ const bytes = typeof publicKey === "string" ? fromBase64(publicKey) : publicKey;
71
71
  const signatureScheme = SIGNATURE_FLAG_TO_SCHEME[bytes[0]];
72
72
  return publicKeyFromRawBytes(signatureScheme, bytes.slice(1), options);
73
73
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/verify/verify.ts"],
4
- "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromB64 } from '@mysten/bcs';\n\nimport type { PublicKey, SignatureFlag, SignatureScheme } from '../cryptography/index.js';\nimport { parseSerializedSignature, SIGNATURE_FLAG_TO_SCHEME } from '../cryptography/index.js';\nimport type { SuiGraphQLClient } from '../graphql/client.js';\nimport { Ed25519PublicKey } from '../keypairs/ed25519/publickey.js';\nimport { Secp256k1PublicKey } from '../keypairs/secp256k1/publickey.js';\nimport { Secp256r1PublicKey } from '../keypairs/secp256r1/publickey.js';\n// eslint-disable-next-line import/no-cycle\nimport { MultiSigPublicKey } from '../multisig/publickey.js';\nimport { ZkLoginPublicIdentifier } from '../zklogin/publickey.js';\n\nexport async function verifySignature(bytes: Uint8Array, signature: string): Promise<PublicKey> {\n\tconst parsedSignature = parseSignature(signature);\n\n\tif (!(await parsedSignature.publicKey.verify(bytes, parsedSignature.serializedSignature))) {\n\t\tthrow new Error(`Signature is not valid for the provided data`);\n\t}\n\n\treturn parsedSignature.publicKey;\n}\n\nexport async function verifyPersonalMessageSignature(\n\tmessage: Uint8Array,\n\tsignature: string,\n\toptions: { client?: SuiGraphQLClient } = {},\n): Promise<PublicKey> {\n\tconst parsedSignature = parseSignature(signature, options);\n\n\tif (\n\t\t!(await parsedSignature.publicKey.verifyPersonalMessage(\n\t\t\tmessage,\n\t\t\tparsedSignature.serializedSignature,\n\t\t))\n\t) {\n\t\tthrow new Error(`Signature is not valid for the provided message`);\n\t}\n\n\treturn parsedSignature.publicKey;\n}\n\nexport async function verifyTransactionSignature(\n\ttransaction: Uint8Array,\n\tsignature: string,\n\toptions: { client?: SuiGraphQLClient } = {},\n): Promise<PublicKey> {\n\tconst parsedSignature = parseSignature(signature, options);\n\n\tif (\n\t\t!(await parsedSignature.publicKey.verifyTransaction(\n\t\t\ttransaction,\n\t\t\tparsedSignature.serializedSignature,\n\t\t))\n\t) {\n\t\tthrow new Error(`Signature is not valid for the provided Transaction`);\n\t}\n\n\treturn parsedSignature.publicKey;\n}\n\nfunction parseSignature(signature: string, options: { client?: SuiGraphQLClient } = {}) {\n\tconst parsedSignature = parseSerializedSignature(signature);\n\n\tif (parsedSignature.signatureScheme === 'MultiSig') {\n\t\treturn {\n\t\t\t...parsedSignature,\n\t\t\tpublicKey: new MultiSigPublicKey(parsedSignature.multisig.multisig_pk),\n\t\t};\n\t}\n\n\tconst publicKey = publicKeyFromRawBytes(\n\t\tparsedSignature.signatureScheme,\n\t\tparsedSignature.publicKey,\n\t\toptions,\n\t);\n\treturn {\n\t\t...parsedSignature,\n\t\tpublicKey,\n\t};\n}\n\nexport function publicKeyFromRawBytes(\n\tsignatureScheme: SignatureScheme,\n\tbytes: Uint8Array,\n\toptions: { client?: SuiGraphQLClient } = {},\n): PublicKey {\n\tswitch (signatureScheme) {\n\t\tcase 'ED25519':\n\t\t\treturn new Ed25519PublicKey(bytes);\n\t\tcase 'Secp256k1':\n\t\t\treturn new Secp256k1PublicKey(bytes);\n\t\tcase 'Secp256r1':\n\t\t\treturn new Secp256r1PublicKey(bytes);\n\t\tcase 'MultiSig':\n\t\t\treturn new MultiSigPublicKey(bytes);\n\t\tcase 'ZkLogin':\n\t\t\treturn new ZkLoginPublicIdentifier(bytes, options);\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported signature scheme ${signatureScheme}`);\n\t}\n}\n\nexport function publicKeyFromSuiBytes(\n\tpublicKey: string | Uint8Array,\n\toptions: { client?: SuiGraphQLClient } = {},\n) {\n\tconst bytes = typeof publicKey === 'string' ? fromB64(publicKey) : publicKey;\n\n\tconst signatureScheme = SIGNATURE_FLAG_TO_SCHEME[bytes[0] as SignatureFlag];\n\n\treturn publicKeyFromRawBytes(signatureScheme, bytes.slice(1), options);\n}\n"],
5
- "mappings": "AAGA,SAAS,eAAe;AAGxB,SAAS,0BAA0B,gCAAgC;AAEnE,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AACnC,SAAS,0BAA0B;AAEnC,SAAS,yBAAyB;AAClC,SAAS,+BAA+B;AAExC,eAAsB,gBAAgB,OAAmB,WAAuC;AAC/F,QAAM,kBAAkB,eAAe,SAAS;AAEhD,MAAI,CAAE,MAAM,gBAAgB,UAAU,OAAO,OAAO,gBAAgB,mBAAmB,GAAI;AAC1F,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAC/D;AAEA,SAAO,gBAAgB;AACxB;AAEA,eAAsB,+BACrB,SACA,WACA,UAAyC,CAAC,GACrB;AACrB,QAAM,kBAAkB,eAAe,WAAW,OAAO;AAEzD,MACC,CAAE,MAAM,gBAAgB,UAAU;AAAA,IACjC;AAAA,IACA,gBAAgB;AAAA,EACjB,GACC;AACD,UAAM,IAAI,MAAM,iDAAiD;AAAA,EAClE;AAEA,SAAO,gBAAgB;AACxB;AAEA,eAAsB,2BACrB,aACA,WACA,UAAyC,CAAC,GACrB;AACrB,QAAM,kBAAkB,eAAe,WAAW,OAAO;AAEzD,MACC,CAAE,MAAM,gBAAgB,UAAU;AAAA,IACjC;AAAA,IACA,gBAAgB;AAAA,EACjB,GACC;AACD,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACtE;AAEA,SAAO,gBAAgB;AACxB;AAEA,SAAS,eAAe,WAAmB,UAAyC,CAAC,GAAG;AACvF,QAAM,kBAAkB,yBAAyB,SAAS;AAE1D,MAAI,gBAAgB,oBAAoB,YAAY;AACnD,WAAO;AAAA,MACN,GAAG;AAAA,MACH,WAAW,IAAI,kBAAkB,gBAAgB,SAAS,WAAW;AAAA,IACtE;AAAA,EACD;AAEA,QAAM,YAAY;AAAA,IACjB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB;AAAA,EACD;AACA,SAAO;AAAA,IACN,GAAG;AAAA,IACH;AAAA,EACD;AACD;AAEO,SAAS,sBACf,iBACA,OACA,UAAyC,CAAC,GAC9B;AACZ,UAAQ,iBAAiB;AAAA,IACxB,KAAK;AACJ,aAAO,IAAI,iBAAiB,KAAK;AAAA,IAClC,KAAK;AACJ,aAAO,IAAI,mBAAmB,KAAK;AAAA,IACpC,KAAK;AACJ,aAAO,IAAI,mBAAmB,KAAK;AAAA,IACpC,KAAK;AACJ,aAAO,IAAI,kBAAkB,KAAK;AAAA,IACnC,KAAK;AACJ,aAAO,IAAI,wBAAwB,OAAO,OAAO;AAAA,IAClD;AACC,YAAM,IAAI,MAAM,gCAAgC,eAAe,EAAE;AAAA,EACnE;AACD;AAEO,SAAS,sBACf,WACA,UAAyC,CAAC,GACzC;AACD,QAAM,QAAQ,OAAO,cAAc,WAAW,QAAQ,SAAS,IAAI;AAEnE,QAAM,kBAAkB,yBAAyB,MAAM,CAAC,CAAkB;AAE1E,SAAO,sBAAsB,iBAAiB,MAAM,MAAM,CAAC,GAAG,OAAO;AACtE;",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { fromBase64 } from '@mysten/bcs';\n\nimport type { PublicKey, SignatureFlag, SignatureScheme } from '../cryptography/index.js';\nimport { parseSerializedSignature, SIGNATURE_FLAG_TO_SCHEME } from '../cryptography/index.js';\nimport type { SuiGraphQLClient } from '../graphql/client.js';\nimport { Ed25519PublicKey } from '../keypairs/ed25519/publickey.js';\nimport { Secp256k1PublicKey } from '../keypairs/secp256k1/publickey.js';\nimport { Secp256r1PublicKey } from '../keypairs/secp256r1/publickey.js';\n// eslint-disable-next-line import/no-cycle\nimport { MultiSigPublicKey } from '../multisig/publickey.js';\nimport { ZkLoginPublicIdentifier } from '../zklogin/publickey.js';\n\nexport async function verifySignature(bytes: Uint8Array, signature: string): Promise<PublicKey> {\n\tconst parsedSignature = parseSignature(signature);\n\n\tif (!(await parsedSignature.publicKey.verify(bytes, parsedSignature.serializedSignature))) {\n\t\tthrow new Error(`Signature is not valid for the provided data`);\n\t}\n\n\treturn parsedSignature.publicKey;\n}\n\nexport async function verifyPersonalMessageSignature(\n\tmessage: Uint8Array,\n\tsignature: string,\n\toptions: { client?: SuiGraphQLClient } = {},\n): Promise<PublicKey> {\n\tconst parsedSignature = parseSignature(signature, options);\n\n\tif (\n\t\t!(await parsedSignature.publicKey.verifyPersonalMessage(\n\t\t\tmessage,\n\t\t\tparsedSignature.serializedSignature,\n\t\t))\n\t) {\n\t\tthrow new Error(`Signature is not valid for the provided message`);\n\t}\n\n\treturn parsedSignature.publicKey;\n}\n\nexport async function verifyTransactionSignature(\n\ttransaction: Uint8Array,\n\tsignature: string,\n\toptions: { client?: SuiGraphQLClient } = {},\n): Promise<PublicKey> {\n\tconst parsedSignature = parseSignature(signature, options);\n\n\tif (\n\t\t!(await parsedSignature.publicKey.verifyTransaction(\n\t\t\ttransaction,\n\t\t\tparsedSignature.serializedSignature,\n\t\t))\n\t) {\n\t\tthrow new Error(`Signature is not valid for the provided Transaction`);\n\t}\n\n\treturn parsedSignature.publicKey;\n}\n\nfunction parseSignature(signature: string, options: { client?: SuiGraphQLClient } = {}) {\n\tconst parsedSignature = parseSerializedSignature(signature);\n\n\tif (parsedSignature.signatureScheme === 'MultiSig') {\n\t\treturn {\n\t\t\t...parsedSignature,\n\t\t\tpublicKey: new MultiSigPublicKey(parsedSignature.multisig.multisig_pk),\n\t\t};\n\t}\n\n\tconst publicKey = publicKeyFromRawBytes(\n\t\tparsedSignature.signatureScheme,\n\t\tparsedSignature.publicKey,\n\t\toptions,\n\t);\n\treturn {\n\t\t...parsedSignature,\n\t\tpublicKey,\n\t};\n}\n\nexport function publicKeyFromRawBytes(\n\tsignatureScheme: SignatureScheme,\n\tbytes: Uint8Array,\n\toptions: { client?: SuiGraphQLClient } = {},\n): PublicKey {\n\tswitch (signatureScheme) {\n\t\tcase 'ED25519':\n\t\t\treturn new Ed25519PublicKey(bytes);\n\t\tcase 'Secp256k1':\n\t\t\treturn new Secp256k1PublicKey(bytes);\n\t\tcase 'Secp256r1':\n\t\t\treturn new Secp256r1PublicKey(bytes);\n\t\tcase 'MultiSig':\n\t\t\treturn new MultiSigPublicKey(bytes);\n\t\tcase 'ZkLogin':\n\t\t\treturn new ZkLoginPublicIdentifier(bytes, options);\n\t\tdefault:\n\t\t\tthrow new Error(`Unsupported signature scheme ${signatureScheme}`);\n\t}\n}\n\nexport function publicKeyFromSuiBytes(\n\tpublicKey: string | Uint8Array,\n\toptions: { client?: SuiGraphQLClient } = {},\n) {\n\tconst bytes = typeof publicKey === 'string' ? fromBase64(publicKey) : publicKey;\n\n\tconst signatureScheme = SIGNATURE_FLAG_TO_SCHEME[bytes[0] as SignatureFlag];\n\n\treturn publicKeyFromRawBytes(signatureScheme, bytes.slice(1), options);\n}\n"],
5
+ "mappings": "AAGA,SAAS,kBAAkB;AAG3B,SAAS,0BAA0B,gCAAgC;AAEnE,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AACnC,SAAS,0BAA0B;AAEnC,SAAS,yBAAyB;AAClC,SAAS,+BAA+B;AAExC,eAAsB,gBAAgB,OAAmB,WAAuC;AAC/F,QAAM,kBAAkB,eAAe,SAAS;AAEhD,MAAI,CAAE,MAAM,gBAAgB,UAAU,OAAO,OAAO,gBAAgB,mBAAmB,GAAI;AAC1F,UAAM,IAAI,MAAM,8CAA8C;AAAA,EAC/D;AAEA,SAAO,gBAAgB;AACxB;AAEA,eAAsB,+BACrB,SACA,WACA,UAAyC,CAAC,GACrB;AACrB,QAAM,kBAAkB,eAAe,WAAW,OAAO;AAEzD,MACC,CAAE,MAAM,gBAAgB,UAAU;AAAA,IACjC;AAAA,IACA,gBAAgB;AAAA,EACjB,GACC;AACD,UAAM,IAAI,MAAM,iDAAiD;AAAA,EAClE;AAEA,SAAO,gBAAgB;AACxB;AAEA,eAAsB,2BACrB,aACA,WACA,UAAyC,CAAC,GACrB;AACrB,QAAM,kBAAkB,eAAe,WAAW,OAAO;AAEzD,MACC,CAAE,MAAM,gBAAgB,UAAU;AAAA,IACjC;AAAA,IACA,gBAAgB;AAAA,EACjB,GACC;AACD,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACtE;AAEA,SAAO,gBAAgB;AACxB;AAEA,SAAS,eAAe,WAAmB,UAAyC,CAAC,GAAG;AACvF,QAAM,kBAAkB,yBAAyB,SAAS;AAE1D,MAAI,gBAAgB,oBAAoB,YAAY;AACnD,WAAO;AAAA,MACN,GAAG;AAAA,MACH,WAAW,IAAI,kBAAkB,gBAAgB,SAAS,WAAW;AAAA,IACtE;AAAA,EACD;AAEA,QAAM,YAAY;AAAA,IACjB,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB;AAAA,EACD;AACA,SAAO;AAAA,IACN,GAAG;AAAA,IACH;AAAA,EACD;AACD;AAEO,SAAS,sBACf,iBACA,OACA,UAAyC,CAAC,GAC9B;AACZ,UAAQ,iBAAiB;AAAA,IACxB,KAAK;AACJ,aAAO,IAAI,iBAAiB,KAAK;AAAA,IAClC,KAAK;AACJ,aAAO,IAAI,mBAAmB,KAAK;AAAA,IACpC,KAAK;AACJ,aAAO,IAAI,mBAAmB,KAAK;AAAA,IACpC,KAAK;AACJ,aAAO,IAAI,kBAAkB,KAAK;AAAA,IACnC,KAAK;AACJ,aAAO,IAAI,wBAAwB,OAAO,OAAO;AAAA,IAClD;AACC,YAAM,IAAI,MAAM,gCAAgC,eAAe,EAAE;AAAA,EACnE;AACD;AAEO,SAAS,sBACf,WACA,UAAyC,CAAC,GACzC;AACD,QAAM,QAAQ,OAAO,cAAc,WAAW,WAAW,SAAS,IAAI;AAEtE,QAAM,kBAAkB,yBAAyB,MAAM,CAAC,CAAkB;AAE1E,SAAO,sBAAsB,iBAAiB,MAAM,MAAM,CAAC,GAAG,OAAO;AACtE;",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- export declare const PACKAGE_VERSION = "1.9.0";
2
- export declare const TARGETED_RPC_VERSION = "1.34.0";
1
+ export declare const PACKAGE_VERSION = "1.11.0";
2
+ export declare const TARGETED_RPC_VERSION = "1.35.0";
@@ -1,5 +1,5 @@
1
- const PACKAGE_VERSION = "1.9.0";
2
- const TARGETED_RPC_VERSION = "1.34.0";
1
+ const PACKAGE_VERSION = "1.11.0";
2
+ const TARGETED_RPC_VERSION = "1.35.0";
3
3
  export {
4
4
  PACKAGE_VERSION,
5
5
  TARGETED_RPC_VERSION
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/version.ts"],
4
- "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 = '1.9.0';\nexport const TARGETED_RPC_VERSION = '1.34.0';\n"],
4
+ "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 = '1.11.0';\nexport const TARGETED_RPC_VERSION = '1.35.0';\n"],
5
5
  "mappings": "AAKO,MAAM,kBAAkB;AACxB,MAAM,uBAAuB;",
6
6
  "names": []
7
7
  }