@ensdomains/ensjs 3.0.0-alpha.10 → 3.0.0-alpha.11
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/contracts/baseRegistrar.d.ts +1 -1
- package/dist/cjs/contracts/index.d.ts +3 -3
- package/dist/cjs/contracts/multicall.d.ts +1 -1
- package/dist/cjs/contracts/registry.d.ts +1 -1
- package/dist/cjs/functions/burnFuses.js +1 -1
- package/dist/cjs/functions/createSubname.d.ts +3 -1
- package/dist/cjs/functions/createSubname.js +4 -2
- package/dist/cjs/functions/deleteSubname.d.ts +1 -1
- package/dist/cjs/functions/deleteSubname.js +3 -2
- package/dist/cjs/functions/getExpiry.d.ts +9 -2
- package/dist/cjs/functions/getExpiry.js +52 -7
- package/dist/cjs/functions/getFuses.d.ts +2 -3
- package/dist/cjs/functions/getFuses.js +4 -13
- package/dist/cjs/functions/getSpecificRecord.js +8 -1
- package/dist/cjs/functions/getSubnames.d.ts +1 -1
- package/dist/cjs/functions/getSubnames.js +1 -1
- package/dist/cjs/functions/transferSubname.d.ts +12 -3
- package/dist/cjs/functions/transferSubname.js +5 -3
- package/dist/cjs/functions/wrapName.d.ts +3 -1
- package/dist/cjs/functions/wrapName.js +35 -29
- package/dist/cjs/generated/BaseRegistrarImplementation.d.ts +222 -201
- package/dist/cjs/generated/DNSRegistrar.d.ts +68 -64
- package/dist/cjs/generated/DNSSECImpl.d.ts +111 -111
- package/dist/cjs/generated/DefaultReverseResolver.d.ts +17 -17
- package/dist/cjs/generated/ENSRegistry.d.ts +126 -111
- package/dist/cjs/generated/ETHRegistrarController.d.ts +111 -109
- package/dist/cjs/generated/Multicall.d.ts +60 -60
- package/dist/cjs/generated/NameWrapper.d.ts +493 -354
- package/dist/cjs/generated/P256SHA256Algorithm.d.ts +11 -7
- package/dist/cjs/generated/PublicResolver.d.ts +259 -235
- package/dist/cjs/generated/RSASHA1Algorithm.d.ts +11 -7
- package/dist/cjs/generated/RSASHA256Algorithm.d.ts +11 -7
- package/dist/cjs/generated/ReverseRegistrar.d.ts +112 -103
- package/dist/cjs/generated/Root.d.ts +77 -77
- package/dist/cjs/generated/SHA1Digest.d.ts +7 -7
- package/dist/cjs/generated/SHA1NSEC3Digest.d.ts +11 -7
- package/dist/cjs/generated/SHA256Digest.d.ts +7 -7
- package/dist/cjs/generated/StaticMetadataService.d.ts +7 -7
- package/dist/cjs/generated/TLDPublicSuffixList.d.ts +7 -7
- package/dist/cjs/generated/UniversalResolver.d.ts +31 -31
- package/dist/cjs/generated/common.d.ts +1 -0
- package/dist/cjs/generated/factories/DNSRegistrar__factory.d.ts +3 -15
- package/dist/cjs/generated/factories/DNSRegistrar__factory.js +3 -26
- package/dist/cjs/generated/factories/DNSSECImpl__factory.d.ts +3 -15
- package/dist/cjs/generated/factories/DNSSECImpl__factory.js +3 -26
- package/dist/cjs/generated/factories/ETHRegistrarController__factory.js +14 -4
- package/dist/cjs/generated/factories/NameWrapper__factory.js +210 -79
- package/dist/cjs/generated/factories/P256SHA256Algorithm__factory.d.ts +3 -15
- package/dist/cjs/generated/factories/P256SHA256Algorithm__factory.js +3 -26
- package/dist/cjs/generated/factories/RSASHA1Algorithm__factory.d.ts +3 -15
- package/dist/cjs/generated/factories/RSASHA1Algorithm__factory.js +3 -26
- package/dist/cjs/generated/factories/RSASHA256Algorithm__factory.d.ts +3 -15
- package/dist/cjs/generated/factories/RSASHA256Algorithm__factory.js +3 -26
- package/dist/cjs/generated/factories/SHA1Digest__factory.d.ts +3 -15
- package/dist/cjs/generated/factories/SHA1Digest__factory.js +3 -26
- package/dist/cjs/generated/factories/SHA1NSEC3Digest__factory.d.ts +3 -15
- package/dist/cjs/generated/factories/SHA1NSEC3Digest__factory.js +3 -26
- package/dist/cjs/generated/factories/SHA256Digest__factory.d.ts +3 -15
- package/dist/cjs/generated/factories/SHA256Digest__factory.js +3 -26
- package/dist/cjs/generated/factories/TLDPublicSuffixList__factory.d.ts +3 -15
- package/dist/cjs/generated/factories/TLDPublicSuffixList__factory.js +3 -26
- package/dist/cjs/generated/factories/index.d.ts +14 -0
- package/dist/cjs/generated/factories/index.js +29 -1
- package/dist/cjs/generated/index.d.ts +29 -1
- package/dist/cjs/generated/index.js +31 -3
- package/dist/cjs/index.d.ts +12 -6
- package/dist/cjs/index.js +3 -2
- package/dist/cjs/utils/wrapperExpiry.d.ts +5 -0
- package/dist/cjs/utils/wrapperExpiry.js +30 -0
- package/dist/esm/contracts/baseRegistrar.d.ts +1 -1
- package/dist/esm/contracts/index.d.ts +3 -3
- package/dist/esm/contracts/multicall.d.ts +1 -1
- package/dist/esm/contracts/registry.d.ts +1 -1
- package/dist/esm/functions/burnFuses.js +1 -1
- package/dist/esm/functions/createSubname.d.ts +3 -1
- package/dist/esm/functions/createSubname.js +4 -2
- package/dist/esm/functions/deleteSubname.d.ts +1 -1
- package/dist/esm/functions/deleteSubname.js +3 -2
- package/dist/esm/functions/getExpiry.d.ts +9 -2
- package/dist/esm/functions/getExpiry.js +52 -7
- package/dist/esm/functions/getFuses.d.ts +2 -3
- package/dist/esm/functions/getFuses.js +5 -14
- package/dist/esm/functions/getSpecificRecord.js +8 -1
- package/dist/esm/functions/getSubnames.d.ts +1 -1
- package/dist/esm/functions/getSubnames.js +1 -1
- package/dist/esm/functions/transferSubname.d.ts +12 -3
- package/dist/esm/functions/transferSubname.js +5 -3
- package/dist/esm/functions/wrapName.d.ts +3 -1
- package/dist/esm/functions/wrapName.js +35 -29
- package/dist/esm/generated/BaseRegistrarImplementation.d.ts +222 -201
- package/dist/esm/generated/DNSRegistrar.d.ts +68 -64
- package/dist/esm/generated/DNSSECImpl.d.ts +111 -111
- package/dist/esm/generated/DefaultReverseResolver.d.ts +17 -17
- package/dist/esm/generated/ENSRegistry.d.ts +126 -111
- package/dist/esm/generated/ETHRegistrarController.d.ts +111 -109
- package/dist/esm/generated/Multicall.d.ts +60 -60
- package/dist/esm/generated/NameWrapper.d.ts +493 -354
- package/dist/esm/generated/P256SHA256Algorithm.d.ts +11 -7
- package/dist/esm/generated/PublicResolver.d.ts +259 -235
- package/dist/esm/generated/RSASHA1Algorithm.d.ts +11 -7
- package/dist/esm/generated/RSASHA256Algorithm.d.ts +11 -7
- package/dist/esm/generated/ReverseRegistrar.d.ts +112 -103
- package/dist/esm/generated/Root.d.ts +77 -77
- package/dist/esm/generated/SHA1Digest.d.ts +7 -7
- package/dist/esm/generated/SHA1NSEC3Digest.d.ts +11 -7
- package/dist/esm/generated/SHA256Digest.d.ts +7 -7
- package/dist/esm/generated/StaticMetadataService.d.ts +7 -7
- package/dist/esm/generated/TLDPublicSuffixList.d.ts +7 -7
- package/dist/esm/generated/UniversalResolver.d.ts +31 -31
- package/dist/esm/generated/common.d.ts +1 -0
- package/dist/esm/generated/factories/DNSRegistrar__factory.d.ts +3 -15
- package/dist/esm/generated/factories/DNSRegistrar__factory.js +2 -25
- package/dist/esm/generated/factories/DNSSECImpl__factory.d.ts +3 -15
- package/dist/esm/generated/factories/DNSSECImpl__factory.js +2 -25
- package/dist/esm/generated/factories/ETHRegistrarController__factory.js +14 -4
- package/dist/esm/generated/factories/NameWrapper__factory.js +210 -79
- package/dist/esm/generated/factories/P256SHA256Algorithm__factory.d.ts +3 -15
- package/dist/esm/generated/factories/P256SHA256Algorithm__factory.js +2 -25
- package/dist/esm/generated/factories/RSASHA1Algorithm__factory.d.ts +3 -15
- package/dist/esm/generated/factories/RSASHA1Algorithm__factory.js +2 -25
- package/dist/esm/generated/factories/RSASHA256Algorithm__factory.d.ts +3 -15
- package/dist/esm/generated/factories/RSASHA256Algorithm__factory.js +2 -25
- package/dist/esm/generated/factories/SHA1Digest__factory.d.ts +3 -15
- package/dist/esm/generated/factories/SHA1Digest__factory.js +2 -25
- package/dist/esm/generated/factories/SHA1NSEC3Digest__factory.d.ts +3 -15
- package/dist/esm/generated/factories/SHA1NSEC3Digest__factory.js +2 -25
- package/dist/esm/generated/factories/SHA256Digest__factory.d.ts +3 -15
- package/dist/esm/generated/factories/SHA256Digest__factory.js +2 -25
- package/dist/esm/generated/factories/TLDPublicSuffixList__factory.d.ts +3 -15
- package/dist/esm/generated/factories/TLDPublicSuffixList__factory.js +2 -25
- package/dist/esm/generated/factories/index.d.ts +14 -0
- package/dist/esm/generated/factories/index.js +14 -0
- package/dist/esm/generated/index.d.ts +29 -1
- package/dist/esm/generated/index.js +15 -1
- package/dist/esm/index.d.ts +12 -6
- package/dist/esm/index.js +3 -2
- package/dist/esm/utils/wrapperExpiry.d.ts +5 -0
- package/dist/esm/utils/wrapperExpiry.js +26 -0
- package/package.json +12 -10
- package/src/ABIs/Multicall.json +452 -0
- package/src/contracts/index.ts +1 -1
- package/src/functions/batch.test.ts +6 -6
- package/src/functions/batchWrappers.test.ts +5 -5
- package/src/functions/burnFuses.test.ts +5 -10
- package/src/functions/burnFuses.ts +1 -1
- package/src/functions/createSubname.test.ts +6 -10
- package/src/functions/createSubname.ts +14 -2
- package/src/functions/deleteSubname.test.ts +9 -28
- package/src/functions/deleteSubname.ts +3 -2
- package/src/functions/getDNSOwner.test.ts +1 -5
- package/src/functions/getExpiry.test.ts +26 -4
- package/src/functions/getExpiry.ts +87 -9
- package/src/functions/getFuses.test.ts +10 -33
- package/src/functions/getFuses.ts +10 -16
- package/src/functions/getHistory.test.ts +23 -11
- package/src/functions/getName.test.ts +4 -4
- package/src/functions/getNames.test.ts +97 -68
- package/src/functions/getOwner.test.ts +10 -25
- package/src/functions/getProfile.test.ts +32 -24
- package/src/functions/getResolver.test.ts +2 -6
- package/src/functions/getSpecificRecord.test.ts +16 -13
- package/src/functions/getSpecificRecord.ts +10 -4
- package/src/functions/getSubnames.test.ts +21 -17
- package/src/functions/getSubnames.ts +9 -2
- package/src/functions/makeCommitment.test.ts +2 -2
- package/src/functions/setName.test.ts +10 -11
- package/src/functions/setRecord.test.ts +12 -9
- package/src/functions/setRecords.test.ts +6 -5
- package/src/functions/setResolver.test.ts +6 -9
- package/src/functions/transferName.test.ts +13 -27
- package/src/functions/transferSubname.test.ts +11 -30
- package/src/functions/transferSubname.ts +28 -10
- package/src/functions/unwrapName.test.ts +13 -28
- package/src/functions/wrapName.test.ts +109 -34
- package/src/functions/wrapName.ts +45 -29
- package/src/generated/BaseRegistrarImplementation.ts +382 -296
- package/src/generated/DNSRegistrar.ts +103 -89
- package/src/generated/DNSSECImpl.ts +180 -149
- package/src/generated/DefaultReverseResolver.ts +37 -21
- package/src/generated/ENSRegistry.ts +257 -184
- package/src/generated/ETHRegistrarController.ts +252 -191
- package/src/generated/Multicall.ts +73 -57
- package/src/generated/NameWrapper.ts +979 -649
- package/src/generated/P256SHA256Algorithm.ts +21 -16
- package/src/generated/PublicResolver.ts +452 -362
- package/src/generated/RSASHA1Algorithm.ts +21 -16
- package/src/generated/RSASHA256Algorithm.ts +21 -16
- package/src/generated/ReverseRegistrar.ts +193 -141
- package/src/generated/Root.ts +146 -86
- package/src/generated/SHA1Digest.ts +12 -11
- package/src/generated/SHA1NSEC3Digest.ts +21 -16
- package/src/generated/SHA256Digest.ts +12 -11
- package/src/generated/StaticMetadataService.ts +22 -6
- package/src/generated/TLDPublicSuffixList.ts +10 -6
- package/src/generated/UniversalResolver.ts +44 -40
- package/src/generated/common.ts +2 -0
- package/src/generated/factories/DNSRegistrar__factory.ts +4 -56
- package/src/generated/factories/DNSSECImpl__factory.ts +4 -49
- package/src/generated/factories/ETHRegistrarController__factory.ts +14 -4
- package/src/generated/factories/NameWrapper__factory.ts +210 -79
- package/src/generated/factories/P256SHA256Algorithm__factory.ts +4 -40
- package/src/generated/factories/RSASHA1Algorithm__factory.ts +4 -40
- package/src/generated/factories/RSASHA256Algorithm__factory.ts +4 -40
- package/src/generated/factories/SHA1Digest__factory.ts +4 -40
- package/src/generated/factories/SHA1NSEC3Digest__factory.ts +4 -40
- package/src/generated/factories/SHA256Digest__factory.ts +4 -40
- package/src/generated/factories/TLDPublicSuffixList__factory.ts +4 -40
- package/src/generated/factories/index.ts +14 -0
- package/src/generated/index.ts +29 -1
- package/src/index.ts +3 -2
- package/src/tests/setup.ts +18 -13
- package/src/tests/withProvider.test.ts +2 -2
- package/src/utils/wrapperExpiry.ts +31 -0
- package/dist/cjs/contracts/doNotCallOnChainUniversalResolverProxy.d.ts +0 -3
- package/dist/cjs/contracts/doNotCallOnChainUniversalResolverProxy.js +0 -4
- package/dist/cjs/generated/DoNotCallOnChainUniversalResolverProxy.d.ts +0 -144
- package/dist/cjs/generated/DoNotCallOnChainUniversalResolverProxy.js +0 -2
- package/dist/cjs/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.d.ts +0 -56
- package/dist/cjs/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.js +0 -171
- package/dist/esm/contracts/doNotCallOnChainUniversalResolverProxy.d.ts +0 -3
- package/dist/esm/contracts/doNotCallOnChainUniversalResolverProxy.js +0 -2
- package/dist/esm/generated/DoNotCallOnChainUniversalResolverProxy.d.ts +0 -144
- package/dist/esm/generated/DoNotCallOnChainUniversalResolverProxy.js +0 -1
- package/dist/esm/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.d.ts +0 -56
- package/dist/esm/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.js +0 -167
- package/src/ABIs/ETHRegistrarController.json +0 -494
- package/src/ABIs/NameWrapper.json +0 -1183
- package/src/ABIs/PublicResolver.json +0 -875
- package/src/ABIs/ReverseRegistrar.json +0 -323
- package/src/ABIs/StaticMetadataService.json +0 -32
- package/src/ABIs/UniversalResolver.json +0 -187
- package/src/contracts/doNotCallOnChainUniversalResolverProxy.ts +0 -5
- package/src/generated/DoNotCallOnChainUniversalResolverProxy.ts +0 -285
- package/src/generated/factories/DoNotCallOnChainUniversalResolverProxy__factory.ts +0 -186
|
@@ -10,23 +10,23 @@ beforeAll(async () => {
|
|
|
10
10
|
describe('batch', () => {
|
|
11
11
|
it('should batch calls together', async () => {
|
|
12
12
|
const result = await ENSInstance.batch(
|
|
13
|
-
ENSInstance.getText.batch('
|
|
14
|
-
ENSInstance.getAddr.batch('
|
|
15
|
-
ENSInstance.getName.batch('
|
|
13
|
+
ENSInstance.getText.batch('with-profile.eth', 'description'),
|
|
14
|
+
ENSInstance.getAddr.batch('with-profile.eth'),
|
|
15
|
+
ENSInstance.getName.batch('0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC'),
|
|
16
16
|
)
|
|
17
17
|
expect(result).toBeTruthy()
|
|
18
18
|
if (result) {
|
|
19
19
|
expect(result[0]).toBe('Hello2')
|
|
20
|
-
expect(result[1]).toBe('
|
|
20
|
+
expect(result[1]).toBe('0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC')
|
|
21
21
|
expect(result[2]).toMatchObject({
|
|
22
|
-
name: '
|
|
22
|
+
name: 'with-profile.eth',
|
|
23
23
|
match: true,
|
|
24
24
|
})
|
|
25
25
|
}
|
|
26
26
|
})
|
|
27
27
|
it('should batch a single call', async () => {
|
|
28
28
|
const result = await ENSInstance.batch(
|
|
29
|
-
ENSInstance.getText.batch('
|
|
29
|
+
ENSInstance.getText.batch('with-profile.eth', 'description'),
|
|
30
30
|
)
|
|
31
31
|
expect(result).toBeTruthy()
|
|
32
32
|
if (result) {
|
|
@@ -10,12 +10,12 @@ beforeAll(async () => {
|
|
|
10
10
|
describe('batchWrappers', () => {
|
|
11
11
|
it('should batch calls together', async () => {
|
|
12
12
|
const batch = await ENSInstance.resolverMulticallWrapper.raw([
|
|
13
|
-
await ENSInstance._getText.raw('
|
|
14
|
-
await ENSInstance._getText.raw('
|
|
15
|
-
await ENSInstance._getAddr.raw('
|
|
13
|
+
await ENSInstance._getText.raw('with-profile.eth', 'description'),
|
|
14
|
+
await ENSInstance._getText.raw('with-profile.eth', 'url'),
|
|
15
|
+
await ENSInstance._getAddr.raw('with-profile.eth'),
|
|
16
16
|
])
|
|
17
17
|
const universalResponse = await ENSInstance.universalWrapper(
|
|
18
|
-
'
|
|
18
|
+
'with-profile.eth',
|
|
19
19
|
batch.data,
|
|
20
20
|
)
|
|
21
21
|
const [batchDecoded] = await ENSInstance.resolverMulticallWrapper.decode(
|
|
@@ -26,6 +26,6 @@ describe('batchWrappers', () => {
|
|
|
26
26
|
const decoded3 = await ENSInstance._getAddr.decode(batchDecoded[2])
|
|
27
27
|
expect(decoded1).toBe('Hello2')
|
|
28
28
|
expect(decoded2).toBe('twitter.com')
|
|
29
|
-
expect(decoded3).toBe('
|
|
29
|
+
expect(decoded3).toBe('0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC')
|
|
30
30
|
})
|
|
31
31
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ethers } from 'ethers'
|
|
2
2
|
import { ENS } from '..'
|
|
3
3
|
import setup from '../tests/setup'
|
|
4
4
|
import { namehash } from '../utils/normalise'
|
|
@@ -22,24 +22,19 @@ describe('burnFuses', () => {
|
|
|
22
22
|
await revert()
|
|
23
23
|
})
|
|
24
24
|
it('should return a burnFuses transaction and succeed', async () => {
|
|
25
|
-
const
|
|
26
|
-
wrappedOwner: accounts[0],
|
|
27
|
-
})
|
|
28
|
-
await wrapNameTx.wait()
|
|
29
|
-
|
|
30
|
-
const tx = await ENSInstance.burnFuses('parthtejpal.eth', {
|
|
25
|
+
const tx = await ENSInstance.burnFuses('wrapped.eth', {
|
|
31
26
|
fusesToBurn: {
|
|
32
27
|
cannotUnwrap: true,
|
|
33
28
|
cannotCreateSubdomain: true,
|
|
34
29
|
cannotSetTtl: true,
|
|
35
30
|
},
|
|
31
|
+
addressOrIndex: accounts[1],
|
|
36
32
|
})
|
|
37
33
|
expect(tx).toBeTruthy()
|
|
38
34
|
await tx.wait()
|
|
39
35
|
|
|
40
36
|
const nameWrapper = await ENSInstance.contracts!.getNameWrapper()!
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
expect(fuseBN.toHexString()).toBe('0x71')
|
|
37
|
+
const [fuses] = await nameWrapper.getFuses(namehash('wrapped.eth'))
|
|
38
|
+
expect(fuses).toBe(113)
|
|
44
39
|
})
|
|
45
40
|
})
|
|
@@ -23,33 +23,29 @@ describe('createSubname', () => {
|
|
|
23
23
|
await revert()
|
|
24
24
|
})
|
|
25
25
|
it('should allow creating a subname on the registry', async () => {
|
|
26
|
-
const tx = await ENSInstance.createSubname('test.
|
|
26
|
+
const tx = await ENSInstance.createSubname('test.test123.eth', {
|
|
27
27
|
contract: 'registry',
|
|
28
28
|
owner: accounts[0],
|
|
29
|
-
addressOrIndex:
|
|
29
|
+
addressOrIndex: 1,
|
|
30
30
|
})
|
|
31
31
|
expect(tx).toBeTruthy()
|
|
32
32
|
await tx.wait()
|
|
33
33
|
|
|
34
34
|
const registry = await ENSInstance.contracts!.getRegistry()!
|
|
35
|
-
const result = await registry.owner(namehash('test.
|
|
35
|
+
const result = await registry.owner(namehash('test.test123.eth'))
|
|
36
36
|
expect(result).toBe(accounts[0])
|
|
37
37
|
})
|
|
38
38
|
it('should allow creating a subname on the namewrapper', async () => {
|
|
39
|
-
const
|
|
40
|
-
wrappedOwner: accounts[0],
|
|
41
|
-
})
|
|
42
|
-
await wrapNameTx.wait()
|
|
43
|
-
const tx = await ENSInstance.createSubname('test.parthtejpal.eth', {
|
|
39
|
+
const tx = await ENSInstance.createSubname('test.wrapped.eth', {
|
|
44
40
|
contract: 'nameWrapper',
|
|
45
41
|
owner: accounts[0],
|
|
46
|
-
addressOrIndex:
|
|
42
|
+
addressOrIndex: 1,
|
|
47
43
|
})
|
|
48
44
|
expect(tx).toBeTruthy()
|
|
49
45
|
await tx.wait()
|
|
50
46
|
|
|
51
47
|
const nameWrapper = await ENSInstance.contracts!.getNameWrapper()!
|
|
52
|
-
const result = await nameWrapper.ownerOf(namehash('test.
|
|
48
|
+
const result = await nameWrapper.ownerOf(namehash('test.wrapped.eth'))
|
|
53
49
|
expect(result).toBe(accounts[0])
|
|
54
50
|
})
|
|
55
51
|
})
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { ethers } from 'ethers'
|
|
1
|
+
import { BigNumber, ethers } from 'ethers'
|
|
2
2
|
import { ENSArgs } from '..'
|
|
3
3
|
import { FuseOptions } from '../@types/FuseOptions'
|
|
4
4
|
import generateFuseInput from '../utils/generateFuseInput'
|
|
5
5
|
import { namehash } from '../utils/normalise'
|
|
6
|
+
import { Expiry, makeExpiry } from '../utils/wrapperExpiry'
|
|
6
7
|
|
|
7
8
|
type BaseArgs = {
|
|
8
9
|
owner: string
|
|
@@ -13,12 +14,17 @@ type BaseArgs = {
|
|
|
13
14
|
type NameWrapperArgs = {
|
|
14
15
|
contract: 'nameWrapper'
|
|
15
16
|
fuses?: FuseOptions
|
|
17
|
+
expiry?: Expiry
|
|
16
18
|
} & BaseArgs
|
|
17
19
|
|
|
18
20
|
type Args = BaseArgs | NameWrapperArgs
|
|
19
21
|
|
|
20
22
|
export default async function (
|
|
21
|
-
{
|
|
23
|
+
{
|
|
24
|
+
contracts,
|
|
25
|
+
signer,
|
|
26
|
+
getExpiry,
|
|
27
|
+
}: ENSArgs<'contracts' | 'signer' | 'getExpiry'>,
|
|
22
28
|
name: string,
|
|
23
29
|
{ owner, resolverAddress, contract, ...wrapperArgs }: Args,
|
|
24
30
|
) {
|
|
@@ -54,6 +60,11 @@ export default async function (
|
|
|
54
60
|
}
|
|
55
61
|
case 'nameWrapper': {
|
|
56
62
|
const nameWrapper = (await contracts?.getNameWrapper()!).connect(signer)
|
|
63
|
+
const expiry: BigNumber = await makeExpiry(
|
|
64
|
+
{ getExpiry },
|
|
65
|
+
name,
|
|
66
|
+
'expiry' in wrapperArgs ? wrapperArgs.expiry : undefined,
|
|
67
|
+
)
|
|
57
68
|
|
|
58
69
|
const generatedFuses =
|
|
59
70
|
'fuses' in wrapperArgs && wrapperArgs.fuses
|
|
@@ -67,6 +78,7 @@ export default async function (
|
|
|
67
78
|
resolverAddress,
|
|
68
79
|
0,
|
|
69
80
|
generatedFuses,
|
|
81
|
+
expiry,
|
|
70
82
|
)
|
|
71
83
|
}
|
|
72
84
|
default: {
|
|
@@ -22,51 +22,32 @@ describe('deleteSubname', () => {
|
|
|
22
22
|
await revert()
|
|
23
23
|
})
|
|
24
24
|
it('should allow deleting a subname on the registry', async () => {
|
|
25
|
-
const
|
|
26
|
-
'test.parthtejpal.eth',
|
|
27
|
-
{
|
|
28
|
-
contract: 'registry',
|
|
29
|
-
owner: accounts[0],
|
|
30
|
-
addressOrIndex: 0,
|
|
31
|
-
},
|
|
32
|
-
)
|
|
33
|
-
await createSubnameTx.wait()
|
|
34
|
-
|
|
35
|
-
const tx = await ENSInstance.deleteSubname('test.parthtejpal.eth', {
|
|
25
|
+
const tx = await ENSInstance.deleteSubname('test.with-subnames.eth', {
|
|
36
26
|
contract: 'registry',
|
|
37
|
-
addressOrIndex:
|
|
27
|
+
addressOrIndex: 1,
|
|
38
28
|
})
|
|
39
29
|
expect(tx).toBeTruthy()
|
|
40
30
|
await tx.wait()
|
|
41
31
|
|
|
42
32
|
const registry = await ENSInstance.contracts!.getRegistry()!
|
|
43
|
-
const result = await registry.owner(namehash('test.
|
|
33
|
+
const result = await registry.owner(namehash('test.with-subnames.eth'))
|
|
44
34
|
expect(result).toBe('0x0000000000000000000000000000000000000000')
|
|
45
35
|
})
|
|
46
36
|
it('should allow deleting a subname on the nameWrapper', async () => {
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
})
|
|
50
|
-
await wrapNameTx.wait()
|
|
51
|
-
const createSubnameTx = await ENSInstance.createSubname(
|
|
52
|
-
'test.parthtejpal.eth',
|
|
37
|
+
const tx = await ENSInstance.deleteSubname(
|
|
38
|
+
'test.wrapped-with-subnames.eth',
|
|
53
39
|
{
|
|
54
40
|
contract: 'nameWrapper',
|
|
55
|
-
|
|
56
|
-
addressOrIndex: 0,
|
|
41
|
+
addressOrIndex: 1,
|
|
57
42
|
},
|
|
58
43
|
)
|
|
59
|
-
await createSubnameTx.wait()
|
|
60
|
-
|
|
61
|
-
const tx = await ENSInstance.deleteSubname('test.parthtejpal.eth', {
|
|
62
|
-
contract: 'nameWrapper',
|
|
63
|
-
addressOrIndex: 0,
|
|
64
|
-
})
|
|
65
44
|
expect(tx).toBeTruthy()
|
|
66
45
|
await tx.wait()
|
|
67
46
|
|
|
68
47
|
const nameWrapper = await ENSInstance.contracts!.getNameWrapper()!
|
|
69
|
-
const result = await nameWrapper.ownerOf(
|
|
48
|
+
const result = await nameWrapper.ownerOf(
|
|
49
|
+
namehash('test.wrapped-with-subnames.eth'),
|
|
50
|
+
)
|
|
70
51
|
expect(result).toBe('0x0000000000000000000000000000000000000000')
|
|
71
52
|
})
|
|
72
53
|
})
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ENSArgs } from '..'
|
|
2
2
|
|
|
3
3
|
export default async function (
|
|
4
|
-
{ transferSubname }: ENSArgs<'transferSubname'>,
|
|
4
|
+
{ transferSubname, signer }: ENSArgs<'transferSubname' | 'signer'>,
|
|
5
5
|
name: string,
|
|
6
6
|
{
|
|
7
7
|
contract,
|
|
@@ -11,6 +11,7 @@ export default async function (
|
|
|
11
11
|
) {
|
|
12
12
|
return transferSubname.populateTransaction(name, {
|
|
13
13
|
contract,
|
|
14
|
-
|
|
14
|
+
owner: '0x0000000000000000000000000000000000000000',
|
|
15
|
+
signer,
|
|
15
16
|
})
|
|
16
17
|
}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
import * as packet from 'dns-packet'
|
|
2
|
-
import fetch from 'node-fetch'
|
|
3
1
|
import nock from 'nock'
|
|
4
|
-
|
|
2
|
+
import fetch from 'node-fetch'
|
|
5
3
|
import getDNSOwner, { encodeURLParams } from './getDNSOwner'
|
|
6
4
|
|
|
7
5
|
function hex_decode(string: string) {
|
|
@@ -39,7 +37,6 @@ describe('getDNSOwner', () => {
|
|
|
39
37
|
})
|
|
40
38
|
.get('/dns-query')
|
|
41
39
|
.query((queryObject) => {
|
|
42
|
-
console.log('queryObject: ', queryObject)
|
|
43
40
|
return (
|
|
44
41
|
queryObject.ct === 'application/dns-udpwireformat' &&
|
|
45
42
|
queryObject.dns ===
|
|
@@ -82,7 +79,6 @@ describe('getDNSOwner', () => {
|
|
|
82
79
|
})
|
|
83
80
|
.get('/dns-query')
|
|
84
81
|
.query((queryObject) => {
|
|
85
|
-
console.log('queryObject: ', queryObject)
|
|
86
82
|
return (
|
|
87
83
|
queryObject.ct === 'application/dns-udpwireformat' &&
|
|
88
84
|
queryObject.dns ===
|
|
@@ -17,8 +17,8 @@ afterAll(async () => {
|
|
|
17
17
|
})
|
|
18
18
|
|
|
19
19
|
describe('getExpiry', () => {
|
|
20
|
-
it('should get the expiry for a name', async () => {
|
|
21
|
-
const result = await ENSInstance.getExpiry('
|
|
20
|
+
it('should get the expiry for a .eth name with no other args', async () => {
|
|
21
|
+
const result = await ENSInstance.getExpiry('with-profile.eth')
|
|
22
22
|
expect(result).toBeTruthy()
|
|
23
23
|
if (result) {
|
|
24
24
|
const { expiry, gracePeriod } = result
|
|
@@ -26,9 +26,31 @@ describe('getExpiry', () => {
|
|
|
26
26
|
expect(gracePeriod).toBe(7776000000)
|
|
27
27
|
}
|
|
28
28
|
})
|
|
29
|
-
it('should
|
|
29
|
+
it('should get the expiry for a wrapped name', async () => {
|
|
30
|
+
const result = await ENSInstance.getExpiry('wrapped.eth', {
|
|
31
|
+
contract: 'nameWrapper',
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
expect(result).toBeTruthy()
|
|
35
|
+
if (result) {
|
|
36
|
+
const { expiry, gracePeriod } = result
|
|
37
|
+
expect(expiry).toBeInstanceOf(Date)
|
|
38
|
+
expect(gracePeriod).toBe(null)
|
|
39
|
+
}
|
|
40
|
+
})
|
|
41
|
+
it('should throw an error for a non .eth name if not wrapped', async () => {
|
|
42
|
+
try {
|
|
43
|
+
await ENSInstance.getExpiry('sub.with-profile.eth')
|
|
44
|
+
expect(false).toBeTruthy()
|
|
45
|
+
} catch {
|
|
46
|
+
expect(true).toBeTruthy()
|
|
47
|
+
}
|
|
48
|
+
})
|
|
49
|
+
it('should throw an error for a non .eth name if registrar is specified', async () => {
|
|
30
50
|
try {
|
|
31
|
-
await ENSInstance.getExpiry('sub.
|
|
51
|
+
await ENSInstance.getExpiry('sub.with-profile.eth', {
|
|
52
|
+
contract: 'registrar',
|
|
53
|
+
})
|
|
32
54
|
expect(false).toBeTruthy()
|
|
33
55
|
} catch {
|
|
34
56
|
expect(true).toBeTruthy()
|
|
@@ -1,19 +1,24 @@
|
|
|
1
1
|
import { BigNumber } from 'ethers'
|
|
2
2
|
import { solidityKeccak256 } from 'ethers/lib/utils'
|
|
3
3
|
import { ENSArgs } from '..'
|
|
4
|
+
import { namehash } from '../utils/normalise'
|
|
4
5
|
|
|
5
|
-
|
|
6
|
-
{ contracts, multicallWrapper }: ENSArgs<'contracts' | 'multicallWrapper'>,
|
|
7
|
-
name: string,
|
|
8
|
-
) => {
|
|
9
|
-
const baseRegistrar = await contracts?.getBaseRegistrar()!
|
|
6
|
+
type ContractOption = 'registrar' | 'nameWrapper'
|
|
10
7
|
|
|
11
|
-
|
|
8
|
+
type Args = {
|
|
9
|
+
contract?: ContractOption
|
|
10
|
+
}
|
|
12
11
|
|
|
12
|
+
const getRegistrarExpiry = async (
|
|
13
|
+
{ contracts, multicallWrapper }: ENSArgs<'contracts' | 'multicallWrapper'>,
|
|
14
|
+
labels: string[],
|
|
15
|
+
) => {
|
|
13
16
|
if (labels.length > 2 || labels[1] !== 'eth') {
|
|
14
|
-
throw new Error('Only .eth names have expiry dates')
|
|
17
|
+
throw new Error('Only .eth names have expiry dates on the registrar')
|
|
15
18
|
}
|
|
16
19
|
|
|
20
|
+
const baseRegistrar = await contracts?.getBaseRegistrar()!
|
|
21
|
+
|
|
17
22
|
const expiryCall = baseRegistrar.interface.encodeFunctionData('nameExpires', [
|
|
18
23
|
solidityKeccak256(['string'], [labels[0]]),
|
|
19
24
|
])
|
|
@@ -32,11 +37,49 @@ const raw = async (
|
|
|
32
37
|
])
|
|
33
38
|
}
|
|
34
39
|
|
|
35
|
-
const
|
|
40
|
+
const getWrapperExpiry = async (
|
|
41
|
+
{ contracts }: ENSArgs<'contracts'>,
|
|
42
|
+
labels: string[],
|
|
43
|
+
) => {
|
|
44
|
+
const nameWrapper = await contracts?.getNameWrapper()!
|
|
45
|
+
const expiryCall = nameWrapper.interface.encodeFunctionData('getData', [
|
|
46
|
+
namehash(labels.join('.')),
|
|
47
|
+
])
|
|
48
|
+
return {
|
|
49
|
+
to: nameWrapper.address,
|
|
50
|
+
data: expiryCall,
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const getContractToUse = (
|
|
55
|
+
contract: ContractOption | undefined,
|
|
56
|
+
labels: string[],
|
|
57
|
+
) => {
|
|
58
|
+
if (contract) return contract
|
|
59
|
+
if (labels.length === 2 && labels[1] === 'eth') {
|
|
60
|
+
return 'registrar'
|
|
61
|
+
}
|
|
62
|
+
return 'nameWrapper'
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const raw = async (
|
|
66
|
+
ensArgs: ENSArgs<'contracts' | 'multicallWrapper'>,
|
|
67
|
+
name: string,
|
|
68
|
+
{ contract }: Args = {},
|
|
69
|
+
) => {
|
|
70
|
+
const labels = name.split('.')
|
|
71
|
+
|
|
72
|
+
const contractToUse = getContractToUse(contract, labels)
|
|
73
|
+
|
|
74
|
+
return contractToUse === 'nameWrapper'
|
|
75
|
+
? getWrapperExpiry(ensArgs, labels)
|
|
76
|
+
: getRegistrarExpiry(ensArgs, labels)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const decodeRegistrarExpiry = async (
|
|
36
80
|
{ contracts, multicallWrapper }: ENSArgs<'contracts' | 'multicallWrapper'>,
|
|
37
81
|
data: string,
|
|
38
82
|
) => {
|
|
39
|
-
if (data === null) return
|
|
40
83
|
const result = await multicallWrapper.decode(data)
|
|
41
84
|
const baseRegistrar = await contracts?.getBaseRegistrar()!
|
|
42
85
|
try {
|
|
@@ -57,6 +100,41 @@ const decode = async (
|
|
|
57
100
|
}
|
|
58
101
|
}
|
|
59
102
|
|
|
103
|
+
const decodeWrapperExpiry = async (
|
|
104
|
+
{ contracts }: ENSArgs<'contracts'>,
|
|
105
|
+
data: string,
|
|
106
|
+
) => {
|
|
107
|
+
const nameWrapper = await contracts?.getNameWrapper()!
|
|
108
|
+
try {
|
|
109
|
+
const [_owner, _fuses, expiry] = nameWrapper.interface.decodeFunctionResult(
|
|
110
|
+
'getData',
|
|
111
|
+
data,
|
|
112
|
+
)
|
|
113
|
+
return {
|
|
114
|
+
expiry: new Date(expiry * 1000),
|
|
115
|
+
gracePeriod: null,
|
|
116
|
+
}
|
|
117
|
+
} catch {
|
|
118
|
+
return
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const decode = async (
|
|
123
|
+
ensArgs: ENSArgs<'contracts' | 'multicallWrapper'>,
|
|
124
|
+
data: string,
|
|
125
|
+
name: string,
|
|
126
|
+
{ contract }: Args = {},
|
|
127
|
+
) => {
|
|
128
|
+
if (data === null) return
|
|
129
|
+
|
|
130
|
+
const labels = name.split('.')
|
|
131
|
+
const contractToUse = getContractToUse(contract, labels)
|
|
132
|
+
|
|
133
|
+
return contractToUse === 'nameWrapper'
|
|
134
|
+
? decodeWrapperExpiry(ensArgs, data)
|
|
135
|
+
: decodeRegistrarExpiry(ensArgs, data)
|
|
136
|
+
}
|
|
137
|
+
|
|
60
138
|
export default {
|
|
61
139
|
raw,
|
|
62
140
|
decode,
|
|
@@ -12,10 +12,6 @@ let withWrappedSnapshot: any
|
|
|
12
12
|
beforeAll(async () => {
|
|
13
13
|
;({ ENSInstance, revert, provider, createSnapshot } = await setup())
|
|
14
14
|
accounts = await provider.listAccounts()
|
|
15
|
-
const tx = await ENSInstance.wrapName('parthtejpal.eth', {
|
|
16
|
-
wrappedOwner: accounts[0],
|
|
17
|
-
})
|
|
18
|
-
await tx.wait()
|
|
19
15
|
|
|
20
16
|
withWrappedSnapshot = await createSnapshot()
|
|
21
17
|
})
|
|
@@ -31,18 +27,12 @@ afterAll(async () => {
|
|
|
31
27
|
|
|
32
28
|
describe('getFuses', () => {
|
|
33
29
|
it('should return null for an unwrapped name', async () => {
|
|
34
|
-
const result = await ENSInstance.getFuses('
|
|
30
|
+
const result = await ENSInstance.getFuses('with-profile.eth')
|
|
35
31
|
expect(result).toBeUndefined()
|
|
36
32
|
})
|
|
37
33
|
it('should return with canDoEverything set to true for a name with no fuses burned', async () => {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
owner: accounts[0],
|
|
41
|
-
addressOrIndex: 0,
|
|
42
|
-
})
|
|
43
|
-
await tx.wait()
|
|
44
|
-
|
|
45
|
-
const result = await ENSInstance.getFuses('test.parthtejpal.eth')
|
|
34
|
+
const nameWrapper = await ENSInstance.contracts!.getNameWrapper()!
|
|
35
|
+
const result = await ENSInstance.getFuses('test.wrapped-with-subnames.eth')
|
|
46
36
|
expect(result).toBeTruthy()
|
|
47
37
|
if (result) {
|
|
48
38
|
expect(result.fuseObj.canDoEverything).toBe(true)
|
|
@@ -56,15 +46,17 @@ describe('getFuses', () => {
|
|
|
56
46
|
}
|
|
57
47
|
})
|
|
58
48
|
it('should return with other correct fuses', async () => {
|
|
59
|
-
const tx = await ENSInstance.burnFuses('
|
|
49
|
+
const tx = await ENSInstance.burnFuses('wrapped.eth', {
|
|
60
50
|
fusesToBurn: {
|
|
61
51
|
cannotUnwrap: true,
|
|
62
52
|
cannotSetTtl: true,
|
|
63
53
|
cannotCreateSubdomain: true,
|
|
64
54
|
},
|
|
55
|
+
addressOrIndex: 1,
|
|
65
56
|
})
|
|
66
57
|
await tx.wait()
|
|
67
|
-
|
|
58
|
+
|
|
59
|
+
const result = await ENSInstance.getFuses('wrapped.eth')
|
|
68
60
|
expect(result).toBeTruthy()
|
|
69
61
|
if (result) {
|
|
70
62
|
expect(result.fuseObj).toMatchObject({
|
|
@@ -80,26 +72,11 @@ describe('getFuses', () => {
|
|
|
80
72
|
expect(result.rawFuses.toHexString()).toBe('0x71')
|
|
81
73
|
}
|
|
82
74
|
})
|
|
83
|
-
it('should return correct
|
|
84
|
-
const result = await ENSInstance.getFuses('
|
|
85
|
-
expect(result).toBeTruthy()
|
|
86
|
-
if (result) {
|
|
87
|
-
expect(result.vulnerability).toBe('Safe')
|
|
88
|
-
expect(result.vulnerableNode).toBeNull()
|
|
89
|
-
}
|
|
90
|
-
})
|
|
91
|
-
it('should return correct vulnerability data for a vulnerable node', async () => {
|
|
92
|
-
const tx = await ENSInstance.createSubname('test.parthtejpal.eth', {
|
|
93
|
-
owner: accounts[0],
|
|
94
|
-
contract: 'nameWrapper',
|
|
95
|
-
})
|
|
96
|
-
await tx.wait()
|
|
97
|
-
|
|
98
|
-
const result = await ENSInstance.getFuses('test.parthtejpal.eth')
|
|
75
|
+
it('should return correct expiry', async () => {
|
|
76
|
+
const result = await ENSInstance.getFuses('wrapped.eth')
|
|
99
77
|
expect(result).toBeTruthy()
|
|
100
78
|
if (result) {
|
|
101
|
-
expect(result.
|
|
102
|
-
expect(result.vulnerableNode).toBe('parthtejpal.eth')
|
|
79
|
+
expect(result.expiryDate).toBeInstanceOf(Date)
|
|
103
80
|
}
|
|
104
81
|
})
|
|
105
82
|
})
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BigNumber
|
|
1
|
+
import { BigNumber } from 'ethers'
|
|
2
2
|
import { ENSArgs } from '..'
|
|
3
3
|
import { testable as fuseEnums } from '../utils/fuses'
|
|
4
4
|
import { namehash } from '../utils/normalise'
|
|
@@ -28,8 +28,12 @@ const decode = async (
|
|
|
28
28
|
) => {
|
|
29
29
|
const nameWrapper = await contracts?.getNameWrapper()!
|
|
30
30
|
try {
|
|
31
|
-
const [
|
|
32
|
-
|
|
31
|
+
const [_fuses, expiry] = nameWrapper.interface.decodeFunctionResult(
|
|
32
|
+
'getFuses',
|
|
33
|
+
data,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
const fuses = BigNumber.from(_fuses)
|
|
33
37
|
|
|
34
38
|
const fuseObj = Object.fromEntries(
|
|
35
39
|
Object.keys(fuseEnums).map((fuseEnum) => [
|
|
@@ -48,22 +52,12 @@ const decode = async (
|
|
|
48
52
|
fuseObj.canDoEverything = false
|
|
49
53
|
}
|
|
50
54
|
|
|
51
|
-
|
|
52
|
-
if (utils.hexStripZeros(vulnerableNode) !== '0x') {
|
|
53
|
-
name.split('.').forEach((label, index, arr) => {
|
|
54
|
-
const node = arr.slice(index).join('.')
|
|
55
|
-
const nodehash = namehash(node)
|
|
56
|
-
if (nodehash === vulnerableNode) {
|
|
57
|
-
returnVulnerableNode = node
|
|
58
|
-
}
|
|
59
|
-
})
|
|
60
|
-
}
|
|
55
|
+
const expiryDate = new Date(expiry * 1000)
|
|
61
56
|
|
|
62
57
|
return {
|
|
63
58
|
fuseObj,
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
rawFuses: fuses as BigNumber,
|
|
59
|
+
expiryDate,
|
|
60
|
+
rawFuses: fuses,
|
|
67
61
|
}
|
|
68
62
|
} catch {
|
|
69
63
|
return
|
|
@@ -2,10 +2,14 @@ import { ENS } from '..'
|
|
|
2
2
|
import setup from '../tests/setup'
|
|
3
3
|
|
|
4
4
|
let ENSInstance: ENS
|
|
5
|
+
let revert: Awaited<ReturnType<typeof setup>>['revert']
|
|
5
6
|
|
|
6
7
|
beforeAll(async () => {
|
|
7
|
-
;({ ENSInstance } = await setup())
|
|
8
|
-
|
|
8
|
+
;({ ENSInstance, revert } = await setup())
|
|
9
|
+
})
|
|
10
|
+
|
|
11
|
+
afterAll(async () => {
|
|
12
|
+
await revert()
|
|
9
13
|
})
|
|
10
14
|
|
|
11
15
|
describe('getHistory', () => {
|
|
@@ -16,7 +20,7 @@ describe('getHistory', () => {
|
|
|
16
20
|
expect(result).toBeUndefined()
|
|
17
21
|
})
|
|
18
22
|
it('should return the history of a name', async () => {
|
|
19
|
-
const result = await ENSInstance.getHistory('
|
|
23
|
+
const result = await ENSInstance.getHistory('with-profile.eth')
|
|
20
24
|
expect(result).toBeTruthy()
|
|
21
25
|
if (result) {
|
|
22
26
|
expect(result).toHaveProperty('domain')
|
|
@@ -32,7 +36,7 @@ describe('getHistory', () => {
|
|
|
32
36
|
expect(result).toBeUndefined()
|
|
33
37
|
})
|
|
34
38
|
it('should return the history of a name with TextChanged event detail', async () => {
|
|
35
|
-
const result = await ENSInstance.getHistoryWithDetail('
|
|
39
|
+
const result = await ENSInstance.getHistoryWithDetail('with-profile.eth')
|
|
36
40
|
expect(result).toBeTruthy()
|
|
37
41
|
if (result) {
|
|
38
42
|
const textEvents = result.resolver.filter(
|
|
@@ -70,13 +74,22 @@ describe('getHistory', () => {
|
|
|
70
74
|
expect(result[0]).toMatchObject(eventToUse.data)
|
|
71
75
|
}
|
|
72
76
|
})
|
|
77
|
+
let hash: string = ''
|
|
73
78
|
it('should return multiple items for a given transaction hash with multiple events', async () => {
|
|
74
|
-
const hash =
|
|
75
|
-
'0x002b7cc3c85168d885a38226a28fac349d13cbaff7f3db4fa3af31f22b863079'
|
|
76
79
|
const dataArr = [
|
|
77
|
-
{ key: '
|
|
78
|
-
{ key: '
|
|
80
|
+
{ key: 'foo', value: 'bar' },
|
|
81
|
+
{ key: 'swag', value: 'cool' },
|
|
79
82
|
]
|
|
83
|
+
const tx = await ENSInstance.setRecords('test123.eth', {
|
|
84
|
+
records: {
|
|
85
|
+
texts: dataArr,
|
|
86
|
+
},
|
|
87
|
+
addressOrIndex: 1,
|
|
88
|
+
})
|
|
89
|
+
await tx.wait()
|
|
90
|
+
|
|
91
|
+
hash = tx.hash
|
|
92
|
+
|
|
80
93
|
const result = (await ENSInstance.getHistoryDetailForTransactionHash(
|
|
81
94
|
hash,
|
|
82
95
|
)) as { key: any; value: any }[]
|
|
@@ -88,9 +101,8 @@ describe('getHistory', () => {
|
|
|
88
101
|
}
|
|
89
102
|
})
|
|
90
103
|
it('should return a single item when an index is specified for a hash', async () => {
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
const data = { key: 'url', value: 'facebook.com' }
|
|
104
|
+
const data = { key: 'swag', value: 'cool' }
|
|
105
|
+
|
|
94
106
|
const result = (await ENSInstance.getHistoryDetailForTransactionHash(
|
|
95
107
|
hash,
|
|
96
108
|
1,
|