@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.
- package/dist/cjs/clients/decorators/public.js.map +1 -1
- package/dist/cjs/contracts/consts.js +6 -6
- package/dist/cjs/errors/version.js +1 -1
- package/dist/cjs/errors/version.js.map +1 -1
- package/dist/cjs/functions/public/getRecords.js.map +1 -1
- package/dist/cjs/functions/subgraph/filters.js +109 -0
- package/dist/cjs/functions/subgraph/filters.js.map +1 -1
- package/dist/cjs/functions/subgraph/getNamesForAddress.js +6 -27
- package/dist/cjs/functions/subgraph/getNamesForAddress.js.map +1 -1
- package/dist/cjs/functions/subgraph/getSubnames.js +7 -29
- package/dist/cjs/functions/subgraph/getSubnames.js.map +1 -1
- package/dist/esm/clients/decorators/public.js.map +1 -1
- package/dist/esm/contracts/consts.js +6 -6
- package/dist/esm/errors/version.js +1 -1
- package/dist/esm/errors/version.js.map +1 -1
- package/dist/esm/functions/public/getRecords.js +3 -5
- package/dist/esm/functions/public/getRecords.js.map +1 -1
- package/dist/esm/functions/subgraph/filters.js +107 -1
- package/dist/esm/functions/subgraph/filters.js.map +1 -1
- package/dist/esm/functions/subgraph/getNamesForAddress.js +7 -28
- package/dist/esm/functions/subgraph/getNamesForAddress.js.map +1 -1
- package/dist/esm/functions/subgraph/getSubnames.js +8 -30
- package/dist/esm/functions/subgraph/getSubnames.js.map +1 -1
- package/dist/types/clients/decorators/public.d.ts +3 -5
- package/dist/types/clients/decorators/public.d.ts.map +1 -1
- package/dist/types/clients/decorators/wallet.d.ts +2104 -296
- package/dist/types/clients/decorators/wallet.d.ts.map +1 -1
- package/dist/types/clients/wallet.d.ts +2121 -297
- package/dist/types/clients/wallet.d.ts.map +1 -1
- package/dist/types/contracts/consts.d.ts +6 -6
- package/dist/types/errors/version.d.ts +1 -1
- package/dist/types/errors/version.d.ts.map +1 -1
- package/dist/types/functions/public/getRecords.d.ts +3 -5
- package/dist/types/functions/public/getRecords.d.ts.map +1 -1
- package/dist/types/functions/subgraph/filters.d.ts +9 -0
- package/dist/types/functions/subgraph/filters.d.ts.map +1 -1
- package/dist/types/functions/subgraph/getNamesForAddress.d.ts.map +1 -1
- package/dist/types/functions/subgraph/getSubnames.d.ts.map +1 -1
- package/package.json +3 -2
- package/src/clients/decorators/public.ts +3 -5
- package/src/contracts/consts.ts +6 -6
- package/src/errors/version.ts +1 -1
- package/src/functions/public/getRecords.ts +3 -5
- package/src/functions/subgraph/filters.ts +146 -0
- package/src/functions/subgraph/getNamesForAddress.ts +12 -31
- package/src/functions/subgraph/getSubnames.ts +12 -36
- package/utils/legacyNameGenerator.cjs +73 -0
- package/utils/nonceManager.cjs +26 -0
- 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
|
|
10
|
+
import { EMPTY_ADDRESS } from '../../utils/consts.js'
|
|
11
11
|
import { createSubgraphClient } from './client.js'
|
|
12
|
-
import
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
+
}
|