mirror of
https://github.com/Instadapp/dsa-governance.git
synced 2024-07-29 22:27:52 +00:00
Merge pull request #3 from Instadapp/deployment-script
Deployment script
This commit is contained in:
commit
3e554c4f3a
|
@ -0,0 +1,3 @@
|
|||
ALCHEMY_ID="<>"
|
||||
ETHERSCAN="<>"
|
||||
PRIVATE_KEY="<>"
|
|
@ -9,15 +9,15 @@ import {
|
|||
} from "./GovernorBravoInterfaces.sol";
|
||||
import { SafeMath } from "./SafeMath.sol";
|
||||
|
||||
contract GovernorBravoDelegate is GovernorBravoDelegateStorageV1, GovernorBravoEvents {
|
||||
contract InstaGovernorBravoDelegate is GovernorBravoDelegateStorageV1, GovernorBravoEvents {
|
||||
/// @notice The name of this contract
|
||||
string public constant name = "DSL Governor Bravo";
|
||||
|
||||
/// @notice The minimum setable proposal threshold
|
||||
uint public constant MIN_PROPOSAL_THRESHOLD = 50000e18; // TODO - Update this
|
||||
uint public constant MIN_PROPOSAL_THRESHOLD = 500000e18; // 500,000
|
||||
|
||||
/// @notice The maximum setable proposal threshold
|
||||
uint public constant MAX_PROPOSAL_THRESHOLD = 100000e18; // TODO - Update this
|
||||
uint public constant MAX_PROPOSAL_THRESHOLD = 50000000e18; // 5,000,000
|
||||
|
||||
/// @notice The minimum setable voting period
|
||||
uint public constant MIN_VOTING_PERIOD = 5760; // About 24 hours
|
||||
|
@ -32,7 +32,7 @@ contract GovernorBravoDelegate is GovernorBravoDelegateStorageV1, GovernorBravoE
|
|||
uint public constant MAX_VOTING_DELAY = 40320; // About 1 week
|
||||
|
||||
/// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed
|
||||
uint public constant quorumVotes = 400000e18; // TODO - Update this
|
||||
uint public constant quorumVotes = 4000000e18; // 4,000,000
|
||||
|
||||
/// @notice The maximum number of actions that can be included in a proposal
|
||||
uint public constant proposalMaxOperations = 10; // 10 actions
|
||||
|
@ -93,22 +93,6 @@ contract GovernorBravoDelegate is GovernorBravoDelegateStorageV1, GovernorBravoE
|
|||
uint endBlock = SafeMath.add(startBlock, votingPeriod);
|
||||
|
||||
proposalCount++;
|
||||
// Proposal memory newProposal = Proposal({
|
||||
// id: proposalCount,
|
||||
// proposer: msg.sender,
|
||||
// eta: 0,
|
||||
// targets: targets,
|
||||
// values: values,
|
||||
// signatures: signatures,
|
||||
// calldatas: calldatas,
|
||||
// startBlock: startBlock,
|
||||
// endBlock: endBlock,
|
||||
// forVotes: 0,
|
||||
// againstVotes: 0,
|
||||
// abstainVotes: 0,
|
||||
// canceled: false,
|
||||
// executed: false
|
||||
// });
|
||||
|
||||
Proposal storage newProposal = proposals[proposalCount];
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ pragma experimental ABIEncoderV2;
|
|||
|
||||
import { GovernorBravoDelegatorStorage, GovernorBravoEvents } from "./GovernorBravoInterfaces.sol";
|
||||
|
||||
contract GovernorBravoDelegator is GovernorBravoDelegatorStorage, GovernorBravoEvents {
|
||||
contract InstaGovernorBravoDelegator is GovernorBravoDelegatorStorage, GovernorBravoEvents {
|
||||
constructor(
|
||||
address timelock_,
|
||||
address admin_,
|
||||
|
|
|
@ -2,7 +2,7 @@ pragma solidity ^0.7.0;
|
|||
|
||||
import "./SafeMath.sol";
|
||||
|
||||
contract Timelock {
|
||||
contract InstaTimelock {
|
||||
using SafeMath for uint;
|
||||
|
||||
event NewAdmin(address indexed newAdmin);
|
||||
|
|
|
@ -4,13 +4,12 @@ pragma experimental ABIEncoderV2;
|
|||
import { TokenDelegateStorageV1, TokenEvents} from "./TokenInterfaces.sol";
|
||||
import { SafeMath } from "./SafeMath.sol";
|
||||
|
||||
// TODO @thrilok209 @KaymasJain - Rename it
|
||||
contract TokenDelegate is TokenDelegateStorageV1, TokenEvents {
|
||||
contract InstaTokenDelegate is TokenDelegateStorageV1, TokenEvents {
|
||||
/// @notice Minimum time between mints
|
||||
uint32 public constant minimumTimeBetweenMints = 1 days * 7; // TODO @thrilok209 @KaymasJain - Replace it
|
||||
uint32 public constant minimumTimeBetweenMints = 1 days * 365; // 365 days
|
||||
|
||||
/// @notice Cap on the percentage of totalSupply that can be minted at each mint
|
||||
uint8 public constant mintCap = 2; // TODO @thrilok209 @KaymasJain - Replace it
|
||||
uint8 public constant mintCap = 2; // 2%
|
||||
|
||||
/// @notice The EIP-712 typehash for the contract's domain
|
||||
bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)");
|
||||
|
|
|
@ -3,13 +3,12 @@ pragma experimental ABIEncoderV2;
|
|||
|
||||
import { TokenDelegatorStorage, TokenEvents } from "./TokenInterfaces.sol";
|
||||
|
||||
contract TokenDelegator is TokenDelegatorStorage, TokenEvents {
|
||||
contract InstaToken is TokenDelegatorStorage, TokenEvents {
|
||||
constructor(
|
||||
address account,
|
||||
address implementation_,
|
||||
uint initialSupply_,
|
||||
uint mintingAllowedAfter_,
|
||||
uint changeImplementationAfter_,
|
||||
bool transferPaused_
|
||||
) {
|
||||
require(implementation_ != address(0), "TokenDelegator::constructor invalid address");
|
||||
|
@ -26,8 +25,6 @@ contract TokenDelegator is TokenDelegatorStorage, TokenEvents {
|
|||
|
||||
implementation = implementation_;
|
||||
|
||||
changeImplementationAfter = changeImplementationAfter_;
|
||||
|
||||
emit NewImplementation(address(0), implementation);
|
||||
}
|
||||
|
||||
|
@ -37,7 +34,6 @@ contract TokenDelegator is TokenDelegatorStorage, TokenEvents {
|
|||
*/
|
||||
function _setImplementation(address implementation_) external isMaster {
|
||||
require(implementation_ != address(0), "TokenDelegator::_setImplementation: invalid implementation address");
|
||||
require(block.timestamp >= changeImplementationAfter, "TokenDelegator::_setImplementation: can change implementation changeImplementationAfter time only");
|
||||
|
||||
address oldImplementation = implementation;
|
||||
implementation = implementation_;
|
||||
|
|
|
@ -39,19 +39,17 @@ contract TokenEvents {
|
|||
}
|
||||
|
||||
contract TokenDelegatorStorage {
|
||||
/// @notice InstaIndex contract
|
||||
IndexInterface constant public instaIndex = IndexInterface(0x2971AdFa57b20E5a416aE5a708A8655A9c74f723);
|
||||
|
||||
/// @notice Active brains of Token
|
||||
address public implementation;
|
||||
|
||||
/// @notice The timestamp after which implementation maybe change
|
||||
uint public changeImplementationAfter;
|
||||
|
||||
/// @notice EIP-20 token name for this token
|
||||
string public name = "<Token Name>"; // TODO - Replace it
|
||||
string public name = "Instadapp";
|
||||
|
||||
/// @notice EIP-20 token symbol for this token
|
||||
string public symbol = "<TKN>"; // TODO - Replace it
|
||||
string public symbol = "INST";
|
||||
|
||||
/// @notice Total number of tokens in circulation
|
||||
uint public totalSupply;
|
||||
|
|
|
@ -4,6 +4,7 @@ require("@nomiclabs/hardhat-etherscan");
|
|||
|
||||
require("dotenv").config();
|
||||
const ALCHEMY_ID = process.env.ALCHEMY_ID;
|
||||
const PRIVATE_KEY = process.env.PRIVATE_KEY;
|
||||
|
||||
// You need to export an object to set up your config
|
||||
// Go to https://hardhat.org/config/ to learn more
|
||||
|
@ -13,7 +14,15 @@ const ALCHEMY_ID = process.env.ALCHEMY_ID;
|
|||
*/
|
||||
module.exports = {
|
||||
defaultNetwork: "hardhat",
|
||||
solidity: "0.7.3",
|
||||
solidity: {
|
||||
version: "0.7.3",
|
||||
settings: {
|
||||
optimizer: {
|
||||
enabled: true,
|
||||
runs: 200
|
||||
}
|
||||
}
|
||||
},
|
||||
networks: {
|
||||
hardhat: {
|
||||
forking: {
|
||||
|
@ -22,9 +31,13 @@ module.exports = {
|
|||
},
|
||||
blockGasLimit: 12000000,
|
||||
},
|
||||
kovan: {
|
||||
url: `https://eth-kovan.alchemyapi.io/v2/${ALCHEMY_ID}`,
|
||||
accounts: [`0x${PRIVATE_KEY}`],
|
||||
gas: 12500000,
|
||||
},
|
||||
},
|
||||
etherscan: {
|
||||
apiKey: process.env.ETHERSCAN
|
||||
}
|
||||
};
|
||||
|
||||
|
|
3
package-lock.json
generated
3
package-lock.json
generated
|
@ -9,7 +9,8 @@
|
|||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@nomiclabs/hardhat-etherscan": "^2.1.1",
|
||||
"dotenv": "^8.2.0"
|
||||
"dotenv": "^8.2.0",
|
||||
"rlp": "^2.2.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nomiclabs/hardhat-ethers": "^2.0.2",
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
},
|
||||
"dependencies": {
|
||||
"@nomiclabs/hardhat-etherscan": "^2.1.1",
|
||||
"dotenv": "^8.2.0"
|
||||
"dotenv": "^8.2.0",
|
||||
"rlp": "^2.2.6"
|
||||
}
|
||||
}
|
||||
|
|
100
scripts/deploy.js
Normal file
100
scripts/deploy.js
Normal file
|
@ -0,0 +1,100 @@
|
|||
const hre = require("hardhat");
|
||||
const RLP = require('rlp');
|
||||
const { ethers } = hre;
|
||||
|
||||
async function main() {
|
||||
const deployerAddress = '0xf6839085F692bDe6A8062573E3DA35E7e947C21E'
|
||||
const initialSupply = ethers.utils.parseEther("100000000") // 100M supply
|
||||
const initialHolder = '0xb1DC62EC38E6E3857a887210C38418E4A17Da5B2'
|
||||
const mintingAfter = 1704067200 // Monday, 1 January 2024 00:00:00
|
||||
const votingPeriod = 17280 // ~3 days in blocks (assuming 15s blocks)
|
||||
const votingDelay = 1 // 1 block
|
||||
const proposalThreshold = ethers.utils.parseEther("1000000") // 1M
|
||||
const timelockDelay = 172800 // ~2 days in blocks (assuming 15s blocks)
|
||||
|
||||
const TokenDelegate = await ethers.getContractFactory("InstaTokenDelegate")
|
||||
const tokenDelegate = await TokenDelegate.deploy()
|
||||
|
||||
await tokenDelegate.deployed()
|
||||
|
||||
const TokenDelegator = await ethers.getContractFactory("InstaToken")
|
||||
const tokenDelegator = await TokenDelegator
|
||||
.deploy(initialHolder, tokenDelegate.address, initialSupply, mintingAfter, false)
|
||||
|
||||
await tokenDelegator.deployed()
|
||||
|
||||
const txCount = await ethers.provider.getTransactionCount(deployerAddress) + 2
|
||||
|
||||
const timelockAddress = '0x' + ethers.utils.keccak256(RLP.encode([deployerAddress, txCount])).slice(12).substring(14)
|
||||
|
||||
const GovernorDelegate = await ethers.getContractFactory("InstaGovernorBravoDelegate")
|
||||
const governorDelegate = await GovernorDelegate.deploy()
|
||||
|
||||
await governorDelegate.deployed()
|
||||
|
||||
const GovernorDelegator = await ethers.getContractFactory("InstaGovernorBravoDelegator")
|
||||
const governorDelegator = await GovernorDelegator
|
||||
.deploy(
|
||||
timelockAddress,
|
||||
timelockAddress,
|
||||
tokenDelegator.address,
|
||||
governorDelegate.address,
|
||||
votingPeriod,
|
||||
votingDelay,
|
||||
proposalThreshold
|
||||
)
|
||||
|
||||
await governorDelegator.deployed()
|
||||
|
||||
const Timelock = await ethers.getContractFactory("InstaTimelock")
|
||||
const timelock = await Timelock.deploy(governorDelegator.address, timelockDelay)
|
||||
|
||||
await timelock.deployed()
|
||||
|
||||
console.log("InstaTokenDelegate: ", tokenDelegate.address)
|
||||
console.log("InstaToken: ", tokenDelegator.address)
|
||||
console.log("InstaTimelock: ", timelock.address)
|
||||
console.log("InstaGovernorBravoDelegate: ", governorDelegate.address)
|
||||
console.log("InstaGovernorBravoDelegator: ", governorDelegator.address)
|
||||
console.log()
|
||||
|
||||
await hre.run("verify:verify", {
|
||||
address: tokenDelegate.address,
|
||||
constructorArguments: []
|
||||
})
|
||||
|
||||
await hre.run("verify:verify", {
|
||||
address: tokenDelegator.address,
|
||||
constructorArguments: [initialHolder, tokenDelegate.address, initialSupply, mintingAfter, false]
|
||||
})
|
||||
|
||||
await hre.run("verify:verify", {
|
||||
address: governorDelegate.address,
|
||||
constructorArguments: []
|
||||
})
|
||||
|
||||
await hre.run("verify:verify", {
|
||||
address: governorDelegator.address,
|
||||
constructorArguments: [
|
||||
timelockAddress,
|
||||
timelockAddress,
|
||||
tokenDelegator.address,
|
||||
governorDelegate.address,
|
||||
votingPeriod,
|
||||
votingDelay,
|
||||
proposalThreshold
|
||||
]
|
||||
})
|
||||
|
||||
await hre.run("verify:verify", {
|
||||
address: timelock.address,
|
||||
constructorArguments: [governorDelegator.address, timelockDelay]
|
||||
})
|
||||
}
|
||||
|
||||
main()
|
||||
.then(() => process.exit(0))
|
||||
.catch(error => {
|
||||
console.error(error);
|
||||
process.exit(1);
|
||||
});
|
Loading…
Reference in New Issue
Block a user