From 1a55def8942625c058684fc2f539a49a150cce96 Mon Sep 17 00:00:00 2001 From: Prathamesh Musale Date: Tue, 10 Sep 2024 10:52:49 +0530 Subject: [PATCH] Use existing L1 accounts for deployment if found --- .../optimism-contracts/deploy-contracts.sh | 110 +++++++++++------- 1 file changed, 65 insertions(+), 45 deletions(-) diff --git a/config/fixturenet-optimism/optimism-contracts/deploy-contracts.sh b/config/fixturenet-optimism/optimism-contracts/deploy-contracts.sh index d834607..1c142d0 100755 --- a/config/fixturenet-optimism/optimism-contracts/deploy-contracts.sh +++ b/config/fixturenet-optimism/optimism-contracts/deploy-contracts.sh @@ -50,58 +50,78 @@ wait_for_block() { } # We need four accounts and their private keys for the deployment: Admin, Proposer, Batcher, and Sequencer -# If $CERC_L1_ADDRESS and $CERC_L1_PRIV_KEY have been set, we'll assign it to Admin and generate/fund the remaining three accounts from it -# If not, we'll assume the L1 is the stack's own fixturenet-eth and use the pre-funded accounts/keys from $CERC_L1_ACCOUNTS_CSV_URL -if [ -n "$CERC_L1_ADDRESS" ] && [ -n "$CERC_L1_PRIV_KEY" ]; then - wallet1=$(cast wallet new) - wallet2=$(cast wallet new) - wallet3=$(cast wallet new) - # Admin - ADMIN=$CERC_L1_ADDRESS - ADMIN_KEY=$CERC_L1_PRIV_KEY - # Proposer - PROPOSER=$(echo "$wallet1" | awk '/Address:/{print $2}') - PROPOSER_KEY=$(echo "$wallet1" | awk '/Private key:/{print $3}') - # Batcher - BATCHER=$(echo "$wallet2" | awk '/Address:/{print $2}') - BATCHER_KEY=$(echo "$wallet2" | awk '/Private key:/{print $3}') - # Sequencer - SEQ=$(echo "$wallet3" | awk '/Address:/{print $2}') - SEQ_KEY=$(echo "$wallet3" | awk '/Private key:/{print $3}') +# Check if accounts file already exists +l2_accounts_file="/l2-accounts/accounts.json" +if [ -f $l2_accounts_file ]; then + echo "Using existing accounts from $l2_accounts_file." - echo "Funding accounts." - wait_for_block 1 300 - cast send --from $ADMIN --rpc-url $CERC_L1_RPC --value $CERC_PROPOSER_AMOUNT $PROPOSER --private-key $ADMIN_KEY - cast send --from $ADMIN --rpc-url $CERC_L1_RPC --value $CERC_BATCHER_AMOUNT $BATCHER --private-key $ADMIN_KEY -else - curl -o accounts.csv $CERC_L1_ACCOUNTS_CSV_URL - # Admin - ADMIN=$(awk -F ',' 'NR == 1 {print $2}' accounts.csv) - ADMIN_KEY=$(awk -F ',' 'NR == 1 {print $3}' accounts.csv) + ADMIN=$(jq -r .Admin $l2_accounts_file) + ADMIN_KEY=$(jq -r .AdminKey $l2_accounts_file) # Proposer - PROPOSER=$(awk -F ',' 'NR == 2 {print $2}' accounts.csv) - PROPOSER_KEY=$(awk -F ',' 'NR == 2 {print $3}' accounts.csv) + PROPOSER=$(jq -r .Proposer $l2_accounts_file) + PROPOSER_KEY=$(jq -r .ProposerKey $l2_accounts_file) # Batcher - BATCHER=$(awk -F ',' 'NR == 3 {print $2}' accounts.csv) - BATCHER_KEY=$(awk -F ',' 'NR == 3 {print $3}' accounts.csv) + BATCHER=$(jq -r .Batcher $l2_accounts_file) + BATCHER_KEY=$(jq -r .BatcherKey $l2_accounts_file) # Sequencer - SEQ=$(awk -F ',' 'NR == 4 {print $2}' accounts.csv) - SEQ_KEY=$(awk -F ',' 'NR == 4 {print $3}' accounts.csv) + SEQ=$(jq -r .Seq $l2_accounts_file) + SEQ_KEY=$(jq -r .SeqKey $l2_accounts_file) +else + # If $CERC_L1_ADDRESS and $CERC_L1_PRIV_KEY have been set, we'll assign it to Admin and generate/fund the remaining three accounts from it + # If not, we'll assume the L1 is the stack's own fixturenet-eth and use the pre-funded accounts/keys from $CERC_L1_ACCOUNTS_CSV_URL + + if [ -n "$CERC_L1_ADDRESS" ] && [ -n "$CERC_L1_PRIV_KEY" ]; then + echo "Creating new accounts for Optimism deployment." + wallet1=$(cast wallet new) + wallet2=$(cast wallet new) + wallet3=$(cast wallet new) + # Admin + ADMIN=$CERC_L1_ADDRESS + ADMIN_KEY=$CERC_L1_PRIV_KEY + # Proposer + PROPOSER=$(echo "$wallet1" | awk '/Address:/{print $2}') + PROPOSER_KEY=$(echo "$wallet1" | awk '/Private key:/{print $3}') + # Batcher + BATCHER=$(echo "$wallet2" | awk '/Address:/{print $2}') + BATCHER_KEY=$(echo "$wallet2" | awk '/Private key:/{print $3}') + # Sequencer + SEQ=$(echo "$wallet3" | awk '/Address:/{print $2}') + SEQ_KEY=$(echo "$wallet3" | awk '/Private key:/{print $3}') + + echo "Funding accounts..." + wait_for_block 1 300 + cast send --from $ADMIN --rpc-url $CERC_L1_RPC --value $CERC_PROPOSER_AMOUNT $PROPOSER --private-key $ADMIN_KEY + cast send --from $ADMIN --rpc-url $CERC_L1_RPC --value $CERC_BATCHER_AMOUNT $BATCHER --private-key $ADMIN_KEY + else + curl -o accounts.csv $CERC_L1_ACCOUNTS_CSV_URL + # Admin + ADMIN=$(awk -F ',' 'NR == 1 {print $2}' accounts.csv) + ADMIN_KEY=$(awk -F ',' 'NR == 1 {print $3}' accounts.csv) + # Proposer + PROPOSER=$(awk -F ',' 'NR == 2 {print $2}' accounts.csv) + PROPOSER_KEY=$(awk -F ',' 'NR == 2 {print $3}' accounts.csv) + # Batcher + BATCHER=$(awk -F ',' 'NR == 3 {print $2}' accounts.csv) + BATCHER_KEY=$(awk -F ',' 'NR == 3 {print $3}' accounts.csv) + # Sequencer + SEQ=$(awk -F ',' 'NR == 4 {print $2}' accounts.csv) + SEQ_KEY=$(awk -F ',' 'NR == 4 {print $3}' accounts.csv) + fi + + # These accounts will be needed by other containers, so write them to a shared volume + echo "Writing accounts/private keys to volume l2_accounts." + accounts_json=$(jq -n \ + --arg Admin "$ADMIN" --arg AdminKey "$ADMIN_KEY" \ + --arg Proposer "$PROPOSER" --arg ProposerKey "$PROPOSER_KEY" \ + --arg Batcher "$BATCHER" --arg BatcherKey "$BATCHER_KEY" \ + --arg Seq "$SEQ" --arg SeqKey "$SEQ_KEY" \ + '{Admin: $Admin, AdminKey: $AdminKey, Proposer: $Proposer, ProposerKey: $ProposerKey, Batcher: $Batcher, BatcherKey: $BatcherKey, Seq: $Seq, SeqKey: $SeqKey}') + echo "$accounts_json" > $l2_accounts_file fi echo "Using accounts:" echo -e "Admin: $ADMIN\nProposer: $PROPOSER\nBatcher: $BATCHER\nSequencer: $SEQ" -# These accounts will be needed by other containers, so write them to a shared volume -echo "Writing accounts/private keys to volume l2_accounts." -accounts_json=$(jq -n \ - --arg Admin "$ADMIN" --arg AdminKey "$ADMIN_KEY" \ - --arg Proposer "$PROPOSER" --arg ProposerKey "$PROPOSER_KEY" \ - --arg Batcher "$BATCHER" --arg BatcherKey "$BATCHER_KEY" \ - --arg Seq "$SEQ" --arg SeqKey "$SEQ_KEY" \ - '{Admin: $Admin, AdminKey: $AdminKey, Proposer: $Proposer, ProposerKey: $ProposerKey, Batcher: $Batcher, BatcherKey: $BatcherKey, Seq: $Seq, SeqKey: $SeqKey}') -echo "$accounts_json" > "/l2-accounts/accounts.json" - # Get a finalized L1 block to set as the starting point for the L2 deployment # If the chain is a freshly created fixturenet-eth, a finalized block won't be available for many minutes; rather than wait, we can use block 1 echo "Checking L1 for finalized block..." @@ -165,7 +185,7 @@ echo "Done deploying contracts." echo "Generating L2 genesis allocs..." L2_CHAIN_ID=$(jq ".l2ChainID" $deploy_config_file) DEPLOY_CONFIG_PATH=$deploy_config_file \ -CONTRACT_ADDRESSES_PATH=deployments/$DEPLOYMENT_CONTEXT-deploy.json \ +CONTRACT_ADDRESSES_PATH="deployments/$DEPLOYMENT_CONTEXT-deploy.json" \ forge script --chain-id $L2_CHAIN_ID scripts/L2Genesis.s.sol:L2Genesis --sig 'runWithAllUpgrades()' --private-key $ADMIN_KEY cp /app/packages/contracts-bedrock/state-dump-$L2_CHAIN_ID.json allocs-l2.json @@ -173,7 +193,7 @@ echo "Done." echo "*************************************" # Copy files needed by other containers to the appropriate shared volumes -echo "Copying deployment artifacts volume l1_deployment and deploy-config to volume l2_config" +echo "Copying deployment artifacts to volume l1_deployment and deploy-config to volume l2_config" cp /app/packages/contracts-bedrock/deployments/$DEPLOYMENT_CONTEXT-deploy.json /l1-deployment cp /app/packages/contracts-bedrock/deploy-config/$DEPLOYMENT_CONTEXT.json /l2-config cp allocs-l2.json /l2-config