From 5d894e843f8dbfa56d833c18a78d30620d822864 Mon Sep 17 00:00:00 2001 From: katzman Date: Wed, 18 Jun 2025 14:49:28 -0700 Subject: [PATCH 1/3] Add CreateName script for testnet --- script/testnet/CreateName.s.sol | 73 +++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 script/testnet/CreateName.s.sol diff --git a/script/testnet/CreateName.s.sol b/script/testnet/CreateName.s.sol new file mode 100644 index 00000000..9d595d49 --- /dev/null +++ b/script/testnet/CreateName.s.sol @@ -0,0 +1,73 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.8.23; + +import {BaseRegistrar} from "src/L2/BaseRegistrar.sol"; +import {RegistrarController} from "src/L2/RegistrarController.sol"; +import {LibString} from "solady/utils/LibString.sol"; +import {NameResolver} from "ens-contracts/resolvers/profiles/NameResolver.sol"; +import {Multicallable} from "ens-contracts/resolvers/Multicallable.sol"; +import "ens-contracts/utils/NameEncoder.sol"; + +import "forge-std/Script.sol"; + +interface AddrResolver { + function setAddr(bytes32 node, uint256 cointype, bytes memory addr) external; +} + +contract CreateName is Script { + uint256 pkey = vm.envUint("TESTNET_PRIVATE_KEY"); + address BASE_REGISTRAR = vm.envAddress("TESTNET_BASE_REGISTRAR_ADDR"); + address L2RESOLVER = vm.envAddress("TESTNET_L2_RESOLVER_ADDR"); + + address testnetAddr = vm.addr(pkey); + uint256 constant ETH_COINTYPE = 60; + uint256 constant BASE_SEPOLIA_COINTYPE = 0x80000000 | 0x00014A34; // 84532 + + function run(string memory name, uint256 duration, bool setRecords) external { + console.log("-------------------------------"); + console.log("Minting name:"); + console.log(name); + console.log("-------------------------------"); + + vm.startBroadcast(pkey); + + bytes32 label = keccak256(bytes(name)); + uint256 id = uint256(label); + + BaseRegistrar(BASE_REGISTRAR).registerOnly(id, testnetAddr, duration); + + if(setRecords) { + setResolverDetails(name); + } + } + + function setResolverDetails(string memory name) public { + vm.startBroadcast(pkey); + + bytes32 label = keccak256(bytes(name)); + uint256 id = uint256(label); + BaseRegistrar(BASE_REGISTRAR).renew(id, 3600); + + console.log(BaseRegistrar(BASE_REGISTRAR).nameExpires(id)); + + BaseRegistrar(BASE_REGISTRAR).reclaim(id, testnetAddr); + + (,bytes32 node) = NameEncoder.dnsEncodeName(string.concat(name,".basetest.eth")); + Multicallable(L2RESOLVER).multicallWithNodeCheck(node, _buildResolverData(node, testnetAddr, name)); + } + + function _buildResolverData(bytes32 node, address addr, string memory name) internal pure returns (bytes[] memory data) { + bytes[] memory multicallData = new bytes[](3); + multicallData[0] = abi.encodeWithSelector(AddrResolver.setAddr.selector, node, ETH_COINTYPE, _addressToBytes(addr)); + multicallData[1] = abi.encodeWithSelector(AddrResolver.setAddr.selector, node, BASE_SEPOLIA_COINTYPE, _addressToBytes(addr)); + multicallData[2] = abi.encodeWithSelector(NameResolver.setName.selector, node, string.concat(name,".basetest.eth")); + return multicallData; + } + + function _addressToBytes(address a) internal pure returns (bytes memory b) { + b = new bytes(20); + assembly { + mstore(add(b, 32), mul(a, exp(256, 12))) + } + } +} \ No newline at end of file From 6437678425887171ff26dee937cec910902dd75a Mon Sep 17 00:00:00 2001 From: katzman Date: Wed, 18 Jun 2025 14:50:24 -0700 Subject: [PATCH 2/3] lint --- script/testnet/CreateName.s.sol | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/script/testnet/CreateName.s.sol b/script/testnet/CreateName.s.sol index 9d595d49..a2062cf1 100644 --- a/script/testnet/CreateName.s.sol +++ b/script/testnet/CreateName.s.sol @@ -36,7 +36,7 @@ contract CreateName is Script { BaseRegistrar(BASE_REGISTRAR).registerOnly(id, testnetAddr, duration); - if(setRecords) { + if (setRecords) { setResolverDetails(name); } } @@ -52,15 +52,22 @@ contract CreateName is Script { BaseRegistrar(BASE_REGISTRAR).reclaim(id, testnetAddr); - (,bytes32 node) = NameEncoder.dnsEncodeName(string.concat(name,".basetest.eth")); + (, bytes32 node) = NameEncoder.dnsEncodeName(string.concat(name, ".basetest.eth")); Multicallable(L2RESOLVER).multicallWithNodeCheck(node, _buildResolverData(node, testnetAddr, name)); } - function _buildResolverData(bytes32 node, address addr, string memory name) internal pure returns (bytes[] memory data) { + function _buildResolverData(bytes32 node, address addr, string memory name) + internal + pure + returns (bytes[] memory data) + { bytes[] memory multicallData = new bytes[](3); - multicallData[0] = abi.encodeWithSelector(AddrResolver.setAddr.selector, node, ETH_COINTYPE, _addressToBytes(addr)); - multicallData[1] = abi.encodeWithSelector(AddrResolver.setAddr.selector, node, BASE_SEPOLIA_COINTYPE, _addressToBytes(addr)); - multicallData[2] = abi.encodeWithSelector(NameResolver.setName.selector, node, string.concat(name,".basetest.eth")); + multicallData[0] = + abi.encodeWithSelector(AddrResolver.setAddr.selector, node, ETH_COINTYPE, _addressToBytes(addr)); + multicallData[1] = + abi.encodeWithSelector(AddrResolver.setAddr.selector, node, BASE_SEPOLIA_COINTYPE, _addressToBytes(addr)); + multicallData[2] = + abi.encodeWithSelector(NameResolver.setName.selector, node, string.concat(name, ".basetest.eth")); return multicallData; } @@ -70,4 +77,4 @@ contract CreateName is Script { mstore(add(b, 32), mul(a, exp(256, 12))) } } -} \ No newline at end of file +} From 78f3a86d0ecece923512733b4d0ae9d7718b32d8 Mon Sep 17 00:00:00 2001 From: katzman Date: Wed, 18 Jun 2025 14:52:38 -0700 Subject: [PATCH 3/3] Cleanup with helper, lint --- script/testnet/CreateName.s.sol | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/script/testnet/CreateName.s.sol b/script/testnet/CreateName.s.sol index a2062cf1..3a98edda 100644 --- a/script/testnet/CreateName.s.sol +++ b/script/testnet/CreateName.s.sol @@ -31,10 +31,7 @@ contract CreateName is Script { vm.startBroadcast(pkey); - bytes32 label = keccak256(bytes(name)); - uint256 id = uint256(label); - - BaseRegistrar(BASE_REGISTRAR).registerOnly(id, testnetAddr, duration); + BaseRegistrar(BASE_REGISTRAR).registerOnly(_getIdFromName(name), testnetAddr, duration); if (setRecords) { setResolverDetails(name); @@ -43,9 +40,10 @@ contract CreateName is Script { function setResolverDetails(string memory name) public { vm.startBroadcast(pkey); + console.log("Setting records..."); + + uint256 id = _getIdFromName(name); - bytes32 label = keccak256(bytes(name)); - uint256 id = uint256(label); BaseRegistrar(BASE_REGISTRAR).renew(id, 3600); console.log(BaseRegistrar(BASE_REGISTRAR).nameExpires(id)); @@ -71,6 +69,11 @@ contract CreateName is Script { return multicallData; } + function _getIdFromName(string memory name) internal returns (uint256 id) { + bytes32 label = keccak256(bytes(name)); + id = uint256(label); + } + function _addressToBytes(address a) internal pure returns (bytes memory b) { b = new bytes(20); assembly {