initValue.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // Copyright 2017-2020 @polkadot/react-params authors & contributors
  2. // This software may be modified and distributed under the terms
  3. // of the Apache-2.0 license. See the LICENSE file for details.
  4. import { TypeDef, TypeDefInfo } from '@polkadot/types/types';
  5. import { registry } from '@polkadot/react-api';
  6. import { Bytes, Raw, createType, getTypeDef } from '@polkadot/types';
  7. import { BN_ZERO, isBn } from '@polkadot/util';
  8. const warnList: string[] = [];
  9. export default function getInitValue (def: TypeDef): unknown {
  10. if (def.info === TypeDefInfo.Vec) {
  11. return [getInitValue(def.sub as TypeDef)];
  12. } else if (def.info === TypeDefInfo.Tuple) {
  13. return Array.isArray(def.sub)
  14. ? def.sub.map((def) => getInitValue(def))
  15. : [];
  16. } else if (def.info === TypeDefInfo.Struct) {
  17. return Array.isArray(def.sub)
  18. ? def.sub.reduce((result: Record<string, unknown>, def): Record<string, unknown> => {
  19. result[def.name as string] = getInitValue(def);
  20. return result;
  21. }, {})
  22. : {};
  23. } else if (def.info === TypeDefInfo.Enum) {
  24. return Array.isArray(def.sub)
  25. ? { [def.sub[0].name as string]: getInitValue(def.sub[0]) }
  26. : {};
  27. }
  28. const type = [TypeDefInfo.Compact, TypeDefInfo.Option].includes(def.info)
  29. ? (def.sub as TypeDef).type
  30. : def.type;
  31. switch (type) {
  32. case 'AccountIndex':
  33. case 'Balance':
  34. case 'BalanceOf':
  35. case 'BlockNumber':
  36. case 'Compact':
  37. case 'Gas':
  38. case 'Index':
  39. case 'Nonce':
  40. case 'ParaId':
  41. case 'PropIndex':
  42. case 'ProposalIndex':
  43. case 'ReferendumIndex':
  44. case 'i8':
  45. case 'i16':
  46. case 'i32':
  47. case 'i64':
  48. case 'i128':
  49. case 'u8':
  50. case 'u16':
  51. case 'u32':
  52. case 'u64':
  53. case 'u128':
  54. case 'VoteIndex':
  55. return BN_ZERO;
  56. case 'bool':
  57. return false;
  58. case 'String':
  59. case 'Text':
  60. return '';
  61. case 'Moment':
  62. return BN_ZERO;
  63. case 'Vote':
  64. return -1;
  65. case 'VoteThreshold':
  66. return 0;
  67. case 'Bytes':
  68. return new Bytes(registry);
  69. case 'BlockHash':
  70. case 'CodeHash':
  71. case 'Hash':
  72. case 'H256':
  73. return createType(registry, 'H256');
  74. case 'H512':
  75. return createType(registry, 'H512');
  76. case 'Raw':
  77. case 'Keys':
  78. return '';
  79. case 'AccountId':
  80. case 'AccountIdOf':
  81. case 'Address':
  82. case 'Call':
  83. case 'CandidateReceipt':
  84. case 'Digest':
  85. case 'Header':
  86. case 'KeyValue':
  87. case 'MisbehaviorReport':
  88. case 'Proposal':
  89. case 'Signature':
  90. case 'SessionKey':
  91. case 'StorageKey':
  92. case 'ValidatorId':
  93. return undefined;
  94. case 'Extrinsic':
  95. return new Raw(registry);
  96. case 'Null':
  97. return null;
  98. default: {
  99. let error: string | null = null;
  100. try {
  101. const instance = createType(registry, type as 'u32');
  102. const raw = getTypeDef(instance.toRawType());
  103. if (isBn(instance)) {
  104. return BN_ZERO;
  105. } else if ([TypeDefInfo.Struct].includes(raw.info)) {
  106. return undefined;
  107. } else if ([TypeDefInfo.Enum, TypeDefInfo.Tuple].includes(raw.info)) {
  108. return getInitValue(raw);
  109. }
  110. } catch (e) {
  111. error = (e as Error).message;
  112. }
  113. // we only want to want once, not spam
  114. if (!warnList.includes(type)) {
  115. warnList.push(type);
  116. error && console.error(`params: initValue: ${error}`);
  117. console.info(`params: initValue: No default value for type ${type} from ${JSON.stringify(def)}, using defaults`);
  118. }
  119. return '0x';
  120. }
  121. }
  122. }