Skip to content

Commit 9b196dd

Browse files
Merge pull request #149 from BitGo/COIN-114-deploy-v1-wallet-factory-contracts
feat(contracts): deploy v1 wallet factory contracts
2 parents 5e4e835 + 234941e commit 9b196dd

File tree

5 files changed

+120
-2
lines changed

5 files changed

+120
-2
lines changed

.github/workflows/deploy_and_release.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ jobs:
2020
TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT: ${{ secrets.TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT }}
2121
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT }}
2222
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP }}
23+
PRIVATE_KEY_FOR_V1_WALLET_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_V1_WALLET_CONTRACT_DEPLOYMENT }}
2324
QUICKNODE_ETH_MAINNET_API_KEY: ${{ secrets.QUICKNODE_ETH_MAINNET_API_KEY }}
2425
QUICKNODE_ETH_HOLESKY_API_KEY: ${{ secrets.QUICKNODE_ETH_HOLESKY_API_KEY }}
2526
QUICKNODE_ARBITRUM_SEPOLIA_API_KEY: ${{ secrets.QUICKNODE_ARBITRUM_SEPOLIA_API_KEY }}
@@ -70,6 +71,7 @@ jobs:
7071
TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT: ${{ secrets.TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT }}
7172
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT }}
7273
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP }}
74+
PRIVATE_KEY_FOR_V1_WALLET_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_V1_WALLET_CONTRACT_DEPLOYMENT }}
7375
QUICKNODE_ETH_HOLESKY_API_KEY: ${{ secrets.QUICKNODE_ETH_HOLESKY_API_KEY }}
7476
QUICKNODE_ARBITRUM_SEPOLIA_API_KEY: ${{ secrets.QUICKNODE_ARBITRUM_SEPOLIA_API_KEY }}
7577
QUICKNODE_OPTIMISM_SEPOLIA_API_KEY: ${{ secrets.QUICKNODE_OPTIMISM_SEPOLIA_API_KEY }}
@@ -128,6 +130,7 @@ jobs:
128130
TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT: ${{ secrets.TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT }}
129131
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT }}
130132
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP }}
133+
PRIVATE_KEY_FOR_V1_WALLET_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_V1_WALLET_CONTRACT_DEPLOYMENT }}
131134
QUICKNODE_ETH_MAINNET_API_KEY: ${{ secrets.QUICKNODE_ETH_MAINNET_API_KEY }}
132135
ETHERSCAN_API_KEY: ${{ secrets.ETHERSCAN_API_KEY }}
133136
ALCHEMY_POLYGON_API_KEY: ${{ secrets.ALCHEMY_POLYGON_API_KEY }}

.github/workflows/push.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ jobs:
2828
TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT: ${{ secrets.TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT }}
2929
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT }}
3030
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP: ${{ secrets.PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP }}
31+
PRIVATE_KEY_FOR_V1_WALLET_CONTRACT_DEPLOYMENT: ${{ secrets.PRIVATE_KEY_FOR_V1_WALLET_CONTRACT_DEPLOYMENT }}
3132
QUICKNODE_ETH_MAINNET_API_KEY: ${{ secrets.QUICKNODE_ETH_MAINNET_API_KEY }}
3233
QUICKNODE_ETH_HOLESKY_API_KEY: ${{ secrets.QUICKNODE_ETH_HOLESKY_API_KEY }}
3334
QUICKNODE_ARBITRUM_SEPOLIA_API_KEY: ${{ secrets.QUICKNODE_ARBITRUM_SEPOLIA_API_KEY }}

hardhat.config.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ const {
1515
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT,
1616
QUICKNODE_ETH_MAINNET_API_KEY,
1717
PRIVATE_KEY_FOR_V4_CONTRACT_DEPLOYMENT_BACKUP,
18+
PRIVATE_KEY_FOR_V1_WALLET_CONTRACT_DEPLOYMENT,
1819
QUICKNODE_ARBITRUM_SEPOLIA_API_KEY,
1920
QUICKNODE_OPTIMISM_SEPOLIA_API_KEY,
2021
QUICKNODE_ARBITRUM_ONE_API_KEY,
@@ -99,7 +100,7 @@ const config: HardhatUserConfig = {
99100
},
100101
topeth: {
101102
url: `${QUICKNODE_OPTIMISM_SEPOLIA_API_KEY}`,
102-
accounts: [`${TESTNET_PRIVATE_KEY_FOR_CONTRACT_DEPLOYMENT}`]
103+
accounts: [`${PRIVATE_KEY_FOR_V1_WALLET_CONTRACT_DEPLOYMENT}`]
103104
},
104105
opeth: {
105106
url: `${QUICKNODE_OPTIMISM_API_KEY}`,

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
},
1111
"scripts": {
1212
"deploy-prod": "hardhat run scripts/deploy.ts --network",
13-
"deploy-test": "hardhat run scripts/deployV1Forwarder.ts --network",
13+
"deploy-test": "hardhat run scripts/deployV1Wallet.ts --network",
1414
"test": "hardhat test",
1515
"coverage": "hardhat coverage",
1616
"solhint": "./node_modules/.bin/solhint --fix 'contracts/**/*.sol'",

scripts/deployV1Wallet.ts

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
import { ethers } from 'hardhat';
2+
const hre = require('hardhat');
3+
const fs = require('fs');
4+
5+
async function main() {
6+
const output = {
7+
walletImplementation: '',
8+
walletFactory: ''
9+
};
10+
11+
const feeData = await ethers.provider.getFeeData();
12+
const gasParams = {
13+
gasPrice: feeData.gasPrice!
14+
};
15+
const [deployer] = await ethers.getSigners();
16+
const selfTransactions = 2;
17+
18+
for (let i = 0; i < selfTransactions; i++) {
19+
const tx = await deployer.sendTransaction({
20+
to: deployer.address,
21+
value: ethers.utils.parseEther('0'),
22+
gasPrice: gasParams.gasPrice
23+
});
24+
await tx.wait();
25+
console.log(`Self transaction with nonce: ${i} complete`);
26+
}
27+
28+
const walletImplementationContractName = 'WalletSimple';
29+
const walletFactoryContractName = 'WalletFactory';
30+
31+
const WalletImplementation = await ethers.getContractFactory(
32+
walletImplementationContractName
33+
);
34+
const walletImplementation = await WalletImplementation.deploy(gasParams);
35+
await walletImplementation.deployed();
36+
output.walletImplementation = walletImplementation.address;
37+
console.log(
38+
`${walletImplementationContractName} deployed at ` +
39+
walletImplementation.address
40+
);
41+
42+
const WalletFactory = await ethers.getContractFactory(
43+
walletFactoryContractName
44+
);
45+
const walletFactory = await WalletFactory.deploy(
46+
walletImplementation.address,
47+
gasParams
48+
);
49+
await walletFactory.deployed();
50+
output.walletFactory = walletFactory.address;
51+
console.log(
52+
`${walletFactoryContractName} deployed at ` + walletFactory.address
53+
);
54+
55+
fs.writeFileSync('output.json', JSON.stringify(output));
56+
57+
// Wait 5 minutes. It takes some time for the etherscan backend to index the transaction and store the contract.
58+
console.log('Waiting for 5 minutes before verifying....');
59+
await new Promise((r) => setTimeout(r, 1000 * 300));
60+
61+
// We have to wait for a minimum of 10 block confirmations before we can call the etherscan api to verify
62+
63+
await walletImplementation.deployTransaction.wait(10);
64+
await walletFactory.deployTransaction.wait(10);
65+
66+
console.log('Done waiting, verifying');
67+
await verifyContract(
68+
walletImplementationContractName,
69+
walletImplementation.address,
70+
[]
71+
);
72+
await verifyContract('WalletFactory', walletFactory.address, [
73+
walletImplementation.address
74+
]);
75+
76+
console.log('Contracts verified');
77+
}
78+
79+
async function verifyContract(
80+
contractName: string,
81+
contractAddress: string,
82+
constructorArguments: string[],
83+
contract?: string
84+
) {
85+
try {
86+
const verifyContractArgs: {
87+
address: string;
88+
constructorArguments: string[];
89+
contract?: string;
90+
} = {
91+
address: contractAddress,
92+
constructorArguments: constructorArguments
93+
};
94+
95+
if (contract) {
96+
verifyContractArgs.contract = contract;
97+
}
98+
99+
await hre.run('verify:verify', verifyContractArgs);
100+
} catch (e) {
101+
// @ts-ignore
102+
// We get a failure API response if the source code has already been uploaded, don't throw in this case.
103+
if (!e.message.includes('Reason: Already Verified')) {
104+
throw e;
105+
}
106+
}
107+
console.log(`Verified ${contractName} on Etherscan!`);
108+
}
109+
110+
main().catch((error) => {
111+
console.error(error);
112+
process.exitCode = 1;
113+
});

0 commit comments

Comments
 (0)