Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Chore/verify script bash #146

Merged
merged 7 commits into from
Aug 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 25 additions & 23 deletions deployments/YnLSDe-17000.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,27 +9,29 @@
"STRATEGY_CONTROLLER": "0x1234567890123456789012345678901234567890",
"TOKEN_STAKING_NODE_CREATOR": "0x9Dd8F69b62ddFd990241530F47dcEd0Dad7f7d39",
"UNPAUSE_ADMIN": "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913",
"implementation-YnLSDe": "0xf73DD6015c13F0dF96fA1508AEb1E66F5e5eB564",
"implementation-assetRegistry": "0xDe40B6264E474BF6dd0bD0A8B1b2BFCaB47f3631",
"implementation-eigenStrategyManager": "0x690eaf0603658f5873133D80c8d6615834cAef27",
"implementation-rateProvider": "0xf23509683d4B256512ec3d2c589C71CFB4423277",
"implementation-tokenStakingNodesManager": "0x2FDf1C9d47AAb7D76D84aE90Ab9B11B6896eB129",
"implementation-ynEigenDepositAdapter": "0x6A1a2709A6aBcAa7217203399Aee7a5B2aB56883",
"implementation-ynEigenViewer": "0x80B7FcEF28974Aff4A342b19A93CE74e726364F5",
"proxy-YnLSDe": "0x3D6E2481f0A9416fC57776227447100F700d695f",
"proxy-assetRegistry": "0x17EfE07BC43Ef6E7B57BFB86c5007427f63844E7",
"proxy-eigenStrategyManager": "0x7ffBAcDdC82113Ded64Fea495791C037531F8724",
"proxy-rateProvider": "0x83f46bF3F3F9446290fBF6440064E3EDC962D62D",
"proxy-tokenStakingNodesManager": "0x6083F808D2C25fC404fD87403069CAD690792941",
"proxy-ynEigenDepositAdapter": "0xc0D59ed72f13AEB11497B766ED8498d641033878",
"proxy-ynEigenViewer": "0x15C237EC9196eFae4EAdDc6940DcaeA1C387943b",
"proxyAdmin-YnLSDe": "0x4d81ad1D323F90313E6fF70ee74B6c5af0024714",
"proxyAdmin-assetRegistry": "0x3F115F02439988114cB55A1a1a7980F86686c826",
"proxyAdmin-eigenStrategyManager": "0x2D2a2d0f0E917da212014a8A79759AfdB3264BE6",
"proxyAdmin-rateProvider": "0x5f96ac7FbfFC80a348A467994ad1bB237741e4a7",
"proxyAdmin-tokenStakingNodesManager": "0xC97BeDe97d5d3618682B79b8EbA0d8C278D4E9d4",
"proxyAdmin-ynEigenDepositAdapter": "0x5B61b0a29dB2Fc0585C3fF8915cffB38CCe321f6",
"proxyAdmin-ynEigenViewer": "0x935eFF20AF810C65a24e075F4e067dcE5Dc74CA4",
"tokenStakingNodeImplementation": "0x9317038F64F8C27D0274AF745A23362d4c6b0e73",
"upgradeTimelock": "0x580b16AF1Ae9be8886F135274f87C81fd99CB6E4"
"YNDev": "0x9Dd8F69b62ddFd990241530F47dcEd0Dad7f7d39",
"YnSecurityCouncil": "0x743b91CDB1C694D4F51bCDA3a4A59DcC0d02b913",
"implementation-YnLSDe": "0x3E13cBE568D148162251A7b36F408Cc361387939",
"implementation-assetRegistry": "0x7E7fC5B3f8802Ee204B915Dad0f5cc4a9b54576D",
"implementation-eigenStrategyManager": "0xd1E845C6FDef611740c5023EC5E40827dFd853C6",
"implementation-rateProvider": "0xa2A8A8522ed5bAb7Ce15e4216FBaa0BcD36279a9",
"implementation-tokenStakingNodesManager": "0x9db016CD82D4FA069965C6EDa8D276910c95f96C",
"implementation-ynEigenDepositAdapter": "0x473D73cec5b11BA09A89a247C0A18b55922F5d37",
"implementation-ynEigenViewer": "0xA64Da2e2dd622d53fc908d2b9B744d18A5c421de",
"proxy-YnLSDe": "0x8Bfae444af1Aed8c426869303A2F04F1984d75bd",
"proxy-assetRegistry": "0x0796C349F33F34bc5D091105D6Ae141325B6fc5e",
"proxy-eigenStrategyManager": "0x27B62c61326814d6FDB815cC96c2Fd4c6aDa4B91",
"proxy-rateProvider": "0x4D7cb0Edc6A10a15445bbA174F21DF5BA4cAe281",
"proxy-tokenStakingNodesManager": "0xC79A98Aa42df0aF5D4DA9A16a80A5ACE82c75b52",
"proxy-ynEigenDepositAdapter": "0xC27730CdAAFEd60a9D763715d6B8Fa31278435Aa",
"proxy-ynEigenViewer": "0x1136cE376226fa55427089AE43a69AdF1E2534Fd",
"proxyAdmin-YnLSDe": "0xe036c7784429aC1f4f9A9D87546D683159274080",
"proxyAdmin-assetRegistry": "0xAfD55aCc4C103Af610cEb8807de9a2AfE9f16960",
"proxyAdmin-eigenStrategyManager": "0xb5983f3f5B6F7027C4B115387bb37a8147e99767",
"proxyAdmin-rateProvider": "0x677eDFBDE5fa4A9D13DBA4a05872AA0850a86cD3",
"proxyAdmin-tokenStakingNodesManager": "0xf1fE0b60A109f815aD865ED8566FB9Eb60E0D07a",
"proxyAdmin-ynEigenDepositAdapter": "0x15f5e8E81a68909814A815616C615a87a4393E4D",
"proxyAdmin-ynEigenViewer": "0x24a439f8d14DC94f62Ace652BB77c3a76066dD96",
"tokenStakingNodeImplementation": "0x2ee9343b784ae9a0e93F6c1c3c39961093d0Eb97",
"upgradeTimelock": "0xf6131FD7ec88FE390FE6Db7F61A85cA3Db9555CB"
}
2 changes: 2 additions & 0 deletions script/BaseYnEigenScript.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ abstract contract BaseYnEigenScript is BaseScript {
vm.serializeAddress(json, "TOKEN_STAKING_NODE_CREATOR", address(actors.ops.STAKING_NODE_CREATOR));
vm.serializeAddress(json, "STRATEGY_CONTROLLER", address(actors.ops.STRATEGY_CONTROLLER));
vm.serializeAddress(json, "EIGEN_STRATEGY_ADMIN", address(actors.admin.EIGEN_STRATEGY_ADMIN));
vm.serializeAddress(json, "YnSecurityCouncil", address(actors.wallets.YNSecurityCouncil));
vm.serializeAddress(json, "YNDev", address(actors.wallets.YNDev));
string memory finalJson = vm.serializeAddress(json, "DEFAULT_SIGNER", address((actors.eoa.DEFAULT_SIGNER)));

vm.writeJson(finalJson, getDeploymentFile());
Expand Down
11 changes: 9 additions & 2 deletions script/DeployYnLSDe.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,16 @@ contract DeployYnLSDe is BaseYnEigenScript {
_proposers[0] = actors.wallets.YNDev;
address[] memory _executors = new address[](1);
_executors[0] = actors.wallets.YNSecurityCouncil;
uint256 delay;
if (block.chainid == 17000) { // Holesky
delay = 15 minutes;
} else if (block.chainid == 1) { // Mainnet
delay = 3 days;
} else {
revert("Unsupported chain ID");
}
timelock = new TimelockController(
3 days, // delay
delay,
_proposers,
_executors,
actors.admin.PROXY_ADMIN_OWNER // admin
Expand Down Expand Up @@ -275,7 +283,6 @@ contract DeployYnLSDe is BaseYnEigenScript {
}

{

address _viewerImplementation = address(new ynEigenViewer(address(assetRegistry), address(ynLSDe), address(tokenStakingNodesManager), address(lsdRateProvider)));
viewer = ynEigenViewer(address(new TransparentUpgradeableProxy(_viewerImplementation, address(timelock), "")));
}
Expand Down
2 changes: 1 addition & 1 deletion script/VerifyYnLSDe.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ contract VerifyYnLSDeScript is BaseYnEigenScript {
console.log("\u2705 upgradeTimelock: CANCELLER_ROLE - ", vm.toString(address(actors.wallets.YNDev)));

// Verify delay
uint256 expectedDelay = 3 days; // Adjust this value if the expected delay is different
uint256 expectedDelay = block.chainid == 17000 ? 15 minutes : 3 days;
require(
deployment.upgradeTimelock.getMinDelay() == expectedDelay,
"upgradeTimelock: DELAY INVALID"
Expand Down
144 changes: 144 additions & 0 deletions script/verification/verify-ynlsde-deployment.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
#!/bin/bash

# Read the deployment JSON file
DEPLOYMENT_FILE="./deployments/YnLSDe-17000.json"
# Read the Etherscan API key from .env file
ETHERSCAN_API_KEY=$(grep ETHERSCAN_API_KEY .env | cut -d '=' -f2)
# Read the RPC URL from .env file
RPC_URL=$(grep RPC_URL .env | cut -d '=' -f2)

# Check if RPC_URL is empty
if [ -z "$RPC_URL" ]; then
echo "Error: RPC_URL is not set in the .env file"
exit 1
fi

echo "Using RPC URL: $RPC_URL"

# Extract chain ID from RPC_URL
CHAIN_ID=$(cast chain-id --rpc-url $RPC_URL)
echo "Chain ID: $CHAIN_ID"

# List of contracts to verify
contracts=("YnLSDe" "assetRegistry" "eigenStrategyManager" "tokenStakingNodesManager" "ynEigenDepositAdapter" "rateProvider" "ynEigenViewer")

get_solidity_contract_name() {
local contract_key=$1
local solidity_contract=""

if [ "$contract_key" == "YnLSDe" ]; then
solidity_contract="ynEigen"
elif [ "$contract_key" == "assetRegistry" ]; then
solidity_contract="AssetRegistry"
elif [ "$contract_key" == "eigenStrategyManager" ]; then
solidity_contract="EigenStrategyManager"
elif [ "$contract_key" == "tokenStakingNodesManager" ]; then
solidity_contract="TokenStakingNodesManager"
elif [ "$contract_key" == "ynEigenDepositAdapter" ]; then
solidity_contract="ynEigenDepositAdapter"
elif [ "$contract_key" == "rateProvider" ]; then
solidity_contract="LSDRateProvider"
elif [ "$contract_key" == "ynEigenViewer" ]; then
solidity_contract="ynEigenViewer"
else
echo "Error: Unknown contract key '$contract_key'" >&2
return 1
fi

echo "$solidity_contract"
}

# Function to extract proxy and implementation addresses
extract_addresses() {
local key=$1
local proxy_address=$(jq -r ".[\"proxy-$key\"]" "$DEPLOYMENT_FILE")
local impl_address=$(jq -r ".[\"implementation-$key\"]" "$DEPLOYMENT_FILE")
local proxy_admin=$(jq -r ".[\"proxyAdmin-$key\"]" "$DEPLOYMENT_FILE")
echo "$proxy_address $impl_address $proxy_admin"
}

timelock_address=$(jq -r '.upgradeTimelock' "$DEPLOYMENT_FILE")

# Function to verify a contract
verify_contract() {
local proxy_address=$1
local impl_address=$2
local proxy_admin=$3
local contract_name=$4

# Get the Solidity contract name
local solidity_contract=$(get_solidity_contract_name "$contract_name")
if [ -z "$solidity_contract" ]; then
echo "Error: No Solidity contract name found for $contract_name"
return 1
fi

echo "Verifying $contract_name (Solidity contract: $solidity_contract)..."

# Verify the implementation contract
forge verify-contract $impl_address $solidity_contract \
--etherscan-api-key $ETHERSCAN_API_KEY \
--rpc-url $RPC_URL

# Verify the proxy contract
forge verify-contract \
--constructor-args $(cast abi-encode "constructor(address,address,bytes)" $impl_address $timelock_address "0x") \
$proxy_address TransparentUpgradeableProxy \
--etherscan-api-key $ETHERSCAN_API_KEY \
--rpc-url $RPC_URL

# FIXME: this still doesn't work.
# Verify the proxy admin contract
forge verify-contract \
--constructor-args $(cast abi-encode "constructor(address)" $timelock_address) \
$proxy_admin ProxyAdmin \
--etherscan-api-key $ETHERSCAN_API_KEY \
--rpc-url $RPC_URL
}


# Verify each contract
for contract in "${contracts[@]}"; do
read proxy impl proxy_admin <<< $(extract_addresses $contract)
verify_contract $proxy $impl $proxy_admin $contract
done
# Verify TokenStakingNode implementation
token_staking_node_impl=$(jq -r '.tokenStakingNodeImplementation' "$DEPLOYMENT_FILE")
forge verify-contract $token_staking_node_impl TokenStakingNode \
--etherscan-api-key $ETHERSCAN_API_KEY \
--rpc-url $RPC_URL

# Define delay based on chain ID
if [ "$CHAIN_ID" = "17000" ]; then
delay=$((15 * 60)) # 15 minutes in seconds
elif [ "$CHAIN_ID" = "1" ]; then
delay=$((3 * 24 * 60 * 60)) # 3 days in seconds
else
echo "Unsupported chain ID: $CHAIN_ID"
exit 1
fi
echo "Timelock delay: $delay seconds"


# Load YNDev and YNSecurityCouncil addresses from deployment file
YNDev=$(jq -r '.YNDev' "$DEPLOYMENT_FILE")
YNSecurityCouncil=$(jq -r '.YnSecurityCouncil' "$DEPLOYMENT_FILE")

# Log YNDev and YNSecurityCouncil addresses
echo "YNDev address: $YNDev"
echo "YNSecurityCouncil address: $YNSecurityCouncil"

# Encode constructor arguments; assumes only one of each.
constructor_args=$(cast abi-encode "constructor(uint256,address[],address[],address)" $delay "[$YNDev]" "[$YNSecurityCouncil]" $YNSecurityCouncil)

echo "Timelock constructor arguments: $constructor_args"

# Verify TimelockController
forge verify-contract $timelock_address TimelockController \
--constructor-args $constructor_args \
--etherscan-api-key $ETHERSCAN_API_KEY \
--rpc-url $RPC_URL

echo "Verification process completed."


Loading