@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.
- package/CHANGELOG.md +21 -0
- package/dist/bcs/bcs.d.mts +6 -6
- package/dist/bcs/index.d.mts +20 -20
- package/dist/client/types.d.mts +13 -6
- package/dist/client/types.d.mts.map +1 -1
- package/dist/cryptography/signature.d.mts +14 -14
- package/dist/graphql/core.d.mts.map +1 -1
- package/dist/graphql/core.mjs +7 -3
- package/dist/graphql/core.mjs.map +1 -1
- package/dist/graphql/generated/queries.mjs +1 -0
- package/dist/graphql/generated/queries.mjs.map +1 -1
- package/dist/grpc/core.d.mts.map +1 -1
- package/dist/grpc/core.mjs +7 -3
- package/dist/grpc/core.mjs.map +1 -1
- package/dist/grpc/proto/sui/rpc/v2/ledger_service.client.d.mts +4 -4
- package/dist/grpc/proto/sui/rpc/v2/move_package_service.client.d.mts +4 -4
- package/dist/grpc/proto/sui/rpc/v2/name_service.client.d.mts +4 -4
- package/dist/grpc/proto/sui/rpc/v2/state_service.client.d.mts +4 -4
- package/dist/grpc/proto/sui/rpc/v2/subscription_service.client.d.mts +4 -4
- package/dist/grpc/proto/sui/rpc/v2/transaction_execution_service.client.d.mts +4 -4
- package/dist/jsonRpc/core.d.mts +1 -9
- package/dist/jsonRpc/core.d.mts.map +1 -1
- package/dist/jsonRpc/core.mjs +10 -4
- package/dist/jsonRpc/core.mjs.map +1 -1
- package/dist/transactions/Transaction.d.mts +3 -3
- package/dist/transactions/Transaction.d.mts.map +1 -1
- package/dist/utils/index.d.mts +2 -2
- package/dist/utils/index.mjs +2 -2
- package/dist/utils/move-registry.d.mts +1 -2
- package/dist/utils/move-registry.d.mts.map +1 -1
- package/dist/utils/move-registry.mjs +3 -3
- package/dist/utils/move-registry.mjs.map +1 -1
- package/dist/utils/sui-types.d.mts +2 -1
- package/dist/utils/sui-types.d.mts.map +1 -1
- package/dist/utils/sui-types.mjs +47 -1
- package/dist/utils/sui-types.mjs.map +1 -1
- package/dist/version.mjs +2 -2
- package/dist/version.mjs.map +1 -1
- package/dist/zklogin/bcs.d.mts +14 -14
- package/dist/zklogin/bcs.d.mts.map +1 -1
- package/package.json +1 -1
- package/src/client/types.ts +8 -6
- package/src/graphql/core.ts +14 -4
- package/src/graphql/generated/queries.ts +2 -1
- package/src/graphql/queries/getDynamicFields.graphql +1 -0
- package/src/grpc/core.ts +20 -16
- package/src/jsonRpc/core.ts +11 -4
- package/src/utils/index.ts +1 -0
- package/src/utils/move-registry.ts +3 -4
- package/src/utils/sui-types.ts +72 -0
- package/src/version.ts +2 -2
package/src/client/types.ts
CHANGED
|
@@ -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 {
|
package/src/graphql/core.ts
CHANGED
|
@@ -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
|
-
|
|
588
|
+
derivedNameType,
|
|
583
589
|
fromBase64(dynamicField.name?.bcs!),
|
|
584
590
|
),
|
|
585
591
|
type: normalizeStructTag(
|
|
586
|
-
|
|
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
|
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(
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
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
|
};
|
package/src/jsonRpc/core.ts
CHANGED
|
@@ -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
|
-
|
|
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:
|
|
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,
|
package/src/utils/index.ts
CHANGED
|
@@ -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
|
-
|
|
42
|
-
return true;
|
|
41
|
+
return isValidStructTag(type);
|
|
43
42
|
};
|
package/src/utils/sui-types.ts
CHANGED
|
@@ -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