@mysten/sui 1.24.0 → 1.25.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 (42) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/transactions/Arguments.d.ts +2 -2
  3. package/dist/cjs/transactions/Transaction.d.ts +4 -4
  4. package/dist/cjs/transactions/TransactionData.d.ts +2 -2
  5. package/dist/cjs/transactions/data/v1.d.ts +4 -4
  6. package/dist/cjs/transactions/data/v2.d.ts +4 -4
  7. package/dist/cjs/transactions/plugins/NamedPackagesPlugin.d.ts +5 -7
  8. package/dist/cjs/transactions/plugins/NamedPackagesPlugin.js +84 -43
  9. package/dist/cjs/transactions/plugins/NamedPackagesPlugin.js.map +3 -3
  10. package/dist/cjs/transactions/plugins/utils.d.ts +10 -6
  11. package/dist/cjs/transactions/plugins/utils.js +64 -37
  12. package/dist/cjs/transactions/plugins/utils.js.map +2 -2
  13. package/dist/cjs/utils/sui-types.d.ts +1 -2
  14. package/dist/cjs/utils/sui-types.js +3 -1
  15. package/dist/cjs/utils/sui-types.js.map +2 -2
  16. package/dist/cjs/version.d.ts +2 -2
  17. package/dist/cjs/version.js +2 -2
  18. package/dist/cjs/version.js.map +1 -1
  19. package/dist/esm/transactions/Arguments.d.ts +2 -2
  20. package/dist/esm/transactions/Transaction.d.ts +4 -4
  21. package/dist/esm/transactions/TransactionData.d.ts +2 -2
  22. package/dist/esm/transactions/data/v1.d.ts +4 -4
  23. package/dist/esm/transactions/data/v2.d.ts +4 -4
  24. package/dist/esm/transactions/plugins/NamedPackagesPlugin.d.ts +5 -7
  25. package/dist/esm/transactions/plugins/NamedPackagesPlugin.js +91 -44
  26. package/dist/esm/transactions/plugins/NamedPackagesPlugin.js.map +3 -3
  27. package/dist/esm/transactions/plugins/utils.d.ts +10 -6
  28. package/dist/esm/transactions/plugins/utils.js +64 -37
  29. package/dist/esm/transactions/plugins/utils.js.map +2 -2
  30. package/dist/esm/utils/sui-types.d.ts +1 -2
  31. package/dist/esm/utils/sui-types.js +3 -1
  32. package/dist/esm/utils/sui-types.js.map +2 -2
  33. package/dist/esm/version.d.ts +2 -2
  34. package/dist/esm/version.js +2 -2
  35. package/dist/esm/version.js.map +1 -1
  36. package/dist/tsconfig.esm.tsbuildinfo +1 -1
  37. package/dist/tsconfig.tsbuildinfo +1 -1
  38. package/package.json +1 -1
  39. package/src/transactions/plugins/NamedPackagesPlugin.ts +118 -62
  40. package/src/transactions/plugins/utils.ts +115 -47
  41. package/src/utils/sui-types.ts +6 -2
  42. package/src/version.ts +2 -2
@@ -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 (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\t// Replace package name with address.\n\t\tif (name.includes(NAME_SEPARATOR)) {\n\t\t\tnameParts[0] = cache.packages[name];\n\t\t\ttx.package = nameParts.join('::');\n\t\t}\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": "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",
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { isValidNamedPackage, isValidNamedType } from '../../utils/move-registry.js';\nimport { normalizeStructTag, parseStructTag } from '../../utils/sui-types.js';\nimport type { StructTag } from '../../utils/sui-types.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 function findNamesInTransaction(builder: TransactionDataBuilder): {\n\tpackages: string[];\n\ttypes: string[];\n} {\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 (hasMvrName(pkg)) {\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 * Extracts all first-level types from a list of types.\n * E.g. for the input `['@mvr/demo::a::A<@mvr/demo::b::B>']`,\n * the output will be `['@mvr/demo::a::A', '@mvr/demo::b::B']`.\n */\nexport function getFirstLevelNamedTypes(types: string[]) {\n\tconst results: Set<string> = new Set();\n\n\tfor (const type of types) {\n\t\tfindMvrNames(type).forEach((name) => results.add(name));\n\t}\n\n\treturn results;\n}\n\n/**\n * Extracts all named types from a given type.\n */\nfunction findMvrNames(type: string | StructTag) {\n\tconst types: Set<string> = new Set();\n\n\tif (typeof type === 'string' && !hasMvrName(type)) return types;\n\n\tlet tag = isStructTag(type) ? type : parseStructTag(type);\n\n\tif (hasMvrName(tag.address)) types.add(`${tag.address}::${tag.module}::${tag.name}`);\n\n\tfor (const param of tag.typeParams) {\n\t\tfindMvrNames(param).forEach((name) => types.add(name));\n\t}\n\n\treturn types;\n}\n\n// /**\n// * Allows partial replacements of known types with their resolved equivalents.\n// * E.g. `@mvr/demo::a::A<@mvr/demo::b::B>` can be resolved, if we already have\n// * the address for `@mvr/demo::b::B` and the address for `@mvr/demo::a::A`,\n// * without the need to have the full type in the cache.\n// *\n// * Returns the fully composed resolved types (if any) in a `named-type -> normalized-type` map.\n// */\nexport function populateNamedTypesFromCache(types: string[], typeCache: Record<string, string>) {\n\tconst composedTypes: Record<string, string> = {};\n\n\ttypes.forEach((type) => {\n\t\tconst normalized = normalizeStructTag(findAndReplaceCachedTypes(type, typeCache));\n\t\tcomposedTypes[type] = normalized;\n\t});\n\n\treturn composedTypes;\n}\n\n/**\n * Traverses a type, and replaces any found names with their resolved equivalents,\n * based on the supplied type cache.\n */\nfunction findAndReplaceCachedTypes(\n\ttag: string | StructTag,\n\ttypeCache: Record<string, string>,\n): StructTag {\n\tconst type = isStructTag(tag) ? tag : parseStructTag(tag);\n\n\tlet typeTag = `${type.address}::${type.module}::${type.name}`;\n\tconst cacheHit = typeCache[typeTag];\n\n\treturn {\n\t\t...type,\n\t\taddress: cacheHit ? cacheHit.split('::')[0] : type.address,\n\t\ttypeParams: type.typeParams.map((param) => findAndReplaceCachedTypes(param, typeCache)),\n\t};\n}\n\n/**\n * Replace all names & types in a transaction block\n * with their resolved names/types.\n */\nexport function 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 (!hasMvrName(command.MakeMoveVec.type)) 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 (hasMvrName(name) && !cache.packages[name])\n\t\t\tthrow new Error(`No address found for package: ${name}`);\n\n\t\t// Replace package name with address.\n\t\tif (hasMvrName(name)) {\n\t\t\tnameParts[0] = cache.packages[name];\n\t\t\ttx.package = nameParts.join('::');\n\t\t}\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 (!hasMvrName(types[i])) 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 function 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\n/**\n * Returns a list of unique types that include a name\n * from the given list. This list is retrieved from the Transaction Data.\n */\nfunction getNamesFromTypeList(types: string[]) {\n\tconst names = new Set<string>();\n\tfor (const type of types) {\n\t\tif (hasMvrName(type)) {\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\nfunction hasMvrName(nameOrType: string) {\n\treturn (\n\t\tnameOrType.includes(NAME_SEPARATOR) || nameOrType.includes('@') || nameOrType.includes('.sui')\n\t);\n}\n\nfunction isStructTag(type: string | StructTag): type is StructTag {\n\treturn (\n\t\ttypeof type === 'object' &&\n\t\t'address' in type &&\n\t\t'module' in type &&\n\t\t'name' in type &&\n\t\t'typeParams' in type\n\t);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -3,7 +3,7 @@ export declare function isValidTransactionDigest(value: string): value is string
3
3
  export declare const SUI_ADDRESS_LENGTH = 32;
4
4
  export declare function isValidSuiAddress(value: string): value is string;
5
5
  export declare function isValidSuiObjectId(value: string): boolean;
6
- type StructTag = {
6
+ export type StructTag = {
7
7
  address: string;
8
8
  module: string;
9
9
  name: string;
@@ -24,4 +24,3 @@ export declare function normalizeStructTag(type: string | StructTag): string;
24
24
  */
25
25
  export declare function normalizeSuiAddress(value: string, forceAdd0x?: boolean): string;
26
26
  export declare function normalizeSuiObjectId(value: string, forceAdd0x?: boolean): string;
27
- export {};
@@ -29,6 +29,7 @@ __export(sui_types_exports, {
29
29
  });
30
30
  module.exports = __toCommonJS(sui_types_exports);
31
31
  var import_bcs = require("@mysten/bcs");
32
+ var import_move_registry = require("./move-registry.js");
32
33
  const TX_DIGEST_LENGTH = 32;
33
34
  function isValidTransactionDigest(value) {
34
35
  try {
@@ -51,13 +52,14 @@ function parseTypeTag(type) {
51
52
  }
52
53
  function parseStructTag(type) {
53
54
  const [address, module2] = type.split("::");
55
+ const isMvrPackage = (0, import_move_registry.isValidNamedPackage)(address);
54
56
  const rest = type.slice(address.length + module2.length + 4);
55
57
  const name = rest.includes("<") ? rest.slice(0, rest.indexOf("<")) : rest;
56
58
  const typeParams = rest.includes("<") ? (0, import_bcs.splitGenericParameters)(rest.slice(rest.indexOf("<") + 1, rest.lastIndexOf(">"))).map(
57
59
  (typeParam) => parseTypeTag(typeParam.trim())
58
60
  ) : [];
59
61
  return {
60
- address: normalizeSuiAddress(address),
62
+ address: isMvrPackage ? address : normalizeSuiAddress(address),
61
63
  module: module2,
62
64
  name,
63
65
  typeParams
@@ -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 { 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": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,iBAAmD;AAEnD,MAAM,mBAAmB;AAGlB,SAAS,yBAAyB,OAAgC;AACxE,MAAI;AACH,UAAM,aAAS,uBAAW,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,SAASA,OAAM,IAAI,KAAK,MAAM,IAAI;AAEzC,QAAM,OAAO,KAAK,MAAM,QAAQ,SAASA,QAAO,SAAS,CAAC;AAC1D,QAAM,OAAO,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,KAAK,QAAQ,GAAG,CAAC,IAAI;AACrE,QAAM,aAAa,KAAK,SAAS,GAAG,QACjC,mCAAuB,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,QAAAA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAEO,SAAS,mBAAmB,MAAkC;AACpE,QAAM,EAAE,SAAS,QAAAA,SAAQ,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,KAAKA,OAAM,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\nimport { isValidNamedPackage } from './move-registry.js';\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\nexport type 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 isMvrPackage = isValidNamedPackage(address);\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: isMvrPackage ? address : 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": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,iBAAmD;AAEnD,2BAAoC;AAEpC,MAAM,mBAAmB;AAGlB,SAAS,yBAAyB,OAAgC;AACxE,MAAI;AACH,UAAM,aAAS,uBAAW,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,SAASA,OAAM,IAAI,KAAK,MAAM,IAAI;AAEzC,QAAM,mBAAe,0CAAoB,OAAO;AAEhD,QAAM,OAAO,KAAK,MAAM,QAAQ,SAASA,QAAO,SAAS,CAAC;AAC1D,QAAM,OAAO,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,KAAK,QAAQ,GAAG,CAAC,IAAI;AACrE,QAAM,aAAa,KAAK,SAAS,GAAG,QACjC,mCAAuB,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,eAAe,UAAU,oBAAoB,OAAO;AAAA,IAC7D,QAAAA;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;AAEO,SAAS,mBAAmB,MAAkC;AACpE,QAAM,EAAE,SAAS,QAAAA,SAAQ,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,KAAKA,OAAM,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": ["module"]
7
7
  }
@@ -1,2 +1,2 @@
1
- export declare const PACKAGE_VERSION = "1.24.0";
2
- export declare const TARGETED_RPC_VERSION = "1.45.0";
1
+ export declare const PACKAGE_VERSION = "1.25.0";
2
+ export declare const TARGETED_RPC_VERSION = "1.46.0";
@@ -22,6 +22,6 @@ __export(version_exports, {
22
22
  TARGETED_RPC_VERSION: () => TARGETED_RPC_VERSION
23
23
  });
24
24
  module.exports = __toCommonJS(version_exports);
25
- const PACKAGE_VERSION = "1.24.0";
26
- const TARGETED_RPC_VERSION = "1.45.0";
25
+ const PACKAGE_VERSION = "1.25.0";
26
+ const TARGETED_RPC_VERSION = "1.46.0";
27
27
  //# sourceMappingURL=version.js.map
@@ -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.24.0';\nexport const TARGETED_RPC_VERSION = '1.45.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.25.0';\nexport const TARGETED_RPC_VERSION = '1.46.0';\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAKO,MAAM,kBAAkB;AACxB,MAAM,uBAAuB;",
6
6
  "names": []
7
7
  }
@@ -25,8 +25,8 @@ export declare const Arguments: {
25
25
  type?: "object";
26
26
  };
27
27
  objectRef: (args_0: {
28
- objectId: string;
29
28
  version: string | number;
29
+ objectId: string;
30
30
  digest: string;
31
31
  }) => (tx: Transaction) => {
32
32
  $kind: "Input";
@@ -34,8 +34,8 @@ export declare const Arguments: {
34
34
  type?: "object";
35
35
  };
36
36
  receivingRef: (args_0: {
37
- objectId: string;
38
37
  version: string | number;
38
+ objectId: string;
39
39
  digest: string;
40
40
  }) => (tx: Transaction) => {
41
41
  $kind: "Input";
@@ -290,8 +290,8 @@ export declare class Transaction {
290
290
  })[];
291
291
  gasConfig: {
292
292
  payment?: {
293
- objectId: string;
294
293
  version: string | number | bigint;
294
+ objectId: string;
295
295
  digest: string;
296
296
  }[] | undefined;
297
297
  owner?: string | undefined;
@@ -311,8 +311,8 @@ export declare class Transaction {
311
311
  inputs: import("@mysten/bcs").EnumOutputShapeWithKeys<{
312
312
  Object: import("@mysten/bcs").EnumOutputShapeWithKeys<{
313
313
  ImmOrOwnedObject: {
314
- objectId: string;
315
314
  version: string | number;
315
+ objectId: string;
316
316
  digest: string;
317
317
  };
318
318
  SharedObject: {
@@ -321,8 +321,8 @@ export declare class Transaction {
321
321
  mutable: boolean;
322
322
  };
323
323
  Receiving: {
324
- objectId: string;
325
324
  version: string | number;
325
+ objectId: string;
326
326
  digest: string;
327
327
  };
328
328
  }, "ImmOrOwnedObject" | "SharedObject" | "Receiving">;
@@ -576,8 +576,8 @@ export declare class Transaction {
576
576
  }, "MoveCall" | "TransferObjects" | "SplitCoins" | "MergeCoins" | "Publish" | "MakeMoveVec" | "Upgrade" | "$Intent">[];
577
577
  gasData: {
578
578
  payment: {
579
- objectId: string;
580
579
  version: string | number;
580
+ objectId: string;
581
581
  digest: string;
582
582
  }[] | null;
583
583
  owner: string | null;
@@ -16,8 +16,8 @@ export declare class TransactionDataBuilder implements TransactionData {
16
16
  static getDigestFromBytes(bytes: Uint8Array): string;
17
17
  get gasConfig(): {
18
18
  payment: {
19
- objectId: string;
20
19
  version: string | number;
20
+ objectId: string;
21
21
  digest: string;
22
22
  }[] | null;
23
23
  owner: string | null;
@@ -26,8 +26,8 @@ export declare class TransactionDataBuilder implements TransactionData {
26
26
  };
27
27
  set gasConfig(value: {
28
28
  payment: {
29
- objectId: string;
30
29
  version: string | number;
30
+ objectId: string;
31
31
  digest: string;
32
32
  }[] | null;
33
33
  owner: string | null;
@@ -9,8 +9,8 @@ export declare const ObjectRef: import("valibot").ObjectSchema<{
9
9
  export declare const NormalizedCallArg: GenericSchema<import("@mysten/bcs").EnumInputShape<{
10
10
  Object: import("@mysten/bcs").EnumInputShape<{
11
11
  ImmOrOwned: {
12
- objectId: string;
13
12
  version: string | number | bigint;
13
+ objectId: string;
14
14
  digest: string;
15
15
  };
16
16
  Shared: {
@@ -19,8 +19,8 @@ export declare const NormalizedCallArg: GenericSchema<import("@mysten/bcs").Enum
19
19
  mutable: boolean;
20
20
  };
21
21
  Receiving: {
22
- objectId: string;
23
22
  version: string | number | bigint;
23
+ objectId: string;
24
24
  digest: string;
25
25
  };
26
26
  }>;
@@ -28,8 +28,8 @@ export declare const NormalizedCallArg: GenericSchema<import("@mysten/bcs").Enum
28
28
  }>, import("@mysten/bcs").EnumOutputShapeWithKeys<{
29
29
  Object: import("@mysten/bcs").EnumOutputShapeWithKeys<{
30
30
  ImmOrOwned: {
31
- objectId: string;
32
31
  version: string | number | bigint;
32
+ objectId: string;
33
33
  digest: string;
34
34
  };
35
35
  Shared: {
@@ -38,8 +38,8 @@ export declare const NormalizedCallArg: GenericSchema<import("@mysten/bcs").Enum
38
38
  mutable: boolean;
39
39
  };
40
40
  Receiving: {
41
- objectId: string;
42
41
  version: string | number | bigint;
42
+ objectId: string;
43
43
  digest: string;
44
44
  };
45
45
  }, "Receiving" | "Shared" | "ImmOrOwned">;
@@ -23,8 +23,8 @@ export declare const SerializedTransactionDataV2: import("valibot").ObjectSchema
23
23
  readonly inputs: import("valibot").ArraySchema<GenericSchema<EnumInputShape<{
24
24
  Object: EnumInputShape<{
25
25
  ImmOrOwnedObject: {
26
- objectId: string;
27
26
  version: string | number;
27
+ objectId: string;
28
28
  digest: string;
29
29
  };
30
30
  SharedObject: {
@@ -33,8 +33,8 @@ export declare const SerializedTransactionDataV2: import("valibot").ObjectSchema
33
33
  mutable: boolean;
34
34
  };
35
35
  Receiving: {
36
- objectId: string;
37
36
  version: string | number;
37
+ objectId: string;
38
38
  digest: string;
39
39
  };
40
40
  }>;
@@ -53,8 +53,8 @@ export declare const SerializedTransactionDataV2: import("valibot").ObjectSchema
53
53
  }>, EnumInputShape<{
54
54
  Object: EnumInputShape<{
55
55
  ImmOrOwnedObject: {
56
- objectId: string;
57
56
  version: string | number;
57
+ objectId: string;
58
58
  digest: string;
59
59
  };
60
60
  SharedObject: {
@@ -63,8 +63,8 @@ export declare const SerializedTransactionDataV2: import("valibot").ObjectSchema
63
63
  mutable: boolean;
64
64
  };
65
65
  Receiving: {
66
- objectId: string;
67
66
  version: string | number;
67
+ objectId: string;
68
68
  digest: string;
69
69
  };
70
70
  }>;
@@ -1,15 +1,11 @@
1
- import type { SuiGraphQLClient } from '../../graphql/client.js';
2
1
  import type { BuildTransactionOptions } from '../json-rpc-resolver.js';
3
2
  import type { TransactionDataBuilder } from '../TransactionData.js';
4
3
  import type { NamedPackagesPluginCache } from './utils.js';
5
4
  export type NamedPackagesPluginOptions = {
6
5
  /**
7
- * The SuiGraphQLClient to use for resolving names.
8
- * The endpoint should be the GraphQL endpoint of the network you are targeting.
9
- * For non-mainnet networks, if the plugin doesn't work as expected, you need to validate that the
10
- * RPC provider has support for the `packageByName` and `typeByName` queries (using external resolver).
6
+ * The URL of the MVR API to use for resolving names.
11
7
  */
12
- suiGraphQLClient: SuiGraphQLClient;
8
+ url: string;
13
9
  /**
14
10
  * The number of names to resolve in each batch request.
15
11
  * Needs to be calculated based on the GraphQL query limits.
@@ -19,6 +15,8 @@ export type NamedPackagesPluginOptions = {
19
15
  * Local overrides for the resolution plugin. Pass this to pre-populate
20
16
  * the cache with known packages / types (especially useful for local or CI testing).
21
17
  *
18
+ * The type cache expects ONLY first-level types to ensure the cache is more composable.
19
+ *
22
20
  * Expected format example:
23
21
  * {
24
22
  * packages: {
@@ -46,4 +44,4 @@ export type NamedPackagesPluginOptions = {
46
44
  *
47
45
  * You can also define `overrides` to pre-populate name resolutions locally (removes the GraphQL request).
48
46
  */
49
- export declare const namedPackagesPlugin: ({ suiGraphQLClient, pageSize, overrides, }: NamedPackagesPluginOptions) => (transactionData: TransactionDataBuilder, _buildOptions: BuildTransactionOptions, next: () => Promise<void>) => Promise<void>;
47
+ export declare const namedPackagesPlugin: ({ url, pageSize, overrides, }: NamedPackagesPluginOptions) => (transactionData: TransactionDataBuilder, _buildOptions: BuildTransactionOptions, next: () => Promise<void>) => Promise<void>;
@@ -1,57 +1,104 @@
1
- import { findTransactionBlockNames, listToRequests, replaceNames } from "./utils.js";
1
+ import { parseStructTag } from "../../utils/sui-types.js";
2
+ import {
3
+ batch,
4
+ findNamesInTransaction,
5
+ getFirstLevelNamedTypes,
6
+ populateNamedTypesFromCache,
7
+ replaceNames
8
+ } from "./utils.js";
2
9
  const namedPackagesPlugin = ({
3
- suiGraphQLClient,
4
- pageSize = 10,
10
+ url,
11
+ pageSize = 50,
5
12
  overrides = { packages: {}, types: {} }
6
13
  }) => {
7
- const cache = {
8
- packages: { ...overrides.packages },
9
- types: { ...overrides.types }
10
- };
14
+ Object.keys(overrides.types).forEach((type) => {
15
+ if (parseStructTag(type).typeParams.length > 0)
16
+ throw new Error(
17
+ "Type overrides must be first-level only. If you want to supply generic types, just pass each type individually."
18
+ );
19
+ });
20
+ const cache = overrides;
11
21
  return async (transactionData, _buildOptions, next) => {
12
- const names = findTransactionBlockNames(transactionData);
13
- const batches = listToRequests(
14
- {
15
- packages: names.packages.filter((x) => !cache.packages[x]),
16
- types: names.types.filter((x) => !cache.types[x])
17
- },
18
- pageSize
19
- );
20
- (await Promise.all(batches.map((batch) => query(suiGraphQLClient, batch)))).forEach((res) => {
21
- Object.assign(cache.types, res.types);
22
- Object.assign(cache.packages, res.packages);
22
+ const names = findNamesInTransaction(transactionData);
23
+ const [packages, types] = await Promise.all([
24
+ resolvePackages(
25
+ names.packages.filter((x) => !cache.packages[x]),
26
+ url,
27
+ pageSize
28
+ ),
29
+ resolveTypes(
30
+ [...getFirstLevelNamedTypes(names.types)].filter((x) => !cache.types[x]),
31
+ url,
32
+ pageSize
33
+ )
34
+ ]);
35
+ Object.assign(cache.packages, packages);
36
+ Object.assign(cache.types, types);
37
+ const composedTypes = populateNamedTypesFromCache(names.types, cache.types);
38
+ replaceNames(transactionData, {
39
+ packages: { ...cache.packages },
40
+ // we include the "composed" type cache too.
41
+ types: composedTypes
23
42
  });
24
- replaceNames(transactionData, cache);
25
43
  await next();
26
44
  };
27
- async function query(client, requests) {
28
- const results = { packages: {}, types: {} };
29
- if (requests.length === 0) return results;
30
- const gqlQuery = `{
31
- ${requests.map((req) => {
32
- const request = req.type === "package" ? "packageByName" : "typeByName";
33
- const fields = req.type === "package" ? "address" : "repr";
34
- return `${gqlQueryKey(req.id)}: ${request}(name:"${req.name}") {
35
- ${fields}
36
- }`;
37
- })}
38
- }`;
39
- const result = await client.query({
40
- query: gqlQuery,
41
- variables: void 0
42
- });
43
- if (result.errors) throw new Error(JSON.stringify({ query: gqlQuery, errors: result.errors }));
44
- for (const req of requests) {
45
- const key = gqlQueryKey(req.id);
46
- if (!result.data || !result.data[key]) throw new Error(`No result found for: ${req.name}`);
47
- const data = result.data[key];
48
- if (req.type === "package") results.packages[req.name] = data.address;
49
- if (req.type === "moveType") results.types[req.name] = data.repr;
50
- }
45
+ async function resolvePackages(packages, apiUrl, pageSize2) {
46
+ if (packages.length === 0) return {};
47
+ const batches = batch(packages, pageSize2);
48
+ const results = {};
49
+ await Promise.all(
50
+ batches.map(async (batch2) => {
51
+ const response = await fetch(`${apiUrl}/v1/resolution/bulk`, {
52
+ method: "POST",
53
+ headers: { "Content-Type": "application/json" },
54
+ body: JSON.stringify({
55
+ names: batch2
56
+ })
57
+ });
58
+ if (!response.ok) {
59
+ const errorBody = await response.json().catch(() => ({}));
60
+ throw new Error(`Failed to resolve packages: ${errorBody?.message}`);
61
+ }
62
+ const data = await response.json();
63
+ if (!data?.resolution) return;
64
+ for (const pkg of Object.keys(data?.resolution)) {
65
+ const pkgData = data.resolution[pkg]?.package_id;
66
+ if (!pkgData) continue;
67
+ results[pkg] = pkgData;
68
+ }
69
+ })
70
+ );
71
+ return results;
72
+ }
73
+ async function resolveTypes(types, apiUrl, pageSize2) {
74
+ if (types.length === 0) return {};
75
+ const batches = batch(types, pageSize2);
76
+ const results = {};
77
+ await Promise.all(
78
+ batches.map(async (batch2) => {
79
+ const response = await fetch(`${apiUrl}/v1/struct-definition/bulk`, {
80
+ method: "POST",
81
+ headers: { "Content-Type": "application/json" },
82
+ body: JSON.stringify({
83
+ types: batch2
84
+ })
85
+ });
86
+ if (!response.ok) {
87
+ const errorBody = await response.json().catch(() => ({}));
88
+ throw new Error(`Failed to resolve types: ${errorBody?.message}`);
89
+ }
90
+ const data = await response.json();
91
+ if (!data?.resolution) return;
92
+ for (const type of Object.keys(data?.resolution)) {
93
+ const typeData = data.resolution[type]?.type_tag;
94
+ if (!typeData) continue;
95
+ results[type] = typeData;
96
+ }
97
+ })
98
+ );
51
99
  return results;
52
100
  }
53
101
  };
54
- const gqlQueryKey = (idx) => `key_${idx}`;
55
102
  export {
56
103
  namedPackagesPlugin
57
104
  };
@@ -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'@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
- "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
- "names": []
4
+ "sourcesContent": ["// Copyright (c) Mysten Labs, Inc.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { parseStructTag } from '../../utils/sui-types.js';\nimport type { BuildTransactionOptions } from '../json-rpc-resolver.js';\nimport type { TransactionDataBuilder } from '../TransactionData.js';\nimport type { NamedPackagesPluginCache } from './utils.js';\nimport {\n\tbatch,\n\tfindNamesInTransaction,\n\tgetFirstLevelNamedTypes,\n\tpopulateNamedTypesFromCache,\n\treplaceNames,\n} from './utils.js';\n\nexport type NamedPackagesPluginOptions = {\n\t/**\n\t * The URL of the MVR API to use for resolving names.\n\t */\n\turl: string;\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 * The type cache expects ONLY first-level types to ensure the cache is more composable.\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\turl,\n\tpageSize = 50,\n\toverrides = { packages: {}, types: {} },\n}: NamedPackagesPluginOptions) => {\n\t// validate that types are first-level only.\n\tObject.keys(overrides.types).forEach((type) => {\n\t\tif (parseStructTag(type).typeParams.length > 0)\n\t\t\tthrow new Error(\n\t\t\t\t'Type overrides must be first-level only. If you want to supply generic types, just pass each type individually.',\n\t\t\t);\n\t});\n\n\tconst cache = overrides;\n\n\treturn async (\n\t\ttransactionData: TransactionDataBuilder,\n\t\t_buildOptions: BuildTransactionOptions,\n\t\tnext: () => Promise<void>,\n\t) => {\n\t\tconst names = findNamesInTransaction(transactionData);\n\n\t\tconst [packages, types] = await Promise.all([\n\t\t\tresolvePackages(\n\t\t\t\tnames.packages.filter((x) => !cache.packages[x]),\n\t\t\t\turl,\n\t\t\t\tpageSize,\n\t\t\t),\n\t\t\tresolveTypes(\n\t\t\t\t[...getFirstLevelNamedTypes(names.types)].filter((x) => !cache.types[x]),\n\t\t\t\turl,\n\t\t\t\tpageSize,\n\t\t\t),\n\t\t]);\n\n\t\t// save first-level mappings to cache.\n\t\tObject.assign(cache.packages, packages);\n\t\tObject.assign(cache.types, types);\n\n\t\tconst composedTypes = populateNamedTypesFromCache(names.types, cache.types);\n\n\t\t// when replacing names, we also need to replace the \"composed\" types collected above.\n\t\treplaceNames(transactionData, {\n\t\t\tpackages: { ...cache.packages },\n\t\t\t// we include the \"composed\" type cache too.\n\t\t\ttypes: composedTypes,\n\t\t});\n\n\t\tawait next();\n\t};\n\n\tasync function resolvePackages(packages: string[], apiUrl: string, pageSize: number) {\n\t\tif (packages.length === 0) return {};\n\n\t\tconst batches = batch(packages, pageSize);\n\t\tconst results: Record<string, string> = {};\n\n\t\tawait Promise.all(\n\t\t\tbatches.map(async (batch) => {\n\t\t\t\tconst response = await fetch(`${apiUrl}/v1/resolution/bulk`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\tnames: batch,\n\t\t\t\t\t}),\n\t\t\t\t});\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tconst errorBody = await response.json().catch(() => ({}));\n\t\t\t\t\tthrow new Error(`Failed to resolve packages: ${errorBody?.message}`);\n\t\t\t\t}\n\n\t\t\t\tconst data = await response.json();\n\n\t\t\t\tif (!data?.resolution) return;\n\n\t\t\t\tfor (const pkg of Object.keys(data?.resolution)) {\n\t\t\t\t\tconst pkgData = data.resolution[pkg]?.package_id;\n\n\t\t\t\t\tif (!pkgData) continue;\n\n\t\t\t\t\tresults[pkg] = pkgData;\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\n\t\treturn results;\n\t}\n\n\tasync function resolveTypes(types: string[], apiUrl: string, pageSize: number) {\n\t\tif (types.length === 0) return {};\n\n\t\tconst batches = batch(types, pageSize);\n\t\tconst results: Record<string, string> = {};\n\n\t\tawait Promise.all(\n\t\t\tbatches.map(async (batch) => {\n\t\t\t\tconst response = await fetch(`${apiUrl}/v1/struct-definition/bulk`, {\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\ttypes: batch,\n\t\t\t\t\t}),\n\t\t\t\t});\n\n\t\t\t\tif (!response.ok) {\n\t\t\t\t\tconst errorBody = await response.json().catch(() => ({}));\n\t\t\t\t\tthrow new Error(`Failed to resolve types: ${errorBody?.message}`);\n\t\t\t\t}\n\n\t\t\t\tconst data = await response.json();\n\n\t\t\t\tif (!data?.resolution) return;\n\n\t\t\t\tfor (const type of Object.keys(data?.resolution)) {\n\t\t\t\t\tconst typeData = data.resolution[type]?.type_tag;\n\t\t\t\t\tif (!typeData) continue;\n\n\t\t\t\t\tresults[type] = typeData;\n\t\t\t\t}\n\t\t\t}),\n\t\t);\n\n\t\treturn results;\n\t}\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["pageSize", "batch"]
7
7
  }
@@ -12,16 +12,20 @@ export type NameResolutionRequest = {
12
12
  * Looks up all `.move` names in a transaction block.
13
13
  * Returns a list of all the names found.
14
14
  */
15
- export declare const findTransactionBlockNames: (builder: TransactionDataBuilder) => {
15
+ export declare function findNamesInTransaction(builder: TransactionDataBuilder): {
16
16
  packages: string[];
17
17
  types: string[];
18
18
  };
19
+ /**
20
+ * Extracts all first-level types from a list of types.
21
+ * E.g. for the input `['@mvr/demo::a::A<@mvr/demo::b::B>']`,
22
+ * the output will be `['@mvr/demo::a::A', '@mvr/demo::b::B']`.
23
+ */
24
+ export declare function getFirstLevelNamedTypes(types: string[]): Set<string>;
25
+ export declare function populateNamedTypesFromCache(types: string[], typeCache: Record<string, string>): Record<string, string>;
19
26
  /**
20
27
  * Replace all names & types in a transaction block
21
28
  * with their resolved names/types.
22
29
  */
23
- export declare const replaceNames: (builder: TransactionDataBuilder, cache: NamedPackagesPluginCache) => void;
24
- export declare const listToRequests: (names: {
25
- packages: string[];
26
- types: string[];
27
- }, batchSize: number) => NameResolutionRequest[][];
30
+ export declare function replaceNames(builder: TransactionDataBuilder, cache: NamedPackagesPluginCache): void;
31
+ export declare function batch<T>(arr: T[], size: number): T[][];