@ensdomains/ensjs 4.0.1 → 4.0.2-alpha.5

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 (45) hide show
  1. package/dist/cjs/clients/decorators/public.js.map +1 -1
  2. package/dist/cjs/errors/version.js +1 -1
  3. package/dist/cjs/errors/version.js.map +1 -1
  4. package/dist/cjs/functions/public/getRecords.js.map +1 -1
  5. package/dist/cjs/functions/subgraph/filters.js +109 -0
  6. package/dist/cjs/functions/subgraph/filters.js.map +1 -1
  7. package/dist/cjs/functions/subgraph/getNamesForAddress.js +6 -27
  8. package/dist/cjs/functions/subgraph/getNamesForAddress.js.map +1 -1
  9. package/dist/cjs/functions/subgraph/getSubnames.js +7 -29
  10. package/dist/cjs/functions/subgraph/getSubnames.js.map +1 -1
  11. package/dist/esm/clients/decorators/public.js.map +1 -1
  12. package/dist/esm/errors/version.js +1 -1
  13. package/dist/esm/errors/version.js.map +1 -1
  14. package/dist/esm/functions/public/getRecords.js +3 -5
  15. package/dist/esm/functions/public/getRecords.js.map +1 -1
  16. package/dist/esm/functions/subgraph/filters.js +107 -1
  17. package/dist/esm/functions/subgraph/filters.js.map +1 -1
  18. package/dist/esm/functions/subgraph/getNamesForAddress.js +7 -28
  19. package/dist/esm/functions/subgraph/getNamesForAddress.js.map +1 -1
  20. package/dist/esm/functions/subgraph/getSubnames.js +8 -30
  21. package/dist/esm/functions/subgraph/getSubnames.js.map +1 -1
  22. package/dist/types/clients/decorators/public.d.ts +3 -5
  23. package/dist/types/clients/decorators/public.d.ts.map +1 -1
  24. package/dist/types/clients/decorators/wallet.d.ts +2104 -296
  25. package/dist/types/clients/decorators/wallet.d.ts.map +1 -1
  26. package/dist/types/clients/wallet.d.ts +2121 -297
  27. package/dist/types/clients/wallet.d.ts.map +1 -1
  28. package/dist/types/errors/version.d.ts +1 -1
  29. package/dist/types/errors/version.d.ts.map +1 -1
  30. package/dist/types/functions/public/getRecords.d.ts +3 -5
  31. package/dist/types/functions/public/getRecords.d.ts.map +1 -1
  32. package/dist/types/functions/subgraph/filters.d.ts +9 -0
  33. package/dist/types/functions/subgraph/filters.d.ts.map +1 -1
  34. package/dist/types/functions/subgraph/getNamesForAddress.d.ts.map +1 -1
  35. package/dist/types/functions/subgraph/getSubnames.d.ts.map +1 -1
  36. package/package.json +3 -2
  37. package/src/clients/decorators/public.ts +3 -5
  38. package/src/errors/version.ts +1 -1
  39. package/src/functions/public/getRecords.ts +3 -5
  40. package/src/functions/subgraph/filters.ts +146 -0
  41. package/src/functions/subgraph/getNamesForAddress.ts +12 -31
  42. package/src/functions/subgraph/getSubnames.ts +12 -36
  43. package/utils/legacyNameGenerator.cjs +73 -0
  44. package/utils/nonceManager.cjs +26 -0
  45. package/utils/wrappedNameGenerator.cjs +101 -0
@@ -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
+ }