@ensdomains/ensjs 3.0.0-alpha.4 → 3.0.0-alpha.7

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 (86) hide show
  1. package/dist/cjs/GqlManager.d.ts +3 -0
  2. package/dist/cjs/GqlManager.js +62 -2
  3. package/dist/cjs/functions/burnFuses.d.ts +3 -1
  4. package/dist/cjs/functions/burnFuses.js +2 -6
  5. package/dist/cjs/functions/createSubname.d.ts +1 -5
  6. package/dist/cjs/functions/createSubname.js +3 -7
  7. package/dist/cjs/functions/deleteSubname.d.ts +3 -3
  8. package/dist/cjs/functions/deleteSubname.js +5 -2
  9. package/dist/cjs/functions/setName.d.ts +4 -3
  10. package/dist/cjs/functions/setName.js +5 -10
  11. package/dist/cjs/functions/setRecords.d.ts +4 -1
  12. package/dist/cjs/functions/setRecords.js +11 -9
  13. package/dist/cjs/functions/setResolver.d.ts +4 -3
  14. package/dist/cjs/functions/setResolver.js +5 -11
  15. package/dist/cjs/functions/transferName.d.ts +4 -3
  16. package/dist/cjs/functions/transferName.js +8 -13
  17. package/dist/cjs/functions/transferSubname.d.ts +4 -3
  18. package/dist/cjs/functions/transferSubname.js +3 -7
  19. package/dist/cjs/functions/unwrapName.d.ts +4 -3
  20. package/dist/cjs/functions/unwrapName.js +3 -8
  21. package/dist/cjs/functions/wrapName.d.ts +5 -3
  22. package/dist/cjs/functions/wrapName.js +8 -12
  23. package/dist/cjs/index.d.ts +40 -44
  24. package/dist/cjs/index.js +39 -22
  25. package/dist/cjs/utils/normalise.d.ts +1 -1
  26. package/dist/cjs/utils/normalise.js +10 -3
  27. package/dist/cjs/utils/writeTx.d.ts +4 -0
  28. package/dist/cjs/utils/writeTx.js +3 -0
  29. package/dist/esm/GqlManager.d.ts +3 -0
  30. package/dist/esm/GqlManager.js +58 -2
  31. package/dist/esm/functions/burnFuses.d.ts +3 -1
  32. package/dist/esm/functions/burnFuses.js +2 -6
  33. package/dist/esm/functions/createSubname.d.ts +1 -5
  34. package/dist/esm/functions/createSubname.js +3 -7
  35. package/dist/esm/functions/deleteSubname.d.ts +3 -3
  36. package/dist/esm/functions/deleteSubname.js +5 -2
  37. package/dist/esm/functions/setName.d.ts +4 -3
  38. package/dist/esm/functions/setName.js +5 -10
  39. package/dist/esm/functions/setRecords.d.ts +4 -1
  40. package/dist/esm/functions/setRecords.js +11 -9
  41. package/dist/esm/functions/setResolver.d.ts +4 -3
  42. package/dist/esm/functions/setResolver.js +5 -11
  43. package/dist/esm/functions/transferName.d.ts +4 -3
  44. package/dist/esm/functions/transferName.js +8 -13
  45. package/dist/esm/functions/transferSubname.d.ts +4 -3
  46. package/dist/esm/functions/transferSubname.js +3 -7
  47. package/dist/esm/functions/unwrapName.d.ts +4 -3
  48. package/dist/esm/functions/unwrapName.js +3 -8
  49. package/dist/esm/functions/wrapName.d.ts +5 -3
  50. package/dist/esm/functions/wrapName.js +8 -12
  51. package/dist/esm/index.d.ts +40 -44
  52. package/dist/esm/index.js +39 -22
  53. package/dist/esm/utils/normalise.d.ts +1 -1
  54. package/dist/esm/utils/normalise.js +10 -3
  55. package/dist/esm/utils/writeTx.d.ts +4 -0
  56. package/dist/esm/utils/writeTx.js +1 -0
  57. package/package.json +7 -5
  58. package/src/GqlManager.test.ts +170 -0
  59. package/src/GqlManager.ts +67 -2
  60. package/src/functions/burnFuses.test.ts +9 -8
  61. package/src/functions/burnFuses.ts +7 -9
  62. package/src/functions/createSubname.test.ts +8 -11
  63. package/src/functions/createSubname.ts +5 -12
  64. package/src/functions/deleteSubname.test.ts +28 -27
  65. package/src/functions/deleteSubname.ts +9 -12
  66. package/src/functions/getFuses.test.ts +11 -9
  67. package/src/functions/getOwner.test.ts +3 -1
  68. package/src/functions/setName.test.ts +3 -2
  69. package/src/functions/setName.ts +15 -17
  70. package/src/functions/setRecords.test.ts +7 -5
  71. package/src/functions/setRecords.ts +19 -13
  72. package/src/functions/setResolver.test.ts +12 -15
  73. package/src/functions/setResolver.ts +14 -19
  74. package/src/functions/transferName.test.ts +27 -29
  75. package/src/functions/transferName.ts +17 -21
  76. package/src/functions/transferSubname.test.ts +30 -29
  77. package/src/functions/transferSubname.ts +19 -12
  78. package/src/functions/unwrapName.test.ts +22 -22
  79. package/src/functions/unwrapName.ts +18 -14
  80. package/src/functions/wrapName.test.ts +15 -12
  81. package/src/functions/wrapName.ts +20 -22
  82. package/src/index.ts +105 -30
  83. package/src/tests/populateTransaction.test.ts +40 -0
  84. package/src/tests/signerInjection.test.ts +46 -0
  85. package/src/utils/normalise.ts +10 -4
  86. package/src/utils/writeTx.ts +6 -0
@@ -5,11 +5,9 @@ import generateFuseInput from '../utils/generateFuseInput'
5
5
  import { namehash } from '../utils/normalise'
6
6
 
7
7
  type BaseArgs = {
8
- name: string
9
8
  owner: string
10
9
  resolverAddress?: string
11
10
  contract: 'registry' | 'nameWrapper'
12
- options?: { addressOrIndex?: string | number }
13
11
  }
14
12
 
15
13
  type NameWrapperArgs = {
@@ -20,15 +18,10 @@ type NameWrapperArgs = {
20
18
  type Args = BaseArgs | NameWrapperArgs
21
19
 
22
20
  export default async function (
23
- { contracts, provider }: ENSArgs<'contracts' | 'provider'>,
24
- { name, owner, resolverAddress, contract, options, ...wrapperArgs }: Args,
21
+ { contracts, signer }: ENSArgs<'contracts' | 'signer'>,
22
+ name: string,
23
+ { owner, resolverAddress, contract, ...wrapperArgs }: Args,
25
24
  ) {
26
- const signer = provider?.getSigner(options?.addressOrIndex)
27
-
28
- if (!signer) {
29
- throw new Error('No signer found')
30
- }
31
-
32
25
  const labels = name.split('.')
33
26
 
34
27
  if (labels.length === 1) {
@@ -51,7 +44,7 @@ export default async function (
51
44
  case 'registry': {
52
45
  const registry = (await contracts?.getRegistry()!).connect(signer)
53
46
 
54
- return registry.setSubnodeRecord(
47
+ return registry.populateTransaction.setSubnodeRecord(
55
48
  parentNodehash,
56
49
  labelhash,
57
50
  owner,
@@ -67,7 +60,7 @@ export default async function (
67
60
  ? generateFuseInput(wrapperArgs.fuses)
68
61
  : '0'
69
62
 
70
- return nameWrapper.setSubnodeRecord(
63
+ return nameWrapper.populateTransaction.setSubnodeRecord(
71
64
  parentNodehash,
72
65
  label,
73
66
  owner,
@@ -1,7 +1,7 @@
1
1
  import { ethers } from 'ethers'
2
2
  import { ENS } from '..'
3
- import { namehash } from '../utils/normalise'
4
3
  import setup from '../tests/setup'
4
+ import { namehash } from '../utils/normalise'
5
5
 
6
6
  let ENSInstance: ENS
7
7
  let revert: Awaited<ReturnType<typeof setup>>['revert']
@@ -22,19 +22,20 @@ describe('deleteSubname', () => {
22
22
  await revert()
23
23
  })
24
24
  it('should allow deleting a subname on the registry', async () => {
25
- const createSubnameTx = await ENSInstance.createSubname({
26
- contract: 'registry',
27
- name: 'test.parthtejpal.eth',
28
- owner: accounts[0],
29
- options: { addressOrIndex: 0 },
30
- })
31
- await createSubnameTx.wait()
32
-
33
- const tx = await ENSInstance.deleteSubname(
25
+ const createSubnameTx = await ENSInstance.createSubname(
34
26
  'test.parthtejpal.eth',
35
- 'registry',
36
- { addressOrIndex: 0 },
27
+ {
28
+ contract: 'registry',
29
+ owner: accounts[0],
30
+ addressOrIndex: 0,
31
+ },
37
32
  )
33
+ await createSubnameTx.wait()
34
+
35
+ const tx = await ENSInstance.deleteSubname('test.parthtejpal.eth', {
36
+ contract: 'registry',
37
+ addressOrIndex: 0,
38
+ })
38
39
  expect(tx).toBeTruthy()
39
40
  await tx.wait()
40
41
 
@@ -43,24 +44,24 @@ describe('deleteSubname', () => {
43
44
  expect(result).toBe('0x0000000000000000000000000000000000000000')
44
45
  })
45
46
  it('should allow deleting a subname on the nameWrapper', async () => {
46
- const wrapNameTx = await ENSInstance.wrapName(
47
- 'parthtejpal.eth',
48
- accounts[0],
49
- )
50
- await wrapNameTx.wait()
51
- const createSubnameTx = await ENSInstance.createSubname({
52
- contract: 'nameWrapper',
53
- name: 'test.parthtejpal.eth',
54
- owner: accounts[0],
55
- options: { addressOrIndex: 0 },
47
+ const wrapNameTx = await ENSInstance.wrapName('parthtejpal.eth', {
48
+ wrappedOwner: accounts[0],
56
49
  })
57
- await createSubnameTx.wait()
58
-
59
- const tx = await ENSInstance.deleteSubname(
50
+ await wrapNameTx.wait()
51
+ const createSubnameTx = await ENSInstance.createSubname(
60
52
  'test.parthtejpal.eth',
61
- 'nameWrapper',
62
- { addressOrIndex: 0 },
53
+ {
54
+ contract: 'nameWrapper',
55
+ owner: accounts[0],
56
+ addressOrIndex: 0,
57
+ },
63
58
  )
59
+ await createSubnameTx.wait()
60
+
61
+ const tx = await ENSInstance.deleteSubname('test.parthtejpal.eth', {
62
+ contract: 'nameWrapper',
63
+ addressOrIndex: 0,
64
+ })
64
65
  expect(tx).toBeTruthy()
65
66
  await tx.wait()
66
67
 
@@ -1,19 +1,16 @@
1
1
  import { ENSArgs } from '..'
2
2
 
3
3
  export default async function (
4
- {
5
- contracts,
6
- provider,
7
- transferSubname,
8
- }: ENSArgs<'contracts' | 'provider' | 'transferSubname'>,
4
+ { transferSubname }: ENSArgs<'transferSubname'>,
9
5
  name: string,
10
- contract: 'registry' | 'nameWrapper',
11
- options?: { addressOrIndex?: string | number },
6
+ {
7
+ contract,
8
+ }: {
9
+ contract: 'registry' | 'nameWrapper'
10
+ },
12
11
  ) {
13
- return transferSubname(
14
- name,
12
+ return transferSubname.populateTransaction(name, {
15
13
  contract,
16
- '0x0000000000000000000000000000000000000000',
17
- options,
18
- )
14
+ address: '0x0000000000000000000000000000000000000000',
15
+ })
19
16
  }
@@ -12,7 +12,9 @@ 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', accounts[0])
15
+ const tx = await ENSInstance.wrapName('parthtejpal.eth', {
16
+ wrappedOwner: accounts[0],
17
+ })
16
18
  await tx.wait()
17
19
 
18
20
  withWrappedSnapshot = await createSnapshot()
@@ -33,11 +35,10 @@ describe('getFuses', () => {
33
35
  expect(result).toBeUndefined()
34
36
  })
35
37
  it('should return with canDoEverything set to true for a name with no fuses burned', async () => {
36
- const tx = await ENSInstance.createSubname({
38
+ const tx = await ENSInstance.createSubname('test.parthtejpal.eth', {
37
39
  contract: 'nameWrapper',
38
- name: 'test.parthtejpal.eth',
39
40
  owner: accounts[0],
40
- options: { addressOrIndex: 0 },
41
+ addressOrIndex: 0,
41
42
  })
42
43
  await tx.wait()
43
44
 
@@ -56,9 +57,11 @@ describe('getFuses', () => {
56
57
  })
57
58
  it('should return with other correct fuses', async () => {
58
59
  const tx = await ENSInstance.burnFuses('parthtejpal.eth', {
59
- cannotUnwrap: true,
60
- cannotSetTtl: true,
61
- cannotCreateSubdomain: true,
60
+ fusesToBurn: {
61
+ cannotUnwrap: true,
62
+ cannotSetTtl: true,
63
+ cannotCreateSubdomain: true,
64
+ },
62
65
  })
63
66
  await tx.wait()
64
67
  const result = await ENSInstance.getFuses('parthtejpal.eth')
@@ -86,8 +89,7 @@ describe('getFuses', () => {
86
89
  }
87
90
  })
88
91
  it('should return correct vulnerability data for a vulnerable node', async () => {
89
- const tx = await ENSInstance.createSubname({
90
- name: 'test.parthtejpal.eth',
92
+ const tx = await ENSInstance.createSubname('test.parthtejpal.eth', {
91
93
  owner: accounts[0],
92
94
  contract: 'nameWrapper',
93
95
  })
@@ -10,7 +10,9 @@ let accounts: string[]
10
10
  beforeAll(async () => {
11
11
  ;({ ENSInstance, revert, provider } = await setup())
12
12
  accounts = await provider.listAccounts()
13
- const tx = await ENSInstance.wrapName('parthtejpal.eth', accounts[0])
13
+ const tx = await ENSInstance.wrapName('parthtejpal.eth', {
14
+ wrappedOwner: accounts[0],
15
+ })
14
16
  await tx.wait()
15
17
  })
16
18
 
@@ -1,7 +1,7 @@
1
1
  import { ethers } from 'ethers'
2
2
  import { ENS } from '..'
3
- import { hexEncodeName } from '../utils/hexEncodedName'
4
3
  import setup from '../tests/setup'
4
+ import { hexEncodeName } from '../utils/hexEncodedName'
5
5
 
6
6
  let ENSInstance: ENS
7
7
  let revert: Awaited<ReturnType<typeof setup>>['revert']
@@ -43,7 +43,8 @@ describe('setName', () => {
43
43
  )
44
44
  await setApprovedForAllTx?.wait()
45
45
 
46
- const tx = await ENSInstance.setName('fleek.eth', accounts[0], undefined, {
46
+ const tx = await ENSInstance.setName('fleek.eth', {
47
+ address: accounts[0],
47
48
  addressOrIndex: 1,
48
49
  })
49
50
  expect(tx).toBeTruthy()
@@ -1,34 +1,32 @@
1
1
  import { ENSArgs } from '..'
2
2
 
3
3
  export default async function (
4
- { contracts, provider }: ENSArgs<'contracts' | 'provider'>,
4
+ { contracts, signer }: ENSArgs<'contracts' | 'signer'>,
5
5
  name: string,
6
- address?: string,
7
- resolver?: string,
8
- options?: { addressOrIndex?: string | number },
6
+ {
7
+ address,
8
+ resolver,
9
+ }: {
10
+ address?: string
11
+ resolver?: string
12
+ } = {},
9
13
  ) {
10
- const signerAddress = await provider
11
- ?.getSigner(options?.addressOrIndex)
12
- .getAddress()
13
-
14
- if (!signerAddress) {
15
- throw new Error('No signer found')
16
- }
14
+ const signerAddress = await signer.getAddress()
17
15
 
18
16
  const reverseRegistrar = (await contracts?.getReverseRegistrar())?.connect(
19
- provider?.getSigner()!,
20
- )
17
+ signer,
18
+ )!
21
19
 
22
20
  if (address) {
23
- const publicResolver = await contracts?.getPublicResolver()
21
+ const publicResolver = await contracts?.getPublicResolver()!
24
22
 
25
- return reverseRegistrar?.setNameForAddr(
23
+ return reverseRegistrar.populateTransaction.setNameForAddr(
26
24
  address,
27
25
  signerAddress,
28
- resolver || publicResolver!.address,
26
+ resolver || publicResolver.address,
29
27
  name,
30
28
  )
31
29
  }
32
30
 
33
- return reverseRegistrar?.setName(name)
31
+ return reverseRegistrar.populateTransaction.setName(name)
34
32
  }
@@ -1,7 +1,7 @@
1
1
  import { ENS } from '..'
2
+ import setup from '../tests/setup'
2
3
  import { hexEncodeName } from '../utils/hexEncodedName'
3
4
  import { namehash } from '../utils/normalise'
4
- import setup from '../tests/setup'
5
5
 
6
6
  let ENSInstance: ENS
7
7
  let revert: Awaited<ReturnType<typeof setup>>['revert']
@@ -17,10 +17,12 @@ afterAll(async () => {
17
17
  describe('setRecords', () => {
18
18
  it('should return a transaction to the resolver and set successfully', async () => {
19
19
  const tx = await ENSInstance.setRecords('parthtejpal.eth', {
20
- coinTypes: [
21
- { key: 'ETC', value: '0x42D63ae25990889E35F215bC95884039Ba354115' },
22
- ],
23
- texts: [{ key: 'foo', value: 'bar' }],
20
+ records: {
21
+ coinTypes: [
22
+ { key: 'ETC', value: '0x42D63ae25990889E35F215bC95884039Ba354115' },
23
+ ],
24
+ texts: [{ key: 'foo', value: 'bar' }],
25
+ },
24
26
  })
25
27
  expect(tx).toBeTruthy()
26
28
  await tx.wait()
@@ -7,32 +7,38 @@ export default async function (
7
7
  contracts,
8
8
  provider,
9
9
  getResolver,
10
- }: ENSArgs<'contracts' | 'provider' | 'getResolver'>,
10
+ signer,
11
+ }: ENSArgs<'contracts' | 'provider' | 'getResolver' | 'signer'>,
11
12
  name: string,
12
- records: RecordOptions,
13
+ {
14
+ records,
15
+ resolverAddress,
16
+ }: {
17
+ records: RecordOptions
18
+ resolverAddress?: string
19
+ },
13
20
  ) {
14
21
  if (!name.includes('.')) {
15
22
  throw new Error('Input is not an ENS name')
16
23
  }
17
24
 
18
- const resolverAddress = await getResolver(name)
19
-
20
- if (!resolverAddress) {
21
- throw new Error('No resolver found for input address')
25
+ let resolverToUse: string
26
+ if (resolverAddress) {
27
+ resolverToUse = resolverAddress
28
+ } else {
29
+ resolverToUse = await getResolver(name)
22
30
  }
23
31
 
24
- const address = await provider?.getSigner().getAddress()
25
-
26
- if (!address) {
27
- throw new Error('No signer found')
32
+ if (!resolverToUse) {
33
+ throw new Error('No resolver found for input address')
28
34
  }
29
35
 
30
36
  const resolver = (
31
- await contracts?.getPublicResolver(provider, resolverAddress)
32
- )?.connect(provider?.getSigner()!)
37
+ await contracts?.getPublicResolver(provider, resolverToUse)
38
+ )?.connect(signer)!
33
39
  const hash = namehash(name)
34
40
 
35
41
  const calls: string[] = generateRecordCallArray(hash, records, resolver!)
36
42
 
37
- return resolver?.multicall(calls)
43
+ return resolver.populateTransaction.multicall(calls)
38
44
  }
@@ -1,7 +1,7 @@
1
1
  import { ethers } from 'ethers'
2
2
  import { ENS } from '..'
3
- import { hexEncodeName } from '../utils/hexEncodedName'
4
3
  import setup from '../tests/setup'
4
+ import { hexEncodeName } from '../utils/hexEncodedName'
5
5
 
6
6
  let ENSInstance: ENS
7
7
  let revert: Awaited<ReturnType<typeof setup>>['revert']
@@ -20,11 +20,10 @@ describe('setResolver', () => {
20
20
  await revert()
21
21
  })
22
22
  it('should return a transaction to the registry and set successfully', async () => {
23
- const tx = await ENSInstance.setResolver(
24
- 'parthtejpal.eth',
25
- 'registry',
26
- '0xAEfF4f4d8e2cB51854BEa2244B3C5Fb36b41C7fC',
27
- )
23
+ const tx = await ENSInstance.setResolver('parthtejpal.eth', {
24
+ contract: 'registry',
25
+ resolver: '0xAEfF4f4d8e2cB51854BEa2244B3C5Fb36b41C7fC',
26
+ })
28
27
  expect(tx).toBeTruthy()
29
28
  await tx.wait()
30
29
 
@@ -37,16 +36,14 @@ describe('setResolver', () => {
37
36
  })
38
37
  it('should return a transaction to the namewrapper and set successfully', async () => {
39
38
  const accounts = await provider.listAccounts()
40
- const wrapNameTx = await ENSInstance.wrapName(
41
- 'parthtejpal.eth',
42
- accounts[0],
43
- )
39
+ const wrapNameTx = await ENSInstance.wrapName('parthtejpal.eth', {
40
+ wrappedOwner: accounts[0],
41
+ })
44
42
  await wrapNameTx.wait()
45
- const tx = await ENSInstance.setResolver(
46
- 'parthtejpal.eth',
47
- 'nameWrapper',
48
- '0xAEfF4f4d8e2cB51854BEa2244B3C5Fb36b41C7fC',
49
- )
43
+ const tx = await ENSInstance.setResolver('parthtejpal.eth', {
44
+ contract: 'nameWrapper',
45
+ resolver: '0xAEfF4f4d8e2cB51854BEa2244B3C5Fb36b41C7fC',
46
+ })
50
47
  expect(tx).toBeTruthy()
51
48
  await tx.wait()
52
49
 
@@ -2,36 +2,31 @@ import { ENSArgs } from '..'
2
2
  import { namehash } from '../utils/normalise'
3
3
 
4
4
  export default async function (
5
- { contracts, provider }: ENSArgs<'contracts' | 'provider'>,
5
+ { contracts, signer }: ENSArgs<'contracts' | 'signer'>,
6
6
  name: string,
7
- contract: 'registry' | 'nameWrapper',
8
- resolver?: string,
9
- options?: { addressOrIndex?: string | number },
7
+ {
8
+ contract,
9
+ resolver,
10
+ }: {
11
+ contract: 'registry' | 'nameWrapper'
12
+ resolver?: string
13
+ },
10
14
  ) {
11
- const address = await provider
12
- ?.getSigner(options?.addressOrIndex)
13
- .getAddress()
14
-
15
- if (!address) {
16
- throw new Error('No signer found')
17
- }
18
-
19
15
  if (!resolver) {
20
16
  resolver = (await contracts?.getPublicResolver()!).address
21
17
  }
22
18
 
23
19
  switch (contract) {
24
20
  case 'registry': {
25
- const registry = (await contracts?.getRegistry())!.connect(
26
- provider?.getSigner(options?.addressOrIndex)!,
27
- )
28
- return registry.setResolver(namehash(name), resolver)
21
+ const registry = (await contracts?.getRegistry())!.connect(signer)
22
+ return registry.populateTransaction.setResolver(namehash(name), resolver)
29
23
  }
30
24
  case 'nameWrapper': {
31
- const nameWrapper = (await contracts?.getNameWrapper())!.connect(
32
- provider?.getSigner(options?.addressOrIndex)!,
25
+ const nameWrapper = (await contracts?.getNameWrapper())!.connect(signer)
26
+ return nameWrapper.populateTransaction.setResolver(
27
+ namehash(name),
28
+ resolver,
33
29
  )
34
- return nameWrapper.setResolver(namehash(name), resolver)
35
30
  }
36
31
  default: {
37
32
  throw new Error(`Unknown contract: ${contract}`)
@@ -1,7 +1,7 @@
1
1
  import { ethers, utils } from 'ethers'
2
2
  import { ENS } from '..'
3
- import { namehash } from '../utils/normalise'
4
3
  import setup from '../tests/setup'
4
+ import { namehash } from '../utils/normalise'
5
5
 
6
6
  let ENSInstance: ENS
7
7
  let revert: Awaited<ReturnType<typeof setup>>['revert']
@@ -22,12 +22,11 @@ describe('transferName', () => {
22
22
  await revert()
23
23
  })
24
24
  it('should allow a transfer on the registrar', async () => {
25
- const tx = await ENSInstance.transferName(
26
- 'parthtejpal.eth',
27
- accounts[1],
28
- 'baseRegistrar',
29
- { addressOrIndex: 0 },
30
- )
25
+ const tx = await ENSInstance.transferName('parthtejpal.eth', {
26
+ contract: 'baseRegistrar',
27
+ newOwner: accounts[1],
28
+ addressOrIndex: 0,
29
+ })
31
30
  expect(tx).toBeTruthy()
32
31
  await tx.wait()
33
32
 
@@ -38,17 +37,15 @@ describe('transferName', () => {
38
37
  expect(result).toBe(accounts[1])
39
38
  })
40
39
  it('should allow a transfer on the namewrapper', async () => {
41
- const wrapNameTx = await ENSInstance.wrapName(
42
- 'parthtejpal.eth',
43
- accounts[0],
44
- )
40
+ const wrapNameTx = await ENSInstance.wrapName('parthtejpal.eth', {
41
+ wrappedOwner: accounts[0],
42
+ })
45
43
  await wrapNameTx.wait()
46
- const tx = await ENSInstance.transferName(
47
- 'parthtejpal.eth',
48
- accounts[1],
49
- 'nameWrapper',
50
- { addressOrIndex: 0 },
51
- )
44
+ const tx = await ENSInstance.transferName('parthtejpal.eth', {
45
+ newOwner: accounts[1],
46
+ contract: 'nameWrapper',
47
+ addressOrIndex: 0,
48
+ })
52
49
  expect(tx).toBeTruthy()
53
50
  await tx.wait()
54
51
 
@@ -57,20 +54,21 @@ describe('transferName', () => {
57
54
  expect(result).toBe(accounts[1])
58
55
  })
59
56
  it('should allow a transfer on the registry', async () => {
60
- const createSubnameTx = await ENSInstance.createSubname({
61
- name: 'test.parthtejpal.eth',
62
- contract: 'registry',
63
- owner: accounts[0],
64
- options: { addressOrIndex: accounts[0] },
65
- })
66
- await createSubnameTx.wait()
67
-
68
- const tx = await ENSInstance.transferName(
57
+ const createSubnameTx = await ENSInstance.createSubname(
69
58
  'test.parthtejpal.eth',
70
- accounts[1],
71
- 'registry',
72
- { addressOrIndex: accounts[0] },
59
+ {
60
+ contract: 'registry',
61
+ owner: accounts[0],
62
+ addressOrIndex: accounts[0],
63
+ },
73
64
  )
65
+ await createSubnameTx.wait()
66
+
67
+ const tx = await ENSInstance.transferName('test.parthtejpal.eth', {
68
+ newOwner: accounts[1],
69
+ contract: 'registry',
70
+ addressOrIndex: accounts[0],
71
+ })
74
72
  expect(tx).toBeTruthy()
75
73
  await tx.wait()
76
74
 
@@ -3,46 +3,42 @@ import { ENSArgs } from '..'
3
3
  import { namehash } from '../utils/normalise'
4
4
 
5
5
  export default async function (
6
- { contracts, provider }: ENSArgs<'contracts' | 'provider'>,
6
+ { contracts, signer }: ENSArgs<'contracts' | 'signer'>,
7
7
  name: string,
8
- newOwner: string,
9
- contract: 'registry' | 'nameWrapper' | 'baseRegistrar',
10
- options?: { addressOrIndex?: string | number },
8
+ {
9
+ newOwner,
10
+ contract,
11
+ }: {
12
+ newOwner: string
13
+ contract: 'registry' | 'nameWrapper' | 'baseRegistrar'
14
+ },
11
15
  ) {
12
- const address = await provider
13
- ?.getSigner(options?.addressOrIndex)
14
- .getAddress()
15
-
16
- if (!address) {
17
- throw new Error('No signer found')
18
- }
16
+ const address = await signer.getAddress()
19
17
 
20
18
  switch (contract) {
21
19
  case 'registry': {
22
- const registry = (await contracts?.getRegistry())!.connect(
23
- provider?.getSigner(options?.addressOrIndex)!,
24
- )
25
- return registry.setOwner(namehash(name), newOwner)
20
+ const registry = (await contracts?.getRegistry())!.connect(signer)
21
+ return registry.populateTransaction.setOwner(namehash(name), newOwner)
26
22
  }
27
23
  case 'baseRegistrar': {
28
24
  const baseRegistrar = (await contracts?.getBaseRegistrar())!.connect(
29
- provider?.getSigner(options?.addressOrIndex)!,
25
+ signer,
30
26
  )
31
27
  const labels = name.split('.')
32
28
  if (labels.length > 2 || labels[labels.length - 1] !== 'eth') {
33
29
  throw new Error('Invalid name for baseRegistrar')
34
30
  }
35
- return baseRegistrar['safeTransferFrom(address,address,uint256)'](
31
+ return baseRegistrar.populateTransaction[
32
+ 'safeTransferFrom(address,address,uint256)'
33
+ ](
36
34
  address,
37
35
  newOwner,
38
36
  ethers.utils.solidityKeccak256(['string'], [labels[0]]),
39
37
  )
40
38
  }
41
39
  case 'nameWrapper': {
42
- const nameWrapper = (await contracts?.getNameWrapper())!.connect(
43
- provider?.getSigner(options?.addressOrIndex)!,
44
- )
45
- return nameWrapper.safeTransferFrom(
40
+ const nameWrapper = (await contracts?.getNameWrapper())!.connect(signer)
41
+ return nameWrapper.populateTransaction.safeTransferFrom(
46
42
  address,
47
43
  newOwner,
48
44
  namehash(name),