Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

getMinWeiNeeded() refactoring #30

Open
AnthonyAkentiev opened this issue Oct 31, 2018 · 0 comments
Open

getMinWeiNeeded() refactoring #30

AnthonyAkentiev opened this issue Oct 31, 2018 · 0 comments
Assignees

Comments

@AnthonyAkentiev
Copy link
Member

AnthonyAkentiev commented Oct 31, 2018

https://hackmd.io/s/SkyXYnsj7

Идея 3. Переделать поведение getMinWeiNeeded

Какая сейчас ситуация?

relative будет ревертить, если прислать processFunds.value(0)(1eth)
Значит, когда relative говорил, что mineWeiNeeded() == 0, он врал.
Это первое несоответствие.
Заходим в topDownSplitter и видим:
function getMinWeiNeeded()public view returns(uint) {
  if(!isOpen()) {
   return 0;
  }
  uint out = 0;
  for(uint j=childrenCount; j>0; --j) {
   IWeiReceiver c = IWeiReceiver(children[j-1]);
   if(c.getPercentsMul100()>0) {
    out = 10000 * out / c.getPercentsMul100();
   }else {
    out += c.getMinWeiNeeded();
   }
  }
  return out;
 }
Сплиттер считает проценты для relative! Казалось бы, зачем, ведь у них minWeiNeeded==0
А я помню, почему так было сделано. Если в крупной структуре элементов будут стоять одни relative, а в конце absolute, то чтобы деньги добрались до absolute, нужно еще учесть, что будет оседать на relative. Но это неправильно! На самом деле для relative getMinWeiNeeded и getTotalWeiNeeded должны быть равны! И getMinWeiNeeded должна зависеть от потока.

В таком случае код станет уже таким

function getMinWeiNeeded(uint _currentFlow)public view returns(uint) {
if(!isOpen()) {
   return 0;
  }
  uint out = 0;
  for(uint j=childrenCount; j>0; --j) {
   out += IWeiReceiver(children[j-1]).getMinWeiNeeded(_currentFlow);
  }
  return out;
 }
А если введем модификатор zeroIfClosed и вынесем out,

function getMinWeiNeeded(uint _currentFlow)public view zeroIfClosed returns(uint out) {
  for(uint j=childrenCount; j>0; --j) {
   out += IWeiReceiver(children[j-1]).getMinWeiNeeded(_currentFlow);
  }
 }
то код станет значительно проще и читабельнее.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants