From 8d79cfc399c21d016a5254cc5b982d0a22e42d54 Mon Sep 17 00:00:00 2001 From: Liu Zhicong Date: Thu, 25 Apr 2024 09:49:21 -0700 Subject: [PATCH] update exchage2.sol --- contracts/exchange2.sol | 74 ++++++++++++++++++- ...17\346\265\216\346\250\241\345\236\213.md" | 45 +++++++++++ 2 files changed, 117 insertions(+), 2 deletions(-) diff --git a/contracts/exchange2.sol b/contracts/exchange2.sol index d74c574..3d2376e 100644 --- a/contracts/exchange2.sol +++ b/contracts/exchange2.sol @@ -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); @@ -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 { diff --git "a/doc/DMC20 \347\273\217\346\265\216\346\250\241\345\236\213.md" "b/doc/DMC20 \347\273\217\346\265\216\346\250\241\345\236\213.md" index 85a148d..0bd7e1b 100644 --- "a/doc/DMC20 \347\273\217\346\265\216\346\250\241\345\236\213.md" +++ "b/doc/DMC20 \347\273\217\346\265\216\346\250\241\345\236\213.md" @@ -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 @@ -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