const namehash = require("eth-ens-namehash");
async function deployENS(hre) {
const { ethers } = hre;
const [deployer, alice, bob, charlie] = await ethers.getSigners();
console.log("Deploying ENS contracts...");
console.log("Deployer:", deployer.address);
const ENSRegistry = await ethers.getContractFactory("ENSRegistry");
const ensRegistry = await ENSRegistry.deploy();
await ensRegistry.waitForDeployment();
console.log("ENS Registry deployed to:", await ensRegistry.getAddress());
const PublicResolver = await ethers.getContractFactory("PublicResolver");
const publicResolver = await PublicResolver.deploy(
await ensRegistry.getAddress(),
);
await publicResolver.waitForDeployment();
console.log(
"Public Resolver deployed to:",
await publicResolver.getAddress(),
);
console.log(
`export PUBLIC_ENS_RESOLVER_ADDRESS=${await publicResolver.getAddress()}`,
);
const ReverseRegistrar = await ethers.getContractFactory("ReverseRegistrar");
const reverseRegistrar = await ReverseRegistrar.deploy(
await ensRegistry.getAddress(),
await publicResolver.getAddress(),
);
await reverseRegistrar.waitForDeployment();
console.log(
"Reverse Registrar deployed to:",
await reverseRegistrar.getAddress(),
);
const reverseNodeTx = await ensRegistry.setSubnodeOwner(
ethers.ZeroHash,
ethers.keccak256(ethers.toUtf8Bytes("reverse")),
deployer.address,
);
await reverseNodeTx.wait();
const addrNodeTx = await ensRegistry.setSubnodeOwner(
namehash.hash("reverse"),
ethers.keccak256(ethers.toUtf8Bytes("addr")),
await reverseRegistrar.getAddress(),
);
await addrNodeTx.wait();
const ethNodeTx = await ensRegistry.setSubnodeOwner(
ethers.ZeroHash,
ethers.keccak256(ethers.toUtf8Bytes("eth")),
deployer.address,
);
await ethNodeTx.wait();
console.log("Created 'eth' TLD");
const testNames = [
{ name: "alice.eth", owner: alice.address },
{ name: "bob.eth", owner: bob.address },
{ name: "charlie.eth", owner: charlie.address },
];
for (const { name, owner } of testNames) {
const label = name.split(".")[0];
const node = namehash.hash(name);
await ensRegistry.setSubnodeRecord(
namehash.hash("eth"),
ethers.keccak256(ethers.toUtf8Bytes(label)),
owner,
await publicResolver.getAddress(),
0,
);
await publicResolver
.connect(await ethers.getSigner(owner))
.setAddr(node, owner);
const reverseTx = await reverseRegistrar
.connect(await ethers.getSigner(owner))
.setName(name);
await reverseTx.wait();
const addrHex = owner.slice(2).toLowerCase();
const addrHash = ethers.keccak256(ethers.toUtf8Bytes(addrHex));
const addrReverseNode = await reverseRegistrar.ADDR_REVERSE_NODE();
const reverseNode = ethers.keccak256(
ethers.solidityPacked(
["bytes32", "bytes32"],
[addrReverseNode, addrHash],
),
);
await publicResolver
.connect(await ethers.getSigner(owner))
.setName(reverseNode, name);
console.log(`Registered ${name} -> ${owner}`);
}
const deployerLabel = "deployer";
const deployerNode = namehash.hash("deployer.eth");
await ensRegistry.setSubnodeRecord(
namehash.hash("eth"),
ethers.keccak256(ethers.toUtf8Bytes(deployerLabel)),
deployer.address,
await publicResolver.getAddress(),
0,
);
await publicResolver
.connect(deployer)
.setAddr(deployerNode, deployer.address);
console.log(`Registered deployer.eth -> ${deployer.address}`);
return {
ensRegistry,
publicResolver,
reverseRegistrar,
};
}
module.exports = { deployENS };
if (require.main === module) {
deployENS(hre)
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});
}