From 0e029156c63db968577830fb5032c3044772d543 Mon Sep 17 00:00:00 2001 From: alvarof2 Date: Fri, 17 May 2024 14:59:23 +0200 Subject: [PATCH] GH Action to deploy celo4 contracts --- .github/workflows/contracts-celo.yaml | 99 ++++++++++++++++ .../getting-started/config-vars-celo.sh | 112 ++++++++++++++++++ 2 files changed, 211 insertions(+) create mode 100644 .github/workflows/contracts-celo.yaml create mode 100755 packages/contracts-bedrock/scripts/getting-started/config-vars-celo.sh diff --git a/.github/workflows/contracts-celo.yaml b/.github/workflows/contracts-celo.yaml new file mode 100644 index 000000000000..55b706c70e6f --- /dev/null +++ b/.github/workflows/contracts-celo.yaml @@ -0,0 +1,99 @@ +name: Alfajores-Holesky Deploy Celo4 L1 Contracts +on: + workflow_dispatch: + inputs: + deploy_contracts: + required: false + type: boolean + default: true + contracts_tag: + required: false + type: string + default: 'celo4' + deployment_context: + required: false + type: string + default: 'test-celo4' + l2_chain_id: + required: false + default: '42069' + +jobs: + deploy-contracts: + runs-on: ubuntu-latest + permissions: # Must change the job token permissions to use Akeyless JWT auth + id-token: write + contents: read + if: ${{ ! startsWith(github.triggering_actor, 'akeyless') }} + env: + DEPLOY_CONTRACTS: ${{ github.event_name == 'push' && 'true' || inputs.deploy_contracts }} + CONTRACTS_TAG: ${{ github.event_name == 'push' && 'op-contracts/v1.3.0' || inputs.contracts_tag }} + DEPLOYMENT_CONTEXT: ${{ github.event_name == 'push' && 'test' || inputs.deployment_context }} + L2_CHAIN_ID: ${{ github.event_name == 'push' && '42069' || inputs.l2_chain_id }} + L1_CHAIN_ID: '17000' # Holesky + L1_RPC_URL: 'https://ethereum-holesky-rpc.publicnode.com' + GS_ADMIN_ADDRESS: '0xb2397dF29AFB4B4661559436180019bEb7912985' + GS_BATCHER_ADDRESS: '0x7fDBe8F4D22ab511340667d7Ce5675568d09eBB4' + GS_PROPOSER_ADDRESS: '0xdCf30236Fa0aBE2ca0BEc2eE0a2F40b16A144DB3' + GS_SEQUENCER_ADDRESS: '0x3e2Df8efB6fA1d6E6021572a99BB67BA9ab2C59D' + steps: + + - name: "Get GitHub Token from Akeyless" + id: get_auth_token + uses: + docker://us-west1-docker.pkg.dev/devopsre/akeyless-public/akeyless-action:latest + with: + api-url: https://api.gateway.akeyless.celo-networks-dev.org + access-id: p-kf9vjzruht6l + dynamic-secrets: '{"/dynamic-secrets/keys/github/optimism/contents=write,pull_requests=write":"PAT"}' + + # "/static-secrets/devops-circle/alfajores/op-testnet-alfajores/HOLESKY_QUICKNODE_URL":"L1_RPC_URL", + - name: Akeyless get secrets + uses: docker://us-west1-docker.pkg.dev/devopsre/akeyless-public/akeyless-action:latest + with: + api-url: https://api.gateway.akeyless.celo-networks-dev.org + access-id: p-kf9vjzruht6l + static-secrets: '{ + "/static-secrets/devops-circle/alfajores/op-testnet-alfajores/GS_ADMIN_PRIVATE_KEY":"GS_ADMIN_PRIVATE_KEY" + }' + + - name: "Checkout" + uses: actions/checkout@v4 + with: + token: ${{ env.PAT }} + submodules: recursive + fetch-depth: 0 + + - name: Setup + uses: ./.github/actions/setup + + - name: Generate config JSON + run: | + cd packages/contracts-bedrock + ./scripts/getting-started/config-vars-celo.sh + + - name: Deploy L1 contracts + if: ${{ env.DEPLOY_CONTRACTS != 'false' }} + run: | + export IMPL_SALT=$(openssl rand -hex 32) + cd packages/contracts-bedrock + echo "Broadcasting ..." + forge script scripts/Deploy.s.sol:Deploy --private-key $GS_ADMIN_PRIVATE_KEY --broadcast --rpc-url $L1_RPC_URL + + - name: Generate genesis files + run: | + mkdir -p l2-config-files/$DEPLOYMENT_CONTEXT + cd op-node + go run cmd/main.go genesis l2 \ + --deploy-config ../packages/contracts-bedrock/deploy-config/$DEPLOYMENT_CONTEXT.json \ + --l1-deployments ../packages/contracts-bedrock/deployments/$DEPLOYMENT_CONTEXT/.deploy \ + --outfile.l2 ../l2-config-files/$DEPLOYMENT_CONTEXT/genesis-$(date +%s).json \ + --outfile.rollup ../l2-config-files/$DEPLOYMENT_CONTEXT/rollup-$(date +%s).json \ + --l1-rpc $L1_RPC_URL + + - name: "Commit genesis files" + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: '[Automatic] - Commit genesis files' + branch: alvarof2/contracts + file_pattern: 'l2-config-files packages/contracts-bedrock/**' diff --git a/packages/contracts-bedrock/scripts/getting-started/config-vars-celo.sh b/packages/contracts-bedrock/scripts/getting-started/config-vars-celo.sh new file mode 100755 index 000000000000..52520eb0d07b --- /dev/null +++ b/packages/contracts-bedrock/scripts/getting-started/config-vars-celo.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash + +# This script is used to generate the getting-started.json configuration file +# used in the Getting Started quickstart guide on the docs site. Avoids the +# need to have the getting-started.json committed to the repo since it's an +# invalid JSON file when not filled in, which is annoying. + +reqenv() { + if [ -z "${!1}" ]; then + echo "Error: environment variable '$1' is undefined" + exit 1 + fi +} + +# Check required environment variables +reqenv "GS_ADMIN_ADDRESS" +reqenv "GS_BATCHER_ADDRESS" +reqenv "GS_PROPOSER_ADDRESS" +reqenv "GS_SEQUENCER_ADDRESS" +reqenv "L1_RPC_URL" + +# Get the finalized block timestamp and hash +block=$(cast block finalized --rpc-url "$L1_RPC_URL") +timestamp=$(echo "$block" | awk '/timestamp/ { print $2 }') +blockhash=$(echo "$block" | awk '/hash/ { print $2 }') + +# Generate the config file +config=$(cat << EOL +{ + "l1StartingBlockTag": "$blockhash", + + "l1ChainID": $L1_CHAIN_ID, + "l2ChainID": $L2_CHAIN_ID, + "l2BlockTime": 2, + "l1BlockTime": 12, + + "maxSequencerDrift": 600, + "sequencerWindowSize": 3600, + "channelTimeout": 300, + + "p2pSequencerAddress": "$GS_SEQUENCER_ADDRESS", + "batchInboxAddress": "0xff00000000000000000000000000000000042069", + "batchSenderAddress": "$GS_BATCHER_ADDRESS", + + "l2OutputOracleSubmissionInterval": 120, + "l2OutputOracleStartingBlockNumber": 0, + "l2OutputOracleStartingTimestamp": $timestamp, + + "l2OutputOracleProposer": "$GS_PROPOSER_ADDRESS", + "l2OutputOracleChallenger": "$GS_ADMIN_ADDRESS", + + "finalizationPeriodSeconds": 12, + + "proxyAdminOwner": "$GS_ADMIN_ADDRESS", + "baseFeeVaultRecipient": "$GS_ADMIN_ADDRESS", + "l1FeeVaultRecipient": "$GS_ADMIN_ADDRESS", + "sequencerFeeVaultRecipient": "$GS_ADMIN_ADDRESS", + "finalSystemOwner": "$GS_ADMIN_ADDRESS", + "superchainConfigGuardian": "$GS_ADMIN_ADDRESS", + + "baseFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000", + "l1FeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000", + "sequencerFeeVaultMinimumWithdrawalAmount": "0x8ac7230489e80000", + "baseFeeVaultWithdrawalNetwork": 0, + "l1FeeVaultWithdrawalNetwork": 0, + "sequencerFeeVaultWithdrawalNetwork": 0, + + "gasPriceOracleOverhead": 2100, + "gasPriceOracleScalar": 1000000, + + "enableGovernance": true, + "governanceTokenSymbol": "OP", + "governanceTokenName": "Optimism", + "governanceTokenOwner": "$GS_ADMIN_ADDRESS", + + "l2GenesisBlockGasLimit": "0x1c9c380", + "l2GenesisBlockBaseFeePerGas": "0x3b9aca00", + "l2GenesisRegolithTimeOffset": "0x0", + + "eip1559Denominator": 50, + "eip1559DenominatorCanyon": 250, + "eip1559Elasticity": 6, + + "l2GenesisDeltaTimeOffset": null, + "l2GenesisCanyonTimeOffset": "0x0", + + "systemConfigStartBlock": 0, + + "requiredProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000", + "recommendedProtocolVersion": "0x0000000000000000000000000000000000000000000000000000000000000000", + + "faultGameAbsolutePrestate": "0x03c7ae758795765c6664a5d39bf63841c71ff191e9189522bad8ebff5d4eca98", + "faultGameMaxDepth": 44, + "faultGameMaxDuration": 1200, + "faultGameGenesisBlock": 0, + "faultGameGenesisOutputRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", + "faultGameSplitDepth": 14, + + "preimageOracleMinProposalSize": 1800000, + "preimageOracleChallengePeriod": 86400, + + "fundDevAccounts": false, + "useFaultProofs": false, + "proofMaturityDelaySeconds": 604800, + "disputeGameFinalityDelaySeconds": 302400, + "respectedGameType": 0 +} +EOL +) + +# Write the config file +echo "$config" > deploy-config/$DEPLOYMENT_CONTEXT.json