Skip to content

Commit ec74e0f

Browse files
authored
Improve transparent proxy contracts (#1611)
2 parents ee2efe2 + 193516f commit ec74e0f

File tree

10 files changed

+756
-211
lines changed

10 files changed

+756
-211
lines changed

claim_contracts/Makefile

Lines changed: 153 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,153 @@
1+
.PHONY: help deploy-aligned-token-implementation deploy-aligned-token-proxy deploy-claimable-airdrop-implementation deploy-claimable-airdrop-proxy upgrade-aligned-token-implementation aligned-token-proxy-deploy-data aligned-token-init-data aligned-token-upgrade-data aligned-token-create2 aligned-token-proxy-create2
2+
3+
4+
help: ## 📚 Show help for each of the Makefile recipes
5+
@grep -E '^[a-zA-Z0-9_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
6+
7+
# Deployments
8+
9+
RPC_URL?=http://localhost:8545
10+
PRIVATE_KEY?=0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d
11+
12+
deploy-all: ## 🚀 Deploy all contracts
13+
cd script && forge script DeployAll.s.sol --private-key $(PRIVATE_KEY) --rpc-url $(RPC_URL) --broadcast
14+
15+
deploy-token: ## 🚀 Deploy the token contract
16+
cd script && \
17+
forge script DeployAlignedToken.s.sol \
18+
--private-key $(PRIVATE_KEY) \
19+
--rpc-url $(RPC_URL) \
20+
--broadcast
21+
22+
MINT?="1 ether"
23+
OWNER?=0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266
24+
BENEFICIARY1?=0x70997970C51812dc3A010C7d01b50e0d17dc79C8
25+
BENEFICIARY2?=0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC
26+
BENEFICIARY3?=0x90F79bf6EB2c4f870365E785982E1f101E93b906
27+
28+
CLAIM_TIME_LIMIT?=1632960000
29+
MERKLE_ROOT?=0x90076b5fb9a6c81d9fce83dfd51760987b8c49e7c861ea25b328e6e63d2cd3df
30+
TOKEN_OWNER?=$(OWNER)
31+
32+
deploy-proxy-admin: ## 🚀 Deploy the ProxyAdmin contract
33+
cd script/proxy_admin && \
34+
forge script DeployProxyAdmin.s.sol \
35+
--sig "run(address)" \
36+
$(OWNER) \
37+
--rpc-url $(RPC_URL) \
38+
--private-key $(PRIVATE_KEY) \
39+
--broadcast
40+
41+
deploy-aligned-token-implementation: ## 🚀 Deploy the AlignedToken implementation contract
42+
cd script/aligned_token && \
43+
forge script DeployAlignedTokenImplementation.s.sol \
44+
--rpc-url $(RPC_URL) \
45+
--private-key $(PRIVATE_KEY) \
46+
--broadcast
47+
48+
deploy-aligned-token-proxy: ## 🚀 Deploy the AlignedToken proxy contract
49+
cd script/aligned_token && \
50+
forge script DeployAlignedTokenProxy.s.sol \
51+
--sig "run(address,address,address,address,address,address,uint256)" \
52+
$(PROXY_ADMIN) $(IMPLEMENTATION) $(OWNER) $(BENEFICIARY1) $(BENEFICIARY2) $(BENEFICIARY3) $(MINT) \
53+
--rpc-url $(RPC_URL) \
54+
--private-key $(PRIVATE_KEY) \
55+
--broadcast
56+
57+
deploy-claimable-airdrop-implementation: ## 🚀 Deploy the ClaimableAirdrop implementation contract
58+
cd script/claimable_airdrop && \
59+
forge script DeployClaimableAirdropImplementation.s.sol \
60+
--rpc-url $(RPC_URL) \
61+
--private-key $(PRIVATE_KEY) \
62+
--broadcast
63+
64+
deploy-claimable-airdrop-proxy: ## 🚀 Deploy the ClaimableAirdrop proxy contract
65+
cd script/claimable_airdrop && \
66+
forge script DeployClaimableAirdropProxy.s.sol \
67+
--sig "run(address,address,address,address,address,uint256,bytes32)" \
68+
$(PROXY_ADMIN) $(IMPLEMENTATION) $(OWNER) $(TOKEN) $(BENEFICIARY1) $(CLAIM_TIME_LIMIT) $(MERKLE_ROOT) \
69+
--rpc-url $(RPC_URL) \
70+
--private-key $(PRIVATE_KEY) \
71+
--broadcast
72+
73+
# Upgrades
74+
75+
upgrade-aligned-token-implementation: ## 🚀 Upgrade the AlignedToken implementation contract
76+
cd script/aligned_token && \
77+
forge script UpgradeAlignedTokenImplementation.s.sol \
78+
--sig "function run(address,address,uint256,address,address,address,address,uint256)" \
79+
$(PROXY) $(IMPLEMENTATION) $(VERSION) $(OWNER) $(BENEFICIARY1) $(BENEFICIARY2) $(BENEFICIARY3) $(MINT)\
80+
--rpc-url $(RPC_URL) \
81+
--private-key $(PRIVATE_KEY) \
82+
--broadcast
83+
84+
# Deployment Data
85+
86+
aligned-token-proxy-deploy-data: ## 🚀 Generate the deployment data for the AlignedToken proxy contract
87+
cd script/aligned_token && \
88+
forge script AlignedTokenProxyDeploymentData.s.sol \
89+
--sig "run(address,uint256, address,address,address,address,uint256)" \
90+
$(IMPLEMENTATION) $(VERSION) $(OWNER) $(BENEFICIARY1) $(BENEFICIARY2) $(BENEFICIARY3) $(MINT)
91+
92+
aligned-token-init-data: ## 🚀 Generate the init data for the AlignedToken proxy contract
93+
cd script/aligned_token && \
94+
forge script AlignedTokenInitData.s.sol \
95+
--sig "run(address,uint256, address,address,address,address,uint256)" \
96+
$(IMPLEMENTATION) $(VERSION) $(OWNER) $(BENEFICIARY1) $(BENEFICIARY2) $(BENEFICIARY3) $(MINT)
97+
98+
aligned-token-upgrade-data: ## 🚀 Generate the upgrade data for the AlignedToken proxy contract
99+
cd script/aligned_token && \
100+
forge script AlignedTokenUpgradeData.s.sol \
101+
--sig "run(address,uint256, address,address,address,address,uint256)" \
102+
$(IMPLEMENTATION) $(VERSION) $(OWNER) $(BENEFICIARY1) $(BENEFICIARY2) $(BENEFICIARY3) $(MINT)
103+
104+
SALT?=0x0000000000000000000000000000000000000000000000000000000000000000
105+
# Sepolia Safe CreateCall contract.
106+
DEPLOYER?=0x9b35Af71d77eaf8d7e40252370304687390A1A52
107+
108+
aligned-token-create2: ## 🚀 Generate the create2 data for the AlignedToken proxy contract
109+
cd script/aligned_token && \
110+
forge script AlignedTokenCreate2.s.sol \
111+
--sig "run(uint256,bytes32,address)" \
112+
$(VERSION) $(SALT) $(DEPLOYER)
113+
114+
aligned-token-proxy-create2: ## 🚀 Generate the create2 data for the AlignedToken proxy contract
115+
cd script/aligned_token && \
116+
forge script AlignedTokenCreate2.s.sol \
117+
--sig "run(address,uint256, address,address,address,address,uint256,bytes32,address)" \
118+
$(IMPLEMENTATION) $(VERSION) $(OWNER) $(BENEFICIARY1) $(BENEFICIARY2) $(BENEFICIARY3) $(MINT) $(SALT) $(DEPLOYER
119+
120+
# Misc
121+
122+
approve:
123+
cd script && \
124+
forge script ApproveERC20.s.sol \
125+
--sig "run(address,address,uint256)" \
126+
$(TOKEN) $(AIRDROP) $(AMOUNT) \
127+
--rpc-url $(RPC_URL) \
128+
--private-key $(HOLDER_PRIVATE_KEY) \
129+
--broadcast
130+
131+
# Test targets
132+
133+
test-token:
134+
cast call $(ADDRESS) "name()(string)" --rpc-url $(RPC_URL)
135+
cast call $(ADDRESS) "totalSupply()(uint256)" --rpc-url $(RPC_URL)
136+
137+
# The following target needs the proof API running on localhost:4000
138+
AMOUNT_TO_CLAIM=$(shell curl -S -H "Content-Type: application/json" http://localhost:4000/api/proof/\$(CLAIMER) | jq -r .amount)
139+
MERKLE_PROOF_TO_CLAIM=$(shell curl -S -H "Content-Type: application/json" http://localhost:4000/api/proof/\$(CLAIMER) | jq .proof | tr -d '"\n ')
140+
test-claim:
141+
cast send $(AIRDROP) --private-key $(CLAIMER_PRIVATE_KEY) "claim(uint256,bytes32[])" $(AMOUNT_TO_CLAIM) "$(MERKLE_PROOF_TO_CLAIM)" --rpc-url $(RPC_URL)
142+
143+
test-claimed:
144+
cast call $(AIRDROP) "hasClaimed(address)(bool)" $(CLAIMER) --rpc-url $(RPC_URL)
145+
cast balance --erc20 $(TOKEN) $(CLAIMER) --rpc-url $(RPC_URL)
146+
147+
OWNER_PRIVATE_KEY?=0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
148+
149+
test-pause:
150+
cast send $(AIRDROP) --private-key $(OWNER_PRIVATE_KEY) "pause()" --rpc-url $(RPC_URL)
151+
152+
test-unpause:
153+
cast send $(AIRDROP) --private-key $(OWNER_PRIVATE_KEY) "unpause()" --rpc-url $(RPC_URL)

claim_contracts/foundry.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,11 @@
22
src = "src"
33
out = "out"
44
libs = ["lib"]
5+
optimizer = true
6+
optimizer_runs = 999_999
57

68
# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options
9+
fs_permissions = [
10+
{ access = "read-write", path = "script-out/" },
11+
{ access = "read", path = "script-config/" },
12+
]
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"safe": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
3+
"salt": "0x0000000000000000000000000000000000000000000000000000000000000000",
4+
"deployer": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
5+
"foundation": "0x3C44CdDdB6a900fa2b585dd299e03d12FA4293BC",
6+
"claimSupplier": "0x70997970C51812dc3A010C7d01b50e0d17dc79C8",
7+
"claimSupplierPrivateKey": "0x59c6995e998f97a5a0044966f0945389dc9e86dae88c7a8412f4603b6b78690d",
8+
"limitTimestampToClaim": 2733427549,
9+
"claimMerkleRoot": "0x90076b5fb9a6c81d9fce83dfd51760987b8c49e7c861ea25b328e6e63d2cd3df"
10+
}

claim_contracts/script-out/.gitkeep

Whitespace-only changes.
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.19;
3+
4+
import "../src/AlignedToken.sol";
5+
import "../src/ClaimableAirdrop.sol";
6+
import "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol";
7+
import "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol";
8+
import "forge-std/Script.sol";
9+
import {Utils} from "./Utils.sol";
10+
11+
contract DeployAlignedToken is Script {
12+
function run() public {
13+
string memory root = vm.projectRoot();
14+
string memory path = string.concat(root, "/script-config/config.json");
15+
string memory config_json = vm.readFile(path);
16+
17+
address _safe = stdJson.readAddress(config_json, ".safe");
18+
bytes32 _salt = stdJson.readBytes32(config_json, ".salt");
19+
address _deployer = stdJson.readAddress(config_json, ".deployer");
20+
address _foundation = stdJson.readAddress(config_json, ".foundation");
21+
address _claimSupplier = stdJson.readAddress(
22+
config_json,
23+
".claimSupplier"
24+
);
25+
26+
ProxyAdmin _proxyAdmin = deployProxyAdmin(_safe, _salt, _deployer);
27+
28+
console.log(
29+
"Proxy Admin deployed at address:",
30+
address(_proxyAdmin),
31+
"with owner:",
32+
_safe
33+
);
34+
35+
TransparentUpgradeableProxy _tokenProxy = deployAlignedTokenProxy(
36+
address(_proxyAdmin),
37+
_salt,
38+
_deployer,
39+
_safe,
40+
_foundation,
41+
_claimSupplier
42+
);
43+
44+
console.log(
45+
string.concat(
46+
"Aligned Token Proxy deployed at address:",
47+
vm.toString(address(_tokenProxy)),
48+
"with proxy admin:",
49+
vm.toString(address(_proxyAdmin)),
50+
"and owner:",
51+
vm.toString(_safe)
52+
)
53+
);
54+
}
55+
56+
function deployProxyAdmin(
57+
address _safe,
58+
bytes32 _salt,
59+
address _deployer
60+
) internal returns (ProxyAdmin) {
61+
bytes memory _proxyAdminDeploymentData = Utils.proxyAdminDeploymentData(
62+
_safe
63+
);
64+
address _proxyAdminCreate2Address = Utils.deployWithCreate2(
65+
_proxyAdminDeploymentData,
66+
_salt,
67+
_deployer
68+
);
69+
70+
return ProxyAdmin(_proxyAdminCreate2Address);
71+
}
72+
73+
function deployAlignedTokenProxy(
74+
address _proxyAdmin,
75+
bytes32 _salt,
76+
address _deployer,
77+
address _owner,
78+
address _foundation,
79+
address _claim
80+
) internal returns (TransparentUpgradeableProxy) {
81+
vm.broadcast();
82+
AlignedToken _token = new AlignedToken();
83+
84+
bytes memory _alignedTokenDeploymentData = Utils
85+
.alignedTokenProxyDeploymentData(
86+
_proxyAdmin,
87+
address(_token),
88+
_owner,
89+
_foundation,
90+
_claim
91+
);
92+
address _alignedTokenProxy = Utils.deployWithCreate2(
93+
_alignedTokenDeploymentData,
94+
_salt,
95+
_deployer
96+
);
97+
return TransparentUpgradeableProxy(payable(_alignedTokenProxy));
98+
}
99+
}

0 commit comments

Comments
 (0)