@dedot/codegen 0.18.8 → 1.0.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 (91) hide show
  1. package/chaintypes/generator/ConstsGen.js +1 -1
  2. package/chaintypes/generator/ErrorsGen.js +3 -3
  3. package/chaintypes/generator/EventsGen.js +3 -3
  4. package/chaintypes/generator/IndexGen.d.ts +1 -0
  5. package/chaintypes/generator/IndexGen.js +34 -2
  6. package/chaintypes/generator/JsonRpcGen.js +1 -1
  7. package/chaintypes/generator/QueryGen.js +4 -4
  8. package/chaintypes/generator/RuntimeApisGen.js +5 -5
  9. package/chaintypes/generator/TxGen.js +6 -10
  10. package/chaintypes/generator/ViewFunctionsGen.js +3 -3
  11. package/chaintypes/index.d.ts +22 -3
  12. package/chaintypes/index.js +63 -13
  13. package/chaintypes/templates/consts.hbs +1 -1
  14. package/chaintypes/templates/errors.hbs +1 -1
  15. package/chaintypes/templates/events.hbs +1 -1
  16. package/chaintypes/templates/index.hbs +10 -14
  17. package/chaintypes/templates/json-rpc.hbs +3 -3
  18. package/chaintypes/templates/query.hbs +1 -1
  19. package/chaintypes/templates/runtime.hbs +1 -1
  20. package/chaintypes/templates/tx.hbs +1 -1
  21. package/chaintypes/templates/view-functions.hbs +1 -1
  22. package/cjs/chaintypes/generator/ConstsGen.js +1 -1
  23. package/cjs/chaintypes/generator/ErrorsGen.js +3 -3
  24. package/cjs/chaintypes/generator/EventsGen.js +3 -3
  25. package/cjs/chaintypes/generator/IndexGen.js +34 -2
  26. package/cjs/chaintypes/generator/JsonRpcGen.js +1 -1
  27. package/cjs/chaintypes/generator/QueryGen.js +4 -4
  28. package/cjs/chaintypes/generator/RuntimeApisGen.js +5 -5
  29. package/cjs/chaintypes/generator/TxGen.js +6 -10
  30. package/cjs/chaintypes/generator/ViewFunctionsGen.js +3 -3
  31. package/cjs/chaintypes/index.js +61 -11
  32. package/cjs/chaintypes/templates/consts.hbs +1 -1
  33. package/cjs/chaintypes/templates/errors.hbs +1 -1
  34. package/cjs/chaintypes/templates/events.hbs +1 -1
  35. package/cjs/chaintypes/templates/index.hbs +10 -14
  36. package/cjs/chaintypes/templates/json-rpc.hbs +3 -3
  37. package/cjs/chaintypes/templates/query.hbs +1 -1
  38. package/cjs/chaintypes/templates/runtime.hbs +1 -1
  39. package/cjs/chaintypes/templates/tx.hbs +1 -1
  40. package/cjs/chaintypes/templates/view-functions.hbs +1 -1
  41. package/cjs/index.js +3 -0
  42. package/cjs/sol/generator/ConstructorQueryGen.js +1 -1
  43. package/cjs/sol/generator/ConstructorTxGen.js +1 -1
  44. package/cjs/sol/generator/IndexGen.js +1 -1
  45. package/cjs/sol/generator/QueryGen.js +1 -1
  46. package/cjs/sol/generator/TxGen.js +1 -1
  47. package/cjs/sol/templates/constructor-query.hbs +1 -1
  48. package/cjs/sol/templates/constructor-tx.hbs +1 -2
  49. package/cjs/sol/templates/events.hbs +1 -1
  50. package/cjs/sol/templates/index.hbs +7 -7
  51. package/cjs/sol/templates/query.hbs +1 -1
  52. package/cjs/sol/templates/tx.hbs +1 -1
  53. package/cjs/typink/generator/ConstructorQueryGen.js +1 -1
  54. package/cjs/typink/generator/ConstructorTxGen.js +1 -1
  55. package/cjs/typink/generator/IndexGen.js +1 -1
  56. package/cjs/typink/generator/QueryGen.js +1 -1
  57. package/cjs/typink/generator/TxGen.js +1 -1
  58. package/cjs/typink/templates/constructor-query.hbs +1 -1
  59. package/cjs/typink/templates/constructor-tx.hbs +1 -2
  60. package/cjs/typink/templates/events.hbs +1 -1
  61. package/cjs/typink/templates/index.hbs +7 -7
  62. package/cjs/typink/templates/query.hbs +1 -1
  63. package/cjs/typink/templates/tx.hbs +1 -1
  64. package/cjs/utils.js +27 -1
  65. package/index.d.ts +1 -0
  66. package/index.js +1 -0
  67. package/package.json +11 -11
  68. package/sol/generator/ConstructorQueryGen.js +1 -1
  69. package/sol/generator/ConstructorTxGen.js +1 -1
  70. package/sol/generator/IndexGen.js +1 -1
  71. package/sol/generator/QueryGen.js +1 -1
  72. package/sol/generator/TxGen.js +1 -1
  73. package/sol/templates/constructor-query.hbs +1 -1
  74. package/sol/templates/constructor-tx.hbs +1 -2
  75. package/sol/templates/events.hbs +1 -1
  76. package/sol/templates/index.hbs +7 -7
  77. package/sol/templates/query.hbs +1 -1
  78. package/sol/templates/tx.hbs +1 -1
  79. package/typink/generator/ConstructorQueryGen.js +1 -1
  80. package/typink/generator/ConstructorTxGen.js +1 -1
  81. package/typink/generator/IndexGen.js +1 -1
  82. package/typink/generator/QueryGen.js +1 -1
  83. package/typink/generator/TxGen.js +1 -1
  84. package/typink/templates/constructor-query.hbs +1 -1
  85. package/typink/templates/constructor-tx.hbs +1 -2
  86. package/typink/templates/events.hbs +1 -1
  87. package/typink/templates/index.hbs +7 -7
  88. package/typink/templates/query.hbs +1 -1
  89. package/typink/templates/tx.hbs +1 -1
  90. package/utils.d.ts +9 -0
  91. package/utils.js +25 -0
@@ -6,7 +6,7 @@ export class ConstsGen extends ApiGen {
6
6
  generate(useSubPaths = false) {
7
7
  const { pallets } = this.metadata;
8
8
  this.typesGen.clearCache();
9
- this.typesGen.typeImports.addKnownType('GenericChainConsts', 'RpcVersion');
9
+ this.typesGen.typeImports.addKnownType('GenericChainConsts');
10
10
  let defTypeOut = '';
11
11
  for (let pallet of pallets) {
12
12
  const typedConstants = pallet.constants.map((one) => {
@@ -6,7 +6,7 @@ export class ErrorsGen extends ApiGen {
6
6
  generate(useSubPaths = false) {
7
7
  const { pallets } = this.metadata;
8
8
  this.typesGen.clearCache();
9
- this.typesGen.typeImports.addKnownType('GenericChainErrors', 'GenericPalletError', 'RpcVersion');
9
+ this.typesGen.typeImports.addKnownType('GenericChainErrors', 'GenericPalletError');
10
10
  let defTypeOut = '';
11
11
  for (let pallet of pallets) {
12
12
  const errorTypeId = pallet.error;
@@ -25,10 +25,10 @@ export class ErrorsGen extends ApiGen {
25
25
  }
26
26
  return { ...def, docs };
27
27
  })
28
- .map(({ name, docs }) => `${commentBlock(docs)}${stringPascalCase(name)}: GenericPalletError<Rv>`)
28
+ .map(({ name, docs }) => `${commentBlock(docs)}${stringPascalCase(name)}: GenericPalletError`)
29
29
  .join(',\n')}
30
30
 
31
- ${commentBlock('Generic pallet error')}[error: string]: GenericPalletError<Rv>,
31
+ ${commentBlock('Generic pallet error')}[error: string]: GenericPalletError,
32
32
  },`;
33
33
  }
34
34
  const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });
@@ -6,7 +6,7 @@ export class EventsGen extends ApiGen {
6
6
  generate(useSubPaths = false) {
7
7
  const { pallets } = this.metadata;
8
8
  this.typesGen.clearCache();
9
- this.typesGen.typeImports.addKnownType('GenericChainEvents', 'GenericPalletEvent', 'RpcVersion');
9
+ this.typesGen.typeImports.addKnownType('GenericChainEvents', 'GenericPalletEvent');
10
10
  let defTypeOut = '';
11
11
  for (let pallet of pallets) {
12
12
  const eventTypeId = pallet.event;
@@ -34,10 +34,10 @@ export class EventsGen extends ApiGen {
34
34
  }
35
35
  return { ...def, genericParts, docs };
36
36
  })
37
- .map(({ name, docs, genericParts }) => `${commentBlock(docs)}${stringPascalCase(name)}: GenericPalletEvent<Rv, ${genericParts.join(', ')}>`)
37
+ .map(({ name, docs, genericParts }) => `${commentBlock(docs)}${stringPascalCase(name)}: GenericPalletEvent<${genericParts.join(', ')}>`)
38
38
  .join(',\n')}
39
39
 
40
- ${commentBlock('Generic pallet event')}[prop: string]: GenericPalletEvent<Rv>,
40
+ ${commentBlock('Generic pallet event')}[prop: string]: GenericPalletEvent,
41
41
  },`;
42
42
  }
43
43
  const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });
@@ -6,4 +6,5 @@ export declare class IndexGen {
6
6
  readonly typesGen: TypesGen;
7
7
  constructor(interfaceName: string, runtimeVersion: SubstrateRuntimeVersion, typesGen: TypesGen);
8
8
  generate(useSubPaths?: boolean): Promise<string>;
9
+ private findAssetIdType;
9
10
  }
@@ -12,7 +12,7 @@ export class IndexGen {
12
12
  const interfaceName = this.interfaceName;
13
13
  // Clear cache and setup type imports
14
14
  this.typesGen.clearCache();
15
- this.typesGen.typeImports.addKnownType('GenericSubstrateApi', 'GenericChainKnownTypes', 'RpcLegacy', 'RpcV2', 'RpcVersion');
15
+ this.typesGen.typeImports.addKnownType('GenericSubstrateApi', 'GenericChainKnownTypes');
16
16
  // Extract type IDs from metadata.extrinsic
17
17
  const { callTypeId, addressTypeId, signatureTypeId, signedExtensions } = this.typesGen.metadata.extrinsic;
18
18
  // Generate proper TypeScript types using typeOut format (0, true)
@@ -25,8 +25,10 @@ export class IndexGen {
25
25
  const signedExtensionTypes = signedExtensions.map(({ typeId }) => this.typesGen.generateType(typeId, 1, true));
26
26
  extraType = `[${signedExtensionTypes.join(', ')}]`;
27
27
  }
28
+ // Generate AssetId type from ChargeAssetTxPayment extension
29
+ const assetIdType = this.findAssetIdType(signedExtensions) ?? 'undefined';
28
30
  // Add generated types to imports
29
- const generatedTypes = [runtimeCallType, addressType, signatureType, extraType];
31
+ const generatedTypes = [runtimeCallType, addressType, signatureType, extraType, assetIdType];
30
32
  this.typesGen.addTypeImport(generatedTypes);
31
33
  const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });
32
34
  const interfaceDocs = commentBlock([
@@ -42,6 +44,36 @@ export class IndexGen {
42
44
  signatureType,
43
45
  runtimeCallType,
44
46
  extraType,
47
+ assetIdType,
45
48
  }));
46
49
  }
50
+ findAssetIdType(signedExtensions) {
51
+ // Find ChargeAssetTxPayment extension
52
+ const chargeAssetExt = signedExtensions.find((ext) => ext.ident.endsWith('ChargeAssetTxPayment'));
53
+ if (!chargeAssetExt)
54
+ return undefined;
55
+ try {
56
+ const extensionTypeDef = this.typesGen.registry.findType(chargeAssetExt.typeId);
57
+ if (extensionTypeDef.typeDef.type !== 'Struct')
58
+ return undefined;
59
+ const assetIdField = extensionTypeDef.typeDef.value.fields.find((f) => f.name === 'asset_id');
60
+ if (!assetIdField)
61
+ return undefined;
62
+ // Check if wrapped in Option - need to unwrap to get inner type
63
+ const assetIdTypeDef = this.typesGen.registry.findType(assetIdField.typeId);
64
+ let assetIdTypeId = assetIdField.typeId;
65
+ // Option is an Enum type with path ['Option']
66
+ if (assetIdTypeDef.typeDef.type === 'Enum' && assetIdTypeDef.path.join('::') === 'Option') {
67
+ // Get the inner type from the 'Some' variant
68
+ const someVariant = assetIdTypeDef.typeDef.value.members.find((m) => m.name === 'Some');
69
+ if (someVariant && someVariant.fields.length > 0) {
70
+ assetIdTypeId = someVariant.fields[0].typeId;
71
+ }
72
+ }
73
+ return this.typesGen.generateType(assetIdTypeId, 1, true);
74
+ }
75
+ catch {
76
+ return undefined;
77
+ }
78
+ }
47
79
  }
@@ -42,7 +42,7 @@ export class JsonRpcGen extends ApiGen {
42
42
  }
43
43
  generate(useSubPaths = false) {
44
44
  this.typesGen.clearCache();
45
- this.typesGen.typeImports.addKnownType('GenericJsonRpcApis', 'RpcVersion');
45
+ this.typesGen.typeImports.addKnownType('GenericJsonRpcApis');
46
46
  this.typesGen.typeImports.addKnownJsonRpcType('JsonRpcApis');
47
47
  const toExclude = Object.values(subscriptionsInfo).flat();
48
48
  const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });
@@ -6,7 +6,7 @@ export class QueryGen extends ApiGen {
6
6
  generate(useSubPaths = false) {
7
7
  const { pallets } = this.metadata;
8
8
  this.typesGen.clearCache();
9
- this.typesGen.typeImports.addKnownType('GenericChainStorage', 'GenericStorageQuery', 'Callback', 'RpcVersion');
9
+ this.typesGen.typeImports.addKnownType('GenericChainStorage', 'GenericStorageQuery', 'Callback');
10
10
  let defTypeOut = '';
11
11
  for (let pallet of pallets) {
12
12
  const storage = pallet.storage;
@@ -15,17 +15,17 @@ export class QueryGen extends ApiGen {
15
15
  const queries = storage.entries.map((one) => this.#generateEntry(one));
16
16
  const queryDefs = queries.map(({ name, valueType, keyType, docs, keyTypeOut }) => {
17
17
  if (keyTypeOut) {
18
- return `${commentBlock(docs)}${name}: GenericStorageQuery<Rv, (${keyType}) => ${valueType}, ${keyTypeOut}>`;
18
+ return `${commentBlock(docs)}${name}: GenericStorageQuery<(${keyType}) => ${valueType}, ${keyTypeOut}>`;
19
19
  }
20
20
  else {
21
- return `${commentBlock(docs)}${name}: GenericStorageQuery<Rv, (${keyType}) => ${valueType}>`;
21
+ return `${commentBlock(docs)}${name}: GenericStorageQuery<(${keyType}) => ${valueType}>`;
22
22
  }
23
23
  });
24
24
  defTypeOut += commentBlock(`Pallet \`${pallet.name}\`'s storage queries`);
25
25
  defTypeOut += `${stringCamelCase(pallet.name)}: {
26
26
  ${queryDefs.join(',\n')}
27
27
 
28
- ${commentBlock('Generic pallet storage query')}[storage: string]: GenericStorageQuery<Rv>;
28
+ ${commentBlock('Generic pallet storage query')}[storage: string]: GenericStorageQuery;
29
29
  },`;
30
30
  }
31
31
  const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });
@@ -14,7 +14,7 @@ export class RuntimeApisGen extends ApiGen {
14
14
  }
15
15
  generate(useSubPaths = false) {
16
16
  this.typesGen.clearCache();
17
- this.typesGen.typeImports.addKnownType('GenericRuntimeApis', 'GenericRuntimeApiMethod', 'RpcVersion');
17
+ this.typesGen.typeImports.addKnownType('GenericRuntimeApis', 'GenericRuntimeApiMethod');
18
18
  let runtimeCallsOut = '';
19
19
  if (this.metadata.apis.length > 0) {
20
20
  this.metadata.apis.forEach((runtimeApi) => {
@@ -23,7 +23,7 @@ export class RuntimeApisGen extends ApiGen {
23
23
  runtimeCallsOut += `${stringCamelCase(runtimeApiName)}: {
24
24
  ${methods.map((method) => this.#generateMethodDef(runtimeApiName, method)).join('\n')}
25
25
 
26
- ${commentBlock('Generic runtime api call')}[method: string]: GenericRuntimeApiMethod<Rv>
26
+ ${commentBlock('Generic runtime api call')}[method: string]: GenericRuntimeApiMethod
27
27
  }`;
28
28
  });
29
29
  }
@@ -40,7 +40,7 @@ export class RuntimeApisGen extends ApiGen {
40
40
  }))
41
41
  .join('\n')}
42
42
 
43
- ${commentBlock('Generic runtime api call')}[method: string]: GenericRuntimeApiMethod<Rv>
43
+ ${commentBlock('Generic runtime api call')}[method: string]: GenericRuntimeApiMethod
44
44
  }`;
45
45
  });
46
46
  }
@@ -69,7 +69,7 @@ export class RuntimeApisGen extends ApiGen {
69
69
  .map(({ name, isOptional, plainType }) => `${stringCamelCase(name)}${isOptional ? '?' : ''}: ${plainType}`)
70
70
  .join(', ');
71
71
  const typeOut = this.#getGeneratedTypeName(type, false);
72
- return `${commentBlock(docs, '\n', defaultDocs, typedParams.map(({ plainType, name }) => `@param {${plainType}} ${name}`))}${methodName}: GenericRuntimeApiMethod<Rv, (${paramsOut}) => Promise<${typeOut}>>`;
72
+ return `${commentBlock(docs, '\n', defaultDocs, typedParams.map(({ plainType, name }) => `@param {${plainType}} ${name}`))}${methodName}: GenericRuntimeApiMethod<(${paramsOut}) => Promise<${typeOut}>>`;
73
73
  }
74
74
  #generateMethodDef(runtimeApiName, methodDef) {
75
75
  const { name: methodName, inputs, output, docs, deprecationInfo } = methodDef;
@@ -94,7 +94,7 @@ export class RuntimeApisGen extends ApiGen {
94
94
  const paramsOut = typedInputs
95
95
  .map(({ name, type, isOptional }) => `${stringCamelCase(name)}${isOptional ? '?' : ''}: ${type}`)
96
96
  .join(', ');
97
- return `${commentBlock(docs, '\n', defaultDocs, typedInputs.map(({ type, name }) => `@param {${type}} ${name}`), deprecationComments)}${stringCamelCase(methodName)}: GenericRuntimeApiMethod<Rv, (${paramsOut}) => Promise<${typeOut}>>`;
97
+ return `${commentBlock(docs, '\n', defaultDocs, typedInputs.map(({ type, name }) => `@param {${type}} ${name}`), deprecationComments)}${stringCamelCase(methodName)}: GenericRuntimeApiMethod<(${paramsOut}) => Promise<${typeOut}>>`;
98
98
  }
99
99
  #targetRuntimeApiSpecs() {
100
100
  const specs = Object.entries(this.runtimeApis).map(([runtimeApiHash, version]) => {
@@ -5,7 +5,7 @@ export class TxGen extends ApiGen {
5
5
  generate(useSubPaths = false) {
6
6
  const { pallets, types } = this.metadata;
7
7
  this.typesGen.clearCache();
8
- this.typesGen.typeImports.addKnownType('GenericChainTx', 'GenericTxCall', 'ISubmittableExtrinsic', 'ISubmittableResult', 'IRuntimeTxCall', 'RpcVersion', 'RpcV2', 'ISubmittableExtrinsicLegacy');
8
+ this.typesGen.typeImports.addKnownType('GenericChainTx', 'GenericTxCall', 'GenericChainKnownTypes', 'ISubmittableExtrinsic', 'ISubmittableResult', 'IRuntimeTxCall');
9
9
  const { callTypeId, addressTypeId, signatureTypeId } = this.metadata.extrinsic;
10
10
  const callTypeIn = this.typesGen.generateType(callTypeId, 1);
11
11
  const addressTypeIn = this.typesGen.generateType(addressTypeId, 1);
@@ -47,23 +47,19 @@ export class TxGen extends ApiGen {
47
47
  if (deprecationComments.length > 0) {
48
48
  deprecationComments.unshift('\n');
49
49
  }
50
- return `${commentBlock(docs, '\n', params.map((p) => `@param {${p.type}} ${p.normalizedName} ${p.docs}`), deprecationComments)}${functionName}: GenericTxCall<Rv, (${params.map((p) => `${p.normalizedName}: ${p.type}`).join(', ')}) => ChainSubmittableExtrinsic<Rv, ${callInput}>>`;
50
+ return `${commentBlock(docs, '\n', params.map((p) => `@param {${p.type}} ${p.normalizedName} ${p.docs}`), deprecationComments)}${functionName}: GenericTxCall<(${params.map((p) => `${p.normalizedName}: ${p.type}`).join(', ')}) => ChainSubmittableExtrinsic<${callInput}, ChainKnownTypes>>`;
51
51
  })
52
52
  .join(',\n')}
53
53
 
54
- ${commentBlock('Generic pallet tx call')}[callName: string]: GenericTxCall<Rv, TxCall<Rv>>,
54
+ ${commentBlock('Generic pallet tx call')}[callName: string]: GenericTxCall<TxCall<ChainKnownTypes>>,
55
55
  },`;
56
56
  }
57
57
  const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });
58
- // TODO make explicit separate type for Extra
59
58
  const defTypes = `
60
- export type ChainSubmittableExtrinsic<Rv extends RpcVersion, T extends IRuntimeTxCall = ${callTypeIn}> =
61
- Extrinsic<${addressTypeIn}, T, ${signatureTypeIn}, any[]> &
62
- (Rv extends RpcV2
63
- ? ISubmittableExtrinsic<ISubmittableResult<FrameSystemEventRecord>>
64
- : ISubmittableExtrinsicLegacy<ISubmittableResult<FrameSystemEventRecord>>)
59
+ export type ChainSubmittableExtrinsic<T extends IRuntimeTxCall = ${callTypeIn}, ChainKnownTypes extends GenericChainKnownTypes = GenericChainKnownTypes> =
60
+ Extrinsic<${addressTypeIn}, T, ${signatureTypeIn}, ChainKnownTypes['Extra']> & ISubmittableExtrinsic<ISubmittableResult<FrameSystemEventRecord>, ChainKnownTypes['AssetId']>
65
61
 
66
- export type TxCall<Rv extends RpcVersion> = (...args: any[]) => ChainSubmittableExtrinsic<Rv>;
62
+ export type TxCall<ChainKnownTypes extends GenericChainKnownTypes = GenericChainKnownTypes> = (...args: any[]) => ChainSubmittableExtrinsic<${callTypeIn}, ChainKnownTypes>;
67
63
  `;
68
64
  const template = compileTemplate('chaintypes/templates/tx.hbs');
69
65
  return beautifySourceCode(template({ importTypes, defTypes, txDefsOut }));
@@ -7,7 +7,7 @@ export class ViewFunctionsGen extends ApiGen {
7
7
  const { pallets } = this.metadata;
8
8
  this.typesGen.clearCache();
9
9
  this.typesGen.typeImports.addKnownType('GenericChainViewFunctions', // --
10
- 'GenericViewFunction', 'RpcVersion');
10
+ 'GenericViewFunction');
11
11
  let defTypeOut = '';
12
12
  for (let pallet of pallets) {
13
13
  if (!pallet.viewFunctions || pallet.viewFunctions.length === 0)
@@ -24,13 +24,13 @@ export class ViewFunctionsGen extends ApiGen {
24
24
  }
25
25
  const params = vf.inputs.map((input) => `${stringCamelCase(input.name)}: ${this.typesGen.generateType(input.typeId, 1)}`);
26
26
  const outputType = this.typesGen.generateType(vf.output, 1, true);
27
- return `${commentBlock(docs)}${stringCamelCase(vf.name)}: GenericViewFunction<Rv, (${params.join(', ')}) => Promise<${outputType}>>`;
27
+ return `${commentBlock(docs)}${stringCamelCase(vf.name)}: GenericViewFunction<(${params.join(', ')}) => Promise<${outputType}>>`;
28
28
  });
29
29
  defTypeOut += commentBlock(`Pallet \`${pallet.name}\`'s view functions`);
30
30
  defTypeOut += `${stringCamelCase(pallet.name)}: {
31
31
  ${viewFns.join(',\n')}
32
32
 
33
- ${commentBlock('Generic pallet view function')}[name: string]: GenericViewFunction<Rv>;
33
+ ${commentBlock('Generic pallet view function')}[name: string]: GenericViewFunction;
34
34
  },`;
35
35
  }
36
36
  const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });
@@ -1,5 +1,24 @@
1
- import { SubstrateRuntimeVersion } from '@dedot/api';
1
+ import { DedotClient, SubstrateRuntimeVersion } from '@dedot/api';
2
2
  import { MetadataLatest } from '@dedot/codecs';
3
3
  import { GeneratedResult } from '../types.js';
4
- export declare function generateTypesFromEndpoint(chain: string, endpoint: string, outDir?: string, extension?: string, useSubPaths?: boolean): Promise<GeneratedResult>;
5
- export declare function generateTypes(chain: string, metadata: MetadataLatest, rpcMethods: string[], runtimeVersion: SubstrateRuntimeVersion, outDir?: string, extension?: string, useSubPaths?: boolean): Promise<GeneratedResult>;
4
+ export interface GenerateTypesFromEndpointOptions {
5
+ chain: string;
6
+ endpoint?: string;
7
+ client?: DedotClient;
8
+ outDir?: string;
9
+ extension?: string;
10
+ useSubPaths?: boolean;
11
+ at?: string;
12
+ }
13
+ export declare function generateTypesFromEndpoint(options: GenerateTypesFromEndpointOptions): Promise<GeneratedResult>;
14
+ export interface GenerateTypesOptions {
15
+ chain: string;
16
+ metadata: MetadataLatest;
17
+ rpcMethods: string[];
18
+ runtimeVersion: SubstrateRuntimeVersion;
19
+ outDir?: string;
20
+ extension?: string;
21
+ useSubPaths?: boolean;
22
+ appendSpecVersion?: boolean;
23
+ }
24
+ export declare function generateTypes(options: GenerateTypesOptions): Promise<GeneratedResult>;
@@ -1,20 +1,68 @@
1
- import { LegacyClient } from '@dedot/api';
1
+ import { DedotClient } from '@dedot/api';
2
2
  import { WsProvider } from '@dedot/providers';
3
- import { stringDashCase, stringPascalCase } from '@dedot/utils';
3
+ import { assert, stringDashCase, stringPascalCase } from '@dedot/utils';
4
4
  import * as fs from 'fs';
5
5
  import * as path from 'path';
6
+ import { resolveBlockHash } from '../utils.js';
6
7
  import { ConstsGen, ErrorsGen, EventsGen, IndexGen, JsonRpcGen, QueryGen, RuntimeApisGen, TxGen, ViewFunctionsGen, TypesGen, } from './generator/index.js';
7
- export async function generateTypesFromEndpoint(chain, endpoint, outDir, extension = 'd.ts', useSubPaths = false) {
8
- // Immediately throw error if cannot connect to provider for the first time.
9
- const client = await LegacyClient.new(new WsProvider({ endpoint, retryDelayMs: 0, timeout: 0 }));
10
- const { methods } = await client.rpc.rpc_methods();
11
- chain = chain || client.runtimeVersion.specName || 'local';
12
- const result = await generateTypes(chain, client.metadata.latest, methods, client.runtimeVersion, outDir, extension, useSubPaths);
13
- await client.disconnect();
14
- return result;
8
+ export async function generateTypesFromEndpoint(options) {
9
+ const { chain, endpoint, client: providedClient, outDir, extension = 'd.ts', useSubPaths = false, at } = options;
10
+ // Validate that either endpoint or client is provided
11
+ if (!endpoint && !providedClient) {
12
+ throw new Error('Either "endpoint" or "client" must be provided');
13
+ }
14
+ if (endpoint && providedClient) {
15
+ throw new Error('Cannot provide both "endpoint" and "client"');
16
+ }
17
+ // Create client if not provided
18
+ const client = providedClient || (await DedotClient.legacy(new WsProvider({ endpoint: endpoint, retryDelayMs: 0, timeout: 0 })));
19
+ const shouldDisconnect = !providedClient;
20
+ try {
21
+ const { methods } = await client.rpc.rpc_methods();
22
+ // Resolve block hash if `at` is provided
23
+ let blockHash;
24
+ if (at) {
25
+ blockHash = await resolveBlockHash(client, at);
26
+ }
27
+ // Get runtime version and metadata at the specified block
28
+ let runtimeVersion;
29
+ let metadata;
30
+ if (blockHash) {
31
+ // Get the header of the target block
32
+ const header = await client.block.header(blockHash);
33
+ assert(`Header not found for block hash: ${blockHash}`);
34
+ const childBlockHash = await client.rpc.chain_getBlockHash(header.number + 1);
35
+ const clientAt = await client.at(childBlockHash);
36
+ runtimeVersion = clientAt.runtimeVersion;
37
+ metadata = clientAt.metadata;
38
+ }
39
+ else {
40
+ runtimeVersion = client.runtimeVersion;
41
+ metadata = client.metadata;
42
+ }
43
+ const resolvedChain = chain || runtimeVersion.specName || 'local';
44
+ return await generateTypes({
45
+ chain: resolvedChain,
46
+ metadata: metadata.latest,
47
+ rpcMethods: methods,
48
+ runtimeVersion,
49
+ outDir,
50
+ extension,
51
+ useSubPaths,
52
+ appendSpecVersion: !!blockHash,
53
+ });
54
+ }
55
+ finally {
56
+ if (shouldDisconnect) {
57
+ await client.disconnect();
58
+ }
59
+ }
15
60
  }
16
- export async function generateTypes(chain, metadata, rpcMethods, runtimeVersion, outDir = '.', extension = 'd.ts', useSubPaths = false) {
17
- const dirPath = path.resolve(outDir, stringDashCase(chain));
61
+ export async function generateTypes(options) {
62
+ const { chain, metadata, rpcMethods, runtimeVersion, outDir = '.', extension = 'd.ts', useSubPaths = false, appendSpecVersion = false, } = options;
63
+ // Build folder suffix with spec version if requested
64
+ const folderSuffix = appendSpecVersion ? `-${runtimeVersion.specVersion}` : '';
65
+ const dirPath = path.resolve(outDir, stringDashCase(chain) + folderSuffix);
18
66
  const defTypesFileName = path.join(dirPath, `types.${extension}`);
19
67
  const constsTypesFileName = path.join(dirPath, `consts.${extension}`);
20
68
  const queryTypesFileName = path.join(dirPath, `query.${extension}`);
@@ -28,7 +76,9 @@ export async function generateTypes(chain, metadata, rpcMethods, runtimeVersion,
28
76
  if (!fs.existsSync(dirPath)) {
29
77
  fs.mkdirSync(dirPath, { recursive: true });
30
78
  }
31
- const interfaceName = `${stringPascalCase(chain)}Api`;
79
+ // Build interface suffix with spec version if requested
80
+ const interfaceSuffix = appendSpecVersion ? runtimeVersion.specVersion : '';
81
+ const interfaceName = `${stringPascalCase(chain)}Api${interfaceSuffix}`;
32
82
  const typesGen = new TypesGen(metadata);
33
83
  const constsGen = new ConstsGen(typesGen);
34
84
  const queryGen = new QueryGen(typesGen);
@@ -2,6 +2,6 @@
2
2
 
3
3
  {{{ importTypes }}}
4
4
 
5
- export interface ChainConsts<Rv extends RpcVersion> extends GenericChainConsts<Rv> {
5
+ export interface ChainConsts extends GenericChainConsts {
6
6
  {{{ defTypeOut }}}
7
7
  }
@@ -2,6 +2,6 @@
2
2
 
3
3
  {{{ importTypes }}}
4
4
 
5
- export interface ChainErrors<Rv extends RpcVersion> extends GenericChainErrors<Rv> {
5
+ export interface ChainErrors extends GenericChainErrors {
6
6
  {{{ defTypeOut }}}
7
7
  }
@@ -2,6 +2,6 @@
2
2
 
3
3
  {{{ importTypes }}}
4
4
 
5
- export interface ChainEvents<Rv extends RpcVersion> extends GenericChainEvents<Rv> {
5
+ export interface ChainEvents extends GenericChainEvents {
6
6
  {{{ defTypeOut }}}
7
7
  }
@@ -17,22 +17,18 @@ interface ChainKnownTypes extends GenericChainKnownTypes {
17
17
  Signature: {{{signatureType}}};
18
18
  RuntimeCall: {{{runtimeCallType}}};
19
19
  Extra: {{{extraType}}};
20
+ AssetId: {{{assetIdType}}};
20
21
  }
21
22
 
22
- export interface Versioned{{{interfaceName}}}<Rv extends RpcVersion> extends GenericSubstrateApi<Rv> {
23
- rpc: ChainJsonRpcApis<Rv>;
24
- consts: ChainConsts<Rv>;
25
- query: ChainStorage<Rv>;
26
- errors: ChainErrors<Rv>;
27
- events: ChainEvents<Rv>;
28
- call: RuntimeApis<Rv>;
29
- view: ChainViewFunctions<Rv>;
30
- tx: ChainTx<Rv>;
23
+ {{interfaceDocs}}export interface {{{interfaceName}}} extends GenericSubstrateApi {
24
+ rpc: ChainJsonRpcApis;
25
+ consts: ChainConsts;
26
+ query: ChainStorage;
27
+ errors: ChainErrors;
28
+ events: ChainEvents;
29
+ call: RuntimeApis;
30
+ view: ChainViewFunctions;
31
+ tx: ChainTx<ChainKnownTypes>;
31
32
 
32
33
  types: ChainKnownTypes;
33
34
  }
34
-
35
- {{interfaceDocs}}export interface {{{interfaceName}}} {
36
- legacy: Versioned{{{interfaceName}}}<RpcLegacy>;
37
- v2: Versioned{{{interfaceName}}}<RpcV2>;
38
- }
@@ -2,9 +2,9 @@
2
2
 
3
3
  {{{ importTypes }}}
4
4
 
5
- export type ChainJsonRpcApis<Rv extends RpcVersion> =
5
+ export type ChainJsonRpcApis =
6
6
  {{#if jsonRpcMethods.length}}
7
- Pick<JsonRpcApis, {{{jsonRpcMethods}}}> & GenericJsonRpcApis<Rv>;
7
+ Pick<JsonRpcApis, {{{jsonRpcMethods}}}> & GenericJsonRpcApis;
8
8
  {{else}}
9
- JsonRpcApis & GenericJsonRpcApis<Rv>;
9
+ JsonRpcApis & GenericJsonRpcApis;
10
10
  {{/if}}
@@ -2,6 +2,6 @@
2
2
 
3
3
  {{{ importTypes }}}
4
4
 
5
- export interface ChainStorage<Rv extends RpcVersion> extends GenericChainStorage<Rv> {
5
+ export interface ChainStorage extends GenericChainStorage {
6
6
  {{{ defTypeOut }}}
7
7
  }
@@ -2,7 +2,7 @@
2
2
 
3
3
  {{{ importTypes }}}
4
4
 
5
- export interface RuntimeApis<Rv extends RpcVersion> extends GenericRuntimeApis<Rv> {
5
+ export interface RuntimeApis extends GenericRuntimeApis {
6
6
  {{{ runtimeCallsOut }}}
7
7
  }
8
8
 
@@ -4,6 +4,6 @@
4
4
 
5
5
  {{{ defTypes }}}
6
6
 
7
- export interface ChainTx<Rv extends RpcVersion> extends GenericChainTx<Rv, TxCall<Rv>> {
7
+ export interface ChainTx<ChainKnownTypes extends GenericChainKnownTypes = GenericChainKnownTypes> extends GenericChainTx<TxCall<ChainKnownTypes>> {
8
8
  {{{ txDefsOut }}}
9
9
  }
@@ -2,6 +2,6 @@
2
2
 
3
3
  {{{ importTypes }}}
4
4
 
5
- export interface ChainViewFunctions<Rv extends RpcVersion> extends GenericChainViewFunctions<Rv> {
5
+ export interface ChainViewFunctions extends GenericChainViewFunctions {
6
6
  {{{ defTypeOut }}}
7
7
  }
@@ -9,7 +9,7 @@ class ConstsGen extends ApiGen_js_1.ApiGen {
9
9
  generate(useSubPaths = false) {
10
10
  const { pallets } = this.metadata;
11
11
  this.typesGen.clearCache();
12
- this.typesGen.typeImports.addKnownType('GenericChainConsts', 'RpcVersion');
12
+ this.typesGen.typeImports.addKnownType('GenericChainConsts');
13
13
  let defTypeOut = '';
14
14
  for (let pallet of pallets) {
15
15
  const typedConstants = pallet.constants.map((one) => {
@@ -9,7 +9,7 @@ class ErrorsGen extends ApiGen_js_1.ApiGen {
9
9
  generate(useSubPaths = false) {
10
10
  const { pallets } = this.metadata;
11
11
  this.typesGen.clearCache();
12
- this.typesGen.typeImports.addKnownType('GenericChainErrors', 'GenericPalletError', 'RpcVersion');
12
+ this.typesGen.typeImports.addKnownType('GenericChainErrors', 'GenericPalletError');
13
13
  let defTypeOut = '';
14
14
  for (let pallet of pallets) {
15
15
  const errorTypeId = pallet.error;
@@ -28,10 +28,10 @@ class ErrorsGen extends ApiGen_js_1.ApiGen {
28
28
  }
29
29
  return { ...def, docs };
30
30
  })
31
- .map(({ name, docs }) => `${(0, utils_js_1.commentBlock)(docs)}${(0, utils_1.stringPascalCase)(name)}: GenericPalletError<Rv>`)
31
+ .map(({ name, docs }) => `${(0, utils_js_1.commentBlock)(docs)}${(0, utils_1.stringPascalCase)(name)}: GenericPalletError`)
32
32
  .join(',\n')}
33
33
 
34
- ${(0, utils_js_1.commentBlock)('Generic pallet error')}[error: string]: GenericPalletError<Rv>,
34
+ ${(0, utils_js_1.commentBlock)('Generic pallet error')}[error: string]: GenericPalletError,
35
35
  },`;
36
36
  }
37
37
  const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });
@@ -9,7 +9,7 @@ class EventsGen extends ApiGen_js_1.ApiGen {
9
9
  generate(useSubPaths = false) {
10
10
  const { pallets } = this.metadata;
11
11
  this.typesGen.clearCache();
12
- this.typesGen.typeImports.addKnownType('GenericChainEvents', 'GenericPalletEvent', 'RpcVersion');
12
+ this.typesGen.typeImports.addKnownType('GenericChainEvents', 'GenericPalletEvent');
13
13
  let defTypeOut = '';
14
14
  for (let pallet of pallets) {
15
15
  const eventTypeId = pallet.event;
@@ -37,10 +37,10 @@ class EventsGen extends ApiGen_js_1.ApiGen {
37
37
  }
38
38
  return { ...def, genericParts, docs };
39
39
  })
40
- .map(({ name, docs, genericParts }) => `${(0, utils_js_1.commentBlock)(docs)}${(0, utils_1.stringPascalCase)(name)}: GenericPalletEvent<Rv, ${genericParts.join(', ')}>`)
40
+ .map(({ name, docs, genericParts }) => `${(0, utils_js_1.commentBlock)(docs)}${(0, utils_1.stringPascalCase)(name)}: GenericPalletEvent<${genericParts.join(', ')}>`)
41
41
  .join(',\n')}
42
42
 
43
- ${(0, utils_js_1.commentBlock)('Generic pallet event')}[prop: string]: GenericPalletEvent<Rv>,
43
+ ${(0, utils_js_1.commentBlock)('Generic pallet event')}[prop: string]: GenericPalletEvent,
44
44
  },`;
45
45
  }
46
46
  const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });
@@ -15,7 +15,7 @@ class IndexGen {
15
15
  const interfaceName = this.interfaceName;
16
16
  // Clear cache and setup type imports
17
17
  this.typesGen.clearCache();
18
- this.typesGen.typeImports.addKnownType('GenericSubstrateApi', 'GenericChainKnownTypes', 'RpcLegacy', 'RpcV2', 'RpcVersion');
18
+ this.typesGen.typeImports.addKnownType('GenericSubstrateApi', 'GenericChainKnownTypes');
19
19
  // Extract type IDs from metadata.extrinsic
20
20
  const { callTypeId, addressTypeId, signatureTypeId, signedExtensions } = this.typesGen.metadata.extrinsic;
21
21
  // Generate proper TypeScript types using typeOut format (0, true)
@@ -28,8 +28,10 @@ class IndexGen {
28
28
  const signedExtensionTypes = signedExtensions.map(({ typeId }) => this.typesGen.generateType(typeId, 1, true));
29
29
  extraType = `[${signedExtensionTypes.join(', ')}]`;
30
30
  }
31
+ // Generate AssetId type from ChargeAssetTxPayment extension
32
+ const assetIdType = this.findAssetIdType(signedExtensions) ?? 'undefined';
31
33
  // Add generated types to imports
32
- const generatedTypes = [runtimeCallType, addressType, signatureType, extraType];
34
+ const generatedTypes = [runtimeCallType, addressType, signatureType, extraType, assetIdType];
33
35
  this.typesGen.addTypeImport(generatedTypes);
34
36
  const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });
35
37
  const interfaceDocs = (0, utils_js_1.commentBlock)([
@@ -45,7 +47,37 @@ class IndexGen {
45
47
  signatureType,
46
48
  runtimeCallType,
47
49
  extraType,
50
+ assetIdType,
48
51
  }));
49
52
  }
53
+ findAssetIdType(signedExtensions) {
54
+ // Find ChargeAssetTxPayment extension
55
+ const chargeAssetExt = signedExtensions.find((ext) => ext.ident.endsWith('ChargeAssetTxPayment'));
56
+ if (!chargeAssetExt)
57
+ return undefined;
58
+ try {
59
+ const extensionTypeDef = this.typesGen.registry.findType(chargeAssetExt.typeId);
60
+ if (extensionTypeDef.typeDef.type !== 'Struct')
61
+ return undefined;
62
+ const assetIdField = extensionTypeDef.typeDef.value.fields.find((f) => f.name === 'asset_id');
63
+ if (!assetIdField)
64
+ return undefined;
65
+ // Check if wrapped in Option - need to unwrap to get inner type
66
+ const assetIdTypeDef = this.typesGen.registry.findType(assetIdField.typeId);
67
+ let assetIdTypeId = assetIdField.typeId;
68
+ // Option is an Enum type with path ['Option']
69
+ if (assetIdTypeDef.typeDef.type === 'Enum' && assetIdTypeDef.path.join('::') === 'Option') {
70
+ // Get the inner type from the 'Some' variant
71
+ const someVariant = assetIdTypeDef.typeDef.value.members.find((m) => m.name === 'Some');
72
+ if (someVariant && someVariant.fields.length > 0) {
73
+ assetIdTypeId = someVariant.fields[0].typeId;
74
+ }
75
+ }
76
+ return this.typesGen.generateType(assetIdTypeId, 1, true);
77
+ }
78
+ catch {
79
+ return undefined;
80
+ }
81
+ }
50
82
  }
51
83
  exports.IndexGen = IndexGen;
@@ -45,7 +45,7 @@ class JsonRpcGen extends ApiGen_js_1.ApiGen {
45
45
  }
46
46
  generate(useSubPaths = false) {
47
47
  this.typesGen.clearCache();
48
- this.typesGen.typeImports.addKnownType('GenericJsonRpcApis', 'RpcVersion');
48
+ this.typesGen.typeImports.addKnownType('GenericJsonRpcApis');
49
49
  this.typesGen.typeImports.addKnownJsonRpcType('JsonRpcApis');
50
50
  const toExclude = Object.values(api_1.subscriptionsInfo).flat();
51
51
  const importTypes = this.typesGen.typeImports.toImports({ useSubPaths });