From fb224eb188ff563e5399b921bb8bc4a5a2ef1fd6 Mon Sep 17 00:00:00 2001 From: Mohammed Ryaan Date: Thu, 12 Sep 2024 17:53:57 +0530 Subject: [PATCH] feat(eth-multisig-v4): add deploy batcher smart contract in workflow TICKET: COIN-716 --- .github/workflows/deploy_batcher_contract.yml | 128 ++++++++++++++++++ hardhat.config.ts | 1 + package.json | 1 + scripts/deployBatcherContract.ts | 4 - utils/updateRelease.js | 41 ++++++ 5 files changed, 171 insertions(+), 4 deletions(-) create mode 100644 .github/workflows/deploy_batcher_contract.yml create mode 100644 utils/updateRelease.js diff --git a/.github/workflows/deploy_batcher_contract.yml b/.github/workflows/deploy_batcher_contract.yml new file mode 100644 index 0000000..1abfb7c --- /dev/null +++ b/.github/workflows/deploy_batcher_contract.yml @@ -0,0 +1,128 @@ +name: Deploy Batcher Contract and Update Release +on: + release: + types: [published] +jobs: + lint-and-test: + environment: dev + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + cache: 'npm' + - run: npm install + - run: npm run lint + - run: npm run test + env: + PRIVATE_KEY_FOR_BATCHER_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_BATCHER_CONTRACT_DEPLOYMENT }} + QUICKNODE_ETH_MAINNET_API_KEY: ${{ secrets.QUICKNODE_ETH_MAINNET_API_KEY }} + QUICKNODE_ETH_HOLESKY_API_KEY: ${{ secrets.QUICKNODE_ETH_HOLESKY_API_KEY }} + QUICKNODE_ARBITRUM_SEPOLIA_API_KEY: ${{ secrets.QUICKNODE_ARBITRUM_SEPOLIA_API_KEY }} + QUICKNODE_ARBITRUM_ONE_API_KEY: ${{ secrets.QUICKNODE_ARBITRUM_ONE_API_KEY }} + QUICKNODE_OPTIMISM_SEPOLIA_API_KEY: ${{ secrets.QUICKNODE_OPTIMISM_SEPOLIA_API_KEY }} + QUICKNODE_OPTIMISM_API_KEY: ${{ secrets.QUICKNODE_OPTIMISM_API_KEY }} + QUICKNODE_ZKSYNC_SEPOLIA_API_KEY: ${{ secrets.QUICKNODE_ZKSYNC_SEPOLIA_API_KEY }} + ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }} + ALCHEMY_POLYGON_API_KEY: ${{ secrets.ALCHEMY_POLYGON_API_KEY }} + POLYGONSCAN_API_KEY: ${{ secrets.POLYGONSCAN_API_KEY }} + BSCSCAN_API_KEY: ${{ secrets.BSCSCAN_API_KEY }} + ARBISCAN_API_KEY: ${{ secrets.ARBISCAN_API_KEY }} + OPTIMISTIC_ETHERSCAN_API_KEY: ${{ secrets.OPTIMISTIC_ETHERSCAN_API_KEY }} + ZKSYNC_EXPLORER_API_KEY: ${{ secrets.ZKSYNC_EXPLORER_API_KEY }} + BASESCAN_API_KEY: ${{ secrets.BASESCAN_API_KEY }} + BARTIO_BERA_EXPLORER_API_KEY: ${{ secrets.BARTIO_BERA_EXPLORER_API_KEY }} + get-network: + runs-on: ubuntu-latest + needs: [lint-and-test] + outputs: + network: ${{steps.network-name.outputs.result}} + steps: + - name: GET NETWORK NAME + id: network-name + uses: actions/github-script@v7 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + result-encoding: string + script: | + const tag = process.env.GITHUB_REF_NAME; + const regex = /v.*\-(eth|hteth|matic|tmatic|bsc|tbsc|arbeth|tarbeth|opeth|topeth|zketh|tzketh|baseeth|tbaseeth|bera|tbera|tavaxc|avaxc)$/; + const matchedNetwork = tag.match(regex); + if (!matchedNetwork) { + console.log("No match found for the network name, defaulting to 'hteth'."); + return "hteth"; + } + return matchedNetwork[1]; + deploy-batcher-contract-to-test: + runs-on: ubuntu-latest + needs: [lint-and-test, get-network] + if: ${{ (needs.get-network.outputs.network == 'hteth' ) || (needs.get-network.outputs.network == 'tmatic' ) || (needs.get-network.outputs.network == 'tbsc' ) || (needs.get-network.outputs.network == 'tarbeth' ) || (needs.get-network.outputs.network == 'topeth' ) || (needs.get-network.outputs.network == 'tzketh' ) || (needs.get-network.outputs.network == 'tbaseeth' ) || (needs.get-network.outputs.network == 'tbera' ) || (needs.get-network.outputs.network == 'tavaxc' ) }} + environment: testnet + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: 16.x + cache: 'npm' + - run: npm install + - run: npm run deploy-batcher --network ${{ needs.get-network.outputs.network }} + env: + PRIVATE_KEY_FOR_BATCHER_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_BATCHER_CONTRACT_DEPLOYMENT }} + QUICKNODE_ETH_HOLESKY_API_KEY: ${{ secrets.QUICKNODE_ETH_HOLESKY_API_KEY }} + QUICKNODE_ARBITRUM_SEPOLIA_API_KEY: ${{ secrets.QUICKNODE_ARBITRUM_SEPOLIA_API_KEY }} + QUICKNODE_OPTIMISM_SEPOLIA_API_KEY: ${{ secrets.QUICKNODE_OPTIMISM_SEPOLIA_API_KEY }} + QUICKNODE_ZKSYNC_SEPOLIA_API_KEY: ${{ secrets.QUICKNODE_ZKSYNC_SEPOLIA_API_KEY }} + ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }} + ALCHEMY_POLYGON_API_KEY: ${{ secrets.ALCHEMY_POLYGON_API_KEY }} + POLYGONSCAN_API_KEY: ${{ secrets.POLYGONSCAN_API_KEY }} + BSCSCAN_API_KEY: ${{ secrets.BSCSCAN_API_KEY }} + ARBISCAN_API_KEY: ${{ secrets.ARBISCAN_API_KEY }} + OPTIMISTIC_ETHERSCAN_API_KEY: ${{ secrets.OPTIMISTIC_ETHERSCAN_API_KEY }} + ZKSYNC_EXPLORER_API_KEY: ${{ secrets.ZKSYNC_EXPLORER_API_KEY }} + BASESCAN_API_KEY: ${{ secrets.BASESCAN_API_KEY }} + BARTIO_BERA_EXPLORER_API_KEY: ${{ secrets.BARTIO_BERA_EXPLORER_API_KEY }} + - name: Update release notes + uses: actions/github-script@v7 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const updateRelease = require('./utils/updateRelease.js'); + await updateRelease({ github, context }); + + deploy-batcher-contract-to-prod: + runs-on: ubuntu-latest + needs: [lint-and-test, get-network] + if: ${{ (needs.get-network.outputs.network == 'eth' ) || (needs.get-network.outputs.network == 'matic' ) || (needs.get-network.outputs.network == 'bsc' ) || (needs.get-network.outputs.network == 'arbeth' ) || (needs.get-network.outputs.network == 'opeth' ) || (needs.get-network.outputs.network == 'zketh' ) || (needs.get-network.outputs.network == 'baseeth' ) || (needs.get-network.outputs.network == 'bera' ) || (needs.get-network.outputs.network == 'avaxc' )}} + environment: mainnet + steps: + - uses: actions/checkout@v4 + - name: Use Node.js + uses: actions/setup-node@v4 + with: + node-version: 16.x + cache: 'npm' + - run: npm install + - run: npm run deploy-batcher --network ${{ needs.get-network.outputs.network }} + env: + PRIVATE_KEY_FOR_BATCHER_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_BATCHER_CONTRACT_DEPLOYMENT }} + QUICKNODE_ETH_MAINNET_API_KEY: ${{ secrets.QUICKNODE_ETH_MAINNET_API_KEY }} + ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }} + ALCHEMY_POLYGON_API_KEY: ${{ secrets.ALCHEMY_POLYGON_API_KEY }} + POLYGONSCAN_API_KEY: ${{ secrets.POLYGONSCAN_API_KEY }} + BSCSCAN_API_KEY: ${{ secrets.BSCSCAN_API_KEY }} + ARBISCAN_API_KEY: ${{ secrets.ARBISCAN_API_KEY }} + OPTIMISTIC_ETHERSCAN_API_KEY: ${{ secrets.OPTIMISTIC_ETHERSCAN_API_KEY }} + ZKSYNC_EXPLORER_API_KEY: ${{ secrets.ZKSYNC_EXPLORER_API_KEY }} + BARTIO_BERA_EXPLORER_API_KEY: ${{ secrets.BARTIO_BERA_EXPLORER_API_KEY }} + QUICKNODE_ARBITRUM_ONE_API_KEY: ${{ secrets.QUICKNODE_ARBITRUM_ONE_API_KEY }} + QUICKNODE_OPTIMISM_API_KEY: ${{ secrets.QUICKNODE_OPTIMISM_API_KEY }} + BASESCAN_API_KEY: ${{ secrets.BASESCAN_API_KEY }} + - name: Update release notes + uses: actions/github-script@v7 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const updateRelease = require('./utils/updateRelease.js'); + await updateRelease({ github, context }); diff --git a/hardhat.config.ts b/hardhat.config.ts index 9ba923a..b99d080 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -16,6 +16,7 @@ const { QUICKNODE_ETH_MAINNET_API_KEY, PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP, PRIVATE_KEY_FOR_V1_WALLET_CONTRACT_DEPLOYMENT, + PRIVATE_KEY_FOR_BATCHER_CONTRACT_DEPLOYMENT, QUICKNODE_ARBITRUM_SEPOLIA_API_KEY, QUICKNODE_OPTIMISM_SEPOLIA_API_KEY, QUICKNODE_ARBITRUM_ONE_API_KEY, diff --git a/package.json b/package.json index 57efbd2..8d19327 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "scripts": { "deploy-prod": "hardhat run scripts/deployV1FactoryContracts.ts --network", "deploy-test": "hardhat run scripts/deploy.ts --network", + "deploy-batcher" : "hardhat run scripts/deployBatcherContract.ts --network", "test": "hardhat test", "coverage": "hardhat coverage", "solhint": "./node_modules/.bin/solhint --fix 'contracts/**/*.sol'", diff --git a/scripts/deployBatcherContract.ts b/scripts/deployBatcherContract.ts index 70e48f7..67c5c14 100644 --- a/scripts/deployBatcherContract.ts +++ b/scripts/deployBatcherContract.ts @@ -4,10 +4,6 @@ const fs = require('fs'); async function main() { const output = { - walletImplementation: '', - walletFactory: '', - forwarderImplementation: '', - forwarderFactory: '', batcher: '' }; diff --git a/utils/updateRelease.js b/utils/updateRelease.js new file mode 100644 index 0000000..31ae7fa --- /dev/null +++ b/utils/updateRelease.js @@ -0,0 +1,41 @@ +const fs = require('fs'); + +module.exports = async ({ github, context }) => { + let json; + let html = []; + + // Read and parse the JSON file + try { + json = JSON.parse(fs.readFileSync('./output.json').toString()); + for (const key in json) { + html.push(`${key}: ${json[key]}`); + } + } catch (err) { + console.error("Error reading or parsing 'output.json':", err.message); + return; + } + + // Join the HTML content + let htmlContent = html.join('
'); + + try { + // Fetch the release by tag + const response = await github.rest.repos.getReleaseByTag({ + owner: context.repo.owner, + repo: context.repo.repo, + tag: context.payload.release.tag_name + }); + + // Update the release with the new notes + await github.rest.repos.updateRelease({ + owner: context.repo.owner, + repo: context.repo.repo, + release_id: response.data.id, + body: htmlContent + }); + + } catch (err) { + console.error("Error fetching or updating the release:", err.message); + throw err; + } +};