@mysten/sui 2.3.2 → 2.5.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 (51) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/bcs/bcs.d.mts +6 -6
  3. package/dist/bcs/index.d.mts +20 -20
  4. package/dist/client/types.d.mts +13 -6
  5. package/dist/client/types.d.mts.map +1 -1
  6. package/dist/cryptography/signature.d.mts +14 -14
  7. package/dist/graphql/core.d.mts.map +1 -1
  8. package/dist/graphql/core.mjs +7 -3
  9. package/dist/graphql/core.mjs.map +1 -1
  10. package/dist/graphql/generated/queries.mjs +1 -0
  11. package/dist/graphql/generated/queries.mjs.map +1 -1
  12. package/dist/grpc/core.d.mts.map +1 -1
  13. package/dist/grpc/core.mjs +7 -3
  14. package/dist/grpc/core.mjs.map +1 -1
  15. package/dist/grpc/proto/sui/rpc/v2/ledger_service.client.d.mts +4 -4
  16. package/dist/grpc/proto/sui/rpc/v2/move_package_service.client.d.mts +4 -4
  17. package/dist/grpc/proto/sui/rpc/v2/name_service.client.d.mts +4 -4
  18. package/dist/grpc/proto/sui/rpc/v2/state_service.client.d.mts +4 -4
  19. package/dist/grpc/proto/sui/rpc/v2/subscription_service.client.d.mts +4 -4
  20. package/dist/grpc/proto/sui/rpc/v2/transaction_execution_service.client.d.mts +4 -4
  21. package/dist/jsonRpc/core.d.mts +1 -9
  22. package/dist/jsonRpc/core.d.mts.map +1 -1
  23. package/dist/jsonRpc/core.mjs +10 -4
  24. package/dist/jsonRpc/core.mjs.map +1 -1
  25. package/dist/transactions/Transaction.d.mts +3 -3
  26. package/dist/transactions/Transaction.d.mts.map +1 -1
  27. package/dist/utils/index.d.mts +2 -2
  28. package/dist/utils/index.mjs +2 -2
  29. package/dist/utils/move-registry.d.mts +1 -2
  30. package/dist/utils/move-registry.d.mts.map +1 -1
  31. package/dist/utils/move-registry.mjs +3 -3
  32. package/dist/utils/move-registry.mjs.map +1 -1
  33. package/dist/utils/sui-types.d.mts +2 -1
  34. package/dist/utils/sui-types.d.mts.map +1 -1
  35. package/dist/utils/sui-types.mjs +47 -1
  36. package/dist/utils/sui-types.mjs.map +1 -1
  37. package/dist/version.mjs +2 -2
  38. package/dist/version.mjs.map +1 -1
  39. package/dist/zklogin/bcs.d.mts +14 -14
  40. package/dist/zklogin/bcs.d.mts.map +1 -1
  41. package/package.json +1 -1
  42. package/src/client/types.ts +8 -6
  43. package/src/graphql/core.ts +14 -4
  44. package/src/graphql/generated/queries.ts +2 -1
  45. package/src/graphql/queries/getDynamicFields.graphql +1 -0
  46. package/src/grpc/core.ts +20 -16
  47. package/src/jsonRpc/core.ts +11 -4
  48. package/src/utils/index.ts +1 -0
  49. package/src/utils/move-registry.ts +3 -4
  50. package/src/utils/sui-types.ts +72 -0
  51. package/src/version.ts +2 -2
@@ -155,15 +155,17 @@ export namespace SuiClientTypes {
155
155
  balance: string;
156
156
  }
157
157
 
158
+ export type DynamicFieldEntry = {
159
+ fieldId: string;
160
+ type: string;
161
+ name: DynamicFieldName;
162
+ valueType: string;
163
+ } & ({ $kind: 'DynamicField'; childId?: never } | { $kind: 'DynamicObject'; childId: string });
164
+
158
165
  export interface ListDynamicFieldsResponse {
159
166
  hasNextPage: boolean;
160
167
  cursor: string | null;
161
- dynamicFields: {
162
- fieldId: string;
163
- type: string;
164
- name: DynamicFieldName;
165
- valueType: string;
166
- }[];
168
+ dynamicFields: DynamicFieldEntry[];
167
169
  }
168
170
 
169
171
  export interface GetDynamicFieldResponse {
@@ -571,19 +571,25 @@ export class GraphQLCoreClient extends CoreClient {
571
571
  );
572
572
 
573
573
  return {
574
- dynamicFields: result.nodes.map((dynamicField) => {
574
+ dynamicFields: result.nodes.map((dynamicField): SuiClientTypes.DynamicFieldEntry => {
575
575
  const valueType =
576
576
  dynamicField.value?.__typename === 'MoveObject'
577
577
  ? dynamicField.value.contents?.type?.repr!
578
578
  : dynamicField.value?.type?.repr!;
579
+ const isDynamicObject = dynamicField.value?.__typename === 'MoveObject';
580
+ const derivedNameType = isDynamicObject
581
+ ? `0x2::dynamic_object_field::Wrapper<${dynamicField.name?.type?.repr}>`
582
+ : dynamicField.name?.type?.repr!;
583
+
579
584
  return {
585
+ $kind: isDynamicObject ? 'DynamicObject' : 'DynamicField',
580
586
  fieldId: deriveDynamicFieldID(
581
587
  options.parentId,
582
- dynamicField.name?.type?.repr!,
588
+ derivedNameType,
583
589
  fromBase64(dynamicField.name?.bcs!),
584
590
  ),
585
591
  type: normalizeStructTag(
586
- dynamicField.value?.__typename === 'MoveObject'
592
+ isDynamicObject
587
593
  ? `0x2::dynamic_field::Field<0x2::dynamic_object_field::Wrapper<${dynamicField.name?.type?.repr}>,0x2::object::ID>`
588
594
  : `0x2::dynamic_field::Field<${dynamicField.name?.type?.repr},${valueType}>`,
589
595
  ),
@@ -592,7 +598,11 @@ export class GraphQLCoreClient extends CoreClient {
592
598
  bcs: fromBase64(dynamicField.name?.bcs!),
593
599
  },
594
600
  valueType,
595
- };
601
+ childId:
602
+ isDynamicObject && dynamicField.value?.__typename === 'MoveObject'
603
+ ? dynamicField.value.address
604
+ : undefined,
605
+ } as SuiClientTypes.DynamicFieldEntry;
596
606
  }),
597
607
  cursor: result.pageInfo.endCursor ?? null,
598
608
  hasNextPage: result.pageInfo.hasNextPage,
@@ -4648,7 +4648,7 @@ export type GetDynamicFieldsQueryVariables = Exact<{
4648
4648
 
4649
4649
 
4650
4650
  export type GetDynamicFieldsQuery = { __typename?: 'Query', address?: { __typename?: 'Address', dynamicFields?: { __typename?: 'DynamicFieldConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null }, nodes: Array<{ __typename?: 'DynamicField', name?: { __typename?: 'MoveValue', bcs?: string | null, type?: { __typename?: 'MoveType', repr: string } | null } | null, value?:
4651
- | { __typename: 'MoveObject', contents?: { __typename?: 'MoveValue', type?: { __typename?: 'MoveType', repr: string } | null } | null }
4651
+ | { __typename: 'MoveObject', address: string, contents?: { __typename?: 'MoveValue', type?: { __typename?: 'MoveType', repr: string } | null } | null }
4652
4652
  | { __typename: 'MoveValue', type?: { __typename?: 'MoveType', repr: string } | null }
4653
4653
  | null }> } | null } | null };
4654
4654
 
@@ -5147,6 +5147,7 @@ export const GetDynamicFieldsDocument = new TypedDocumentString(`
5147
5147
  }
5148
5148
  }
5149
5149
  ... on MoveObject {
5150
+ address
5150
5151
  contents {
5151
5152
  type {
5152
5153
  repr
@@ -23,6 +23,7 @@ query getDynamicFields($parentId: SuiAddress!, $first: Int, $cursor: String) {
23
23
  }
24
24
  }
25
25
  ... on MoveObject {
26
+ address
26
27
  contents {
27
28
  type {
28
29
  repr
package/src/grpc/core.ts CHANGED
@@ -566,26 +566,30 @@ export class GrpcCoreClient extends CoreClient {
566
566
  pageToken: options.cursor ? fromBase64(options.cursor) : undefined,
567
567
  pageSize: options.limit,
568
568
  readMask: {
569
- paths: ['field_id', 'name', 'value_type', 'kind'],
569
+ paths: ['field_id', 'name', 'value_type', 'kind', 'child_id'],
570
570
  },
571
571
  });
572
572
 
573
573
  return {
574
- dynamicFields: response.response.dynamicFields.map((field) => {
575
- const isDynamicObject = field.kind === DynamicField_DynamicFieldKind.OBJECT;
576
- const fieldType = isDynamicObject
577
- ? `0x2::dynamic_field::Field<0x2::dynamic_object_field::Wrapper<${field.name?.name!}>,0x2::object::ID>`
578
- : `0x2::dynamic_field::Field<${field.name?.name!},${field.valueType!}>`;
579
- return {
580
- fieldId: field.fieldId!,
581
- name: {
582
- type: field.name?.name!,
583
- bcs: field.name?.value!,
584
- },
585
- valueType: field.valueType!,
586
- type: normalizeStructTag(fieldType),
587
- };
588
- }),
574
+ dynamicFields: response.response.dynamicFields.map(
575
+ (field): SuiClientTypes.DynamicFieldEntry => {
576
+ const isDynamicObject = field.kind === DynamicField_DynamicFieldKind.OBJECT;
577
+ const fieldType = isDynamicObject
578
+ ? `0x2::dynamic_field::Field<0x2::dynamic_object_field::Wrapper<${field.name?.name!}>,0x2::object::ID>`
579
+ : `0x2::dynamic_field::Field<${field.name?.name!},${field.valueType!}>`;
580
+ return {
581
+ $kind: isDynamicObject ? 'DynamicObject' : 'DynamicField',
582
+ fieldId: field.fieldId!,
583
+ name: {
584
+ type: field.name?.name!,
585
+ bcs: field.name?.value!,
586
+ },
587
+ valueType: field.valueType!,
588
+ type: normalizeStructTag(fieldType),
589
+ childId: field.childId,
590
+ } as SuiClientTypes.DynamicFieldEntry;
591
+ },
592
+ ),
589
593
  cursor: response.response.nextPageToken ? toBase64(response.response.nextPageToken) : null,
590
594
  hasNextPage: response.response.nextPageToken !== undefined,
591
595
  };
@@ -22,6 +22,7 @@ import { coreClientResolveTransactionPlugin } from '../client/core-resolver.js';
22
22
  import { TransactionDataBuilder } from '../transactions/TransactionData.js';
23
23
  import { chunk } from '@mysten/utils';
24
24
  import { normalizeSuiAddress, normalizeStructTag } from '../utils/sui-types.js';
25
+ import { deriveDynamicFieldID } from '../utils/dynamic-fields.js';
25
26
  import { SUI_FRAMEWORK_ADDRESS, SUI_SYSTEM_ADDRESS } from '../utils/constants.js';
26
27
  import { CoreClient } from '../client/core.js';
27
28
  import type { SuiClientTypes } from '../client/types.js';
@@ -503,21 +504,27 @@ export class JSONRpcCoreClient extends CoreClient {
503
504
  });
504
505
 
505
506
  return {
506
- dynamicFields: dynamicFields.data.map((dynamicField) => {
507
+ dynamicFields: dynamicFields.data.map((dynamicField): SuiClientTypes.DynamicFieldEntry => {
507
508
  const isDynamicObject = dynamicField.type === 'DynamicObject';
508
509
  const fullType = isDynamicObject
509
510
  ? `0x2::dynamic_field::Field<0x2::dynamic_object_field::Wrapper<${dynamicField.name.type}>, 0x2::object::ID>`
510
511
  : `0x2::dynamic_field::Field<${dynamicField.name.type}, ${dynamicField.objectType}>`;
511
512
 
513
+ const bcsBytes = fromBase64(dynamicField.bcsName);
514
+ const derivedNameType = isDynamicObject
515
+ ? `0x2::dynamic_object_field::Wrapper<${dynamicField.name.type}>`
516
+ : dynamicField.name.type;
512
517
  return {
513
- fieldId: dynamicField.objectId,
518
+ $kind: isDynamicObject ? 'DynamicObject' : 'DynamicField',
519
+ fieldId: deriveDynamicFieldID(options.parentId, derivedNameType, bcsBytes),
514
520
  type: normalizeStructTag(fullType),
515
521
  name: {
516
522
  type: dynamicField.name.type,
517
- bcs: fromBase64(dynamicField.bcsName),
523
+ bcs: bcsBytes,
518
524
  },
519
525
  valueType: dynamicField.objectType,
520
- };
526
+ childId: isDynamicObject ? dynamicField.objectId : undefined,
527
+ } as SuiClientTypes.DynamicFieldEntry;
521
528
  }),
522
529
  hasNextPage: dynamicFields.hasNextPage,
523
530
  cursor: dynamicFields.nextCursor,
@@ -3,6 +3,7 @@
3
3
 
4
4
  export { formatAddress, formatDigest } from './format.js';
5
5
  export {
6
+ isValidStructTag,
6
7
  isValidSuiAddress,
7
8
  isValidSuiObjectId,
8
9
  isValidTransactionDigest,
@@ -2,6 +2,7 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { isValidSuiNSName } from './suins.js';
5
+ import { isValidStructTag } from './sui-types.js';
5
6
 
6
7
  /** The pattern to find an optionally versioned name */
7
8
  const NAME_PATTERN = /^([a-z0-9]+(?:-[a-z0-9]+)*)$/;
@@ -29,8 +30,7 @@ export const isValidNamedPackage = (name: string): boolean => {
29
30
  };
30
31
 
31
32
  /**
32
- * Checks if a type contains valid named packages.
33
- * This DOES NOT check if the type is a valid Move type.
33
+ * Checks if a type contains valid named packages and is a valid Move struct tag.
34
34
  */
35
35
  export const isValidNamedType = (type: string): boolean => {
36
36
  // split our type by all possible type delimeters.
@@ -38,6 +38,5 @@ export const isValidNamedType = (type: string): boolean => {
38
38
  for (const t of splitType) {
39
39
  if (t.includes(NAME_SEPARATOR) && !isValidNamedPackage(t)) return false;
40
40
  }
41
- // TODO: Add `isValidStructTag` check once it's introduced.
42
- return true;
41
+ return isValidStructTag(type);
43
42
  };
@@ -32,6 +32,63 @@ export function isValidSuiObjectId(value: string): boolean {
32
32
  return isValidSuiAddress(value);
33
33
  }
34
34
 
35
+ const MOVE_IDENTIFIER_REGEX = /^[a-zA-Z][a-zA-Z0-9_]*$/;
36
+
37
+ export function isValidMoveIdentifier(name: string): boolean {
38
+ return MOVE_IDENTIFIER_REGEX.test(name);
39
+ }
40
+
41
+ const PRIMITIVE_TYPE_TAGS = [
42
+ 'bool',
43
+ 'u8',
44
+ 'u16',
45
+ 'u32',
46
+ 'u64',
47
+ 'u128',
48
+ 'u256',
49
+ 'address',
50
+ 'signer',
51
+ ];
52
+
53
+ const VECTOR_TYPE_REGEX = /^vector<(.+)>$/;
54
+
55
+ function isValidTypeTag(type: string): boolean {
56
+ if (PRIMITIVE_TYPE_TAGS.includes(type)) return true;
57
+
58
+ const vectorMatch = type.match(VECTOR_TYPE_REGEX);
59
+ if (vectorMatch) return isValidTypeTag(vectorMatch[1]);
60
+
61
+ if (type.includes('::')) return isValidStructTag(type);
62
+
63
+ return false;
64
+ }
65
+
66
+ function isValidParsedStructTag(tag: StructTag): boolean {
67
+ if (!isValidSuiAddress(tag.address) && !isValidNamedPackage(tag.address)) {
68
+ return false;
69
+ }
70
+
71
+ if (!isValidMoveIdentifier(tag.module) || !isValidMoveIdentifier(tag.name)) {
72
+ return false;
73
+ }
74
+
75
+ return tag.typeParams.every((param) => {
76
+ if (typeof param === 'string') {
77
+ return isValidTypeTag(param);
78
+ }
79
+ return isValidParsedStructTag(param);
80
+ });
81
+ }
82
+
83
+ export function isValidStructTag(type: string): boolean {
84
+ try {
85
+ const tag = parseStructTag(type);
86
+ return isValidParsedStructTag(tag);
87
+ } catch {
88
+ return false;
89
+ }
90
+ }
91
+
35
92
  export type StructTag = {
36
93
  address: string;
37
94
  module: string;
@@ -40,6 +97,21 @@ export type StructTag = {
40
97
  };
41
98
 
42
99
  function parseTypeTag(type: string): string | StructTag {
100
+ if (type.startsWith('vector<')) {
101
+ if (!type.endsWith('>')) {
102
+ throw new Error(`Invalid type tag: ${type}`);
103
+ }
104
+ const inner = type.slice(7, -1);
105
+ if (!inner) {
106
+ throw new Error(`Invalid type tag: ${type}`);
107
+ }
108
+ const parsed = parseTypeTag(inner);
109
+ if (typeof parsed === 'string') {
110
+ return `vector<${parsed}>`;
111
+ }
112
+ return `vector<${normalizeStructTag(parsed)}>`;
113
+ }
114
+
43
115
  if (!type.includes('::')) return type;
44
116
 
45
117
  return parseStructTag(type);
package/src/version.ts CHANGED
@@ -3,5 +3,5 @@
3
3
 
4
4
  // This file is generated by genversion.mjs. Do not edit it directly.
5
5
 
6
- export const PACKAGE_VERSION = '2.3.2';
7
- export const TARGETED_RPC_VERSION = '1.66.0';
6
+ export const PACKAGE_VERSION = '2.5.0';
7
+ export const TARGETED_RPC_VERSION = '1.67.0';