Skip to content

Commit

Permalink
Add suport for DefaultReverseResolver
Browse files Browse the repository at this point in the history
  • Loading branch information
makoto committed Feb 20, 2024
1 parent 5b4d395 commit 0629aea
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 8 deletions.
45 changes: 39 additions & 6 deletions crosschain-reverse-resolver/contracts/L1ReverseResolver.sol
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,41 @@ import {IEVMVerifier} from '@ensdomains/evm-verifier/contracts/IEVMVerifier.sol'
import "@ensdomains/ens-contracts/contracts/resolvers/profiles/INameResolver.sol";
import "@ensdomains/ens-contracts/contracts/resolvers/profiles/ITextResolver.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
// import "@ensdomains/ens-contracts/contracts/reverseRegistrar/IDefaultReverseResolver.sol";
import "@ensdomains/ens-contracts/contracts/utils/HexUtils.sol";
import "hardhat/console.sol";

interface IDefaultReverseResolver {
event NameChanged(bytes32 indexed node, string name);
event TextChanged(
bytes32 indexed node,
string indexed indexedKey,
string key,
string value
);

function name(address addr) external view returns (string memory);

function text(
address addr,
string memory key
) external view returns (string memory);
}

contract L1ReverseResolver is EVMFetchTarget, INameResolver, ITextResolver, ERC165 {
using EVMFetcher for EVMFetcher.EVMFetchRequest;
IEVMVerifier immutable verifier;
address immutable target;
IDefaultReverseResolver immutable defaultReverseResolver;
uint256 constant VERSIONABLE_TEXTS_SLOT = 2;
uint256 constant VERSIONABLE_NAME_SLOT = 3;
uint256 constant RECORD_VERSIONS_SLOT = 4;

constructor(IEVMVerifier _verifier, address _target) {
using HexUtils for bytes;

constructor(IEVMVerifier _verifier, address _target, IDefaultReverseResolver _defaultReverseResolver ) {
verifier = _verifier;
target = _target;
defaultReverseResolver = _defaultReverseResolver;
}

/**
Expand All @@ -34,14 +57,24 @@ contract L1ReverseResolver is EVMFetchTarget, INameResolver, ITextResolver, ERC1
.getDynamic(VERSIONABLE_NAME_SLOT)
.ref(0)
.element(node)
.fetch(this.nameCallback.selector, ''); // recordVersions
.fetch(this.nameCallback.selector, msg.data); // recordVersions
}

function nameCallback(
bytes[] memory values,
bytes memory
) public pure returns (string memory) {
return string(values[1]);
bytes memory callbackdata
) public view returns (bytes memory) {
// ) public view returns (string memory) {
return callbackdata;

if(values[1].length == 0 ){
(address addr, ) = callbackdata.hexToAddress(0, callbackdata.length);
// return addr;
// // return defaultReverseResolver.name(addr);
}else{
// return "foo2";
// return string(values[1]);
}
}

/**
Expand Down
1 change: 1 addition & 0 deletions crosschain-reverse-resolver/contracts/deps.sol
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import {L1Verifier} from '@ensdomains/l1-verifier/contracts/L1Verifier.sol';
import '@ensdomains/ens-contracts/contracts/reverseRegistrar/L2ReverseRegistrar.sol';
import '@ensdomains/ens-contracts/contracts/reverseRegistrar/DefaultReverseResolver.sol';
import '@ensdomains/ens-contracts/contracts/resolvers/profiles/IVersionableResolver.sol';
// Storage slot
// ┌────────────────────┬───────────────────┬──────────────┬
Expand Down
64 changes: 62 additions & 2 deletions crosschain-reverse-resolver/test/testReverseResolver.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ describe('Crosschain Reverse Resolver', () => {
let verifier: Contract;
let target: Contract;
let l2contract: Contract;
let defaultReverseResolver: Contract;

before(async () => {
// Hack to get a 'real' ethers provider from hardhat. The default `HardhatProvider`
Expand Down Expand Up @@ -71,7 +72,11 @@ describe('Crosschain Reverse Resolver', () => {
signer
);
verifier = await l1VerifierFactory.deploy(['test:']);

const DefaultReverseResolverFactory = await ethers.getContractFactory(
'DefaultReverseResolver',
)
defaultReverseResolver = await DefaultReverseResolverFactory.deploy()
await provider.send('evm_mine', []);
const testL2Factory = await ethers.getContractFactory(
'L2ReverseRegistrar',
signer
Expand All @@ -82,7 +87,11 @@ describe('Crosschain Reverse Resolver', () => {
'L1ReverseResolver',
signer
);
target = await testL1Factory.deploy(await verifier.getAddress(), await l2contract.getAddress());
target = await testL1Factory.deploy(
await verifier.getAddress(),
await l2contract.getAddress(),
await defaultReverseResolver.getAddress()
);
// Mine an empty block so we have something to prove against
await provider.send('evm_mine', []);
});
Expand All @@ -99,6 +108,57 @@ describe('Crosschain Reverse Resolver', () => {
expect(result2).to.equal(name);
})

it.only("should test fallback name", async() => {
const testSigner = new ethers.Wallet('0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80');
const testAddress = testSigner.address
console.log(1, {testSigner})
const name = 'myname.eth'
console.log(2)
const node = await defaultReverseResolver.node(testAddress)
console.log(3)
const funcId = ethers
.id('setNameForAddrWithSignature(address,string,uint256,bytes)')
.substring(0, 10)
console.log(4)
const block = await provider.getBlock('latest')
console.log(5, {signer})
const inceptionDate = block?.timestamp
const account = await signer.getAddress()
console.log(6, {funcId, name, inceptionDate, account})
const message = ethers.solidityPackedKeccak256(
['bytes32', 'address', 'uint256', 'uint256'],
[ethers.solidityPackedKeccak256(['bytes4', 'string'], [funcId, name]), testAddress, inceptionDate, 0],
)
console.log(62, {message})
const signature = await testSigner.signMessage(ethers.toBeArray(message))

console.log(63, {signature})
await defaultReverseResolver['setNameForAddrWithSignature'](
testAddress,
name,
inceptionDate,
signature,
)
console.log(8)
// await l2contract.clearRecords(await signer.getAddress())
await l2contract.setName(name)

await provider.send("evm_mine", []);
console.log(10)
const result2 = await target.name(node, { enableCcipRead: true })
console.log(11, {result2})
expect(result2).to.equal(name);
// const name = 'vitalik.eth'
// const node = await l2contract.node(
// await signer.getAddress(),
// )
// await l2contract.clearRecords(await signer.getAddress())
// await l2contract.setName(name)
// await provider.send("evm_mine", []);
// const result2 = await target.name(node, { enableCcipRead: true })
// expect(result2).to.equal(name);
})

it("should test text record", async() => {
const key = 'name'
const value = 'nick.eth'
Expand Down

0 comments on commit 0629aea

Please sign in to comment.