Skip to content

Commit d8c1320

Browse files
authored
Merge pull request #223 from Lay3rLabs/221-add-script-for-transferring-ownership-of-all-contracts
221 Transfer Ownership Script
2 parents 0548d44 + 8e5020b commit d8c1320

File tree

6 files changed

+215
-2
lines changed

6 files changed

+215
-2
lines changed

README.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,34 @@ docker run --rm --network host -v ./.nodes:/root/.nodes \
260260
| `REGISTRY_ADDRESS` | if not mounted | From `.nodes/avs_deploy.json` | Volume | AVS registrar address |
261261
| `FUNDED_KEY` | if not mounted | From `.nodes/deployer` | Volume | Deployer private key |
262262

263+
### Transfer Ownership
264+
265+
Transfers ownership of the service contracts to new owners.
266+
267+
```bash
268+
PROXY_OWNER=$(cast wallet new --json | jq -r '.[0].private_key')
269+
PROXY_OWNER_ADDRESS=$(cast wallet addr --private-key "$PROXY_OWNER")
270+
echo "Proxy owner address: $PROXY_OWNER_ADDRESS"
271+
AVS_OWNER=$(cast wallet new --json | jq -r '.[0].private_key')
272+
AVS_OWNER_ADDRESS=$(cast wallet addr --private-key "$AVS_OWNER")
273+
echo "Avs owner address: $AVS_OWNER_ADDRESS"
274+
275+
# WAVS_SERVICE_MANAGER_ADDRESS=$(jq -r '.addresses.WavsServiceManager' .nodes/avs_deploy.json)
276+
277+
docker run --rm --network host -v ./.nodes:/root/.nodes \
278+
--env-file .env \
279+
wavs-middleware transfer_ownership ${PROXY_OWNER} ${AVS_OWNER}
280+
```
281+
282+
| Environment Variable | Required | Default | Source | Description |
283+
| ------------------------------ | --------------------- | ----------------------------- | ------ | ---------------------------------------------- |
284+
| `DEPLOY_ENV` | for non-default value | `LOCAL` | `.env` | Deployment environment (`LOCAL` or `TESTNET`) |
285+
| `RPC_URL` | for non-default value | `http://localhost:8545` | `.env` | RPC URL |
286+
| `WAVS_SERVICE_MANAGER_ADDRESS` | if not mounted | From `.nodes/avs_deploy.json` | volume | Service manager contract address |
287+
| `FUNDED_KEY` | if not mounted | From `.nodes/deployer` | Volume | Deployer private key |
288+
| `PROXY_OWNER` | Yes | - | Params | New owner for proxy admin |
289+
| `AVS_OWNER` | Yes | - | Params | New owner for AVS registrar and stake registry |
290+
263291
### Delegate to Operator
264292

265293
Delegates tokens to an operator.
@@ -433,6 +461,32 @@ docker run --rm --network host -v ./.nodes:/root/.nodes \
433461
| `DEPLOY_FILE_MOCK` | for non-default value | `mock` | Command line | File name to store mock deployment |
434462
| `CONFIGURE_FILE` | for non-default value | `wavs-mock-config` | Command line | File name to read configuration data |
435463

464+
### 5. Mock Transfer Ownership
465+
466+
Transfers ownership of the mock service contracts to new owners.
467+
468+
```bash
469+
PROXY_OWNER=$(cast wallet new --json | jq -r '.[0].private_key')
470+
PROXY_OWNER_ADDRESS=$(cast wallet addr --private-key "$PROXY_OWNER")
471+
echo "Proxy owner address: $PROXY_OWNER_ADDRESS"
472+
AVS_OWNER=$(cast wallet new --json | jq -r '.[0].private_key')
473+
AVS_OWNER_ADDRESS=$(cast wallet addr --private-key "$AVS_OWNER")
474+
echo "Avs owner address: $AVS_OWNER_ADDRESS"
475+
476+
docker run --rm --network host -v ./.nodes:/root/.nodes \
477+
--env-file .env \
478+
wavs-middleware -m mock transfer_ownership ${PROXY_OWNER} ${AVS_OWNER}
479+
```
480+
481+
| Environment Variable | Required | Default | Source | Description |
482+
| ------------------------------ | --------------------- | --------------------------- | ------------ | ---------------------------------------------- |
483+
| `DEPLOY_ENV` | for non-default value | `LOCAL` | `.env` | Deployment environment (`LOCAL` or `TESTNET`) |
484+
| `MOCK_RPC_URL` | for non-default value | `http://localhost:8546` | Command line | RPC URL for mock blockchain |
485+
| `MOCK_DEPLOYER_KEY` | if not mounted | From `.nodes/mock-deployer` | Volume | Deployer private key |
486+
| `WAVS_SERVICE_MANAGER_ADDRESS` | if not mounted | From `.nodes/mock.json` | Volume | Service manager contract address |
487+
| `PROXY_OWNER` | Yes | - | Params | New owner for proxy admin |
488+
| `AVS_OWNER` | Yes | - | Params | New owner for AVS registrar and stake registry |
489+
436490
## Deploy Testnet
437491

438492
Same as the local deploy, change `DEPLOY_ENV` to `"TESTNET"` and make sure the `FUNDED_KEY` is actually funded on testnet

docker/ECDSA_CLI.md

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,24 @@ docker run --rm --network host -v ./.nodes:/root/.nodes \
121121
docker run --rm --network host -v ./.nodes:/root/.nodes \
122122
--env-file .env \
123123
wavs-middleware unpause
124+
125+
PROXY_OWNER=$(cast wallet new --json | jq -r '.[0].private_key')
126+
PROXY_OWNER_ADDRESS=$(cast wallet addr --private-key "$PROXY_OWNER")
127+
echo "Proxy owner address: $PROXY_OWNER_ADDRESS"
128+
AVS_OWNER=$(cast wallet new --json | jq -r '.[0].private_key')
129+
AVS_OWNER_ADDRESS=$(cast wallet addr --private-key "$AVS_OWNER")
130+
echo "Avs owner address: $AVS_OWNER_ADDRESS"
131+
132+
docker run --rm --network host -v ./.nodes:/root/.nodes \
133+
--env-file .env \
134+
wavs-middleware transfer_ownership ${PROXY_OWNER} ${AVS_OWNER}
124135
```
125136

126137
```bash
127138
MOCK_DEPLOYER_KEY=$(cast wallet new --json | jq -r '.[0].private_key')
128139
MOCK_DEPLOYER_ADDRESS=$(cast wallet addr --private-key "$MOCK_DEPLOYER_KEY")
129140

130141
docker run --rm --network host -v ./.nodes:/root/.nodes \
131-
--env-file .env \
132142
-e MOCK_DEPLOYER_KEY=${MOCK_DEPLOYER_KEY} \
133143
wavs-middleware -m mock deploy
134144

@@ -137,4 +147,14 @@ docker run --rm --network host -v ./.nodes:/root/.nodes \
137147
-v $LOCAL_CONFIG_PATH:/wavs/contracts/deployments/wavs-mock-config.json \
138148
--env-file .env \
139149
wavs-middleware -m mock configure
150+
151+
PROXY_OWNER=$(cast wallet new --json | jq -r '.[0].private_key')
152+
PROXY_OWNER_ADDRESS=$(cast wallet addr --private-key "$PROXY_OWNER")
153+
echo "Proxy owner address: $PROXY_OWNER_ADDRESS"
154+
AVS_OWNER=$(cast wallet new --json | jq -r '.[0].private_key')
155+
AVS_OWNER_ADDRESS=$(cast wallet addr --private-key "$AVS_OWNER")
156+
echo "Avs owner address: $AVS_OWNER_ADDRESS"
157+
158+
docker run --rm --network host -v ./.nodes:/root/.nodes \
159+
wavs-middleware -m mock transfer_ownership ${PROXY_OWNER} ${AVS_OWNER}
140160
```

justfile

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,10 @@ help:
55

66
# builds middleware
77
docker-build TAG="local":
8-
{{SUDO}} docker build . -t ghcr.io/lay3rlabs/wavs-middleware:{{TAG}}
8+
{{SUDO}} docker build . -t ghcr.io/lay3rlabs/wavs-middleware:{{TAG}}
9+
10+
docker-push TAG="local":
11+
{{SUDO}} docker push ghcr.io/lay3rlabs/wavs-middleware:{{TAG}}
12+
13+
dos2unix:
14+
find ./scripts -type f -exec dos2unix {} +
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#!/bin/bash
2+
3+
# -x echos all lines for debug
4+
# set -x
5+
6+
set -o errexit -o nounset -o pipefail
7+
command -v shellcheck >/dev/null && shellcheck "$0"
8+
9+
SCRIPT_DIR="$(realpath "$(dirname "$0")")"
10+
# shellcheck source=../../helper.sh
11+
# shellcheck disable=SC1091
12+
source "$SCRIPT_DIR/../../helper.sh"
13+
14+
# shellcheck source=../foundry_profile.sh
15+
# shellcheck disable=SC1091
16+
source "$SCRIPT_DIR/../foundry_profile.sh"
17+
18+
# Parse command line arguments in key=value format
19+
parse_args "$@"
20+
21+
# Check required parameters with defaults
22+
check_param "DEPLOY_ENV" "${DEPLOY_ENV:-LOCAL}"
23+
DEFAULT_SERVICE_MANAGER=$(jq -r '.addresses.WavsServiceManager' "$HOME/.nodes/avs_deploy.json" 2>/dev/null || true)
24+
check_param "WAVS_SERVICE_MANAGER_ADDRESS" "${WAVS_SERVICE_MANAGER_ADDRESS:-$DEFAULT_SERVICE_MANAGER}"
25+
check_param "PROXY_OWNER" "${PROXY_OWNER:-$1}"
26+
check_param "AVS_OWNER" "${AVS_OWNER:-$2}"
27+
28+
# Set up environment based on DEPLOY_ENV
29+
setup_environment
30+
31+
# Read the deployer private key
32+
deployer_private_key=$(load_deployment_data "$HOME/.nodes/deployer")
33+
check_param "FUNDED_KEY" "${FUNDED_KEY:-$deployer_private_key}"
34+
deployer_address=$(cast wallet address "$FUNDED_KEY")
35+
echo "Deployer address: $deployer_address"
36+
37+
ensure_balance "$deployer_address"
38+
39+
transfer_ecdsa_ownership "$WAVS_SERVICE_MANAGER_ADDRESS" "$PROXY_OWNER" "$AVS_OWNER" "$FUNDED_KEY" "eigen"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#!/bin/bash
2+
3+
# -x echos all lines for debug
4+
# set -x
5+
6+
set -o errexit -o nounset -o pipefail
7+
command -v shellcheck >/dev/null && shellcheck "$0"
8+
9+
SCRIPT_DIR="$(realpath "$(dirname "$0")")"
10+
# shellcheck source=../../helper.sh
11+
# shellcheck disable=SC1091
12+
source "$SCRIPT_DIR/../../helper.sh"
13+
14+
# shellcheck source=../foundry_profile.sh
15+
# shellcheck disable=SC1091
16+
source "$SCRIPT_DIR/../foundry_profile.sh"
17+
18+
# Parse command line arguments in key=value format
19+
parse_args "$@"
20+
21+
# Check required parameters with defaults
22+
check_param "DEPLOY_ENV" "${DEPLOY_ENV:-LOCAL}"
23+
DEFAULT_SERVICE_MANAGER=$(jq -r '.addresses.WavsServiceManager' "$HOME/.nodes/mock.json" 2>/dev/null || true)
24+
check_param "WAVS_SERVICE_MANAGER_ADDRESS" "${WAVS_SERVICE_MANAGER_ADDRESS:-$DEFAULT_SERVICE_MANAGER}"
25+
check_param "PROXY_OWNER" "${PROXY_OWNER:-$1}"
26+
check_param "AVS_OWNER" "${AVS_OWNER:-$2}"
27+
28+
# Set up environment based on DEPLOY_ENV
29+
if [ "$DEPLOY_ENV" = "TESTNET" ]; then
30+
check_param "RPC_URL" "${MOCK_RPC_URL:-}"
31+
else
32+
check_param "RPC_URL" "${MOCK_RPC_URL:-http://localhost:8546}"
33+
fi
34+
35+
# Read the deployer private key
36+
deployer_private_key=$(load_deployment_data "$HOME/.nodes/mock-deployer")
37+
check_param "MOCK_DEPLOYER_KEY" "${MOCK_DEPLOYER_KEY:-$deployer_private_key}"
38+
mock_deployer_address=$(cast wallet address "$MOCK_DEPLOYER_KEY")
39+
echo "Deployer address: $mock_deployer_address"
40+
41+
ensure_balance "$mock_deployer_address"
42+
43+
transfer_ecdsa_ownership "$WAVS_SERVICE_MANAGER_ADDRESS" "$PROXY_OWNER" "$AVS_OWNER" "$MOCK_DEPLOYER_KEY" "mock"

scripts/helper.sh

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,54 @@ load_deployment_data() {
144144
fi
145145
fi
146146
}
147+
148+
transfer_ecdsa_ownership() {
149+
# Arguments (all optional, will fallback to env/params if not provided)
150+
# $1 - WAVS_SERVICE_MANAGER_ADDRESS
151+
# $2 - PROXY_OWNER
152+
# $3 - AVS_OWNER
153+
# $4 - FUNDED_KEY
154+
155+
local wsm_address="${1}"
156+
local proxy_owner="${2}"
157+
local avs_owner="${3}"
158+
local funded_key="${4}"
159+
local mode="${5}"
160+
161+
local avs_registrar_address
162+
if [ "$mode" == "eigen" ]; then
163+
# Get the AllocationManager address from the WAVS Service Manager
164+
local allocation_manager_address
165+
allocation_manager_address=$(cast call "$wsm_address" "getAllocationManager()(address)" --rpc-url "$RPC_URL")
166+
echo "Allocation manager address: $allocation_manager_address"
167+
# Get the AVS Registrar address from the AllocationManager for the WAVS Service Manager
168+
avs_registrar_address=$(cast call "$allocation_manager_address" "getAVSRegistrar(address)(address)" "$wsm_address" --rpc-url "$RPC_URL")
169+
echo "AVS registrar address: $avs_registrar_address"
170+
fi
171+
# Get the StakeRegistry address from the WAVS Service Manager
172+
local stake_registry_address
173+
stake_registry_address=$(cast call "$wsm_address" "getStakeRegistry()(address)" --rpc-url "$RPC_URL")
174+
echo "Stake registry address: $stake_registry_address"
175+
176+
# Get the ProxyAdmin of the WAVS Service Manager
177+
local proxy_admin_address
178+
proxy_admin_address=$(cast storage "$wsm_address" "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103" --rpc-url "$RPC_URL" | tail -n1 | sed 's/^0x000000000000000000000000//')
179+
proxy_admin_address="0x$proxy_admin_address"
180+
echo "Proxy admin address: $proxy_admin_address"
181+
182+
echo "Transferring proxy ownership to $proxy_owner"
183+
cast send "$proxy_admin_address" "transferOwnership(address)" "$proxy_owner" --private-key "$funded_key" --rpc-url "$RPC_URL"
184+
185+
if [ "$mode" == "eigen" ]; then
186+
echo "Transferring avs registrar ownership to $avs_owner"
187+
cast send "$avs_registrar_address" "transferOwnership(address)" "$avs_owner" --private-key "$funded_key" --rpc-url "$RPC_URL"
188+
fi
189+
190+
echo "Transferring stake registry ownership to $avs_owner"
191+
cast send "$stake_registry_address" "transferOwnership(address)" "$avs_owner" --private-key "$funded_key" --rpc-url "$RPC_URL"
192+
193+
echo "Transferring allocation manager ownership to $avs_owner"
194+
cast send "$wsm_address" "transferOwnership(address)" "$avs_owner" --private-key "$funded_key" --rpc-url "$RPC_URL"
195+
196+
echo "Ownership transferred successfully"
197+
}

0 commit comments

Comments
 (0)