@ensdomains/ensjs 3.0.0-alpha.2 → 3.0.0-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 (89) hide show
  1. package/dist/cjs/functions/burnFuses.d.ts +3 -1
  2. package/dist/cjs/functions/burnFuses.js +1 -5
  3. package/dist/cjs/functions/createSubname.d.ts +1 -5
  4. package/dist/cjs/functions/createSubname.js +1 -5
  5. package/dist/cjs/functions/deleteSubname.d.ts +2 -2
  6. package/dist/cjs/functions/deleteSubname.js +5 -2
  7. package/dist/cjs/functions/getDNSOwner.d.ts +7 -0
  8. package/dist/cjs/functions/getDNSOwner.js +81 -0
  9. package/dist/cjs/functions/setName.d.ts +3 -2
  10. package/dist/cjs/functions/setName.js +3 -8
  11. package/dist/cjs/functions/setRecords.d.ts +4 -1
  12. package/dist/cjs/functions/setRecords.js +10 -8
  13. package/dist/cjs/functions/setResolver.d.ts +3 -2
  14. package/dist/cjs/functions/setResolver.js +3 -9
  15. package/dist/cjs/functions/transferName.d.ts +3 -2
  16. package/dist/cjs/functions/transferName.js +5 -10
  17. package/dist/cjs/functions/transferSubname.d.ts +3 -2
  18. package/dist/cjs/functions/transferSubname.js +1 -5
  19. package/dist/cjs/functions/unwrapName.d.ts +3 -2
  20. package/dist/cjs/functions/unwrapName.js +1 -6
  21. package/dist/cjs/functions/wrapName.d.ts +4 -2
  22. package/dist/cjs/functions/wrapName.js +6 -10
  23. package/dist/cjs/index.d.ts +52 -34
  24. package/dist/cjs/index.js +36 -22
  25. package/dist/esm/functions/burnFuses.d.ts +3 -1
  26. package/dist/esm/functions/burnFuses.js +1 -5
  27. package/dist/esm/functions/createSubname.d.ts +1 -5
  28. package/dist/esm/functions/createSubname.js +1 -5
  29. package/dist/esm/functions/deleteSubname.d.ts +2 -2
  30. package/dist/esm/functions/deleteSubname.js +5 -2
  31. package/dist/esm/functions/getDNSOwner.d.ts +7 -0
  32. package/dist/esm/functions/getDNSOwner.js +51 -0
  33. package/dist/esm/functions/setName.d.ts +3 -2
  34. package/dist/esm/functions/setName.js +3 -8
  35. package/dist/esm/functions/setRecords.d.ts +4 -1
  36. package/dist/esm/functions/setRecords.js +10 -8
  37. package/dist/esm/functions/setResolver.d.ts +3 -2
  38. package/dist/esm/functions/setResolver.js +3 -9
  39. package/dist/esm/functions/transferName.d.ts +3 -2
  40. package/dist/esm/functions/transferName.js +5 -10
  41. package/dist/esm/functions/transferSubname.d.ts +3 -2
  42. package/dist/esm/functions/transferSubname.js +1 -5
  43. package/dist/esm/functions/unwrapName.d.ts +3 -2
  44. package/dist/esm/functions/unwrapName.js +1 -6
  45. package/dist/esm/functions/wrapName.d.ts +4 -2
  46. package/dist/esm/functions/wrapName.js +6 -10
  47. package/dist/esm/index.d.ts +52 -34
  48. package/dist/esm/index.js +36 -22
  49. package/package.json +10 -5
  50. package/src/@types/dns-packet/index.d.ts +114 -0
  51. package/src/{tests → functions}/batch.test.ts +1 -1
  52. package/src/{tests → functions}/batchWrappers.test.ts +1 -1
  53. package/src/{tests → functions}/burnFuses.test.ts +9 -8
  54. package/src/functions/burnFuses.ts +6 -8
  55. package/src/{tests → functions}/createSubname.test.ts +8 -11
  56. package/src/functions/createSubname.ts +3 -10
  57. package/src/{tests → functions}/deleteSubname.test.ts +28 -27
  58. package/src/functions/deleteSubname.ts +9 -12
  59. package/src/functions/getDNSOwner.test.ts +122 -0
  60. package/src/functions/getDNSOwner.ts +61 -0
  61. package/src/{tests → functions}/getExpiry.test.ts +1 -1
  62. package/src/{tests → functions}/getFuses.test.ts +12 -10
  63. package/src/{tests → functions}/getHistory.test.ts +1 -1
  64. package/src/{tests → functions}/getName.test.ts +1 -1
  65. package/src/{tests → functions}/getNames.test.ts +1 -1
  66. package/src/{tests → functions}/getOwner.test.ts +4 -2
  67. package/src/{tests → functions}/getProfile.test.ts +1 -1
  68. package/src/{tests → functions}/getResolver.test.ts +1 -1
  69. package/src/{tests → functions}/getSpecificRecord.test.ts +1 -1
  70. package/src/{tests → functions}/getSubnames.test.ts +1 -1
  71. package/src/{tests → functions}/makeCommitment.test.ts +1 -1
  72. package/src/{tests → functions}/normalise.test.ts +0 -0
  73. package/src/{tests → functions}/setName.test.ts +3 -2
  74. package/src/functions/setName.ts +10 -12
  75. package/src/{tests → functions}/setRecords.test.ts +7 -5
  76. package/src/functions/setRecords.ts +18 -12
  77. package/src/{tests → functions}/setResolver.test.ts +12 -15
  78. package/src/functions/setResolver.ts +10 -18
  79. package/src/{tests → functions}/transferName.test.ts +27 -29
  80. package/src/functions/transferName.ts +12 -18
  81. package/src/{tests → functions}/transferSubname.test.ts +30 -29
  82. package/src/functions/transferSubname.ts +8 -10
  83. package/src/{tests → functions}/unwrapName.test.ts +22 -22
  84. package/src/functions/unwrapName.ts +8 -12
  85. package/src/{tests → functions}/wrapName.test.ts +15 -12
  86. package/src/functions/wrapName.ts +16 -15
  87. package/src/index.ts +85 -29
  88. package/src/tests/signerInjection.test.ts +42 -0
  89. package/src/tests/withProvider.test.ts +1 -1
@@ -1,3 +1,5 @@
1
1
  import { ENSArgs } from '..';
2
2
  import { FuseOptions } from '../@types/FuseOptions';
3
- export default function ({ contracts, provider }: ENSArgs<'contracts' | 'provider'>, name: string, fusesToBurn: FuseOptions): Promise<import("ethers").ContractTransaction>;
3
+ export default function ({ contracts, signer }: ENSArgs<'contracts' | 'signer'>, name: string, { fusesToBurn, }: {
4
+ fusesToBurn: FuseOptions;
5
+ }): Promise<import("ethers").ContractTransaction>;
@@ -1,10 +1,6 @@
1
1
  import generateFuseInput from '../utils/generateFuseInput';
2
2
  import { namehash } from '../utils/normalise';
3
- export default async function ({ contracts, provider }, name, fusesToBurn) {
4
- const signer = provider?.getSigner();
5
- if (!signer) {
6
- throw new Error('No signer found');
7
- }
3
+ export default async function ({ contracts, signer }, name, { fusesToBurn, }) {
8
4
  const nameWrapper = (await contracts?.getNameWrapper()).connect(signer);
9
5
  const hash = namehash(name);
10
6
  const encodedFuses = generateFuseInput(fusesToBurn);
@@ -2,18 +2,14 @@ import { ethers } from 'ethers';
2
2
  import { ENSArgs } from '..';
3
3
  import { FuseOptions } from '../@types/FuseOptions';
4
4
  declare type BaseArgs = {
5
- name: string;
6
5
  owner: string;
7
6
  resolverAddress?: string;
8
7
  contract: 'registry' | 'nameWrapper';
9
- options?: {
10
- addressOrIndex?: string | number;
11
- };
12
8
  };
13
9
  declare type NameWrapperArgs = {
14
10
  contract: 'nameWrapper';
15
11
  fuses?: FuseOptions;
16
12
  } & BaseArgs;
17
13
  declare type Args = BaseArgs | NameWrapperArgs;
18
- export default function ({ contracts, provider }: ENSArgs<'contracts' | 'provider'>, { name, owner, resolverAddress, contract, options, ...wrapperArgs }: Args): Promise<ethers.ContractTransaction>;
14
+ export default function ({ contracts, signer }: ENSArgs<'contracts' | 'signer'>, name: string, { owner, resolverAddress, contract, ...wrapperArgs }: Args): Promise<ethers.ContractTransaction>;
19
15
  export {};
@@ -1,11 +1,7 @@
1
1
  import { ethers } from 'ethers';
2
2
  import generateFuseInput from '../utils/generateFuseInput';
3
3
  import { namehash } from '../utils/normalise';
4
- export default async function ({ contracts, provider }, { name, owner, resolverAddress, contract, options, ...wrapperArgs }) {
5
- const signer = provider?.getSigner(options?.addressOrIndex);
6
- if (!signer) {
7
- throw new Error('No signer found');
8
- }
4
+ export default async function ({ contracts, signer }, name, { owner, resolverAddress, contract, ...wrapperArgs }) {
9
5
  const labels = name.split('.');
10
6
  if (labels.length === 1) {
11
7
  throw new Error('Subnames in ENS.js can only be created for 2LDs, not TLDs');
@@ -1,4 +1,4 @@
1
1
  import { ENSArgs } from '..';
2
- export default function ({ contracts, provider, transferSubname, }: ENSArgs<'contracts' | 'provider' | 'transferSubname'>, name: string, contract: 'registry' | 'nameWrapper', options?: {
3
- addressOrIndex?: string | number;
2
+ export default function ({ transferSubname }: ENSArgs<'transferSubname'>, name: string, { contract, }: {
3
+ contract: 'registry' | 'nameWrapper';
4
4
  }): Promise<import("ethers").ContractTransaction>;
@@ -1,3 +1,6 @@
1
- export default async function ({ contracts, provider, transferSubname, }, name, contract, options) {
2
- return transferSubname(name, contract, '0x0000000000000000000000000000000000000000', options);
1
+ export default async function ({ transferSubname }, name, { contract, }) {
2
+ return transferSubname(name, {
3
+ contract,
4
+ address: '0x0000000000000000000000000000000000000000',
5
+ });
3
6
  }
@@ -0,0 +1,7 @@
1
+ import * as packet from 'dns-packet';
2
+ export declare function encodeURLParams(p: {
3
+ [key: string]: string;
4
+ }): string;
5
+ export declare const getDNS: (q: packet.Packet) => Promise<packet.Packet>;
6
+ export declare const dnsQuery: (qtype: string, qname: string) => Promise<packet.Packet>;
7
+ export default function (_: any, dnsName: string): Promise<any>;
@@ -0,0 +1,51 @@
1
+ import * as packet from 'dns-packet';
2
+ export function encodeURLParams(p) {
3
+ return Object.entries(p)
4
+ .map((kv) => kv.map(encodeURIComponent).join('='))
5
+ .join('&');
6
+ }
7
+ export const getDNS = async (q) => {
8
+ const response = await global.fetch(`https://cloudflare-dns.com/dns-query?${encodeURLParams({
9
+ ct: 'application/dns-udpwireformat',
10
+ dns: packet.encode(q)?.toString('base64'),
11
+ ts: Date.now().toString(),
12
+ })}`);
13
+ const arrayBuffer = await response.arrayBuffer();
14
+ // @ts-ignore:next-line
15
+ const fromArrayBuffer = Buffer.from(arrayBuffer);
16
+ return packet.decode(fromArrayBuffer);
17
+ };
18
+ export const dnsQuery = async (qtype, qname) => {
19
+ const query = {
20
+ type: 'query',
21
+ id: 1,
22
+ flags: packet.RECURSION_DESIRED,
23
+ questions: [
24
+ {
25
+ type: qtype,
26
+ class: 'IN',
27
+ name: qname,
28
+ },
29
+ ],
30
+ additionals: [
31
+ {
32
+ type: 'OPT',
33
+ class: 'IN',
34
+ name: '.',
35
+ udpPayloadSize: 4096,
36
+ flags: packet.DNSSEC_OK,
37
+ },
38
+ ],
39
+ answers: [],
40
+ };
41
+ const response = await getDNS(query);
42
+ if (response.rcode !== 'NOERROR') {
43
+ throw new Error(`DNS query failed: ${response.rcode}`);
44
+ }
45
+ return response;
46
+ };
47
+ export default async function (_, dnsName) {
48
+ const result = await dnsQuery('TXT', `_ens.${dnsName}`);
49
+ const address = result?.answers?.[0]?.data?.[0]?.toString()?.split('=')?.[1];
50
+ return address;
51
+ }
@@ -1,4 +1,5 @@
1
1
  import { ENSArgs } from '..';
2
- export default function ({ contracts, provider }: ENSArgs<'contracts' | 'provider'>, name: string, address?: string, resolver?: string, options?: {
3
- addressOrIndex?: string | number;
2
+ export default function ({ contracts, signer }: ENSArgs<'contracts' | 'signer'>, name: string, { address, resolver, }?: {
3
+ address?: string;
4
+ resolver?: string;
4
5
  }): Promise<import("ethers").ContractTransaction | undefined>;
@@ -1,11 +1,6 @@
1
- export default async function ({ contracts, provider }, name, address, resolver, options) {
2
- const signerAddress = await provider
3
- ?.getSigner(options?.addressOrIndex)
4
- .getAddress();
5
- if (!signerAddress) {
6
- throw new Error('No signer found');
7
- }
8
- const reverseRegistrar = (await contracts?.getReverseRegistrar())?.connect(provider?.getSigner());
1
+ export default async function ({ contracts, signer }, name, { address, resolver, } = {}) {
2
+ const signerAddress = await signer.getAddress();
3
+ const reverseRegistrar = (await contracts?.getReverseRegistrar())?.connect(signer);
9
4
  if (address) {
10
5
  const publicResolver = await contracts?.getPublicResolver();
11
6
  return reverseRegistrar?.setNameForAddr(address, signerAddress, resolver || publicResolver.address, name);
@@ -1,3 +1,6 @@
1
1
  import { ENSArgs } from '..';
2
2
  import { RecordOptions } from '../utils/recordHelpers';
3
- export default function ({ contracts, provider, getResolver, }: ENSArgs<'contracts' | 'provider' | 'getResolver'>, name: string, records: RecordOptions): Promise<import("ethers").ContractTransaction | undefined>;
3
+ export default function ({ contracts, provider, getResolver, signer, }: ENSArgs<'contracts' | 'provider' | 'getResolver' | 'signer'>, name: string, { records, resolverAddress, }: {
4
+ records: RecordOptions;
5
+ resolverAddress?: string;
6
+ }): Promise<import("ethers").ContractTransaction | undefined>;
@@ -1,18 +1,20 @@
1
1
  import { namehash } from '../utils/normalise';
2
2
  import { generateRecordCallArray } from '../utils/recordHelpers';
3
- export default async function ({ contracts, provider, getResolver, }, name, records) {
3
+ export default async function ({ contracts, provider, getResolver, signer, }, name, { records, resolverAddress, }) {
4
4
  if (!name.includes('.')) {
5
5
  throw new Error('Input is not an ENS name');
6
6
  }
7
- const resolverAddress = await getResolver(name);
8
- if (!resolverAddress) {
9
- throw new Error('No resolver found for input address');
7
+ let resolverToUse;
8
+ if (resolverAddress) {
9
+ resolverToUse = resolverAddress;
10
+ }
11
+ else {
12
+ resolverToUse = await getResolver(name);
10
13
  }
11
- const address = await provider?.getSigner().getAddress();
12
- if (!address) {
13
- throw new Error('No signer found');
14
+ if (!resolverToUse) {
15
+ throw new Error('No resolver found for input address');
14
16
  }
15
- const resolver = (await contracts?.getPublicResolver(provider, resolverAddress))?.connect(provider?.getSigner());
17
+ const resolver = (await contracts?.getPublicResolver(provider, resolverToUse))?.connect(signer);
16
18
  const hash = namehash(name);
17
19
  const calls = generateRecordCallArray(hash, records, resolver);
18
20
  return resolver?.multicall(calls);
@@ -1,4 +1,5 @@
1
1
  import { ENSArgs } from '..';
2
- export default function ({ contracts, provider }: ENSArgs<'contracts' | 'provider'>, name: string, contract: 'registry' | 'nameWrapper', resolver?: string, options?: {
3
- addressOrIndex?: string | number;
2
+ export default function ({ contracts, signer }: ENSArgs<'contracts' | 'signer'>, name: string, { contract, resolver, }: {
3
+ contract: 'registry' | 'nameWrapper';
4
+ resolver?: string;
4
5
  }): Promise<import("ethers").ContractTransaction>;
@@ -1,21 +1,15 @@
1
1
  import { namehash } from '../utils/normalise';
2
- export default async function ({ contracts, provider }, name, contract, resolver, options) {
3
- const address = await provider
4
- ?.getSigner(options?.addressOrIndex)
5
- .getAddress();
6
- if (!address) {
7
- throw new Error('No signer found');
8
- }
2
+ export default async function ({ contracts, signer }, name, { contract, resolver, }) {
9
3
  if (!resolver) {
10
4
  resolver = (await contracts?.getPublicResolver()).address;
11
5
  }
12
6
  switch (contract) {
13
7
  case 'registry': {
14
- const registry = (await contracts?.getRegistry()).connect(provider?.getSigner(options?.addressOrIndex));
8
+ const registry = (await contracts?.getRegistry()).connect(signer);
15
9
  return registry.setResolver(namehash(name), resolver);
16
10
  }
17
11
  case 'nameWrapper': {
18
- const nameWrapper = (await contracts?.getNameWrapper()).connect(provider?.getSigner(options?.addressOrIndex));
12
+ const nameWrapper = (await contracts?.getNameWrapper()).connect(signer);
19
13
  return nameWrapper.setResolver(namehash(name), resolver);
20
14
  }
21
15
  default: {
@@ -1,5 +1,6 @@
1
1
  import { ethers } from 'ethers';
2
2
  import { ENSArgs } from '..';
3
- export default function ({ contracts, provider }: ENSArgs<'contracts' | 'provider'>, name: string, newOwner: string, contract: 'registry' | 'nameWrapper' | 'baseRegistrar', options?: {
4
- addressOrIndex?: string | number;
3
+ export default function ({ contracts, signer }: ENSArgs<'contracts' | 'signer'>, name: string, { newOwner, contract, }: {
4
+ newOwner: string;
5
+ contract: 'registry' | 'nameWrapper' | 'baseRegistrar';
5
6
  }): Promise<ethers.ContractTransaction>;
@@ -1,19 +1,14 @@
1
1
  import { ethers } from 'ethers';
2
2
  import { namehash } from '../utils/normalise';
3
- export default async function ({ contracts, provider }, name, newOwner, contract, options) {
4
- const address = await provider
5
- ?.getSigner(options?.addressOrIndex)
6
- .getAddress();
7
- if (!address) {
8
- throw new Error('No signer found');
9
- }
3
+ export default async function ({ contracts, signer }, name, { newOwner, contract, }) {
4
+ const address = await signer.getAddress();
10
5
  switch (contract) {
11
6
  case 'registry': {
12
- const registry = (await contracts?.getRegistry()).connect(provider?.getSigner(options?.addressOrIndex));
7
+ const registry = (await contracts?.getRegistry()).connect(signer);
13
8
  return registry.setOwner(namehash(name), newOwner);
14
9
  }
15
10
  case 'baseRegistrar': {
16
- const baseRegistrar = (await contracts?.getBaseRegistrar()).connect(provider?.getSigner(options?.addressOrIndex));
11
+ const baseRegistrar = (await contracts?.getBaseRegistrar()).connect(signer);
17
12
  const labels = name.split('.');
18
13
  if (labels.length > 2 || labels[labels.length - 1] !== 'eth') {
19
14
  throw new Error('Invalid name for baseRegistrar');
@@ -21,7 +16,7 @@ export default async function ({ contracts, provider }, name, newOwner, contract
21
16
  return baseRegistrar['safeTransferFrom(address,address,uint256)'](address, newOwner, ethers.utils.solidityKeccak256(['string'], [labels[0]]));
22
17
  }
23
18
  case 'nameWrapper': {
24
- const nameWrapper = (await contracts?.getNameWrapper()).connect(provider?.getSigner(options?.addressOrIndex));
19
+ const nameWrapper = (await contracts?.getNameWrapper()).connect(signer);
25
20
  return nameWrapper.safeTransferFrom(address, newOwner, namehash(name), 1, '0x');
26
21
  }
27
22
  default: {
@@ -1,5 +1,6 @@
1
1
  import { ethers } from 'ethers';
2
2
  import { ENSArgs } from '..';
3
- export default function ({ contracts, provider }: ENSArgs<'contracts' | 'provider'>, name: string, contract: 'registry' | 'nameWrapper', address: string, options?: {
4
- addressOrIndex?: string | number;
3
+ export default function ({ contracts, signer }: ENSArgs<'contracts' | 'signer'>, name: string, { contract, address, }: {
4
+ contract: 'registry' | 'nameWrapper';
5
+ address: string;
5
6
  }): Promise<ethers.ContractTransaction>;
@@ -1,10 +1,6 @@
1
1
  import { ethers } from 'ethers';
2
2
  import { namehash } from '../utils/normalise';
3
- export default async function ({ contracts, provider }, name, contract, address, options) {
4
- const signer = provider?.getSigner(options?.addressOrIndex);
5
- if (!signer) {
6
- throw new Error('No signer found');
7
- }
3
+ export default async function ({ contracts, signer }, name, { contract, address, }) {
8
4
  const labels = name.split('.');
9
5
  const label = labels.shift();
10
6
  const labelhash = ethers.utils.solidityKeccak256(['string'], [label]);
@@ -1,4 +1,5 @@
1
1
  import { ENSArgs } from '..';
2
- export default function ({ contracts, provider }: ENSArgs<'contracts' | 'provider'>, name: string, newController: string, newRegistrant?: string, options?: {
3
- addressOrIndex?: string | number;
2
+ export default function ({ contracts, signer }: ENSArgs<'contracts' | 'signer'>, name: string, { newController, newRegistrant, }: {
3
+ newController: string;
4
+ newRegistrant?: string;
4
5
  }): Promise<import("ethers").ContractTransaction>;
@@ -1,11 +1,6 @@
1
1
  import { utils } from 'ethers';
2
2
  import { namehash } from '../utils/normalise';
3
- export default async function ({ contracts, provider }, name, newController, newRegistrant, options) {
4
- const signer = provider?.getSigner(options?.addressOrIndex);
5
- const address = await signer?.getAddress();
6
- if (!signer || !address) {
7
- throw new Error('No signer found');
8
- }
3
+ export default async function ({ contracts, signer }, name, { newController, newRegistrant, }) {
9
4
  const labels = name.split('.');
10
5
  const labelhash = utils.solidityKeccak256(['string'], [labels[0]]);
11
6
  const parentNodehash = namehash(labels.slice(1).join('.'));
@@ -1,6 +1,8 @@
1
1
  import { ethers } from 'ethers';
2
2
  import { ENSArgs } from '..';
3
3
  import type { FuseOptions } from '../@types/FuseOptions';
4
- export default function ({ contracts, provider }: ENSArgs<'contracts' | 'provider'>, name: string, wrappedOwner: string, fuseOptions?: FuseOptions | string | number, resolverAddress?: string, options?: {
5
- addressOrIndex?: string | number;
4
+ export default function ({ contracts, signer }: ENSArgs<'contracts' | 'signer'>, name: string, { wrappedOwner, fuseOptions, resolverAddress, }: {
5
+ wrappedOwner: string;
6
+ fuseOptions?: FuseOptions | string | number;
7
+ resolverAddress?: string;
6
8
  }): Promise<ethers.ContractTransaction>;
@@ -5,11 +5,11 @@ async function wrapETH({ contracts }, labels, wrappedOwner, decodedFuses, resolv
5
5
  const nameWrapper = await contracts?.getNameWrapper();
6
6
  const baseRegistrar = (await contracts?.getBaseRegistrar()).connect(signer);
7
7
  const labelhash = ethers.utils.solidityKeccak256(['string'], [labels[0]]);
8
- const data = ethers.utils.defaultAbiCoder.encode(['string', 'address', 'uint96', 'address'], [labels[0], wrappedOwner, decodedFuses, resolverAddress]);
8
+ const data = ethers.utils.defaultAbiCoder.encode(['string', 'address', 'uint32', 'uint64', 'address'], [labels[0], wrappedOwner, '0x0', decodedFuses, resolverAddress]);
9
9
  return baseRegistrar['safeTransferFrom(address,address,uint256,bytes)'](address, nameWrapper.address, labelhash, data);
10
10
  }
11
- async function wrapOther({ contracts }, name, wrappedOwner, decodedFuses, resolverAddress, address) {
12
- const nameWrapper = await contracts?.getNameWrapper();
11
+ async function wrapOther({ contracts }, name, wrappedOwner, decodedFuses, resolverAddress, address, signer) {
12
+ const nameWrapper = (await contracts?.getNameWrapper()).connect(signer);
13
13
  const registry = await contracts?.getRegistry();
14
14
  const hasApproval = await registry.isApprovedForAll(address, nameWrapper.address);
15
15
  if (!hasApproval) {
@@ -17,12 +17,8 @@ async function wrapOther({ contracts }, name, wrappedOwner, decodedFuses, resolv
17
17
  }
18
18
  return nameWrapper.wrap(hexEncodeName(name), wrappedOwner, decodedFuses, resolverAddress);
19
19
  }
20
- export default async function ({ contracts, provider }, name, wrappedOwner, fuseOptions, resolverAddress, options) {
21
- const signer = provider?.getSigner(options?.addressOrIndex);
22
- const address = await signer?.getAddress();
23
- if (!signer || !address) {
24
- throw new Error('No signer found');
25
- }
20
+ export default async function ({ contracts, signer }, name, { wrappedOwner, fuseOptions, resolverAddress, }) {
21
+ const address = await signer.getAddress();
26
22
  let decodedFuses;
27
23
  switch (typeof fuseOptions) {
28
24
  case 'object': {
@@ -53,6 +49,6 @@ export default async function ({ contracts, provider }, name, wrappedOwner, fuse
53
49
  return wrapETH({ contracts }, labels, wrappedOwner, decodedFuses, resolverAddress, signer, address);
54
50
  }
55
51
  else {
56
- return wrapOther({ contracts }, name, wrappedOwner, decodedFuses, resolverAddress, address);
52
+ return wrapOther({ contracts }, name, wrappedOwner, decodedFuses, resolverAddress, address, signer);
57
53
  }
58
54
  }
@@ -1,4 +1,4 @@
1
- import { ethers } from 'ethers';
1
+ import { ethers, Signer } from 'ethers';
2
2
  import ContractManager from './contracts';
3
3
  import { getContractAddress as _getContractAddress } from './contracts/getContractAddress';
4
4
  import { SupportedNetworkId } from './contracts/types';
@@ -10,6 +10,7 @@ declare type ENSOptions = {
10
10
  export declare type InternalENS = {
11
11
  options?: ENSOptions;
12
12
  provider?: ethers.providers.Provider;
13
+ signer: Signer;
13
14
  graphURI?: string | null;
14
15
  } & ENS;
15
16
  export declare type ENSArgs<K extends keyof InternalENS> = {
@@ -17,6 +18,10 @@ export declare type ENSArgs<K extends keyof InternalENS> = {
17
18
  };
18
19
  declare type OmitFirstArg<F> = F extends (x: any, ...args: infer P) => infer R ? (...args: P) => R : never;
19
20
  declare type OmitFirstTwoArgs<F> = F extends (x: any, y: any, ...args: infer P) => infer R ? (...args: P) => R : never;
21
+ declare type WriteOptions = {
22
+ addressOrIndex?: string | number;
23
+ signer?: Signer;
24
+ };
20
25
  export declare type RawFunction = {
21
26
  raw: (...args: any[]) => Promise<{
22
27
  to: string;
@@ -77,6 +82,14 @@ export declare class ENS {
77
82
  * @returns {OmitFirstArg} - The generated wrapped function
78
83
  */
79
84
  private generateFunction;
85
+ /**
86
+ * Generates a write wrapped function
87
+ * @param {string} path - The path of the exported function
88
+ * @param {FunctionDeps} dependencies - An array of ENS properties
89
+ * @param {string} exportName - The export name of the target function
90
+ * @returns {OmitFirstArg} - The generated wrapped function
91
+ */
92
+ private generateWriteFunction;
80
93
  /**
81
94
  * Generates a wrapped function from raw and decode exports
82
95
  * @param {string} path - The path of the exported function
@@ -423,48 +436,53 @@ export declare class ENS {
423
436
  }>;
424
437
  decode: ({ contracts }: ENSArgs<"contracts">, data: string) => Promise<any>;
425
438
  }>;
426
- setName: (name: string, address?: string | undefined, resolver?: string | undefined, options?: {
427
- addressOrIndex?: string | number | undefined;
428
- } | undefined) => Promise<ethers.ContractTransaction | undefined>;
429
- setRecords: (name: string, records: import("./utils/recordHelpers").RecordOptions) => Promise<ethers.ContractTransaction | undefined>;
430
- setResolver: (name: string, contract: "nameWrapper" | "registry", resolver?: string | undefined, options?: {
431
- addressOrIndex?: string | number | undefined;
432
- } | undefined) => Promise<ethers.ContractTransaction>;
433
- transferName: (name: string, newOwner: string, contract: "nameWrapper" | "registry" | "baseRegistrar", options?: {
434
- addressOrIndex?: string | number | undefined;
435
- } | undefined) => Promise<ethers.ContractTransaction>;
436
- wrapName: (name: string, wrappedOwner: string, fuseOptions?: string | number | import("./@types/FuseOptions").FuseOptions | undefined, resolverAddress?: string | undefined, options?: {
437
- addressOrIndex?: string | number | undefined;
438
- } | undefined) => Promise<ethers.ContractTransaction>;
439
- unwrapName: (name: string, newController: string, newRegistrant?: string | undefined, options?: {
440
- addressOrIndex?: string | number | undefined;
441
- } | undefined) => Promise<ethers.ContractTransaction>;
442
- burnFuses: (name: string, fusesToBurn: import("./@types/FuseOptions").FuseOptions) => Promise<ethers.ContractTransaction>;
443
- createSubname: (args_0: {
444
- name: string;
439
+ setName: (name: string, options?: ({
440
+ address?: string | undefined;
441
+ resolver?: string | undefined;
442
+ } & WriteOptions) | undefined) => Promise<ethers.ContractTransaction | undefined>;
443
+ setRecords: (name: string, options: {
444
+ records: import("./utils/recordHelpers").RecordOptions;
445
+ resolverAddress?: string | undefined;
446
+ } & WriteOptions) => Promise<ethers.ContractTransaction | undefined>;
447
+ setResolver: (name: string, options: {
448
+ contract: "nameWrapper" | "registry";
449
+ resolver?: string | undefined;
450
+ } & WriteOptions) => Promise<ethers.ContractTransaction>;
451
+ transferName: (name: string, options: {
452
+ newOwner: string;
453
+ contract: "nameWrapper" | "registry" | "baseRegistrar";
454
+ } & WriteOptions) => Promise<ethers.ContractTransaction>;
455
+ wrapName: (name: string, options: {
456
+ wrappedOwner: string;
457
+ fuseOptions?: string | number | import("./@types/FuseOptions").FuseOptions | undefined;
458
+ resolverAddress?: string | undefined;
459
+ } & WriteOptions) => Promise<ethers.ContractTransaction>;
460
+ unwrapName: (name: string, options: {
461
+ newController: string;
462
+ newRegistrant?: string | undefined;
463
+ } & WriteOptions) => Promise<ethers.ContractTransaction>;
464
+ burnFuses: (name: string, options: {
465
+ fusesToBurn: import("./@types/FuseOptions").FuseOptions;
466
+ } & WriteOptions) => Promise<ethers.ContractTransaction>;
467
+ createSubname: (name: string, options: ({
445
468
  owner: string;
446
469
  resolverAddress?: string | undefined;
447
470
  contract: "nameWrapper" | "registry";
448
- options?: {
449
- addressOrIndex?: string | number | undefined;
450
- } | undefined;
451
471
  } | ({
452
472
  contract: "nameWrapper";
453
473
  fuses?: import("./@types/FuseOptions").FuseOptions | undefined;
454
474
  } & {
455
- name: string;
456
475
  owner: string;
457
476
  resolverAddress?: string | undefined;
458
477
  contract: "nameWrapper" | "registry";
459
- options?: {
460
- addressOrIndex?: string | number | undefined;
461
- } | undefined;
462
- })) => Promise<ethers.ContractTransaction>;
463
- deleteSubname: (name: string, contract: "nameWrapper" | "registry", options?: {
464
- addressOrIndex?: string | number | undefined;
465
- } | undefined) => Promise<ethers.ContractTransaction>;
466
- transferSubname: (name: string, contract: "nameWrapper" | "registry", address: string, options?: {
467
- addressOrIndex?: string | number | undefined;
468
- } | undefined) => Promise<ethers.ContractTransaction>;
478
+ })) & WriteOptions) => Promise<ethers.ContractTransaction>;
479
+ deleteSubname: (name: string, options: {
480
+ contract: "nameWrapper" | "registry";
481
+ } & WriteOptions) => Promise<ethers.ContractTransaction>;
482
+ transferSubname: (name: string, options: {
483
+ contract: "nameWrapper" | "registry";
484
+ address: string;
485
+ } & WriteOptions) => Promise<ethers.ContractTransaction>;
486
+ getDNSOwner: (dnsName: string) => Promise<any>;
469
487
  }
470
488
  export {};
package/dist/esm/index.js CHANGED
@@ -58,9 +58,24 @@ export class ENS {
58
58
  // otherwise, create a function from the raw and decode functions
59
59
  if (subFunc !== 'combine') {
60
60
  // get the function to call
61
- const func = subFunc ? mod[exportName][subFunc] : mod[exportName];
61
+ const func = subFunc && subFunc !== 'write'
62
+ ? mod[exportName][subFunc]
63
+ : mod[exportName];
62
64
  // get the dependencies to forward to the function as the first arg
63
- const dependenciesToForward = thisRef.forwardDependenciesFromArray(dependencies);
65
+ let dependenciesToForward = thisRef.forwardDependenciesFromArray(dependencies);
66
+ // if func is write func, inject signer into dependencies
67
+ if (subFunc === 'write') {
68
+ const options = (args[1] || {});
69
+ const signer = options.signer ||
70
+ thisRef.provider?.getSigner(options.addressOrIndex);
71
+ if (!signer) {
72
+ throw new Error('No signer specified');
73
+ }
74
+ delete options.addressOrIndex;
75
+ delete options.signer;
76
+ dependenciesToForward = { ...dependenciesToForward, signer };
77
+ return func(dependenciesToForward, args[0], options);
78
+ }
64
79
  // return the function with the dependencies forwarded
65
80
  return func(dependenciesToForward, ...args);
66
81
  }
@@ -87,6 +102,14 @@ export class ENS {
87
102
  * @returns {OmitFirstArg} - The generated wrapped function
88
103
  */
89
104
  this.generateFunction = (path, dependencies, exportName = 'default') => this.importGenerator(path, dependencies, exportName);
105
+ /**
106
+ * Generates a write wrapped function
107
+ * @param {string} path - The path of the exported function
108
+ * @param {FunctionDeps} dependencies - An array of ENS properties
109
+ * @param {string} exportName - The export name of the target function
110
+ * @returns {OmitFirstArg} - The generated wrapped function
111
+ */
112
+ this.generateWriteFunction = (path, dependencies, exportName = 'default') => this.importGenerator(path, dependencies, exportName, 'write');
90
113
  /**
91
114
  * Generates a wrapped function from raw and decode exports
92
115
  * @param {string} path - The path of the exported function
@@ -157,32 +180,23 @@ export class ENS {
157
180
  this.universalWrapper = this.generateRawFunction('initialGetters', ['contracts'], 'universalWrapper');
158
181
  this.resolverMulticallWrapper = this.generateRawFunction('initialGetters', ['contracts'], 'resolverMulticallWrapper');
159
182
  this.multicallWrapper = this.generateRawFunction('initialGetters', ['contracts'], 'multicallWrapper');
160
- this.setName = this.generateFunction('setName', [
161
- 'contracts',
162
- 'provider',
163
- ]);
164
- this.setRecords = this.generateFunction('setRecords', [
165
- 'contracts',
166
- 'provider',
167
- 'getResolver',
168
- ]);
169
- this.setResolver = this.generateFunction('setResolver', ['contracts', 'provider']);
170
- this.transferName = this.generateFunction('transferName', ['contracts', 'provider']);
171
- this.wrapName = this.generateFunction('wrapName', [
183
+ this.setName = this.generateWriteFunction('setName', [
172
184
  'contracts',
173
- 'provider',
174
185
  ]);
175
- this.unwrapName = this.generateFunction('unwrapName', [
186
+ this.setRecords = this.generateWriteFunction('setRecords', ['contracts', 'provider', 'getResolver']);
187
+ this.setResolver = this.generateWriteFunction('setResolver', ['contracts']);
188
+ this.transferName = this.generateWriteFunction('transferName', ['contracts']);
189
+ this.wrapName = this.generateWriteFunction('wrapName', [
176
190
  'contracts',
177
- 'provider',
178
191
  ]);
179
- this.burnFuses = this.generateFunction('burnFuses', [
192
+ this.unwrapName = this.generateWriteFunction('unwrapName', ['contracts']);
193
+ this.burnFuses = this.generateWriteFunction('burnFuses', [
180
194
  'contracts',
181
- 'provider',
182
195
  ]);
183
- this.createSubname = this.generateFunction('createSubname', ['contracts', 'provider']);
184
- this.deleteSubname = this.generateFunction('deleteSubname', ['contracts', 'provider', 'transferSubname']);
185
- this.transferSubname = this.generateFunction('transferSubname', ['contracts', 'provider']);
196
+ this.createSubname = this.generateWriteFunction('createSubname', ['contracts']);
197
+ this.deleteSubname = this.generateWriteFunction('deleteSubname', ['transferSubname']);
198
+ this.transferSubname = this.generateWriteFunction('transferSubname', ['contracts']);
199
+ this.getDNSOwner = this.generateFunction('getDNSOwner', []);
186
200
  this.options = options;
187
201
  this.getContractAddress = options?.getContractAddress || _getContractAddress;
188
202
  }