diff --git a/contracts/resolvers/profiles/ExtendedDNSResolver.sol b/contracts/resolvers/profiles/ExtendedDNSResolver.sol index fcbd0c42..b8644663 100644 --- a/contracts/resolvers/profiles/ExtendedDNSResolver.sol +++ b/contracts/resolvers/profiles/ExtendedDNSResolver.sol @@ -121,9 +121,9 @@ contract ExtendedDNSResolver is IExtendedDNSResolver, IERC165 { if (value.length == 0) { return value; } - (bytes memory record, bool valid) = value.hexToBytes(2, value.length); + (address record, bool valid) = value.hexToAddress(2, value.length); if (!valid) revert InvalidAddressFormat(value); - return record; + return abi.encode(record); } function _resolveAddr( @@ -133,9 +133,9 @@ contract ExtendedDNSResolver is IExtendedDNSResolver, IERC165 { if (value.length == 0) { return value; } - (bytes memory record, bool valid) = value.hexToBytes(2, value.length); + (address record, bool valid) = value.hexToAddress(2, value.length); if (!valid) revert InvalidAddressFormat(value); - return record; + return abi.encode(record); } function _resolveText( @@ -147,7 +147,7 @@ contract ExtendedDNSResolver is IExtendedDNSResolver, IERC165 { context, bytes.concat("t[", bytes(key), "]=") ); - return value; + return abi.encode(value); } uint256 constant STATE_START = 0; diff --git a/test/dnsregistrar/TestOffchainDNSResolver.ts b/test/dnsregistrar/TestOffchainDNSResolver.ts index 686658bc..69e2c92c 100644 --- a/test/dnsregistrar/TestOffchainDNSResolver.ts +++ b/test/dnsregistrar/TestOffchainDNSResolver.ts @@ -2,6 +2,7 @@ import { loadFixture } from '@nomicfoundation/hardhat-toolbox-viem/network-helpe import { expect } from 'chai' import hre from 'hardhat' import { + Address, encodeAbiParameters, encodeFunctionData, getAddress, @@ -404,7 +405,9 @@ describe('OffchainDNSResolver', () => { texts: [`ENS1 ${resolver.address} a[60]=${testAddress}`], calldata, }), - ).resolves.toEqual(testAddress.toLowerCase() as Hex) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'address' }], [testAddress as Address]), + ) }) it('correctly handles extra data in the TXT record when calling a resolver that supports address resolution with valid cointype', async () => { @@ -428,7 +431,9 @@ describe('OffchainDNSResolver', () => { texts: [`ENS1 ${resolver.address} a[${ethCoinType}]=${testAddress}`], calldata, }), - ).resolves.toEqual(testAddress.toLowerCase() as Hex) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'address' }], [testAddress as Address]), + ) }) it('handles extra data in the TXT record when calling a resolver that supports address resolution with invalid cointype', async () => { diff --git a/test/resolvers/TestExtendedDNSResolver.ts b/test/resolvers/TestExtendedDNSResolver.ts index 914cba84..1683f3c9 100644 --- a/test/resolvers/TestExtendedDNSResolver.ts +++ b/test/resolvers/TestExtendedDNSResolver.ts @@ -11,6 +11,7 @@ import { Abi, Address, bytesToHex, + encodeAbiParameters, encodeFunctionData, namehash, stringToHex, @@ -89,7 +90,9 @@ describe('ExtendedDNSResolver', () => { args: [], context: `a[60]=${testAddress}`, }), - ).resolves.toEqual(testAddress.toLowerCase() as Address) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'address' }], [testAddress as Address]), + ) }) it('resolves Ethereum addresses using addr(bytes32,uint256)', async () => { @@ -106,7 +109,9 @@ describe('ExtendedDNSResolver', () => { args: [coinType], context: `a[60]=${testAddress}`, }), - ).resolves.toEqual(testAddress.toLowerCase() as Address) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'address' }], [testAddress as Address]), + ) }) it('ignores records with the wrong cointype', async () => { @@ -157,7 +162,9 @@ describe('ExtendedDNSResolver', () => { args: [], context: `foo=bar a[60]=${testAddress}`, }), - ).resolves.toEqual(testAddress.toLowerCase() as Address) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'address' }], [testAddress as Address]), + ) }) it('handles multiple spaces between records', async () => { @@ -173,7 +180,9 @@ describe('ExtendedDNSResolver', () => { args: [], context: `foo=bar a[60]=${testAddress}`, }), - ).resolves.toEqual(testAddress.toLowerCase() as Address) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'address' }], [testAddress as Address]), + ) }) it('handles multiple spaces between quoted records', async () => { @@ -189,7 +198,9 @@ describe('ExtendedDNSResolver', () => { args: [], context: `foo='bar' a[60]=${testAddress}`, }), - ).resolves.toEqual(testAddress.toLowerCase() as Address) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'address' }], [testAddress as Address]), + ) }) it('handles no spaces between quoted records', async () => { @@ -205,7 +216,9 @@ describe('ExtendedDNSResolver', () => { args: [], context: `foo='bar'a[60]=${testAddress}`, }), - ).resolves.toEqual(testAddress.toLowerCase() as Address) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'address' }], [testAddress as Address]), + ) }) it('works if the record comes after one for another cointype', async () => { @@ -221,7 +234,9 @@ describe('ExtendedDNSResolver', () => { args: [], context: `a[0]=0x1234 a[60]=${testAddress}`, }), - ).resolves.toEqual(testAddress.toLowerCase() as Address) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'address' }], [testAddress as Address]), + ) }) it('uses the first matching record it finds', async () => { @@ -237,7 +252,9 @@ describe('ExtendedDNSResolver', () => { args: [], context: `a[60]=${testAddress} a[60]=0x1234567890123456789012345678901234567890`, }), - ).resolves.toEqual(testAddress.toLowerCase() as Address) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'address' }], [testAddress as Address]), + ) }) it('resolves addresses with coin types', async () => { @@ -255,7 +272,9 @@ describe('ExtendedDNSResolver', () => { args: [optimismCoinType], context: `a[e${optimismChainId}]=${testAddress}`, }), - ).resolves.toEqual(testAddress.toLowerCase() as Address) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'address' }], [testAddress as Address]), + ) }) }) @@ -272,7 +291,9 @@ describe('ExtendedDNSResolver', () => { args: ['com.twitter'], context: 't[com.twitter]=nicksdjohnson', }), - ).resolves.toEqual(stringToHex('nicksdjohnson')) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'string' }], ['nicksdjohnson']), + ) }) it('returns 0x for a missing key', async () => { @@ -287,7 +308,7 @@ describe('ExtendedDNSResolver', () => { args: ['com.discord'], context: 't[com.twitter]=nicksdjohnson', }), - ).resolves.toEqual('0x') + ).resolves.toEqual(encodeAbiParameters([{ type: 'string' }], [''])) }) it('decodes a quoted t record', async () => { @@ -302,7 +323,9 @@ describe('ExtendedDNSResolver', () => { args: ['url'], context: "t[url]='https://ens.domains/'", }), - ).resolves.toEqual(stringToHex('https://ens.domains/')) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'string' }], ['https://ens.domains/']), + ) }) it('handles escaped quotes', async () => { @@ -317,7 +340,9 @@ describe('ExtendedDNSResolver', () => { args: ['note'], context: "t[note]='I\\'m great'", }), - ).resolves.toEqual(stringToHex("I'm great")) + ).resolves.toEqual( + encodeAbiParameters([{ type: 'string' }], ["I'm great"]), + ) }) it('rejects a record with an unterminated quoted string', async () => { @@ -332,7 +357,7 @@ describe('ExtendedDNSResolver', () => { args: ['note'], context: "t[note]='I\\'m great", }), - ).resolves.toEqual('0x') + ).resolves.toEqual(encodeAbiParameters([{ type: 'string' }], [''])) }) }) })