@haneullabs/codegen 0.1.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 (119) hide show
  1. package/CHANGELOG.md +259 -0
  2. package/README.md +195 -0
  3. package/dist/cjs/bin/bash-complete.d.ts +2 -0
  4. package/dist/cjs/bin/bash-complete.js +51 -0
  5. package/dist/cjs/bin/bash-complete.js.map +7 -0
  6. package/dist/cjs/bin/cli.d.ts +2 -0
  7. package/dist/cjs/bin/cli.js +34 -0
  8. package/dist/cjs/bin/cli.js.map +7 -0
  9. package/dist/cjs/cli/cli.d.ts +1 -0
  10. package/dist/cjs/cli/cli.js +49 -0
  11. package/dist/cjs/cli/cli.js.map +7 -0
  12. package/dist/cjs/cli/commands/generate/command.d.ts +1 -0
  13. package/dist/cjs/cli/commands/generate/command.js +80 -0
  14. package/dist/cjs/cli/commands/generate/command.js.map +7 -0
  15. package/dist/cjs/cli/commands/generate/impl.d.ts +8 -0
  16. package/dist/cjs/cli/commands/generate/impl.js +66 -0
  17. package/dist/cjs/cli/commands/generate/impl.js.map +7 -0
  18. package/dist/cjs/cli/context.d.ts +6 -0
  19. package/dist/cjs/cli/context.js +45 -0
  20. package/dist/cjs/cli/context.js.map +7 -0
  21. package/dist/cjs/config.d.ts +51 -0
  22. package/dist/cjs/config.js +75 -0
  23. package/dist/cjs/config.js.map +7 -0
  24. package/dist/cjs/file-builder.d.ts +13 -0
  25. package/dist/cjs/file-builder.js +83 -0
  26. package/dist/cjs/file-builder.js.map +7 -0
  27. package/dist/cjs/generate-utils.d.ts +1 -0
  28. package/dist/cjs/generate-utils.js +187 -0
  29. package/dist/cjs/generate-utils.js.map +7 -0
  30. package/dist/cjs/index.d.ts +8 -0
  31. package/dist/cjs/index.js +124 -0
  32. package/dist/cjs/index.js.map +7 -0
  33. package/dist/cjs/move-module-builder.d.ts +26 -0
  34. package/dist/cjs/move-module-builder.js +464 -0
  35. package/dist/cjs/move-module-builder.js.map +7 -0
  36. package/dist/cjs/package.json +5 -0
  37. package/dist/cjs/render-types.d.ts +19 -0
  38. package/dist/cjs/render-types.js +313 -0
  39. package/dist/cjs/render-types.js.map +7 -0
  40. package/dist/cjs/summary.d.ts +3 -0
  41. package/dist/cjs/summary.js +218 -0
  42. package/dist/cjs/summary.js.map +7 -0
  43. package/dist/cjs/types/deserialized.d.ts +89 -0
  44. package/dist/cjs/types/deserialized.js +17 -0
  45. package/dist/cjs/types/deserialized.js.map +7 -0
  46. package/dist/cjs/types/summary.d.ts +105 -0
  47. package/dist/cjs/types/summary.js +17 -0
  48. package/dist/cjs/types/summary.js.map +7 -0
  49. package/dist/cjs/utils.d.ts +22 -0
  50. package/dist/cjs/utils.js +164 -0
  51. package/dist/cjs/utils.js.map +7 -0
  52. package/dist/esm/bin/bash-complete.d.ts +2 -0
  53. package/dist/esm/bin/bash-complete.js +31 -0
  54. package/dist/esm/bin/bash-complete.js.map +7 -0
  55. package/dist/esm/bin/cli.d.ts +2 -0
  56. package/dist/esm/bin/cli.js +32 -0
  57. package/dist/esm/bin/cli.js.map +7 -0
  58. package/dist/esm/cli/cli.d.ts +1 -0
  59. package/dist/esm/cli/cli.js +29 -0
  60. package/dist/esm/cli/cli.js.map +7 -0
  61. package/dist/esm/cli/commands/generate/command.d.ts +1 -0
  62. package/dist/esm/cli/commands/generate/command.js +50 -0
  63. package/dist/esm/cli/commands/generate/command.js.map +7 -0
  64. package/dist/esm/cli/commands/generate/impl.d.ts +8 -0
  65. package/dist/esm/cli/commands/generate/impl.js +46 -0
  66. package/dist/esm/cli/commands/generate/impl.js.map +7 -0
  67. package/dist/esm/cli/context.d.ts +6 -0
  68. package/dist/esm/cli/context.js +15 -0
  69. package/dist/esm/cli/context.js.map +7 -0
  70. package/dist/esm/config.d.ts +51 -0
  71. package/dist/esm/config.js +45 -0
  72. package/dist/esm/config.js.map +7 -0
  73. package/dist/esm/file-builder.d.ts +13 -0
  74. package/dist/esm/file-builder.js +63 -0
  75. package/dist/esm/file-builder.js.map +7 -0
  76. package/dist/esm/generate-utils.d.ts +1 -0
  77. package/dist/esm/generate-utils.js +167 -0
  78. package/dist/esm/generate-utils.js.map +7 -0
  79. package/dist/esm/index.d.ts +8 -0
  80. package/dist/esm/index.js +104 -0
  81. package/dist/esm/index.js.map +7 -0
  82. package/dist/esm/move-module-builder.d.ts +26 -0
  83. package/dist/esm/move-module-builder.js +457 -0
  84. package/dist/esm/move-module-builder.js.map +7 -0
  85. package/dist/esm/package.json +5 -0
  86. package/dist/esm/render-types.d.ts +19 -0
  87. package/dist/esm/render-types.js +293 -0
  88. package/dist/esm/render-types.js.map +7 -0
  89. package/dist/esm/summary.d.ts +3 -0
  90. package/dist/esm/summary.js +198 -0
  91. package/dist/esm/summary.js.map +7 -0
  92. package/dist/esm/types/deserialized.d.ts +89 -0
  93. package/dist/esm/types/deserialized.js +1 -0
  94. package/dist/esm/types/deserialized.js.map +7 -0
  95. package/dist/esm/types/summary.d.ts +105 -0
  96. package/dist/esm/types/summary.js +1 -0
  97. package/dist/esm/types/summary.js.map +7 -0
  98. package/dist/esm/utils.d.ts +22 -0
  99. package/dist/esm/utils.js +134 -0
  100. package/dist/esm/utils.js.map +7 -0
  101. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  102. package/dist/tsconfig.tsbuildinfo +1 -0
  103. package/package.json +70 -0
  104. package/src/bin/bash-complete.ts +35 -0
  105. package/src/bin/cli.ts +40 -0
  106. package/src/cli/cli.ts +29 -0
  107. package/src/cli/commands/generate/command.ts +50 -0
  108. package/src/cli/commands/generate/impl.ts +66 -0
  109. package/src/cli/context.ts +21 -0
  110. package/src/config.ts +54 -0
  111. package/src/file-builder.ts +74 -0
  112. package/src/generate-utils.ts +163 -0
  113. package/src/index.ts +131 -0
  114. package/src/move-module-builder.ts +599 -0
  115. package/src/render-types.ts +349 -0
  116. package/src/summary.ts +242 -0
  117. package/src/types/deserialized.ts +107 -0
  118. package/src/types/summary.ts +144 -0
  119. package/src/utils.ts +180 -0
@@ -0,0 +1,349 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { normalizeHaneulAddress } from '@haneullabs/haneul/utils';
5
+
6
+ import type { Datatype, ModuleSummary, Type, TypeParameter } from './types/summary.js';
7
+
8
+ export const MOVE_STDLIB_ADDRESS = normalizeHaneulAddress('0x1');
9
+ export const HANEUL_FRAMEWORK_ADDRESS = normalizeHaneulAddress('0x2');
10
+ export const HANEUL_SYSTEM_ADDRESS = normalizeHaneulAddress('0x3');
11
+
12
+ type TypeSignatureFormat = 'typescriptArg' | 'bcs' | 'typeTag';
13
+ interface RenderTypeSignatureOptions {
14
+ format: TypeSignatureFormat;
15
+ summary: ModuleSummary;
16
+ typeParameters?: TypeParameter[];
17
+ onDependency?: (address: string, module: string, type: string) => string | undefined;
18
+ onBcsType?: () => void;
19
+ onTypeParameter?: (typeParameter: number | string) => void;
20
+ resolveAddress: (address: string) => string;
21
+ }
22
+
23
+ export function renderTypeSignature(type: Type, options: RenderTypeSignatureOptions): string {
24
+ if (options.onBcsType) {
25
+ if (usesBcs(type, options)) {
26
+ options.onBcsType();
27
+ }
28
+ }
29
+
30
+ switch (type) {
31
+ case 'address':
32
+ switch (options.format) {
33
+ case 'typescriptArg':
34
+ return 'string';
35
+ case 'typeTag':
36
+ return `address`;
37
+ case 'bcs':
38
+ return 'bcs.Address';
39
+ default:
40
+ throw new Error(`Unknown format: ${options.format}`);
41
+ }
42
+ case 'bool':
43
+ switch (options.format) {
44
+ case 'typescriptArg':
45
+ return 'boolean';
46
+ case 'typeTag':
47
+ return `bool`;
48
+ case 'bcs':
49
+ return 'bcs.bool()';
50
+ default:
51
+ throw new Error(`Unknown format: ${options.format}`);
52
+ }
53
+ case 'u8':
54
+ case 'u16':
55
+ case 'u32':
56
+ switch (options.format) {
57
+ case 'typescriptArg':
58
+ return 'number';
59
+ case 'typeTag':
60
+ return type.toLowerCase();
61
+ case 'bcs':
62
+ return `bcs.${type.toLowerCase()}()`;
63
+ default:
64
+ throw new Error(`Unknown format: ${options.format}`);
65
+ }
66
+ case 'u64':
67
+ case 'u128':
68
+ case 'u256':
69
+ switch (options.format) {
70
+ case 'typescriptArg':
71
+ return `number | bigint`;
72
+ case 'typeTag':
73
+ return type.toLowerCase();
74
+ case 'bcs':
75
+ return `bcs.${type.toLowerCase()}()`;
76
+ default:
77
+ throw new Error(`Unknown format: ${options.format}`);
78
+ }
79
+ case 'signer':
80
+ throw new Error('Signer is not supported');
81
+ case '_':
82
+ throw new Error('Macro placeholder is not supported');
83
+ }
84
+
85
+ if ('Datatype' in type) {
86
+ return renderDataType(type.Datatype, options);
87
+ }
88
+
89
+ if ('Reference' in type) {
90
+ return renderTypeSignature(type.Reference[1], options);
91
+ }
92
+
93
+ if ('vector' in type) {
94
+ switch (options.format) {
95
+ case 'typescriptArg':
96
+ return `${renderTypeSignature(type.vector, options)}[]`;
97
+ case 'typeTag':
98
+ return `vector<${renderTypeSignature(type.vector, options)}>`;
99
+ case 'bcs':
100
+ return `bcs.vector(${renderTypeSignature(type.vector, options)})`;
101
+ default:
102
+ throw new Error(`Unknown format: ${options.format}`);
103
+ }
104
+ }
105
+
106
+ if ('TypeParameter' in type) {
107
+ options.onTypeParameter?.(type.TypeParameter);
108
+ switch (options.format) {
109
+ case 'typescriptArg':
110
+ return options.typeParameters?.[type.TypeParameter]?.name ?? `T${type.TypeParameter}`;
111
+ case 'typeTag':
112
+ return `\${options.typeArguments[${type.TypeParameter}]}`;
113
+ case 'bcs':
114
+ return `typeParameters[${type.TypeParameter}]`;
115
+ default:
116
+ throw new Error(`Unknown format: ${options.format}`);
117
+ }
118
+ }
119
+
120
+ if ('NamedTypeParameter' in type) {
121
+ options.onTypeParameter?.(type.NamedTypeParameter);
122
+ const index =
123
+ options.typeParameters?.findIndex((p) => p.name === type.NamedTypeParameter) ?? -1;
124
+
125
+ if (index === -1) {
126
+ throw new Error(`Named type parameter ${type.NamedTypeParameter} not found`);
127
+ }
128
+
129
+ switch (options.format) {
130
+ case 'typescriptArg':
131
+ return type.NamedTypeParameter;
132
+ case 'typeTag':
133
+ return `\${options.typeArguments[${index}]}`;
134
+ case 'bcs':
135
+ return `typeParameters[${index}]`;
136
+ default:
137
+ throw new Error(`Unknown format: ${options.format}`);
138
+ }
139
+ }
140
+
141
+ throw new Error(`Unknown type signature: ${JSON.stringify(type, null, 2)}`);
142
+ }
143
+
144
+ export function usesBcs(type: Type, options: RenderTypeSignatureOptions): boolean {
145
+ if (typeof type === 'string') {
146
+ return true;
147
+ }
148
+
149
+ if ('Reference' in type) {
150
+ return usesBcs(type.Reference[1], options);
151
+ }
152
+
153
+ if ('Datatype' in type) {
154
+ return isPureDataType(type.Datatype, options);
155
+ }
156
+
157
+ if ('vector' in type) {
158
+ return true;
159
+ }
160
+
161
+ return false;
162
+ }
163
+
164
+ export function isPureSignature(type: Type, options: RenderTypeSignatureOptions): boolean {
165
+ if (typeof type === 'string') {
166
+ return true;
167
+ }
168
+
169
+ if ('Reference' in type) {
170
+ return isPureSignature(type.Reference[1], options);
171
+ }
172
+
173
+ if ('Datatype' in type) {
174
+ return isPureDataType(type.Datatype, options);
175
+ }
176
+
177
+ if ('vector' in type) {
178
+ return isPureSignature(type.vector, options);
179
+ }
180
+
181
+ if ('TypeParameter' in type) {
182
+ return false;
183
+ }
184
+
185
+ if ('NamedTypeParameter' in type) {
186
+ return false;
187
+ }
188
+
189
+ throw new Error(`Unknown type signature: ${JSON.stringify(type, null, 2)}`);
190
+ }
191
+
192
+ function isPureDataType(type: Datatype, options: RenderTypeSignatureOptions) {
193
+ const address = options.resolveAddress(type.module.address);
194
+
195
+ if (address === MOVE_STDLIB_ADDRESS) {
196
+ if ((type.module.name === 'ascii' || type.module.name === 'string') && type.name === 'String') {
197
+ return true;
198
+ }
199
+
200
+ if (type.module.name === 'option' && type.name === 'Option') {
201
+ return true;
202
+ }
203
+ }
204
+
205
+ if (address === HANEUL_FRAMEWORK_ADDRESS) {
206
+ if (type.module.name === 'object' && type.name === 'ID') {
207
+ return true;
208
+ }
209
+ }
210
+
211
+ return false;
212
+ }
213
+
214
+ function renderDataType(type: Datatype, options: RenderTypeSignatureOptions): string {
215
+ const address = options.resolveAddress(type.module.address);
216
+
217
+ if (options.format === 'typeTag') {
218
+ const typeArgs = type.type_arguments.map((type) => renderTypeSignature(type.argument, options));
219
+
220
+ if (typeArgs.length === 0) {
221
+ // eslint-disable-next-line no-template-curly-in-string
222
+ return `${address === options.resolveAddress(options.summary.id.address) ? '${packageAddress}' : address}::${type.module.name}::${type.name}`;
223
+ }
224
+
225
+ // eslint-disable-next-line no-template-curly-in-string
226
+ return `${address === options.resolveAddress(options.summary.id.address) ? '${packageAddress}' : address}::${type.module.name}::${type.name}<${typeArgs.join(', ')}>`;
227
+ }
228
+
229
+ if (address === MOVE_STDLIB_ADDRESS) {
230
+ if ((type.module.name === 'ascii' || type.module.name === 'string') && type.name === 'String') {
231
+ switch (options.format) {
232
+ case 'typescriptArg':
233
+ return 'string';
234
+ case 'bcs':
235
+ return 'bcs.string()';
236
+ default:
237
+ throw new Error(`Unknown format: ${options.format}`);
238
+ }
239
+ }
240
+
241
+ if (type.module.name === 'option' && type.name === 'Option') {
242
+ switch (options.format) {
243
+ case 'typescriptArg':
244
+ if (isPureDataType(type, options)) {
245
+ return `${renderTypeSignature(type.type_arguments[0].argument, options)} | null`;
246
+ }
247
+ break;
248
+ case 'bcs':
249
+ return `bcs.option(${renderTypeSignature(type.type_arguments[0].argument, options)})`;
250
+ default:
251
+ throw new Error(`Unknown format: ${options.format}`);
252
+ }
253
+ }
254
+ }
255
+
256
+ if (address === HANEUL_FRAMEWORK_ADDRESS) {
257
+ if (type.module.name === 'object' && type.name === 'ID') {
258
+ switch (options.format) {
259
+ case 'typescriptArg':
260
+ return 'string';
261
+ case 'bcs':
262
+ return 'bcs.Address';
263
+ default:
264
+ throw new Error(`Unknown format: ${options.format}`);
265
+ }
266
+ }
267
+ }
268
+
269
+ const isCurrentModule =
270
+ address === options.resolveAddress(options.summary.id.address) &&
271
+ type.module.name === options.summary.id.name;
272
+
273
+ const importName = options.onDependency?.(type.module.address, type.module.name, type.name);
274
+
275
+ const typeNameRef = isCurrentModule
276
+ ? type.name
277
+ : `${importName ?? getSafeName(type.module.name)}.${getSafeName(type.name)}`;
278
+
279
+ const filteredTypeArguments = type.type_arguments.filter((arg) => !arg.phantom);
280
+
281
+ switch (options.format) {
282
+ case 'typescriptArg':
283
+ return 'string';
284
+ case 'bcs':
285
+ if (filteredTypeArguments.length === 0) {
286
+ return typeNameRef;
287
+ }
288
+
289
+ return `${typeNameRef}(
290
+ ${filteredTypeArguments.map((type) => renderTypeSignature(type.argument, options)).join(', ')})`;
291
+ default:
292
+ throw new Error(`Unknown format: ${options.format}`);
293
+ }
294
+ }
295
+
296
+ const JS_RESERVED_NAMES = [
297
+ 'new',
298
+ 'delete',
299
+ 'class',
300
+ 'function',
301
+ 'import',
302
+ 'export',
303
+ 'return',
304
+ 'this',
305
+ 'super',
306
+ 'arguments',
307
+ 'eval',
308
+ 'void',
309
+ 'typeof',
310
+ 'instanceof',
311
+ 'delete',
312
+ 'in',
313
+ 'from',
314
+ 'of',
315
+ 'as',
316
+ 'async',
317
+ 'await',
318
+ 'break',
319
+ 'case',
320
+ 'catch',
321
+ 'continue',
322
+ 'debugger',
323
+ 'default',
324
+ 'do',
325
+ 'else',
326
+ 'finally',
327
+ 'for',
328
+ 'function',
329
+ 'if',
330
+ 'import',
331
+ 'in',
332
+ 'instanceof',
333
+ 'new',
334
+ 'return',
335
+ 'switch',
336
+ 'throw',
337
+ 'try',
338
+ 'typeof',
339
+ 'var',
340
+ 'void',
341
+ 'while',
342
+ 'with',
343
+ 'yield',
344
+ 'package',
345
+ ];
346
+
347
+ export function getSafeName(name: string) {
348
+ return JS_RESERVED_NAMES.includes(name) ? `_${name}` : name;
349
+ }
package/src/summary.ts ADDED
@@ -0,0 +1,242 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { normalizeHaneulAddress } from '@haneullabs/haneul/utils';
5
+ import type { DeserializedModule, TypeSignature } from './types/deserialized.js';
6
+ import type {
7
+ EnumSummary,
8
+ Field,
9
+ FunctionSummary,
10
+ ModuleSummary,
11
+ StructSummary,
12
+ Type,
13
+ Variant,
14
+ } from './types/summary.js';
15
+
16
+ export function summaryFromDeserializedModule(mod: DeserializedModule) {
17
+ const moduleHandle = mod.module_handles[mod.self_module_handle_idx];
18
+ const summary: ModuleSummary = {
19
+ id: {
20
+ address: normalizeHaneulAddress(mod.address_identifiers[moduleHandle.address]),
21
+ name: mod.identifiers[moduleHandle.name],
22
+ },
23
+ immediate_dependencies: mod.module_handles.map((m) => ({
24
+ address: normalizeHaneulAddress(mod.address_identifiers[m.address]),
25
+ name: mod.identifiers[m.name],
26
+ })),
27
+ functions: Object.fromEntries(
28
+ Array.from({ length: mod.function_defs.length }, (_, i) =>
29
+ functionSummaryFromDeserializedFunction(mod, i),
30
+ ),
31
+ ),
32
+ structs: Object.fromEntries(
33
+ Array.from({ length: mod.struct_defs.length }, (_, i) =>
34
+ structSummaryFromDeserializedStruct(mod, i),
35
+ ),
36
+ ),
37
+ enums: Object.fromEntries(
38
+ Array.from({ length: mod.enum_defs.length }, (_, i) =>
39
+ enumSummaryFromDeserializedEnum(mod, i),
40
+ ),
41
+ ),
42
+ };
43
+
44
+ return summary;
45
+ }
46
+
47
+ function functionSummaryFromDeserializedFunction(mod: DeserializedModule, index: number) {
48
+ const def = mod.function_defs[index];
49
+ const handle = mod.function_handles[def.function];
50
+ const name = mod.identifiers[handle.name];
51
+
52
+ const functionSummary: FunctionSummary = {
53
+ index,
54
+ visibility: def.visibility,
55
+ entry: def.is_entry,
56
+ type_parameters: handle.type_parameters.map((p) => {
57
+ return {
58
+ phantom: p.is_phantom,
59
+ constraints: [],
60
+ };
61
+ }),
62
+ parameters: mod.signatures[handle.parameters].map((type) => ({
63
+ type_: typeFromTypeSignature(mod, type),
64
+ })),
65
+ return_: mod.signatures[handle.return_].map((type) => typeFromTypeSignature(mod, type)),
66
+ };
67
+
68
+ return [name, functionSummary];
69
+ }
70
+
71
+ function structSummaryFromDeserializedStruct(mod: DeserializedModule, index: number) {
72
+ const def = mod.struct_defs[index];
73
+ const handle = mod.datatype_handles[def.struct_handle];
74
+ const name = mod.identifiers[handle.name];
75
+
76
+ const structSummary: StructSummary = {
77
+ index,
78
+ abilities: [],
79
+ type_parameters: handle.type_parameters.map((p) => {
80
+ return {
81
+ phantom: p.is_phantom,
82
+ constraints: [],
83
+ };
84
+ }),
85
+ fields: {
86
+ positional_fields: false,
87
+ fields: Object.fromEntries(
88
+ (def.field_information.Declared ?? []).map((field) =>
89
+ fieldSummaryFromDeserializedField(mod, field),
90
+ ),
91
+ ),
92
+ },
93
+ };
94
+
95
+ return [name, structSummary];
96
+ }
97
+
98
+ function enumSummaryFromDeserializedEnum(mod: DeserializedModule, index: number) {
99
+ const def = mod.enum_defs[index];
100
+ const handle = mod.datatype_handles[def.enum_handle];
101
+ const name = mod.identifiers[handle.name];
102
+
103
+ const enumSummary: EnumSummary = {
104
+ index,
105
+ abilities: [],
106
+ type_parameters: handle.type_parameters.map((p) => {
107
+ return {
108
+ phantom: p.is_phantom,
109
+ constraints: [],
110
+ };
111
+ }),
112
+ variants: Object.fromEntries(
113
+ def.variants.map((variant) => variantSummaryFromDeserializedVariant(mod, variant)),
114
+ ),
115
+ };
116
+
117
+ return [name, enumSummary];
118
+ }
119
+
120
+ function variantSummaryFromDeserializedVariant(
121
+ mod: DeserializedModule,
122
+ variant: {
123
+ variant_name: number;
124
+ fields: Array<{
125
+ name: number;
126
+ signature: TypeSignature;
127
+ }>;
128
+ },
129
+ ): [string, Variant] {
130
+ return [
131
+ mod.identifiers[variant.variant_name],
132
+ {
133
+ index: variant.variant_name,
134
+ fields: {
135
+ positional_fields: false,
136
+ fields: Object.fromEntries(
137
+ variant.fields.map((field) => fieldSummaryFromDeserializedField(mod, field)),
138
+ ),
139
+ },
140
+ },
141
+ ];
142
+ }
143
+
144
+ function fieldSummaryFromDeserializedField(
145
+ mod: DeserializedModule,
146
+ declared: {
147
+ name: number;
148
+ signature: TypeSignature;
149
+ },
150
+ ) {
151
+ const name = mod.identifiers[declared.name];
152
+ const type = typeFromTypeSignature(mod, declared.signature);
153
+
154
+ const field: Field = {
155
+ index: declared.name,
156
+ type_: type,
157
+ };
158
+
159
+ return [name, field];
160
+ }
161
+
162
+ function typeFromTypeSignature(mod: DeserializedModule, type: TypeSignature): Type {
163
+ switch (type) {
164
+ case 'U8':
165
+ return 'u8';
166
+ case 'U16':
167
+ return 'u16';
168
+ case 'U32':
169
+ return 'u32';
170
+ case 'U64':
171
+ return 'u64';
172
+ case 'U128':
173
+ return 'u128';
174
+ case 'U256':
175
+ return 'u256';
176
+ case 'Address':
177
+ return 'address';
178
+ case 'Bool':
179
+ return 'bool';
180
+ }
181
+
182
+ if ('Datatype' in type) {
183
+ const handle = mod.datatype_handles[type.Datatype];
184
+ const module = mod.module_handles[handle.module];
185
+ return {
186
+ Datatype: {
187
+ module: {
188
+ address: normalizeHaneulAddress(mod.address_identifiers[module.address]),
189
+ name: mod.identifiers[module.name],
190
+ },
191
+ name: mod.identifiers[handle.name],
192
+ type_arguments: [],
193
+ },
194
+ };
195
+ }
196
+
197
+ if ('DatatypeInstantiation' in type) {
198
+ const handle = mod.datatype_handles[type.DatatypeInstantiation[0]];
199
+ const module = mod.module_handles[handle.module];
200
+ return {
201
+ Datatype: {
202
+ module: {
203
+ address: normalizeHaneulAddress(mod.address_identifiers[module.address]),
204
+ name: mod.identifiers[module.name],
205
+ },
206
+ name: mod.identifiers[handle.name],
207
+ type_arguments: type.DatatypeInstantiation[1].map((t, i) => {
208
+ return {
209
+ phantom: handle.type_parameters[i].is_phantom,
210
+ argument: typeFromTypeSignature(mod, t),
211
+ };
212
+ }),
213
+ },
214
+ };
215
+ }
216
+
217
+ if ('Vector' in type) {
218
+ return {
219
+ vector: typeFromTypeSignature(mod, type.Vector),
220
+ };
221
+ }
222
+
223
+ if ('TypeParameter' in type) {
224
+ return {
225
+ TypeParameter: type.TypeParameter,
226
+ };
227
+ }
228
+
229
+ if ('Reference' in type) {
230
+ return {
231
+ Reference: [false, typeFromTypeSignature(mod, type.Reference)],
232
+ };
233
+ }
234
+
235
+ if ('MutableReference' in type) {
236
+ return {
237
+ Reference: [true, typeFromTypeSignature(mod, type.MutableReference)],
238
+ };
239
+ }
240
+
241
+ throw new Error(`Unknown type: ${type}`);
242
+ }
@@ -0,0 +1,107 @@
1
+ // Copyright (c) Mysten Labs, Inc.
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ export type TypeSignature =
5
+ | 'U8'
6
+ | 'U16'
7
+ | 'U32'
8
+ | 'U64'
9
+ | 'U128'
10
+ | 'U256'
11
+ | 'Address'
12
+ | 'Bool'
13
+ | {
14
+ Datatype: number;
15
+ }
16
+ | {
17
+ DatatypeInstantiation: [number, TypeSignature[]];
18
+ }
19
+ | {
20
+ Vector: TypeSignature;
21
+ }
22
+ | {
23
+ TypeParameter: number;
24
+ }
25
+ | {
26
+ Reference: TypeSignature;
27
+ }
28
+ | {
29
+ MutableReference: TypeSignature;
30
+ };
31
+
32
+ export interface DeserializedModule {
33
+ version: number;
34
+ self_module_handle_idx: number;
35
+ module_handles: Array<{
36
+ name: number;
37
+ address: number;
38
+ }>;
39
+ datatype_handles: Array<{
40
+ name: number;
41
+ module: number;
42
+ abilities: number;
43
+ type_parameters: Array<{
44
+ constraints: number;
45
+ is_phantom: boolean;
46
+ }>;
47
+ }>;
48
+ function_handles: Array<{
49
+ module: number;
50
+ name: number;
51
+ parameters: number;
52
+ return_: number;
53
+ type_parameters: Array<{
54
+ constraints: number;
55
+ is_phantom: boolean;
56
+ }>;
57
+ }>;
58
+ field_handles: Array<{
59
+ owner: number;
60
+ field: number;
61
+ }>;
62
+ friend_decls: Array<unknown>;
63
+ struct_def_instantiations: Array<unknown>;
64
+ function_instantiations: Array<unknown>;
65
+ field_instantiations: Array<unknown>;
66
+ signatures: Array<Array<TypeSignature>>;
67
+ identifiers: Array<string>;
68
+ address_identifiers: Array<string>;
69
+ constant_pool: Array<{
70
+ type_: TypeSignature;
71
+ data: Array<number>;
72
+ }>;
73
+ metadata: Array<unknown>;
74
+ struct_defs: Array<{
75
+ struct_handle: number;
76
+ field_information: {
77
+ Declared?: Array<{
78
+ name: number;
79
+ signature: TypeSignature;
80
+ }>;
81
+ };
82
+ }>;
83
+ function_defs: Array<{
84
+ function: number;
85
+ visibility: 'Public' | 'Private' | 'Friend';
86
+ is_entry: boolean;
87
+ acquires_global_resources: Array<unknown>;
88
+ flags: number;
89
+ code: unknown;
90
+ }>;
91
+ enum_defs: Array<{
92
+ enum_handle: number;
93
+ variants: Array<{
94
+ variant_name: number;
95
+ fields: Array<{
96
+ name: number;
97
+ signature: TypeSignature;
98
+ }>;
99
+ }>;
100
+ }>;
101
+ enum_def_instantiations: Array<unknown>;
102
+ variant_handles: Array<{
103
+ enum_def: number;
104
+ variant: number;
105
+ }>;
106
+ variant_instantiation_handles: Array<unknown>;
107
+ }