Skip to content

Commit

Permalink
Add rinkeby deployment data
Browse files Browse the repository at this point in the history
  • Loading branch information
HickupHH3 committed Dec 15, 2021
1 parent a1347cd commit b6b4224
Show file tree
Hide file tree
Showing 10 changed files with 222 additions and 35 deletions.
6 changes: 3 additions & 3 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
ETHERSCAN_API_KEY=ABC123ABC123ABC123ABC123ABC123ABC1
ROPSTEN_URL=https://eth-ropsten.alchemyapi.io/v2/<YOUR ALCHEMY KEY>
PRIVATE_KEY=0xabc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1
ETHERSCAN_API_KEY=ABC123ABC123ABC123ABC123ABC123ABC1
ROPSTEN_URL=https://eth-ropsten.alchemyapi.io/v2/<YOUR ALCHEMY KEY>
PRIVATE_KEY=0xabc123abc123abc123abc123abc123abc123abc123abc123abc123abc123abc1
2 changes: 1 addition & 1 deletion .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,6 @@ jobs:

# The described bash commands will be executed
- name: Compile
run: yarn && yarn compile
run: yarn && yarn first-compile
- name: Test
run: yarn test-no-compile
7 changes: 7 additions & 0 deletions deployments/rinkebyAddresses.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"deployer": "0xD5388291EAbe96b56069440C97046791E2F72573",
"token": "0x1F61D4b540E8f7f8dA7431cA0F357495cBb8aeA8",
"tokenLock": "0xDcF97275b1F9636a94A73D1c2720EAbA09adEE8A",
"timelock": "0xFA2c6d5f42bf10D4ba9bC8D15667cca32b15b0Ef",
"governor": "0xaDb5d48D2eeE2efE27E749BDd21E22D12F9dc831"
}
93 changes: 93 additions & 0 deletions deployments/rinkebyMerkleTree.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
{
"merkleRoot": "0x07087dd5ec10dc92a26074d31dea66fb039c30cb8bcc5d7536c7f55f116cd77e",
"tokenTotal": "100000000000000000000000000",
"claims": {
"0x3Ab0029e1C4515134464b267557cB80A39902699": {
"index": 0,
"amount": "11000000000000000000000000",
"proof": [
"0xb65812ee50d010a35d33ea8138f51244bab9e1d041b0f2afca957df9637a982d",
"0xaf34733a2233e01ea3c26c3d5c1d395cf0c2932d621755578c3fd6af40078a90",
"0xf92c27197c4488d872550adee9dfb8269d91bf21a007fd46e19d458f8a957b54",
"0xfe7ba1001d74de83047caed30dfb874fd6e9396997ae56e5e7b672f8f502998b"
]
},
"0x5dcEb6f4dc5b64Af6271A5Ab3297DbE3C01dd57B": {
"index": 10,
"amount": "11000000000000000000000000",
"proof": [
"0x35235d9ef7c4d7b7c2b1519977ffe024cbf108c5d12a32d360dd6bf477334ef8",
"0x5f52b1c0c5936654c5c54b6481b19eddcd34dab7a699a0233ad0a7a7c2f9df16",
"0x76a31b34f4818cd9e6d633f2f82154d5ccb70f67aa44fc8ca5c086adcc36be90",
"0xfe7ba1001d74de83047caed30dfb874fd6e9396997ae56e5e7b672f8f502998b"
]
},
"0x670f9e8B37d5816c2eB93A1D94841C66652a8E26": {
"index": 4,
"amount": "12000000000000000000000000",
"proof": [
"0x93fcf76202965e2c3851dc0e7c36fd2432c69c68d79acc9d4391d36f0423ac7e",
"0x7a693601c171ca5669ece423806b262792872018e015ec1da2b81d3ce58f3339",
"0xf92c27197c4488d872550adee9dfb8269d91bf21a007fd46e19d458f8a957b54",
"0xfe7ba1001d74de83047caed30dfb874fd6e9396997ae56e5e7b672f8f502998b"
]
},
"0x697ccd97C8419EBba7347CEF03a0CD02804EbF54": {
"index": 2,
"amount": "11000000000000000000000000",
"proof": [
"0x4432408e5ae10656ac93cdb82fa5850f351f15cd346c7d9d5e632431c85d0acc",
"0x5f52b1c0c5936654c5c54b6481b19eddcd34dab7a699a0233ad0a7a7c2f9df16",
"0x76a31b34f4818cd9e6d633f2f82154d5ccb70f67aa44fc8ca5c086adcc36be90",
"0xfe7ba1001d74de83047caed30dfb874fd6e9396997ae56e5e7b672f8f502998b"
]
},
"0x7C0fb88c87c30eBF70340E25fe47763e53b907cF": {
"index": 1,
"amount": "11000000000000000000000000",
"proof": [
"0x4db967a616609eba85727b9c2c942f1cecc264492d6f3a86fce3906fd1018e7f"
]
},
"0x8498EAb53e03E3143d77B2303eDBdAC6C9041D33": {
"index": 8,
"amount": "11000000000000000000000000",
"proof": [
"0xa3cfae80d8d0bc51cbac2fa27c477d4ba1a5016542a8e2bc1bdc8b37083623ce",
"0xaf34733a2233e01ea3c26c3d5c1d395cf0c2932d621755578c3fd6af40078a90",
"0xf92c27197c4488d872550adee9dfb8269d91bf21a007fd46e19d458f8a957b54",
"0xfe7ba1001d74de83047caed30dfb874fd6e9396997ae56e5e7b672f8f502998b"
]
},
"0x8D31BAC0870e323354eAF6F98277860772FFB2d4": {
"index": 6,
"amount": "11000000000000000000000000",
"proof": [
"0x34be75696b34e420cad14ed4eacad38166457d60ac632cbd02f0541d55e31433",
"0x24ebfbbc07cb37e8b8bdbd8e34e6dfad535b1900258e269110981b5b50aa0736",
"0x76a31b34f4818cd9e6d633f2f82154d5ccb70f67aa44fc8ca5c086adcc36be90",
"0xfe7ba1001d74de83047caed30dfb874fd6e9396997ae56e5e7b672f8f502998b"
]
},
"0xD3488b8C87416946D82CC957178B0863A1F089b2": {
"index": 14,
"amount": "11000000000000000000000000",
"proof": [
"0x0f139d97b83bf4dfa29769b0dcb1aa0ba4516e988a273aa0343206f3c83f1d58",
"0x24ebfbbc07cb37e8b8bdbd8e34e6dfad535b1900258e269110981b5b50aa0736",
"0x76a31b34f4818cd9e6d633f2f82154d5ccb70f67aa44fc8ca5c086adcc36be90",
"0xfe7ba1001d74de83047caed30dfb874fd6e9396997ae56e5e7b672f8f502998b"
]
},
"0xD5388291EAbe96b56069440C97046791E2F72573": {
"index": 12,
"amount": "11000000000000000000000000",
"proof": [
"0x4586c20aaf325b689c6d2cbbbd2e74894ca04caf5726685321bd72265cdf68f7",
"0x7a693601c171ca5669ece423806b262792872018e015ec1da2b81d3ce58f3339",
"0xf92c27197c4488d872550adee9dfb8269d91bf21a007fd46e19d458f8a957b54",
"0xfe7ba1001d74de83047caed30dfb874fd6e9396997ae56e5e7b672f8f502998b"
]
}
}
}
38 changes: 22 additions & 16 deletions hardhat.config.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import * as dotenv from "dotenv";
import * as dotenv from 'dotenv';

import { HardhatUserConfig } from "hardhat/config";
import "@nomiclabs/hardhat-etherscan";
import "@typechain/hardhat";
import "@nomiclabs/hardhat-ethers";
import "@nomiclabs/hardhat-waffle";
import "hardhat-gas-reporter";
import "solidity-coverage";
import "./scripts/deploy";
import {HardhatUserConfig} from 'hardhat/config';
import '@nomiclabs/hardhat-etherscan';
import '@typechain/hardhat';
import '@nomiclabs/hardhat-ethers';
import '@nomiclabs/hardhat-waffle';
import 'hardhat-gas-reporter';
import 'solidity-coverage';
import './scripts/deploy';
import './scripts/verify';

dotenv.config();

Expand All @@ -16,7 +17,7 @@ dotenv.config();

const config: HardhatUserConfig = {
solidity: {
version: "0.8.10",
version: '0.8.10',
settings: {
optimizer: {
enabled: true,
Expand All @@ -25,18 +26,23 @@ const config: HardhatUserConfig = {
},
},
networks: {
ropsten: {
url: process.env.ROPSTEN_URL || "",
accounts:
process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [],
rinkeby: {
chainId: 4,
url: process.env.RINKEBY_URL || '',
accounts: process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [],
},
polygon: {
chainId: 137,
url: process.env.RINKEBY_URL || '',
accounts: process.env.PRIVATE_KEY !== undefined ? [process.env.PRIVATE_KEY] : [],
}
},
typechain: {
target: 'ethers-v5'
target: 'ethers-v5',
},
gasReporter: {
enabled: process.env.REPORT_GAS !== undefined,
currency: "USD",
currency: 'USD',
},
etherscan: {
apiKey: process.env.ETHERSCAN_API_KEY,
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
"scripts": {
"test": "yarn hardhat test",
"test-no-compile": "TS_NODE_TRANSPILE_ONLY=1 yarn hardhat test --no-compile",
"first-compile": "TS_NODE_TRANSPILE_ONLY=1 yarn hardhat typechain",
"compile": "yarn hardhat compile",
"generate-merkle-root": "ts-node ./scripts/airdrop/generate-merkle-root.ts",
"generate-merkle-root:example": "ts-node ./scripts/airdrop/generate-merkle-root.ts -i ./scripts/airdrop/example.json -o resultExample.json",
Expand Down
12 changes: 12 additions & 0 deletions scripts/airdrop/rinkeby.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"0x670f9e8B37d5816c2eB93A1D94841C66652a8E26": "12000000000000000000000000",
"0xD5388291EAbe96b56069440C97046791E2F72573": "11000000000000000000000000",
"0x5dcEb6f4dc5b64Af6271A5Ab3297DbE3C01dd57B": "11000000000000000000000000",
"0x7C0fb88c87c30eBF70340E25fe47763e53b907cF": "11000000000000000000000000",
"0x3Ab0029e1C4515134464b267557cB80A39902699": "11000000000000000000000000",
"0xD3488b8C87416946D82CC957178B0863A1F089b2": "11000000000000000000000000",
"0x8498EAb53e03E3143d77B2303eDBdAC6C9041D33": "11000000000000000000000000",
"0x697ccd97C8419EBba7347CEF03a0CD02804EbF54": "11000000000000000000000000",
"0x8D31BAC0870e323354eAF6F98277860772FFB2d4": "11000000000000000000000000"
}

24 changes: 19 additions & 5 deletions scripts/config.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,26 @@
import {BigNumber as BN, constants} from 'ethers';
import {ONE_DAY, ONE_YEAR} from '../test/shared/Constants';
export const config = {
export const allConfigs: any = {
// rinkeby
4: {
FREE_SUPPLY: BN.from(900).mul(1_000_000).mul(constants.WeiPerEther), // 900M
AIRDROP_SUPPLY: BN.from(100).mul(1_000_000).mul(constants.WeiPerEther), // 100M
CLAIMABLE_PROPORTION: 2000, // 20%
CLAIM_END_DATE: "2022-12-25", // TODO: edit value
VEST_DURATION: 4 * ONE_YEAR, // 4 years
MERKLE_ROOT: '0xf6a3174a6a23755234ca9741160ced7ad3bb030d9beebf34b81c7ccee5521325', // TODO: edit this
CLAIM_END_DATE: '2022-12-25',
VEST_DURATION: 4 * ONE_DAY,
MERKLE_ROOT: '0x07087dd5ec10dc92a26074d31dea66fb039c30cb8bcc5d7536c7f55f116cd77e',
TIMELOCK_DELAY: 1800, // 30 mins
EXPORT_FILENAME: 'rinkebyAddresses.json',
},
// polygon mainnet
137: {
FREE_SUPPLY: BN.from(900).mul(1_000_000).mul(constants.WeiPerEther), // 900M
AIRDROP_SUPPLY: BN.from(100).mul(1_000_000).mul(constants.WeiPerEther), // 100M
CLAIMABLE_PROPORTION: 2000, // 20%
CLAIM_END_DATE: '2022-12-25', // TODO: edit value
VEST_DURATION: 4 * ONE_YEAR,
MERKLE_ROOT: '0x0', // TODO: edit value
TIMELOCK_DELAY: 2 * ONE_DAY, // 2 days (same as ENS)
EXPORT_FILENAME: 'contractAddresses.json'
EXPORT_FILENAME: 'polygonAddresses.json',
},
};
22 changes: 12 additions & 10 deletions scripts/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import {
ArenaGovernor,
} from '../typechain';

import {config} from './config';
import {allConfigs} from './config';

let deployerAddress: string;
let token: ArenaToken;
Expand All @@ -27,10 +27,13 @@ const PROPOSER_ROLE = '0xb09aa5aeb3702cfd50b6b62bc4532604938f21248a27a1d5ca73608
const EXECUTOR_ROLE = '0xd8aa0f3194971a2a116679f7c2090f6939c8d4e01a2a8d7e41d55e5351469e63';

task('deploy', 'deploy contracts').setAction(async (taskArgs, hre) => {
const networkId = (hre.network.config.chainId) as number;
const [deployer] = await hre.ethers.getSigners();
deployerAddress = await deployer.getAddress();
console.log(`Deployer: ${deployerAddress}`);

let config = allConfigs[networkId];

console.log(`deploying token...`);
const TokenFactory = (await hre.ethers.getContractFactory('ArenaToken')) as ArenaToken__factory;
token = await TokenFactory.deploy(
Expand All @@ -56,6 +59,7 @@ task('deploy', 'deploy contracts').setAction(async (taskArgs, hre) => {

await token.setMerkleRoot(config.MERKLE_ROOT);

console.log(`deploying timelock...`);
const TimelockControllerFactory = (await hre.ethers.getContractFactory(
'TimelockController'
)) as TimelockController__factory;
Expand All @@ -67,6 +71,7 @@ task('deploy', 'deploy contracts').setAction(async (taskArgs, hre) => {
await timelock.deployed();
console.log(`timelock address: ${timelock.address}`);

console.log(`deploying governor...`);
const ArenaGovernorFactory = (await hre.ethers.getContractFactory('ArenaGovernor')) as ArenaGovernor__factory;
governor = await ArenaGovernorFactory.deploy(token.address, timelock.address);
await governor.deployed();
Expand All @@ -78,10 +83,7 @@ task('deploy', 'deploy contracts').setAction(async (taskArgs, hre) => {

// set executor role to null address so that ANY address can execute a queued proposal
// https://docs.openzeppelin.com/contracts/4.x/api/governance#timelock-executor
await timelock.grantRole(
EXECUTOR_ROLE,
hre.ethers.constants.AddressZero
);
await timelock.grantRole(EXECUTOR_ROLE, hre.ethers.constants.AddressZero);

// https://docs.openzeppelin.com/contracts/4.x/api/governance#timelock-admin
// Timelock is self-governed, admin role has already been bestowed to itself
Expand Down Expand Up @@ -116,17 +118,16 @@ task('deploy', 'deploy contracts').setAction(async (taskArgs, hre) => {
// null address is given executor role so that any address is allowed to execute proposal
// see onlyRoleOrOpenRole modifier of TimelockController
expect(await timelock.hasRole(EXECUTOR_ROLE, hre.ethers.constants.AddressZero)).to.be.true;

// TokenLock revoker to be timelock
expect(await revokableTokenLock.revoker()).to.be.eq(timelock.address);

// Token's owner should be timelock
expect(await token.owner()).to.be.eq(timelock.address);

// check Token's tokenlock has been set
expect(await token.tokenLock()).to.be.eq(revokableTokenLock.address);


/////////////////////////
// CONFIG VERIFICATION //
/////////////////////////
Expand All @@ -153,11 +154,12 @@ task('deploy', 'deploy contracts').setAction(async (taskArgs, hre) => {
console.log('verification complete!');
console.log('exporting addresses...');
let addressesToExport = {
deployer: deployerAddress,
token: token.address,
tokenLock: revokableTokenLock.address,
timelock: timelock.address,
governor: governor.address
}
governor: governor.address,
};
let exportJson = JSON.stringify(addressesToExport, null, 2);
fs.writeFileSync(config.EXPORT_FILENAME, exportJson);

Expand Down
52 changes: 52 additions & 0 deletions scripts/verify.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import {task} from 'hardhat/config';
import {HardhatRuntimeEnvironment} from 'hardhat/types';
import fs from 'fs';

import {
ArenaToken,
RevokableTokenLock,
TimelockController,
ArenaGovernor,
} from '../typechain';

import {allConfigs} from './config';

let token: ArenaToken;
let revokableTokenLock: RevokableTokenLock;
let timelock: TimelockController;
let governor: ArenaGovernor;

task('verifyContracts', 'verify deployed contracts')
.addParam('i', 'JSON file containing exported addresses')
.setAction(async (taskArgs, hre) => {
const networkId = (hre.network.config.chainId) as number;
console.log('verifying addresses...');
const addresses = JSON.parse(fs.readFileSync(taskArgs.i, 'utf8'));

token = await hre.ethers.getContractAt('ArenaToken', addresses['token']);
revokableTokenLock = await hre.ethers.getContractAt('RevokableTokenLock', addresses['tokenLock']);
timelock = await hre.ethers.getContractAt('TimelockController', addresses['timelock']);
governor = await hre.ethers.getContractAt('ArenaGovernor', addresses['governor']);

let config = allConfigs[networkId];

await verifyContract(hre, token.address, [
config.FREE_SUPPLY,
config.AIRDROP_SUPPLY,
config.CLAIMABLE_PROPORTION,
new Date(config.CLAIM_END_DATE).getTime() / 1000,
config.VEST_DURATION,
]);

await verifyContract(hre, revokableTokenLock.address, [token.address, addresses['deployer']]);
await verifyContract(hre, timelock.address, [config.TIMELOCK_DELAY, [], []]);
await verifyContract(hre, governor.address, [token.address, timelock.address]);
process.exit(0);
});

async function verifyContract(hre: HardhatRuntimeEnvironment, contractAddress: string, ctorArgs: any[]) {
await hre.run('verify:verify', {
address: contractAddress,
constructorArguments: ctorArgs,
});
}

0 comments on commit b6b4224

Please sign in to comment.