Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions contracts/mocks/mDAIMock.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
pragma solidity 0.5.4;

import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";

import "openzeppelin-solidity/contracts/ownership/Ownable.sol";

import "../DSMath.sol";

contract mDAIMock is DSMath, ERC20, ERC20Detailed, Ownable {
ERC20 dai;

uint256 exchangeRate = uint256(100e20).div(99);

constructor(ERC20 _dai)
public
ERC20()
ERC20Detailed("DMM DAI", "mDAI", 18)
{
dai = _dai;
}
function mint(uint256 daiAmount) public returns (uint256) {
dai.transferFrom(msg.sender, address(this), daiAmount);
uint mintAmount = rdiv(daiAmount, getCurrentExchangeRate()).div(1e9); //div to reduce precision from RAY 1e27 to 1e18 precision of mDAI
_mint(
msg.sender,
mintAmount
);
return mintAmount;
}

function redeem(uint256 mdaiAmount) public returns (uint256) {
uint256 daiAmount = rmul(
mdaiAmount,
getCurrentExchangeRate().div(10)
);
_burn(msg.sender, mdaiAmount);
dai.transfer(msg.sender, daiAmount);
return daiAmount;
}

function redeemUnderlying(uint256 daiAmount) public returns (uint256) {
uint256 mdaiAmount = rdiv(daiAmount, getCurrentExchangeRate()).div(
1e9
);
_burn(msg.sender, mdaiAmount);
dai.transfer(msg.sender, daiAmount);
return daiAmount;
}

function exchangeRateCurrent() public returns (uint256) {
exchangeRate += uint256(1e28).div(100);
return exchangeRate;
}

function getCurrentExchangeRate() public view returns (uint256) {
return exchangeRate;
}

}
62 changes: 62 additions & 0 deletions stakingModel/contracts/mocks/mDAILowWorthMock.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
pragma solidity 0.5.4;

import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";

import "openzeppelin-solidity/contracts/ownership/Ownable.sol";

import "../../../contracts/DSMath.sol";

contract mDAILowWorthMock is DSMath, ERC20, ERC20Detailed, Ownable {
ERC20 dai;

uint256 exchangeRate = uint256(100e28).div(99);

constructor(ERC20 _dai)
public
ERC20()
ERC20Detailed("DMM DAI", "mDAI", 18)
{
dai = _dai;
}
function mint(uint256 daiAmount) public returns (uint256) {
dai.transferFrom(msg.sender, address(this), daiAmount);
uint mintAmount = rdiv(daiAmount, exchangeRateStored()).div(1e9);
_mint(
msg.sender,
mintAmount
);
return mintAmount;
}

function redeem(uint256 mdaiAmount) public returns (uint256) {
uint256 daiAmount = rmul(
mdaiAmount,
exchangeRateStored().div(10)
);

_burn(msg.sender, mdaiAmount);
dai.transfer(msg.sender, daiAmount);
return daiAmount;
}

function redeemUnderlying(uint256 daiAmount) public returns (uint256) {
uint256 mdaiAmount = rdiv(daiAmount, exchangeRateStored().mul(2)).div(
1e9
);
_burn(msg.sender, mdaiAmount);
dai.transfer(msg.sender, daiAmount.div(2));
return daiAmount;
}

function exchangeRateCurrent() public returns (uint256) {
exchangeRate += uint256(1e28).div(100);
return exchangeRate;
}

function exchangeRateStored() public view returns (uint256) {
return exchangeRate.div(2);
}

}
54 changes: 54 additions & 0 deletions stakingModel/contracts/mocks/mDAINonMintableMock.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
pragma solidity 0.5.4;

import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol";
import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";

import "openzeppelin-solidity/contracts/ownership/Ownable.sol";

import "../../../contracts/DSMath.sol";


contract mDAINonMintableMock is DSMath, ERC20, ERC20Detailed, Ownable {
ERC20 dai;

uint256 exchangeRate = uint256(100e28).div(99);

constructor(ERC20 _dai) public ERC20() ERC20Detailed("DMM DAI", "mDAI", 8) {
dai = _dai;
}

function mint(uint256 daiAmount) public returns (uint256) {
dai.transferFrom(msg.sender, address(this), daiAmount);
uint mintAmount = rdiv(daiAmount, exchangeRateStored()).div(1e9);
_mint(msg.sender, mintAmount);
return mintAmount;
}

function redeem(uint256 mdaiAmount) public returns (uint256) {
uint256 daiAmount = rmul(
mdaiAmount,
exchangeRateStored().div(10)
);

_burn(msg.sender, mdaiAmount);
dai.transfer(msg.sender, daiAmount);
return daiAmount;
}

function redeemUnderlying(uint256 daiAmount) public returns (uint256) {
uint256 mdaiAmount = rdiv(daiAmount, exchangeRateStored()).div(1e9);
_burn(msg.sender, mdaiAmount);
dai.transfer(msg.sender, daiAmount);
return daiAmount;
}

function exchangeRateCurrent() public returns (uint256) {
exchangeRate += uint256(1e28).div(100);
return exchangeRate;
}

function exchangeRateStored() public view returns (uint256) {
return exchangeRate;
}
}
46 changes: 40 additions & 6 deletions stakingModel/migrations/3_mainnet.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,15 @@ const fse = require("fs-extra");
const settings = require("./deploy-settings.json");
const daoAddresses = require("../../releases/deployment.json");
const GoodCompoundStaking = artifacts.require("./GoodCompoundStaking.sol");
const GoodDMMStaking = artifacts.require("./GoodDMMStaking.sol");
const FundManager = artifacts.require("./GoodFundManager.sol");
const MarketMaker = artifacts.require("./GoodMarketMaker.sol");
const Reserve = artifacts.require("./GoodReserveCDai.sol");
const Contribution = artifacts.require("./ContributionCalculation.sol");
const BridgeMock = artifacts.require("./BridgeMock.sol");
const DAIMock = artifacts.require("./DAIMock.sol");
const cDAIMock = artifacts.require("./cDAIMock.sol");
const mDAIMock = artifacts.require("./mDAIMock.sol");

const AbsoluteVote = artifacts.require("./AbsoluteVote.sol");
const SchemeRegistrar = artifacts.require("./SchemeRegistrar.sol");
Expand Down Expand Up @@ -37,20 +39,23 @@ module.exports = async function(deployer, network) {
const maindao = daoAddresses[network];
const homedao = daoAddresses[homeNetwork];

let foreignBridgeAddr, daiAddress, cdaiAddress;
let foreignBridgeAddr, daiAddress, cdaiAddress, mdaiAddress;
if (network == "test" || network == "develop") {
const [foreignBridge, dai] = await Promise.all([
deployer.deploy(BridgeMock, maindao.GoodDollar),
deployer.deploy(DAIMock)
]);
const cdai = await deployer.deploy(cDAIMock, dai.address);
const mdai = await deployer.deploy(mDAIMock, dai.address);
foreignBridgeAddr = foreignBridge.address;
daiAddress = dai.address;
cdaiAddress = cdai.address;
mdaiAddress = mdai.address;
} else {
foreignBridgeAddr = maindao.ForeignBridge._foreignBridge;
daiAddress = networkSettings.daiAddress;
cdaiAddress = networkSettings.cdaiAddress;
mdaiAddress = networkSettings.mdaiAddress; // need to add correct address in deployment script
}
const ubiBridgeRecipient = networkAddresses.UBIScheme;
const homeAvatar = homedao.Avatar;
Expand Down Expand Up @@ -101,6 +106,16 @@ module.exports = async function(deployer, network) {
maindao.Identity
);

const goodDMMStakingP = deployer.deploy(
GoodDMMStaking,
daiAddress,
mdaiAddress,
fundManager.address,
networkSettings.blockInterval,
maindao.Avatar,
maindao.Identity
);

const reserveP = deployer.deploy(
Reserve,
daiAddress,
Expand All @@ -113,20 +128,28 @@ module.exports = async function(deployer, network) {
contribcalc.address,
networkSettings.blockInterval
);
const [goodCompoundStaking, reserve] = await Promise.all([goodCompoundStakingP, reserveP]);
const [goodCompoundStaking, goodDMMStaking, reserve] = await Promise.all([goodCompoundStakingP, goodDMMStakingP, reserveP]);
await marketmaker.initializeToken(
cdaiAddress,
"100", //1gd
"10000", //0.0001 cDai
"1000000" //100% rr
);

await marketmaker.initializeToken(
mdaiAddress,
"100", //1gd
"10000", //0.0001 cDai
"1000000" //100% rr
);

await marketmaker.transferOwnership(reserve.address);

console.log("proposing reserve and fundmanager to DAO");
const absoluteVote = await AbsoluteVote.at(maindao.AbsoluteVote);
const schemeRegistrar = await SchemeRegistrar.at(maindao.SchemeRegistrar);

const [p1, p2, p3] = await Promise.all([
const [p1, p2, p3, p4] = await Promise.all([
schemeRegistrar.proposeScheme(
maindao.Avatar,
reserve.address,
Expand All @@ -147,22 +170,31 @@ module.exports = async function(deployer, network) {
NULL_HASH,
"0x00000010",
NULL_HASH
),
schemeRegistrar.proposeScheme(
maindao.Avatar,
goodDMMStaking.address,
NULL_HASH,
"0x00000010",
NULL_HASH
)
]);

let proposalId1 = p1.logs[0].args._proposalId;
let proposalId2 = p2.logs[0].args._proposalId;
let proposalId3 = p3.logs[0].args._proposalId;
let proposalId4 = p4.logs[0].args._proposalId;

console.log("voting...");
await Promise.all([
...founders.map(f => absoluteVote.vote(proposalId1, 1, 0, f)),
...founders.map(f => absoluteVote.vote(proposalId2, 1, 0, f)),
...founders.map(f => absoluteVote.vote(proposalId3, 1, 0, f))
...founders.map(f => absoluteVote.vote(proposalId3, 1, 0, f)),
...founders.map(f => absoluteVote.vote(proposalId4, 1, 0, f))
]);

console.log("starting...");
await Promise.all([reserve.start(), fundManager.start(), goodCompoundStaking.start()]);
await Promise.all([reserve.start(), fundManager.start(), goodCompoundStaking.start(), goodDMMStaking.start()]);

console.log("deploying fund manager setReserve scheme...");
const setReserve = await deployer.deploy(
Expand Down Expand Up @@ -194,12 +226,14 @@ module.exports = async function(deployer, network) {
let releasedContracts = {
...networkAddresses,
FundManager: fundManager.address,
DAIStaking: goodCompoundStaking.address,
DAICompoundStaking: goodCompoundStaking.address,
DAIDMMStaking: goodDMMStaking.address,
Reserve: reserve.address,
MarketMaker: marketmaker.address,
Contribution: contribcalc.address,
DAI: daiAddress,
cDAI: cdaiAddress,
mDAI: mdaiAddress,
ForeignBridge: foreignBridgeAddr,
network,
networkId: parseInt(deployer.network_id)
Expand Down
Loading