setExchangeRate() diagnosis completed

This commit is contained in:
Sowmay Jain 2020-08-31 02:33:07 +10:00
parent 6a6a7f51e5
commit 11410e0d5e
2 changed files with 28 additions and 22 deletions

View File

@ -79,30 +79,33 @@ contract PoolToken is ReentrancyGuard, DSMath, ERC20Pausable {
} }
/** /**
* @dev get pool token rate * @dev get pool token rate
* @param tokenAmt total token amount * @param tokenAmt total token amount
*/ */
function getCurrentRate(uint tokenAmt) public returns (uint) { function getCurrentRate(uint tokenAmt) public returns (uint) {
return wdiv(totalSupply(), tokenAmt); return wdiv(totalSupply(), tokenAmt);
} }
/**
* @dev sets exchange rates
*/
function setExchangeRate() public isChief { function setExchangeRate() public isChief {
uint _previousRate = exchangeRate; uint _previousRate = exchangeRate;
uint _totalToken = RateInterface(registry.poolLogic(address(this))).getTotalToken(); uint _totalToken = RateInterface(registry.poolLogic(address(this))).getTotalToken();
_totalToken = sub(_totalToken, insuranceAmt); _totalToken = sub(_totalToken, insuranceAmt);
uint _currentRate = getCurrentRate(_totalToken); uint _currentRate = getCurrentRate(_totalToken);
require(_currentRate != 0, "currentRate-is-0"); require(_currentRate != 0, "current-rate-is-zero");
if (_currentRate > _previousRate) { if (_currentRate > _previousRate) { // loss => deduct partially/fully from insurance amount
uint _difTkn = sub(tokenBalance, _totalToken); uint _loss = sub(tokenBalance, _totalToken);
if (_difTkn < insuranceAmt) { if (_loss <= insuranceAmt) {
insuranceAmt = sub(insuranceAmt, _difTkn); insuranceAmt = sub(insuranceAmt, _loss);
_currentRate = _previousRate; _currentRate = _previousRate;
} else { } else {
insuranceAmt = 0;
tokenBalance = add(_totalToken, insuranceAmt); tokenBalance = add(_totalToken, insuranceAmt);
insuranceAmt = 0;
_currentRate = getCurrentRate(tokenBalance); _currentRate = getCurrentRate(tokenBalance);
} }
} else { } else { // profit => add to insurance amount
uint insureFeeAmt = wmul(sub(_totalToken, tokenBalance), registry.insureFee(address(this))); uint insureFeeAmt = wmul(sub(_totalToken, tokenBalance), registry.insureFee(address(this)));
insuranceAmt = add(insuranceAmt, insureFeeAmt); insuranceAmt = add(insuranceAmt, insureFeeAmt);
tokenBalance = sub(_totalToken, insureFeeAmt); tokenBalance = sub(_totalToken, insureFeeAmt);

View File

@ -76,30 +76,33 @@ contract PoolToken is ReentrancyGuard, ERC20Pausable, DSMath {
} }
/** /**
* @dev get pool token rate * @dev get pool token rate
* @param tokenAmt total token amount * @param tokenAmt total token amount
*/ */
function getCurrentRate(uint tokenAmt) public returns (uint) { function getCurrentRate(uint tokenAmt) public returns (uint) {
return wdiv(totalSupply(), tokenAmt); return wdiv(totalSupply(), tokenAmt);
} }
/**
* @dev sets exchange rates
*/
function setExchangeRate() public isChief { function setExchangeRate() public isChief {
uint _previousRate = exchangeRate; uint _previousRate = exchangeRate;
uint _totalToken = RateInterface(registry.poolLogic(address(this))).getTotalToken(); uint _totalToken = RateInterface(registry.poolLogic(address(this))).getTotalToken();
_totalToken = sub(_totalToken, insuranceAmt); _totalToken = sub(_totalToken, insuranceAmt);
uint _currentRate = getCurrentRate(_totalToken); uint _currentRate = getCurrentRate(_totalToken);
require(_currentRate != 0, "current-rate-is-zero"); require(_currentRate != 0, "current-rate-is-zero");
if (_currentRate > _previousRate) { if (_currentRate > _previousRate) { // loss => deduct partially/fully from insurance amount
uint _difTkn = sub(tokenBalance, _totalToken); uint _loss = sub(tokenBalance, _totalToken);
if (_difTkn < insuranceAmt) { if (_loss <= insuranceAmt) {
insuranceAmt = sub(insuranceAmt, _difTkn); insuranceAmt = sub(insuranceAmt, _loss);
_currentRate = _previousRate; _currentRate = _previousRate;
} else { } else {
insuranceAmt = 0;
tokenBalance = add(_totalToken, insuranceAmt); tokenBalance = add(_totalToken, insuranceAmt);
insuranceAmt = 0;
_currentRate = getCurrentRate(tokenBalance); _currentRate = getCurrentRate(tokenBalance);
} }
} else { } else { // profit => add to insurance amount
uint insureFeeAmt = wmul(sub(_totalToken, tokenBalance), registry.insureFee(address(this))); uint insureFeeAmt = wmul(sub(_totalToken, tokenBalance), registry.insureFee(address(this)));
insuranceAmt = add(insuranceAmt, insureFeeAmt); insuranceAmt = add(insuranceAmt, insureFeeAmt);
tokenBalance = sub(_totalToken, insureFeeAmt); tokenBalance = sub(_totalToken, insureFeeAmt);