@ensdomains/ensjs 4.0.1 → 4.0.2

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 (49) hide show
  1. package/dist/cjs/clients/decorators/public.js.map +1 -1
  2. package/dist/cjs/contracts/consts.js +6 -6
  3. package/dist/cjs/errors/version.js +1 -1
  4. package/dist/cjs/errors/version.js.map +1 -1
  5. package/dist/cjs/functions/public/getRecords.js.map +1 -1
  6. package/dist/cjs/functions/subgraph/filters.js +109 -0
  7. package/dist/cjs/functions/subgraph/filters.js.map +1 -1
  8. package/dist/cjs/functions/subgraph/getNamesForAddress.js +6 -27
  9. package/dist/cjs/functions/subgraph/getNamesForAddress.js.map +1 -1
  10. package/dist/cjs/functions/subgraph/getSubnames.js +7 -29
  11. package/dist/cjs/functions/subgraph/getSubnames.js.map +1 -1
  12. package/dist/esm/clients/decorators/public.js.map +1 -1
  13. package/dist/esm/contracts/consts.js +6 -6
  14. package/dist/esm/errors/version.js +1 -1
  15. package/dist/esm/errors/version.js.map +1 -1
  16. package/dist/esm/functions/public/getRecords.js +3 -5
  17. package/dist/esm/functions/public/getRecords.js.map +1 -1
  18. package/dist/esm/functions/subgraph/filters.js +107 -1
  19. package/dist/esm/functions/subgraph/filters.js.map +1 -1
  20. package/dist/esm/functions/subgraph/getNamesForAddress.js +7 -28
  21. package/dist/esm/functions/subgraph/getNamesForAddress.js.map +1 -1
  22. package/dist/esm/functions/subgraph/getSubnames.js +8 -30
  23. package/dist/esm/functions/subgraph/getSubnames.js.map +1 -1
  24. package/dist/types/clients/decorators/public.d.ts +3 -5
  25. package/dist/types/clients/decorators/public.d.ts.map +1 -1
  26. package/dist/types/clients/decorators/wallet.d.ts +2104 -296
  27. package/dist/types/clients/decorators/wallet.d.ts.map +1 -1
  28. package/dist/types/clients/wallet.d.ts +2121 -297
  29. package/dist/types/clients/wallet.d.ts.map +1 -1
  30. package/dist/types/contracts/consts.d.ts +6 -6
  31. package/dist/types/errors/version.d.ts +1 -1
  32. package/dist/types/errors/version.d.ts.map +1 -1
  33. package/dist/types/functions/public/getRecords.d.ts +3 -5
  34. package/dist/types/functions/public/getRecords.d.ts.map +1 -1
  35. package/dist/types/functions/subgraph/filters.d.ts +9 -0
  36. package/dist/types/functions/subgraph/filters.d.ts.map +1 -1
  37. package/dist/types/functions/subgraph/getNamesForAddress.d.ts.map +1 -1
  38. package/dist/types/functions/subgraph/getSubnames.d.ts.map +1 -1
  39. package/package.json +3 -2
  40. package/src/clients/decorators/public.ts +3 -5
  41. package/src/contracts/consts.ts +6 -6
  42. package/src/errors/version.ts +1 -1
  43. package/src/functions/public/getRecords.ts +3 -5
  44. package/src/functions/subgraph/filters.ts +146 -0
  45. package/src/functions/subgraph/getNamesForAddress.ts +12 -31
  46. package/src/functions/subgraph/getSubnames.ts +12 -36
  47. package/utils/legacyNameGenerator.cjs +73 -0
  48. package/utils/nonceManager.cjs +26 -0
  49. package/utils/wrappedNameGenerator.cjs +101 -0
@@ -7,9 +7,13 @@ import {
7
7
  InvalidFilterKeyError,
8
8
  InvalidOrderByError,
9
9
  } from '../../errors/subgraph.js'
10
- import { EMPTY_ADDRESS, GRACE_PERIOD_SECONDS } from '../../utils/consts.js'
10
+ import { EMPTY_ADDRESS } from '../../utils/consts.js'
11
11
  import { createSubgraphClient } from './client.js'
12
- import type { DomainFilter } from './filters.js'
12
+ import {
13
+ getExpiryDateOrderFilter,
14
+ type DomainFilter,
15
+ getCreatedAtOrderFilter,
16
+ } from './filters.js'
13
17
  import {
14
18
  domainDetailsFragment,
15
19
  registrationDetailsFragment,
@@ -92,34 +96,12 @@ const getOrderByFilter = ({
92
96
  >): DomainFilter => {
93
97
  const lastDomain = previousPage[previousPage.length - 1]
94
98
  const operator = orderDirection === 'asc' ? 'gt' : 'lt'
95
-
96
99
  switch (orderBy) {
97
100
  case 'expiryDate': {
98
- let lastExpiryDate = lastDomain.expiryDate?.value
99
- ? lastDomain.expiryDate.value / 1000
100
- : 0
101
- if (lastDomain.parentName === 'eth') {
102
- lastExpiryDate += GRACE_PERIOD_SECONDS
103
- }
104
-
105
- if (orderDirection === 'asc' && lastExpiryDate === 0) {
106
- return {
107
- and: [{ expiryDate: null }, { [`id_${operator}`]: lastDomain.id }],
108
- }
109
- }
110
- if (orderDirection === 'desc' && lastExpiryDate !== 0) {
111
- return {
112
- [`expiryDate_${operator}`]: `${lastExpiryDate}`,
113
- }
114
- }
115
- return {
116
- or: [
117
- {
118
- [`expiryDate_${operator}`]: `${lastExpiryDate}`,
119
- },
120
- { expiryDate: null },
121
- ],
122
- }
101
+ return getExpiryDateOrderFilter({
102
+ orderDirection,
103
+ lastDomain,
104
+ })
123
105
  }
124
106
  case 'name': {
125
107
  return {
@@ -132,9 +114,7 @@ const getOrderByFilter = ({
132
114
  }
133
115
  }
134
116
  case 'createdAt': {
135
- return {
136
- [`createdAt_${operator}`]: `${lastDomain.createdAt.value / 1000}`,
137
- }
117
+ return getCreatedAtOrderFilter({ lastDomain, orderDirection })
138
118
  }
139
119
  default:
140
120
  throw new InvalidOrderByError({
@@ -195,6 +175,7 @@ const getNamesForAddress = async (
195
175
  searchType,
196
176
  ...filters
197
177
  } = filter
178
+
198
179
  const ownerWhereFilters: DomainFilter[] = Object.entries(filters).reduce(
199
180
  (prev, [key, value]) => {
200
181
  if (value) {
@@ -2,10 +2,14 @@
2
2
  import { gql } from 'graphql-request'
3
3
  import type { ClientWithEns } from '../../contracts/consts.js'
4
4
  import { InvalidOrderByError } from '../../errors/subgraph.js'
5
- import { EMPTY_ADDRESS, GRACE_PERIOD_SECONDS } from '../../utils/consts.js'
5
+ import { EMPTY_ADDRESS } from '../../utils/consts.js'
6
6
  import { namehash } from '../../utils/normalise.js'
7
7
  import { createSubgraphClient } from './client.js'
8
- import type { DomainFilter } from './filters.js'
8
+ import {
9
+ getExpiryDateOrderFilter,
10
+ type DomainFilter,
11
+ getCreatedAtOrderFilter,
12
+ } from './filters.js'
9
13
  import {
10
14
  domainDetailsWithoutParentFragment,
11
15
  registrationDetailsFragment,
@@ -44,46 +48,21 @@ type SubgraphResult = {
44
48
  }
45
49
 
46
50
  const getOrderByFilter = ({
47
- name,
48
51
  orderBy,
49
52
  orderDirection,
50
53
  previousPage,
51
54
  }: Required<
52
- Pick<
53
- GetSubnamesParameters,
54
- 'name' | 'orderBy' | 'orderDirection' | 'previousPage'
55
- >
55
+ Pick<GetSubnamesParameters, 'orderBy' | 'orderDirection' | 'previousPage'>
56
56
  >): DomainFilter => {
57
57
  const lastDomain = previousPage[previousPage.length - 1]
58
58
  const operator = orderDirection === 'asc' ? 'gt' : 'lt'
59
59
 
60
60
  switch (orderBy) {
61
61
  case 'expiryDate': {
62
- let lastExpiryDate = lastDomain.expiryDate?.value
63
- ? lastDomain.expiryDate.value / 1000
64
- : 0
65
- if (name === 'eth' && lastExpiryDate) {
66
- lastExpiryDate += GRACE_PERIOD_SECONDS
67
- }
68
-
69
- if (orderDirection === 'asc' && lastExpiryDate === 0) {
70
- return {
71
- and: [{ expiryDate: null }, { [`id_${operator}`]: lastDomain.id }],
72
- }
73
- }
74
- if (orderDirection === 'desc' && lastExpiryDate !== 0) {
75
- return {
76
- [`expiryDate_${operator}`]: `${lastExpiryDate}`,
77
- }
78
- }
79
- return {
80
- or: [
81
- {
82
- [`expiryDate_${operator}`]: `${lastExpiryDate}`,
83
- },
84
- { expiryDate: null },
85
- ],
86
- }
62
+ return getExpiryDateOrderFilter({
63
+ lastDomain,
64
+ orderDirection,
65
+ })
87
66
  }
88
67
  case 'name': {
89
68
  return {
@@ -96,9 +75,7 @@ const getOrderByFilter = ({
96
75
  }
97
76
  }
98
77
  case 'createdAt': {
99
- return {
100
- [`createdAt_${operator}`]: `${lastDomain.createdAt.value / 1000}`,
101
- }
78
+ return getCreatedAtOrderFilter({ lastDomain, orderDirection })
102
79
  }
103
80
  default:
104
81
  throw new InvalidOrderByError({
@@ -146,7 +123,6 @@ const getSubnames = async (
146
123
  if (previousPage?.length) {
147
124
  whereFilters.push(
148
125
  getOrderByFilter({
149
- name,
150
126
  orderBy,
151
127
  orderDirection,
152
128
  previousPage,
@@ -0,0 +1,73 @@
1
+ /* eslint-disable import/no-extraneous-dependencies */
2
+ const { namehash, labelhash } = require('viem')
3
+
4
+ const makeNameGenerator = async (hre, optionalNonceManager) => {
5
+ const { getNamedAccounts } = hre
6
+ const allNamedAccts = await getNamedAccounts()
7
+ const controller = await ethers.getContract('LegacyETHRegistrarController')
8
+ const publicResolver = await ethers.getContract('LegacyPublicResolver')
9
+ const registry = await ethers.getContract('ENSRegistry')
10
+ const nonceManager = optionalNonceManager ?? { getNonce: () => undefined}
11
+
12
+ return {
13
+ commit: async ({ label, namedOwner, namedAddr }) => {
14
+ const secret =
15
+ '0x0000000000000000000000000000000000000000000000000000000000000000'
16
+ const registrant = allNamedAccts[namedOwner]
17
+ const resolver = publicResolver.address
18
+ const addr = allNamedAccts[namedAddr]
19
+
20
+ const commitment = await controller.makeCommitmentWithConfig(
21
+ label,
22
+ registrant,
23
+ secret,
24
+ resolver,
25
+ addr,
26
+ )
27
+
28
+ const _controller = controller.connect(await ethers.getSigner(registrant))
29
+ return _controller.commit(commitment, {nonce: nonceManager.getNonce(namedOwner)})
30
+ },
31
+ register: async ({ label, namedOwner, namedAddr, duration = 31536000 }) => {
32
+ const secret =
33
+ '0x0000000000000000000000000000000000000000000000000000000000000000'
34
+ const registrant = allNamedAccts[namedOwner]
35
+ const resolver = publicResolver.address
36
+ const addr = allNamedAccts[namedAddr]
37
+ const price = await controller.rentPrice(label, duration)
38
+ const _controller = controller.connect(await ethers.getSigner(registrant))
39
+ return _controller.registerWithConfig(
40
+ label,
41
+ registrant,
42
+ duration,
43
+ secret,
44
+ resolver,
45
+ addr,
46
+ {
47
+ value: price,
48
+ nonce: nonceManager.getNonce(namedOwner),
49
+ },
50
+ )
51
+ },
52
+ subname: async ({ label, namedOwner, subnameLabel, namedSubnameOwner }) => {
53
+ console.log(`Setting subnames for ${label}.eth...`)
54
+ const resolver = publicResolver.address
55
+ const registrant = allNamedAccts[namedOwner]
56
+ const owner = allNamedAccts[namedSubnameOwner]
57
+ const _registry = registry.connect(await ethers.getSigner(registrant))
58
+ return _registry.setSubnodeRecord(
59
+ namehash(`${label}.eth`),
60
+ labelhash(subnameLabel),
61
+ owner,
62
+ resolver,
63
+ '0',
64
+ )
65
+ },
66
+ setSubnameRecords: async () => {},
67
+ configure: async () => {},
68
+ }
69
+ }
70
+
71
+ module.exports = {
72
+ makeNameGenerator,
73
+ }
@@ -0,0 +1,26 @@
1
+ /* eslint-disable import/no-extraneous-dependencies */
2
+ const { hexToNumber, numberToHex} = require('viem')
3
+
4
+ const makeNonceManager = async (href) => {
5
+ const { getNamedAccounts, network } = href
6
+ const names = ['owner', 'owner2', 'owner3', 'owner4']
7
+ const allNamedAccts = await getNamedAccounts()
8
+ const startingNonces = await Promise.all(names.map((name) => network.provider.send('eth_getTransactionCount', [allNamedAccts[name], "latest"]).then(hexToNumber)))
9
+ const nonceMap = Object.fromEntries(names.map((name, i) => [name, startingNonces[i]]))
10
+
11
+ console.log('Nonce manager initialized', nonceMap)
12
+
13
+ return {
14
+ getNonce: (name) => {
15
+ const nonce = nonceMap[name]
16
+ nonceMap[name]++
17
+ return nonce
18
+ }
19
+ }
20
+
21
+
22
+ }
23
+
24
+ module.exports = {
25
+ makeNonceManager
26
+ }
@@ -0,0 +1,101 @@
1
+ /* eslint-disable import/no-extraneous-dependencies */
2
+
3
+ const { BigNumber } = require('ethers')
4
+ const { namehash } = require('viem/ens')
5
+
6
+ const makeNameGenerator = async (hre, optionalNonceManager) => {
7
+ const { getNamedAccounts } = hre
8
+ const allNamedAccts = await getNamedAccounts()
9
+ const controller = await ethers.getContract('ETHRegistrarController')
10
+ const publicResolver = await ethers.getContract('PublicResolver')
11
+ const nameWrapper = await ethers.getContract('NameWrapper')
12
+ const nonceManager = optionalNonceManager ?? { getNonce: () => undefined }
13
+
14
+ return {
15
+ commit: async ({
16
+ label,
17
+ namedOwner,
18
+ data = [],
19
+ reverseRecord = false,
20
+ fuses = 0,
21
+ duration = 31536000,
22
+ }) => {
23
+ const secret =
24
+ '0x0000000000000000000000000000000000000000000000000000000000000000'
25
+ const owner = allNamedAccts[namedOwner]
26
+ const resolver = publicResolver.address
27
+ const commitment = await controller.makeCommitment(
28
+ label,
29
+ owner,
30
+ duration,
31
+ secret,
32
+ resolver,
33
+ data,
34
+ reverseRecord,
35
+ fuses,
36
+ )
37
+
38
+ const _controller = controller.connect(await ethers.getSigner(owner))
39
+ return _controller.commit(commitment, {
40
+ nonce: nonceManager.getNonce(namedOwner),
41
+ })
42
+ },
43
+ register: async ({
44
+ label,
45
+ namedOwner,
46
+ data = [],
47
+ reverseRecord = false,
48
+ fuses = 0,
49
+ duration = 31536000,
50
+ }) => {
51
+ const secret =
52
+ '0x0000000000000000000000000000000000000000000000000000000000000000'
53
+ const owner = allNamedAccts[namedOwner]
54
+ const resolver = publicResolver.address
55
+ const [price] = await controller.rentPrice(label, duration)
56
+
57
+ const priceWithBuffer = BigNumber.from(price).mul(105).div(100)
58
+ const _controller = controller.connect(await ethers.getSigner(owner))
59
+ return _controller.register(
60
+ label,
61
+ owner,
62
+ duration,
63
+ secret,
64
+ resolver,
65
+ data,
66
+ reverseRecord,
67
+ fuses,
68
+ {
69
+ value: priceWithBuffer,
70
+ nonce: nonceManager.getNonce(namedOwner),
71
+ },
72
+ )
73
+ },
74
+ subname: async ({
75
+ label,
76
+ namedOwner,
77
+ subnameLabel,
78
+ namedSubnameOwner,
79
+ subnameFuses = 0,
80
+ subnameExpiry = BigNumber.from(2).pow(64).sub(1),
81
+ }) => {
82
+ const resolver = publicResolver.address
83
+ const owner = allNamedAccts[namedOwner]
84
+ const subnameOwner = allNamedAccts[namedSubnameOwner]
85
+ const _nameWrapper = nameWrapper.connect(await ethers.getSigner(owner))
86
+ return _nameWrapper.setSubnodeRecord(
87
+ namehash(`${label}.eth`),
88
+ subnameLabel,
89
+ subnameOwner,
90
+ resolver,
91
+ '0',
92
+ subnameFuses,
93
+ subnameExpiry,
94
+ )
95
+ },
96
+ }
97
+ }
98
+
99
+ module.exports = {
100
+ makeNameGenerator,
101
+ }