You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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);
}
}
то код станет значительно проще и читабельнее.
The text was updated successfully, but these errors were encountered:
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);
}
}
то код станет значительно проще и читабельнее.
The text was updated successfully, but these errors were encountered: