То-есть этот call.value вызывает функцию из чужого контракта?
Да, именно.
Пролистал еще исходник. Да там кишит этих рекурсивных и не только багов. Вообще не понимаю, почему этот дао не был сломан сразу
Вот еще один интересный
function retrieveDAOReward(bool _toMembers) external noEther returns (bool _success) {
DAO dao = DAO(msg.sender);
...
Прямо на первой строчке. Как можно создавать обьект, заданного типа, но с привязкой к адресу отправителя транзакции?
Тут подразумевается, что отправителем будет являться контракт именно DAO, именно написанный разработчиком. Хотя на самом деле эту функцию может вызвать любой другой контракт, выдав себя за "легитимный".
Ну а дальше все та же рекурсия, все те же гонки:
uint reward =
(rewardToken[msg.sender] * DAOrewardAccount.accumulatedInput()) /
totalRewardToken - DAOpaidOut[msg.sender];
if(_toMembers) {
if (!DAOrewardAccount.payOut(dao.rewardAccount(), reward))
throw;
}
else {
if (!DAOrewardAccount.payOut(dao, reward))
throw;
}
DAOpaidOut[msg.sender] += reward;
Эх, жаль, что вычистили уже DAO од 0, а то я бы сейчас стырил оттуда пару десятков тыщ эфиров, при чем на свой контракт, а не на сплит с заморозкой на 27 дней

Вообще странно, такое ощущение, что тот Виталик, который разработал эфир и тот, который защищает этот глючный говно-контракт - 2 разных Виталика.