11// SPDX-License-Identifier: MIT
22pragma solidity ^ 0.8.17 ;
33
4+ import {ERC165 } from "@openzeppelin/contracts-v5/utils/introspection/ERC165.sol " ;
45import {Ownable} from "@openzeppelin/contracts-v5/access/Ownable.sol " ;
56
67import {GatewayFetchTarget, IGatewayVerifier} from "@unruggable/gateways/GatewayFetchTarget.sol " ;
78import {GatewayFetcher, GatewayRequest, RequestOverflow} from "@unruggable/gateways/GatewayFetcher.sol " ;
89
910import {AbstractReverseResolver} from "./AbstractReverseResolver.sol " ;
1011import {IStandaloneReverseRegistrar} from "../reverseRegistrar/IStandaloneReverseRegistrar.sol " ;
12+ import {IVerifiableResolver} from "../resolvers/profiles/IVerifiableResolver.sol " ;
1113import {INameReverser} from "./INameReverser.sol " ;
14+ import {ENSIP19} from "../utils/ENSIP19.sol " ;
1215
1316/// @title Chain Reverse Resolver
1417/// @notice Reverses an EVM address using the first non-null response from the following sources:
15- /// 1. `L2ReverseRegistrar` on L2 chain via Unruggable Gateway
16- /// 2. `IStandaloneReverseRegistrar` for "default.reverse"
18+ ///
19+ /// 1. `L2ReverseRegistrar` on L2 chain via Unruggable Gateway
20+ /// 2. `IStandaloneReverseRegistrar` for "default.reverse"
21+ ///
1722contract ChainReverseResolver is
1823 AbstractReverseResolver ,
24+ IVerifiableResolver ,
1925 GatewayFetchTarget ,
2026 Ownable
2127{
@@ -27,9 +33,6 @@ contract ChainReverseResolver is
2733 /// @notice The reverse registrar contract for "default.reverse".
2834 IStandaloneReverseRegistrar public immutable defaultRegistrar;
2935
30- /// @notice The reverse registrar address on the L2 chain.
31- address public immutable l2Registrar;
32-
3336 /// @notice The verifier contract for the L2 chain.
3437 IGatewayVerifier public gatewayVerifier;
3538
@@ -46,16 +49,34 @@ contract ChainReverseResolver is
4649 address _owner ,
4750 uint256 coinType ,
4851 IStandaloneReverseRegistrar _defaultRegistrar ,
49- address _l2Registrar ,
52+ address _chainRegistrar ,
5053 IGatewayVerifier verifier ,
5154 string [] memory gateways
52- ) Ownable (_owner) AbstractReverseResolver (coinType, _l2Registrar ) {
55+ ) Ownable (_owner) AbstractReverseResolver (coinType, _chainRegistrar ) {
5356 defaultRegistrar = _defaultRegistrar;
54- l2Registrar = _l2Registrar;
5557 gatewayVerifier = verifier;
5658 gatewayURLs = gateways;
5759 }
5860
61+ /// @inheritdoc ERC165
62+ function supportsInterface (
63+ bytes4 interfaceId
64+ ) public view override returns (bool ) {
65+ return
66+ interfaceId == type (IVerifiableResolver).interfaceId ||
67+ super .supportsInterface (interfaceId);
68+ }
69+
70+ /// @inheritdoc IVerifiableResolver
71+ function verifierMetadata (
72+ bytes memory name
73+ ) external view returns (address verifier , string [] memory gateways ) {
74+ (bytes memory a , uint256 ct ) = ENSIP19.parse (name);
75+ if (a.length == 20 && ct == coinType) {
76+ return (address (gatewayVerifier), gatewayURLs);
77+ }
78+ }
79+
5980 /// @notice Set gateway URLs.
6081 /// @param gateways The new gateway URLs.
6182 function setGatewayURLs (string [] memory gateways ) external onlyOwner {
@@ -75,7 +96,7 @@ contract ChainReverseResolver is
7596 address addr
7697 ) internal view override returns (string memory ) {
7798 GatewayRequest memory req = GatewayFetcher.newRequest (1 );
78- req.setTarget (l2Registrar); // target L2 registrar
99+ req.setTarget (chainRegistrar);
79100 req.setSlot (NAMES_SLOT).push (addr).follow ().readBytes (); // names[addr]
80101 req.setOutput (0 );
81102 fetch (
@@ -118,8 +139,8 @@ contract ChainReverseResolver is
118139 GatewayRequest memory req = GatewayFetcher.newRequest (
119140 uint8 (addrs.length )
120141 );
121- req.setTarget (l2Registrar ); // target L2 registrar
122- for (uint256 i; i < addrs.length ; i ++ ) {
142+ req.setTarget (chainRegistrar ); // target L2 registrar
143+ for (uint256 i; i < addrs.length ; ++ i ) {
123144 req.setSlot (NAMES_SLOT).push (addrs[i]).follow ().readBytes (); // names[addr[i]]
124145 req.setOutput (uint8 (i));
125146 }
@@ -144,7 +165,7 @@ contract ChainReverseResolver is
144165 ) external view returns (string [] memory names ) {
145166 address [] memory addrs = abi.decode (extraData, (address []));
146167 names = new string [](addrs.length );
147- for (uint256 i; i < addrs.length ; i ++ ) {
168+ for (uint256 i; i < addrs.length ; ++ i ) {
148169 string memory name = string (values[i]);
149170 if (bytes (name).length == 0 ) {
150171 name = defaultRegistrar.nameForAddr (addrs[i]);
0 commit comments