Skip to content

Commit

Permalink
Update exchange2.sol
Browse files Browse the repository at this point in the history
  • Loading branch information
weiqiushi committed Apr 26, 2024
1 parent 8d79cfc commit 58782c9
Showing 1 changed file with 49 additions and 47 deletions.
96 changes: 49 additions & 47 deletions contracts/exchange2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -3,54 +3,47 @@ pragma solidity ^0.8.0;

import "./dmc2.sol";
import "./gwt2.sol";
import "./public_data_storage2.sol";
import "./dividend.sol";

contract Exchange2 {
DMC2 dmcToken;
GWTToken2 gwtToken;

address fundationIncome;
DividendContract fundationIncome;

// 当前周期,也可以看做周期总数
uint256 current_circle = 1;
uint256 current_mine_circle_start;
uint256 current_dmc_balance = 0;

// 这个周期内还能mint多少DMC
uint256 remain_dmc_balance = 0;
uint256 current_circle_dmc_balance = 0;
uint256 current_finish_time = 0;
uint256 dmc2gwt_rate = 210;
uint256 total_addtion_dmc_balance = 0;

// 没有挖完的周期总数
uint256 addtion_circle_count = 0;

uint256 min_circle_time = 100;



constructor(address _dmcToken, address _gwtToken, address _publicDataStorage, address _fundationIncome) {
constructor(address _dmcToken, address _gwtToken, address _fundationIncome) {
dmcToken = DMC2(_dmcToken);
gwtToken = GWTToken2(_gwtToken);
publicDataStorage = PublicDataStorage2(_publicDataStorage);
fundationIncome = _fundationIncome;
}

function getExchangeRate() public view returns (uint256) {
return dmc2gwt_rate;
fundationIncome = DividendContract(_fundationIncome);
}

function getCircleBalance(uint256 circle_id) public view returns (uint256) {
return 210000;
}

function burnDMCforGWT(uint256 dmc_amount) public {
dmcToken.burnFrom(msg.sender, amount);
gwtToken.mint(msg.sender, amount);
}

function mintDMCbyGWT(uint256 gwt_amount) public returns (uint256){
function adjustExchangeRate() internal {
if(block.timestamp > current_mine_circle_start + min_circle_time) {
//结束当前挖矿周期
if(current_dmc_balance > 0) {
total_addtion_dmc_balance += current_dmc_balance;
if(remain_dmc_balance > 0) {
total_addtion_dmc_balance += remain_dmc_balance;
addtion_circle_count += 1;
//本周期未挖完,降低dmc2gwt_rate
dmc2gwt_rate = dmc2gwt_rate * (1-current_dmc_balance/current_circle_dmc_balance);
dmc2gwt_rate = dmc2gwt_rate * (1-remain_dmc_balance/current_circle_dmc_balance);
} else {
//本周期挖完了,提高dmc2gwt_rate
dmc2gwt_rate = dmc2gwt_rate * (1+(current_finish_time-current_mine_circle_start)/min_circle_time);
Expand All @@ -59,47 +52,56 @@ contract Exchange2 {
//移动到下一个周期
current_circle = current_circle + 1;
current_mine_circle_start = block.timestamp;

// getCircleBalance(current_circle)的含义是?
// 这个circle是刚开始的,这个值是不是一定是0?
remain_dmc_balance = getCircleBalance(current_circle);

if(total_addtion_dmc_balance > 0) {
// 此处的addtion_circle_count一定为1,Bug?
// total_dmc_balance是什么?
uint256 this_addtion_dmc = total_dmc_balance / addtion_circle_count;
addtion_circle_count -= 1;
// 如何保证total_addtion_dmc_balance一定大于this_addtion_dmc?
total_addtion_dmc_balance -= this_addtion_dmc;
current_dmc_balance = this_addtion_dmc + getCircleBalance(current_circle);
} else {
current_dmc_balance = getCircleBalance(current_circle);

remain_dmc_balance += this_addtion_dmc;
}
current_circle_dmc_balance = current_dmc_balance;

current_circle_dmc_balance = remain_dmc_balance;
} else {
require(current_dmc_balance > 0, "no dmc balance in current circle");
require(remain_dmc_balance > 0, "no dmc balance in current circle");
}
}

function exchangeGWT(uint256 amount) public {
dmcToken.burnFrom(msg.sender, amount);
gwtToken.mint(msg.sender, amount * dmc2gwt_rate);
}

function exchangeDMC(uint256 amount) public {
adjustExchangeRate();
uint256 real_dmc_count = 0;
uint256 dmc_count = gwt_amount / getExchangeRate();
if(dmc_count > current_dmc_balance) {
uint256 dmc_count = amount / dmc2gwt_rate;
if(dmc_count > remain_dmc_balance) {
current_finish_time = block.timestamp;
current_dmc_balance = 0;
real_dmc_count = current_dmc_balance;

real_dmc_count = remain_dmc_balance;
remain_dmc_balance = 0;
//不用立刻转给分红合约,而是等积累一下
gwtToken.transferFrom(msg.sender, this, real_dmc_count*getExchangeRate());
gwtToken.transferFrom(msg.sender, this, real_dmc_count * dmc2gwt_rate);
dmcToken.mint(msg.sender, real_dmc_count);
} else {
current_dmc_balance -= dmc_count;
remain_dmc_balance -= dmc_count;
//不用立刻转给分红合约,而是等积累一下
gwtToken.transferFrom(msg.sender, this, gwt_amount);
gwtToken.transferFrom(msg.sender, this, amount);
dmcToken.mint(msg.sender, dmc_count);
}

return real_dmc_count;
}

function exchangeGWT(uint256 amount) public {
uint256 rate = getExchangeRate();
dmcToken.burnFrom(msg.sender, amount);
gwtToken.mint(msg.sender, amount * rate);
}

function exchangeDMC(uint256 amount) public {
uint256 rate = getExchangeRate();
gwtToken.transferFrom(msg.sender, fundationIncome, amount);
dmcToken.mint(msg.sender, amount / rate);

// 手工将累积的收入打给分红合约
function transferIncome() public {
gwtToken.approve(fundationIncome, gwtToken.balanceOf(this));
fundationIncome.deposit(gwtToken.balanceOf(this));
}
}

0 comments on commit 58782c9

Please sign in to comment.