diff --git a/bun.lockb b/bun.lockb index 82538e01..b4e6ceb1 100755 Binary files a/bun.lockb and b/bun.lockb differ diff --git a/contracts/dnsregistrar/OffchainDNSResolver.sol b/contracts/dnsregistrar/OffchainDNSResolver.sol index a15e27b8..dbbf21f6 100644 --- a/contracts/dnsregistrar/OffchainDNSResolver.sol +++ b/contracts/dnsregistrar/OffchainDNSResolver.sol @@ -68,29 +68,11 @@ contract OffchainDNSResolver is IExtendedResolver, IERC165 { bytes calldata response, bytes calldata extraData ) external view returns (bytes memory) { - (bytes memory name, bytes memory query, bytes4 selector) = abi.decode( + (bytes memory name, bytes memory query) = abi.decode( extraData, - (bytes, bytes, bytes4) + (bytes, bytes) ); - if (selector != bytes4(0)) { - (bytes memory targetData, address targetResolver) = abi.decode( - query, - (bytes, address) - ); - return - callWithOffchainLookupPropagation( - targetResolver, - name, - query, - abi.encodeWithSelector( - selector, - response, - abi.encode(targetData, address(this)) - ) - ); - } - DNSSEC.RRSetWithSignature[] memory rrsets = abi.decode( response, (DNSSEC.RRSetWithSignature[]) @@ -167,6 +149,25 @@ contract OffchainDNSResolver is IExtendedResolver, IERC165 { revert CouldNotResolve(name); } + function resolveWrappedCallback( + bytes calldata response, + bytes calldata extraData + ) external view returns (bytes memory) { + ( + bytes memory name, + bytes memory innerExtraData, + address targetResolver, + bytes4 selector + ) = abi.decode(extraData, (bytes, bytes, address, bytes4)); + return + callWithOffchainLookupPropagation( + targetResolver, + name, + innerExtraData, + abi.encodeWithSelector(selector, response, innerExtraData) + ); + } + function parseRR( bytes memory data, uint256 idx, @@ -304,7 +305,7 @@ contract OffchainDNSResolver is IExtendedResolver, IERC165 { urls, abi.encodeCall(IDNSGateway.resolve, (name, TYPE_TXT)), OffchainDNSResolver.resolveCallback.selector, - abi.encode(name, data, bytes4(0)) + abi.encode(name, data) ); } @@ -329,8 +330,8 @@ contract OffchainDNSResolver is IExtendedResolver, IERC165 { address(this), urls, callData, - OffchainDNSResolver.resolveCallback.selector, - abi.encode(name, extraData, innerCallbackFunction) + OffchainDNSResolver.resolveWrappedCallback.selector, + abi.encode(name, extraData, sender, innerCallbackFunction) ); } } diff --git a/contracts/test/mocks/MockOffchainResolver.sol b/contracts/test/mocks/MockOffchainResolver.sol index 1ed40452..3d8b94ac 100644 --- a/contracts/test/mocks/MockOffchainResolver.sol +++ b/contracts/test/mocks/MockOffchainResolver.sol @@ -44,9 +44,9 @@ contract MockOffchainResolver is IExtendedResolver, ERC165 { bytes calldata response, bytes calldata extraData ) external view returns (bytes memory) { - (, bytes memory callData, ) = abi.decode( + (, bytes memory callData, , ) = abi.decode( extraData, - (bytes, bytes, bytes4) + (bytes, bytes, address, bytes4) ); if (bytes4(callData) == bytes4(keccak256("addr(bytes32)"))) { (bytes memory result, , ) = abi.decode( diff --git a/package.json b/package.json index b8d5126e..4d844e49 100644 --- a/package.json +++ b/package.json @@ -52,6 +52,7 @@ "dependencies": { "@ensdomains/buffer": "^0.1.1", "@ensdomains/solsha1": "0.0.3", + "@nomicfoundation/solidity-analyzer-darwin-x64": "^0.1.2", "@openzeppelin/contracts": "^4.1.0", "dns-packet": "^5.3.0" }, @@ -69,6 +70,6 @@ }, "homepage": "https://github.com/ensdomains/ens-contracts#readme", "volta": { - "node": "16.20.2" + "node": "20.15.1" } } diff --git a/test/dnsregistrar/TestOffchainDNSResolver.ts b/test/dnsregistrar/TestOffchainDNSResolver.ts index 686658bc..9a8a0929 100644 --- a/test/dnsregistrar/TestOffchainDNSResolver.ts +++ b/test/dnsregistrar/TestOffchainDNSResolver.ts @@ -96,8 +96,8 @@ async function fixture() { ) const dnsName = dnsEncodeName(name) const extraData = encodeAbiParameters( - [{ type: 'bytes' }, { type: 'bytes' }, { type: 'bytes4' }], - [dnsName, calldata, '0x00000000'], + [{ type: 'bytes' }, { type: 'bytes' }], + [dnsName, calldata], ) return offchainDnsResolver.read.resolveCallback([response, extraData]) @@ -150,8 +150,8 @@ describe('OffchainDNSResolver', () => { args: [namehash(name)], }) const extraData = encodeAbiParameters( - [{ type: 'bytes' }, { type: 'bytes' }, { type: 'bytes4' }], - [dnsName, callData, '0x00000000'], + [{ type: 'bytes' }, { type: 'bytes' }], + [dnsName, callData], ) const gatewayCall = encodeFunctionData({ @@ -523,10 +523,11 @@ describe('OffchainDNSResolver', () => { }) const extraData = encodeAbiParameters( - parseAbiParameters('bytes,bytes,bytes4'), + parseAbiParameters('bytes,bytes,address,bytes4'), [ dnsName, calldata, + offchainResolver.address, toFunctionSelector('function resolveCallback(bytes,bytes)'), ], ) @@ -544,7 +545,7 @@ describe('OffchainDNSResolver', () => { getAddress(offchainDnsResolver.address), ['https://example.com/'], calldata, - toFunctionSelector('function resolveCallback(bytes,bytes)'), + toFunctionSelector('function resolveWrappedCallback(bytes,bytes)'), extraData, ) diff --git a/test/utils/TestUniversalResolver.ts b/test/utils/TestUniversalResolver.ts index 79be342f..095259b8 100644 --- a/test/utils/TestUniversalResolver.ts +++ b/test/utils/TestUniversalResolver.ts @@ -655,12 +655,12 @@ describe('UniversalResolver', () => { ], }) const innerExtraData = encodeAbiParameters( - parseAbiParameters('bytes, bytes, bytes4'), - [dnsEncodeName(name), addrCall, '0x00000000'], + parseAbiParameters('bytes, bytes'), + [dnsEncodeName(name), addrCall], ) const extraData = encodeExtraData({ isWildcard: true, - resolver: offchainDnsResolver.address, + resolver: offchainDnsResolver.address as Address, gateways: ['http://universal-offchain-resolver.local'], metadata: '0x', extraDatas: [ @@ -759,7 +759,7 @@ describe('UniversalResolver', () => { const extraData = encodeExtraData({ isWildcard: false, - resolver: offchainResolver.address, + resolver: offchainResolver.address as Address, gateways: ['http://universal-offchain-resolver.local'], metadata: '0x', extraDatas: [