Skip to content

Commit

Permalink
Merge pull request #146 from yieldnest/chore/verify-script-bash
Browse files Browse the repository at this point in the history
Chore/verify script bash
  • Loading branch information
danoctavian authored Aug 8, 2024
2 parents 38077d2 + 13a632c commit ed61c21
Show file tree
Hide file tree
Showing 5 changed files with 181 additions and 26 deletions.
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."


0 comments on commit ed61c21

Please sign in to comment.