Skip to content

Commit

Permalink
feat(eth-multisig-v4): add script to deploy v1 forwarder
Browse files Browse the repository at this point in the history
  • Loading branch information
gianchandania committed May 16, 2024
1 parent 7ede5be commit c5606ef
Show file tree
Hide file tree
Showing 5 changed files with 100 additions and 3 deletions.
3 changes: 3 additions & 0 deletions .github/workflows/deploy_and_release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ jobs:
MAINNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT: ${{ secrets.MAINNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT }}
TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT: ${{ secrets.TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT }}
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT }}
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP }}
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 }}
Expand Down Expand Up @@ -68,6 +69,7 @@ jobs:
MAINNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT: ${{ secrets.MAINNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT }}
TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT: ${{ secrets.TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT }}
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT }}
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP }}
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 }}
Expand Down Expand Up @@ -125,6 +127,7 @@ jobs:
MAINNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT: ${{ secrets.MAINNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT }}
TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT: ${{ secrets.TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT }}
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT }}
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP }}
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 }}
Expand Down
1 change: 1 addition & 0 deletions .github/workflows/push.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ jobs:
MAINNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT: ${{ secrets.MAINNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT }}
TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT: ${{ secrets.TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT }}
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT }}
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP }}
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 }}
Expand Down
4 changes: 2 additions & 2 deletions hardhat.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ const {
TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT,
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT,
QUICKNODE_ETH_MAINNET_API_KEY,
QUICKNODE_ETH_HOLESKY_API_KEY,
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP,
QUICKNODE_ARBITRUM_SEPOLIA_API_KEY,
QUICKNODE_OPTIMISM_SEPOLIA_API_KEY,
QUICKNODE_ARBITRUM_ONE_API_KEY,
Expand Down Expand Up @@ -70,7 +70,7 @@ const config: HardhatUserConfig = {
},
hteth: {
url: `https://rpc.holesky.ethpandaops.io/`,
accounts: [`${PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT}`]
accounts: [`${PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP}`]
},
matic: {
url: `https://polygon-mainnet.g.alchemyapi.io/v2/${ALCHEMY_POLYGON_API_KEY}`,
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
},
"scripts": {
"deploy-prod": "hardhat run scripts/deploy.ts --network",
"deploy-test": "hardhat run scripts/deploy.ts --network",
"deploy-test": "hardhat run scripts/deployV1Forwarder.ts --network",
"test": "hardhat test",
"coverage": "hardhat coverage",
"solhint": "./node_modules/.bin/solhint --fix 'contracts/**/*.sol'",
Expand Down
93 changes: 93 additions & 0 deletions scripts/deployV1Forwarder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
import { use } from 'chai';
import { ethers } from 'hardhat';
const hre = require('hardhat');
const fs = require('fs');

async function main() {
const output = {
forwarderImplementation: '',
forwarderFactory: ''
};

const feeData = await ethers.provider.getFeeData();
const gasParams = {
gasPrice: feeData.gasPrice
};

const [deployer] = await ethers.getSigners();

let forwarderContractName = 'Forwarder';
let forwarderFactoryContractName = 'ForwarderFactory';

const Forwarder = await ethers.getContractFactory(forwarderContractName);
const forwarder = await Forwarder.deploy(gasParams);
await forwarder.deployed();
output.forwarderImplementation = forwarder.address;
console.log(`${forwarderContractName} deployed at ` + forwarder.address);

const ForwarderFactory = await ethers.getContractFactory(
forwarderFactoryContractName
);
const forwarderFactory = await ForwarderFactory.deploy(
forwarder.address,
gasParams
);
await forwarderFactory.deployed();
output.forwarderFactory = forwarderFactory.address;
console.log(
`${forwarderFactoryContractName} deployed at ` + forwarderFactory.address
);

fs.writeFileSync('output.json', JSON.stringify(output));

// Wait 5 minutes. It takes some time for the etherscan backend to index the transaction and store the contract.
console.log('Waiting for 5 minutes before verifying.....');
await new Promise((r) => setTimeout(r, 1000 * 300));

// We have to wait for a minimum of 10 block confirmations before we can call the etherscan api to verify
await forwarder.deployTransaction.wait(10);
await forwarderFactory.deployTransaction.wait(10);

console.log('Done waiting, verifying');
await verifyContract(forwarderContractName, forwarder.address, []);
await verifyContract(forwarderFactoryContractName, forwarderFactory.address, [
forwarder.address
]);
console.log('Contracts verified');
}

async function verifyContract(
contractName: string,
contractAddress: string,
constructorArguments: string[],
contract?: string
) {
try {
const verifyContractArgs: {
address: string;
constructorArguments: string[];
contract?: string;
} = {
address: contractAddress,
constructorArguments: constructorArguments
};

if (contract) {
verifyContractArgs.contract = contract;
}

await hre.run('verify:verify', verifyContractArgs);
} catch (e) {
// @ts-ignore
// We get a failure API response if the source code has already been uploaded, don't throw in this case.
if (!e.message.includes('Reason: Already Verified')) {
throw e;
}
}
console.log(`Verified ${contractName} on Etherscan!`);
}

main().catch((error) => {
console.error(error);
process.exitCode = 1;
});

0 comments on commit c5606ef

Please sign in to comment.