@ensdomains/ensjs 3.0.0-alpha.10 → 3.0.0-alpha.13

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 (277) hide show
  1. package/dist/cjs/contracts/baseRegistrar.d.ts +1 -1
  2. package/dist/cjs/contracts/index.d.ts +3 -3
  3. package/dist/cjs/contracts/multicall.d.ts +1 -1
  4. package/dist/cjs/contracts/registry.d.ts +1 -1
  5. package/dist/cjs/functions/burnFuses.js +1 -1
  6. package/dist/cjs/functions/commitName.d.ts +26 -0
  7. package/dist/cjs/functions/commitName.js +24 -0
  8. package/dist/cjs/functions/createSubname.d.ts +3 -1
  9. package/dist/cjs/functions/createSubname.js +4 -2
  10. package/dist/cjs/functions/deleteSubname.d.ts +1 -1
  11. package/dist/cjs/functions/deleteSubname.js +3 -2
  12. package/dist/cjs/functions/getExpiry.d.ts +9 -2
  13. package/dist/cjs/functions/getExpiry.js +52 -7
  14. package/dist/cjs/functions/getFuses.d.ts +2 -3
  15. package/dist/cjs/functions/getFuses.js +4 -13
  16. package/dist/cjs/functions/getHistory.d.ts +0 -30
  17. package/dist/cjs/functions/getHistory.js +3 -99
  18. package/dist/cjs/functions/getName.d.ts +2 -2
  19. package/dist/cjs/functions/getName.js +1 -1
  20. package/dist/cjs/functions/getProfile.js +1 -1
  21. package/dist/cjs/functions/getSpecificRecord.js +8 -1
  22. package/dist/cjs/functions/getSubnames.d.ts +1 -1
  23. package/dist/cjs/functions/getSubnames.js +1 -1
  24. package/dist/cjs/functions/registerName.d.ts +11 -0
  25. package/dist/cjs/functions/registerName.js +19 -0
  26. package/dist/cjs/functions/renewName.d.ts +6 -0
  27. package/dist/cjs/functions/renewName.js +10 -0
  28. package/dist/cjs/functions/transferSubname.d.ts +12 -3
  29. package/dist/cjs/functions/transferSubname.js +5 -3
  30. package/dist/cjs/functions/wrapName.d.ts +3 -1
  31. package/dist/cjs/functions/wrapName.js +35 -29
  32. package/dist/cjs/generated/BaseRegistrarImplementation.d.ts +222 -201
  33. package/dist/cjs/generated/DNSRegistrar.d.ts +68 -64
  34. package/dist/cjs/generated/DNSSECImpl.d.ts +111 -111
  35. package/dist/cjs/generated/DefaultReverseResolver.d.ts +17 -17
  36. package/dist/cjs/generated/ENSRegistry.d.ts +126 -111
  37. package/dist/cjs/generated/ETHRegistrarController.d.ts +111 -109
  38. package/dist/cjs/generated/Multicall.d.ts +60 -60
  39. package/dist/cjs/generated/NameWrapper.d.ts +493 -354
  40. package/dist/cjs/generated/P256SHA256Algorithm.d.ts +11 -7
  41. package/dist/cjs/generated/PublicResolver.d.ts +259 -235
  42. package/dist/cjs/generated/RSASHA1Algorithm.d.ts +11 -7
  43. package/dist/cjs/generated/RSASHA256Algorithm.d.ts +11 -7
  44. package/dist/cjs/generated/ReverseRegistrar.d.ts +112 -103
  45. package/dist/cjs/generated/Root.d.ts +77 -77
  46. package/dist/cjs/generated/SHA1Digest.d.ts +7 -7
  47. package/dist/cjs/generated/SHA1NSEC3Digest.d.ts +11 -7
  48. package/dist/cjs/generated/SHA256Digest.d.ts +7 -7
  49. package/dist/cjs/generated/StaticMetadataService.d.ts +7 -7
  50. package/dist/cjs/generated/TLDPublicSuffixList.d.ts +7 -7
  51. package/dist/cjs/generated/UniversalResolver.d.ts +31 -31
  52. package/dist/cjs/generated/common.d.ts +1 -0
  53. package/dist/cjs/generated/factories/DNSRegistrar__factory.d.ts +3 -15
  54. package/dist/cjs/generated/factories/DNSRegistrar__factory.js +3 -26
  55. package/dist/cjs/generated/factories/DNSSECImpl__factory.d.ts +3 -15
  56. package/dist/cjs/generated/factories/DNSSECImpl__factory.js +3 -26
  57. package/dist/cjs/generated/factories/ETHRegistrarController__factory.js +14 -4
  58. package/dist/cjs/generated/factories/NameWrapper__factory.js +210 -79
  59. package/dist/cjs/generated/factories/P256SHA256Algorithm__factory.d.ts +3 -15
  60. package/dist/cjs/generated/factories/P256SHA256Algorithm__factory.js +3 -26
  61. package/dist/cjs/generated/factories/RSASHA1Algorithm__factory.d.ts +3 -15
  62. package/dist/cjs/generated/factories/RSASHA1Algorithm__factory.js +3 -26
  63. package/dist/cjs/generated/factories/RSASHA256Algorithm__factory.d.ts +3 -15
  64. package/dist/cjs/generated/factories/RSASHA256Algorithm__factory.js +3 -26
  65. package/dist/cjs/generated/factories/SHA1Digest__factory.d.ts +3 -15
  66. package/dist/cjs/generated/factories/SHA1Digest__factory.js +3 -26
  67. package/dist/cjs/generated/factories/SHA1NSEC3Digest__factory.d.ts +3 -15
  68. package/dist/cjs/generated/factories/SHA1NSEC3Digest__factory.js +3 -26
  69. package/dist/cjs/generated/factories/SHA256Digest__factory.d.ts +3 -15
  70. package/dist/cjs/generated/factories/SHA256Digest__factory.js +3 -26
  71. package/dist/cjs/generated/factories/TLDPublicSuffixList__factory.d.ts +3 -15
  72. package/dist/cjs/generated/factories/TLDPublicSuffixList__factory.js +3 -26
  73. package/dist/cjs/generated/factories/index.d.ts +14 -0
  74. package/dist/cjs/generated/factories/index.js +29 -1
  75. package/dist/cjs/generated/index.d.ts +29 -1
  76. package/dist/cjs/generated/index.js +31 -3
  77. package/dist/cjs/index.d.ts +24 -40
  78. package/dist/cjs/index.js +9 -5
  79. package/dist/cjs/utils/registerHelpers.d.ts +44 -16
  80. package/dist/cjs/utils/registerHelpers.js +43 -15
  81. package/dist/cjs/utils/wrapperExpiry.d.ts +5 -0
  82. package/dist/cjs/utils/wrapperExpiry.js +30 -0
  83. package/dist/cjs/utils/writeTx.d.ts +18 -1
  84. package/dist/cjs/utils/writeTx.js +4 -1
  85. package/dist/esm/contracts/baseRegistrar.d.ts +1 -1
  86. package/dist/esm/contracts/index.d.ts +3 -3
  87. package/dist/esm/contracts/multicall.d.ts +1 -1
  88. package/dist/esm/contracts/registry.d.ts +1 -1
  89. package/dist/esm/functions/burnFuses.js +1 -1
  90. package/dist/esm/functions/commitName.d.ts +26 -0
  91. package/dist/esm/functions/commitName.js +21 -0
  92. package/dist/esm/functions/createSubname.d.ts +3 -1
  93. package/dist/esm/functions/createSubname.js +4 -2
  94. package/dist/esm/functions/deleteSubname.d.ts +1 -1
  95. package/dist/esm/functions/deleteSubname.js +3 -2
  96. package/dist/esm/functions/getExpiry.d.ts +9 -2
  97. package/dist/esm/functions/getExpiry.js +52 -7
  98. package/dist/esm/functions/getFuses.d.ts +2 -3
  99. package/dist/esm/functions/getFuses.js +5 -14
  100. package/dist/esm/functions/getHistory.d.ts +0 -30
  101. package/dist/esm/functions/getHistory.js +2 -96
  102. package/dist/esm/functions/getName.d.ts +2 -2
  103. package/dist/esm/functions/getName.js +1 -1
  104. package/dist/esm/functions/getProfile.js +1 -1
  105. package/dist/esm/functions/getSpecificRecord.js +8 -1
  106. package/dist/esm/functions/getSubnames.d.ts +1 -1
  107. package/dist/esm/functions/getSubnames.js +1 -1
  108. package/dist/esm/functions/registerName.d.ts +11 -0
  109. package/dist/esm/functions/registerName.js +16 -0
  110. package/dist/esm/functions/renewName.d.ts +6 -0
  111. package/dist/esm/functions/renewName.js +7 -0
  112. package/dist/esm/functions/transferSubname.d.ts +12 -3
  113. package/dist/esm/functions/transferSubname.js +5 -3
  114. package/dist/esm/functions/wrapName.d.ts +3 -1
  115. package/dist/esm/functions/wrapName.js +35 -29
  116. package/dist/esm/generated/BaseRegistrarImplementation.d.ts +222 -201
  117. package/dist/esm/generated/DNSRegistrar.d.ts +68 -64
  118. package/dist/esm/generated/DNSSECImpl.d.ts +111 -111
  119. package/dist/esm/generated/DefaultReverseResolver.d.ts +17 -17
  120. package/dist/esm/generated/ENSRegistry.d.ts +126 -111
  121. package/dist/esm/generated/ETHRegistrarController.d.ts +111 -109
  122. package/dist/esm/generated/Multicall.d.ts +60 -60
  123. package/dist/esm/generated/NameWrapper.d.ts +493 -354
  124. package/dist/esm/generated/P256SHA256Algorithm.d.ts +11 -7
  125. package/dist/esm/generated/PublicResolver.d.ts +259 -235
  126. package/dist/esm/generated/RSASHA1Algorithm.d.ts +11 -7
  127. package/dist/esm/generated/RSASHA256Algorithm.d.ts +11 -7
  128. package/dist/esm/generated/ReverseRegistrar.d.ts +112 -103
  129. package/dist/esm/generated/Root.d.ts +77 -77
  130. package/dist/esm/generated/SHA1Digest.d.ts +7 -7
  131. package/dist/esm/generated/SHA1NSEC3Digest.d.ts +11 -7
  132. package/dist/esm/generated/SHA256Digest.d.ts +7 -7
  133. package/dist/esm/generated/StaticMetadataService.d.ts +7 -7
  134. package/dist/esm/generated/TLDPublicSuffixList.d.ts +7 -7
  135. package/dist/esm/generated/UniversalResolver.d.ts +31 -31
  136. package/dist/esm/generated/common.d.ts +1 -0
  137. package/dist/esm/generated/factories/DNSRegistrar__factory.d.ts +3 -15
  138. package/dist/esm/generated/factories/DNSRegistrar__factory.js +2 -25
  139. package/dist/esm/generated/factories/DNSSECImpl__factory.d.ts +3 -15
  140. package/dist/esm/generated/factories/DNSSECImpl__factory.js +2 -25
  141. package/dist/esm/generated/factories/ETHRegistrarController__factory.js +14 -4
  142. package/dist/esm/generated/factories/NameWrapper__factory.js +210 -79
  143. package/dist/esm/generated/factories/P256SHA256Algorithm__factory.d.ts +3 -15
  144. package/dist/esm/generated/factories/P256SHA256Algorithm__factory.js +2 -25
  145. package/dist/esm/generated/factories/RSASHA1Algorithm__factory.d.ts +3 -15
  146. package/dist/esm/generated/factories/RSASHA1Algorithm__factory.js +2 -25
  147. package/dist/esm/generated/factories/RSASHA256Algorithm__factory.d.ts +3 -15
  148. package/dist/esm/generated/factories/RSASHA256Algorithm__factory.js +2 -25
  149. package/dist/esm/generated/factories/SHA1Digest__factory.d.ts +3 -15
  150. package/dist/esm/generated/factories/SHA1Digest__factory.js +2 -25
  151. package/dist/esm/generated/factories/SHA1NSEC3Digest__factory.d.ts +3 -15
  152. package/dist/esm/generated/factories/SHA1NSEC3Digest__factory.js +2 -25
  153. package/dist/esm/generated/factories/SHA256Digest__factory.d.ts +3 -15
  154. package/dist/esm/generated/factories/SHA256Digest__factory.js +2 -25
  155. package/dist/esm/generated/factories/TLDPublicSuffixList__factory.d.ts +3 -15
  156. package/dist/esm/generated/factories/TLDPublicSuffixList__factory.js +2 -25
  157. package/dist/esm/generated/factories/index.d.ts +14 -0
  158. package/dist/esm/generated/factories/index.js +14 -0
  159. package/dist/esm/generated/index.d.ts +29 -1
  160. package/dist/esm/generated/index.js +15 -1
  161. package/dist/esm/index.d.ts +24 -40
  162. package/dist/esm/index.js +9 -5
  163. package/dist/esm/utils/registerHelpers.d.ts +44 -16
  164. package/dist/esm/utils/registerHelpers.js +40 -14
  165. package/dist/esm/utils/wrapperExpiry.d.ts +5 -0
  166. package/dist/esm/utils/wrapperExpiry.js +26 -0
  167. package/dist/esm/utils/writeTx.d.ts +18 -1
  168. package/dist/esm/utils/writeTx.js +4 -1
  169. package/package.json +27 -28
  170. package/src/ABIs/Multicall.json +452 -0
  171. package/src/contracts/index.ts +1 -1
  172. package/src/functions/batch.test.ts +6 -6
  173. package/src/functions/batchWrappers.test.ts +5 -5
  174. package/src/functions/burnFuses.test.ts +5 -10
  175. package/src/functions/burnFuses.ts +1 -1
  176. package/src/functions/commitName.test.ts +61 -0
  177. package/src/functions/commitName.ts +36 -0
  178. package/src/functions/createSubname.test.ts +6 -10
  179. package/src/functions/createSubname.ts +14 -2
  180. package/src/functions/deleteSubname.test.ts +9 -28
  181. package/src/functions/deleteSubname.ts +3 -2
  182. package/src/functions/getDNSOwner.test.ts +1 -5
  183. package/src/functions/getExpiry.test.ts +26 -4
  184. package/src/functions/getExpiry.ts +87 -9
  185. package/src/functions/getFuses.test.ts +10 -33
  186. package/src/functions/getFuses.ts +10 -16
  187. package/src/functions/getHistory.test.ts +7 -79
  188. package/src/functions/getHistory.ts +2 -127
  189. package/src/functions/getName.test.ts +5 -5
  190. package/src/functions/getName.ts +1 -1
  191. package/src/functions/getNames.test.ts +97 -68
  192. package/src/functions/getOwner.test.ts +10 -25
  193. package/src/functions/getProfile.test.ts +32 -24
  194. package/src/functions/getProfile.ts +1 -1
  195. package/src/functions/getResolver.test.ts +2 -6
  196. package/src/functions/getSpecificRecord.test.ts +16 -13
  197. package/src/functions/getSpecificRecord.ts +10 -4
  198. package/src/functions/getSubnames.test.ts +21 -17
  199. package/src/functions/getSubnames.ts +9 -2
  200. package/src/functions/makeCommitment.test.ts +2 -2
  201. package/src/functions/registerName.test.ts +59 -0
  202. package/src/functions/registerName.ts +38 -0
  203. package/src/functions/renewName.test.ts +44 -0
  204. package/src/functions/renewName.ts +22 -0
  205. package/src/functions/setName.test.ts +10 -11
  206. package/src/functions/setRecord.test.ts +12 -9
  207. package/src/functions/setRecords.test.ts +6 -5
  208. package/src/functions/setResolver.test.ts +6 -9
  209. package/src/functions/transferName.test.ts +13 -27
  210. package/src/functions/transferSubname.test.ts +11 -30
  211. package/src/functions/transferSubname.ts +28 -10
  212. package/src/functions/unwrapName.test.ts +13 -28
  213. package/src/functions/wrapName.test.ts +109 -34
  214. package/src/functions/wrapName.ts +45 -29
  215. package/src/generated/BaseRegistrarImplementation.ts +382 -296
  216. package/src/generated/DNSRegistrar.ts +103 -89
  217. package/src/generated/DNSSECImpl.ts +180 -149
  218. package/src/generated/DefaultReverseResolver.ts +37 -21
  219. package/src/generated/ENSRegistry.ts +257 -184
  220. package/src/generated/ETHRegistrarController.ts +252 -191
  221. package/src/generated/Multicall.ts +73 -57
  222. package/src/generated/NameWrapper.ts +979 -649
  223. package/src/generated/P256SHA256Algorithm.ts +21 -16
  224. package/src/generated/PublicResolver.ts +452 -362
  225. package/src/generated/RSASHA1Algorithm.ts +21 -16
  226. package/src/generated/RSASHA256Algorithm.ts +21 -16
  227. package/src/generated/ReverseRegistrar.ts +193 -141
  228. package/src/generated/Root.ts +146 -86
  229. package/src/generated/SHA1Digest.ts +12 -11
  230. package/src/generated/SHA1NSEC3Digest.ts +21 -16
  231. package/src/generated/SHA256Digest.ts +12 -11
  232. package/src/generated/StaticMetadataService.ts +22 -6
  233. package/src/generated/TLDPublicSuffixList.ts +10 -6
  234. package/src/generated/UniversalResolver.ts +44 -40
  235. package/src/generated/common.ts +2 -0
  236. package/src/generated/factories/DNSRegistrar__factory.ts +4 -56
  237. package/src/generated/factories/DNSSECImpl__factory.ts +4 -49
  238. package/src/generated/factories/ETHRegistrarController__factory.ts +14 -4
  239. package/src/generated/factories/NameWrapper__factory.ts +210 -79
  240. package/src/generated/factories/P256SHA256Algorithm__factory.ts +4 -40
  241. package/src/generated/factories/RSASHA1Algorithm__factory.ts +4 -40
  242. package/src/generated/factories/RSASHA256Algorithm__factory.ts +4 -40
  243. package/src/generated/factories/SHA1Digest__factory.ts +4 -40
  244. package/src/generated/factories/SHA1NSEC3Digest__factory.ts +4 -40
  245. package/src/generated/factories/SHA256Digest__factory.ts +4 -40
  246. package/src/generated/factories/TLDPublicSuffixList__factory.ts +4 -40
  247. package/src/generated/factories/index.ts +14 -0
  248. package/src/generated/index.ts +29 -1
  249. package/src/index.ts +28 -26
  250. package/src/utils/registerHelpers.ts +107 -49
  251. package/src/utils/wrapperExpiry.ts +31 -0
  252. package/src/utils/writeTx.ts +12 -2
  253. package/dist/cjs/contracts/doNotCallOnChainUniversalResolverProxy.d.ts +0 -3
  254. package/dist/cjs/contracts/doNotCallOnChainUniversalResolverProxy.js +0 -4
  255. package/dist/cjs/generated/DoNotCallOnChainUniversalResolverProxy.d.ts +0 -144
  256. package/dist/cjs/generated/DoNotCallOnChainUniversalResolverProxy.js +0 -2
  257. package/dist/cjs/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.d.ts +0 -56
  258. package/dist/cjs/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.js +0 -171
  259. package/dist/esm/contracts/doNotCallOnChainUniversalResolverProxy.d.ts +0 -3
  260. package/dist/esm/contracts/doNotCallOnChainUniversalResolverProxy.js +0 -2
  261. package/dist/esm/generated/DoNotCallOnChainUniversalResolverProxy.d.ts +0 -144
  262. package/dist/esm/generated/DoNotCallOnChainUniversalResolverProxy.js +0 -1
  263. package/dist/esm/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.d.ts +0 -56
  264. package/dist/esm/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.js +0 -167
  265. package/src/ABIs/ETHRegistrarController.json +0 -494
  266. package/src/ABIs/NameWrapper.json +0 -1183
  267. package/src/ABIs/PublicResolver.json +0 -875
  268. package/src/ABIs/ReverseRegistrar.json +0 -323
  269. package/src/ABIs/StaticMetadataService.json +0 -32
  270. package/src/ABIs/UniversalResolver.json +0 -187
  271. package/src/contracts/doNotCallOnChainUniversalResolverProxy.ts +0 -5
  272. package/src/generated/DoNotCallOnChainUniversalResolverProxy.ts +0 -285
  273. package/src/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.ts +0 -186
  274. package/src/tests/populateTransaction.test.ts +0 -40
  275. package/src/tests/setup.ts +0 -53
  276. package/src/tests/signerInjection.test.ts +0 -46
  277. package/src/tests/withProvider.test.ts +0 -28
@@ -0,0 +1,36 @@
1
+ import { ENSArgs } from '..'
2
+ import { CommitmentParams, makeCommitment } from '../utils/registerHelpers'
3
+
4
+ type Params = Omit<CommitmentParams, 'resolver' | 'name'> & {
5
+ resolverAddress?: string
6
+ }
7
+
8
+ export default async function (
9
+ { contracts }: ENSArgs<'contracts'>,
10
+ name: string,
11
+ { resolverAddress, ...params }: Params,
12
+ ) {
13
+ const labels = name.split('.')
14
+ if (labels.length !== 2 || labels[1] !== 'eth')
15
+ throw new Error('Currently only .eth TLD registrations are supported')
16
+
17
+ const controller = await contracts!.getEthRegistrarController()
18
+ const resolver = await contracts!.getPublicResolver(
19
+ undefined,
20
+ resolverAddress,
21
+ )
22
+ const { secret, commitment, wrapperExpiry } = makeCommitment({
23
+ name,
24
+ resolver,
25
+ ...params,
26
+ })
27
+
28
+ return {
29
+ ...(await controller.populateTransaction.commit(commitment)),
30
+ customData: {
31
+ secret,
32
+ commitment,
33
+ wrapperExpiry,
34
+ },
35
+ }
36
+ }
@@ -23,33 +23,29 @@ describe('createSubname', () => {
23
23
  await revert()
24
24
  })
25
25
  it('should allow creating a subname on the registry', async () => {
26
- const tx = await ENSInstance.createSubname('test.parthtejpal.eth', {
26
+ const tx = await ENSInstance.createSubname('test.test123.eth', {
27
27
  contract: 'registry',
28
28
  owner: accounts[0],
29
- addressOrIndex: 0,
29
+ addressOrIndex: 1,
30
30
  })
31
31
  expect(tx).toBeTruthy()
32
32
  await tx.wait()
33
33
 
34
34
  const registry = await ENSInstance.contracts!.getRegistry()!
35
- const result = await registry.owner(namehash('test.parthtejpal.eth'))
35
+ const result = await registry.owner(namehash('test.test123.eth'))
36
36
  expect(result).toBe(accounts[0])
37
37
  })
38
38
  it('should allow creating a subname on the namewrapper', async () => {
39
- const wrapNameTx = await ENSInstance.wrapName('parthtejpal.eth', {
40
- wrappedOwner: accounts[0],
41
- })
42
- await wrapNameTx.wait()
43
- const tx = await ENSInstance.createSubname('test.parthtejpal.eth', {
39
+ const tx = await ENSInstance.createSubname('test.wrapped.eth', {
44
40
  contract: 'nameWrapper',
45
41
  owner: accounts[0],
46
- addressOrIndex: 0,
42
+ addressOrIndex: 1,
47
43
  })
48
44
  expect(tx).toBeTruthy()
49
45
  await tx.wait()
50
46
 
51
47
  const nameWrapper = await ENSInstance.contracts!.getNameWrapper()!
52
- const result = await nameWrapper.ownerOf(namehash('test.parthtejpal.eth'))
48
+ const result = await nameWrapper.ownerOf(namehash('test.wrapped.eth'))
53
49
  expect(result).toBe(accounts[0])
54
50
  })
55
51
  })
@@ -1,8 +1,9 @@
1
- import { ethers } from 'ethers'
1
+ import { BigNumber, ethers } from 'ethers'
2
2
  import { ENSArgs } from '..'
3
3
  import { FuseOptions } from '../@types/FuseOptions'
4
4
  import generateFuseInput from '../utils/generateFuseInput'
5
5
  import { namehash } from '../utils/normalise'
6
+ import { Expiry, makeExpiry } from '../utils/wrapperExpiry'
6
7
 
7
8
  type BaseArgs = {
8
9
  owner: string
@@ -13,12 +14,17 @@ type BaseArgs = {
13
14
  type NameWrapperArgs = {
14
15
  contract: 'nameWrapper'
15
16
  fuses?: FuseOptions
17
+ expiry?: Expiry
16
18
  } & BaseArgs
17
19
 
18
20
  type Args = BaseArgs | NameWrapperArgs
19
21
 
20
22
  export default async function (
21
- { contracts, signer }: ENSArgs<'contracts' | 'signer'>,
23
+ {
24
+ contracts,
25
+ signer,
26
+ getExpiry,
27
+ }: ENSArgs<'contracts' | 'signer' | 'getExpiry'>,
22
28
  name: string,
23
29
  { owner, resolverAddress, contract, ...wrapperArgs }: Args,
24
30
  ) {
@@ -54,6 +60,11 @@ export default async function (
54
60
  }
55
61
  case 'nameWrapper': {
56
62
  const nameWrapper = (await contracts?.getNameWrapper()!).connect(signer)
63
+ const expiry: BigNumber = await makeExpiry(
64
+ { getExpiry },
65
+ name,
66
+ 'expiry' in wrapperArgs ? wrapperArgs.expiry : undefined,
67
+ )
57
68
 
58
69
  const generatedFuses =
59
70
  'fuses' in wrapperArgs && wrapperArgs.fuses
@@ -67,6 +78,7 @@ export default async function (
67
78
  resolverAddress,
68
79
  0,
69
80
  generatedFuses,
81
+ expiry,
70
82
  )
71
83
  }
72
84
  default: {
@@ -22,51 +22,32 @@ describe('deleteSubname', () => {
22
22
  await revert()
23
23
  })
24
24
  it('should allow deleting a subname on the registry', async () => {
25
- const createSubnameTx = await ENSInstance.createSubname(
26
- 'test.parthtejpal.eth',
27
- {
28
- contract: 'registry',
29
- owner: accounts[0],
30
- addressOrIndex: 0,
31
- },
32
- )
33
- await createSubnameTx.wait()
34
-
35
- const tx = await ENSInstance.deleteSubname('test.parthtejpal.eth', {
25
+ const tx = await ENSInstance.deleteSubname('test.with-subnames.eth', {
36
26
  contract: 'registry',
37
- addressOrIndex: 0,
27
+ addressOrIndex: 1,
38
28
  })
39
29
  expect(tx).toBeTruthy()
40
30
  await tx.wait()
41
31
 
42
32
  const registry = await ENSInstance.contracts!.getRegistry()!
43
- const result = await registry.owner(namehash('test.parthtejpal.eth'))
33
+ const result = await registry.owner(namehash('test.with-subnames.eth'))
44
34
  expect(result).toBe('0x0000000000000000000000000000000000000000')
45
35
  })
46
36
  it('should allow deleting a subname on the nameWrapper', async () => {
47
- const wrapNameTx = await ENSInstance.wrapName('parthtejpal.eth', {
48
- wrappedOwner: accounts[0],
49
- })
50
- await wrapNameTx.wait()
51
- const createSubnameTx = await ENSInstance.createSubname(
52
- 'test.parthtejpal.eth',
37
+ const tx = await ENSInstance.deleteSubname(
38
+ 'test.wrapped-with-subnames.eth',
53
39
  {
54
40
  contract: 'nameWrapper',
55
- owner: accounts[0],
56
- addressOrIndex: 0,
41
+ addressOrIndex: 1,
57
42
  },
58
43
  )
59
- await createSubnameTx.wait()
60
-
61
- const tx = await ENSInstance.deleteSubname('test.parthtejpal.eth', {
62
- contract: 'nameWrapper',
63
- addressOrIndex: 0,
64
- })
65
44
  expect(tx).toBeTruthy()
66
45
  await tx.wait()
67
46
 
68
47
  const nameWrapper = await ENSInstance.contracts!.getNameWrapper()!
69
- const result = await nameWrapper.ownerOf(namehash('test.parthtejpal.eth'))
48
+ const result = await nameWrapper.ownerOf(
49
+ namehash('test.wrapped-with-subnames.eth'),
50
+ )
70
51
  expect(result).toBe('0x0000000000000000000000000000000000000000')
71
52
  })
72
53
  })
@@ -1,7 +1,7 @@
1
1
  import { ENSArgs } from '..'
2
2
 
3
3
  export default async function (
4
- { transferSubname }: ENSArgs<'transferSubname'>,
4
+ { transferSubname, signer }: ENSArgs<'transferSubname' | 'signer'>,
5
5
  name: string,
6
6
  {
7
7
  contract,
@@ -11,6 +11,7 @@ export default async function (
11
11
  ) {
12
12
  return transferSubname.populateTransaction(name, {
13
13
  contract,
14
- address: '0x0000000000000000000000000000000000000000',
14
+ owner: '0x0000000000000000000000000000000000000000',
15
+ signer,
15
16
  })
16
17
  }
@@ -1,7 +1,5 @@
1
- import * as packet from 'dns-packet'
2
- import fetch from 'node-fetch'
3
1
  import nock from 'nock'
4
-
2
+ import fetch from 'node-fetch'
5
3
  import getDNSOwner, { encodeURLParams } from './getDNSOwner'
6
4
 
7
5
  function hex_decode(string: string) {
@@ -39,7 +37,6 @@ describe('getDNSOwner', () => {
39
37
  })
40
38
  .get('/dns-query')
41
39
  .query((queryObject) => {
42
- console.log('queryObject: ', queryObject)
43
40
  return (
44
41
  queryObject.ct === 'application/dns-udpwireformat' &&
45
42
  queryObject.dns ===
@@ -82,7 +79,6 @@ describe('getDNSOwner', () => {
82
79
  })
83
80
  .get('/dns-query')
84
81
  .query((queryObject) => {
85
- console.log('queryObject: ', queryObject)
86
82
  return (
87
83
  queryObject.ct === 'application/dns-udpwireformat' &&
88
84
  queryObject.dns ===
@@ -17,8 +17,8 @@ afterAll(async () => {
17
17
  })
18
18
 
19
19
  describe('getExpiry', () => {
20
- it('should get the expiry for a name', async () => {
21
- const result = await ENSInstance.getExpiry('jefflau.eth')
20
+ it('should get the expiry for a .eth name with no other args', async () => {
21
+ const result = await ENSInstance.getExpiry('with-profile.eth')
22
22
  expect(result).toBeTruthy()
23
23
  if (result) {
24
24
  const { expiry, gracePeriod } = result
@@ -26,9 +26,31 @@ describe('getExpiry', () => {
26
26
  expect(gracePeriod).toBe(7776000000)
27
27
  }
28
28
  })
29
- it('should throw an error for a non .eth name', async () => {
29
+ it('should get the expiry for a wrapped name', async () => {
30
+ const result = await ENSInstance.getExpiry('wrapped.eth', {
31
+ contract: 'nameWrapper',
32
+ })
33
+
34
+ expect(result).toBeTruthy()
35
+ if (result) {
36
+ const { expiry, gracePeriod } = result
37
+ expect(expiry).toBeInstanceOf(Date)
38
+ expect(gracePeriod).toBe(null)
39
+ }
40
+ })
41
+ it('should throw an error for a non .eth name if not wrapped', async () => {
42
+ try {
43
+ await ENSInstance.getExpiry('sub.with-profile.eth')
44
+ expect(false).toBeTruthy()
45
+ } catch {
46
+ expect(true).toBeTruthy()
47
+ }
48
+ })
49
+ it('should throw an error for a non .eth name if registrar is specified', async () => {
30
50
  try {
31
- await ENSInstance.getExpiry('sub.jefflau.eth')
51
+ await ENSInstance.getExpiry('sub.with-profile.eth', {
52
+ contract: 'registrar',
53
+ })
32
54
  expect(false).toBeTruthy()
33
55
  } catch {
34
56
  expect(true).toBeTruthy()
@@ -1,19 +1,24 @@
1
1
  import { BigNumber } from 'ethers'
2
2
  import { solidityKeccak256 } from 'ethers/lib/utils'
3
3
  import { ENSArgs } from '..'
4
+ import { namehash } from '../utils/normalise'
4
5
 
5
- const raw = async (
6
- { contracts, multicallWrapper }: ENSArgs<'contracts' | 'multicallWrapper'>,
7
- name: string,
8
- ) => {
9
- const baseRegistrar = await contracts?.getBaseRegistrar()!
6
+ type ContractOption = 'registrar' | 'nameWrapper'
10
7
 
11
- const labels = name.split('.')
8
+ type Args = {
9
+ contract?: ContractOption
10
+ }
12
11
 
12
+ const getRegistrarExpiry = async (
13
+ { contracts, multicallWrapper }: ENSArgs<'contracts' | 'multicallWrapper'>,
14
+ labels: string[],
15
+ ) => {
13
16
  if (labels.length > 2 || labels[1] !== 'eth') {
14
- throw new Error('Only .eth names have expiry dates')
17
+ throw new Error('Only .eth names have expiry dates on the registrar')
15
18
  }
16
19
 
20
+ const baseRegistrar = await contracts?.getBaseRegistrar()!
21
+
17
22
  const expiryCall = baseRegistrar.interface.encodeFunctionData('nameExpires', [
18
23
  solidityKeccak256(['string'], [labels[0]]),
19
24
  ])
@@ -32,11 +37,49 @@ const raw = async (
32
37
  ])
33
38
  }
34
39
 
35
- const decode = async (
40
+ const getWrapperExpiry = async (
41
+ { contracts }: ENSArgs<'contracts'>,
42
+ labels: string[],
43
+ ) => {
44
+ const nameWrapper = await contracts?.getNameWrapper()!
45
+ const expiryCall = nameWrapper.interface.encodeFunctionData('getData', [
46
+ namehash(labels.join('.')),
47
+ ])
48
+ return {
49
+ to: nameWrapper.address,
50
+ data: expiryCall,
51
+ }
52
+ }
53
+
54
+ const getContractToUse = (
55
+ contract: ContractOption | undefined,
56
+ labels: string[],
57
+ ) => {
58
+ if (contract) return contract
59
+ if (labels.length === 2 && labels[1] === 'eth') {
60
+ return 'registrar'
61
+ }
62
+ return 'nameWrapper'
63
+ }
64
+
65
+ const raw = async (
66
+ ensArgs: ENSArgs<'contracts' | 'multicallWrapper'>,
67
+ name: string,
68
+ { contract }: Args = {},
69
+ ) => {
70
+ const labels = name.split('.')
71
+
72
+ const contractToUse = getContractToUse(contract, labels)
73
+
74
+ return contractToUse === 'nameWrapper'
75
+ ? getWrapperExpiry(ensArgs, labels)
76
+ : getRegistrarExpiry(ensArgs, labels)
77
+ }
78
+
79
+ const decodeRegistrarExpiry = async (
36
80
  { contracts, multicallWrapper }: ENSArgs<'contracts' | 'multicallWrapper'>,
37
81
  data: string,
38
82
  ) => {
39
- if (data === null) return
40
83
  const result = await multicallWrapper.decode(data)
41
84
  const baseRegistrar = await contracts?.getBaseRegistrar()!
42
85
  try {
@@ -57,6 +100,41 @@ const decode = async (
57
100
  }
58
101
  }
59
102
 
103
+ const decodeWrapperExpiry = async (
104
+ { contracts }: ENSArgs<'contracts'>,
105
+ data: string,
106
+ ) => {
107
+ const nameWrapper = await contracts?.getNameWrapper()!
108
+ try {
109
+ const [_owner, _fuses, expiry] = nameWrapper.interface.decodeFunctionResult(
110
+ 'getData',
111
+ data,
112
+ )
113
+ return {
114
+ expiry: new Date(expiry * 1000),
115
+ gracePeriod: null,
116
+ }
117
+ } catch {
118
+ return
119
+ }
120
+ }
121
+
122
+ const decode = async (
123
+ ensArgs: ENSArgs<'contracts' | 'multicallWrapper'>,
124
+ data: string,
125
+ name: string,
126
+ { contract }: Args = {},
127
+ ) => {
128
+ if (data === null) return
129
+
130
+ const labels = name.split('.')
131
+ const contractToUse = getContractToUse(contract, labels)
132
+
133
+ return contractToUse === 'nameWrapper'
134
+ ? decodeWrapperExpiry(ensArgs, data)
135
+ : decodeRegistrarExpiry(ensArgs, data)
136
+ }
137
+
60
138
  export default {
61
139
  raw,
62
140
  decode,
@@ -12,10 +12,6 @@ let withWrappedSnapshot: any
12
12
  beforeAll(async () => {
13
13
  ;({ ENSInstance, revert, provider, createSnapshot } = await setup())
14
14
  accounts = await provider.listAccounts()
15
- const tx = await ENSInstance.wrapName('parthtejpal.eth', {
16
- wrappedOwner: accounts[0],
17
- })
18
- await tx.wait()
19
15
 
20
16
  withWrappedSnapshot = await createSnapshot()
21
17
  })
@@ -31,18 +27,12 @@ afterAll(async () => {
31
27
 
32
28
  describe('getFuses', () => {
33
29
  it('should return null for an unwrapped name', async () => {
34
- const result = await ENSInstance.getFuses('jefflau.eth')
30
+ const result = await ENSInstance.getFuses('with-profile.eth')
35
31
  expect(result).toBeUndefined()
36
32
  })
37
33
  it('should return with canDoEverything set to true for a name with no fuses burned', async () => {
38
- const tx = await ENSInstance.createSubname('test.parthtejpal.eth', {
39
- contract: 'nameWrapper',
40
- owner: accounts[0],
41
- addressOrIndex: 0,
42
- })
43
- await tx.wait()
44
-
45
- const result = await ENSInstance.getFuses('test.parthtejpal.eth')
34
+ const nameWrapper = await ENSInstance.contracts!.getNameWrapper()!
35
+ const result = await ENSInstance.getFuses('test.wrapped-with-subnames.eth')
46
36
  expect(result).toBeTruthy()
47
37
  if (result) {
48
38
  expect(result.fuseObj.canDoEverything).toBe(true)
@@ -56,15 +46,17 @@ describe('getFuses', () => {
56
46
  }
57
47
  })
58
48
  it('should return with other correct fuses', async () => {
59
- const tx = await ENSInstance.burnFuses('parthtejpal.eth', {
49
+ const tx = await ENSInstance.burnFuses('wrapped.eth', {
60
50
  fusesToBurn: {
61
51
  cannotUnwrap: true,
62
52
  cannotSetTtl: true,
63
53
  cannotCreateSubdomain: true,
64
54
  },
55
+ addressOrIndex: 1,
65
56
  })
66
57
  await tx.wait()
67
- const result = await ENSInstance.getFuses('parthtejpal.eth')
58
+
59
+ const result = await ENSInstance.getFuses('wrapped.eth')
68
60
  expect(result).toBeTruthy()
69
61
  if (result) {
70
62
  expect(result.fuseObj).toMatchObject({
@@ -80,26 +72,11 @@ describe('getFuses', () => {
80
72
  expect(result.rawFuses.toHexString()).toBe('0x71')
81
73
  }
82
74
  })
83
- it('should return correct vulnerability data for an invulnerable node', async () => {
84
- const result = await ENSInstance.getFuses('parthtejpal.eth')
85
- expect(result).toBeTruthy()
86
- if (result) {
87
- expect(result.vulnerability).toBe('Safe')
88
- expect(result.vulnerableNode).toBeNull()
89
- }
90
- })
91
- it('should return correct vulnerability data for a vulnerable node', async () => {
92
- const tx = await ENSInstance.createSubname('test.parthtejpal.eth', {
93
- owner: accounts[0],
94
- contract: 'nameWrapper',
95
- })
96
- await tx.wait()
97
-
98
- const result = await ENSInstance.getFuses('test.parthtejpal.eth')
75
+ it('should return correct expiry', async () => {
76
+ const result = await ENSInstance.getFuses('wrapped.eth')
99
77
  expect(result).toBeTruthy()
100
78
  if (result) {
101
- expect(result.vulnerability).toBe('SubdomainReplacementAllowed')
102
- expect(result.vulnerableNode).toBe('parthtejpal.eth')
79
+ expect(result.expiryDate).toBeInstanceOf(Date)
103
80
  }
104
81
  })
105
82
  })
@@ -1,4 +1,4 @@
1
- import { BigNumber, utils } from 'ethers'
1
+ import { BigNumber } from 'ethers'
2
2
  import { ENSArgs } from '..'
3
3
  import { testable as fuseEnums } from '../utils/fuses'
4
4
  import { namehash } from '../utils/normalise'
@@ -28,8 +28,12 @@ const decode = async (
28
28
  ) => {
29
29
  const nameWrapper = await contracts?.getNameWrapper()!
30
30
  try {
31
- const [fuses, vulnerability, vulnerableNode] =
32
- nameWrapper.interface.decodeFunctionResult('getFuses', data)
31
+ const [_fuses, expiry] = nameWrapper.interface.decodeFunctionResult(
32
+ 'getFuses',
33
+ data,
34
+ )
35
+
36
+ const fuses = BigNumber.from(_fuses)
33
37
 
34
38
  const fuseObj = Object.fromEntries(
35
39
  Object.keys(fuseEnums).map((fuseEnum) => [
@@ -48,22 +52,12 @@ const decode = async (
48
52
  fuseObj.canDoEverything = false
49
53
  }
50
54
 
51
- let returnVulnerableNode: string | null = null
52
- if (utils.hexStripZeros(vulnerableNode) !== '0x') {
53
- name.split('.').forEach((label, index, arr) => {
54
- const node = arr.slice(index).join('.')
55
- const nodehash = namehash(node)
56
- if (nodehash === vulnerableNode) {
57
- returnVulnerableNode = node
58
- }
59
- })
60
- }
55
+ const expiryDate = new Date(expiry * 1000)
61
56
 
62
57
  return {
63
58
  fuseObj,
64
- vulnerability: NameSafety[vulnerability] || vulnerability,
65
- vulnerableNode: returnVulnerableNode,
66
- rawFuses: fuses as BigNumber,
59
+ expiryDate,
60
+ rawFuses: fuses,
67
61
  }
68
62
  } catch {
69
63
  return
@@ -2,21 +2,23 @@ import { ENS } from '..'
2
2
  import setup from '../tests/setup'
3
3
 
4
4
  let ENSInstance: ENS
5
+ let revert: Awaited<ReturnType<typeof setup>>['revert']
5
6
 
6
7
  beforeAll(async () => {
7
- ;({ ENSInstance } = await setup())
8
- jest.setTimeout(20000)
8
+ ;({ ENSInstance, revert } = await setup())
9
9
  })
10
10
 
11
- describe('getHistory', () => {
12
- let textEventsWithValue: any[]
11
+ afterAll(async () => {
12
+ await revert()
13
+ })
13
14
 
15
+ describe('getHistory', () => {
14
16
  it('should return null for a non-existent name', async () => {
15
17
  const result = await ENSInstance.getHistory('test123123cool.eth')
16
18
  expect(result).toBeUndefined()
17
19
  })
18
20
  it('should return the history of a name', async () => {
19
- const result = await ENSInstance.getHistory('jefflau.eth')
21
+ const result = await ENSInstance.getHistory('with-profile.eth')
20
22
  expect(result).toBeTruthy()
21
23
  if (result) {
22
24
  expect(result).toHaveProperty('domain')
@@ -24,78 +26,4 @@ describe('getHistory', () => {
24
26
  expect(result).toHaveProperty('registration')
25
27
  }
26
28
  })
27
- describe('getHistoryWithDetail', () => {
28
- it('should return null for a non-existent name', async () => {
29
- const result = await ENSInstance.getHistoryWithDetail(
30
- 'test123123cool.eth',
31
- )
32
- expect(result).toBeUndefined()
33
- })
34
- it('should return the history of a name with TextChanged event detail', async () => {
35
- const result = await ENSInstance.getHistoryWithDetail('jefflau.eth')
36
- expect(result).toBeTruthy()
37
- if (result) {
38
- const textEvents = result.resolver.filter(
39
- (x) => x.type === 'TextChanged',
40
- )
41
- textEvents.forEach((event) =>
42
- expect(event.data).toHaveProperty('value'),
43
- )
44
- textEventsWithValue = textEvents
45
- }
46
- })
47
- })
48
- describe('getHistoryDetailForTransactionHash', () => {
49
- it('should throw an error for an invalid transaction hash', async () => {
50
- try {
51
- await ENSInstance.getHistoryDetailForTransactionHash('0x234')
52
- expect(false).toBeTruthy()
53
- } catch (error) {
54
- expect((error as any).message).toContain('invalid hash')
55
- }
56
- })
57
- it('should return null for a transaction hash with no text events', async () => {
58
- const result = await ENSInstance.getHistoryDetailForTransactionHash(
59
- '0x0fd7b555e3076ef38dbbe2e40deefe44c9a0530d43f6b3f60dbed4ba49d229b7',
60
- )
61
- expect(result).toBeUndefined()
62
- })
63
- it('should return single item for a given transaction hash with one event', async () => {
64
- const eventToUse = textEventsWithValue[0]
65
- const result = (await ENSInstance.getHistoryDetailForTransactionHash(
66
- eventToUse.transactionHash,
67
- )) as { key: any; value: any }[]
68
- expect(result).toHaveLength(1)
69
- if (result) {
70
- expect(result[0]).toMatchObject(eventToUse.data)
71
- }
72
- })
73
- it('should return multiple items for a given transaction hash with multiple events', async () => {
74
- const hash =
75
- '0x002b7cc3c85168d885a38226a28fac349d13cbaff7f3db4fa3af31f22b863079'
76
- const dataArr = [
77
- { key: 'description', value: 'Not so super description' },
78
- { key: 'url', value: 'facebook.com' },
79
- ]
80
- const result = (await ENSInstance.getHistoryDetailForTransactionHash(
81
- hash,
82
- )) as { key: any; value: any }[]
83
- expect(result).toHaveLength(dataArr.length)
84
- if (result) {
85
- result.forEach((item, index) =>
86
- expect(item).toMatchObject(dataArr[index]),
87
- )
88
- }
89
- })
90
- it('should return a single item when an index is specified for a hash', async () => {
91
- const hash =
92
- '0x002b7cc3c85168d885a38226a28fac349d13cbaff7f3db4fa3af31f22b863079'
93
- const data = { key: 'url', value: 'facebook.com' }
94
- const result = (await ENSInstance.getHistoryDetailForTransactionHash(
95
- hash,
96
- 1,
97
- )) as { key: any; value: any }
98
- expect(result).toMatchObject(data)
99
- })
100
- })
101
29
  })