@ensdomains/ensjs 3.0.0-beta.1 → 3.0.0-beta.3

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 (248) hide show
  1. package/dist/cjs/clients/decorators/subgraph.js.map +1 -1
  2. package/dist/cjs/contracts/consts.js +52 -1
  3. package/dist/cjs/contracts/consts.js.map +1 -1
  4. package/dist/cjs/dns.js +3 -3
  5. package/dist/cjs/dns.js.map +1 -1
  6. package/dist/cjs/errors/subgraph.js.map +1 -1
  7. package/dist/cjs/errors/utils.js +15 -18
  8. package/dist/cjs/errors/utils.js.map +1 -1
  9. package/dist/cjs/errors/version.js +1 -1
  10. package/dist/cjs/functions/dns/{prepareDnsImport.js → getDnsImportData.js} +3 -3
  11. package/dist/cjs/functions/dns/{prepareDnsImport.js.map → getDnsImportData.js.map} +1 -1
  12. package/dist/cjs/functions/dns/importDnsName.js +7 -7
  13. package/dist/cjs/functions/dns/importDnsName.js.map +1 -1
  14. package/dist/cjs/functions/public/_getContentHash.js +1 -1
  15. package/dist/cjs/functions/public/getSupportedInterfaces.js +1 -1
  16. package/dist/cjs/functions/public/getSupportedInterfaces.js.map +1 -1
  17. package/dist/cjs/functions/public/getWrapperData.js.map +1 -1
  18. package/dist/cjs/functions/subgraph/filters.js +3 -0
  19. package/dist/cjs/functions/subgraph/filters.js.map +1 -0
  20. package/dist/cjs/functions/subgraph/getNameHistory.js +1 -1
  21. package/dist/cjs/functions/subgraph/getNamesForAddress.js +140 -182
  22. package/dist/cjs/functions/subgraph/getNamesForAddress.js.map +1 -1
  23. package/dist/cjs/functions/subgraph/getSubnames.js +95 -108
  24. package/dist/cjs/functions/subgraph/getSubnames.js.map +1 -1
  25. package/dist/cjs/functions/subgraph/types.js +3 -0
  26. package/dist/cjs/functions/subgraph/types.js.map +1 -0
  27. package/dist/cjs/functions/subgraph/utils.js.map +1 -1
  28. package/dist/cjs/functions/wallet/createSubname.js +1 -1
  29. package/dist/cjs/functions/wallet/createSubname.js.map +1 -1
  30. package/dist/cjs/functions/wallet/setChildFuses.js +1 -1
  31. package/dist/cjs/functions/wallet/setChildFuses.js.map +1 -1
  32. package/dist/cjs/functions/wallet/setFuses.js +1 -1
  33. package/dist/cjs/functions/wallet/setFuses.js.map +1 -1
  34. package/dist/cjs/functions/wallet/wrapName.js +3 -1
  35. package/dist/cjs/functions/wallet/wrapName.js.map +1 -1
  36. package/dist/cjs/index.js +1 -2
  37. package/dist/cjs/index.js.map +1 -1
  38. package/dist/cjs/utils/contentHash.js +54 -131
  39. package/dist/cjs/utils/contentHash.js.map +1 -1
  40. package/dist/cjs/utils/encoders/encodeSetContentHash.js +1 -4
  41. package/dist/cjs/utils/encoders/encodeSetContentHash.js.map +1 -1
  42. package/dist/cjs/utils/format.js +1 -5
  43. package/dist/cjs/utils/format.js.map +1 -1
  44. package/dist/cjs/utils/fuses.js +181 -200
  45. package/dist/cjs/utils/fuses.js.map +1 -1
  46. package/dist/cjs/utils/index.js +4 -7
  47. package/dist/cjs/utils/index.js.map +1 -1
  48. package/dist/cjs/utils/registerHelpers.js +3 -1
  49. package/dist/cjs/utils/registerHelpers.js.map +1 -1
  50. package/dist/esm/clients/decorators/subgraph.js.map +1 -1
  51. package/dist/esm/contracts/consts.js +52 -1
  52. package/dist/esm/contracts/consts.js.map +1 -1
  53. package/dist/esm/dns.js +1 -1
  54. package/dist/esm/dns.js.map +1 -1
  55. package/dist/esm/errors/subgraph.js.map +1 -1
  56. package/dist/esm/errors/utils.js +13 -16
  57. package/dist/esm/errors/utils.js.map +1 -1
  58. package/dist/esm/errors/version.js +1 -1
  59. package/dist/esm/functions/dns/{prepareDnsImport.js → getDnsImportData.js} +9 -10
  60. package/dist/esm/functions/dns/getDnsImportData.js.map +1 -0
  61. package/dist/esm/functions/dns/importDnsName.js +12 -12
  62. package/dist/esm/functions/dns/importDnsName.js.map +1 -1
  63. package/dist/esm/functions/public/_getContentHash.js +2 -2
  64. package/dist/esm/functions/public/getSupportedInterfaces.js +2 -2
  65. package/dist/esm/functions/public/getSupportedInterfaces.js.map +1 -1
  66. package/dist/esm/functions/public/getWrapperData.js.map +1 -1
  67. package/dist/esm/functions/subgraph/filters.js +2 -0
  68. package/dist/esm/functions/subgraph/filters.js.map +1 -0
  69. package/dist/esm/functions/subgraph/getNameHistory.js +2 -2
  70. package/dist/esm/functions/subgraph/getNamesForAddress.js +144 -183
  71. package/dist/esm/functions/subgraph/getNamesForAddress.js.map +1 -1
  72. package/dist/esm/functions/subgraph/getSubnames.js +101 -111
  73. package/dist/esm/functions/subgraph/getSubnames.js.map +1 -1
  74. package/dist/esm/functions/subgraph/types.js +2 -0
  75. package/dist/esm/functions/subgraph/types.js.map +1 -0
  76. package/dist/esm/functions/subgraph/utils.js.map +1 -1
  77. package/dist/esm/functions/wallet/createSubname.js +1 -1
  78. package/dist/esm/functions/wallet/createSubname.js.map +1 -1
  79. package/dist/esm/functions/wallet/setChildFuses.js +1 -1
  80. package/dist/esm/functions/wallet/setChildFuses.js.map +1 -1
  81. package/dist/esm/functions/wallet/setFuses.js +2 -2
  82. package/dist/esm/functions/wallet/setFuses.js.map +1 -1
  83. package/dist/esm/functions/wallet/wrapName.js +4 -2
  84. package/dist/esm/functions/wallet/wrapName.js.map +1 -1
  85. package/dist/esm/index.js +1 -1
  86. package/dist/esm/index.js.map +1 -1
  87. package/dist/esm/utils/contentHash.js +51 -128
  88. package/dist/esm/utils/contentHash.js.map +1 -1
  89. package/dist/esm/utils/encoders/encodeSetContentHash.js +2 -5
  90. package/dist/esm/utils/encoders/encodeSetContentHash.js.map +1 -1
  91. package/dist/esm/utils/format.js +0 -2
  92. package/dist/esm/utils/format.js.map +1 -1
  93. package/dist/esm/utils/fuses.js +180 -201
  94. package/dist/esm/utils/fuses.js.map +1 -1
  95. package/dist/esm/utils/index.js +2 -2
  96. package/dist/esm/utils/index.js.map +1 -1
  97. package/dist/esm/utils/registerHelpers.js +4 -2
  98. package/dist/esm/utils/registerHelpers.js.map +1 -1
  99. package/dist/types/clients/decorators/subgraph.d.ts +1 -1
  100. package/dist/types/clients/decorators/subgraph.d.ts.map +1 -1
  101. package/dist/types/clients/decorators/wallet.d.ts +12 -12
  102. package/dist/types/clients/public.d.ts +1 -1
  103. package/dist/types/clients/subgraph.d.ts +1 -1
  104. package/dist/types/clients/wallet.d.ts +43 -79
  105. package/dist/types/clients/wallet.d.ts.map +1 -1
  106. package/dist/types/contracts/consts.d.ts +51 -2
  107. package/dist/types/contracts/consts.d.ts.map +1 -1
  108. package/dist/types/dns.d.ts +1 -1
  109. package/dist/types/dns.d.ts.map +1 -1
  110. package/dist/types/errors/subgraph.d.ts +4 -4
  111. package/dist/types/errors/subgraph.d.ts.map +1 -1
  112. package/dist/types/errors/utils.d.ts +10 -13
  113. package/dist/types/errors/utils.d.ts.map +1 -1
  114. package/dist/types/errors/version.d.ts +1 -1
  115. package/dist/types/functions/dns/{prepareDnsImport.d.ts → getDnsImportData.d.ts} +11 -12
  116. package/dist/types/functions/dns/{prepareDnsImport.d.ts.map → getDnsImportData.d.ts.map} +1 -1
  117. package/dist/types/functions/dns/importDnsName.d.ts +36 -36
  118. package/dist/types/functions/dns/importDnsName.d.ts.map +1 -1
  119. package/dist/types/functions/public/getSupportedInterfaces.d.ts +19 -4
  120. package/dist/types/functions/public/getSupportedInterfaces.d.ts.map +1 -1
  121. package/dist/types/functions/public/getWrapperData.d.ts +2 -2
  122. package/dist/types/functions/public/getWrapperData.d.ts.map +1 -1
  123. package/dist/types/functions/subgraph/filters.d.ts +693 -0
  124. package/dist/types/functions/subgraph/filters.d.ts.map +1 -0
  125. package/dist/types/functions/subgraph/getNamesForAddress.d.ts +2 -0
  126. package/dist/types/functions/subgraph/getNamesForAddress.d.ts.map +1 -1
  127. package/dist/types/functions/subgraph/getSubnames.d.ts +3 -1
  128. package/dist/types/functions/subgraph/getSubnames.d.ts.map +1 -1
  129. package/dist/types/functions/subgraph/types.d.ts +13 -0
  130. package/dist/types/functions/subgraph/types.d.ts.map +1 -0
  131. package/dist/types/functions/subgraph/utils.d.ts +2 -2
  132. package/dist/types/functions/subgraph/utils.d.ts.map +1 -1
  133. package/dist/types/functions/wallet/commitName.d.ts +25 -25
  134. package/dist/types/functions/wallet/createSubname.d.ts +28 -28
  135. package/dist/types/functions/wallet/createSubname.d.ts.map +1 -1
  136. package/dist/types/functions/wallet/deleteSubname.d.ts +25 -25
  137. package/dist/types/functions/wallet/registerName.d.ts +24 -24
  138. package/dist/types/functions/wallet/renewNames.d.ts +24 -24
  139. package/dist/types/functions/wallet/setAbiRecord.d.ts +25 -25
  140. package/dist/types/functions/wallet/setAddressRecord.d.ts +25 -25
  141. package/dist/types/functions/wallet/setChildFuses.d.ts +27 -27
  142. package/dist/types/functions/wallet/setChildFuses.d.ts.map +1 -1
  143. package/dist/types/functions/wallet/setContentHashRecord.d.ts +25 -25
  144. package/dist/types/functions/wallet/setFuses.d.ts +27 -27
  145. package/dist/types/functions/wallet/setFuses.d.ts.map +1 -1
  146. package/dist/types/functions/wallet/setPrimaryName.d.ts +25 -25
  147. package/dist/types/functions/wallet/setRecords.d.ts +25 -25
  148. package/dist/types/functions/wallet/setResolver.d.ts +25 -25
  149. package/dist/types/functions/wallet/setTextRecord.d.ts +25 -25
  150. package/dist/types/functions/wallet/transferName.d.ts +25 -25
  151. package/dist/types/functions/wallet/unwrapName.d.ts +25 -25
  152. package/dist/types/functions/wallet/wrapName.d.ts +27 -27
  153. package/dist/types/functions/wallet/wrapName.d.ts.map +1 -1
  154. package/dist/types/index.d.ts +1 -1
  155. package/dist/types/index.d.ts.map +1 -1
  156. package/dist/types/utils/contentHash.d.ts +7 -11
  157. package/dist/types/utils/contentHash.d.ts.map +1 -1
  158. package/dist/types/utils/encoders/encodeSetContentHash.d.ts.map +1 -1
  159. package/dist/types/utils/format.d.ts +0 -2
  160. package/dist/types/utils/format.d.ts.map +1 -1
  161. package/dist/types/utils/fuses.d.ts +164 -125
  162. package/dist/types/utils/fuses.d.ts.map +1 -1
  163. package/dist/types/utils/index.d.ts +2 -2
  164. package/dist/types/utils/index.d.ts.map +1 -1
  165. package/dist/types/utils/registerHelpers.d.ts +2 -2
  166. package/dist/types/utils/registerHelpers.d.ts.map +1 -1
  167. package/package.json +4 -3
  168. package/src/clients/decorators/subgraph.ts +1 -0
  169. package/src/contracts/consts.ts +57 -12
  170. package/src/dns.ts +5 -5
  171. package/src/errors/subgraph.ts +4 -4
  172. package/src/errors/utils.ts +21 -18
  173. package/src/errors/version.ts +1 -1
  174. package/src/functions/dns/{prepareDnsImport.ts → getDnsImportData.ts} +12 -13
  175. package/src/functions/dns/importDnsName.ts +20 -15
  176. package/src/functions/public/_getContentHash.ts +2 -2
  177. package/src/functions/public/getSupportedInterfaces.ts +48 -10
  178. package/src/functions/public/getWrapperData.ts +2 -2
  179. package/src/functions/subgraph/filters.ts +702 -0
  180. package/src/functions/subgraph/getNameHistory.ts +2 -2
  181. package/src/functions/subgraph/getNamesForAddress.ts +170 -186
  182. package/src/functions/subgraph/getSubnames.ts +121 -113
  183. package/src/functions/subgraph/types.ts +13 -0
  184. package/src/functions/subgraph/utils.ts +2 -2
  185. package/src/functions/wallet/createSubname.ts +4 -4
  186. package/src/functions/wallet/setChildFuses.ts +3 -3
  187. package/src/functions/wallet/setFuses.ts +6 -3
  188. package/src/functions/wallet/wrapName.ts +8 -3
  189. package/src/index.ts +0 -1
  190. package/src/utils/contentHash.ts +59 -113
  191. package/src/utils/encoders/encodeSetContentHash.ts +2 -4
  192. package/src/utils/format.ts +0 -6
  193. package/src/utils/fuses.ts +308 -308
  194. package/src/utils/index.ts +4 -5
  195. package/src/utils/registerHelpers.ts +5 -3
  196. package/dist/esm/functions/dns/prepareDnsImport.js.map +0 -1
  197. package/src/@types/@ensdomains/content-hash.d.ts +0 -1
  198. package/src/functions/dns/getDnsOwner.test.ts +0 -195
  199. package/src/functions/dns/importDnsName.test.ts +0 -117
  200. package/src/functions/dns/prepareDnsImport.test.ts +0 -115
  201. package/src/functions/public/batch.test.ts +0 -67
  202. package/src/functions/public/ccip.test.ts +0 -78
  203. package/src/functions/public/getAbiRecord.test.ts +0 -174
  204. package/src/functions/public/getAddressRecord.test.ts +0 -83
  205. package/src/functions/public/getAvailable.test.ts +0 -17
  206. package/src/functions/public/getContentHashRecord.test.ts +0 -28
  207. package/src/functions/public/getExpiry.test.ts +0 -48
  208. package/src/functions/public/getName.test.ts +0 -66
  209. package/src/functions/public/getOwner.test.ts +0 -87
  210. package/src/functions/public/getPrice.test.ts +0 -45
  211. package/src/functions/public/getRecords.test.ts +0 -49
  212. package/src/functions/public/getResolver.test.ts +0 -12
  213. package/src/functions/public/getTextRecord.test.ts +0 -20
  214. package/src/functions/public/getWrapperData.test.ts +0 -79
  215. package/src/functions/public/getWrapperName.test.ts +0 -19
  216. package/src/functions/subgraph/client.test.ts +0 -170
  217. package/src/functions/subgraph/getDecodedName.test.ts +0 -31
  218. package/src/functions/subgraph/getNameHistory.test.ts +0 -39
  219. package/src/functions/subgraph/getNamesForAddress.test.ts +0 -244
  220. package/src/functions/subgraph/getSubgraphRecords.test.ts +0 -74
  221. package/src/functions/subgraph/getSubgraphRegistrant.test.ts +0 -34
  222. package/src/functions/subgraph/getSubnames.test.ts +0 -202
  223. package/src/functions/wallet/commitName.test.ts +0 -58
  224. package/src/functions/wallet/createSubname.test.ts +0 -73
  225. package/src/functions/wallet/deleteSubname.test.ts +0 -150
  226. package/src/functions/wallet/registerName.test.ts +0 -81
  227. package/src/functions/wallet/renewNames.test.ts +0 -92
  228. package/src/functions/wallet/setAbiRecord.test.ts +0 -156
  229. package/src/functions/wallet/setAddressRecord.test.ts +0 -121
  230. package/src/functions/wallet/setChildFuses.test.ts +0 -97
  231. package/src/functions/wallet/setContentHashRecord.test.ts +0 -69
  232. package/src/functions/wallet/setFuses.test.ts +0 -287
  233. package/src/functions/wallet/setPrimaryName.test.ts +0 -71
  234. package/src/functions/wallet/setRecords.test.ts +0 -127
  235. package/src/functions/wallet/setResolver.test.ts +0 -114
  236. package/src/functions/wallet/setTextRecord.test.ts +0 -67
  237. package/src/functions/wallet/transferName.test.ts +0 -201
  238. package/src/functions/wallet/unwrapName.test.ts +0 -93
  239. package/src/functions/wallet/wrapName.test.ts +0 -195
  240. package/src/utils/generateRecordCallArray.test.ts +0 -84
  241. package/src/utils/labels.test.ts +0 -163
  242. package/src/utils/makeLabelNodeAndParent.test.ts +0 -11
  243. package/src/utils/makeSafeSecondsDate.test.ts +0 -14
  244. package/src/utils/normalise.test.ts +0 -35
  245. package/src/utils/ownerFromContract.test.ts +0 -52
  246. package/src/utils/registerHelpers.test.ts +0 -159
  247. package/src/utils/validation.test.ts +0 -170
  248. package/src/utils/wrapper.test.ts +0 -46
@@ -1,381 +1,381 @@
1
+ /* eslint-disable @typescript-eslint/no-redeclare, @typescript-eslint/naming-convention */
1
2
  import {
2
- FusesFuseNotAllowedError,
3
3
  FusesInvalidFuseObjectError,
4
4
  FusesInvalidNamedFuseError,
5
5
  FusesInvalidUnnamedFuseError,
6
- FusesNonIntegerError,
7
6
  FusesOutOfRangeError,
8
7
  FusesRestrictionNotAllowedError,
9
- FusesValueRequiredError,
10
8
  } from '../errors/utils.js'
11
9
 
12
- // child named fuses
13
- const CANNOT_UNWRAP = 1
14
- const CANNOT_BURN_FUSES = 2
15
- const CANNOT_TRANSFER = 4
16
- const CANNOT_SET_RESOLVER = 8
17
- const CANNOT_SET_TTL = 16
18
- const CANNOT_CREATE_SUBDOMAIN = 32
19
- const CANNOT_APPROVE = 64
20
-
21
- // parent named fuses
22
- const PARENT_CANNOT_CONTROL = 0x10000
23
- const IS_DOT_ETH = 0x20000
24
- const CAN_EXTEND_EXPIRY = 0x40000
25
-
26
- // fuse ranges
27
- export const CHILD_CONTROLLED_FUSES = 0x0000ffff
28
- export const PARENT_CONTROLLED_FUSES = 0xffff0000
29
- export const USER_SETTABLE_FUSES = 0xfffdffff
30
-
31
- // empty fuse
32
- const CAN_DO_EVERYTHING = 0
33
-
34
- export const childFuseEnum = {
35
- CANNOT_UNWRAP,
36
- CANNOT_BURN_FUSES,
37
- CANNOT_TRANSFER,
38
- CANNOT_SET_RESOLVER,
39
- CANNOT_SET_TTL,
40
- CANNOT_CREATE_SUBDOMAIN,
41
- CANNOT_APPROVE,
10
+ export const ChildFuses = {
11
+ CANNOT_UNWRAP: 1n,
12
+ CANNOT_BURN_FUSES: 2n,
13
+ CANNOT_TRANSFER: 4n,
14
+ CANNOT_SET_RESOLVER: 8n,
15
+ CANNOT_SET_TTL: 16n,
16
+ CANNOT_CREATE_SUBDOMAIN: 32n,
17
+ CANNOT_APPROVE: 64n,
42
18
  } as const
19
+ export type ChildFuses = typeof ChildFuses
20
+ export const ChildFuseKeys = Object.keys(ChildFuses) as (keyof ChildFuses)[]
43
21
 
44
- export const parentFuseEnum = {
45
- PARENT_CANNOT_CONTROL,
46
- CAN_EXTEND_EXPIRY,
47
- }
48
-
49
- export const fullParentFuseEnum = {
50
- ...parentFuseEnum,
51
- IS_DOT_ETH,
22
+ export const ParentFuses = {
23
+ PARENT_CANNOT_CONTROL: 0x10000n,
24
+ CAN_EXTEND_EXPIRY: 0x40000n,
52
25
  } as const
26
+ export type ParentFuses = typeof ParentFuses
27
+ export const ParentFuseKeys = Object.keys(ParentFuses) as (keyof ParentFuses)[]
53
28
 
54
- export const userSettableFuseEnum = {
55
- ...childFuseEnum,
56
- ...parentFuseEnum,
29
+ export const UserSettableFuses = {
30
+ ...ChildFuses,
31
+ ...ParentFuses,
32
+ } as const
33
+ export type UserSettableFuses = typeof UserSettableFuses
34
+ export const UserSettableFuseKeys = Object.keys(
35
+ UserSettableFuses,
36
+ ) as (keyof UserSettableFuses)[]
37
+
38
+ export const FullParentFuses = {
39
+ ...ParentFuses,
40
+ IS_DOT_ETH: 0x20000n,
57
41
  } as const
42
+ export type FullParentFuses = typeof FullParentFuses
43
+ export const FullParentFuseKeys = Object.keys(
44
+ FullParentFuses,
45
+ ) as (keyof FullParentFuses)[]
46
+
47
+ export const UnnamedChildFuses = [
48
+ 0x80n,
49
+ 0x100n,
50
+ 0x200n,
51
+ 0x400n,
52
+ 0x800n,
53
+ 0x1000n,
54
+ 0x2000n,
55
+ 0x4000n,
56
+ 0x8000n,
57
+ ] as const
58
+ export type UnnamedChildFuses = typeof UnnamedChildFuses
59
+ export const UnnamedChildFuseKeys = [
60
+ '0x80',
61
+ '0x100',
62
+ '0x200',
63
+ '0x400',
64
+ '0x800',
65
+ '0x1000',
66
+ '0x2000',
67
+ '0x4000',
68
+ '0x8000',
69
+ ] as const
70
+ export type UnnamedChildFuseKeys = typeof UnnamedChildFuseKeys
71
+
72
+ export const UnnamedParentFuses = [
73
+ 0x80000n,
74
+ 0x100000n,
75
+ 0x200000n,
76
+ 0x400000n,
77
+ 0x800000n,
78
+ 0x1000000n,
79
+ 0x2000000n,
80
+ 0x4000000n,
81
+ 0x8000000n,
82
+ 0x10000000n,
83
+ 0x20000000n,
84
+ 0x40000000n,
85
+ 0x80000000n,
86
+ ] as const
87
+ export type UnnamedParentFuses = typeof UnnamedParentFuses
88
+ export const UnnamedParentFuseKeys = [
89
+ '0x80000',
90
+ '0x100000',
91
+ '0x200000',
92
+ '0x400000',
93
+ '0x800000',
94
+ '0x1000000',
95
+ ] as const
96
+ export type UnnamedParentFuseKeys = typeof UnnamedParentFuseKeys
58
97
 
59
- export const fullFuseEnum = {
60
- ...userSettableFuseEnum,
61
- ...fullParentFuseEnum,
62
- CAN_DO_EVERYTHING,
63
- }
98
+ export const FuseRanges = {
99
+ CHILD_CONTROLLED_FUSES: 0x0000ffffn,
100
+ PARENT_CONTROLLED_FUSES: 0xffff0000n,
101
+ USER_SETTABLE_FUSES: 0xfffdffffn,
102
+ } as const
64
103
 
65
- export const unnamedChildFuses = [
66
- 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768,
67
- ] as const
104
+ type FuseRestriction = 'parent' | 'child'
68
105
 
69
- export const unnamedParentFuses = [
70
- 0x80000, 0x100000, 0x200000, 0x400000, 0x800000, 0x1000000, 0x2000000,
71
- 0x4000000, 0x8000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000,
72
- ] as const
106
+ type GenericFuseEnum<TGroupName extends FuseRestriction = FuseRestriction> = {
107
+ Name: TGroupName
108
+ Object: Record<string, bigint>
109
+ Keys: string[]
110
+ Range: bigint
111
+ Unnamed: readonly bigint[]
112
+ UnnamedKeys: readonly string[]
113
+ Minimum: bigint
114
+ Maximum: bigint
115
+ }
73
116
 
74
- export const unnamedUserSettableFuses = [
75
- ...unnamedChildFuses,
76
- ...unnamedParentFuses,
77
- ] as const
117
+ const ChildReference = {
118
+ Name: 'child',
119
+ Object: ChildFuses,
120
+ Keys: ChildFuseKeys,
121
+ Range: FuseRanges.CHILD_CONTROLLED_FUSES,
122
+ Unnamed: UnnamedChildFuses,
123
+ UnnamedKeys: UnnamedChildFuseKeys,
124
+ Minimum: 0n,
125
+ Maximum: 2n ** 16n - 1n,
126
+ } as const
127
+ type ChildReference = typeof ChildReference & {
128
+ Key: keyof ChildReference['Object']
129
+ UnnamedKey: ChildReference['Unnamed'][number]
130
+ }
78
131
 
79
- export const childFuseKeys = Object.keys(
80
- childFuseEnum,
81
- ) as (keyof typeof childFuseEnum)[]
82
- export const parentFuseKeys = Object.keys(
83
- parentFuseEnum,
84
- ) as (keyof typeof parentFuseEnum)[]
85
- export const fullParentFuseKeys = Object.keys(
86
- fullParentFuseEnum,
87
- ) as (keyof typeof fullParentFuseEnum)[]
88
- export const userSettableFuseKeys = Object.keys(
89
- userSettableFuseEnum,
90
- ) as (keyof typeof userSettableFuseEnum)[]
91
-
92
- type FuseType<
93
- Enum extends Record<string, number>,
94
- UnnamedTuple extends readonly number[],
95
- CustomFuses extends string = never,
96
- > = {
97
- fuse: keyof Enum
98
- options: { -readonly [K in keyof Enum]?: boolean }
99
- current: { [K in keyof Enum]: boolean } & {
100
- readonly [K in CustomFuses]: boolean
101
- }
102
- unnamed: UnnamedTuple
103
- unnamedValues: UnnamedTuple[number]
104
- unnamedObject: { [K in UnnamedTuple[number]]: boolean }
132
+ const ParentReference = {
133
+ Name: 'parent',
134
+ Object: ParentFuses,
135
+ Keys: ParentFuseKeys,
136
+ Range: FuseRanges.PARENT_CONTROLLED_FUSES,
137
+ Unnamed: UnnamedParentFuses,
138
+ UnnamedKeys: UnnamedParentFuseKeys,
139
+ Minimum: 2n ** 16n,
140
+ Maximum: 2n ** 32n,
141
+ } as const
142
+ type ParentReference = typeof ParentReference & {
143
+ Key: keyof ParentReference['Object']
144
+ UnnamedKey: ParentReference['Unnamed'][number]
105
145
  }
106
146
 
107
- export type ChildFuses = FuseType<
108
- typeof childFuseEnum,
109
- typeof unnamedChildFuses,
110
- 'CAN_DO_EVERYTHING'
111
- >
112
- export type ParentFuses = FuseType<
113
- typeof parentFuseEnum,
114
- typeof unnamedParentFuses
115
- >
116
- export type FullParentFuses = FuseType<
117
- typeof fullParentFuseEnum,
118
- typeof unnamedParentFuses
119
- >
120
- export type UserSettableFuses = FuseType<
121
- typeof userSettableFuseEnum,
122
- typeof unnamedUserSettableFuses
123
- >
147
+ const FullParentReference = {
148
+ Name: 'parent',
149
+ Object: FullParentFuses,
150
+ Keys: FullParentFuseKeys,
151
+ Range: FuseRanges.PARENT_CONTROLLED_FUSES,
152
+ Unnamed: UnnamedParentFuses,
153
+ UnnamedKeys: UnnamedParentFuseKeys,
154
+ Minimum: 2n ** 16n,
155
+ Maximum: 2n ** 32n,
156
+ } as const
157
+ type FullParentReference = typeof FullParentReference & {
158
+ Key: keyof FullParentReference['Object']
159
+ UnnamedKey: ParentReference['Unnamed'][number]
160
+ }
124
161
 
125
- type InputFuses<NamedFuse extends string, UnnamedFuse extends number> =
162
+ type InputFuses<NamedFuse extends string, UnnamedFuse extends bigint> =
126
163
  | {
127
164
  named: readonly NamedFuse[]
165
+ unnamed?: readonly UnnamedFuse[]
166
+ number?: never
128
167
  }
129
168
  | {
169
+ named?: readonly NamedFuse[]
130
170
  unnamed: readonly UnnamedFuse[]
171
+ number?: never
131
172
  }
132
173
  | {
133
- named: readonly NamedFuse[]
134
- unnamed: readonly UnnamedFuse[]
135
- }
136
- | {
137
- number: number
174
+ named?: never
175
+ unnamed?: never
176
+ number: bigint
138
177
  }
139
178
 
140
- export type CombinedFuseInput = {
141
- child: InputFuses<ChildFuses['fuse'], ChildFuses['unnamedValues']>
142
- parent: InputFuses<ParentFuses['fuse'], ParentFuses['unnamedValues']>
143
- }
179
+ export type EncodeChildFusesInputObject = InputFuses<
180
+ ChildReference['Key'],
181
+ ChildReference['UnnamedKey']
182
+ >
183
+ export type EncodeParentFusesInputObject = InputFuses<
184
+ ParentReference['Key'],
185
+ ParentReference['UnnamedKey']
186
+ >
144
187
 
145
- type FuseRestriction = 'parent' | 'child'
188
+ export type EncodeFusesInputObject =
189
+ | {
190
+ child: EncodeChildFusesInputObject
191
+ parent?: EncodeParentFusesInputObject
192
+ number?: never
193
+ }
194
+ | {
195
+ child?: EncodeChildFusesInputObject
196
+ parent: EncodeParentFusesInputObject
197
+ number?: never
198
+ }
199
+ | {
200
+ child?: never
201
+ parent?: never
202
+ number: bigint
203
+ }
146
204
 
147
- const checkNumber = (fuses: number) => {
148
- if (fuses > 2 ** 32 || fuses < 1)
205
+ const validateFuseNumber = (fuses: bigint) => {
206
+ if (fuses > 2n ** 32n || fuses < 0n)
149
207
  throw new FusesOutOfRangeError({
150
208
  fuses,
151
209
  details: `Fuse number must be limited to uint32, the supplied value was too ${
152
- fuses < 1 ? 'low' : 'high'
210
+ fuses < 0 ? 'low' : 'high'
153
211
  }`,
154
212
  })
155
- else if (fuses % 1 !== 0) throw new FusesNonIntegerError({ fuses })
156
- else if ((fuses & USER_SETTABLE_FUSES) !== fuses)
213
+ else if ((fuses & FuseRanges.USER_SETTABLE_FUSES) !== fuses)
157
214
  throw new FusesOutOfRangeError({
158
215
  fuses,
159
- maximum: 2 ** 16,
160
216
  details: `Fuse number must be limited to user settable fuses, the supplied value was not`,
161
217
  })
162
218
  }
163
219
 
164
- const testFuses = (fuses: any) => {
165
- if ('named' in fuses && fuses.named.length > 0) {
166
- return true
167
- }
168
- if ('unnamed' in fuses && fuses.unnamed.length > 0) {
169
- return true
220
+ const checkFuseObject = <TFuseReference extends GenericFuseEnum>({
221
+ reference,
222
+ object,
223
+ }: {
224
+ reference: TFuseReference
225
+ object: EncodeFusesInputObject[TFuseReference['Name']]
226
+ }): number => {
227
+ if (!object) return 0
228
+
229
+ if ('number' in object) {
230
+ if ('named' in object || 'unnamed' in object)
231
+ throw new FusesInvalidFuseObjectError({
232
+ fuses: object,
233
+ details: 'Cannot specify both a fuse number and named/unnamed fuses.',
234
+ })
235
+ validateFuseNumber(object.number)
236
+
237
+ if ((object.number & reference.Range) !== object.number)
238
+ throw new FusesOutOfRangeError({
239
+ fuses: object.number,
240
+ minimum: reference.Minimum,
241
+ maximum: reference.Maximum,
242
+ details: `Cannot specify a fuse value to set that is outside of the ${reference.Name}'s control.`,
243
+ })
244
+
245
+ return Number(object.number)
170
246
  }
171
- if ('number' in fuses && fuses.number !== 0) {
172
- return true
247
+
248
+ let fuseNumber = 0n
249
+
250
+ if ('named' in object && object.named) {
251
+ for (const fuse of object.named) {
252
+ if (!reference.Keys.includes(fuse))
253
+ throw new FusesInvalidNamedFuseError({ fuse })
254
+ fuseNumber |= reference.Object[fuse]
255
+ }
173
256
  }
174
- return false
175
- }
176
257
 
177
- export const hasFuses = (fuses: any) => {
178
- if (typeof fuses === 'number') {
179
- return fuses !== 0
258
+ if ('unnamed' in object && object.unnamed) {
259
+ for (const fuse of object.unnamed) {
260
+ if (!reference.Unnamed.includes(fuse))
261
+ throw new FusesInvalidUnnamedFuseError({ fuse })
262
+ fuseNumber |= fuse
263
+ }
180
264
  }
181
265
 
182
- if (typeof fuses === 'object') {
183
- if ('child' in fuses && testFuses(fuses.child)) {
184
- return true
266
+ return Number(fuseNumber)
267
+ }
268
+
269
+ type EncodeFusesParameters =
270
+ | {
271
+ restriction: 'child'
272
+ input: EncodeChildFusesInputObject
185
273
  }
186
- if ('parent' in fuses && testFuses(fuses.parent)) {
187
- return true
274
+ | {
275
+ restriction: 'parent'
276
+ input: EncodeParentFusesInputObject
188
277
  }
189
- if (testFuses(fuses)) {
190
- return true
278
+ | {
279
+ restriction?: never
280
+ input: EncodeFusesInputObject
191
281
  }
192
- }
193
- return false
194
- }
195
282
 
196
- export function encodeFuses(fuses: Partial<CombinedFuseInput> | number): number
197
- export function encodeFuses(
198
- fuses: CombinedFuseInput['child'],
199
- restrictTo: 'child',
200
- ): number
201
- export function encodeFuses(
202
- fuses: CombinedFuseInput['parent'],
203
- restrictTo: 'parent',
204
- ): number
205
- export function encodeFuses<T extends FuseRestriction>(
206
- fuses: CombinedFuseInput[T],
207
- restrictTo?: T,
208
- ) {
209
- let encodedFuses: number = 0
210
-
211
- if (typeof fuses === 'number') {
212
- if (restrictTo)
283
+ export const encodeFuses = ({
284
+ restriction,
285
+ input,
286
+ }: EncodeFusesParameters): number => {
287
+ if (restriction) {
288
+ if ('parent' in input || 'child' in input)
213
289
  throw new FusesRestrictionNotAllowedError({
214
- fuses,
290
+ fuses: input,
215
291
  details:
216
- 'Fuse restriction cannot be used when an exact value is specified',
292
+ 'Fuse restriction cannot be used when fuse category is specified',
217
293
  })
218
- checkNumber(fuses)
219
-
220
- encodedFuses = fuses
221
- } else {
222
- let fusesRef = fuses as unknown as CombinedFuseInput
223
- let allowedNamed: readonly UserSettableFuses['fuse'][] = []
224
- let allowedUnnamed: readonly UserSettableFuses['unnamedValues'][] = []
225
-
226
- let namedArray: readonly UserSettableFuses['fuse'][] = []
227
- let unnamedArray: readonly UserSettableFuses['unnamedValues'][] = []
228
-
229
- if (restrictTo) {
230
- if ('parent' in fuses || 'child' in fuses)
231
- throw new FusesRestrictionNotAllowedError({
232
- fuses,
233
- details:
234
- 'Fuse restriction cannot be used when fuse category is specified',
235
- })
236
- allowedNamed = restrictTo === 'child' ? childFuseKeys : parentFuseKeys
237
- allowedUnnamed =
238
- restrictTo === 'child' ? unnamedChildFuses : unnamedParentFuses
239
-
240
- fusesRef = { [restrictTo]: fuses } as unknown as CombinedFuseInput
241
- } else {
242
- allowedNamed = userSettableFuseKeys
243
- allowedUnnamed = unnamedUserSettableFuses
244
- }
245
- if ('parent' in fusesRef) {
246
- if ('named' in fusesRef.parent) namedArray = fusesRef.parent.named
247
- if ('unnamed' in fusesRef.parent) unnamedArray = fusesRef.parent.unnamed
248
- if ('number' in fusesRef.parent) {
249
- if ('named' in fusesRef.parent || 'unnamed' in fusesRef.parent)
250
- throw new FusesInvalidFuseObjectError({
251
- fuses,
252
- details:
253
- 'Cannot specify both a fuse number and named/unnamed fuses.',
254
- })
255
- checkNumber(fusesRef.parent.number)
256
-
257
- if (
258
- (fusesRef.parent.number & PARENT_CONTROLLED_FUSES) !==
259
- fusesRef.parent.number
260
- )
261
- throw new FusesOutOfRangeError({
262
- fuses: fusesRef.parent.number,
263
- minimum: 2 ** 17,
264
- details:
265
- "Cannot specify a fuse value to set that is outside of the parent's control.",
266
- })
267
-
268
- encodedFuses |= fusesRef.parent.number
269
- }
270
- }
271
- if ('child' in fusesRef) {
272
- if ('named' in fusesRef.child)
273
- namedArray = [...namedArray, ...fusesRef.child.named]
274
- if ('unnamed' in fusesRef.child)
275
- unnamedArray = [...unnamedArray, ...fusesRef.child.unnamed]
276
- if ('number' in fusesRef.child) {
277
- if ('named' in fusesRef.child || 'unnamed' in fusesRef.child)
278
- throw new FusesInvalidFuseObjectError({
279
- fuses,
280
- details:
281
- 'Cannot specify both a fuse number and named/unnamed fuses.',
282
- })
283
- checkNumber(fusesRef.child.number)
284
-
285
- if (
286
- (fusesRef.child.number & CHILD_CONTROLLED_FUSES) !==
287
- fusesRef.child.number
288
- )
289
- throw new FusesOutOfRangeError({
290
- fuses: fusesRef.child.number,
291
- maximum: 2 ** 16,
292
- details:
293
- "Cannot specify a fuse value to set that is outside of the owner's control.",
294
- })
295
-
296
- encodedFuses |= fusesRef.child.number
297
- }
298
- }
294
+ return checkFuseObject({
295
+ object: input,
296
+ reference: restriction === 'child' ? ChildReference : ParentReference,
297
+ })
298
+ }
299
299
 
300
- if (!namedArray.length && !unnamedArray.length && !encodedFuses)
301
- throw new FusesValueRequiredError()
300
+ if ('number' in input) {
301
+ if ('parent' in input || 'child' in input)
302
+ throw new FusesInvalidFuseObjectError({
303
+ fuses: input,
304
+ details: 'Cannot specify both a fuse number and named/unnamed fuses.',
305
+ })
302
306
 
303
- for (const fuse of namedArray) {
304
- if (!allowedNamed.includes(fuse)) {
305
- if (!userSettableFuseKeys.includes(fuse))
306
- throw new FusesInvalidNamedFuseError({ fuse })
307
- throw new FusesFuseNotAllowedError({ fuse })
308
- }
309
- encodedFuses |= userSettableFuseEnum[fuse]
310
- }
311
- for (const fuse of unnamedArray) {
312
- if (!allowedUnnamed.includes(fuse)) {
313
- if (!unnamedUserSettableFuses.includes(fuse))
314
- throw new FusesInvalidUnnamedFuseError({ fuse })
315
- throw new FusesFuseNotAllowedError({ fuse })
316
- }
317
- encodedFuses |= fuse
318
- }
307
+ validateFuseNumber(input.number)
308
+ return Number(input.number)
319
309
  }
320
310
 
321
- return encodedFuses
322
- }
311
+ const childFuses =
312
+ 'child' in input
313
+ ? checkFuseObject({ object: input.child, reference: ChildReference })
314
+ : 0
315
+ const parentFuses =
316
+ 'parent' in input
317
+ ? checkFuseObject({ object: input.parent, reference: ParentReference })
318
+ : 0
323
319
 
324
- const decodeNamedFuses = (fuses: number, arr: readonly string[]) => {
325
- const fuseObj = Object.fromEntries(
326
- arr.map((fuse) => [
327
- fuse,
328
- (fuses & fullFuseEnum[fuse as keyof typeof fullFuseEnum]) ===
329
- fullFuseEnum[fuse as keyof typeof fullFuseEnum],
330
- ]),
331
- )
320
+ return Number(childFuses | parentFuses)
321
+ }
332
322
 
333
- return fuseObj
323
+ type DecodedFuseGroup<TFuseReference extends GenericFuseEnum> = {
324
+ [key in TFuseReference['Keys'][number]]: boolean
325
+ } & {
326
+ unnamed: {
327
+ [key in TFuseReference['UnnamedKeys'][number]]: boolean
328
+ }
334
329
  }
335
330
 
336
- const decodeUnnamedFuses = (fuses: number, arr: readonly number[]) => {
337
- const fuseObj = Object.fromEntries(
338
- arr.map((fuse) => [fuse, (fuses & fuse) === fuse]),
339
- )
331
+ type DecodedChildFuses = DecodedFuseGroup<ChildReference> & {
332
+ CAN_DO_EVERYTHING: boolean
333
+ }
334
+ type DecodedParentFuses = DecodedFuseGroup<FullParentReference>
340
335
 
341
- return fuseObj
336
+ export type DecodedFuses = {
337
+ child: DecodedChildFuses
338
+ parent: DecodedParentFuses
342
339
  }
343
340
 
344
- export const decodeFuses = (fuses: number) => {
345
- const parentNamedFuses = decodeNamedFuses(
346
- fuses,
347
- fullParentFuseKeys,
348
- ) as FullParentFuses['current']
349
- const parentUnnamedFuses = decodeUnnamedFuses(
350
- fuses,
351
- unnamedParentFuses,
352
- ) as ParentFuses['unnamedObject']
353
-
354
- const childNamedFuses = decodeNamedFuses(
355
- fuses,
356
- childFuseKeys,
357
- ) as ChildFuses['current']
358
- const childUnnamedFuses = decodeUnnamedFuses(
359
- fuses,
360
- unnamedChildFuses,
361
- ) as ChildFuses['unnamedObject']
341
+ const decodeFusesFromReference = <TFuseReference extends GenericFuseEnum>({
342
+ input,
343
+ reference,
344
+ }: {
345
+ input: bigint
346
+ reference: TFuseReference
347
+ }): DecodedFuseGroup<TFuseReference> => ({
348
+ ...(Object.fromEntries(
349
+ reference.Keys.map((key) => [
350
+ key,
351
+ (input & reference.Object[key]) === reference.Object[key],
352
+ ]),
353
+ ) as Record<TFuseReference['Keys'][number], boolean>),
354
+ unnamed: Object.fromEntries(
355
+ reference.UnnamedKeys.map((key) => [
356
+ key,
357
+ (input & BigInt(key)) === BigInt(key),
358
+ ]),
359
+ ) as Record<TFuseReference['UnnamedKeys'][number], boolean>,
360
+ })
362
361
 
362
+ export const decodeFuses = (fuses: number): DecodedFuses => {
363
+ const fusesBigInt = BigInt(fuses)
363
364
  return {
364
- parent: {
365
- ...parentNamedFuses,
366
- unnamed: parentUnnamedFuses,
367
- },
365
+ parent: decodeFusesFromReference({
366
+ input: fusesBigInt,
367
+ reference: FullParentReference,
368
+ }),
368
369
  child: {
369
- ...childNamedFuses,
370
- CAN_DO_EVERYTHING: (fuses & CHILD_CONTROLLED_FUSES) === 0,
371
- unnamed: childUnnamedFuses,
370
+ ...decodeFusesFromReference({
371
+ input: fusesBigInt,
372
+ reference: ChildReference,
373
+ }),
374
+ CAN_DO_EVERYTHING:
375
+ (fusesBigInt & FuseRanges.CHILD_CONTROLLED_FUSES) === 0n,
372
376
  },
373
377
  }
374
378
  }
375
379
 
376
- export const checkPCCBurned = (fuses: number) =>
377
- (fuses & PARENT_CANNOT_CONTROL) === PARENT_CANNOT_CONTROL
378
-
379
- export type AllCurrentFuses = ReturnType<typeof decodeFuses>
380
-
381
- export default fullFuseEnum
380
+ export const checkPccBurned = (fuses: bigint) =>
381
+ (fuses & ParentFuses.PARENT_CANNOT_CONTROL) === 0n