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

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 (234) 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/createSubname.d.ts +3 -1
  7. package/dist/cjs/functions/createSubname.js +4 -2
  8. package/dist/cjs/functions/deleteSubname.d.ts +1 -1
  9. package/dist/cjs/functions/deleteSubname.js +3 -2
  10. package/dist/cjs/functions/getExpiry.d.ts +9 -2
  11. package/dist/cjs/functions/getExpiry.js +52 -7
  12. package/dist/cjs/functions/getFuses.d.ts +2 -3
  13. package/dist/cjs/functions/getFuses.js +4 -13
  14. package/dist/cjs/functions/getSpecificRecord.js +8 -1
  15. package/dist/cjs/functions/getSubnames.d.ts +1 -1
  16. package/dist/cjs/functions/getSubnames.js +1 -1
  17. package/dist/cjs/functions/transferSubname.d.ts +12 -3
  18. package/dist/cjs/functions/transferSubname.js +5 -3
  19. package/dist/cjs/functions/wrapName.d.ts +3 -1
  20. package/dist/cjs/functions/wrapName.js +35 -29
  21. package/dist/cjs/generated/BaseRegistrarImplementation.d.ts +222 -201
  22. package/dist/cjs/generated/DNSRegistrar.d.ts +68 -64
  23. package/dist/cjs/generated/DNSSECImpl.d.ts +111 -111
  24. package/dist/cjs/generated/DefaultReverseResolver.d.ts +17 -17
  25. package/dist/cjs/generated/ENSRegistry.d.ts +126 -111
  26. package/dist/cjs/generated/ETHRegistrarController.d.ts +111 -109
  27. package/dist/cjs/generated/Multicall.d.ts +60 -60
  28. package/dist/cjs/generated/NameWrapper.d.ts +493 -354
  29. package/dist/cjs/generated/P256SHA256Algorithm.d.ts +11 -7
  30. package/dist/cjs/generated/PublicResolver.d.ts +259 -235
  31. package/dist/cjs/generated/RSASHA1Algorithm.d.ts +11 -7
  32. package/dist/cjs/generated/RSASHA256Algorithm.d.ts +11 -7
  33. package/dist/cjs/generated/ReverseRegistrar.d.ts +112 -103
  34. package/dist/cjs/generated/Root.d.ts +77 -77
  35. package/dist/cjs/generated/SHA1Digest.d.ts +7 -7
  36. package/dist/cjs/generated/SHA1NSEC3Digest.d.ts +11 -7
  37. package/dist/cjs/generated/SHA256Digest.d.ts +7 -7
  38. package/dist/cjs/generated/StaticMetadataService.d.ts +7 -7
  39. package/dist/cjs/generated/TLDPublicSuffixList.d.ts +7 -7
  40. package/dist/cjs/generated/UniversalResolver.d.ts +31 -31
  41. package/dist/cjs/generated/common.d.ts +1 -0
  42. package/dist/cjs/generated/factories/DNSRegistrar__factory.d.ts +3 -15
  43. package/dist/cjs/generated/factories/DNSRegistrar__factory.js +3 -26
  44. package/dist/cjs/generated/factories/DNSSECImpl__factory.d.ts +3 -15
  45. package/dist/cjs/generated/factories/DNSSECImpl__factory.js +3 -26
  46. package/dist/cjs/generated/factories/ETHRegistrarController__factory.js +14 -4
  47. package/dist/cjs/generated/factories/NameWrapper__factory.js +210 -79
  48. package/dist/cjs/generated/factories/P256SHA256Algorithm__factory.d.ts +3 -15
  49. package/dist/cjs/generated/factories/P256SHA256Algorithm__factory.js +3 -26
  50. package/dist/cjs/generated/factories/RSASHA1Algorithm__factory.d.ts +3 -15
  51. package/dist/cjs/generated/factories/RSASHA1Algorithm__factory.js +3 -26
  52. package/dist/cjs/generated/factories/RSASHA256Algorithm__factory.d.ts +3 -15
  53. package/dist/cjs/generated/factories/RSASHA256Algorithm__factory.js +3 -26
  54. package/dist/cjs/generated/factories/SHA1Digest__factory.d.ts +3 -15
  55. package/dist/cjs/generated/factories/SHA1Digest__factory.js +3 -26
  56. package/dist/cjs/generated/factories/SHA1NSEC3Digest__factory.d.ts +3 -15
  57. package/dist/cjs/generated/factories/SHA1NSEC3Digest__factory.js +3 -26
  58. package/dist/cjs/generated/factories/SHA256Digest__factory.d.ts +3 -15
  59. package/dist/cjs/generated/factories/SHA256Digest__factory.js +3 -26
  60. package/dist/cjs/generated/factories/TLDPublicSuffixList__factory.d.ts +3 -15
  61. package/dist/cjs/generated/factories/TLDPublicSuffixList__factory.js +3 -26
  62. package/dist/cjs/generated/factories/index.d.ts +14 -0
  63. package/dist/cjs/generated/factories/index.js +29 -1
  64. package/dist/cjs/generated/index.d.ts +29 -1
  65. package/dist/cjs/generated/index.js +31 -3
  66. package/dist/cjs/index.d.ts +12 -6
  67. package/dist/cjs/index.js +3 -2
  68. package/dist/cjs/utils/wrapperExpiry.d.ts +5 -0
  69. package/dist/cjs/utils/wrapperExpiry.js +30 -0
  70. package/dist/esm/contracts/baseRegistrar.d.ts +1 -1
  71. package/dist/esm/contracts/index.d.ts +3 -3
  72. package/dist/esm/contracts/multicall.d.ts +1 -1
  73. package/dist/esm/contracts/registry.d.ts +1 -1
  74. package/dist/esm/functions/burnFuses.js +1 -1
  75. package/dist/esm/functions/createSubname.d.ts +3 -1
  76. package/dist/esm/functions/createSubname.js +4 -2
  77. package/dist/esm/functions/deleteSubname.d.ts +1 -1
  78. package/dist/esm/functions/deleteSubname.js +3 -2
  79. package/dist/esm/functions/getExpiry.d.ts +9 -2
  80. package/dist/esm/functions/getExpiry.js +52 -7
  81. package/dist/esm/functions/getFuses.d.ts +2 -3
  82. package/dist/esm/functions/getFuses.js +5 -14
  83. package/dist/esm/functions/getSpecificRecord.js +8 -1
  84. package/dist/esm/functions/getSubnames.d.ts +1 -1
  85. package/dist/esm/functions/getSubnames.js +1 -1
  86. package/dist/esm/functions/transferSubname.d.ts +12 -3
  87. package/dist/esm/functions/transferSubname.js +5 -3
  88. package/dist/esm/functions/wrapName.d.ts +3 -1
  89. package/dist/esm/functions/wrapName.js +35 -29
  90. package/dist/esm/generated/BaseRegistrarImplementation.d.ts +222 -201
  91. package/dist/esm/generated/DNSRegistrar.d.ts +68 -64
  92. package/dist/esm/generated/DNSSECImpl.d.ts +111 -111
  93. package/dist/esm/generated/DefaultReverseResolver.d.ts +17 -17
  94. package/dist/esm/generated/ENSRegistry.d.ts +126 -111
  95. package/dist/esm/generated/ETHRegistrarController.d.ts +111 -109
  96. package/dist/esm/generated/Multicall.d.ts +60 -60
  97. package/dist/esm/generated/NameWrapper.d.ts +493 -354
  98. package/dist/esm/generated/P256SHA256Algorithm.d.ts +11 -7
  99. package/dist/esm/generated/PublicResolver.d.ts +259 -235
  100. package/dist/esm/generated/RSASHA1Algorithm.d.ts +11 -7
  101. package/dist/esm/generated/RSASHA256Algorithm.d.ts +11 -7
  102. package/dist/esm/generated/ReverseRegistrar.d.ts +112 -103
  103. package/dist/esm/generated/Root.d.ts +77 -77
  104. package/dist/esm/generated/SHA1Digest.d.ts +7 -7
  105. package/dist/esm/generated/SHA1NSEC3Digest.d.ts +11 -7
  106. package/dist/esm/generated/SHA256Digest.d.ts +7 -7
  107. package/dist/esm/generated/StaticMetadataService.d.ts +7 -7
  108. package/dist/esm/generated/TLDPublicSuffixList.d.ts +7 -7
  109. package/dist/esm/generated/UniversalResolver.d.ts +31 -31
  110. package/dist/esm/generated/common.d.ts +1 -0
  111. package/dist/esm/generated/factories/DNSRegistrar__factory.d.ts +3 -15
  112. package/dist/esm/generated/factories/DNSRegistrar__factory.js +2 -25
  113. package/dist/esm/generated/factories/DNSSECImpl__factory.d.ts +3 -15
  114. package/dist/esm/generated/factories/DNSSECImpl__factory.js +2 -25
  115. package/dist/esm/generated/factories/ETHRegistrarController__factory.js +14 -4
  116. package/dist/esm/generated/factories/NameWrapper__factory.js +210 -79
  117. package/dist/esm/generated/factories/P256SHA256Algorithm__factory.d.ts +3 -15
  118. package/dist/esm/generated/factories/P256SHA256Algorithm__factory.js +2 -25
  119. package/dist/esm/generated/factories/RSASHA1Algorithm__factory.d.ts +3 -15
  120. package/dist/esm/generated/factories/RSASHA1Algorithm__factory.js +2 -25
  121. package/dist/esm/generated/factories/RSASHA256Algorithm__factory.d.ts +3 -15
  122. package/dist/esm/generated/factories/RSASHA256Algorithm__factory.js +2 -25
  123. package/dist/esm/generated/factories/SHA1Digest__factory.d.ts +3 -15
  124. package/dist/esm/generated/factories/SHA1Digest__factory.js +2 -25
  125. package/dist/esm/generated/factories/SHA1NSEC3Digest__factory.d.ts +3 -15
  126. package/dist/esm/generated/factories/SHA1NSEC3Digest__factory.js +2 -25
  127. package/dist/esm/generated/factories/SHA256Digest__factory.d.ts +3 -15
  128. package/dist/esm/generated/factories/SHA256Digest__factory.js +2 -25
  129. package/dist/esm/generated/factories/TLDPublicSuffixList__factory.d.ts +3 -15
  130. package/dist/esm/generated/factories/TLDPublicSuffixList__factory.js +2 -25
  131. package/dist/esm/generated/factories/index.d.ts +14 -0
  132. package/dist/esm/generated/factories/index.js +14 -0
  133. package/dist/esm/generated/index.d.ts +29 -1
  134. package/dist/esm/generated/index.js +15 -1
  135. package/dist/esm/index.d.ts +12 -6
  136. package/dist/esm/index.js +3 -2
  137. package/dist/esm/utils/wrapperExpiry.d.ts +5 -0
  138. package/dist/esm/utils/wrapperExpiry.js +26 -0
  139. package/package.json +12 -10
  140. package/src/ABIs/Multicall.json +452 -0
  141. package/src/contracts/index.ts +1 -1
  142. package/src/functions/batch.test.ts +6 -6
  143. package/src/functions/batchWrappers.test.ts +5 -5
  144. package/src/functions/burnFuses.test.ts +5 -10
  145. package/src/functions/burnFuses.ts +1 -1
  146. package/src/functions/createSubname.test.ts +6 -10
  147. package/src/functions/createSubname.ts +14 -2
  148. package/src/functions/deleteSubname.test.ts +9 -28
  149. package/src/functions/deleteSubname.ts +3 -2
  150. package/src/functions/getDNSOwner.test.ts +1 -5
  151. package/src/functions/getExpiry.test.ts +26 -4
  152. package/src/functions/getExpiry.ts +87 -9
  153. package/src/functions/getFuses.test.ts +10 -33
  154. package/src/functions/getFuses.ts +10 -16
  155. package/src/functions/getHistory.test.ts +23 -11
  156. package/src/functions/getName.test.ts +4 -4
  157. package/src/functions/getNames.test.ts +97 -68
  158. package/src/functions/getOwner.test.ts +10 -25
  159. package/src/functions/getProfile.test.ts +32 -24
  160. package/src/functions/getResolver.test.ts +2 -6
  161. package/src/functions/getSpecificRecord.test.ts +16 -13
  162. package/src/functions/getSpecificRecord.ts +10 -4
  163. package/src/functions/getSubnames.test.ts +21 -17
  164. package/src/functions/getSubnames.ts +9 -2
  165. package/src/functions/makeCommitment.test.ts +2 -2
  166. package/src/functions/setName.test.ts +10 -11
  167. package/src/functions/setRecord.test.ts +12 -9
  168. package/src/functions/setRecords.test.ts +6 -5
  169. package/src/functions/setResolver.test.ts +6 -9
  170. package/src/functions/transferName.test.ts +13 -27
  171. package/src/functions/transferSubname.test.ts +11 -30
  172. package/src/functions/transferSubname.ts +28 -10
  173. package/src/functions/unwrapName.test.ts +13 -28
  174. package/src/functions/wrapName.test.ts +109 -34
  175. package/src/functions/wrapName.ts +45 -29
  176. package/src/generated/BaseRegistrarImplementation.ts +382 -296
  177. package/src/generated/DNSRegistrar.ts +103 -89
  178. package/src/generated/DNSSECImpl.ts +180 -149
  179. package/src/generated/DefaultReverseResolver.ts +37 -21
  180. package/src/generated/ENSRegistry.ts +257 -184
  181. package/src/generated/ETHRegistrarController.ts +252 -191
  182. package/src/generated/Multicall.ts +73 -57
  183. package/src/generated/NameWrapper.ts +979 -649
  184. package/src/generated/P256SHA256Algorithm.ts +21 -16
  185. package/src/generated/PublicResolver.ts +452 -362
  186. package/src/generated/RSASHA1Algorithm.ts +21 -16
  187. package/src/generated/RSASHA256Algorithm.ts +21 -16
  188. package/src/generated/ReverseRegistrar.ts +193 -141
  189. package/src/generated/Root.ts +146 -86
  190. package/src/generated/SHA1Digest.ts +12 -11
  191. package/src/generated/SHA1NSEC3Digest.ts +21 -16
  192. package/src/generated/SHA256Digest.ts +12 -11
  193. package/src/generated/StaticMetadataService.ts +22 -6
  194. package/src/generated/TLDPublicSuffixList.ts +10 -6
  195. package/src/generated/UniversalResolver.ts +44 -40
  196. package/src/generated/common.ts +2 -0
  197. package/src/generated/factories/DNSRegistrar__factory.ts +4 -56
  198. package/src/generated/factories/DNSSECImpl__factory.ts +4 -49
  199. package/src/generated/factories/ETHRegistrarController__factory.ts +14 -4
  200. package/src/generated/factories/NameWrapper__factory.ts +210 -79
  201. package/src/generated/factories/P256SHA256Algorithm__factory.ts +4 -40
  202. package/src/generated/factories/RSASHA1Algorithm__factory.ts +4 -40
  203. package/src/generated/factories/RSASHA256Algorithm__factory.ts +4 -40
  204. package/src/generated/factories/SHA1Digest__factory.ts +4 -40
  205. package/src/generated/factories/SHA1NSEC3Digest__factory.ts +4 -40
  206. package/src/generated/factories/SHA256Digest__factory.ts +4 -40
  207. package/src/generated/factories/TLDPublicSuffixList__factory.ts +4 -40
  208. package/src/generated/factories/index.ts +14 -0
  209. package/src/generated/index.ts +29 -1
  210. package/src/index.ts +3 -2
  211. package/src/tests/setup.ts +18 -13
  212. package/src/tests/withProvider.test.ts +2 -2
  213. package/src/utils/wrapperExpiry.ts +31 -0
  214. package/dist/cjs/contracts/doNotCallOnChainUniversalResolverProxy.d.ts +0 -3
  215. package/dist/cjs/contracts/doNotCallOnChainUniversalResolverProxy.js +0 -4
  216. package/dist/cjs/generated/DoNotCallOnChainUniversalResolverProxy.d.ts +0 -144
  217. package/dist/cjs/generated/DoNotCallOnChainUniversalResolverProxy.js +0 -2
  218. package/dist/cjs/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.d.ts +0 -56
  219. package/dist/cjs/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.js +0 -171
  220. package/dist/esm/contracts/doNotCallOnChainUniversalResolverProxy.d.ts +0 -3
  221. package/dist/esm/contracts/doNotCallOnChainUniversalResolverProxy.js +0 -2
  222. package/dist/esm/generated/DoNotCallOnChainUniversalResolverProxy.d.ts +0 -144
  223. package/dist/esm/generated/DoNotCallOnChainUniversalResolverProxy.js +0 -1
  224. package/dist/esm/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.d.ts +0 -56
  225. package/dist/esm/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.js +0 -167
  226. package/src/ABIs/ETHRegistrarController.json +0 -494
  227. package/src/ABIs/NameWrapper.json +0 -1183
  228. package/src/ABIs/PublicResolver.json +0 -875
  229. package/src/ABIs/ReverseRegistrar.json +0 -323
  230. package/src/ABIs/StaticMetadataService.json +0 -32
  231. package/src/ABIs/UniversalResolver.json +0 -187
  232. package/src/contracts/doNotCallOnChainUniversalResolverProxy.ts +0 -5
  233. package/src/generated/DoNotCallOnChainUniversalResolverProxy.ts +0 -285
  234. package/src/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.ts +0 -186
@@ -10,23 +10,23 @@ beforeAll(async () => {
10
10
  describe('batch', () => {
11
11
  it('should batch calls together', async () => {
12
12
  const result = await ENSInstance.batch(
13
- ENSInstance.getText.batch('jefflau.eth', 'description'),
14
- ENSInstance.getAddr.batch('jefflau.eth'),
15
- ENSInstance.getName.batch('0x866B3c4994e1416B7C738B9818b31dC246b95eEE'),
13
+ ENSInstance.getText.batch('with-profile.eth', 'description'),
14
+ ENSInstance.getAddr.batch('with-profile.eth'),
15
+ ENSInstance.getName.batch('0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC'),
16
16
  )
17
17
  expect(result).toBeTruthy()
18
18
  if (result) {
19
19
  expect(result[0]).toBe('Hello2')
20
- expect(result[1]).toBe('0x866B3c4994e1416B7C738B9818b31dC246b95eEE')
20
+ expect(result[1]).toBe('0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC')
21
21
  expect(result[2]).toMatchObject({
22
- name: 'jefflau.eth',
22
+ name: 'with-profile.eth',
23
23
  match: true,
24
24
  })
25
25
  }
26
26
  })
27
27
  it('should batch a single call', async () => {
28
28
  const result = await ENSInstance.batch(
29
- ENSInstance.getText.batch('jefflau.eth', 'description'),
29
+ ENSInstance.getText.batch('with-profile.eth', 'description'),
30
30
  )
31
31
  expect(result).toBeTruthy()
32
32
  if (result) {
@@ -10,12 +10,12 @@ beforeAll(async () => {
10
10
  describe('batchWrappers', () => {
11
11
  it('should batch calls together', async () => {
12
12
  const batch = await ENSInstance.resolverMulticallWrapper.raw([
13
- await ENSInstance._getText.raw('jefflau.eth', 'description'),
14
- await ENSInstance._getText.raw('jefflau.eth', 'url'),
15
- await ENSInstance._getAddr.raw('jefflau.eth'),
13
+ await ENSInstance._getText.raw('with-profile.eth', 'description'),
14
+ await ENSInstance._getText.raw('with-profile.eth', 'url'),
15
+ await ENSInstance._getAddr.raw('with-profile.eth'),
16
16
  ])
17
17
  const universalResponse = await ENSInstance.universalWrapper(
18
- 'jefflau.eth',
18
+ 'with-profile.eth',
19
19
  batch.data,
20
20
  )
21
21
  const [batchDecoded] = await ENSInstance.resolverMulticallWrapper.decode(
@@ -26,6 +26,6 @@ describe('batchWrappers', () => {
26
26
  const decoded3 = await ENSInstance._getAddr.decode(batchDecoded[2])
27
27
  expect(decoded1).toBe('Hello2')
28
28
  expect(decoded2).toBe('twitter.com')
29
- expect(decoded3).toBe('0x866B3c4994e1416B7C738B9818b31dC246b95eEE')
29
+ expect(decoded3).toBe('0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC')
30
30
  })
31
31
  })
@@ -1,4 +1,4 @@
1
- import { BigNumber, ethers } from 'ethers'
1
+ import { ethers } from 'ethers'
2
2
  import { ENS } from '..'
3
3
  import setup from '../tests/setup'
4
4
  import { namehash } from '../utils/normalise'
@@ -22,24 +22,19 @@ describe('burnFuses', () => {
22
22
  await revert()
23
23
  })
24
24
  it('should return a burnFuses transaction and succeed', async () => {
25
- const wrapNameTx = await ENSInstance.wrapName('parthtejpal.eth', {
26
- wrappedOwner: accounts[0],
27
- })
28
- await wrapNameTx.wait()
29
-
30
- const tx = await ENSInstance.burnFuses('parthtejpal.eth', {
25
+ const tx = await ENSInstance.burnFuses('wrapped.eth', {
31
26
  fusesToBurn: {
32
27
  cannotUnwrap: true,
33
28
  cannotCreateSubdomain: true,
34
29
  cannotSetTtl: true,
35
30
  },
31
+ addressOrIndex: accounts[1],
36
32
  })
37
33
  expect(tx).toBeTruthy()
38
34
  await tx.wait()
39
35
 
40
36
  const nameWrapper = await ENSInstance.contracts!.getNameWrapper()!
41
- const result = await nameWrapper.getFuses(namehash('parthtejpal.eth'))
42
- const fuseBN = result.fuses as BigNumber
43
- expect(fuseBN.toHexString()).toBe('0x71')
37
+ const [fuses] = await nameWrapper.getFuses(namehash('wrapped.eth'))
38
+ expect(fuses).toBe(113)
44
39
  })
45
40
  })
@@ -17,5 +17,5 @@ export default async function (
17
17
 
18
18
  const encodedFuses = generateFuseInput(fusesToBurn)
19
19
 
20
- return nameWrapper.populateTransaction.burnFuses(hash, encodedFuses)
20
+ return nameWrapper.populateTransaction.setFuses(hash, encodedFuses)
21
21
  }
@@ -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,10 +2,14 @@ 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
+ })
10
+
11
+ afterAll(async () => {
12
+ await revert()
9
13
  })
10
14
 
11
15
  describe('getHistory', () => {
@@ -16,7 +20,7 @@ describe('getHistory', () => {
16
20
  expect(result).toBeUndefined()
17
21
  })
18
22
  it('should return the history of a name', async () => {
19
- const result = await ENSInstance.getHistory('jefflau.eth')
23
+ const result = await ENSInstance.getHistory('with-profile.eth')
20
24
  expect(result).toBeTruthy()
21
25
  if (result) {
22
26
  expect(result).toHaveProperty('domain')
@@ -32,7 +36,7 @@ describe('getHistory', () => {
32
36
  expect(result).toBeUndefined()
33
37
  })
34
38
  it('should return the history of a name with TextChanged event detail', async () => {
35
- const result = await ENSInstance.getHistoryWithDetail('jefflau.eth')
39
+ const result = await ENSInstance.getHistoryWithDetail('with-profile.eth')
36
40
  expect(result).toBeTruthy()
37
41
  if (result) {
38
42
  const textEvents = result.resolver.filter(
@@ -70,13 +74,22 @@ describe('getHistory', () => {
70
74
  expect(result[0]).toMatchObject(eventToUse.data)
71
75
  }
72
76
  })
77
+ let hash: string = ''
73
78
  it('should return multiple items for a given transaction hash with multiple events', async () => {
74
- const hash =
75
- '0x002b7cc3c85168d885a38226a28fac349d13cbaff7f3db4fa3af31f22b863079'
76
79
  const dataArr = [
77
- { key: 'description', value: 'Not so super description' },
78
- { key: 'url', value: 'facebook.com' },
80
+ { key: 'foo', value: 'bar' },
81
+ { key: 'swag', value: 'cool' },
79
82
  ]
83
+ const tx = await ENSInstance.setRecords('test123.eth', {
84
+ records: {
85
+ texts: dataArr,
86
+ },
87
+ addressOrIndex: 1,
88
+ })
89
+ await tx.wait()
90
+
91
+ hash = tx.hash
92
+
80
93
  const result = (await ENSInstance.getHistoryDetailForTransactionHash(
81
94
  hash,
82
95
  )) as { key: any; value: any }[]
@@ -88,9 +101,8 @@ describe('getHistory', () => {
88
101
  }
89
102
  })
90
103
  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' }
104
+ const data = { key: 'swag', value: 'cool' }
105
+
94
106
  const result = (await ENSInstance.getHistoryDetailForTransactionHash(
95
107
  hash,
96
108
  1,