diff --git a/deployments/YnLSDe-17000.json b/deployments/YnLSDe-17000.json index d7e127219..6431e4641 100644 --- a/deployments/YnLSDe-17000.json +++ b/deployments/YnLSDe-17000.json @@ -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" } \ No newline at end of file diff --git a/script/BaseYnEigenScript.s.sol b/script/BaseYnEigenScript.s.sol index ef8cbdbb3..7cc41b405 100644 --- a/script/BaseYnEigenScript.s.sol +++ b/script/BaseYnEigenScript.s.sol @@ -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()); diff --git a/script/DeployYnLSDe.s.sol b/script/DeployYnLSDe.s.sol index fe0e02127..13f6ec9a0 100644 --- a/script/DeployYnLSDe.s.sol +++ b/script/DeployYnLSDe.s.sol @@ -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 @@ -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), ""))); } diff --git a/script/VerifyYnLSDe.s.sol b/script/VerifyYnLSDe.s.sol index 0efb906f3..cde0385b4 100644 --- a/script/VerifyYnLSDe.s.sol +++ b/script/VerifyYnLSDe.s.sol @@ -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" diff --git a/script/verification/verify-ynlsde-deployment.sh b/script/verification/verify-ynlsde-deployment.sh new file mode 100644 index 000000000..cc33975ca --- /dev/null +++ b/script/verification/verify-ynlsde-deployment.sh @@ -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." + +