From 5b9334d41a48a3b2744908e7b704baa2e4719951 Mon Sep 17 00:00:00 2001 From: JOY <5027251+JOY@users.noreply.github.com> Date: Wed, 21 Oct 2026 11:43:14 +0700 Subject: [PATCH 1/5] fix: point DOS Testnet at the canonical JASJ chain On 2026-08-22 test.doschain.com was mis-routed to the replaced interim chain 2EhC (same chain ID 3939). The ENSv2 redeploy that day landed on 2EhC, and this record and the deploy scripts were "aligned" to it. The canonical testnet is JASJ (genesis 0x36f98b2e...), where the 2026-08-12 deployment (blocks 120-166) is live: all 16 contracts have bytecode. - Restore contracts/deployments/dos-testnet-3939.json to that JASJ deployment (a89847e5), which the subgraph manifest renders from. - Expect the JASJ genesis in both testnet deploy wrappers. - Sign the domain-policy deployment with the owner's Ledger (forge --ledger --sender) instead of reading PRIVATE_KEY: the owner 0x310Bc is a hardware wallet. preflight still rejects any other sender. The score-gated policy was never deployed on any chain (the owner made no deploy transactions on 2EhC). A dry run against JASJ succeeds. Co-Authored-By: Claude Opus 5.5 --- contracts/deployments/dos-testnet-3939.json | 42 +++++++++---------- .../DeployDOSDomainPolicyTestnet.s.sol | 14 ++++--- .../Invoke-DeployDOSDomainPolicyTestnet.ps1 | 21 +++++----- .../foundry/Invoke-DeployDOSTestnet.ps1 | 2 +- 4 files changed, 40 insertions(+), 39 deletions(-) diff --git a/contracts/deployments/dos-testnet-3939.json b/contracts/deployments/dos-testnet-3939.json index 2b7d6a074..580bfcfe8 100644 --- a/contracts/deployments/dos-testnet-3939.json +++ b/contracts/deployments/dos-testnet-3939.json @@ -1,35 +1,35 @@ { "environment": "dos-testnet", "chainId": 3939, - "deploymentBlock": 9, - "finalDeploymentBlock": 55, - "deployedAt": "2026-08-22T18:56:26Z", + "deploymentBlock": 120, + "finalDeploymentBlock": 166, + "deployedAt": "2026-08-12T15:49:48Z", "deployer": "0x99999e454138f6be73E2bE82c890bc5765749999", "owner": "0x310Bc061214ee89aF5CfB28a6ebF96c5436fa3CD", "beneficiary": "0x310Bc061214ee89aF5CfB28a6ebF96c5436fa3CD", "smokeName": "bens-smoke.dos", "smokeResolvedAddress": "0x99999e454138f6be73E2bE82c890bc5765749999", "transactions": { - "first": "0x4335e554287b08d1abedc1d6cd26e5b09fa6b427573d73c4306c885ba13e3a71", - "last": "0x33f1789f46590117fc44eb3e941da2579e53586ce1d1de45d582cb069612c719", + "first": "0xc0f8e5390dab49911ce5f0f4c0a035e3251033c7d502f3db2632e389ef3ab599", + "last": "0xa3f4e38ec91c8db369df6afa40eea3e28f73a858e3a4c1bbceca3a60b38e6d0a", "count": 47 }, "contracts": { - "wrappedDOS": "0xc647ccf449dec38bb8b7272e60fc14b3548c9547", - "contractNamerImplementation": "0x069056b2ae8fd8c071efb827c5af73a0996840e1", - "contractNamer": "0x030eec847cf5d9d1c4a0b4e0459d130d0b35577c", - "verifiableFactory": "0xb86bb608e6afd7a8eb209510c01bb859a7c315f1", - "labelStore": "0x38fc582690c3f28099087a88520056afab08ce5f", - "rootRegistry": "0xb17fec6fe18ac0b7f3dd934495e84ec06cf88564", - "dosRegistry": "0x8a2730c903d93b2116fab3d9110c7d585f7b5a91", - "reverseRegistry": "0x641ee4711013ee40b34fae860894227c4771f273", - "priceOracle": "0x1f31e05948769174da256d0484b8f26cfd3d8c97", - "dosRegistrar": "0x27a3b7ff0ef7fb96d49eb50b069570f407387362", - "permissionedResolverImplementation": "0xfa579733d7c5a21b5d3c4399d3d6ef89fc3a3720", - "userRegistryImplementation": "0x8291f1c6aef2acbc58f3fe11c9e4ec0d3d4ae904", - "gatewayProvider": "0xcb20a0c349f079b8bd403ea8f668fe3da49e981f", - "universalResolver": "0x5a34c9fb9806239ed61f1570c51edb198333fbea", - "reverseRegistrar": "0x3cd8bddeb177492c5e521c3b82179887f472f018", - "smokeResolver": "0xee4b6427b88b8aa30fe2295139b8b2216f32d51b" + "wrappedDOS": "0x4bb2dcea9e18604741287a12d87abd9de793e3f4", + "contractNamerImplementation": "0xdd20fc2290cf664eccd3414799a9f024bdea531c", + "contractNamer": "0x64A04D812cdc62971f7E446E15a53c3C57f11418", + "verifiableFactory": "0xC9A8C00499Ef4f20Fffad7114C0eFfE8E766FE11", + "labelStore": "0x57C06ec4a92eC4eEB7c4eaFaBfBc64661483f3Bb", + "rootRegistry": "0x0dC5af261429d661BbF4903AbB79049a0713e04B", + "dosRegistry": "0x95366f1E44532F50c022aEefF708F424b7854173", + "reverseRegistry": "0x4d5429C2c0EE50b903407F44F8A21d20CAAcB475", + "priceOracle": "0x2eE958BcF29d140cdf64ad767f32E2554B0CCfa6", + "dosRegistrar": "0x4E5B48aC8B221aAF8cFF070671CB6Eeea2122b5c", + "permissionedResolverImplementation": "0x7C320eF16DE9CDD1BB9591AACF38c4c26f391e25", + "userRegistryImplementation": "0x440F74b09DfD3a848a9168d7d73784bCC03eF590", + "gatewayProvider": "0xEc7dFA7Dd3C7882d8716782689cE85e1Ccf9C68c", + "universalResolver": "0xbd0f96e3E8510a1bb806cAA9836fc76dfb1a5c47", + "reverseRegistrar": "0xD445f533aeC6E8BAE185f9903943e7B2E655472e", + "smokeResolver": "0xf2de697266073C4ba4D546d4305c228BBF5B1813" } } diff --git a/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol b/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol index 2508af701..c269490bc 100644 --- a/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol +++ b/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol @@ -11,9 +11,9 @@ import {PermissionedRegistry} from "~src/registry/PermissionedRegistry.sol"; /// @title Deploy DOS ID Domain Policy on DOS Testnet /// @notice Replaces the public Testnet registrar role with a policy-controlled registrar. -/// @dev Required env: PRIVATE_KEY (the canonical registry owner), DOS_DOMAIN_VOUCHER_SIGNER, -/// DOS_DOMAIN_REGISTRY, DOS_DOMAIN_PRICE_ORACLE, and DOS_DOMAIN_LEGACY_REGISTRAR. -/// No private voucher key is read by this deployment script. +/// @dev Signed by the canonical registry owner's Ledger (`forge script --ledger --sender `). +/// Required env: DOS_DOMAIN_VOUCHER_SIGNER, DOS_DOMAIN_REGISTRY, DOS_DOMAIN_PRICE_ORACLE, and +/// DOS_DOMAIN_LEGACY_REGISTRAR. No private key of any kind is read by this deployment script. contract DeployDOSDomainPolicyTestnet is Script { //////////////////////////////////////////////////////////////////////// // Types @@ -93,11 +93,13 @@ contract DeployDOSDomainPolicyTestnet is Script { /// @dev Policy subsidy funding is intentionally separate: seed it only after address verification. /// @return deployment The deployed policy and policy-controlled registrar. function run() external returns (Deployment memory deployment) { - uint256 privateKey = vm.envUint("PRIVATE_KEY"); + // The canonical owner is a Ledger: run with `--ledger --sender `, so no private key + // ever reaches disk or the environment. preflight rejects any other sender. + address broadcaster = msg.sender; DeploymentConfig memory config = deploymentConfig(); - preflight(vm.addr(privateKey), config); + preflight(broadcaster, config); - vm.startBroadcast(privateKey); + vm.startBroadcast(broadcaster); deployment.policy = deployPolicy(config); deployment.registrar = deployRegistrar(config, deployment.policy); config.registry.grantRootRoles(REGISTRAR_ROLES, address(deployment.registrar)); diff --git a/contracts/script/foundry/Invoke-DeployDOSDomainPolicyTestnet.ps1 b/contracts/script/foundry/Invoke-DeployDOSDomainPolicyTestnet.ps1 index 4d9e2d63c..bf2634d95 100644 --- a/contracts/script/foundry/Invoke-DeployDOSDomainPolicyTestnet.ps1 +++ b/contracts/script/foundry/Invoke-DeployDOSDomainPolicyTestnet.ps1 @@ -1,6 +1,8 @@ [CmdletBinding()] param( [string]$RpcUrl = "https://test.doschain.com", + # Ledger derivation path of the owner account; Foundry's default is used when empty. + [string]$LedgerHdPath = "", [switch]$Broadcast ) @@ -9,11 +11,10 @@ $ErrorActionPreference = "Stop" $expectedRpcUrl = "https://test.doschain.com" $expectedChainId = 3939 -$expectedGenesisHash = "0x1f6dd88694681d79a3a56313f59de56b1b6555c8e06a2ef377084f1e897feef4" +$expectedGenesisHash = "0x36f98b2e8b3084d57efc46622a065c2a96ed51aca86ac229bce998be6b8abd2c" $expectedOwner = "0x310bc061214ee89af5cfb28a6ebf96c5436fa3cd" $minimumBalanceWei = [System.Numerics.BigInteger]::Parse("1000000000000000000") $requiredEnvironmentVariables = @( - "PRIVATE_KEY", "DOS_DOMAIN_VOUCHER_SIGNER", "DOS_DOMAIN_REGISTRY", "DOS_DOMAIN_PRICE_ORACLE", @@ -47,15 +48,6 @@ foreach ($name in $requiredEnvironmentVariables) { } } -$privateKey = $env:PRIVATE_KEY.Trim() -if ($privateKey -match "^[0-9a-fA-F]{64}$") { - $privateKey = "0x$privateKey" -} -if ($privateKey -notmatch "^0x[0-9a-fA-F]{64}$") { - throw "PRIVATE_KEY must be a 32-byte hexadecimal value" -} -$env:PRIVATE_KEY = $privateKey - $cast = Resolve-FoundryCommand -Name "cast" $forge = Resolve-FoundryCommand -Name "forge" @@ -81,8 +73,10 @@ if ($balance -lt $minimumBalanceWei) { $contractsRoot = Resolve-Path (Join-Path $PSScriptRoot "..\..") Push-Location $contractsRoot try { + # Simulation needs only the owner address; the Ledger signs nothing until -Broadcast. & $forge script "script/foundry/DeployDOSDomainPolicyTestnet.s.sol:DeployDOSDomainPolicyTestnet" ` --rpc-url $RpcUrl ` + --sender $expectedOwner ` --slow if ($LASTEXITCODE -ne 0) { throw "Foundry simulation failed" @@ -93,8 +87,13 @@ try { return } + $ledgerArguments = @("--ledger", "--sender", $expectedOwner) + if (-not [string]::IsNullOrWhiteSpace($LedgerHdPath)) { + $ledgerArguments += @("--hd-paths", $LedgerHdPath) + } & $forge script "script/foundry/DeployDOSDomainPolicyTestnet.s.sol:DeployDOSDomainPolicyTestnet" ` --rpc-url $RpcUrl ` + @ledgerArguments ` --broadcast ` --slow if ($LASTEXITCODE -ne 0) { diff --git a/contracts/script/foundry/Invoke-DeployDOSTestnet.ps1 b/contracts/script/foundry/Invoke-DeployDOSTestnet.ps1 index 1ddee1dd7..4237e4815 100644 --- a/contracts/script/foundry/Invoke-DeployDOSTestnet.ps1 +++ b/contracts/script/foundry/Invoke-DeployDOSTestnet.ps1 @@ -9,7 +9,7 @@ $ErrorActionPreference = "Stop" $expectedRpcUrl = "https://test.doschain.com" $expectedChainId = 3939 -$expectedGenesisHash = "0x1f6dd88694681d79a3a56313f59de56b1b6555c8e06a2ef377084f1e897feef4" +$expectedGenesisHash = "0x36f98b2e8b3084d57efc46622a065c2a96ed51aca86ac229bce998be6b8abd2c" $expectedDeployer = "0x99999e454138f6be73e2be82c890bc5765749999" $expectedOwner = "0x310bc061214ee89af5cfb28a6ebf96c5436fa3cd" $minimumBalanceWei = [System.Numerics.BigInteger]::Parse("1000000000000000000") From 9c04e8316409052482b2e8439393509d77585424 Mon Sep 17 00:00:00 2001 From: JOY <5027251+JOY@users.noreply.github.com> Date: Wed, 21 Oct 2026 11:45:00 +0700 Subject: [PATCH 2/5] docs: describe the policy preflight broadcaster as the script sender Co-Authored-By: Claude Opus 5.5 --- contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol b/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol index c269490bc..f36e7701a 100644 --- a/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol +++ b/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol @@ -156,7 +156,7 @@ contract DeployDOSDomainPolicyTestnet is Script { } /// @notice Validates network, broadcaster, existing contracts, and legacy registrar roles before deployment. - /// @param broadcaster The address derived from the transaction private key. + /// @param broadcaster The script sender (`--sender`), which the Ledger must control. function preflight(address broadcaster, DeploymentConfig memory config) public view { if (block.chainid != EXPECTED_CHAIN_ID) { revert UnexpectedChain(block.chainid, EXPECTED_CHAIN_ID); From 84a43658149061a7e16836dfeac26d139b8b9ace Mon Sep 17 00:00:00 2001 From: JOY <5027251+JOY@users.noreply.github.com> Date: Wed, 21 Oct 2026 15:44:14 +0700 Subject: [PATCH 3/5] feat: make the deployer the DOS Names testnet admin Owner decision (2026-10-21): DOS Names testnet operations should not need the hardware wallet. The Ledger owner 0x310Bc grants the registrar admin roles on the testnet DOS registry to the deployer 0x99999e45 once; the domain-policy deployment then runs with that deployer key (Secret Manager dos-deployer-99999e45-private-key) and makes it the policy and registrar owner. Testnet only: mainnet and the chain's validator management keep the Ledger owner. This replaces the Ledger-signing variant of the policy wrapper from the previous commits; the JASJ genesis check stays. Co-Authored-By: Claude Opus 5.5 --- .../DeployDOSDomainPolicyTestnet.s.sol | 22 ++++++++++--------- .../Invoke-DeployDOSDomainPolicyTestnet.ps1 | 21 +++++++++--------- .../DeployDOSDomainPolicyTestnet.t.sol | 2 +- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol b/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol index f36e7701a..bd83d021e 100644 --- a/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol +++ b/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol @@ -11,9 +11,10 @@ import {PermissionedRegistry} from "~src/registry/PermissionedRegistry.sol"; /// @title Deploy DOS ID Domain Policy on DOS Testnet /// @notice Replaces the public Testnet registrar role with a policy-controlled registrar. -/// @dev Signed by the canonical registry owner's Ledger (`forge script --ledger --sender `). -/// Required env: DOS_DOMAIN_VOUCHER_SIGNER, DOS_DOMAIN_REGISTRY, DOS_DOMAIN_PRICE_ORACLE, and -/// DOS_DOMAIN_LEGACY_REGISTRAR. No private key of any kind is read by this deployment script. +/// @dev Required env: PRIVATE_KEY (the testnet admin 0x99999e45; Secret Manager +/// dos-deployer-99999e45-private-key), DOS_DOMAIN_VOUCHER_SIGNER, +/// DOS_DOMAIN_REGISTRY, DOS_DOMAIN_PRICE_ORACLE, and DOS_DOMAIN_LEGACY_REGISTRAR. +/// No private voucher key is read by this deployment script. contract DeployDOSDomainPolicyTestnet is Script { //////////////////////////////////////////////////////////////////////// // Types @@ -43,7 +44,10 @@ contract DeployDOSDomainPolicyTestnet is Script { uint256 internal constant EXPECTED_CHAIN_ID = 3939; /// @dev Account that owns the deployed registry roles. - address internal constant EXPECTED_OWNER = 0x310Bc061214ee89aF5CfB28a6ebF96c5436fa3CD; + /// @dev Testnet admin. The Ledger owner 0x310Bc delegates the registrar admin roles to the + /// deployer on testnet only (owner-approved 2026-10-21), so testnet operations do not + /// need the hardware wallet. Mainnet keeps the Ledger owner. + address internal constant EXPECTED_OWNER = 0x99999e454138f6be73E2bE82c890bc5765749999; /// @dev Renewable period after a name expires. uint64 internal constant GRACE_PERIOD = 28 days; @@ -93,13 +97,11 @@ contract DeployDOSDomainPolicyTestnet is Script { /// @dev Policy subsidy funding is intentionally separate: seed it only after address verification. /// @return deployment The deployed policy and policy-controlled registrar. function run() external returns (Deployment memory deployment) { - // The canonical owner is a Ledger: run with `--ledger --sender `, so no private key - // ever reaches disk or the environment. preflight rejects any other sender. - address broadcaster = msg.sender; + uint256 privateKey = vm.envUint("PRIVATE_KEY"); DeploymentConfig memory config = deploymentConfig(); - preflight(broadcaster, config); + preflight(vm.addr(privateKey), config); - vm.startBroadcast(broadcaster); + vm.startBroadcast(privateKey); deployment.policy = deployPolicy(config); deployment.registrar = deployRegistrar(config, deployment.policy); config.registry.grantRootRoles(REGISTRAR_ROLES, address(deployment.registrar)); @@ -156,7 +158,7 @@ contract DeployDOSDomainPolicyTestnet is Script { } /// @notice Validates network, broadcaster, existing contracts, and legacy registrar roles before deployment. - /// @param broadcaster The script sender (`--sender`), which the Ledger must control. + /// @param broadcaster The address derived from the transaction private key. function preflight(address broadcaster, DeploymentConfig memory config) public view { if (block.chainid != EXPECTED_CHAIN_ID) { revert UnexpectedChain(block.chainid, EXPECTED_CHAIN_ID); diff --git a/contracts/script/foundry/Invoke-DeployDOSDomainPolicyTestnet.ps1 b/contracts/script/foundry/Invoke-DeployDOSDomainPolicyTestnet.ps1 index bf2634d95..0348efd5b 100644 --- a/contracts/script/foundry/Invoke-DeployDOSDomainPolicyTestnet.ps1 +++ b/contracts/script/foundry/Invoke-DeployDOSDomainPolicyTestnet.ps1 @@ -1,8 +1,6 @@ [CmdletBinding()] param( [string]$RpcUrl = "https://test.doschain.com", - # Ledger derivation path of the owner account; Foundry's default is used when empty. - [string]$LedgerHdPath = "", [switch]$Broadcast ) @@ -12,9 +10,10 @@ $ErrorActionPreference = "Stop" $expectedRpcUrl = "https://test.doschain.com" $expectedChainId = 3939 $expectedGenesisHash = "0x36f98b2e8b3084d57efc46622a065c2a96ed51aca86ac229bce998be6b8abd2c" -$expectedOwner = "0x310bc061214ee89af5cfb28a6ebf96c5436fa3cd" +$expectedOwner = "0x99999e454138f6be73e2be82c890bc5765749999" $minimumBalanceWei = [System.Numerics.BigInteger]::Parse("1000000000000000000") $requiredEnvironmentVariables = @( + "PRIVATE_KEY", "DOS_DOMAIN_VOUCHER_SIGNER", "DOS_DOMAIN_REGISTRY", "DOS_DOMAIN_PRICE_ORACLE", @@ -48,6 +47,15 @@ foreach ($name in $requiredEnvironmentVariables) { } } +$privateKey = $env:PRIVATE_KEY.Trim() +if ($privateKey -match "^[0-9a-fA-F]{64}$") { + $privateKey = "0x$privateKey" +} +if ($privateKey -notmatch "^0x[0-9a-fA-F]{64}$") { + throw "PRIVATE_KEY must be a 32-byte hexadecimal value" +} +$env:PRIVATE_KEY = $privateKey + $cast = Resolve-FoundryCommand -Name "cast" $forge = Resolve-FoundryCommand -Name "forge" @@ -73,10 +81,8 @@ if ($balance -lt $minimumBalanceWei) { $contractsRoot = Resolve-Path (Join-Path $PSScriptRoot "..\..") Push-Location $contractsRoot try { - # Simulation needs only the owner address; the Ledger signs nothing until -Broadcast. & $forge script "script/foundry/DeployDOSDomainPolicyTestnet.s.sol:DeployDOSDomainPolicyTestnet" ` --rpc-url $RpcUrl ` - --sender $expectedOwner ` --slow if ($LASTEXITCODE -ne 0) { throw "Foundry simulation failed" @@ -87,13 +93,8 @@ try { return } - $ledgerArguments = @("--ledger", "--sender", $expectedOwner) - if (-not [string]::IsNullOrWhiteSpace($LedgerHdPath)) { - $ledgerArguments += @("--hd-paths", $LedgerHdPath) - } & $forge script "script/foundry/DeployDOSDomainPolicyTestnet.s.sol:DeployDOSDomainPolicyTestnet" ` --rpc-url $RpcUrl ` - @ledgerArguments ` --broadcast ` --slow if ($LASTEXITCODE -ne 0) { diff --git a/contracts/test/unit/testnet/DeployDOSDomainPolicyTestnet.t.sol b/contracts/test/unit/testnet/DeployDOSDomainPolicyTestnet.t.sol index 06cf60b5d..61430799f 100644 --- a/contracts/test/unit/testnet/DeployDOSDomainPolicyTestnet.t.sol +++ b/contracts/test/unit/testnet/DeployDOSDomainPolicyTestnet.t.sol @@ -10,7 +10,7 @@ import {StandardRentPriceOracleFixture} from "~test/fixtures/StandardRentPriceOr import {V2Fixture} from "~test/fixtures/V2Fixture.sol"; contract DeployDOSDomainPolicyTestnetTest is V2Fixture, StandardRentPriceOracleFixture { - address internal constant EXPECTED_OWNER = 0x310Bc061214ee89aF5CfB28a6ebF96c5436fa3CD; + address internal constant EXPECTED_OWNER = 0x99999e454138f6be73E2bE82c890bc5765749999; uint256 internal constant REGISTRAR_ROLES = RegistryRolesLib.ROLE_REGISTRAR | RegistryRolesLib.ROLE_RENEW; uint256 internal constant REGISTRAR_ADMIN_ROLES = From d8a2c84e95b8a1eccc2dcf1c54252533625b7725 Mon Sep 17 00:00:00 2001 From: JOY <5027251+JOY@users.noreply.github.com> Date: Wed, 21 Oct 2026 17:58:54 +0700 Subject: [PATCH 4/5] docs(deployments): record the DOS testnet domain policy The score-gated domain policy is live on the canonical DOS Testnet (JASJ, genesis 0x36f98b2e...): the Ledger owner granted the registrar admin roles to the deployer (block 176), and the deployer deployed the policy and policy registrar, moved the registrar roles off the public registrar, and linked them (blocks 177-181). Minimum score 20. `contracts.dosRegistrar` keeps the retired public registrar because consumers still require that key; the active registrar is under `domainPolicy.registrar`. Co-Authored-By: Claude Opus 5.5 --- contracts/deployments/dos-testnet-3939.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/contracts/deployments/dos-testnet-3939.json b/contracts/deployments/dos-testnet-3939.json index 580bfcfe8..b22cdda64 100644 --- a/contracts/deployments/dos-testnet-3939.json +++ b/contracts/deployments/dos-testnet-3939.json @@ -31,5 +31,24 @@ "universalResolver": "0xbd0f96e3E8510a1bb806cAA9836fc76dfb1a5c47", "reverseRegistrar": "0xD445f533aeC6E8BAE185f9903943e7B2E655472e", "smokeResolver": "0xf2de697266073C4ba4D546d4305c228BBF5B1813" + }, + "domainPolicy": { + "deployedAt": "2026-10-21", + "deploymentBlock": 177, + "finalDeploymentBlock": 181, + "admin": "0x99999e454138f6be73E2bE82c890bc5765749999", + "adminGrantTransaction": "0x467cec3cdaef51dde39dfff02baf99d19f7d2dbfe6208a8be058fe387a02a6f8", + "voucherSigner": "0x257958FF376B6C340ea2BDFCCc8e7d6420Fbb5f4", + "minimumScore": 20, + "policy": "0xBF613B2c72E9595204767AD9f6c0b47834Ccd3a2", + "registrar": "0xb4A8DbcA69b2FB8d57049c28c4c7e10a77197785", + "retiredRegistrar": "0x4E5B48aC8B221aAF8cFF070671CB6Eeea2122b5c", + "transactions": [ + "0x3b85bc4b5597fa037159dc8f029fe5c6630a4d38379c30b2b60eb525952bdb43", + "0x383629c325cafc23db749b00218351be30376bda13c9957a4fbbf5d56868a29f", + "0xbcf971d1ed48aff55ab0e98326f4e21468944320d4b36c17a5a1718d5429633d", + "0xe5fb969213435a87df1d3a479ca83e0997c8ebcbcc4e4136a9afb2c810087f36", + "0x65e71e8d9bbb6cc27a40ad94a28f69baf61d07a677aa6ac6eefcbd2178b18184" + ] } } From 5f0518db7b16613db2031160783cce50a8948ed7 Mon Sep 17 00:00:00 2001 From: JOY <5027251+JOY@users.noreply.github.com> Date: Wed, 21 Oct 2026 18:00:26 +0700 Subject: [PATCH 5/5] docs: tidy the testnet admin NatSpec Co-Authored-By: Claude Opus 5.5 --- .../foundry/DeployDOSDomainPolicyTestnet.s.sol | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol b/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol index bd83d021e..6a782ce9f 100644 --- a/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol +++ b/contracts/script/foundry/DeployDOSDomainPolicyTestnet.s.sol @@ -12,8 +12,8 @@ import {PermissionedRegistry} from "~src/registry/PermissionedRegistry.sol"; /// @title Deploy DOS ID Domain Policy on DOS Testnet /// @notice Replaces the public Testnet registrar role with a policy-controlled registrar. /// @dev Required env: PRIVATE_KEY (the testnet admin 0x99999e45; Secret Manager -/// dos-deployer-99999e45-private-key), DOS_DOMAIN_VOUCHER_SIGNER, -/// DOS_DOMAIN_REGISTRY, DOS_DOMAIN_PRICE_ORACLE, and DOS_DOMAIN_LEGACY_REGISTRAR. +/// dos-deployer-99999e45-private-key), DOS_DOMAIN_VOUCHER_SIGNER, DOS_DOMAIN_REGISTRY, +/// DOS_DOMAIN_PRICE_ORACLE, and DOS_DOMAIN_LEGACY_REGISTRAR. /// No private voucher key is read by this deployment script. contract DeployDOSDomainPolicyTestnet is Script { //////////////////////////////////////////////////////////////////////// @@ -43,10 +43,10 @@ contract DeployDOSDomainPolicyTestnet is Script { /// @dev Expected DOS Testnet chain ID. uint256 internal constant EXPECTED_CHAIN_ID = 3939; - /// @dev Account that owns the deployed registry roles. - /// @dev Testnet admin. The Ledger owner 0x310Bc delegates the registrar admin roles to the - /// deployer on testnet only (owner-approved 2026-10-21), so testnet operations do not - /// need the hardware wallet. Mainnet keeps the Ledger owner. + /// @dev Testnet admin that broadcasts this deployment and owns the policy and registrar. + /// The Ledger owner 0x310Bc granted it the registrar admin roles once, on testnet only + /// (owner-approved 2026-10-21), so testnet operations do not need the hardware wallet. + /// Mainnet keeps the Ledger owner. address internal constant EXPECTED_OWNER = 0x99999e454138f6be73E2bE82c890bc5765749999; /// @dev Renewable period after a name expires.