From aee42215ef57cde57f91c6f01104d948b056cddd Mon Sep 17 00:00:00 2001
From: TuDo1403 <tudo.dev@gmail.com>
Date: Mon, 18 Dec 2023 16:25:16 +0700
Subject: [PATCH 1/3] forge install: foundry-deployment-kit

3c183cd01cff1fcdb199612d5506762c708dadfa
---
 lib/foundry-deployment-kit | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lib/foundry-deployment-kit b/lib/foundry-deployment-kit
index 6e09174f..3c183cd0 160000
--- a/lib/foundry-deployment-kit
+++ b/lib/foundry-deployment-kit
@@ -1 +1 @@
-Subproject commit 6e09174fc651780ec1225b37d614a0297bd7de30
+Subproject commit 3c183cd01cff1fcdb199612d5506762c708dadfa

From 4154dcd8d9d03f0eb44be5964fe95e25f35c1196 Mon Sep 17 00:00:00 2001
From: TuDo1403 <tudo.dev@gmail.com>
Date: Mon, 18 Dec 2023 16:54:11 +0700
Subject: [PATCH 2/3] forge install: contract-libs

f177e3b4a498ec15ca1ca58d1a514f8b54c3f95a
---
 .gitmodules       | 3 +++
 lib/contract-libs | 1 +
 2 files changed, 4 insertions(+)
 create mode 160000 lib/contract-libs

diff --git a/.gitmodules b/.gitmodules
index 979511db..c9a4b0a3 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -22,3 +22,6 @@
 [submodule "lib/foundry-deployment-kit"]
 	path = lib/foundry-deployment-kit
 	url = https://github.com/axieinfinity/foundry-deployment-kit
+[submodule "lib/contract-libs"]
+	path = lib/contract-libs
+	url = https://github.com/axieinfinity/contract-libs
diff --git a/lib/contract-libs b/lib/contract-libs
new file mode 160000
index 00000000..f177e3b4
--- /dev/null
+++ b/lib/contract-libs
@@ -0,0 +1 @@
+Subproject commit f177e3b4a498ec15ca1ca58d1a514f8b54c3f95a

From 40d7d4a21d62920213fa4d6df9326b68f6409f20 Mon Sep 17 00:00:00 2001
From: TuDo1403 <tudo.dev@gmail.com>
Date: Mon, 18 Dec 2023 17:37:14 +0700
Subject: [PATCH 3/3] feat: migrate all migrations script to new
 foundry-deployment-kit version

---
 debug.sh                                      |  40 +-----
 script/20231015-deploy/20231015_Deploy.s.sol  |  45 ++++---
 .../20231020_RNSUpgrade.s.sol                 |  10 +-
 ...0231021_UpgradeDomainPriceAndAuction.s.sol |  12 +-
 .../20231024_UpgradeAuction.s.sol             |  10 +-
 .../20231024_Config.s.sol                     |  23 ++--
 .../20231024_UpgradeDomainPrice.s.sol         |  20 +--
 .../20231024_UpgradeRNSUnified.s.sol          |  10 +-
 .../20231025_UpgradeController.s.sol          |  10 +-
 .../20231106_RevertRenewalFees.s.sol          |  14 +-
 .../20231106_SubmitReservedNames.s.sol        |  35 +++--
 .../20231106_TransferOwnership.s.sol          |  36 +++---
 .../20231106_Deploy.s.sol                     |  46 ++++---
 .../20231114_DeployNameCheckerLogic.s.sol     |  17 ++-
 .../2021115_MigrateInvalidAuctionNames.s.sol  |  14 +-
 ...123_UpgradeAuctionClaimUnbiddedNames.s.sol |  14 +-
 .../20231124_DeployRNSOperation.s.sol         |  16 ++-
 .../20231205_MainnetConfig.s.sol              |  18 ++-
 ...gradeRNSAuctionAndDeployRNSOperation.s.sol |  44 ++++---
 script/Debug.s.sol                            |  18 ---
 script/GeneralConfig.sol                      |  25 ++++
 script/Migration.s.sol                        |  96 ++++++++++++++
 script/RNSDeploy.s.sol                        | 122 ------------------
 script/contracts/NameCheckerDeploy.s.sol      |  14 +-
 script/contracts/OwnedMulticallerDeploy.s.sol |  12 +-
 script/contracts/PublicResolverDeploy.s.sol   |  18 +--
 script/contracts/RNSAuctionDeploy.s.sol       |  24 ++--
 script/contracts/RNSDomainPriceDeploy.s.sol   |  32 ++---
 script/contracts/RNSOperationDeploy.s.sol     |  18 +--
 .../contracts/RNSReverseRegistrarDeploy.s.sol |  18 +--
 script/contracts/RNSUnifiedDeploy.s.sol       |  14 +-
 .../RONRegistrarControllerDeploy.s.sol        |  42 +++---
 script/interfaces/ISharedArgument.sol         |  37 ++++++
 script/utils/Contract.sol                     |  36 ++++++
 test/RNSUnified/RNSUnified.t.sol              |   8 +-
 upload-sig.sh                                 |  12 +-
 36 files changed, 512 insertions(+), 468 deletions(-)
 delete mode 100644 script/Debug.s.sol
 create mode 100644 script/GeneralConfig.sol
 create mode 100644 script/Migration.s.sol
 delete mode 100644 script/RNSDeploy.s.sol
 create mode 100644 script/interfaces/ISharedArgument.sol
 create mode 100644 script/utils/Contract.sol

diff --git a/debug.sh b/debug.sh
index 61ff1ba0..fb3f8f8e 100755
--- a/debug.sh
+++ b/debug.sh
@@ -1,39 +1 @@
-# Source (or "dot") the .env file to load environment variables
-if [ -f .env ]; then
-    source .debug.env
-else
-    echo "Error: .debug.env file not found."
-fi
-
-verify_arg=""
-extra_argument=""
-op_command=""
-
-for arg in "$@"; do
-    case $arg in
-    --trezor)
-        op_command=""
-        extra_argument+=trezor@
-        ;;
-    --broadcast)
-        op_command="op run --env-file="./.env" --"
-        ;;
-    --log)
-        set -- "${@/#--log/}"
-        extra_argument+=log@
-        ;;
-    *) ;;
-    esac
-done
-
-# Remove the @ character from the end of extra_argument
-extra_argument="${extra_argument%%@}"
-
-echo Debug Tx...
-echo From: ${FROM}
-echo To: ${TO}
-echo Value: ${VALUE}
-echo Calldata:
-cast pretty-calldata ${CALLDATA}
-calldata=$(cast calldata 'debug(uint256,address,address,uint256,bytes)' ${BLOCK} ${FROM} ${TO} ${VALUE} ${CALLDATA})
-${op_command} forge script ${verify_arg} --legacy ${@} script/Debug.s.sol --sig 'run(bytes,string)' ${calldata} "${extra_argument}"
+source lib/foundry-deployment-kit/debug.sh
\ No newline at end of file
diff --git a/script/20231015-deploy/20231015_Deploy.s.sol b/script/20231015-deploy/20231015_Deploy.s.sol
index ec2307e9..f28cfb6c 100644
--- a/script/20231015-deploy/20231015_Deploy.s.sol
+++ b/script/20231015-deploy/20231015_Deploy.s.sol
@@ -1,12 +1,12 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { console2 } from "forge-std/console2.sol";
+import { console2 as console } from "forge-std/console2.sol";
 import { StdStyle } from "forge-std/StdStyle.sol";
 import { Math } from "@openzeppelin/contracts/utils/math/Math.sol";
 import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";
 import { LibRNSDomain } from "@rns-contracts/libraries/LibRNSDomain.sol";
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
+import { Contract } from "script/utils/Contract.sol";
 import {
   RONRegistrarController, RONRegistrarControllerDeploy
 } from "script/contracts/RONRegistrarControllerDeploy.s.sol";
@@ -16,9 +16,10 @@ import { NameChecker, NameCheckerDeploy } from "script/contracts/NameCheckerDepl
 import { RNSDomainPrice, RNSDomainPriceDeploy } from "script/contracts/RNSDomainPriceDeploy.s.sol";
 import { PublicResolver, PublicResolverDeploy } from "script/contracts/PublicResolverDeploy.s.sol";
 import { RNSReverseRegistrar, RNSReverseRegistrarDeploy } from "script/contracts/RNSReverseRegistrarDeploy.s.sol";
-import { INSDomainPrice, RNSDeploy } from "../RNSDeploy.s.sol";
+import { DefaultNetwork, Migration } from "../Migration.s.sol";
+import { INSDomainPrice } from "script/interfaces/ISharedArgument.sol";
 
-contract Migration__20231015_Deploy is RNSDeploy {
+contract Migration__20231015_Deploy is Migration {
   using Strings for *;
   using LibRNSDomain for string;
 
@@ -32,7 +33,7 @@ contract Migration__20231015_Deploy is RNSDeploy {
 
   string[] internal _blacklistedWords;
 
-  function run() public trySetUp {
+  function run() public onlyOn(DefaultNetwork.RoninTestnet.key()) {
     _rns = new RNSUnifiedDeploy().run();
     _auction = new RNSAuctionDeploy().run();
     _nameChecker = new NameCheckerDeploy().run();
@@ -48,7 +49,6 @@ contract Migration__20231015_Deploy is RNSDeploy {
     }
     uint256[] memory packedWords = _nameChecker.packBulk(_blacklistedWords);
 
-    vm.resumeGasMetering();
     vm.startBroadcast(admin);
 
     _rns.grantRole(_rns.CONTROLLER_ROLE(), address(_auction));
@@ -67,7 +67,6 @@ contract Migration__20231015_Deploy is RNSDeploy {
     _nameChecker.setForbiddenWords({ packedWords: packedWords, shouldForbid: true });
 
     vm.stopBroadcast();
-    vm.pauseGasMetering();
 
     _validateAuction();
     _validateController();
@@ -76,7 +75,7 @@ contract Migration__20231015_Deploy is RNSDeploy {
     _validateNameChecker();
     _validateRNSUnified(ronId, addrReverseId);
 
-    console2.log(StdStyle.green(unicode"✅ All checks are passed"));
+    console.log(StdStyle.green(unicode"✅ All checks are passed"));
   }
 
   function _validateController() internal logFn("_validateController") {
@@ -90,7 +89,7 @@ contract Migration__20231015_Deploy is RNSDeploy {
       _ronController.computeCommitment(domain, user.addr, duration, secret, address(_publicResolver), data, true);
 
     (, uint256 ronPrice) = _ronController.rentPrice(domain, duration);
-    console2.log("domain price:", ronPrice);
+    console.log("domain price:", ronPrice);
     vm.deal(user.addr, ronPrice);
 
     vm.startPrank(user.addr);
@@ -103,7 +102,7 @@ contract Migration__20231015_Deploy is RNSDeploy {
 
     uint256 expectedId = uint256(string.concat(domain, ".ron").namehash());
     assertEq(_rns.ownerOf(expectedId), user.addr);
-    console2.log(unicode"✅ Controller checks are passed");
+    console.log(unicode"✅ Controller checks are passed");
   }
 
   function _validateRNSUnified(uint256 ronId, uint256 addrReverseId) internal logFn("validateRNSUnified") {
@@ -113,7 +112,7 @@ contract Migration__20231015_Deploy is RNSDeploy {
     assertTrue(_rns.hasRole(_rns.RESERVATION_ROLE(), address(_auction)), "grant reservation role failed");
     assertEq(address(_ronController.getPriceOracle()), address(_domainPrice), "set price oracle failed");
 
-    console2.log(unicode"✅ RNSUnified checks are passed");
+    console.log(unicode"✅ RNSUnified checks are passed");
   }
 
   function _validateReverseRegistrar() internal logFn("validateReverseRegistrar") {
@@ -146,7 +145,7 @@ contract Migration__20231015_Deploy is RNSDeploy {
     assertTrue(_auction.reserved(id), "invalid bulkRegister");
     assertEq(_rns.getRecord(id).mut.expiry, _rns.MAX_EXPIRY(), "invalid expiry time");
 
-    console2.log(unicode"✅ Auction checks are passed");
+    console.log(unicode"✅ Auction checks are passed");
   }
 
   function _validateDomainPrice() internal logFn("validateDomainPrice") {
@@ -191,12 +190,12 @@ contract Migration__20231015_Deploy is RNSDeploy {
 
     vm.stopPrank();
 
-    console2.log("Tax Raio:", _domainPrice.getTaxRatio());
-    console2.log("Converting 1 USD (18 decimals) to RON:", _domainPrice.convertUSDToRON(1e18));
-    console2.log("Converting 1 RON to USD (18 decimals):", _domainPrice.convertRONToUSD(1 ether));
-    console2.log("Converting 1m USD (18 decimals) to RON:", _domainPrice.convertUSDToRON(1e18 * 1e6));
-    console2.log("Converting 1m RON to USD (18 decimals):", _domainPrice.convertRONToUSD(1 ether * 1e6));
-    console2.log(unicode"✅ Domain price checks are passed");
+    console.log("Tax Raio:", _domainPrice.getTaxRatio());
+    console.log("Converting 1 USD (18 decimals) to RON:", _domainPrice.convertUSDToRON(1e18));
+    console.log("Converting 1 RON to USD (18 decimals):", _domainPrice.convertRONToUSD(1 ether));
+    console.log("Converting 1m USD (18 decimals) to RON:", _domainPrice.convertUSDToRON(1e18 * 1e6));
+    console.log("Converting 1m RON to USD (18 decimals):", _domainPrice.convertRONToUSD(1 ether * 1e6));
+    console.log(unicode"✅ Domain price checks are passed");
   }
 
   function _validateNameChecker() internal logFn("validateNameChecker") {
@@ -208,9 +207,9 @@ contract Migration__20231015_Deploy is RNSDeploy {
     uint256 expectedMax;
     uint256 expectedMin = type(uint256).max;
 
-    console2.log(StdStyle.blue("Blacklisted words count"), blacklistedWords.length);
-    console2.log(StdStyle.blue("Word"), "RONRegistrarController::valid()", "NameChecker::forbidden()");
-    console2.log(StdStyle.blue("Word Range"), string.concat("min: ", min.toString(), " ", "max: ", max.toString()));
+    console.log(StdStyle.blue("Blacklisted words count"), blacklistedWords.length);
+    console.log(StdStyle.blue("Word"), "RONRegistrarController::valid()", "NameChecker::forbidden()");
+    console.log(StdStyle.blue("Word Range"), string.concat("min: ", min.toString(), " ", "max: ", max.toString()));
 
     for (uint256 i; i < blacklistedWords.length;) {
       word = blacklistedWords[i];
@@ -220,7 +219,7 @@ contract Migration__20231015_Deploy is RNSDeploy {
       forbidden = _nameChecker.forbidden(word);
 
       if (i % 50 == 0) {
-        console2.log(StdStyle.blue(word), valid ? unicode"✅" : unicode"❌", forbidden ? unicode"✅" : unicode"❌");
+        console.log(StdStyle.blue(word), valid ? unicode"✅" : unicode"❌", forbidden ? unicode"✅" : unicode"❌");
       }
 
       assertTrue(!valid);
@@ -234,6 +233,6 @@ contract Migration__20231015_Deploy is RNSDeploy {
     assertEq(min, expectedMin);
     assertEq(max, expectedMax);
 
-    console2.log(unicode"✅ NameChecker checks are passed");
+    console.log(unicode"✅ NameChecker checks are passed");
   }
 }
diff --git a/script/20231020-rns-upgrade/20231020_RNSUpgrade.s.sol b/script/20231020-rns-upgrade/20231020_RNSUpgrade.s.sol
index 88041b89..dfc2cf95 100644
--- a/script/20231020-rns-upgrade/20231020_RNSUpgrade.s.sol
+++ b/script/20231020-rns-upgrade/20231020_RNSUpgrade.s.sol
@@ -1,11 +1,11 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
-import { RNSDeploy } from "script/RNSDeploy.s.sol";
+import { Contract } from "script/utils/Contract.sol";
+import { Migration } from "script/Migration.s.sol";
 
-contract Migration__20231020_RNSUpgrade is RNSDeploy {
-  function run() public trySetUp {
-    _upgradeProxy(ContractKey.RNSUnified, EMPTY_ARGS);
+contract Migration__20231020_RNSUpgrade is Migration {
+  function run() public {
+    _upgradeProxy(Contract.RNSUnified.key());
   }
 }
diff --git a/script/20231021-upgrade-domain-price-and-auction/20231021_UpgradeDomainPriceAndAuction.s.sol b/script/20231021-upgrade-domain-price-and-auction/20231021_UpgradeDomainPriceAndAuction.s.sol
index ca410c29..76e0382c 100644
--- a/script/20231021-upgrade-domain-price-and-auction/20231021_UpgradeDomainPriceAndAuction.s.sol
+++ b/script/20231021-upgrade-domain-price-and-auction/20231021_UpgradeDomainPriceAndAuction.s.sol
@@ -1,12 +1,12 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
-import { RNSDeploy } from "script/RNSDeploy.s.sol";
+import { Contract } from "script/utils/Contract.sol";
+import { Migration } from "script/Migration.s.sol";
 
-contract Migration__20231021_UpgradeDomainPriceAndAuction is RNSDeploy {
-  function run() public trySetUp {
-    _upgradeProxy(ContractKey.RNSAuction, EMPTY_ARGS);
-    _upgradeProxy(ContractKey.RNSDomainPrice, EMPTY_ARGS);
+contract Migration__20231021_UpgradeDomainPriceAndAuction is Migration {
+  function run() public {
+    _upgradeProxy(Contract.RNSAuction.key());
+    _upgradeProxy(Contract.RNSDomainPrice.key());
   }
 }
diff --git a/script/20231024-upgrade-auction/20231024_UpgradeAuction.s.sol b/script/20231024-upgrade-auction/20231024_UpgradeAuction.s.sol
index ec80d3ea..be3c1427 100644
--- a/script/20231024-upgrade-auction/20231024_UpgradeAuction.s.sol
+++ b/script/20231024-upgrade-auction/20231024_UpgradeAuction.s.sol
@@ -1,11 +1,11 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
-import { RNSDeploy } from "script/RNSDeploy.s.sol";
+import { Contract } from "script/utils/Contract.sol";
+import { Migration } from "script/Migration.s.sol";
 
-contract Migration__20231024_UpgradeAuction is RNSDeploy {
-  function run() public trySetUp {
-    _upgradeProxy(ContractKey.RNSAuction, EMPTY_ARGS);
+contract Migration__20231024_UpgradeAuction is Migration {
+  function run() public {
+    _upgradeProxy(Contract.RNSAuction.key());
   }
 }
diff --git a/script/20231024-upgrade-domain-price/20231024_Config.s.sol b/script/20231024-upgrade-domain-price/20231024_Config.s.sol
index 51ef33f6..4f53b1f0 100644
--- a/script/20231024-upgrade-domain-price/20231024_Config.s.sol
+++ b/script/20231024-upgrade-domain-price/20231024_Config.s.sol
@@ -1,17 +1,22 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { Network, RNSDeploy } from "script/RNSDeploy.s.sol";
+import { ISharedArgument, DefaultNetwork, Migration } from "script/Migration.s.sol";
 
-abstract contract Config__20231024 is RNSDeploy {
-  function _buildMigrationConfig() internal view virtual override returns (Config memory config) {
-    config = super._buildMigrationConfig();
-    if (_network == Network.RoninTestnet) {
-      config.overrider = config.operator;
-    } else if (_network == Network.RoninMainnet) {
-      revert("Missing config");
+abstract contract Config__20231024 is Migration {
+  function _sharedArguments() internal view virtual override returns (bytes memory rawArgs) {
+    rawArgs = super._sharedArguments();
+
+    ISharedArgument.SharedParameter memory param = abi.decode(rawArgs, (ISharedArgument.SharedParameter));
+
+    if (network() == DefaultNetwork.RoninTestnet.key()) {
+      param.overrider = param.operator;
+    } else if (network() == DefaultNetwork.RoninMainnet.key()) {
+      revert("Missing param");
     } else {
-      revert("Missing config");
+      revert("Missing param");
     }
+
+    rawArgs = abi.encode(param);
   }
 }
diff --git a/script/20231024-upgrade-domain-price/20231024_UpgradeDomainPrice.s.sol b/script/20231024-upgrade-domain-price/20231024_UpgradeDomainPrice.s.sol
index 030a984e..e8076204 100644
--- a/script/20231024-upgrade-domain-price/20231024_UpgradeDomainPrice.s.sol
+++ b/script/20231024-upgrade-domain-price/20231024_UpgradeDomainPrice.s.sol
@@ -1,23 +1,23 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { console2 } from "forge-std/console2.sol";
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
+import { console2 as console } from "forge-std/console2.sol";
+import { Contract } from "script/utils/Contract.sol";
 import { RNSDomainPrice } from "@rns-contracts/RNSDomainPrice.sol";
-import { Config__20231024 } from "./20231024_Config.s.sol";
+import { ISharedArgument, Config__20231024 } from "./20231024_Config.s.sol";
 
 contract Migration__20231024_UpgradeDomainPrice is Config__20231024 {
-  function run() public trySetUp {
-    Config memory config = getConfig();
-    _upgradeProxy(ContractKey.RNSDomainPrice, EMPTY_ARGS);
+  function run() public {
+    ISharedArgument.SharedParameter memory param = config.sharedArguments();
+    _upgradeProxy(Contract.RNSDomainPrice.key());
 
-    console2.log("operator", config.operator);
-    console2.log("overrider", config.overrider);
+    console.log("operator", param.operator);
+    console.log("overrider", param.overrider);
 
-    RNSDomainPrice domainPrice = RNSDomainPrice(_config.getAddressFromCurrentNetwork(ContractKey.RNSDomainPrice));
+    RNSDomainPrice domainPrice = RNSDomainPrice(config.getAddressFromCurrentNetwork(Contract.RNSDomainPrice.key()));
     address admin = domainPrice.getRoleMember(0x00, 0);
     bytes32 overriderRole = domainPrice.OVERRIDER_ROLE();
     vm.broadcast(admin);
-    domainPrice.grantRole(overriderRole, config.overrider);
+    domainPrice.grantRole(overriderRole, param.overrider);
   }
 }
diff --git a/script/20231024-upgrade-rns-unified/20231024_UpgradeRNSUnified.s.sol b/script/20231024-upgrade-rns-unified/20231024_UpgradeRNSUnified.s.sol
index 2f467a8a..581a11b1 100644
--- a/script/20231024-upgrade-rns-unified/20231024_UpgradeRNSUnified.s.sol
+++ b/script/20231024-upgrade-rns-unified/20231024_UpgradeRNSUnified.s.sol
@@ -1,11 +1,11 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
-import { RNSDeploy } from "script/RNSDeploy.s.sol";
+import { Contract } from "script/utils/Contract.sol";
+import { Migration } from "script/Migration.s.sol";
 
-contract Migration__20231024_UpgradeRNSUnified is RNSDeploy {
-  function run() public trySetUp {
-    _upgradeProxy(ContractKey.RNSUnified, EMPTY_ARGS);
+contract Migration__20231024_UpgradeRNSUnified is Migration {
+  function run() public {
+    _upgradeProxy(Contract.RNSUnified.key());
   }
 }
diff --git a/script/20231025-upgrade-controller/20231025_UpgradeController.s.sol b/script/20231025-upgrade-controller/20231025_UpgradeController.s.sol
index e04f5ef5..5bb90197 100644
--- a/script/20231025-upgrade-controller/20231025_UpgradeController.s.sol
+++ b/script/20231025-upgrade-controller/20231025_UpgradeController.s.sol
@@ -1,11 +1,11 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
-import { RNSDeploy } from "script/RNSDeploy.s.sol";
+import { Contract } from "script/utils/Contract.sol";
+import { Migration } from "script/Migration.s.sol";
 
-contract Migration__20231025_UpgradeController is RNSDeploy {
-  function run() public trySetUp {
-    _upgradeProxy(ContractKey.RONRegistrarController, EMPTY_ARGS);
+contract Migration__20231025_UpgradeController is Migration {
+  function run() public {
+    _upgradeProxy(Contract.RONRegistrarController.key());
   }
 }
diff --git a/script/20231106-config-prelaunch/20231106_RevertRenewalFees.s.sol b/script/20231106-config-prelaunch/20231106_RevertRenewalFees.s.sol
index e0fa16e1..902e672d 100644
--- a/script/20231106-config-prelaunch/20231106_RevertRenewalFees.s.sol
+++ b/script/20231106-config-prelaunch/20231106_RevertRenewalFees.s.sol
@@ -1,18 +1,16 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
-import { RNSDeploy } from "script/RNSDeploy.s.sol";
+import { Contract } from "script/utils/Contract.sol";
+import { ISharedArgument, Migration } from "script/Migration.s.sol";
 import { RNSDomainPrice } from "@rns-contracts/RNSDomainPrice.sol";
 
-contract Migration__20231106_RevertRenewalFees is RNSDeploy {
+contract Migration__20231106_RevertRenewalFees is Migration {
   function run() public {
-    RNSDomainPrice domainPrice = RNSDomainPrice(_config.getAddressFromCurrentNetwork(ContractKey.RNSDomainPrice));
+    RNSDomainPrice domainPrice = RNSDomainPrice(config.getAddressFromCurrentNetwork(Contract.RNSDomainPrice.key()));
 
-    Config memory config = getConfig();
+    ISharedArgument.SharedParameter memory param = config.sharedArguments();
     vm.broadcast(domainPrice.getRoleMember(domainPrice.DEFAULT_ADMIN_ROLE(), 0));
-    vm.resumeGasMetering();
-    domainPrice.setRenewalFeeByLengths(config.renewalFees);
-    vm.pauseGasMetering();
+    domainPrice.setRenewalFeeByLengths(param.renewalFees);
   }
 }
diff --git a/script/20231106-config-prelaunch/20231106_SubmitReservedNames.s.sol b/script/20231106-config-prelaunch/20231106_SubmitReservedNames.s.sol
index 818e76f1..90155f51 100644
--- a/script/20231106-config-prelaunch/20231106_SubmitReservedNames.s.sol
+++ b/script/20231106-config-prelaunch/20231106_SubmitReservedNames.s.sol
@@ -1,34 +1,33 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { console2 } from "forge-std/console2.sol";
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
+import { console2 as console } from "forge-std/console2.sol";
+import { Contract } from "script/utils/Contract.sol";
 import { JSONParserLib } from "solady/utils/JSONParserLib.sol";
-import { RNSDeploy } from "script/RNSDeploy.s.sol";
+import { Migration } from "script/Migration.s.sol";
 import { LibRNSDomain, RNSUnified } from "@rns-contracts/RNSUnified.sol";
 import { OwnedMulticaller, OwnedMulticallerDeploy } from "script/contracts/OwnedMulticallerDeploy.s.sol";
 
-contract Migration__20231106_SubmitReservedNames is RNSDeploy {
+contract Migration__20231106_SubmitReservedNames is Migration {
   using JSONParserLib for *;
 
-  function run() public trySetUp {
+  function run() public {
     // default duration is 1 year
     uint64 duration = uint64(365 days);
 
-    RNSUnified rns = RNSUnified(_config.getAddressFromCurrentNetwork(ContractKey.RNSUnified));
-    address resolver = _config.getAddressFromCurrentNetwork(ContractKey.PublicResolver);
-    OwnedMulticaller multicall = OwnedMulticaller(_config.getAddressFromCurrentNetwork(ContractKey.OwnedMulticaller));
+    RNSUnified rns = RNSUnified(config.getAddressFromCurrentNetwork(Contract.RNSUnified.key()));
+    address resolver = config.getAddressFromCurrentNetwork(Contract.PublicResolver.key());
+    OwnedMulticaller multicall = OwnedMulticaller(config.getAddressFromCurrentNetwork(Contract.OwnedMulticaller.key()));
 
-    console2.log(_config.getAddressFromCurrentNetwork(ContractKey.OwnedMulticaller));
+    console.log(config.getAddressFromCurrentNetwork(Contract.OwnedMulticaller.key()));
 
     // vm.broadcast(rns.ownerOf(LibRNSDomain.RON_ID));
-    // vm.resumeGasMetering();
+    //
     // rns.setApprovalForAll(address(multicall), true);
-    // vm.pauseGasMetering();
-
+    //
     address[] memory tos;
     string[] memory labels;
-    (tos, labels) = _parseData("./script/20231106-config-prelaunch/data/finalReservedNames.json");
+    (tos, labels) = _parseData("./script/20231106-param-prelaunch/data/finalReservedNames.json");
     mintBatch(multicall, duration, rns, resolver, tos, labels);
   }
 
@@ -40,17 +39,15 @@ contract Migration__20231106_SubmitReservedNames is RNSDeploy {
     address[] memory tos,
     string[] memory labels
   ) public {
-    vm.broadcast(_config.getSender());
-    vm.resumeGasMetering();
+    vm.broadcast(config.getSender());
     multicall.multiMint(rns, LibRNSDomain.RON_ID, resolver, duration, tos, labels);
-    vm.pauseGasMetering();
   }
 
   function _parseData(string memory path) internal view returns (address[] memory tos, string[] memory labels) {
     string memory raw = vm.readFile(path);
     JSONParserLib.Item memory reservedNames = raw.parse().at('"reservedNames"');
     uint256 length = reservedNames.size();
-    console2.log("length", length);
+    console.log("length", length);
 
     tos = new address[](length);
     labels = new string[](length);
@@ -59,8 +56,8 @@ contract Migration__20231106_SubmitReservedNames is RNSDeploy {
       tos[i] = vm.parseAddress(reservedNames.at(i).at('"address"').value().decodeString());
       labels[i] = reservedNames.at(i).at('"label"').value().decodeString();
 
-      console2.log("tos:", i, tos[i]);
-      console2.log("labels:", i, labels[i]);
+      console.log("tos:", i, tos[i]);
+      console.log("labels:", i, labels[i]);
     }
   }
 }
diff --git a/script/20231106-config-prelaunch/20231106_TransferOwnership.s.sol b/script/20231106-config-prelaunch/20231106_TransferOwnership.s.sol
index d6341d03..9e8c5d19 100644
--- a/script/20231106-config-prelaunch/20231106_TransferOwnership.s.sol
+++ b/script/20231106-config-prelaunch/20231106_TransferOwnership.s.sol
@@ -1,33 +1,33 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
-import { console2 } from "forge-std/console2.sol";
-import { RNSDeploy } from "script/RNSDeploy.s.sol";
+import { Contract } from "script/utils/Contract.sol";
+import { console2 as console } from "forge-std/console2.sol";
+import { Migration } from "script/Migration.s.sol";
 import { RNSUnified } from "@rns-contracts/RNSUnified.sol";
 import { OwnedMulticallerDeploy } from "script/contracts/OwnedMulticallerDeploy.s.sol";
 import { OwnedMulticaller } from "@rns-contracts/utils/OwnedMulticaller.sol";
 import { LibRNSDomain } from "@rns-contracts/libraries/LibRNSDomain.sol";
 
-contract Migration__20231106_TransferOwnership is RNSDeploy {
+contract Migration__20231106_TransferOwnership is Migration {
   function _injectDependencies() internal virtual override {
-    _setDependencyDeployScript(ContractKey.OwnedMulticaller, new OwnedMulticallerDeploy());
+    _setDependencyDeployScript(Contract.OwnedMulticaller.key(), new OwnedMulticallerDeploy());
   }
 
-  function run() public trySetUp {
+  function run() public {
     // fill in original owner
-    address originalOwner = _config.getSender();
+    address originalOwner = config.getSender();
 
-    RNSUnified rns = RNSUnified(_config.getAddressFromCurrentNetwork(ContractKey.RNSUnified));
-    OwnedMulticaller multicall = OwnedMulticaller(loadContractOrDeploy(ContractKey.OwnedMulticaller));
-    address auction = _config.getAddressFromCurrentNetwork(ContractKey.RNSAuction);
-    address ronController = _config.getAddressFromCurrentNetwork(ContractKey.RONRegistrarController);
-    address reverseRegistrar = _config.getAddressFromCurrentNetwork(ContractKey.RNSReverseRegistrar);
+    RNSUnified rns = RNSUnified(config.getAddressFromCurrentNetwork(Contract.RNSUnified.key()));
+    OwnedMulticaller multicall = OwnedMulticaller(loadContractOrDeploy(Contract.OwnedMulticaller.key()));
+    address auction = config.getAddressFromCurrentNetwork(Contract.RNSAuction.key());
+    address ronController = config.getAddressFromCurrentNetwork(Contract.RONRegistrarController.key());
+    address reverseRegistrar = config.getAddressFromCurrentNetwork(Contract.RNSReverseRegistrar.key());
 
     uint256 reverseId = uint256(LibRNSDomain.namehash("reverse"));
-    console2.log("reverseId", reverseId);
+    console.log("reverseId", reverseId);
     uint256 addrReverseId = uint256(LibRNSDomain.namehash("addr.reverse"));
-    console2.log("reverse.addr id", addrReverseId);
+    console.log("reverse.addr id", addrReverseId);
 
     address currentOwner = rns.ownerOf(LibRNSDomain.RON_ID);
     assertEq(currentOwner, rns.ownerOf(reverseId), "currentOwner != rns.ownerOf(reverseId)");
@@ -36,9 +36,7 @@ contract Migration__20231106_TransferOwnership is RNSDeploy {
     if (!rns.isApprovedForAll(currentOwner, address(multicall))) {
       // approve for owned-multicall contract
       vm.broadcast(currentOwner);
-      vm.resumeGasMetering();
       rns.setApprovalForAll(address(multicall), true);
-      vm.pauseGasMetering();
     }
 
     uint256[] memory values = new uint256[](3);
@@ -53,17 +51,15 @@ contract Migration__20231106_TransferOwnership is RNSDeploy {
     callDatas[2] = abi.encodeCall(rns.transferFrom, (currentOwner, originalOwner, LibRNSDomain.RON_ID));
 
     vm.broadcast(multicall.owner());
-    vm.resumeGasMetering();
     multicall.multicall(targets, callDatas, values);
-    vm.pauseGasMetering();
 
     vm.startBroadcast(originalOwner);
-    vm.resumeGasMetering();
+
     rns.setApprovalForAll(address(auction), true);
     rns.setApprovalForAll(address(ronController), true);
     rns.approve(address(reverseRegistrar), addrReverseId);
+
     vm.stopBroadcast();
-    vm.pauseGasMetering();
 
     assertTrue(
       rns.isApprovedForAll(originalOwner, address(auction)), "!rns.isApprovedForAll(originalOwner, address(auction))"
diff --git a/script/20231106-deploy-mainnet/20231106_Deploy.s.sol b/script/20231106-deploy-mainnet/20231106_Deploy.s.sol
index 8267aff5..7c7d2210 100644
--- a/script/20231106-deploy-mainnet/20231106_Deploy.s.sol
+++ b/script/20231106-deploy-mainnet/20231106_Deploy.s.sol
@@ -1,12 +1,12 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { console2 } from "forge-std/console2.sol";
+import { console2 as console } from "forge-std/console2.sol";
 import { StdStyle } from "forge-std/StdStyle.sol";
 import { Math } from "@openzeppelin/contracts/utils/math/Math.sol";
 import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";
 import { LibRNSDomain } from "@rns-contracts/libraries/LibRNSDomain.sol";
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
+import { Contract } from "script/utils/Contract.sol";
 import {
   RONRegistrarController, RONRegistrarControllerDeploy
 } from "script/contracts/RONRegistrarControllerDeploy.s.sol";
@@ -16,9 +16,10 @@ import { NameChecker, NameCheckerDeploy } from "script/contracts/NameCheckerDepl
 import { RNSDomainPrice, RNSDomainPriceDeploy } from "script/contracts/RNSDomainPriceDeploy.s.sol";
 import { PublicResolver, PublicResolverDeploy } from "script/contracts/PublicResolverDeploy.s.sol";
 import { RNSReverseRegistrar, RNSReverseRegistrarDeploy } from "script/contracts/RNSReverseRegistrarDeploy.s.sol";
-import { INSDomainPrice, RNSDeploy } from "../RNSDeploy.s.sol";
+import { ISharedArgument, DefaultNetwork, Migration } from "../Migration.s.sol";
+import { INSDomainPrice } from "script/interfaces/ISharedArgument.sol";
 
-contract Migration__20231106_Deploy is RNSDeploy {
+contract Migration__20231106_Deploy is Migration {
   using Strings for *;
   using LibRNSDomain for string;
 
@@ -32,7 +33,7 @@ contract Migration__20231106_Deploy is RNSDeploy {
 
   string[] internal _blacklistedWords;
 
-  function run() public trySetUp {
+  function run() public onlyOn(DefaultNetwork.RoninMainnet.key()) {
     _rns = new RNSUnifiedDeploy().run();
     _auction = new RNSAuctionDeploy().run();
     _nameChecker = new NameCheckerDeploy().run();
@@ -43,8 +44,6 @@ contract Migration__20231106_Deploy is RNSDeploy {
 
     address admin = _rns.getRoleMember(_rns.DEFAULT_ADMIN_ROLE(), 0);
 
-    Config memory config = getConfig();
-    vm.resumeGasMetering();
     vm.startBroadcast(admin);
 
     _rns.grantRole(_rns.CONTROLLER_ROLE(), address(_auction));
@@ -62,13 +61,12 @@ contract Migration__20231106_Deploy is RNSDeploy {
     _reverseRegistrar.setDefaultResolver(_publicResolver);
 
     vm.stopBroadcast();
-    vm.pauseGasMetering();
 
     _validateController();
     _validateReverseRegistrar();
     _validateRNSUnified(ronId, addrReverseId);
 
-    console2.log(StdStyle.green(unicode"✅ All checks are passed"));
+    console.log(StdStyle.green(unicode"✅ All checks are passed"));
   }
 
   function _validateController() internal logFn("_validateController") {
@@ -82,7 +80,7 @@ contract Migration__20231106_Deploy is RNSDeploy {
       _ronController.computeCommitment(domain, user.addr, duration, secret, address(_publicResolver), data, true);
 
     (, uint256 ronPrice) = _ronController.rentPrice(domain, duration);
-    console2.log("domain price:", ronPrice);
+    console.log("domain price:", ronPrice);
     vm.deal(user.addr, ronPrice);
 
     vm.startPrank(user.addr);
@@ -95,7 +93,7 @@ contract Migration__20231106_Deploy is RNSDeploy {
 
     uint256 expectedId = uint256(string.concat(domain, ".ron").namehash());
     assertEq(_rns.ownerOf(expectedId), user.addr);
-    console2.log(unicode"✅ Controller checks are passed");
+    console.log(unicode"✅ Controller checks are passed");
   }
 
   function _validateRNSUnified(uint256 ronId, uint256 addrReverseId) internal logFn("validateRNSUnified") {
@@ -105,7 +103,7 @@ contract Migration__20231106_Deploy is RNSDeploy {
     assertTrue(_rns.hasRole(_rns.RESERVATION_ROLE(), address(_auction)), "grant reservation role failed");
     assertEq(address(_ronController.getPriceOracle()), address(_domainPrice), "set price oracle failed");
 
-    console2.log(unicode"✅ RNSUnified checks are passed");
+    console.log(unicode"✅ RNSUnified checks are passed");
   }
 
   function _validateReverseRegistrar() internal logFn("validateReverseRegistrar") {
@@ -138,7 +136,7 @@ contract Migration__20231106_Deploy is RNSDeploy {
     assertTrue(_auction.reserved(id), "invalid bulkRegister");
     assertEq(_rns.getRecord(id).mut.expiry, _rns.MAX_EXPIRY(), "invalid expiry time");
 
-    console2.log(unicode"✅ Auction checks are passed");
+    console.log(unicode"✅ Auction checks are passed");
   }
 
   function _validateDomainPrice() internal logFn("validateDomainPrice") {
@@ -174,12 +172,12 @@ contract Migration__20231106_Deploy is RNSDeploy {
 
     vm.stopPrank();
 
-    console2.log("Tax Raio:", _domainPrice.getTaxRatio());
-    console2.log("Converting 1 USD (18 decimals) to RON:", _domainPrice.convertUSDToRON(1e18));
-    console2.log("Converting 1 RON to USD (18 decimals):", _domainPrice.convertRONToUSD(1 ether));
-    console2.log("Converting 1m USD (18 decimals) to RON:", _domainPrice.convertUSDToRON(1e18 * 1e6));
-    console2.log("Converting 1m RON to USD (18 decimals):", _domainPrice.convertRONToUSD(1 ether * 1e6));
-    console2.log(unicode"✅ Domain price checks are passed");
+    console.log("Tax Raio:", _domainPrice.getTaxRatio());
+    console.log("Converting 1 USD (18 decimals) to RON:", _domainPrice.convertUSDToRON(1e18));
+    console.log("Converting 1 RON to USD (18 decimals):", _domainPrice.convertRONToUSD(1 ether));
+    console.log("Converting 1m USD (18 decimals) to RON:", _domainPrice.convertUSDToRON(1e18 * 1e6));
+    console.log("Converting 1m RON to USD (18 decimals):", _domainPrice.convertRONToUSD(1 ether * 1e6));
+    console.log(unicode"✅ Domain price checks are passed");
   }
 
   function _validateNameChecker() internal logFn("validateNameChecker") {
@@ -191,9 +189,9 @@ contract Migration__20231106_Deploy is RNSDeploy {
     uint256 expectedMax;
     uint256 expectedMin = type(uint256).max;
 
-    console2.log(StdStyle.blue("Blacklisted words count"), blacklistedWords.length);
-    console2.log(StdStyle.blue("Word"), "RONRegistrarController::valid()", "NameChecker::forbidden()");
-    console2.log(StdStyle.blue("Word Range"), string.concat("min: ", min.toString(), " ", "max: ", max.toString()));
+    console.log(StdStyle.blue("Blacklisted words count"), blacklistedWords.length);
+    console.log(StdStyle.blue("Word"), "RONRegistrarController::valid()", "NameChecker::forbidden()");
+    console.log(StdStyle.blue("Word Range"), string.concat("min: ", min.toString(), " ", "max: ", max.toString()));
 
     for (uint256 i; i < blacklistedWords.length;) {
       word = blacklistedWords[i];
@@ -203,7 +201,7 @@ contract Migration__20231106_Deploy is RNSDeploy {
       forbidden = _nameChecker.forbidden(word);
 
       if (i % 50 == 0) {
-        console2.log(StdStyle.blue(word), valid ? unicode"✅" : unicode"❌", forbidden ? unicode"✅" : unicode"❌");
+        console.log(StdStyle.blue(word), valid ? unicode"✅" : unicode"❌", forbidden ? unicode"✅" : unicode"❌");
       }
 
       assertTrue(!valid);
@@ -217,6 +215,6 @@ contract Migration__20231106_Deploy is RNSDeploy {
     assertEq(min, expectedMin);
     assertEq(max, expectedMax);
 
-    console2.log(unicode"✅ NameChecker checks are passed");
+    console.log(unicode"✅ NameChecker checks are passed");
   }
 }
diff --git a/script/20231114-deploy-name-checker-logic/20231114_DeployNameCheckerLogic.s.sol b/script/20231114-deploy-name-checker-logic/20231114_DeployNameCheckerLogic.s.sol
index 49371793..8a386ee5 100644
--- a/script/20231114-deploy-name-checker-logic/20231114_DeployNameCheckerLogic.s.sol
+++ b/script/20231114-deploy-name-checker-logic/20231114_DeployNameCheckerLogic.s.sol
@@ -6,20 +6,23 @@ import {
   ITransparentUpgradeableProxy,
   TransparentUpgradeableProxy
 } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
+import { LibProxy } from "foundry-deployment-kit/libraries/LibProxy.sol";
 import { NameChecker } from "@rns-contracts/NameChecker.sol";
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
-import { RNSDeploy } from "script/RNSDeploy.s.sol";
+import { Contract } from "script/utils/Contract.sol";
+import { Migration } from "script/Migration.s.sol";
 
-contract Migration__20231114_DeployNameCheckerLogic is RNSDeploy {
-  function run() public trySetUp {
-    address newLogic = _deployLogic(ContractKey.NameChecker);
+contract Migration__20231114_DeployNameCheckerLogic is Migration {
+  using LibProxy for address payable;
 
-    NameChecker currentNameChecker = NameChecker(_config.getAddressFromCurrentNetwork(ContractKey.NameChecker));
+  function run() public {
+    address newLogic = _deployLogic(Contract.NameChecker.key());
+
+    NameChecker currentNameChecker = NameChecker(config.getAddressFromCurrentNetwork(Contract.NameChecker.key()));
     assertTrue(currentNameChecker.forbidden("hell"), "hell");
     assertTrue(currentNameChecker.forbidden("hellscream"), "hellscream");
     assertTrue(currentNameChecker.forbidden("hell123"), "hell123");
 
-    address proxyAdmin = _getProxyAdmin(address(currentNameChecker));
+    address proxyAdmin = LibProxy.getProxyAdmin(payable(address(currentNameChecker)));
     vm.prank(ProxyAdmin(proxyAdmin).owner());
     ProxyAdmin(proxyAdmin).upgrade(ITransparentUpgradeableProxy(address(currentNameChecker)), newLogic);
 
diff --git a/script/20231115-migrate-invalid-auction-names/2021115_MigrateInvalidAuctionNames.s.sol b/script/20231115-migrate-invalid-auction-names/2021115_MigrateInvalidAuctionNames.s.sol
index 61b52543..a3c39ed7 100644
--- a/script/20231115-migrate-invalid-auction-names/2021115_MigrateInvalidAuctionNames.s.sol
+++ b/script/20231115-migrate-invalid-auction-names/2021115_MigrateInvalidAuctionNames.s.sol
@@ -1,14 +1,14 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { console2 } from "forge-std/console2.sol";
+import { console2 as console } from "forge-std/console2.sol";
 import { INSAuction, EventRange, RNSAuction } from "@rns-contracts/RNSAuction.sol";
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
-import { RNSDeploy } from "script/RNSDeploy.s.sol";
+import { Contract } from "script/utils/Contract.sol";
+import { Migration } from "script/Migration.s.sol";
 
-contract Migration__20231115_MigrateInvalidAuctionNames is RNSDeploy {
-  function run() public trySetUp {
-    RNSAuction auction = RNSAuction(_config.getAddressFromCurrentNetwork(ContractKey.RNSAuction));
+contract Migration__20231115_MigrateInvalidAuctionNames is Migration {
+  function run() public {
+    RNSAuction auction = RNSAuction(config.getAddressFromCurrentNetwork(Contract.RNSAuction.key()));
 
     uint256[] memory ids = new uint256[](2);
     // namehash`pc.ron`
@@ -22,7 +22,7 @@ contract Migration__20231115_MigrateInvalidAuctionNames is RNSDeploy {
     vm.broadcast(auction.getRoleMember(0x0, 0));
     bytes32 auctionId = auction.createAuctionEvent(EventRange(2332515600, 2332515600 + 1 days));
 
-    console2.logBytes32(auctionId);
+    console.logBytes32(auctionId);
 
     // relist ids to new auction
     vm.broadcast(auction.getRoleMember(auction.OPERATOR_ROLE(), 0));
diff --git a/script/20231123-upgrade-auction-claim-unbidded-names/20231123_UpgradeAuctionClaimUnbiddedNames.s.sol b/script/20231123-upgrade-auction-claim-unbidded-names/20231123_UpgradeAuctionClaimUnbiddedNames.s.sol
index b972e2a9..b554747a 100644
--- a/script/20231123-upgrade-auction-claim-unbidded-names/20231123_UpgradeAuctionClaimUnbiddedNames.s.sol
+++ b/script/20231123-upgrade-auction-claim-unbidded-names/20231123_UpgradeAuctionClaimUnbiddedNames.s.sol
@@ -2,20 +2,20 @@
 pragma solidity ^0.8.19;
 
 import { console2 as console } from "forge-std/console2.sol";
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
-import { RNSDeploy } from "script/RNSDeploy.s.sol";
+import { Contract } from "script/utils/Contract.sol";
+import { Migration } from "script/Migration.s.sol";
 import { RNSUnified } from "@rns-contracts/RNSUnified.sol";
 import { INSAuction, RNSAuction } from "@rns-contracts/RNSAuction.sol";
 
-contract Migration__20231123_UpgradeAuctionClaimeUnbiddedNames is RNSDeploy {
-  function run() public trySetUp {
-    _upgradeProxy(ContractKey.RNSAuction, EMPTY_ARGS);
+contract Migration__20231123_UpgradeAuctionClaimeUnbiddedNames is Migration {
+  function run() public {
+    _upgradeProxy(Contract.RNSAuction.key());
     _validataBulkClaimUnbiddedNames({ size: 20 });
   }
 
   function _validataBulkClaimUnbiddedNames(uint256 size) internal logFn("_validataBulkClaimUnbiddedNames") {
-    RNSAuction auction = RNSAuction(_config.getAddressFromCurrentNetwork(ContractKey.RNSAuction));
-    RNSUnified rns = RNSUnified(_config.getAddressFromCurrentNetwork(ContractKey.RNSUnified));
+    RNSAuction auction = RNSAuction(config.getAddressFromCurrentNetwork(Contract.RNSAuction.key()));
+    RNSUnified rns = RNSUnified(config.getAddressFromCurrentNetwork(Contract.RNSUnified.key()));
 
     uint256 auctionBalance = size;
     console.log("auctionBalance", auctionBalance);
diff --git a/script/20231124-deploy-rns-operation/20231124_DeployRNSOperation.s.sol b/script/20231124-deploy-rns-operation/20231124_DeployRNSOperation.s.sol
index 0083078b..30fb13b9 100644
--- a/script/20231124-deploy-rns-operation/20231124_DeployRNSOperation.s.sol
+++ b/script/20231124-deploy-rns-operation/20231124_DeployRNSOperation.s.sol
@@ -3,23 +3,23 @@ pragma solidity ^0.8.19;
 
 import { Math } from "@openzeppelin/contracts/utils/math/Math.sol";
 import { console2 as console } from "forge-std/console2.sol";
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
-import { RNSDeploy } from "script/RNSDeploy.s.sol";
+import { Contract } from "script/utils/Contract.sol";
+import { Migration } from "script/Migration.s.sol";
 import { RNSUnified } from "@rns-contracts/RNSUnified.sol";
 import { RNSDomainPrice } from "@rns-contracts/RNSDomainPrice.sol";
 import { INSAuction, RNSAuction } from "@rns-contracts/RNSAuction.sol";
 import { LibRNSDomain } from "@rns-contracts/libraries/LibRNSDomain.sol";
 import { RNSOperation, RNSOperationDeploy } from "script/contracts/RNSOperationDeploy.s.sol";
 
-contract Migration__20231124_DeployRNSOperation is RNSDeploy {
+contract Migration__20231124_DeployRNSOperation is Migration {
   using LibRNSDomain for string;
 
-  function run() public trySetUp {
+  function run() public {
     RNSOperation rnsOperation = new RNSOperationDeploy().run();
 
-    RNSDomainPrice domainPrice = RNSDomainPrice(_config.getAddressFromCurrentNetwork(ContractKey.RNSDomainPrice));
-    RNSUnified rns = RNSUnified(_config.getAddressFromCurrentNetwork(ContractKey.RNSUnified));
-    RNSAuction auction = RNSAuction(_config.getAddressFromCurrentNetwork(ContractKey.RNSAuction));
+    RNSDomainPrice domainPrice = RNSDomainPrice(config.getAddressFromCurrentNetwork(Contract.RNSDomainPrice.key()));
+    RNSUnified rns = RNSUnified(config.getAddressFromCurrentNetwork(Contract.RNSUnified.key()));
+    RNSAuction auction = RNSAuction(config.getAddressFromCurrentNetwork(Contract.RNSAuction.key()));
 
     address admin = rns.ownerOf(LibRNSDomain.RON_ID);
 
@@ -27,10 +27,12 @@ contract Migration__20231124_DeployRNSOperation is RNSDeploy {
     rnsOperation.transferOwnership(admin);
 
     vm.startBroadcast(admin);
+
     rns.setApprovalForAll(address(rnsOperation), true);
     auction.grantRole(auction.OPERATOR_ROLE(), address(rnsOperation));
     rns.grantRole(rns.PROTECTED_SETTLER_ROLE(), address(rnsOperation));
     domainPrice.grantRole(domainPrice.OVERRIDER_ROLE(), address(rnsOperation));
+
     vm.stopBroadcast();
 
     _validateBulkMint(rns, rnsOperation);
diff --git a/script/20231205-deploy-upgrade-auction-and-deploy-rns-operation/20231205_MainnetConfig.s.sol b/script/20231205-deploy-upgrade-auction-and-deploy-rns-operation/20231205_MainnetConfig.s.sol
index 2b012834..b1845c79 100644
--- a/script/20231205-deploy-upgrade-auction-and-deploy-rns-operation/20231205_MainnetConfig.s.sol
+++ b/script/20231205-deploy-upgrade-auction-and-deploy-rns-operation/20231205_MainnetConfig.s.sol
@@ -1,15 +1,19 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { Network, RNSDeploy } from "script/RNSDeploy.s.sol";
+import { ISharedArgument, DefaultNetwork, Migration } from "script/Migration.s.sol";
 
-abstract contract Config__Mainnet20231205 is RNSDeploy {
-  function _buildMigrationConfig() internal view virtual override returns (Config memory config) {
-    config = super._buildMigrationConfig();
-    if (_network == Network.RoninMainnet) {
-      config.rnsOperationOwner = 0x1FF1edE0242317b8C4229fC59E64DD93952019ef;
+abstract contract Config__Mainnet20231205 is Migration {
+  function _sharedArguments() internal view virtual override returns (bytes memory rawArgs) {
+    rawArgs = super._sharedArguments();
+    ISharedArgument.SharedParameter memory param = abi.decode(rawArgs, (ISharedArgument.SharedParameter));
+
+    if (network() == DefaultNetwork.RoninMainnet.key()) {
+      param.rnsOperationOwner = 0x1FF1edE0242317b8C4229fC59E64DD93952019ef;
     } else {
-      revert("Missing config");
+      revert("Missing param");
     }
+
+    rawArgs = abi.encode(param);
   }
 }
diff --git a/script/20231205-deploy-upgrade-auction-and-deploy-rns-operation/20231205_UpgradeRNSAuctionAndDeployRNSOperation.s.sol b/script/20231205-deploy-upgrade-auction-and-deploy-rns-operation/20231205_UpgradeRNSAuctionAndDeployRNSOperation.s.sol
index d6851b42..75bd59b0 100644
--- a/script/20231205-deploy-upgrade-auction-and-deploy-rns-operation/20231205_UpgradeRNSAuctionAndDeployRNSOperation.s.sol
+++ b/script/20231205-deploy-upgrade-auction-and-deploy-rns-operation/20231205_UpgradeRNSAuctionAndDeployRNSOperation.s.sol
@@ -4,41 +4,53 @@ pragma solidity ^0.8.19;
 import { console2 as console } from "forge-std/console2.sol";
 import { ITransparentUpgradeableProxy } from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
 import { ProxyAdmin } from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
-import { ContractKey } from "foundry-deployment-kit/configs/ContractConfig.sol";
-import { Network, Config__Mainnet20231205 } from "script/20231205-deploy-upgrade-auction-and-deploy-rns-operation/20231205_MainnetConfig.s.sol";
-import { INSAuction, RNSAuction, RNSUnified, Migration__20231123_UpgradeAuctionClaimeUnbiddedNames as UpgradeAuctionScript } from "script/20231123-upgrade-auction-claim-unbidded-names/20231123_UpgradeAuctionClaimUnbiddedNames.s.sol";
-import { RNSOperation, Migration__20231124_DeployRNSOperation as DeployRNSOperationScript  } from "script/20231124-deploy-rns-operation/20231124_DeployRNSOperation.s.sol";
+import { Contract } from "script/utils/Contract.sol";
+import { DefaultContract } from "foundry-deployment-kit/utils/DefaultContract.sol";
+import { ISharedArgument } from "script/interfaces/ISharedArgument.sol";
+import {
+  DefaultNetwork,
+  Config__Mainnet20231205
+} from "script/20231205-deploy-upgrade-auction-and-deploy-rns-operation/20231205_MainnetConfig.s.sol";
+import {
+  INSAuction,
+  RNSAuction,
+  RNSUnified,
+  Migration__20231123_UpgradeAuctionClaimeUnbiddedNames as UpgradeAuctionScript
+} from "script/20231123-upgrade-auction-claim-unbidded-names/20231123_UpgradeAuctionClaimUnbiddedNames.s.sol";
+import {
+  RNSOperation,
+  Migration__20231124_DeployRNSOperation as DeployRNSOperationScript
+} from "script/20231124-deploy-rns-operation/20231124_DeployRNSOperation.s.sol";
 
 contract Migration__20231205_UpgradeRNSAuctionAndDeployRNSOperation is Config__Mainnet20231205 {
-  function run() public trySetUp onMainnet {
-    Config memory config = getConfig();
+  function run() public onlyOn(DefaultNetwork.RoninMainnet.key()) {
+    ISharedArgument.SharedParameter memory param = config.sharedArguments();
 
-    ProxyAdmin proxyAdmin = ProxyAdmin(_config.getAddressFromCurrentNetwork(ContractKey.ProxyAdmin));
-    address rnsAuctionProxy = _config.getAddressFromCurrentNetwork(ContractKey.RNSAuction);
-    address logic = _deployLogic(ContractKey.RNSAuction);
+    ProxyAdmin proxyAdmin = ProxyAdmin(config.getAddressFromCurrentNetwork(DefaultContract.ProxyAdmin.key()));
+    address rnsAuctionProxy = config.getAddressFromCurrentNetwork(Contract.RNSAuction.key());
+    address logic = _deployLogic(Contract.RNSAuction.key());
 
     vm.prank(proxyAdmin.owner());
-    vm.resumeGasMetering();
+
     ProxyAdmin(proxyAdmin).upgrade(ITransparentUpgradeableProxy(rnsAuctionProxy), logic);
-    vm.pauseGasMetering();
 
     console.log("RNSAuction Logic is deployed at:", logic);
     _validataBulkClaimUnbiddedNames({ size: 20 });
 
     // deploy rns operation contract
     new DeployRNSOperationScript().run();
-    RNSOperation rnsOperation = RNSOperation(_config.getAddressFromCurrentNetwork(ContractKey.RNSOperation));
+    RNSOperation rnsOperation = RNSOperation(config.getAddressFromCurrentNetwork(Contract.RNSOperation.key()));
 
     // transfer owner ship for RNSOperation
     vm.broadcast(rnsOperation.owner());
-    rnsOperation.transferOwnership(config.rnsOperationOwner);
+    rnsOperation.transferOwnership(param.rnsOperationOwner);
 
-    assertTrue(rnsOperation.owner() == config.rnsOperationOwner);
+    assertTrue(rnsOperation.owner() == param.rnsOperationOwner);
   }
 
   function _validataBulkClaimUnbiddedNames(uint256 size) internal logFn("_validataBulkClaimUnbiddedNames") {
-    RNSAuction auction = RNSAuction(_config.getAddressFromCurrentNetwork(ContractKey.RNSAuction));
-    RNSUnified rns = RNSUnified(_config.getAddressFromCurrentNetwork(ContractKey.RNSUnified));
+    RNSAuction auction = RNSAuction(config.getAddressFromCurrentNetwork(Contract.RNSAuction.key()));
+    RNSUnified rns = RNSUnified(config.getAddressFromCurrentNetwork(Contract.RNSUnified.key()));
 
     uint256 auctionBalance = size;
     console.log("auctionBalance", auctionBalance);
diff --git a/script/Debug.s.sol b/script/Debug.s.sol
deleted file mode 100644
index 811e6082..00000000
--- a/script/Debug.s.sol
+++ /dev/null
@@ -1,18 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
-
-import { RNSDeploy } from "./RNSDeploy.s.sol";
-import { ErrorHandler } from "@rns-contracts/libraries/ErrorHandler.sol";
-
-contract Debug is RNSDeploy {
-  using ErrorHandler for *;
-
-  function debug(uint256 forkBlock, address from, address to, uint256 value, bytes calldata callData) external {
-    if (forkBlock != 0) {
-      vm.rollFork(forkBlock);
-    }
-    vm.prank(from);
-    (bool success, bytes memory returnOrRevertData) = to.call{ value: value }(callData);
-    success.handleRevert(returnOrRevertData);
-  }
-}
diff --git a/script/GeneralConfig.sol b/script/GeneralConfig.sol
new file mode 100644
index 00000000..7a1209b0
--- /dev/null
+++ b/script/GeneralConfig.sol
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import { BaseGeneralConfig } from "foundry-deployment-kit/BaseGeneralConfig.sol";
+import { Contract } from "./utils/Contract.sol";
+
+contract GeneralConfig is BaseGeneralConfig {
+  constructor() BaseGeneralConfig("", "deployments/") { }
+
+  function _setUpContracts() internal virtual override {
+    _mapContractName(Contract.RNSUnified);
+    _mapContractName(Contract.RNSAuction);
+    _mapContractName(Contract.NameChecker);
+    _mapContractName(Contract.RNSOperation);
+    _mapContractName(Contract.RNSDomainPrice);
+    _mapContractName(Contract.PublicResolver);
+    _mapContractName(Contract.OwnedMulticaller);
+    _mapContractName(Contract.RNSReverseRegistrar);
+    _mapContractName(Contract.RONRegistrarController);
+  }
+
+  function _mapContractName(Contract contractEnum) internal {
+    _contractNameMap[contractEnum.key()] = contractEnum.name();
+  }
+}
diff --git a/script/Migration.s.sol b/script/Migration.s.sol
new file mode 100644
index 00000000..726f084b
--- /dev/null
+++ b/script/Migration.s.sol
@@ -0,0 +1,96 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import { BaseMigration } from "foundry-deployment-kit/BaseMigration.s.sol";
+import { DefaultNetwork } from "foundry-deployment-kit/utils/DefaultNetwork.sol";
+import { GeneralConfig } from "./GeneralConfig.sol";
+import "./interfaces/ISharedArgument.sol";
+
+abstract contract Migration is BaseMigration {
+  ISharedArgument public constant config = ISharedArgument(address(CONFIG));
+
+  function _configByteCode() internal virtual override returns (bytes memory) {
+    return abi.encodePacked(type(GeneralConfig).creationCode);
+  }
+
+  function _sharedArguments() internal view virtual override returns (bytes memory rawArgs) {
+    ISharedArgument.SharedParameter memory param;
+
+    param.auctionOperators = new address[](1);
+    param.controllerOperators = new address[](1);
+    param.domainPriceOperators = new address[](1);
+
+    if (network() == DefaultNetwork.RoninTestnet.key()) {
+      param.minWord = 2;
+      param.maxWord = 3;
+      param.minCommitmentAge = 10 seconds;
+      param.maxCommitmentAge = 1 days;
+      param.gracePeriod = 90 days;
+
+      {
+        param.renewalFees = new INSDomainPrice.RenewalFee[](3);
+        param.renewalFees[0] = INSDomainPrice.RenewalFee(5, uint256(5e18) / 365 days);
+        param.renewalFees[1] = INSDomainPrice.RenewalFee(4, uint256(100e18) / 365 days);
+        param.renewalFees[2] = INSDomainPrice.RenewalFee(3, uint256(300e18) / 365 days);
+      }
+      param.bidGapRatio = 1000; // 10%
+      param.taxRatio = 1500; // 15%
+      param.maxAcceptableAge = 24 hours;
+      param.domainPriceScaleRule = PeriodScaler({ ratio: 500, period: 30 days * 3 });
+
+      param.baseTokenURI = "https://metadata-rns.skymavis.one/saigon/";
+      param.admin = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
+      param.pauser = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
+
+      param.operator = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
+      param.auctionOperators[0] = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
+      param.controllerOperators[0] = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
+      param.domainPriceOperators[0] = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
+
+      param.controller = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
+      param.pyth = IPyth(0xA2aa501b19aff244D90cc15a4Cf739D2725B5729);
+      param.protectedSettler = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
+      param.treasury = payable(0x968D0Cd7343f711216817E617d3f92a23dC91c07);
+      param.pythIdForRONUSD = 0x4cb9d530b042004b042e165ee0904b12fe534d40dac5fe1c71dfcdb522e6e3c2;
+    } else if (network() == DefaultNetwork.RoninMainnet.key()) {
+      address temporaryDeployer = 0x0F68eDBE14C8f68481771016d7E2871d6a35DE11;
+
+      param.minWord = 2;
+      param.maxWord = 3;
+
+      param.minCommitmentAge = 10 seconds;
+      param.maxCommitmentAge = 1 days;
+      param.gracePeriod = 90 days;
+
+      {
+        param.renewalFees = new INSDomainPrice.RenewalFee[](4);
+        param.renewalFees[0] = INSDomainPrice.RenewalFee(5, uint256(5e18) / 365 days);
+        param.renewalFees[1] = INSDomainPrice.RenewalFee(4, uint256(100e18) / 365 days);
+        param.renewalFees[2] = INSDomainPrice.RenewalFee(3, uint256(300e18) / 365 days);
+        param.renewalFees[3] = INSDomainPrice.RenewalFee(2, uint256(300e18) / 365 days);
+      }
+      param.bidGapRatio = 1000; // 10%
+      param.taxRatio = 1500; // 15%
+      param.maxAcceptableAge = 24 hours;
+      param.domainPriceScaleRule = PeriodScaler({ ratio: 500, period: 30 days * 3 });
+
+      param.baseTokenURI = "https://metadata-rns.roninchain.com/ronin/";
+      param.admin = temporaryDeployer;
+      param.pauser = temporaryDeployer;
+      param.protectedSettler = temporaryDeployer;
+
+      param.auctionOperators[0] = temporaryDeployer;
+      param.controllerOperators[0] = temporaryDeployer;
+      param.domainPriceOperators[0] = 0x0A9E57c71af2b1194C5f573F4bB1e45696c49213; // Harry
+
+      param.controller = 0xEd4A9F48a62Fb6FdcfB45Bb00C9f61D1A436E58C;
+      param.treasury = payable(0xEd4A9F48a62Fb6FdcfB45Bb00C9f61D1A436E58C); // Andy
+      param.pyth = IPyth(0x2880aB155794e7179c9eE2e38200202908C17B43); // Harry
+      param.pythIdForRONUSD = 0x97cfe19da9153ef7d647b011c5e355142280ddb16004378573e6494e499879f3; // Harry
+    } else {
+      revert("Missing param");
+    }
+
+    rawArgs = abi.encode(param);
+  }
+}
diff --git a/script/RNSDeploy.s.sol b/script/RNSDeploy.s.sol
deleted file mode 100644
index dcdbd06a..00000000
--- a/script/RNSDeploy.s.sol
+++ /dev/null
@@ -1,122 +0,0 @@
-// SPDX-License-Identifier: MIT
-pragma solidity ^0.8.19;
-
-import { IPyth, INSDomainPrice, PeriodScaler } from "@rns-contracts/RNSDomainPrice.sol";
-import { BaseDeploy, Network } from "foundry-deployment-kit/BaseDeploy.s.sol";
-
-abstract contract RNSDeploy is BaseDeploy {
-  struct Config {
-    IPyth pyth;
-    address admin;
-    address pauser;
-    address overrider;
-    address controller;
-    uint8 minWord;
-    uint8 maxWord;
-    address rnsOperationOwner;
-    address operator;
-    address[] controllerOperators;
-    address[] auctionOperators;
-    address[] domainPriceOperators;
-    uint256 taxRatio;
-    uint64 gracePeriod;
-    string baseTokenURI;
-    uint256 bidGapRatio;
-    address protectedSettler;
-    address payable treasury;
-    uint256 maxAcceptableAge;
-    bytes32 pythIdForRONUSD;
-    uint256 maxCommitmentAge;
-    uint256 minCommitmentAge;
-    uint256 minRegistrationDuration;
-    PeriodScaler domainPriceScaleRule;
-    INSDomainPrice.RenewalFee[] renewalFees;
-  }
-
-  function _buildMigrationConfig() internal view virtual returns (Config memory config) {
-    config.auctionOperators = new address[](1);
-    config.controllerOperators = new address[](1);
-    config.domainPriceOperators = new address[](1);
-
-    if (_network == Network.RoninTestnet) {
-      config.minWord = 2;
-      config.maxWord = 3;
-      config.minCommitmentAge = 10 seconds;
-      config.maxCommitmentAge = 1 days;
-      config.gracePeriod = 90 days;
-
-      {
-        config.renewalFees = new INSDomainPrice.RenewalFee[](3);
-        config.renewalFees[0] = INSDomainPrice.RenewalFee(5, uint256(5e18) / 365 days);
-        config.renewalFees[1] = INSDomainPrice.RenewalFee(4, uint256(100e18) / 365 days);
-        config.renewalFees[2] = INSDomainPrice.RenewalFee(3, uint256(300e18) / 365 days);
-      }
-      config.bidGapRatio = 1000; // 10%
-      config.taxRatio = 1500; // 15%
-      config.maxAcceptableAge = 24 hours;
-      config.domainPriceScaleRule = PeriodScaler({ ratio: 500, period: 30 days * 3 });
-
-      config.baseTokenURI = "https://metadata-rns.skymavis.one/saigon/";
-      config.admin = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
-      config.pauser = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
-
-      config.operator = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
-      config.auctionOperators[0] = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
-      config.controllerOperators[0] = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
-      config.domainPriceOperators[0] = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
-
-      config.controller = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
-      config.pyth = IPyth(0xA2aa501b19aff244D90cc15a4Cf739D2725B5729);
-      config.protectedSettler = 0x968D0Cd7343f711216817E617d3f92a23dC91c07;
-      config.treasury = payable(0x968D0Cd7343f711216817E617d3f92a23dC91c07);
-      config.pythIdForRONUSD = 0x4cb9d530b042004b042e165ee0904b12fe534d40dac5fe1c71dfcdb522e6e3c2;
-    } else if (_network == Network.RoninMainnet) {
-      address temporaryDeployer = 0x0F68eDBE14C8f68481771016d7E2871d6a35DE11;
-
-      config.minWord = 2;
-      config.maxWord = 3;
-
-      config.minCommitmentAge = 10 seconds;
-      config.maxCommitmentAge = 1 days;
-      config.gracePeriod = 90 days;
-
-      {
-        config.renewalFees = new INSDomainPrice.RenewalFee[](4);
-        config.renewalFees[0] = INSDomainPrice.RenewalFee(5, uint256(5e18) / 365 days);
-        config.renewalFees[1] = INSDomainPrice.RenewalFee(4, uint256(100e18) / 365 days);
-        config.renewalFees[2] = INSDomainPrice.RenewalFee(3, uint256(300e18) / 365 days);
-        config.renewalFees[3] = INSDomainPrice.RenewalFee(2, uint256(300e18) / 365 days);
-      }
-      config.bidGapRatio = 1000; // 10%
-      config.taxRatio = 1500; // 15%
-      config.maxAcceptableAge = 24 hours;
-      config.domainPriceScaleRule = PeriodScaler({ ratio: 500, period: 30 days * 3 });
-
-      config.baseTokenURI = "https://metadata-rns.roninchain.com/ronin/";
-      config.admin = temporaryDeployer;
-      config.pauser = temporaryDeployer;
-      config.protectedSettler = temporaryDeployer;
-
-      config.auctionOperators[0] = temporaryDeployer;
-      config.controllerOperators[0] = temporaryDeployer;
-      config.domainPriceOperators[0] = 0x0A9E57c71af2b1194C5f573F4bB1e45696c49213; // Harry
-
-      config.controller = 0xEd4A9F48a62Fb6FdcfB45Bb00C9f61D1A436E58C;
-      config.treasury = payable(0xEd4A9F48a62Fb6FdcfB45Bb00C9f61D1A436E58C); // Andy
-      config.pyth = IPyth(0x2880aB155794e7179c9eE2e38200202908C17B43); // Harry
-      config.pythIdForRONUSD = 0x97cfe19da9153ef7d647b011c5e355142280ddb16004378573e6494e499879f3; // Harry
-    } else {
-      revert("Missing config");
-    }
-  }
-
-  function _buildMigrationRawConfig() internal view override returns (bytes memory rawConfig) {
-    Config memory config = _buildMigrationConfig();
-    rawConfig = abi.encode(config);
-  }
-
-  function getConfig() public view returns (Config memory config) {
-    bytes memory rawConfig = _config.getMigrationRawConfig();
-    config = abi.decode(rawConfig, (Config));
-  }
-}
diff --git a/script/contracts/NameCheckerDeploy.s.sol b/script/contracts/NameCheckerDeploy.s.sol
index f1db6117..f434168b 100644
--- a/script/contracts/NameCheckerDeploy.s.sol
+++ b/script/contracts/NameCheckerDeploy.s.sol
@@ -1,17 +1,17 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { BaseDeploy, ContractKey } from "foundry-deployment-kit/BaseDeploy.s.sol";
+import { ISharedArgument, Migration } from "script/Migration.s.sol";
+import { Contract } from "script/utils/Contract.sol";
 import { NameChecker } from "@rns-contracts/NameChecker.sol";
-import { RNSDeploy } from "../RNSDeploy.s.sol";
 
-contract NameCheckerDeploy is RNSDeploy {
+contract NameCheckerDeploy is Migration {
   function _defaultArguments() internal virtual override returns (bytes memory args) {
-    Config memory config = getConfig();
-    args = abi.encodeCall(NameChecker.initialize, (config.admin, config.minWord, config.maxWord));
+    ISharedArgument.SharedParameter memory param = config.sharedArguments();
+    args = abi.encodeCall(NameChecker.initialize, (param.admin, param.minWord, param.maxWord));
   }
 
-  function run() public virtual trySetUp returns (NameChecker) {
-    return NameChecker(_deployProxy(ContractKey.NameChecker));
+  function run() public virtual returns (NameChecker) {
+    return NameChecker(_deployProxy(Contract.NameChecker.key()));
   }
 }
diff --git a/script/contracts/OwnedMulticallerDeploy.s.sol b/script/contracts/OwnedMulticallerDeploy.s.sol
index ef1d35bb..a1ec4543 100644
--- a/script/contracts/OwnedMulticallerDeploy.s.sol
+++ b/script/contracts/OwnedMulticallerDeploy.s.sol
@@ -1,16 +1,16 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { BaseDeploy, ContractKey } from "foundry-deployment-kit/BaseDeploy.s.sol";
+import { ISharedArgument, Migration } from "script/Migration.s.sol";
+import { Contract } from "script/utils/Contract.sol";
 import { OwnedMulticaller } from "@rns-contracts/utils/OwnedMulticaller.sol";
-import { RNSDeploy } from "../RNSDeploy.s.sol";
 
-contract OwnedMulticallerDeploy is RNSDeploy {
+contract OwnedMulticallerDeploy is Migration {
   function _defaultArguments() internal virtual override returns (bytes memory args) {
-    args = abi.encode(_config.getSender());
+    args = abi.encode(config.getSender());
   }
 
-  function run() public virtual trySetUp returns (OwnedMulticaller) {
-    return OwnedMulticaller(_deployImmutable(ContractKey.OwnedMulticaller));
+  function run() public virtual returns (OwnedMulticaller) {
+    return OwnedMulticaller(_deployImmutable(Contract.OwnedMulticaller.key()));
   }
 }
diff --git a/script/contracts/PublicResolverDeploy.s.sol b/script/contracts/PublicResolverDeploy.s.sol
index 72190be0..b848c19c 100644
--- a/script/contracts/PublicResolverDeploy.s.sol
+++ b/script/contracts/PublicResolverDeploy.s.sol
@@ -1,29 +1,29 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { BaseDeploy, ContractKey } from "foundry-deployment-kit/BaseDeploy.s.sol";
+import { Migration } from "script/Migration.s.sol";
+import { Contract } from "script/utils/Contract.sol";
 import { PublicResolver } from "@rns-contracts/resolvers/PublicResolver.sol";
 import { RNSUnified, RNSUnifiedDeploy } from "./RNSUnifiedDeploy.s.sol";
 import { RNSReverseRegistrar, RNSReverseRegistrarDeploy } from "./RNSReverseRegistrarDeploy.s.sol";
-import { RNSDeploy } from "../RNSDeploy.s.sol";
 
-contract PublicResolverDeploy is RNSDeploy {
+contract PublicResolverDeploy is Migration {
   function _injectDependencies() internal virtual override {
-    _setDependencyDeployScript(ContractKey.RNSUnified, new RNSUnifiedDeploy());
-    _setDependencyDeployScript(ContractKey.RNSReverseRegistrar, new RNSReverseRegistrarDeploy());
+    _setDependencyDeployScript(Contract.RNSUnified.key(), new RNSUnifiedDeploy());
+    _setDependencyDeployScript(Contract.RNSReverseRegistrar.key(), new RNSReverseRegistrarDeploy());
   }
 
   function _defaultArguments() internal virtual override returns (bytes memory args) {
     args = abi.encodeCall(
       PublicResolver.initialize,
       (
-        RNSUnified(loadContractOrDeploy(ContractKey.RNSUnified)),
-        RNSReverseRegistrar(loadContractOrDeploy(ContractKey.RNSReverseRegistrar))
+        RNSUnified(loadContractOrDeploy(Contract.RNSUnified.key())),
+        RNSReverseRegistrar(loadContractOrDeploy(Contract.RNSReverseRegistrar.key()))
       )
     );
   }
 
-  function run() public virtual trySetUp returns (PublicResolver) {
-    return PublicResolver(_deployProxy(ContractKey.PublicResolver));
+  function run() public virtual returns (PublicResolver) {
+    return PublicResolver(_deployProxy(Contract.PublicResolver.key()));
   }
 }
diff --git a/script/contracts/RNSAuctionDeploy.s.sol b/script/contracts/RNSAuctionDeploy.s.sol
index d52d9243..a89c58a2 100644
--- a/script/contracts/RNSAuctionDeploy.s.sol
+++ b/script/contracts/RNSAuctionDeploy.s.sol
@@ -3,29 +3,29 @@ pragma solidity ^0.8.19;
 
 import { RNSAuction } from "@rns-contracts/RNSAuction.sol";
 import { RNSUnified, RNSUnifiedDeploy } from "./RNSUnifiedDeploy.s.sol";
-import { BaseDeploy, ContractKey } from "foundry-deployment-kit/BaseDeploy.s.sol";
-import { RNSDeploy } from "../RNSDeploy.s.sol";
+import { ISharedArgument, Migration } from "script/Migration.s.sol";
+import { Contract } from "script/utils/Contract.sol";
 
-contract RNSAuctionDeploy is RNSDeploy {
+contract RNSAuctionDeploy is Migration {
   function _injectDependencies() internal virtual override {
-    _setDependencyDeployScript(ContractKey.RNSUnified, new RNSUnifiedDeploy());
+    _setDependencyDeployScript(Contract.RNSUnified.key(), new RNSUnifiedDeploy());
   }
 
   function _defaultArguments() internal virtual override returns (bytes memory args) {
-    Config memory config = getConfig();
+    ISharedArgument.SharedParameter memory param = config.sharedArguments();
     args = abi.encodeCall(
       RNSAuction.initialize,
       (
-        config.admin,
-        config.auctionOperators,
-        RNSUnified(loadContractOrDeploy(ContractKey.RNSUnified)),
-        config.treasury,
-        config.bidGapRatio
+        param.admin,
+        param.auctionOperators,
+        RNSUnified(loadContractOrDeploy(Contract.RNSUnified.key())),
+        param.treasury,
+        param.bidGapRatio
       )
     );
   }
 
-  function run() public virtual trySetUp returns (RNSAuction) {
-    return RNSAuction(_deployProxy(ContractKey.RNSAuction));
+  function run() public virtual returns (RNSAuction) {
+    return RNSAuction(_deployProxy(Contract.RNSAuction.key()));
   }
 }
diff --git a/script/contracts/RNSDomainPriceDeploy.s.sol b/script/contracts/RNSDomainPriceDeploy.s.sol
index 78569ea2..4d30ebbb 100644
--- a/script/contracts/RNSDomainPriceDeploy.s.sol
+++ b/script/contracts/RNSDomainPriceDeploy.s.sol
@@ -3,33 +3,33 @@ pragma solidity ^0.8.19;
 
 import { RNSDomainPrice } from "@rns-contracts/RNSDomainPrice.sol";
 import { RNSAuction, RNSAuctionDeploy } from "./RNSAuctionDeploy.s.sol";
-import { BaseDeploy, ContractKey } from "foundry-deployment-kit/BaseDeploy.s.sol";
-import { RNSDeploy } from "../RNSDeploy.s.sol";
+import { ISharedArgument, Migration } from "script/Migration.s.sol";
+import { Contract } from "script/utils/Contract.sol";
 
-contract RNSDomainPriceDeploy is RNSDeploy {
+contract RNSDomainPriceDeploy is Migration {
   function _injectDependencies() internal virtual override {
-    _setDependencyDeployScript(ContractKey.RNSAuction, new RNSAuctionDeploy());
+    _setDependencyDeployScript(Contract.RNSAuction.key(), new RNSAuctionDeploy());
   }
 
   function _defaultArguments() internal virtual override returns (bytes memory args) {
-    Config memory config = getConfig();
+    ISharedArgument.SharedParameter memory param = config.sharedArguments();
     args = abi.encodeCall(
       RNSDomainPrice.initialize,
       (
-        config.admin,
-        config.domainPriceOperators,
-        config.renewalFees,
-        config.taxRatio,
-        config.domainPriceScaleRule,
-        config.pyth,
-        RNSAuction(loadContractOrDeploy(ContractKey.RNSAuction)),
-        config.maxAcceptableAge,
-        config.pythIdForRONUSD
+        param.admin,
+        param.domainPriceOperators,
+        param.renewalFees,
+        param.taxRatio,
+        param.domainPriceScaleRule,
+        param.pyth,
+        RNSAuction(loadContractOrDeploy(Contract.RNSAuction.key())),
+        param.maxAcceptableAge,
+        param.pythIdForRONUSD
       )
     );
   }
 
-  function run() public virtual trySetUp returns (RNSDomainPrice) {
-    return RNSDomainPrice(_deployProxy(ContractKey.RNSDomainPrice));
+  function run() public virtual returns (RNSDomainPrice) {
+    return RNSDomainPrice(_deployProxy(Contract.RNSDomainPrice.key()));
   }
 }
diff --git a/script/contracts/RNSOperationDeploy.s.sol b/script/contracts/RNSOperationDeploy.s.sol
index 86a1a814..57d02a50 100644
--- a/script/contracts/RNSOperationDeploy.s.sol
+++ b/script/contracts/RNSOperationDeploy.s.sol
@@ -1,21 +1,21 @@
 // SPDX-License-Identifier: MIT
 pragma solidity ^0.8.19;
 
-import { ContractKey } from "foundry-deployment-kit/BaseDeploy.s.sol";
+import { Migration } from "script/Migration.s.sol";
+import { Contract } from "script/utils/Contract.sol";
 import { RNSOperation } from "@rns-contracts/utils/RNSOperation.sol";
-import { RNSDeploy } from "../RNSDeploy.s.sol";
 
-contract RNSOperationDeploy is RNSDeploy {
+contract RNSOperationDeploy is Migration {
   function _defaultArguments() internal virtual override returns (bytes memory args) {
     args = abi.encode(
-      _config.getAddressFromCurrentNetwork(ContractKey.RNSUnified),
-      _config.getAddressFromCurrentNetwork(ContractKey.PublicResolver),
-      _config.getAddressFromCurrentNetwork(ContractKey.RNSAuction),
-      _config.getAddressFromCurrentNetwork(ContractKey.RNSDomainPrice)
+      config.getAddressFromCurrentNetwork(Contract.RNSUnified.key()),
+      config.getAddressFromCurrentNetwork(Contract.PublicResolver.key()),
+      config.getAddressFromCurrentNetwork(Contract.RNSAuction.key()),
+      config.getAddressFromCurrentNetwork(Contract.RNSDomainPrice.key())
     );
   }
 
-  function run() public virtual trySetUp returns (RNSOperation) {
-    return RNSOperation(_deployImmutable(ContractKey.RNSOperation));
+  function run() public virtual returns (RNSOperation) {
+    return RNSOperation(_deployImmutable(Contract.RNSOperation.key()));
   }
 }
diff --git a/script/contracts/RNSReverseRegistrarDeploy.s.sol b/script/contracts/RNSReverseRegistrarDeploy.s.sol
index 370a1c1e..f46c1b49 100644
--- a/script/contracts/RNSReverseRegistrarDeploy.s.sol
+++ b/script/contracts/RNSReverseRegistrarDeploy.s.sol
@@ -3,24 +3,24 @@ pragma solidity ^0.8.19;
 
 import { RNSReverseRegistrar } from "@rns-contracts/RNSReverseRegistrar.sol";
 import { RNSUnified, RNSUnifiedDeploy } from "./RNSUnifiedDeploy.s.sol";
-import { BaseDeploy, ContractKey } from "foundry-deployment-kit/BaseDeploy.s.sol";
-import { RNSDeploy } from "../RNSDeploy.s.sol";
+import { ISharedArgument, Migration } from "script/Migration.s.sol";
+import { Contract } from "script/utils/Contract.sol";
 
-contract RNSReverseRegistrarDeploy is RNSDeploy {
+contract RNSReverseRegistrarDeploy is Migration {
   function _injectDependencies() internal virtual override {
-    _setDependencyDeployScript(ContractKey.RNSUnified, new RNSUnifiedDeploy());
+    _setDependencyDeployScript(Contract.RNSUnified.key(), new RNSUnifiedDeploy());
   }
 
   function _defaultArguments() internal virtual override returns (bytes memory args) {
-    Config memory config = getConfig();
+    ISharedArgument.SharedParameter memory param = config.sharedArguments();
     address[] memory operators = new address[](1);
-    operators[0] = config.operator;
+    operators[0] = param.operator;
     args = abi.encodeCall(
-      RNSReverseRegistrar.initialize, (config.admin, RNSUnified(loadContractOrDeploy(ContractKey.RNSUnified)))
+      RNSReverseRegistrar.initialize, (param.admin, RNSUnified(loadContractOrDeploy(Contract.RNSUnified.key())))
     );
   }
 
-  function run() public virtual trySetUp returns (RNSReverseRegistrar) {
-    return RNSReverseRegistrar(_deployProxy(ContractKey.RNSReverseRegistrar));
+  function run() public virtual returns (RNSReverseRegistrar) {
+    return RNSReverseRegistrar(_deployProxy(Contract.RNSReverseRegistrar.key()));
   }
 }
diff --git a/script/contracts/RNSUnifiedDeploy.s.sol b/script/contracts/RNSUnifiedDeploy.s.sol
index 406fa9e9..b438a845 100644
--- a/script/contracts/RNSUnifiedDeploy.s.sol
+++ b/script/contracts/RNSUnifiedDeploy.s.sol
@@ -2,19 +2,19 @@
 pragma solidity ^0.8.19;
 
 import { RNSUnified } from "@rns-contracts/RNSUnified.sol";
-import { BaseDeploy, ContractKey } from "foundry-deployment-kit/BaseDeploy.s.sol";
-import { RNSDeploy } from "../RNSDeploy.s.sol";
+import { ISharedArgument, Migration } from "script/Migration.s.sol";
+import { Contract } from "script/utils/Contract.sol";
 
-contract RNSUnifiedDeploy is RNSDeploy {
+contract RNSUnifiedDeploy is Migration {
   function _defaultArguments() internal view override returns (bytes memory args) {
-    Config memory config = getConfig();
+    ISharedArgument.SharedParameter memory param = config.sharedArguments();
     args = abi.encodeCall(
       RNSUnified.initialize,
-      (config.admin, config.pauser, config.controller, config.protectedSettler, config.gracePeriod, config.baseTokenURI)
+      (param.admin, param.pauser, param.controller, param.protectedSettler, param.gracePeriod, param.baseTokenURI)
     );
   }
 
-  function run() public virtual trySetUp returns (RNSUnified) {
-    return RNSUnified(_deployProxy(ContractKey.RNSUnified));
+  function run() public virtual returns (RNSUnified) {
+    return RNSUnified(_deployProxy(Contract.RNSUnified.key()));
   }
 }
diff --git a/script/contracts/RONRegistrarControllerDeploy.s.sol b/script/contracts/RONRegistrarControllerDeploy.s.sol
index 830d41d8..5656f4de 100644
--- a/script/contracts/RONRegistrarControllerDeploy.s.sol
+++ b/script/contracts/RONRegistrarControllerDeploy.s.sol
@@ -6,39 +6,39 @@ import { RNSUnified, RNSUnifiedDeploy } from "./RNSUnifiedDeploy.s.sol";
 import { NameChecker, NameCheckerDeploy } from "./NameCheckerDeploy.s.sol";
 import { RNSDomainPrice, RNSDomainPriceDeploy } from "./RNSDomainPriceDeploy.s.sol";
 import { RNSReverseRegistrar, RNSReverseRegistrarDeploy } from "./RNSReverseRegistrarDeploy.s.sol";
-import { BaseDeploy, ContractKey } from "foundry-deployment-kit/BaseDeploy.s.sol";
-import { RNSDeploy } from "../RNSDeploy.s.sol";
+import { ISharedArgument, Migration } from "script/Migration.s.sol";
+import { Contract } from "script/utils/Contract.sol";
 
-contract RONRegistrarControllerDeploy is RNSDeploy {
+contract RONRegistrarControllerDeploy is Migration {
   function _injectDependencies() internal virtual override {
-    _setDependencyDeployScript(ContractKey.RNSUnified, new RNSUnifiedDeploy());
-    _setDependencyDeployScript(ContractKey.NameChecker, new NameCheckerDeploy());
-    _setDependencyDeployScript(ContractKey.RNSDomainPrice, new RNSDomainPriceDeploy());
-    _setDependencyDeployScript(ContractKey.RNSReverseRegistrar, new RNSReverseRegistrarDeploy());
+    _setDependencyDeployScript(Contract.RNSUnified.key(), new RNSUnifiedDeploy());
+    _setDependencyDeployScript(Contract.NameChecker.key(), new NameCheckerDeploy());
+    _setDependencyDeployScript(Contract.RNSDomainPrice.key(), new RNSDomainPriceDeploy());
+    _setDependencyDeployScript(Contract.RNSReverseRegistrar.key(), new RNSReverseRegistrarDeploy());
   }
 
   function _defaultArguments() internal virtual override returns (bytes memory args) {
-    Config memory config = getConfig();
+    ISharedArgument.SharedParameter memory param = config.sharedArguments();
     address[] memory operators = new address[](1);
-    operators[0] = config.operator;
+    operators[0] = param.operator;
     args = abi.encodeCall(
       RONRegistrarController.initialize,
       (
-        config.admin,
-        config.pauser,
-        config.treasury,
-        config.maxAcceptableAge,
-        config.minCommitmentAge,
-        config.minRegistrationDuration,
-        RNSUnified(loadContractOrDeploy(ContractKey.RNSUnified)),
-        NameChecker(loadContractOrDeploy(ContractKey.NameChecker)),
-        RNSDomainPrice(loadContractOrDeploy(ContractKey.RNSDomainPrice)),
-        RNSReverseRegistrar(loadContractOrDeploy(ContractKey.RNSReverseRegistrar))
+        param.admin,
+        param.pauser,
+        param.treasury,
+        param.maxAcceptableAge,
+        param.minCommitmentAge,
+        param.minRegistrationDuration,
+        RNSUnified(loadContractOrDeploy(Contract.RNSUnified.key())),
+        NameChecker(loadContractOrDeploy(Contract.NameChecker.key())),
+        RNSDomainPrice(loadContractOrDeploy(Contract.RNSDomainPrice.key())),
+        RNSReverseRegistrar(loadContractOrDeploy(Contract.RNSReverseRegistrar.key()))
       )
     );
   }
 
-  function run() public virtual trySetUp returns (RONRegistrarController) {
-    return RONRegistrarController(_deployProxy(ContractKey.RONRegistrarController));
+  function run() public virtual returns (RONRegistrarController) {
+    return RONRegistrarController(_deployProxy(Contract.RONRegistrarController.key()));
   }
 }
diff --git a/script/interfaces/ISharedArgument.sol b/script/interfaces/ISharedArgument.sol
new file mode 100644
index 00000000..f07a4671
--- /dev/null
+++ b/script/interfaces/ISharedArgument.sol
@@ -0,0 +1,37 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import { IGeneralConfig } from "foundry-deployment-kit/interfaces/IGeneralConfig.sol";
+import { IPyth, INSDomainPrice, PeriodScaler } from "@rns-contracts/RNSDomainPrice.sol";
+
+interface ISharedArgument is IGeneralConfig {
+  struct SharedParameter {
+    IPyth pyth;
+    address admin;
+    address pauser;
+    address overrider;
+    address controller;
+    uint8 minWord;
+    uint8 maxWord;
+    address rnsOperationOwner;
+    address operator;
+    address[] controllerOperators;
+    address[] auctionOperators;
+    address[] domainPriceOperators;
+    uint256 taxRatio;
+    uint64 gracePeriod;
+    string baseTokenURI;
+    uint256 bidGapRatio;
+    address protectedSettler;
+    address payable treasury;
+    uint256 maxAcceptableAge;
+    bytes32 pythIdForRONUSD;
+    uint256 maxCommitmentAge;
+    uint256 minCommitmentAge;
+    uint256 minRegistrationDuration;
+    PeriodScaler domainPriceScaleRule;
+    INSDomainPrice.RenewalFee[] renewalFees;
+  }
+
+  function sharedArguments() external view returns (SharedParameter memory param);
+}
diff --git a/script/utils/Contract.sol b/script/utils/Contract.sol
new file mode 100644
index 00000000..05f9fd0c
--- /dev/null
+++ b/script/utils/Contract.sol
@@ -0,0 +1,36 @@
+// SPDX-License-Identifier: MIT
+pragma solidity ^0.8.19;
+
+import { LibString } from "lib/solady/src/utils/LibString.sol";
+import { TContract } from "foundry-deployment-kit/types/Types.sol";
+
+enum Contract {
+  RNSUnified,
+  RNSAuction,
+  NameChecker,
+  RNSOperation,
+  RNSDomainPrice,
+  PublicResolver,
+  OwnedMulticaller,
+  RNSReverseRegistrar,
+  RONRegistrarController
+}
+
+using { key, name } for Contract global;
+
+function key(Contract contractEnum) pure returns (TContract) {
+  return TContract.wrap(LibString.packOne(name(contractEnum)));
+}
+
+function name(Contract contractEnum) pure returns (string memory) {
+  if (contractEnum == Contract.RNSUnified) return "RNSUnified";
+  if (contractEnum == Contract.RNSAuction) return "RNSAuction";
+  if (contractEnum == Contract.NameChecker) return "NameChecker";
+  if (contractEnum == Contract.RNSOperation) return "RNSOperation";
+  if (contractEnum == Contract.RNSDomainPrice) return "RNSDomainPrice";
+  if (contractEnum == Contract.PublicResolver) return "PublicResolver";
+  if (contractEnum == Contract.OwnedMulticaller) return "OwnedMulticaller";
+  if (contractEnum == Contract.RNSReverseRegistrar) return "RNSReverseRegistrar";
+  if (contractEnum == Contract.RONRegistrarController) return "RONRegistrarController";
+  revert("Contract: Unknown contract");
+}
diff --git a/test/RNSUnified/RNSUnified.t.sol b/test/RNSUnified/RNSUnified.t.sol
index e541a2a3..7522c901 100644
--- a/test/RNSUnified/RNSUnified.t.sol
+++ b/test/RNSUnified/RNSUnified.t.sol
@@ -96,7 +96,13 @@ abstract contract RNSUnifiedTest is Test {
     address logic = address(new RNSUnified());
     _rns = RNSUnified(
       address(
-        new TransparentUpgradeableProxy(logic, _proxyAdmin, abi.encodeCall(RNSUnified.initialize, (_admin, _pauser, _controller, _protectedSettler, GRACE_PERIOD, BASE_URI)))
+        new TransparentUpgradeableProxy(
+          logic,
+          _proxyAdmin,
+          abi.encodeCall(
+            RNSUnified.initialize, (_admin, _pauser, _controller, _protectedSettler, GRACE_PERIOD, BASE_URI)
+          )
+        )
       )
     );
 
diff --git a/upload-sig.sh b/upload-sig.sh
index a4a053c3..c6fd92fc 100755
--- a/upload-sig.sh
+++ b/upload-sig.sh
@@ -1,4 +1,3 @@
-set -ex
 # Default network value
 networkName="ronin-testnet"
 # Function to print usage and exit
@@ -40,6 +39,7 @@ if [ ! -d "$folder" ]; then
     echo "Error: The specified folder does not exist for the selected network."
     exit 1
 fi
+index=0
 for file in "$folder"/*.json; do
     # Check if the file exists and is a regular file
     if [ -f "$file" ] && [ "$(basename "$file")" != ".chainId" ]; then
@@ -47,6 +47,8 @@ for file in "$folder"/*.json; do
         contractName=$(jq -r '.contractName' "$file")
         # Check if contractName and address are not empty
         if [ -n "$contractName" ]; then
+            # Increment the index
+            ((index++))
             (
                 # Initialize arrays to store events and errors keys
                 events_keys=()
@@ -63,14 +65,20 @@ for file in "$folder"/*.json; do
                 done <<<"$(echo "$errors" | jq -r 'keys[]')"
                 # Combine keys from events and errors
                 all_keys=("${events_keys[@]}" "${errors_keys[@]}")
+                echo cast upload-signature "${all_keys[@]}"
                 # Call cast upload-signature
                 cast upload-signature "${all_keys[@]}"
-            ) & 
+            ) &
         else
             echo "Error: Missing contractName or address in $file"
         fi
     fi
 
+    # Check if index is a multiple of 10, then wait
+    if [ $((index % 10)) -eq 0 ]; then
+        wait
+    fi
+
 done
 
 forge selectors upload --all &