Skip to content

Commit c6ef331

Browse files
authored
Fix proxy admin deployment in script (#1623)
2 parents 72e5737 + 136d3a3 commit c6ef331

13 files changed

+351
-183
lines changed

claim_contracts/Makefile

Lines changed: 23 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,17 @@ help: ## 📚 Show help for each of the Makefile recipes
77
# Deployments
88

99
RPC_URL?=http://localhost:8545
10-
PRIVATE_KEY?=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
10+
PRIVATE_KEY?=0x5de4111afa1a4b94908f83103eb1f1706367c2e68ca870fc3fb9a804cdab365a
1111

1212
deploy-all: ## 🚀 Deploy all contracts
13-
cd script && forge script DeployAll.s.sol --private-key $(PRIVATE_KEY) --rpc-url $(RPC_URL) --broadcast
13+
cd script && \
14+
forge script DeployAll.s.sol \
15+
--sig "run(string)" \
16+
$(CONFIG) \
17+
--private-key $(PRIVATE_KEY) \
18+
--rpc-url $(RPC_URL) \
19+
--broadcast \
20+
-vvv
1421

1522
CONFIG?=example
1623
deploy-token: ## 🚀 Deploy the token contract
@@ -20,58 +27,24 @@ deploy-token: ## 🚀 Deploy the token contract
2027
$(CONFIG) \
2128
--private-key $(PRIVATE_KEY) \
2229
--rpc-url $(RPC_URL) \
23-
--broadcast
30+
--broadcast \
31+
--verbosity 3
2432

25-
MINT?="1 ether"
26-
OWNER?=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
27-
BENEFICIARY1?=0x70997970C51812dc3A010C7d01b50e0d17dc79C8
28-
BENEFICIARY2?=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
29-
BENEFICIARY3?=0x90F79bf6EB2c4f870365E785982E1f101E93b906
30-
31-
CLAIM_TIME_LIMIT?=1632960000
32-
MERKLE_ROOT?=0x90076b5fb9a6c81d9fce83dfd51760987b8c49e7c861ea25b328e6e63d2cd3df
33-
TOKEN_OWNER?=$(OWNER)
34-
35-
deploy-proxy-admin: ## 🚀 Deploy the ProxyAdmin contract
36-
cd script/proxy_admin && \
37-
forge script DeployProxyAdmin.s.sol \
38-
--sig "run(address)" \
39-
$(OWNER) \
40-
--rpc-url $(RPC_URL) \
41-
--private-key $(PRIVATE_KEY) \
42-
--broadcast
4333

44-
deploy-aligned-token-implementation: ## 🚀 Deploy the AlignedToken implementation contract
45-
cd script/aligned_token && \
46-
forge script DeployAlignedTokenImplementation.s.sol \
47-
--rpc-url $(RPC_URL) \
48-
--private-key $(PRIVATE_KEY) \
49-
--broadcast
34+
update_token_proxy:
35+
@NEW_TOKEN_PROXY=$$(jq -r '.tokenProxy' "script-out/deployed_token_addresses.json") && \
36+
jq --arg new_proxy "$$NEW_TOKEN_PROXY" '.tokenProxy = $$new_proxy' $(CONFIG) > $(CONFIG).tmp \
37+
&& mv $(CONFIG).tmp $(CONFIG)
5038

51-
deploy-aligned-token-proxy: ## 🚀 Deploy the AlignedToken proxy contract
52-
cd script/aligned_token && \
53-
forge script DeployAlignedTokenProxy.s.sol \
54-
--sig "run(address,address,address,address,address,address,uint256)" \
55-
$(PROXY_ADMIN) $(IMPLEMENTATION) $(OWNER) $(BENEFICIARY1) $(BENEFICIARY2) $(BENEFICIARY3) $(MINT) \
56-
--rpc-url $(RPC_URL) \
39+
upgrade-token: ## 🚀 Upgrade the token contract
40+
cd script && \
41+
forge script UpgradeToken.s.sol \
42+
--sig "run(string)" \
43+
$(CONFIG) \
5744
--private-key $(PRIVATE_KEY) \
58-
--broadcast
59-
60-
deploy-claimable-airdrop-implementation: ## 🚀 Deploy the ClaimableAirdrop implementation contract
61-
cd script/claimable_airdrop && \
62-
forge script DeployClaimableAirdropImplementation.s.sol \
6345
--rpc-url $(RPC_URL) \
64-
--private-key $(PRIVATE_KEY) \
65-
--broadcast
66-
67-
deploy-claimable-airdrop-proxy: ## 🚀 Deploy the ClaimableAirdrop proxy contract
68-
cd script/claimable_airdrop && \
69-
forge script DeployClaimableAirdropProxy.s.sol \
70-
--sig "run(address,address,address,address,address,uint256,bytes32)" \
71-
$(PROXY_ADMIN) $(IMPLEMENTATION) $(OWNER) $(TOKEN) $(BENEFICIARY1) $(CLAIM_TIME_LIMIT) $(MERKLE_ROOT) \
72-
--rpc-url $(RPC_URL) \
73-
--private-key $(PRIVATE_KEY) \
74-
--broadcast
46+
--broadcast \
47+
--verbosity 3
7548

7649
# Upgrades
7750

@@ -84,57 +57,11 @@ upgrade-aligned-token-implementation: ## 🚀 Upgrade the AlignedToken implement
8457
--private-key $(PRIVATE_KEY) \
8558
--broadcast
8659

87-
# Deployment Data
88-
89-
aligned-token-proxy-deploy-data: ## 🚀 Generate the deployment data for the AlignedToken proxy contract
90-
cd script/aligned_token && \
91-
forge script AlignedTokenProxyDeploymentData.s.sol \
92-
--sig "run(address,uint256, address,address,address,address,uint256)" \
93-
$(IMPLEMENTATION) $(VERSION) $(OWNER) $(BENEFICIARY1) $(BENEFICIARY2) $(BENEFICIARY3) $(MINT)
94-
95-
aligned-token-init-data: ## 🚀 Generate the init data for the AlignedToken proxy contract
96-
cd script/aligned_token && \
97-
forge script AlignedTokenInitData.s.sol \
98-
--sig "run(address,uint256, address,address,address,address,uint256)" \
99-
$(IMPLEMENTATION) $(VERSION) $(OWNER) $(BENEFICIARY1) $(BENEFICIARY2) $(BENEFICIARY3) $(MINT)
100-
101-
aligned-token-upgrade-data: ## 🚀 Generate the upgrade data for the AlignedToken proxy contract
102-
cd script/aligned_token && \
103-
forge script AlignedTokenUpgradeData.s.sol \
104-
--sig "run(address,uint256, address,address,address,address,uint256)" \
105-
$(IMPLEMENTATION) $(VERSION) $(OWNER) $(BENEFICIARY1) $(BENEFICIARY2) $(BENEFICIARY3) $(MINT)
106-
107-
SALT?=0x0000000000000000000000000000000000000000000000000000000000000000
108-
# Sepolia Safe CreateCall contract.
109-
DEPLOYER?=0x9b35Af71d77eaf8d7e40252370304687390A1A52
110-
111-
aligned-token-create2: ## 🚀 Generate the create2 data for the AlignedToken proxy contract
112-
cd script/aligned_token && \
113-
forge script AlignedTokenCreate2.s.sol \
114-
--sig "run(uint256,bytes32,address)" \
115-
$(VERSION) $(SALT) $(DEPLOYER)
116-
117-
aligned-token-proxy-create2: ## 🚀 Generate the create2 data for the AlignedToken proxy contract
118-
cd script/aligned_token && \
119-
forge script AlignedTokenCreate2.s.sol \
120-
--sig "run(address,uint256, address,address,address,address,uint256,bytes32,address)" \
121-
$(IMPLEMENTATION) $(VERSION) $(OWNER) $(BENEFICIARY1) $(BENEFICIARY2) $(BENEFICIARY3) $(MINT) $(SALT) $(DEPLOYER
122-
123-
# Misc
124-
125-
approve:
126-
cd script && \
127-
forge script ApproveERC20.s.sol \
128-
--sig "run(address,address,uint256)" \
129-
$(TOKEN) $(AIRDROP) $(AMOUNT) \
130-
--rpc-url $(RPC_URL) \
131-
--private-key $(HOLDER_PRIVATE_KEY) \
132-
--broadcast
133-
13460
# Test targets
13561

13662
test-token:
13763
cast call $(ADDRESS) "name()(string)" --rpc-url $(RPC_URL)
64+
cast call $(ADDRESS) "symbol()(string)" --rpc-url $(RPC_URL)
13865
cast call $(ADDRESS) "totalSupply()(uint256)" --rpc-url $(RPC_URL)
13966

14067
# The following target needs the proof API running on localhost:4000

claim_contracts/foundry.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ libs = ["lib"]
55
optimizer = true
66
optimizer_runs = 999_999
77

8+
solc_version = "0.8.28"
9+
810
# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options
911
fs_permissions = [
1012
{ access = "read-write", path = "script-out/" },
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
2-
"safe": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
32
"salt": "0x0000000000000000000000000000000000000000000000000000000000000000",
43
"deployer": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
54
"foundation": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC",
65
"claimSupplier": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
7-
"claimSupplierPrivateKey": "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d",
86
"limitTimestampToClaim": 2733427549,
9-
"claimMerkleRoot": "0x90076b5fb9a6c81d9fce83dfd51760987b8c49e7c861ea25b328e6e63d2cd3df"
7+
"claimMerkleRoot": "0x90076b5fb9a6c81d9fce83dfd51760987b8c49e7c861ea25b328e6e63d2cd3df",
8+
"airdropProxy": "0x882b82f4E9014164Af87ecdAB64955cf7C252C4f",
9+
"tokenProxy": "0x82720a392C037B708370A1c2FCfd64d01e851e81"
1010
}

claim_contracts/script/DeployAlignedToken.s.sol

Lines changed: 23 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -6,39 +6,22 @@ import "../src/ClaimableAirdrop.sol";
66
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
77
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
88
import "forge-std/Script.sol";
9+
import {Vm} from "forge-std/Vm.sol";
910
import {Utils} from "./Utils.sol";
1011

1112
contract DeployAlignedToken is Script {
1213
function run(string memory config) public {
1314
string memory root = vm.projectRoot();
14-
string memory path = string.concat(
15-
root,
16-
"/script-config/config.",
17-
config,
18-
".json"
19-
);
15+
string memory path = string.concat(root, "/script-config/config.", config, ".json");
2016
string memory config_json = vm.readFile(path);
2117

22-
address _safe = stdJson.readAddress(config_json, ".safe");
2318
bytes32 _salt = stdJson.readBytes32(config_json, ".salt");
2419
address _deployer = stdJson.readAddress(config_json, ".deployer");
2520
address _foundation = stdJson.readAddress(config_json, ".foundation");
26-
address _claimSupplier = stdJson.readAddress(
27-
config_json,
28-
".claimSupplier"
29-
);
30-
31-
ProxyAdmin _proxyAdmin = deployProxyAdmin(_safe, _salt, _deployer);
32-
33-
console.log(
34-
"Proxy Admin deployed at address:",
35-
address(_proxyAdmin),
36-
"with owner:",
37-
_safe
38-
);
21+
address _claimSupplier = stdJson.readAddress(config_json, ".claimSupplier");
3922

4023
TransparentUpgradeableProxy _tokenProxy = deployAlignedTokenProxy(
41-
address(_proxyAdmin),
24+
_foundation,
4225
_salt,
4326
_deployer,
4427
_foundation,
@@ -47,39 +30,34 @@ contract DeployAlignedToken is Script {
4730

4831
console.log(
4932
string.concat(
50-
"Aligned Token Proxy deployed at address:",
33+
"Aligned Token Proxy deployed at address: ",
5134
vm.toString(address(_tokenProxy)),
52-
"with proxy admin:",
53-
vm.toString(address(_proxyAdmin)),
54-
"and owner:",
55-
vm.toString(_safe)
35+
" with proxy admin: ",
36+
vm.toString(Utils.getAdminAddress(address(_tokenProxy))),
37+
" and owner: ",
38+
vm.toString(_foundation)
5639
)
5740
);
5841

59-
console.log(
60-
"Remember that the foundation must accept the ownership of the contract after deployment in another transaction."
61-
);
42+
string memory deployedAddressesJson = "deployedAddressesJson";
43+
string memory finalJson = vm.serializeAddress(deployedAddressesJson, "tokenProxy", address(_tokenProxy));
44+
45+
vm.writeJson(finalJson, _getOutputPath("deployed_token_addresses.json"));
6246
}
6347

64-
function deployProxyAdmin(
65-
address _safe,
66-
bytes32 _salt,
67-
address _deployer
68-
) internal returns (ProxyAdmin) {
69-
bytes memory _proxyAdminDeploymentData = Utils.proxyAdminDeploymentData(
70-
_safe
71-
);
72-
address _proxyAdminCreate2Address = Utils.deployWithCreate2(
73-
_proxyAdminDeploymentData,
74-
_salt,
75-
_deployer
76-
);
48+
function _getOutputPath(string memory fileName) internal returns (string memory) {
49+
string memory outputDir = "script-out/";
50+
51+
// Create output directory if it doesn't exist
52+
if (!vm.exists(outputDir)) {
53+
vm.createDir(outputDir, true);
54+
}
7755

78-
return ProxyAdmin(_proxyAdminCreate2Address);
56+
return string.concat(outputDir, fileName);
7957
}
8058

8159
function deployAlignedTokenProxy(
82-
address _proxyAdmin,
60+
address _proxyAdminOwner,
8361
bytes32 _salt,
8462
address _deployer,
8563
address _foundation,
@@ -90,7 +68,7 @@ contract DeployAlignedToken is Script {
9068

9169
bytes memory _alignedTokenDeploymentData = Utils
9270
.alignedTokenProxyDeploymentData(
93-
_proxyAdmin,
71+
_proxyAdminOwner,
9472
address(_token),
9573
_foundation,
9674
_claim

0 commit comments

Comments
 (0)