Skip to content

Commit

Permalink
update exchage2.sol
Browse files Browse the repository at this point in the history
  • Loading branch information
waterflier committed Apr 25, 2024
1 parent 890d2a2 commit 8d79cfc
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 2 deletions.
74 changes: 72 additions & 2 deletions contracts/exchange2.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,21 @@ import "./public_data_storage2.sol";
contract Exchange2 {
DMC2 dmcToken;
GWTToken2 gwtToken;
PublicDataStorage2 publicDataStorage;

address fundationIncome;
uint256 current_circle = 1;
uint256 current_mine_circle_start;
uint256 current_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) {
dmcToken = DMC2(_dmcToken);
gwtToken = GWTToken2(_gwtToken);
Expand All @@ -18,7 +31,64 @@ contract Exchange2 {
}

function getExchangeRate() public view returns (uint256) {
return publicDataStorage.getExchangeRate();
return dmc2gwt_rate;
}

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){
if(block.timestamp > current_mine_circle_start + min_circle_time) {
//结束当前挖矿周期
if(current_dmc_balance > 0) {
total_addtion_dmc_balance += current_dmc_balance;
addtion_circle_count += 1;
//本周期未挖完,降低dmc2gwt_rate
dmc2gwt_rate = dmc2gwt_rate * (1-current_dmc_balance/current_circle_dmc_balance);
} else {
//本周期挖完了,提高dmc2gwt_rate
dmc2gwt_rate = dmc2gwt_rate * (1+(current_finish_time-current_mine_circle_start)/min_circle_time);
}

//移动到下一个周期
current_circle = current_circle + 1;
current_mine_circle_start = block.timestamp;
if(total_addtion_dmc_balance > 0) {
uint256 this_addtion_dmc = total_dmc_balance / addtion_circle_count;
addtion_circle_count -= 1;
total_addtion_dmc_balance -= this_addtion_dmc;
current_dmc_balance = this_addtion_dmc + getCircleBalance(current_circle);
} else {
current_dmc_balance = getCircleBalance(current_circle);
}
current_circle_dmc_balance = current_dmc_balance;

} else {
require(current_dmc_balance > 0, "no dmc balance in current circle");
}
uint256 real_dmc_count = 0;
uint256 dmc_count = gwt_amount / getExchangeRate();
if(dmc_count > current_dmc_balance) {
current_finish_time = block.timestamp;
current_dmc_balance = 0;
real_dmc_count = current_dmc_balance;
//不用立刻转给分红合约,而是等积累一下
gwtToken.transferFrom(msg.sender, this, real_dmc_count*getExchangeRate());
dmcToken.mint(msg.sender, real_dmc_count);
} else {
current_dmc_balance -= dmc_count;
//不用立刻转给分红合约,而是等积累一下
gwtToken.transferFrom(msg.sender, this, gwt_amount);
dmcToken.mint(msg.sender, dmc_count);
}

return real_dmc_count;
}

function exchangeGWT(uint256 amount) public {
Expand Down
45 changes: 45 additions & 0 deletions doc/DMC20 经济模型.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,12 @@ def reward(self, capacity, duration,is_supply,order):

销毁DMC得到的GWT的数量,与系统当前的总存储能力和当前周期的期望兑换总数有关。系统的总存储量越大,兑换得到的GWT也就越多。系统会记录一个周期内销毁DMC得到的GWT总量,销毁的DMC越多,说明得到GWT的愿望约强烈,系统会进一步提升单个DMC兑换GWT的比例以尽快满足GWT的流动性需求。

系统的总空间(定期同步)
当前的GWT总量
上个周期销毁的DMC总数,上个周期的总长度
上个周期销毁的DMC总量变化(增加或减少的百分比)
与当前的兑换DMC的比例比较,>=1.1 (至少多10%)


### 用GWT兑换未分配的DMC20

Expand All @@ -160,6 +166,45 @@ DMC20按周期释放,一个周期的DMC20兑换完成后会自动进入下一

如果先兑换GWT得到DMC20,再销毁DMC20来得到GWT,通常是不划算的。但如果在早期先得到DMC20,持有一段时间后再销毁,正常会得到更多的GWT。

当前周期的DMC释放量 (上周期未兑换完量+本周期释放量)
上周期兑换剩余的DMC量(百分比)
得到当前周期的DMC兑换比例

```python
def exchange(self, gwt):
先判断是否需要移动到下一个周期
如果要:
结算当前周期
移动到下一个周期

# 通过GWT兑换DMC20
real_dmc_count = 0
dmc_count = gwt / get_exchange_rate()
if dmc_count > 本阶段DMC可释放余额:
本阶段DMC可释放余额 = 0
real_dmc_count = 本阶段DMC可释放余额
else:
本阶段DMC可释放余额 -= dmc_count
real_dmc_count = dmc_count


def 结算当前周期


def 移动到下一个周期
本期额为兑换量 = 未兑换总量/未兑换周期总数
未兑换总量 = 未兑换总量 - 未兑换总量/未兑换周期总数
本周期DMC可释放余额 = 未本期额为兑换量 + 本周期计划释放量
exchange_rate = last_exchange_rate *1-上期未兑换量/上期总兑换量)


def 销毁dmc(self,dmc_count):
(系统总空间 / 已释放DMC* 20


```


## DMC DAO的治理

### DMC <-> DAO Token
Expand Down

0 comments on commit 8d79cfc

Please sign in to comment.