Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { artifacts, execute } from "@rocketh";
import { MAX_EXPIRY, ROLES } from "../constants.js";
import { zeroAddress } from "viem";

// TODO: ownership
// TODO: ownership
export default execute(
async ({ deploy, execute: write, get, namedAccounts: { deployer } }) => {
const rootRegistry =
Expand All @@ -14,9 +15,6 @@ export default execute(
(typeof artifacts.SimpleRegistryMetadata)["abi"]
>("SimpleRegistryMetadata");

const ethTLDResolver =
get<(typeof artifacts.ETHTLDResolver)["abi"]>("ETHTLDResolver");

const ethRegistry = await deploy("ETHRegistry", {
account: deployer,
artifact: artifacts.PermissionedRegistry,
Expand All @@ -31,23 +29,11 @@ export default execute(
await write(rootRegistry, {
account: deployer,
functionName: "register",
args: [
"eth",
deployer,
ethRegistry.address,
ethTLDResolver.address,
0n,
MAX_EXPIRY,
],
args: ["eth", deployer, ethRegistry.address, zeroAddress, 0n, MAX_EXPIRY],
});
},
{
tags: ["ETHRegistry", "l1"],
dependencies: [
"RootRegistry",
"RegistryDatastore",
"RegistryMetadata",
"ETHTLDResolver",
],
dependencies: ["RootRegistry", "RegistryDatastore", "RegistryMetadata"],
},
);
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
import { artifacts, execute } from "@rocketh";
import {
type RpcLog,
encodeFunctionData,
parseEventLogs,
zeroAddress,
} from "viem";
import { type RpcLog, encodeFunctionData, parseEventLogs } from "viem";

export default execute(
async (
Expand All @@ -13,13 +8,19 @@ export default execute(
) => {
if (!args?.l2Deploy) throw new Error("expected L2 deployment");

const ensRegistryV1 =
get<(typeof artifacts.ENSRegistry)["abi"]>("ENSRegistry");
const nameWrapper =
get<(typeof artifacts.NameWrapper)["abi"]>("NameWrapper");

const batchGatewayProvider = get<(typeof artifacts.GatewayProvider)["abi"]>(
"BatchGatewayProvider",
);

const ethRegistry =
get<(typeof artifacts.PermissionedRegistry)["abi"]>("ETHRegistry");

const bridgeController =
get<(typeof artifacts.L1BridgeController)["abi"]>("BridgeController");

const verifiableFactory =
get<(typeof artifacts.VerifiableFactory)["abi"]>("VerifiableFactory");

Expand Down Expand Up @@ -62,9 +63,10 @@ export default execute(
account: deployer,
artifact: artifacts.ETHTLDResolver,
args: [
ensRegistryV1.address,
nameWrapper.address,
batchGatewayProvider.address,
zeroAddress, // burnAddressV1
ethRegistry.address,
bridgeController.address,
ethSelfResolver.address,
args.verifierAddress,
args.l2Deploy.deployments.RegistryDatastore.address,
Expand All @@ -81,10 +83,12 @@ export default execute(
{
tags: ["ETHTLDResolver", "l1"],
dependencies: [
"NameWrapper",
"BatchGatewayProvider",
"ETHRegistry",
"BridgeController",
"VerifiableFactory",
"DedicatedResolver",
"BaseRegistrarImplementation", // "ENSRegistry"
"BatchGatewayProvider",
],
},
);
22 changes: 22 additions & 0 deletions contracts/deploy/l1/05_SetETHTLDResolver.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { artifacts, execute } from "@rocketh";
import { labelToCanonicalId } from "../../test/utils/utils.ts";

export default execute(
async ({ execute: write, get, namedAccounts: { deployer } }) => {
const rootRegistry =
get<(typeof artifacts.PermissionedRegistry)["abi"]>("RootRegistry");

const ethTLDResolver =
get<(typeof artifacts.ETHTLDResolver)["abi"]>("ETHTLDResolver");

await write(rootRegistry, {
account: deployer,
functionName: "setResolver",
args: [labelToCanonicalId("eth"), ethTLDResolver.address],
});
},
{
tags: ["SetETHTLDResolver", "l1"],
dependencies: ["RootRegistry", "ETHTLDResolver"],
},
);
4 changes: 2 additions & 2 deletions contracts/foundry.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"rev": "82cc81935de1d1a82e021cf1030d902c5248982b"
},
"lib/ens-contracts": {
"rev": "143fd904fade60cae1b7862a7d998f434063a345"
"rev": "a54e5cf2857ab597011d115b9b1183c7a83bd307"
},
"lib/forge-std": {
"rev": "77041d2ce690e692d6e03cc812b57d1ddaa4d505"
Expand All @@ -21,7 +21,7 @@
"rev": "c4fbe97cf5e8c1b8d607001588fd23abb5bfb923"
},
"lib/unruggable-gateways": {
"rev": "4c246c98d322fcf12654138e63fcd4bea3f31f7b"
"rev": "84d0a07772618a293abf3f778f4caabd51ca8ff5"
},
"lib/verifiable-factory": {
"rev": "c47c0e61ce03b3ab5891a3b743287b54aee9f021"
Expand Down
2 changes: 0 additions & 2 deletions contracts/foundry.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,3 @@ runs = 4096

[lint]
lint_on_build = false

# forge i ensdomains/ens-contracts@branch=feature-fet-1938/fixed-deploy-scripts
2 changes: 2 additions & 0 deletions contracts/hardhat.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,8 @@ const config = {
"./lib/verifiable-factory/src/",
"./lib/ens-contracts/contracts/",
"./lib/openzeppelin-contracts/contracts/utils/introspection/",
"./lib/openzeppelin-contracts/contracts/token/ERC721",
"./lib/openzeppelin-contracts/contracts/token/ERC1155/",
],
},
},
Expand Down
2 changes: 1 addition & 1 deletion contracts/lib/unruggable-gateways
2 changes: 1 addition & 1 deletion contracts/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
"test:hardhat": "bun run compile:hardhat && vitest run",
"test:e2e": "bun run compile:hardhat --quiet && bun test ./test/e2e/",
"test": "bun run test:forge && bun run test:hardhat",
"interfaces": "bun run compile:hardhat --quiet && bun ./script/interfaces.ts",
"interfaces": "bun run compile:hardhat --quiet && bun ./lib/ens-contracts/scripts/interfaces.ts",
"coverage:forge": "mkdir -p coverage/ && forge coverage --report lcov --report-file coverage/forge.lcov",
"coverage:hardhat": "hardhat compile --coverage && COVERAGE=1 vitest run",
"coverage:reports": "bun ./script/coverage.ts",
Expand Down
4 changes: 3 additions & 1 deletion contracts/remappings.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,16 @@
@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/
@openzeppelin/contracts-v5/=lib/openzeppelin-contracts/contracts/
@ens/contracts/=lib/ens-contracts/contracts/
@ens/contracts/utils/LibMem/=src/common/utils/
@ensdomains/buffer/=lib/buffer/
@unruggable/gateways/=lib/unruggable-gateways/
@ensdomains/verifiable-factory/=lib/verifiable-factory/src/
forge-std/=lib/forge-std/src/
lib/ens-contracts/contracts/utils/LibMem/=src/common/utils/
lib/ens-contracts/:@openzeppelin/contracts=lib/openzeppelin-contracts-v4/contracts
lib/ens-contracts/:@openzeppelin/contracts-v5=lib/openzeppelin-contracts/contracts
lib/ens-contracts/:@ensdomains/solsha1/contracts=lib/solsha1/contracts
lib/ens-contracts/:@unruggable/gateways/=lib/unruggable-gateways/contracts
test/mocks/v1/:@openzeppelin/contracts=lib/openzeppelin-contracts-v4/contracts
~src/=src/
~test/=test/
~test/=test/
67 changes: 0 additions & 67 deletions contracts/script/interfaces.ts

This file was deleted.

3 changes: 1 addition & 2 deletions contracts/script/setup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -102,15 +102,14 @@ const l2Contracts = {
} as const satisfies DeployedArtifacts;

export type CrossChainSnapshot = () => Promise<void>;
export type CrossChainClient = ReturnType<typeof createClient>;
export type CrossChainEnvironment = Awaited<
ReturnType<typeof setupCrossChainEnvironment>
>;

export type L1Deployment = ChainDeployment<typeof l1Contracts>;
export type L2Deployment = ChainDeployment<typeof l2Contracts>;

export type CrossChainClient = ReturnType<typeof createClient>;

function ansi(c: any, s: any) {
return `\x1b[${c}m${s}\x1b[0m`;
}
Expand Down
8 changes: 5 additions & 3 deletions contracts/src/L1/bridge/L1BridgeController.sol
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.13;

import {NameCoder} from "@ens/contracts/utils/NameCoder.sol";

import {EjectionController} from "../../common/bridge/EjectionController.sol";
import {IBridge} from "../../common/bridge/interfaces/IBridge.sol";
import {BridgeEncoderLib} from "../../common/bridge/libraries/BridgeEncoderLib.sol";
Expand Down Expand Up @@ -53,7 +55,7 @@ contract L1BridgeController is EjectionController {
function completeEjectionToL1(
TransferData memory transferData
) external virtual onlyRootRoles(BridgeRolesLib.ROLE_EJECTOR) returns (uint256 tokenId) {
string memory label = LibLabel.extractLabel(transferData.dnsEncodedName);
string memory label = NameCoder.firstLabel(transferData.dnsEncodedName);

tokenId = REGISTRY.register(
label,
Expand Down Expand Up @@ -113,8 +115,8 @@ contract L1BridgeController is EjectionController {
// check that the label matches the token id
_assertTokenIdMatchesLabel(tokenId, transferData.dnsEncodedName);

// burn the token
REGISTRY.burn(tokenId);
// burn the token but keep the registry/resolver
REGISTRY.burn(tokenId, true);

// send the message to the bridge
BRIDGE.sendMessage(BridgeEncoderLib.encodeEjection(transferData));
Expand Down
12 changes: 6 additions & 6 deletions contracts/src/L1/migration/L1LockedMigrationController.sol
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.13;

import {NameCoder} from "@ens/contracts/utils/NameCoder.sol";
import {INameWrapper, CAN_EXTEND_EXPIRY} from "@ens/contracts/wrapper/INameWrapper.sol";
import {VerifiableFactory} from "@ensdomains/verifiable-factory/VerifiableFactory.sol";
import {IERC1155Receiver} from "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
import {ERC165, IERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";

import {MigrationData} from "../../common/bridge/types/TransferData.sol";
import {UnauthorizedCaller} from "../../common/CommonErrors.sol";
import {LibLabel} from "../../common/utils/LibLabel.sol";
import {L1BridgeController} from "../bridge/L1BridgeController.sol";

import {LockedNamesLib} from "./libraries/LockedNamesLib.sol";
Expand Down Expand Up @@ -132,12 +132,12 @@ contract L1LockedMigrationController is IERC1155Receiver, ERC165 {
migrationDataArray[i].transferData.roleBitmap = tokenRoles;

// Ensure name data consistency for migration
string memory label = LibLabel.extractLabel(
migrationDataArray[i].transferData.dnsEncodedName
(bytes32 labelHash, ) = NameCoder.readLabel(
migrationDataArray[i].transferData.dnsEncodedName,
0
);
uint256 expectedTokenId = uint256(keccak256(bytes(label)));
if (tokenIds[i] != expectedTokenId) {
revert TokenIdMismatch(tokenIds[i], expectedTokenId);
if (tokenIds[i] != uint256(labelHash)) {
revert TokenIdMismatch(tokenIds[i], uint256(labelHash));
}

// Process the locked name migration through bridge
Expand Down
9 changes: 4 additions & 5 deletions contracts/src/L1/migration/L1UnlockedMigrationController.sol
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.13;

import {NameCoder} from "@ens/contracts/utils/NameCoder.sol";
import {INameWrapper, CANNOT_UNWRAP} from "@ens/contracts/wrapper/INameWrapper.sol";
import {IERC1155Receiver} from "@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol";
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
Expand All @@ -9,7 +10,6 @@ import {ERC165, IERC165} from "@openzeppelin/contracts/utils/introspection/ERC16
import {BridgeEncoderLib} from "../../common/bridge/libraries/BridgeEncoderLib.sol";
import {MigrationData} from "../../common/bridge/types/TransferData.sol";
import {UnauthorizedCaller} from "../../common/CommonErrors.sol";
import {LibLabel} from "../../common/utils/LibLabel.sol";
import {L1BridgeController} from "../bridge/L1BridgeController.sol";

/**
Expand Down Expand Up @@ -166,10 +166,9 @@ contract L1UnlockedMigrationController is IERC1155Receiver, IERC721Receiver, ERC
*/
function _migrateNameViaBridge(uint256 tokenId, MigrationData memory migrationData) internal {
// Validate that tokenId matches the label hash
string memory label = LibLabel.extractLabel(migrationData.transferData.dnsEncodedName);
uint256 expectedTokenId = uint256(keccak256(bytes(label)));
if (tokenId != expectedTokenId) {
revert TokenIdMismatch(tokenId, expectedTokenId);
(bytes32 labelHash, ) = NameCoder.readLabel(migrationData.transferData.dnsEncodedName, 0);
if (tokenId != uint256(labelHash)) {
revert TokenIdMismatch(tokenId, uint256(labelHash));
}

// Handle L1 migration by setting up the name locally
Expand Down
4 changes: 2 additions & 2 deletions contracts/src/L1/registry/MigratedWrappedNameRegistry.sol
Original file line number Diff line number Diff line change
Expand Up @@ -286,15 +286,15 @@ contract MigratedWrappedNameRegistry is
) internal view returns (string memory label) {
// Extract the current label (leftmost, at offset 0)
uint256 parentOffset;
(label, parentOffset) = LibLabel.extractLabel(dnsEncodedName, offset);
(label, parentOffset) = NameCoder.extractLabel(dnsEncodedName, offset);

// Check if there's no parent (trying to migrate TLD)
if (dnsEncodedName[parentOffset] == 0) {
revert NoParentDomain();
}

// Extract the parent label
(string memory parentLabel, uint256 grandparentOffset) = LibLabel.extractLabel(
(string memory parentLabel, uint256 grandparentOffset) = NameCoder.extractLabel(
dnsEncodedName,
parentOffset
);
Expand Down
Loading
Loading