diff --git a/packages/web3-eth-ens/CHANGELOG.md b/packages/web3-eth-ens/CHANGELOG.md index 2bf6468be08..9a721f29893 100644 --- a/packages/web3-eth-ens/CHANGELOG.md +++ b/packages/web3-eth-ens/CHANGELOG.md @@ -147,4 +147,8 @@ Documentation: - Added function `setAddress` in ENS and Resolver classes (#5956) -## [Unreleased] \ No newline at end of file +## [Unreleased] + +### Add + +- Added function getText and getName in ENS and resolver classes \ No newline at end of file diff --git a/packages/web3-eth-ens/src/config.ts b/packages/web3-eth-ens/src/config.ts index 1437c9746ee..e9f746305c4 100644 --- a/packages/web3-eth-ens/src/config.ts +++ b/packages/web3-eth-ens/src/config.ts @@ -29,7 +29,7 @@ export const interfaceIds: { [T: string]: string } = { }; /** - * An object holding the functionsthat are supported by the ENS resolver contracts/interfaces. + * An object holding the functions that are supported by the ENS resolver contracts/interfaces. */ export const methodsInInterface: { [T: string]: string } = { setAddr: 'addr', @@ -38,6 +38,8 @@ export const methodsInInterface: { [T: string]: string } = { pubkey: 'pubkey', setContenthash: 'contenthash', contenthash: 'contenthash', + text: 'text', + name: 'name', }; /** diff --git a/packages/web3-eth-ens/src/ens.ts b/packages/web3-eth-ens/src/ens.ts index 822dcab2b41..88d6ae58c83 100644 --- a/packages/web3-eth-ens/src/ens.ts +++ b/packages/web3-eth-ens/src/ens.ts @@ -165,6 +165,26 @@ export class ENS extends Web3Context { return this._resolver.getAddress(ENSName, coinType); } + /** + * ERC-634 - Returns the text content stored in the resolver for the specified key. + * @param ENSName - The ENS name to resolve + * @param key - The key to resolve https://github.com/ethereum/ercs/blob/master/ERCS/erc-634.md#global-keys + * @returns - The value content stored in the resolver for the specified key + */ + public async getText(ENSName: string, key: string): Promise { + return this._resolver.getText(ENSName, key); + } + + + /** + * Resolves the name of an ENS node. + * @param ENSName - The node to resolve + * @returns - The name + */ + public async getName(ENSName: string): Promise { + return this._resolver.getName(ENSName); + } + /** * Returns the X and Y coordinates of the curve point for the public key. * @param ENSName - The ENS name diff --git a/packages/web3-eth-ens/src/resolver.ts b/packages/web3-eth-ens/src/resolver.ts index 9f99eae8955..c93d150e805 100644 --- a/packages/web3-eth-ens/src/resolver.ts +++ b/packages/web3-eth-ens/src/resolver.ts @@ -117,4 +117,25 @@ export class Resolver { .setAddr(namehash(ENSName), address) .send(txConfig); } + + public async getText( + ENSName: string, + key: string, + ) { + const resolverContract = await this.getResolverContractAdapter(ENSName); + await this.checkInterfaceSupport(resolverContract, methodsInInterface.text); + + return resolverContract.methods + .text(namehash(ENSName), key).call() + } + + public async getName( + address: string + ) { + const resolverContract = await this.getResolverContractAdapter(address); + await this.checkInterfaceSupport(resolverContract, methodsInInterface.name); + + return resolverContract.methods + .name(namehash(address)).call() + } } diff --git a/packages/web3-eth-ens/test/unit/resolver.test.ts b/packages/web3-eth-ens/test/unit/resolver.test.ts index a771082b959..f0df74bd2a7 100644 --- a/packages/web3-eth-ens/test/unit/resolver.test.ts +++ b/packages/web3-eth-ens/test/unit/resolver.test.ts @@ -211,6 +211,60 @@ describe('resolver', () => { }); }); + describe('text', () => { + it('getText', async () => { + const supportsInterfaceMock = jest + .spyOn(contract.methods, 'supportsInterface') + .mockReturnValue({ + call: async () => Promise.resolve(true), + } as unknown as NonPayableMethodObject); + + const textMock = jest.spyOn(contract.methods, 'text').mockReturnValue({ + call: jest.fn(), + } as unknown as NonPayableMethodObject); + + jest.spyOn(registry, 'getResolver').mockImplementation(async () => { + return new Promise(resolve => { + resolve(contract); + }); + }); + + await resolver.getText(ENS_NAME, "key"); + expect(supportsInterfaceMock).toHaveBeenCalledWith( + interfaceIds[methodsInInterface.text], + ); + expect(textMock).toHaveBeenCalledWith(namehash(ENS_NAME), "key"); + }) +}) + + describe('name', () => { + it('getName', async () => { + const supportsInterfaceMock = jest + .spyOn(contract.methods, 'supportsInterface') + .mockReturnValue({ + call: async () => Promise.resolve(true), + } as unknown as NonPayableMethodObject); + + const nameMock = jest.spyOn(contract.methods, 'name').mockReturnValue({ + call: jest.fn(), + } as unknown as NonPayableMethodObject); + + jest.spyOn(registry, 'getResolver').mockImplementation(async () => { + return new Promise(resolve => { + resolve(contract); + }); + }); + + await resolver.getName(ENS_NAME); + expect(supportsInterfaceMock).toHaveBeenCalledWith( + interfaceIds[methodsInInterface.name], + ); + + expect(nameMock).toHaveBeenCalledWith(namehash(ENS_NAME)); + }) + }) + + describe('supportsInterface', () => { it('check supportsInterface for non strict hex id', async () => { const interfaceId = 'setAddr';