diff --git a/contracts/DODOToken/DODOCirculationHelper.sol b/contracts/DODOToken/DODOCirculationHelper.sol index 5b57bbd..ef82010 100644 --- a/contracts/DODOToken/DODOCirculationHelper.sol +++ b/contracts/DODOToken/DODOCirculationHelper.sol @@ -55,7 +55,7 @@ contract DODOCirculationHelper is InitializableOwnable { } } - function getVDODOWithdrawFeeRatio() external view returns (uint256 ratio) { + function getDodoWithdrawFeeRatio() external view returns (uint256 ratio) { uint256 dodoCirculationAmout = getCirculation(); uint256 x = DecimalMath.divCeil( diff --git a/contracts/DODOToken/Governance.sol b/contracts/DODOToken/Governance.sol index 37a1657..814423a 100644 --- a/contracts/DODOToken/Governance.sol +++ b/contracts/DODOToken/Governance.sol @@ -12,15 +12,7 @@ import {InitializableOwnable} from "../lib/InitializableOwnable.sol"; //todo contract Governance is InitializableOwnable { - // ============ Storage ============ - - address _VDODO_TOKEN_; - - function setVDODOAddress(address vodoToken) public onlyOwner{ - _VDODO_TOKEN_ = vodoToken; - } - - function getLockedvDODO(address account) external pure returns (uint256 lockedvDODO) { - lockedvDODO = 0;//todo for test + function getLockedDODO(address account) external pure returns (uint256 lockedDODO) { + lockedDODO = 0;//todo for test } } diff --git a/contracts/DODOToken/vDODOToken.sol b/contracts/DODOToken/vDODOToken.sol index 7c98d89..bb4018a 100644 --- a/contracts/DODOToken/vDODOToken.sol +++ b/contracts/DODOToken/vDODOToken.sol @@ -15,14 +15,14 @@ import {SafeERC20} from "../lib/SafeERC20.sol"; import {IDODOApproveProxy} from "../SmartRoute/DODOApproveProxy.sol"; interface IGovernance { - function getLockedvDODO(address account) external view returns (uint256); + function getLockedDODO(address account) external view returns (uint256); } interface IDODOCirculationHelper { // Locked vDOOD not counted in circulation function getCirculation() external view returns (uint256); - function getVDODOWithdrawFeeRatio() external view returns (uint256); + function getDodoWithdrawFeeRatio() external view returns (uint256); } contract vDODOToken is InitializableOwnable { @@ -49,10 +49,11 @@ contract vDODOToken is InitializableOwnable { // staking reward parameters uint256 public dodoPerBlock; uint256 public constant _SUPERIOR_RATIO_ = 10**17; // 0.1 + uint256 public constant _DODO_RATIO_ = 100 * 10**18; // 100 uint256 public dodoFeeBurnRation; // accounting - uint128 public alpha = 100 * 10**18; // 100 + uint128 public alpha = 10**18; // 1 uint128 public lastRewardBlock; mapping(address => UserInfo) public userInfo; @@ -148,7 +149,7 @@ contract vDODOToken is InitializableOwnable { dodoAmount ); - uint256 newVdodoAmount = DecimalMath.divFloor(dodoAmount, alpha); + uint256 newVdodoAmount = DecimalMath.divFloor(dodoAmount,_DODO_RATIO_); UserInfo storage user = userInfo[msg.sender]; _mint(user, newVdodoAmount); @@ -165,13 +166,14 @@ contract vDODOToken is InitializableOwnable { emit MintVDODO(msg.sender, superiorAddress, dodoAmount); } - function redeem(uint256 vDodoAmount) + function redeem(uint256 dodoAmount) public - balanceEnough(msg.sender, vDodoAmount) + balanceEnough(msg.sender, dodoAmount) { _updateAlpha(); UserInfo storage user = userInfo[msg.sender]; + uint256 vDodoAmount = DecimalMath.divFloor(dodoAmount,_DODO_RATIO_); _redeem(user, vDodoAmount); if (user.superior != address(0)) { @@ -179,7 +181,7 @@ contract vDODOToken is InitializableOwnable { _redeemFromSuperior(user, superiorRedeemVDODO); } - (uint256 dodoReceive, uint256 burnDodoAmount, uint256 withdrawFeeDodoAmount) = getWithdrawAmount(vDodoAmount); + (uint256 dodoReceive, uint256 burnDodoAmount, uint256 withdrawFeeDodoAmount) = getWithdrawAmount(dodoAmount); IERC20(_DODO_TOKEN_).transfer(msg.sender, dodoReceive); @@ -191,7 +193,7 @@ contract vDODOToken is InitializableOwnable { alpha = uint128(uint256(alpha).add(DecimalMath.divFloor(withdrawFeeDodoAmount, totalSupply))); } - emit RedeemVDODO(msg.sender, vDodoAmount); + emit RedeemVDODO(msg.sender, dodoAmount); } @@ -207,42 +209,41 @@ contract vDODOToken is InitializableOwnable { // ============ Functions(ERC20) ============ - function balanceOf(address account) public view returns (uint256 balance) { + function balanceOf(address account) public view returns (uint256 dodoAmount) { UserInfo memory user = userInfo[account]; - balance = uint256(user.VDODOAmount).sub(DecimalMath.divFloor(user.credit, getLatestAlpha())); + dodoAmount = DecimalMath.mulFloor(uint256(user.VDODOAmount),_DODO_RATIO_.add(getLatestAlpha())).sub(user.credit); } function availableBalanceOf(address account) public view returns (uint256 balance) { if(_DOOD_GOV_ == address(0)){ balance = balanceOf(account); }else { - uint256 lockedBalance = IGovernance(_DOOD_GOV_).getLockedvDODO(account); + uint256 lockedBalance = IGovernance(_DOOD_GOV_).getLockedDODO(account); balance = balanceOf(account).sub(lockedBalance); } } - function transfer(address to, uint256 amount) public returns (bool) { + function transfer(address to, uint256 dodoAmount) public returns (bool) { _updateAlpha(); - _transfer(msg.sender, to, amount); + _transfer(msg.sender, to, dodoAmount); return true; } - function approve(address spender, uint256 amount) public returns (bool) { - _ALLOWED_[msg.sender][spender] = amount; - emit Approval(msg.sender, spender, amount); + function approve(address spender, uint256 dodoAmount) public returns (bool) { + _ALLOWED_[msg.sender][spender] = dodoAmount; + emit Approval(msg.sender, spender, dodoAmount); return true; } function transferFrom( address from, address to, - uint256 amount + uint256 dodoAmount ) public returns (bool) { - require(amount <= _ALLOWED_[from][msg.sender], "ALLOWANCE_NOT_ENOUGH"); + require(dodoAmount <= _ALLOWED_[from][msg.sender], "ALLOWANCE_NOT_ENOUGH"); _updateAlpha(); - _transfer(from, to, amount); - _ALLOWED_[from][msg.sender] = _ALLOWED_[from][msg.sender].sub(amount); - emit Transfer(from, to, amount); + _transfer(from, to, dodoAmount); + _ALLOWED_[from][msg.sender] = _ALLOWED_[from][msg.sender].sub(dodoAmount); return true; } @@ -252,11 +253,6 @@ contract vDODOToken is InitializableOwnable { // ============ View Functions ============ - function dodoBalanceOf(address account) public view returns (uint256 dodoAmount) { - UserInfo memory user = userInfo[account]; - dodoAmount = DecimalMath.mulFloor(uint256(user.VDODOAmount),getLatestAlpha()).sub(user.credit); - } - function getLatestAlpha() public view returns(uint256) { uint256 accuDODO = dodoPerBlock * (block.number - lastRewardBlock); if (totalSupply > 0) { @@ -266,11 +262,12 @@ contract vDODOToken is InitializableOwnable { } } - function getWithdrawAmount(uint256 vDodoAmount) public view returns(uint256 dodoReceive, uint256 burnDodoAmount, uint256 withdrawFeeDodoAmount) { - uint256 feeRatio = IDODOCirculationHelper(_DODO_CIRCULATION_HELPER_).getVDODOWithdrawFeeRatio(); + function getWithdrawAmount(uint256 dodoAmount) public view returns(uint256 dodoReceive, uint256 burnDodoAmount, uint256 withdrawFeeDodoAmount) { + uint256 vDodoAmount = DecimalMath.divFloor(dodoAmount,_DODO_RATIO_); + uint256 feeRatio = IDODOCirculationHelper(_DODO_CIRCULATION_HELPER_).getDodoWithdrawFeeRatio(); uint256 newAlpha = getLatestAlpha(); - uint256 withdrawDodoAmount = DecimalMath.mulFloor(vDodoAmount, newAlpha); + uint256 withdrawDodoAmount = DecimalMath.mulFloor(vDodoAmount, _DODO_RATIO_.add(newAlpha)); withdrawFeeDodoAmount = DecimalMath.mulCeil(withdrawDodoAmount, feeRatio); dodoReceive = withdrawDodoAmount.sub(withdrawFeeDodoAmount); @@ -303,7 +300,7 @@ contract vDODOToken is InitializableOwnable { user.superiorVDODO = uint128(uint256(user.superiorVDODO).add(vdodoAmount)); UserInfo storage superiorUser = userInfo[user.superior]; _mint(superiorUser, vdodoAmount); - uint256 dodoAmount = DecimalMath.mulCeil(vdodoAmount, alpha); + uint256 dodoAmount = DecimalMath.mulCeil(vdodoAmount, _DODO_RATIO_.add(alpha)); superiorUser.credit = superiorUser.credit.add(dodoAmount); } } @@ -319,14 +316,14 @@ contract vDODOToken is InitializableOwnable { user.superiorVDODO = uint128(uint256(user.superiorVDODO).sub(vdodoAmount)); UserInfo storage superiorUser = userInfo[user.superior]; - uint256 creditVDODO = DecimalMath.divFloor(superiorUser.credit, alpha); + uint256 creditVDODO = DecimalMath.divFloor(superiorUser.credit, _DODO_RATIO_.add(alpha)); if (vdodoAmount >= creditVDODO) { superiorUser.credit = 0; _redeem(superiorUser, creditVDODO); } else { superiorUser.credit = superiorUser.credit.sub( - DecimalMath.mulFloor(vdodoAmount, alpha) + DecimalMath.mulFloor(vdodoAmount, _DODO_RATIO_.add(alpha)) ); _redeem(superiorUser, vdodoAmount); } @@ -336,10 +333,12 @@ contract vDODOToken is InitializableOwnable { function _transfer( address from, address to, - uint256 _amount - ) internal balanceEnough(from, _amount) canTransfer { + uint256 _dodoAmount + ) internal balanceEnough(from, _dodoAmount) canTransfer { require(from != address(0), "transfer from the zero address"); require(to != address(0), "transfer to the zero address"); + + uint256 _amount = DecimalMath.divFloor(_dodoAmount,_DODO_RATIO_); UserInfo storage fromUser = userInfo[from]; fromUser.VDODOAmount = uint128(uint256(fromUser.VDODOAmount).sub(_amount)); @@ -357,6 +356,6 @@ contract vDODOToken is InitializableOwnable { _mintToSuperior(toUser, superiorRedeemVDODO); } - emit Transfer(from, to, _amount); + emit Transfer(from, to, _dodoAmount); } }