@ensdomains/ensjs 3.0.0-alpha.41 → 3.0.0-alpha.43

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 (190) hide show
  1. package/dist/cjs/contracts/getContractAddress.js +4 -4
  2. package/dist/cjs/functions/commitName.js +2 -3
  3. package/dist/cjs/functions/createSubname.js +2 -8
  4. package/dist/cjs/functions/getDecryptedName.js +111 -0
  5. package/dist/cjs/functions/getHistory.js +14 -7
  6. package/dist/cjs/functions/getNames.js +10 -6
  7. package/dist/cjs/functions/getOwner.js +28 -15
  8. package/dist/cjs/functions/getPrice.js +6 -6
  9. package/dist/cjs/functions/getProfile.js +11 -5
  10. package/dist/cjs/functions/getWrapperData.js +4 -5
  11. package/dist/cjs/functions/renewNames.js +13 -20
  12. package/dist/cjs/functions/{burnFuses.js → setFuses.js} +24 -6
  13. package/dist/cjs/functions/wrapName.js +9 -25
  14. package/dist/cjs/generated/factories/BaseRegistrarImplementation__factory.js +2 -2
  15. package/dist/cjs/generated/factories/BulkRenewal__factory.js +2 -2
  16. package/dist/cjs/generated/factories/DNSRegistrar__factory.js +2 -2
  17. package/dist/cjs/generated/factories/DNSSECImpl__factory.js +2 -2
  18. package/dist/cjs/generated/factories/DefaultReverseResolver__factory.js +2 -2
  19. package/dist/cjs/generated/factories/ENSRegistry__factory.js +2 -2
  20. package/dist/cjs/generated/factories/ETHRegistrarController__factory.js +8 -57
  21. package/dist/cjs/generated/factories/Multicall__factory.js +2 -2
  22. package/dist/cjs/generated/factories/NameWrapper__factory.js +92 -71
  23. package/dist/cjs/generated/factories/P256SHA256Algorithm__factory.js +2 -2
  24. package/dist/cjs/generated/factories/PublicResolver__factory.js +85 -2
  25. package/dist/cjs/generated/factories/RSASHA1Algorithm__factory.js +2 -2
  26. package/dist/cjs/generated/factories/RSASHA256Algorithm__factory.js +2 -2
  27. package/dist/cjs/generated/factories/ReverseRegistrar__factory.js +2 -2
  28. package/dist/cjs/generated/factories/Root__factory.js +2 -2
  29. package/dist/cjs/generated/factories/SHA1Digest__factory.js +2 -2
  30. package/dist/cjs/generated/factories/SHA1NSEC3Digest__factory.js +2 -2
  31. package/dist/cjs/generated/factories/SHA256Digest__factory.js +2 -2
  32. package/dist/cjs/generated/factories/StaticMetadataService__factory.js +2 -2
  33. package/dist/cjs/generated/factories/TLDPublicSuffixList__factory.js +2 -2
  34. package/dist/cjs/generated/factories/UniversalResolver__factory.js +69 -4
  35. package/dist/cjs/index.js +6 -4
  36. package/dist/cjs/utils/ccip.js +3 -3
  37. package/dist/cjs/utils/consts.js +3 -1
  38. package/dist/cjs/utils/fuses.js +218 -53
  39. package/dist/cjs/utils/hexEncodedName.js +2 -0
  40. package/dist/cjs/utils/labels.js +14 -8
  41. package/dist/cjs/utils/normalise.js +2 -2
  42. package/dist/cjs/utils/recordHelpers.js +4 -3
  43. package/dist/cjs/utils/registerHelpers.js +11 -25
  44. package/dist/cjs/utils/subgraph-types.js +16 -0
  45. package/dist/cjs/utils/wrapper.js +3 -3
  46. package/dist/esm/contracts/getContractAddress.mjs +4 -4
  47. package/dist/esm/functions/commitName.mjs +2 -3
  48. package/dist/esm/functions/createSubname.mjs +2 -2
  49. package/dist/esm/functions/getDecryptedName.mjs +96 -0
  50. package/dist/esm/functions/getHistory.mjs +14 -7
  51. package/dist/esm/functions/getNames.mjs +10 -6
  52. package/dist/esm/functions/getOwner.mjs +26 -13
  53. package/dist/esm/functions/getPrice.mjs +2 -2
  54. package/dist/esm/functions/getProfile.mjs +10 -4
  55. package/dist/esm/functions/getWrapperData.mjs +4 -5
  56. package/dist/esm/functions/renewNames.mjs +13 -20
  57. package/dist/esm/functions/setFuses.mjs +30 -0
  58. package/dist/esm/functions/wrapName.mjs +9 -19
  59. package/dist/esm/generated/factories/BaseRegistrarImplementation__factory.mjs +1 -1
  60. package/dist/esm/generated/factories/BulkRenewal__factory.mjs +1 -1
  61. package/dist/esm/generated/factories/DNSRegistrar__factory.mjs +1 -1
  62. package/dist/esm/generated/factories/DNSSECImpl__factory.mjs +1 -1
  63. package/dist/esm/generated/factories/DefaultReverseResolver__factory.mjs +1 -1
  64. package/dist/esm/generated/factories/ENSRegistry__factory.mjs +1 -1
  65. package/dist/esm/generated/factories/ETHRegistrarController__factory.mjs +7 -56
  66. package/dist/esm/generated/factories/Multicall__factory.mjs +1 -1
  67. package/dist/esm/generated/factories/NameWrapper__factory.mjs +91 -70
  68. package/dist/esm/generated/factories/P256SHA256Algorithm__factory.mjs +1 -1
  69. package/dist/esm/generated/factories/PublicResolver__factory.mjs +84 -1
  70. package/dist/esm/generated/factories/RSASHA1Algorithm__factory.mjs +1 -1
  71. package/dist/esm/generated/factories/RSASHA256Algorithm__factory.mjs +1 -1
  72. package/dist/esm/generated/factories/ReverseRegistrar__factory.mjs +1 -1
  73. package/dist/esm/generated/factories/Root__factory.mjs +1 -1
  74. package/dist/esm/generated/factories/SHA1Digest__factory.mjs +1 -1
  75. package/dist/esm/generated/factories/SHA1NSEC3Digest__factory.mjs +1 -1
  76. package/dist/esm/generated/factories/SHA256Digest__factory.mjs +1 -1
  77. package/dist/esm/generated/factories/StaticMetadataService__factory.mjs +1 -1
  78. package/dist/esm/generated/factories/TLDPublicSuffixList__factory.mjs +1 -1
  79. package/dist/esm/generated/factories/UniversalResolver__factory.mjs +68 -3
  80. package/dist/esm/index.mjs +6 -4
  81. package/dist/esm/utils/ccip.mjs +2 -2
  82. package/dist/esm/utils/consts.mjs +3 -1
  83. package/dist/esm/utils/fuses.mjs +218 -53
  84. package/dist/esm/utils/hexEncodedName.mjs +2 -0
  85. package/dist/esm/utils/labels.mjs +11 -8
  86. package/dist/esm/utils/normalise.mjs +1 -1
  87. package/dist/esm/utils/recordHelpers.mjs +2 -1
  88. package/dist/esm/utils/registerHelpers.mjs +10 -18
  89. package/dist/esm/utils/subgraph-types.mjs +0 -0
  90. package/dist/esm/utils/wrapper.mjs +2 -2
  91. package/dist/types/functions/commitName.d.ts +0 -1
  92. package/dist/types/functions/createSubname.d.ts +2 -2
  93. package/dist/types/functions/getDecryptedName.d.ts +9 -0
  94. package/dist/types/functions/getHistory.d.ts +1 -1
  95. package/dist/types/functions/getNames.d.ts +3 -3
  96. package/dist/types/functions/getOwner.d.ts +1 -0
  97. package/dist/types/functions/getPrice.d.ts +1 -1
  98. package/dist/types/functions/getProfile.d.ts +1 -0
  99. package/dist/types/functions/getRecords.d.ts +1 -0
  100. package/dist/types/functions/getWrapperData.d.ts +44 -5
  101. package/dist/types/functions/registerName.d.ts +1 -1
  102. package/dist/types/functions/renewNames.d.ts +5 -6
  103. package/dist/types/functions/setFuses.d.ts +7 -0
  104. package/dist/types/functions/types.d.ts +8 -4
  105. package/dist/types/functions/wrapName.d.ts +3 -3
  106. package/dist/types/generated/ETHRegistrarController.d.ts +13 -36
  107. package/dist/types/generated/NameWrapper.d.ts +97 -52
  108. package/dist/types/generated/PublicResolver.d.ts +50 -1
  109. package/dist/types/generated/UniversalResolver.d.ts +79 -32
  110. package/dist/types/generated/factories/UniversalResolver__factory.d.ts +15 -0
  111. package/dist/types/index.d.ts +60 -9
  112. package/dist/types/static.d.ts +1 -1
  113. package/dist/types/utils/consts.d.ts +1 -0
  114. package/dist/types/utils/fuses.d.ts +115 -45
  115. package/dist/types/utils/hexEncodedName.d.ts +1 -0
  116. package/dist/types/utils/labels.d.ts +2 -1
  117. package/dist/types/utils/registerHelpers.d.ts +7 -25
  118. package/dist/types/utils/subgraph-types.d.ts +284 -0
  119. package/dist/types/utils/wrapper.d.ts +1 -1
  120. package/package.json +5 -5
  121. package/src/contracts/getContractAddress.ts +4 -4
  122. package/src/functions/commitName.test.ts +0 -3
  123. package/src/functions/commitName.ts +1 -2
  124. package/src/functions/createSubname.ts +5 -6
  125. package/src/functions/getDecryptedName.test.ts +49 -0
  126. package/src/functions/getDecryptedName.ts +119 -0
  127. package/src/functions/getExpiry.ts +1 -1
  128. package/src/functions/getHistory.ts +59 -25
  129. package/src/functions/getNames.test.ts +2 -2
  130. package/src/functions/getNames.ts +26 -13
  131. package/src/functions/getOwner.test.ts +62 -3
  132. package/src/functions/getOwner.ts +33 -13
  133. package/src/functions/getPrice.ts +2 -2
  134. package/src/functions/getProfile.test.ts +7 -0
  135. package/src/functions/getProfile.ts +13 -4
  136. package/src/functions/getWrapperData.test.ts +11 -45
  137. package/src/functions/getWrapperData.ts +8 -6
  138. package/src/functions/registerName.test.ts +3 -3
  139. package/src/functions/registerName.ts +1 -1
  140. package/src/functions/renewNames.ts +18 -24
  141. package/src/functions/setFuses.test.ts +240 -0
  142. package/src/functions/setFuses.ts +44 -0
  143. package/src/functions/types.ts +8 -4
  144. package/src/functions/wrapName.test.ts +8 -7
  145. package/src/functions/wrapName.ts +11 -25
  146. package/src/generated/ETHRegistrarController.ts +12 -79
  147. package/src/generated/NameWrapper.ts +155 -99
  148. package/src/generated/PublicResolver.ts +123 -0
  149. package/src/generated/UniversalResolver.ts +157 -16
  150. package/src/generated/factories/BaseRegistrarImplementation__factory.ts +1 -1
  151. package/src/generated/factories/BulkRenewal__factory.ts +1 -1
  152. package/src/generated/factories/DNSRegistrar__factory.ts +1 -1
  153. package/src/generated/factories/DNSSECImpl__factory.ts +1 -1
  154. package/src/generated/factories/DefaultReverseResolver__factory.ts +1 -1
  155. package/src/generated/factories/ENSRegistry__factory.ts +1 -1
  156. package/src/generated/factories/ETHRegistrarController__factory.ts +7 -56
  157. package/src/generated/factories/Multicall__factory.ts +1 -1
  158. package/src/generated/factories/NameWrapper__factory.ts +91 -70
  159. package/src/generated/factories/P256SHA256Algorithm__factory.ts +1 -1
  160. package/src/generated/factories/PublicResolver__factory.ts +84 -1
  161. package/src/generated/factories/RSASHA1Algorithm__factory.ts +1 -1
  162. package/src/generated/factories/RSASHA256Algorithm__factory.ts +1 -1
  163. package/src/generated/factories/ReverseRegistrar__factory.ts +1 -1
  164. package/src/generated/factories/Root__factory.ts +1 -1
  165. package/src/generated/factories/SHA1Digest__factory.ts +1 -1
  166. package/src/generated/factories/SHA1NSEC3Digest__factory.ts +1 -1
  167. package/src/generated/factories/SHA256Digest__factory.ts +1 -1
  168. package/src/generated/factories/StaticMetadataService__factory.ts +1 -1
  169. package/src/generated/factories/TLDPublicSuffixList__factory.ts +1 -1
  170. package/src/generated/factories/UniversalResolver__factory.ts +68 -3
  171. package/src/index.ts +15 -14
  172. package/src/static.ts +1 -1
  173. package/src/utils/ccip.ts +2 -2
  174. package/src/utils/consts.ts +1 -0
  175. package/src/utils/fuses.ts +299 -102
  176. package/src/utils/hexEncodedName.ts +3 -0
  177. package/src/utils/labels.ts +13 -11
  178. package/src/utils/normalise.ts +1 -1
  179. package/src/utils/recordHelpers.ts +2 -1
  180. package/src/utils/registerHelpers.ts +14 -42
  181. package/src/utils/subgraph-types.ts +312 -0
  182. package/src/utils/wrapper.ts +2 -2
  183. package/dist/cjs/utils/generateFuseInput.js +0 -40
  184. package/dist/esm/functions/burnFuses.mjs +0 -12
  185. package/dist/esm/utils/generateFuseInput.mjs +0 -15
  186. package/dist/types/functions/burnFuses.d.ts +0 -3
  187. package/dist/types/utils/generateFuseInput.d.ts +0 -3
  188. package/src/functions/burnFuses.test.ts +0 -148
  189. package/src/functions/burnFuses.ts +0 -16
  190. package/src/utils/generateFuseInput.ts +0 -13
@@ -4,6 +4,30 @@ import { ENSArgs } from '..'
4
4
  import { decodeContenthash } from '../utils/contentHash'
5
5
  import { labelhash } from '../utils/labels'
6
6
  import { namehash } from '../utils/normalise'
7
+ import {
8
+ AbiChanged,
9
+ AddrChanged,
10
+ AuthorisationChanged,
11
+ ContenthashChanged,
12
+ ExpiryExtended,
13
+ FusesSet,
14
+ InterfaceChanged,
15
+ MulticoinAddrChanged,
16
+ NameChanged,
17
+ NameRegistered,
18
+ NameRenewed,
19
+ NameTransferred,
20
+ NameUnwrapped,
21
+ NameWrapped,
22
+ NewOwner,
23
+ NewResolver,
24
+ NewTtl,
25
+ PubkeyChanged,
26
+ TextChanged,
27
+ Transfer,
28
+ VersionChanged,
29
+ WrappedTransfer,
30
+ } from '../utils/subgraph-types'
7
31
 
8
32
  type DomainEvent =
9
33
  | 'NewOwner'
@@ -14,6 +38,7 @@ type DomainEvent =
14
38
  | 'NameWrapped'
15
39
  | 'NameUnwrapped'
16
40
  | 'FusesSet'
41
+ | 'ExpiryExtended'
17
42
  type RegistrationEvent = 'NameRegistered' | 'NameRenewed' | 'NameTransferred'
18
43
  type ResolverEvent =
19
44
  | 'AddrChanged'
@@ -38,30 +63,35 @@ const eventFormat: {
38
63
  [key in EventTypes]: { [n in EventFormat[key]]: (args: any) => object }
39
64
  } = {
40
65
  Domain: {
41
- NewOwner: (args: any) => ({ owner: args.owner.id }),
42
- NewResolver: (args: any) => ({ resolver: args.resolver.id.split('-')[0] }),
43
- Transfer: (args: any) => ({ owner: args.owner.id }),
44
- NewTTL: (args: any) => ({ ttl: args.ttl }),
45
- WrappedTransfer: (args: any) => ({ owner: args.owner.id }),
46
- NameWrapped: (args: any) => ({
66
+ NewOwner: (args: NewOwner) => ({ owner: args.owner.id }),
67
+ NewResolver: (args: NewResolver) => ({
68
+ resolver: args.resolver.id.split('-')[0],
69
+ }),
70
+ Transfer: (args: Transfer) => ({ owner: args.owner.id }),
71
+ NewTTL: (args: NewTtl) => ({ ttl: args.ttl }),
72
+ WrappedTransfer: (args: WrappedTransfer) => ({ owner: args.owner.id }),
73
+ NameWrapped: (args: NameWrapped) => ({
47
74
  fuses: args.fuses,
48
75
  owner: args.owner.id,
49
- expiry: args.expiry,
76
+ expiryDate: args.expiryDate,
50
77
  }),
51
- NameUnwrapped: (args: any) => ({ owner: args.owner.id }),
52
- FusesSet: (args: any) => ({ fuses: args.fuses, expiry: args.expiry }),
78
+ NameUnwrapped: (args: NameUnwrapped) => ({ owner: args.owner.id }),
79
+ FusesSet: (args: FusesSet) => ({ fuses: args.fuses }),
80
+ ExpiryExtended: (args: ExpiryExtended) => ({ expiryDate: args.expiryDate }),
53
81
  },
54
82
  Registration: {
55
- NameRegistered: (args: any) => ({
83
+ NameRegistered: (args: NameRegistered) => ({
56
84
  registrant: args.registrant.id,
57
85
  expiryDate: args.expiryDate,
58
86
  }),
59
- NameRenewed: (args: any) => ({ expiryDate: args.expiryDate }),
60
- NameTransferred: (args: any) => ({ owner: args.newOwner.id }),
87
+ NameRenewed: (args: NameRenewed) => ({ expiryDate: args.expiryDate }),
88
+ NameTransferred: (args: NameTransferred) => ({ owner: args.newOwner.id }),
61
89
  },
62
90
  Resolver: {
63
- AddrChanged: (args: any) => ({ addr: args.addr.id }),
64
- MulticoinAddrChanged: (args: any) => {
91
+ AddrChanged: (args: AddrChanged) => ({ addr: args.addr.id }),
92
+ MulticoinAddrChanged: (
93
+ args: Omit<MulticoinAddrChanged, 'addr'> & { multiaddr: string },
94
+ ) => {
65
95
  const format = formatsByCoinType[parseInt(args.coinType)]
66
96
  if (!format) {
67
97
  return {
@@ -82,21 +112,23 @@ const eventFormat: {
82
112
  addr: format.encoder(Buffer.from(args.multiaddr.slice(2), 'hex')),
83
113
  }
84
114
  },
85
- NameChanged: (args: any) => ({ name: args.name }),
86
- AbiChanged: (args: any) => ({ contentType: args.contentType }),
87
- PubkeyChanged: (args: any) => ({ x: args.x, y: args.y }),
88
- TextChanged: (args: any) => ({ key: args.key, value: args.value }),
89
- ContenthashChanged: (args: any) => ({ hash: decodeContenthash(args.hash) }),
90
- InterfaceChanged: (args: any) => ({
91
- interfaceId: args.interfaceId,
115
+ NameChanged: (args: NameChanged) => ({ name: args.name }),
116
+ AbiChanged: (args: AbiChanged) => ({ contentType: args.contentType }),
117
+ PubkeyChanged: (args: PubkeyChanged) => ({ x: args.x, y: args.y }),
118
+ TextChanged: (args: TextChanged) => ({ key: args.key, value: args.value }),
119
+ ContenthashChanged: (args: ContenthashChanged) => ({
120
+ hash: decodeContenthash(args.hash),
121
+ }),
122
+ InterfaceChanged: (args: InterfaceChanged) => ({
123
+ interfaceId: args.interfaceID,
92
124
  implementer: args.implementer,
93
125
  }),
94
- AuthorisationChanged: (args: any) => ({
126
+ AuthorisationChanged: (args: AuthorisationChanged) => ({
95
127
  owner: args.owner,
96
128
  target: args.target,
97
129
  isAuthorized: args.isAuthorized,
98
130
  }),
99
- VersionChanged: (args: any) => ({ version: args.version }),
131
+ VersionChanged: (args: VersionChanged) => ({ version: args.version }),
100
132
  },
101
133
  }
102
134
 
@@ -154,7 +186,7 @@ export async function getHistory(
154
186
  }
155
187
  ...on NameWrapped {
156
188
  fuses
157
- expiry
189
+ expiryDate
158
190
  owner {
159
191
  id
160
192
  }
@@ -166,7 +198,9 @@ export async function getHistory(
166
198
  }
167
199
  ...on FusesSet {
168
200
  fuses
169
- expiry
201
+ }
202
+ ...on ExpiryExtended {
203
+ expiryDate
170
204
  }
171
205
  }
172
206
  registration {
@@ -29,7 +29,7 @@ const letterItems = [
29
29
  ]
30
30
 
31
31
  const domainLetterItems = [
32
- '[',
32
+ ...Array(3).fill('['),
33
33
  'x',
34
34
  'w',
35
35
  't',
@@ -172,7 +172,7 @@ describe('getNames', () => {
172
172
  type: 'wrappedOwner',
173
173
  page: 0,
174
174
  })
175
- expect(pageOne).toHaveLength(1)
175
+ expect(pageOne).toHaveLength(2)
176
176
  })
177
177
  describe('orderBy', () => {
178
178
  describe('registrations', () => {
@@ -1,7 +1,8 @@
1
1
  import { ENSArgs } from '..'
2
2
  import { truncateFormat } from '../utils/format'
3
- import { CurrentFuses, decodeFuses } from '../utils/fuses'
3
+ import { AllCurrentFuses, decodeFuses } from '../utils/fuses'
4
4
  import { decryptName } from '../utils/labels'
5
+ import { Domain, Registration, WrappedDomain } from '../utils/subgraph-types'
5
6
 
6
7
  export type Name = {
7
8
  id: string
@@ -16,7 +17,7 @@ export type Name = {
16
17
  createdAt?: Date
17
18
  registrationDate?: Date
18
19
  expiryDate?: Date
19
- fuses?: CurrentFuses
20
+ fuses?: AllCurrentFuses
20
21
  registration?: {
21
22
  expiryDate: Date
22
23
  registrationDate: Date
@@ -44,7 +45,7 @@ type OwnerParams = {
44
45
 
45
46
  type WrappedOwnerParams = {
46
47
  type: 'wrappedOwner'
47
- orderBy?: 'expiryDate' | 'labelName'
48
+ orderBy?: 'expiryDate' | 'name'
48
49
  }
49
50
 
50
51
  type AllParams = {
@@ -57,23 +58,35 @@ type AllParams = {
57
58
  type Params = BaseParams &
58
59
  (RegistrantParams | OwnerParams | WrappedOwnerParams | AllParams)
59
60
 
60
- const mapDomain = (domain: any) => {
61
- const decrypted = decryptName(domain.name)
61
+ const mapDomain = ({ name, ...domain }: Domain) => {
62
+ const decrypted = name ? decryptName(name) : undefined
62
63
  return {
63
64
  ...domain,
64
65
  name: decrypted,
65
- truncatedName: truncateFormat(decrypted),
66
+ truncatedName: decrypted ? truncateFormat(decrypted) : undefined,
66
67
  createdAt: new Date(parseInt(domain.createdAt) * 1000),
67
68
  type: 'domain',
68
69
  }
69
70
  }
70
71
 
71
- const mapWrappedDomain = (wrappedDomain: any) => {
72
- const domain = mapDomain(wrappedDomain.domain)
72
+ const mapWrappedDomain = (wrappedDomain: WrappedDomain) => {
73
+ const domain = mapDomain(wrappedDomain.domain) as Omit<
74
+ ReturnType<typeof mapDomain>,
75
+ 'registration'
76
+ > & {
77
+ registration?: {
78
+ expiryDate: string | Date
79
+ registrationDate: string | Date
80
+ }
81
+ }
73
82
  if (domain.registration) {
74
83
  domain.registration = {
75
- expiryDate: new Date(parseInt(domain.registration.expiryDate) * 1000),
76
- registrationDate: new Date(domain.registration.registrationDate * 1000),
84
+ expiryDate: new Date(
85
+ parseInt(domain.registration.expiryDate as string) * 1000,
86
+ ),
87
+ registrationDate: new Date(
88
+ parseInt(domain.registration.registrationDate as string) * 1000,
89
+ ),
77
90
  }
78
91
  }
79
92
  return {
@@ -84,8 +97,8 @@ const mapWrappedDomain = (wrappedDomain: any) => {
84
97
  }
85
98
  }
86
99
 
87
- const mapRegistration = (registration: any) => {
88
- const decrypted = decryptName(registration.domain.name)
100
+ const mapRegistration = (registration: Registration) => {
101
+ const decrypted = decryptName(registration.domain.name!)
89
102
  return {
90
103
  expiryDate: new Date(parseInt(registration.expiryDate) * 1000),
91
104
  registrationDate: new Date(parseInt(registration.registrationDate) * 1000),
@@ -275,7 +288,7 @@ const getNames = async (
275
288
  id: address,
276
289
  first: pageSize,
277
290
  skip: (page || 0) * pageSize,
278
- orderBy,
291
+ orderBy: orderBy === 'labelName' ? 'name' : orderBy,
279
292
  orderDirection,
280
293
  }
281
294
  }
@@ -1,11 +1,15 @@
1
+ import { JsonRpcProvider } from '@ethersproject/providers'
1
2
  import { ENS } from '..'
2
3
  import setup from '../tests/setup'
3
4
 
4
5
  let ensInstance: ENS
5
6
  let revert: Awaited<ReturnType<typeof setup>>['revert']
7
+ let provider: JsonRpcProvider
8
+ let accounts: string[]
6
9
 
7
10
  beforeAll(async () => {
8
- ;({ ensInstance, revert } = await setup())
11
+ ;({ ensInstance, revert, provider } = await setup())
12
+ accounts = await provider.listAccounts()
9
13
  })
10
14
 
11
15
  afterAll(async () => {
@@ -13,8 +17,63 @@ afterAll(async () => {
13
17
  })
14
18
 
15
19
  describe('getOwner', () => {
16
- it('should return nameWrapper as the ownership level for a wrapped name', async () => {
20
+ it('should return correct ownership level and values for a wrapped .eth name', async () => {
17
21
  const result = await ensInstance.getOwner('wrapped.eth')
18
- expect(result?.ownershipLevel).toBe('nameWrapper')
22
+ expect(result).toEqual({
23
+ ownershipLevel: 'nameWrapper',
24
+ owner: accounts[1],
25
+ expired: false,
26
+ })
27
+ })
28
+ it('should return correct ownership level and values for an expired wrapped .eth name', async () => {
29
+ const result = await ensInstance.getOwner('expired-wrapped.eth')
30
+ expect(result).toEqual({
31
+ ownershipLevel: 'nameWrapper',
32
+ owner: '0x0000000000000000000000000000000000000000',
33
+ expired: true,
34
+ })
35
+ })
36
+ it('should return correct ownership level and values for an unwrapped .eth name', async () => {
37
+ const result = await ensInstance.getOwner('test123.eth')
38
+ expect(result).toEqual({
39
+ ownershipLevel: 'registrar',
40
+ owner: accounts[1],
41
+ registrant: accounts[1],
42
+ expired: false,
43
+ })
44
+ })
45
+ it('should return correct ownership level and values for an expired unwrapped .eth name', async () => {
46
+ const result = await ensInstance.getOwner('expired.eth')
47
+ expect(result).toEqual({
48
+ ownershipLevel: 'registrar',
49
+ owner: accounts[1],
50
+ registrant: accounts[1].toLowerCase(),
51
+ expired: true,
52
+ })
53
+ })
54
+ describe('subname', () => {
55
+ it('should return correct ownership level and values for a unwrapped name', async () => {
56
+ const result = await ensInstance.getOwner('test.with-subnames.eth')
57
+ expect(result).toEqual({
58
+ ownershipLevel: 'registry',
59
+ owner: accounts[2],
60
+ })
61
+ })
62
+ it('should return correct ownership level and values for a wrapped name', async () => {
63
+ const result = await ensInstance.getOwner(
64
+ 'test.wrapped-with-subnames.eth',
65
+ )
66
+ expect(result).toEqual({
67
+ ownershipLevel: 'nameWrapper',
68
+ owner: accounts[2],
69
+ })
70
+ })
71
+ it('should return correct ownership level and values for an expired wrapped name', async () => {
72
+ const result = await ensInstance.getOwner('test.expired-wrapped.eth')
73
+ expect(result).toEqual({
74
+ ownershipLevel: 'nameWrapper',
75
+ owner: accounts[2],
76
+ })
77
+ })
19
78
  })
20
79
  })
@@ -1,5 +1,5 @@
1
- import { defaultAbiCoder } from '@ethersproject/abi/lib/abi-coder'
2
- import type { Result } from '@ethersproject/abi/lib/coders/abstract-coder'
1
+ import type { Result } from '@ethersproject/abi'
2
+ import { defaultAbiCoder } from '@ethersproject/abi'
3
3
  import { hexStripZeros } from '@ethersproject/bytes'
4
4
  import { ENSArgs } from '..'
5
5
  import { labelhash } from '../utils/labels'
@@ -9,6 +9,7 @@ type Owner = {
9
9
  registrant?: string
10
10
  owner?: string
11
11
  ownershipLevel: 'nameWrapper' | 'registry' | 'registrar'
12
+ expired?: boolean
12
13
  }
13
14
 
14
15
  const singleContractOwnerRaw = async (
@@ -146,26 +147,43 @@ const decode = async (
146
147
 
147
148
  const registryOwner = (decodedData[0] as Result)[0]
148
149
  const nameWrapperOwner = (decodedData[1] as Result)[0]
149
- let registrarOwner = (decodedData[2] as Result | undefined)?.[0]
150
+ let registrarOwner: string | undefined = (
151
+ decodedData[2] as Result | undefined
152
+ )?.[0]
153
+ let baseReturnObject: {
154
+ expired?: boolean
155
+ } = {}
150
156
 
151
157
  // check for only .eth names
152
158
  if (labels[labels.length - 1] === 'eth') {
153
- if (!registrarOwner && labels.length === 2) {
154
- const graphRegistrantResult = await gqlInstance.client.request(
155
- registrantQuery,
156
- {
157
- namehash: makeNamehash(name),
158
- },
159
- )
160
- registrarOwner =
161
- graphRegistrantResult.domain?.registration?.registrant?.id
159
+ // if there is no registrar owner, the name is expired
160
+ // but we still want to get the registrar owner prior to expiry
161
+ if (labels.length === 2) {
162
+ if (!registrarOwner) {
163
+ const graphRegistrantResult = await gqlInstance.client.request(
164
+ registrantQuery,
165
+ {
166
+ namehash: makeNamehash(name),
167
+ },
168
+ )
169
+ registrarOwner =
170
+ graphRegistrantResult.domain?.registration?.registrant?.id
171
+ baseReturnObject = {
172
+ expired: true,
173
+ }
174
+ } else {
175
+ baseReturnObject = {
176
+ expired: false,
177
+ }
178
+ }
162
179
  }
163
180
  // if the owner on the registrar is the namewrapper, then the namewrapper owner is the owner
164
181
  // there is no "registrant" for wrapped names
165
- if (registrarOwner === nameWrapper.address) {
182
+ if (registrarOwner?.toLowerCase() === nameWrapper.address.toLowerCase()) {
166
183
  return {
167
184
  owner: nameWrapperOwner,
168
185
  ownershipLevel: 'nameWrapper',
186
+ ...baseReturnObject,
169
187
  }
170
188
  }
171
189
  // if there is a registrar owner, then it's not a subdomain but we have also passed the namewrapper clause
@@ -177,6 +195,7 @@ const decode = async (
177
195
  registrant: registrarOwner,
178
196
  owner: registryOwner,
179
197
  ownershipLevel: 'registrar',
198
+ ...baseReturnObject,
180
199
  }
181
200
  }
182
201
  if (hexStripZeros(registryOwner) !== '0x') {
@@ -187,6 +206,7 @@ const decode = async (
187
206
  registrant: undefined,
188
207
  owner: registryOwner,
189
208
  ownershipLevel: 'registrar',
209
+ expired: true,
190
210
  }
191
211
  }
192
212
  // this means that the subname is wrapped
@@ -1,5 +1,5 @@
1
- import { defaultAbiCoder } from '@ethersproject/abi/lib/abi-coder'
2
- import { BigNumber } from '@ethersproject/bignumber/lib/bignumber'
1
+ import { defaultAbiCoder } from '@ethersproject/abi'
2
+ import { BigNumber } from '@ethersproject/bignumber'
3
3
  import { ENSArgs } from '..'
4
4
 
5
5
  const raw = async (
@@ -119,6 +119,13 @@ describe('getProfile', () => {
119
119
  deploymentAddresses.LegacyPublicResolver,
120
120
  )
121
121
  })
122
+ it('should return the decoded name for a name with encoded labels', async () => {
123
+ const result = await ensInstance.getProfile(
124
+ '[9dd2c369a187b4e6b9c402f030e50743e619301ea62aa4c0737d4ef7e10a3d49].with-subnames.eth',
125
+ )
126
+ expect(result).toBeDefined()
127
+ expect(result?.decryptedName).toBe('xyz.with-subnames.eth')
128
+ })
122
129
  it('should return undefined for an unregistered name', async () => {
123
130
  const result = await ensInstance.getProfile('test123123123cool.eth')
124
131
  expect(result).toBeUndefined()
@@ -1,5 +1,5 @@
1
1
  import { formatsByName } from '@ensdomains/address-encoder'
2
- import { defaultAbiCoder } from '@ethersproject/abi/lib/abi-coder'
2
+ import { defaultAbiCoder } from '@ethersproject/abi'
3
3
  import { hexStripZeros, isBytesLike } from '@ethersproject/bytes'
4
4
  import { ENSArgs } from '..'
5
5
  import { decodeContenthash, DecodedContentHash } from '../utils/contentHash'
@@ -37,6 +37,7 @@ type ResolvedProfile = {
37
37
  createdAt: string | null
38
38
  address?: string
39
39
  name?: string | null
40
+ decryptedName?: string | null
40
41
  match?: boolean
41
42
  message?: string
42
43
  records?: {
@@ -360,6 +361,7 @@ const graphFetch = async (
360
361
  const query = gqlInstance.gql`
361
362
  query getRecords($id: String!) {
362
363
  domain(id: $id) {
364
+ name
363
365
  isMigrated
364
366
  createdAt
365
367
  resolver {
@@ -377,6 +379,7 @@ const graphFetch = async (
377
379
  const customResolverQuery = gqlInstance.gql`
378
380
  query getRecordsWithCustomResolver($id: String!, $resolverId: String!) {
379
381
  domain(id: $id) {
382
+ name
380
383
  isMigrated
381
384
  createdAt
382
385
  }
@@ -414,11 +417,12 @@ const graphFetch = async (
414
417
 
415
418
  if (!domain) return
416
419
 
417
- const { isMigrated, createdAt } = domain
420
+ const { isMigrated, createdAt, name: decryptedName } = domain
418
421
 
419
422
  const returnedRecords: ProfileResponse = {}
420
423
 
421
- if (!resolverResponse || !wantedRecords) return { isMigrated, createdAt }
424
+ if (!resolverResponse || !wantedRecords)
425
+ return { isMigrated, createdAt, decryptedName }
422
426
 
423
427
  Object.keys(wantedRecords).forEach((key: string) => {
424
428
  const data = wantedRecords[key as keyof ProfileOptions]
@@ -433,6 +437,7 @@ const graphFetch = async (
433
437
 
434
438
  return {
435
439
  ...returnedRecords,
440
+ decryptedName,
436
441
  isMigrated,
437
442
  createdAt,
438
443
  }
@@ -486,6 +491,7 @@ const getProfileFromName = async (
486
491
  )
487
492
  let isMigrated: boolean | null = null
488
493
  let createdAt: string | null = null
494
+ let decryptedName: string | null = null
489
495
  let result: Awaited<ReturnType<typeof getDataForName>> | null = null
490
496
  if (!graphResult) {
491
497
  if (!fallback) return
@@ -506,13 +512,16 @@ const getProfileFromName = async (
506
512
  const {
507
513
  isMigrated: _isMigrated,
508
514
  createdAt: _createdAt,
515
+ decryptedName: _decryptedName,
509
516
  ...wantedRecords
510
517
  }: {
511
518
  isMigrated: boolean
512
519
  createdAt: string
520
+ decryptedName: string
513
521
  } & InternalProfileOptions = graphResult
514
522
  isMigrated = _isMigrated
515
523
  createdAt = _createdAt
524
+ decryptedName = _decryptedName
516
525
  let recordsWithFallback = usingOptions
517
526
  ? wantedRecords
518
527
  : (_options as InternalProfileOptions)
@@ -547,7 +556,7 @@ const getProfileFromName = async (
547
556
  ? "Records fetch didn't complete"
548
557
  : "Name doesn't have a resolver",
549
558
  }
550
- return { ...result, isMigrated, createdAt, message: undefined }
559
+ return { ...result, isMigrated, createdAt, decryptedName, message: undefined }
551
560
  }
552
561
 
553
562
  const getProfileFromAddress = async (
@@ -1,4 +1,3 @@
1
- import { BigNumber } from 'ethers'
2
1
  import { ENS } from '../index'
3
2
  import setup from '../tests/setup'
4
3
 
@@ -7,22 +6,6 @@ let revert: Awaited<ReturnType<typeof setup>>['revert']
7
6
  let createSnapshot: Awaited<ReturnType<typeof setup>>['createSnapshot']
8
7
  let withWrappedSnapshot: any
9
8
 
10
- const unwrappedNameDefault = {
11
- expiryDate: new Date(0).toString(),
12
- fuseObj: {
13
- CANNOT_BURN_FUSES: false,
14
- CANNOT_CREATE_SUBDOMAIN: false,
15
- CANNOT_SET_RESOLVER: false,
16
- CANNOT_SET_TTL: false,
17
- CANNOT_TRANSFER: false,
18
- CANNOT_UNWRAP: false,
19
- PARENT_CANNOT_CONTROL: false,
20
- CAN_DO_EVERYTHING: true,
21
- },
22
- owner: '0x0000000000000000000000000000000000000000',
23
- rawFuses: BigNumber.from(0),
24
- }
25
-
26
9
  beforeAll(async () => {
27
10
  ;({ ensInstance, revert, createSnapshot } = await setup())
28
11
 
@@ -41,9 +24,9 @@ afterAll(async () => {
41
24
  describe('getWrapperData', () => {
42
25
  it('should return default data for an unwrapped name', async () => {
43
26
  const result = await ensInstance.getWrapperData('with-profile.eth')
44
- expect({ ...result, expiryDate: result?.expiryDate.toString() }).toEqual(
45
- unwrappedNameDefault,
46
- )
27
+ expect(result?.expiryDate).toBeUndefined()
28
+ expect(result?.rawFuses).toEqual(0)
29
+ expect(result?.child.CAN_DO_EVERYTHING).toBeTruthy()
47
30
  })
48
31
  it('should return with CAN_DO_EVERYTHING set to true for a name with no fuses burned', async () => {
49
32
  const result = await ensInstance.getWrapperData(
@@ -51,23 +34,13 @@ describe('getWrapperData', () => {
51
34
  )
52
35
  expect(result).toBeTruthy()
53
36
  if (result) {
54
- expect(result.fuseObj.CAN_DO_EVERYTHING).toBe(true)
55
- expect(
56
- Object.values(result.fuseObj).reduce(
57
- (prev, curr) => (curr ? prev + 1 : prev),
58
- 0,
59
- ),
60
- ).toBe(1)
61
- expect(result.rawFuses.toHexString()).toBe('0x00')
37
+ expect(result.child.CAN_DO_EVERYTHING).toBe(true)
38
+ expect(result.rawFuses).toBe(0)
62
39
  }
63
40
  })
64
41
  it('should return with other correct fuses', async () => {
65
- const tx = await ensInstance.burnFuses('wrapped.eth', {
66
- namedFusesToBurn: [
67
- 'CANNOT_UNWRAP',
68
- 'CANNOT_CREATE_SUBDOMAIN',
69
- 'CANNOT_SET_TTL',
70
- ],
42
+ const tx = await ensInstance.setFuses('wrapped.eth', {
43
+ named: ['CANNOT_UNWRAP', 'CANNOT_CREATE_SUBDOMAIN', 'CANNOT_SET_TTL'],
71
44
  addressOrIndex: 1,
72
45
  })
73
46
  await tx.wait()
@@ -75,17 +48,10 @@ describe('getWrapperData', () => {
75
48
  const result = await ensInstance.getWrapperData('wrapped.eth')
76
49
  expect(result).toBeTruthy()
77
50
  if (result) {
78
- expect(result.fuseObj).toMatchObject({
79
- CANNOT_UNWRAP: true,
80
- CANNOT_BURN_FUSES: false,
81
- CANNOT_TRANSFER: false,
82
- CANNOT_SET_RESOLVER: false,
83
- CANNOT_SET_TTL: true,
84
- CANNOT_CREATE_SUBDOMAIN: true,
85
- PARENT_CANNOT_CONTROL: true,
86
- CAN_DO_EVERYTHING: false,
87
- })
88
- expect(result.rawFuses.toHexString()).toBe('0x71')
51
+ expect(result.child.CAN_DO_EVERYTHING).toBe(false)
52
+ expect(result.child.CANNOT_UNWRAP).toBe(true)
53
+ expect(result.child.CANNOT_CREATE_SUBDOMAIN).toBe(true)
54
+ expect(result.child.CANNOT_SET_TTL).toBe(true)
89
55
  }
90
56
  })
91
57
  it('should return correct expiry', async () => {
@@ -1,4 +1,4 @@
1
- import { BigNumber } from '@ethersproject/bignumber/lib/bignumber'
1
+ import { BigNumber } from '@ethersproject/bignumber'
2
2
  import { ENSArgs } from '../index'
3
3
  import { decodeFuses } from '../utils/fuses'
4
4
  import { namehash } from '../utils/normalise'
@@ -14,18 +14,20 @@ const raw = async ({ contracts }: ENSArgs<'contracts'>, name: string) => {
14
14
  const decode = async ({ contracts }: ENSArgs<'contracts'>, data: string) => {
15
15
  const nameWrapper = await contracts?.getNameWrapper()!
16
16
  try {
17
- const [owner, _fuses, expiry] = nameWrapper.interface.decodeFunctionResult(
17
+ const [owner, fuses, expiry] = nameWrapper.interface.decodeFunctionResult(
18
18
  'getData',
19
19
  data,
20
- )
20
+ ) as [string, number, BigNumber]
21
21
 
22
- const fuses = BigNumber.from(_fuses)
23
22
  const fuseObj = decodeFuses(fuses)
24
23
 
25
- const expiryDate = new Date(expiry * 1000)
24
+ const expiryDate =
25
+ expiry.gt(0) && expiry.lt(BigNumber.from(2).pow(32))
26
+ ? new Date(expiry.mul(1000).toString())
27
+ : undefined
26
28
 
27
29
  return {
28
- fuseObj,
30
+ ...fuseObj,
29
31
  expiryDate,
30
32
  rawFuses: fuses,
31
33
  owner,
@@ -23,6 +23,8 @@ describe('registerName', () => {
23
23
  await revert()
24
24
  })
25
25
  it('should return a registration transaction and succeed', async () => {
26
+ const controller = await ensInstance.contracts!.getEthRegistrarController()!
27
+
26
28
  const name = 'cool-swag.eth'
27
29
  const duration = 31536000
28
30
  const { customData, ...commitPopTx } =
@@ -37,14 +39,12 @@ describe('registerName', () => {
37
39
  await provider.send('evm_increaseTime', [60])
38
40
  await provider.send('evm_mine', [])
39
41
 
40
- const { secret, wrapperExpiry } = customData!
42
+ const { secret } = customData!
41
43
 
42
- const controller = await ensInstance.contracts!.getEthRegistrarController()!
43
44
  const [price] = await controller.rentPrice(name, duration)
44
45
 
45
46
  const tx = await ensInstance.registerName(name, {
46
47
  secret,
47
- wrapperExpiry,
48
48
  duration,
49
49
  owner: accounts[1],
50
50
  addressOrIndex: accounts[1],
@@ -1,4 +1,4 @@
1
- import { BigNumber } from '@ethersproject/bignumber/lib/bignumber'
1
+ import { BigNumber } from '@ethersproject/bignumber'
2
2
  import { ENSArgs } from '..'
3
3
  import {
4
4
  BaseRegistrationParams,