@ensdomains/ensjs 3.0.0-alpha.46 → 3.0.0-alpha.48

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.
@@ -59,7 +59,6 @@ describe('getWrapperData', () => {
59
59
  const result = await ensInstance.getWrapperData('wrapped.eth')
60
60
  expect(result).toBeTruthy()
61
61
  if (result) {
62
- console.log(result.expiryDate)
63
62
  expect(result.expiryDate).toBeInstanceOf(Date)
64
63
  expect(Number.isNaN(result.expiryDate?.getTime())).toBe(false)
65
64
  }
@@ -17,10 +17,11 @@ afterAll(async () => {
17
17
  await revert()
18
18
  })
19
19
 
20
+ beforeEach(async () => {
21
+ await revert()
22
+ })
23
+
20
24
  describe('transferSubname', () => {
21
- beforeEach(async () => {
22
- await revert()
23
- })
24
25
  it('should allow transferring a subname on the registry', async () => {
25
26
  const tx = await ensInstance.transferSubname('test.with-subnames.eth', {
26
27
  contract: 'registry',
@@ -34,22 +35,123 @@ describe('transferSubname', () => {
34
35
  const result = await registry.owner(namehash('test.with-subnames.eth'))
35
36
  expect(result).toBe(accounts[1])
36
37
  })
37
- it('should allow transferring a subname on the nameWrapper', async () => {
38
- const tx = await ensInstance.transferSubname(
39
- 'test.wrapped-with-subnames.eth',
40
- {
41
- contract: 'nameWrapper',
42
- owner: accounts[1],
38
+
39
+ describe('wrapped name with PCC NOT burned', () => {
40
+ it('should NOT allow transferring a subname by name owner', async () => {
41
+ const nameWrapper = await ensInstance.contracts!.getNameWrapper()!
42
+ await expect(
43
+ ensInstance.transferSubname('test.wrapped-with-subnames.eth', {
44
+ contract: 'nameWrapper',
45
+ owner: accounts[1],
46
+ addressOrIndex: 2,
47
+ }),
48
+ ).rejects.toThrow()
49
+
50
+ const result = await nameWrapper.ownerOf(
51
+ namehash('test.wrapped-with-subnames.eth'),
52
+ )
53
+ expect(result).toBe(accounts[2])
54
+ })
55
+
56
+ it('should allow transferring a subname by parent owner', async () => {
57
+ const tx = await ensInstance.transferSubname(
58
+ 'test.wrapped-with-subnames.eth',
59
+ {
60
+ contract: 'nameWrapper',
61
+ owner: accounts[1],
62
+ addressOrIndex: 1,
63
+ },
64
+ )
65
+ expect(tx).toBeTruthy()
66
+ await tx.wait()
67
+
68
+ const nameWrapper = await ensInstance.contracts!.getNameWrapper()!
69
+ const result = await nameWrapper.ownerOf(
70
+ namehash('test.wrapped-with-subnames.eth'),
71
+ )
72
+ expect(result).toBe(accounts[1])
73
+ })
74
+ })
75
+
76
+ describe('wrapped name with PCC burned', () => {
77
+ beforeEach(async () => {
78
+ const tx0 = await ensInstance.setFuses('wrapped-with-subnames.eth', {
79
+ named: ['CANNOT_UNWRAP'],
43
80
  addressOrIndex: 1,
44
- },
45
- )
46
- expect(tx).toBeTruthy()
47
- await tx.wait()
81
+ })
82
+ expect(tx0).toBeTruthy()
83
+ await tx0.wait()
84
+ })
48
85
 
49
- const nameWrapper = await ensInstance.contracts!.getNameWrapper()!
50
- const result = await nameWrapper.ownerOf(
51
- namehash('test.wrapped-with-subnames.eth'),
52
- )
53
- expect(result).toBe(accounts[1])
86
+ it('should NOT allow transferring a subname by name owner', async () => {
87
+ const nameWrapper = await ensInstance.contracts!.getNameWrapper()!
88
+
89
+ const tx1 = await ensInstance.setChildFuses(
90
+ 'test.wrapped-with-subnames.eth',
91
+ {
92
+ fuses: {
93
+ parent: {
94
+ named: ['PARENT_CANNOT_CONTROL'],
95
+ },
96
+ },
97
+ addressOrIndex: 1,
98
+ },
99
+ )
100
+ expect(tx1).toBeTruthy()
101
+ await tx1.wait()
102
+
103
+ const checkOwner = await nameWrapper.ownerOf(
104
+ namehash('test.wrapped-with-subnames.eth'),
105
+ )
106
+ expect(checkOwner).toBe(accounts[2])
107
+
108
+ await expect(
109
+ ensInstance.transferSubname('test.wrapped-with-subnames.eth', {
110
+ contract: 'nameWrapper',
111
+ owner: accounts[1],
112
+ addressOrIndex: 2,
113
+ }),
114
+ ).rejects.toThrow()
115
+ const result = await nameWrapper.ownerOf(
116
+ namehash('test.wrapped-with-subnames.eth'),
117
+ )
118
+ expect(result).toBe(accounts[2])
119
+ })
120
+
121
+ it('should NOT allow transferring a subname by parent owner', async () => {
122
+ const nameWrapper = await ensInstance.contracts!.getNameWrapper()!
123
+
124
+ const tx1 = await ensInstance.setChildFuses(
125
+ 'test.wrapped-with-subnames.eth',
126
+ {
127
+ fuses: {
128
+ parent: {
129
+ named: ['PARENT_CANNOT_CONTROL'],
130
+ },
131
+ },
132
+ addressOrIndex: 1,
133
+ },
134
+ )
135
+ expect(tx1).toBeTruthy()
136
+ await tx1.wait()
137
+
138
+ const checkOwner = await nameWrapper.ownerOf(
139
+ namehash('test.wrapped-with-subnames.eth'),
140
+ )
141
+ expect(checkOwner).toBe(accounts[2])
142
+
143
+ await expect(
144
+ ensInstance.transferSubname('test.wrapped-with-subnames.eth', {
145
+ contract: 'nameWrapper',
146
+ owner: accounts[1],
147
+ addressOrIndex: 1,
148
+ }),
149
+ ).rejects.toThrow()
150
+
151
+ const result = await nameWrapper.ownerOf(
152
+ namehash('test.wrapped-with-subnames.eth'),
153
+ )
154
+ expect(result).toBe(accounts[2])
155
+ })
54
156
  })
55
157
  })
@@ -1,7 +1,7 @@
1
1
  import { keccak256 as solidityKeccak256 } from '@ethersproject/solidity'
2
2
  import { ENSArgs } from '..'
3
3
  import { namehash } from '../utils/normalise'
4
- import { Expiry, makeExpiry } from '../utils/wrapper'
4
+ import { expiryToBigNumber, Expiry } from '../utils/wrapper'
5
5
 
6
6
  type BaseArgs = {
7
7
  owner: string
@@ -17,11 +17,7 @@ type NameWrapperArgs = {
17
17
  type Args = BaseArgs | NameWrapperArgs
18
18
 
19
19
  export default async function (
20
- {
21
- contracts,
22
- signer,
23
- getExpiry,
24
- }: ENSArgs<'contracts' | 'signer' | 'getExpiry'>,
20
+ { contracts, signer }: ENSArgs<'contracts' | 'signer'>,
25
21
  name: string,
26
22
  { contract, owner, resolverAddress, ...wrapperArgs }: Args,
27
23
  ) {
@@ -42,10 +38,9 @@ export default async function (
42
38
  }
43
39
  case 'nameWrapper': {
44
40
  const nameWrapper = (await contracts!.getNameWrapper()!).connect(signer)
45
- const expiry = await makeExpiry(
46
- { getExpiry },
47
- labels.join('.'),
48
- 'expiry' in wrapperArgs ? wrapperArgs.expiry : undefined,
41
+ const expiry = expiryToBigNumber(
42
+ (wrapperArgs as NameWrapperArgs).expiry,
43
+ 0,
49
44
  )
50
45
 
51
46
  return nameWrapper.populateTransaction.setSubnodeOwner(
package/src/index.ts CHANGED
@@ -625,7 +625,7 @@ export class ENS {
625
625
 
626
626
  public transferSubname = this.generateWriteFunction<
627
627
  FunctionTypes['transferSubname']
628
- >('transferSubname', ['contracts', 'getExpiry'])
628
+ >('transferSubname', ['contracts'])
629
629
 
630
630
  public commitName = this.generateWriteFunction<FunctionTypes['commitName']>(
631
631
  'commitName',
@@ -0,0 +1,14 @@
1
+ import { ENSArgs } from '../index'
2
+ import { namehash } from './normalise'
3
+
4
+ export const makeResolver = async (
5
+ { contracts }: ENSArgs<'contracts'>,
6
+ name: string,
7
+ resolver?: string,
8
+ ) => {
9
+ if (resolver) return resolver
10
+ const registry = await contracts!.getRegistry()
11
+ const node = namehash(name)
12
+ const _resolver = await registry.resolver(node)
13
+ return _resolver
14
+ }
@@ -6,20 +6,23 @@ export type Expiry = string | number | Date | BigNumber
6
6
 
7
7
  export const MAX_EXPIRY = BigNumber.from(2).pow(64).sub(1)
8
8
 
9
+ export const expiryToBigNumber = (expiry?: Expiry, defaultValue = 0) => {
10
+ if (!expiry) return BigNumber.from(defaultValue)
11
+ if (expiry instanceof Date) {
12
+ return BigNumber.from(expiry.getTime() / 1000)
13
+ }
14
+ if (expiry instanceof BigNumber) {
15
+ return expiry
16
+ }
17
+ return BigNumber.from(expiry)
18
+ }
19
+
9
20
  export const makeExpiry = async (
10
21
  { getExpiry }: ENSArgs<'getExpiry'>,
11
22
  name: string,
12
23
  expiry?: Expiry,
13
24
  ) => {
14
- if (expiry) {
15
- if (expiry instanceof Date) {
16
- return BigNumber.from(expiry.getTime() / 1000)
17
- }
18
- if (expiry instanceof BigNumber) {
19
- return expiry
20
- }
21
- return BigNumber.from(expiry)
22
- }
25
+ if (expiry) return expiryToBigNumber(expiry)
23
26
  if (name.endsWith('.eth')) {
24
27
  const expResponse = await getExpiry(name)
25
28
  if (!expResponse?.expiry)