Невозможно возместить избыточный эфир пользователям в Remix и Metamask - PullRequest
0 голосов
/ 21 января 2019

Создание краудфандингового приложения. Как только цель достигнута, любой эфирный вклад в проект будет возвращен через msg.sender.transfer (превышение) или msg.sender.send (превышение).

Протестировано на Remix и Metamask (развернуто через Web3). Ключевой вопрос заключается в том, что избыточные средства полностью списываются со счетов отправителя и не возвращаются отправителю.

pragma solidity ^0.5.0;

contract Funds {
    uint public maximumValue = 100;
    uint public currentValue = 0;

    // addFunds function that takes in amount in ether
    function addFunds (uint _amount) public payable {
        // Converts wei (msg.value) to ether
        require(msg.value / 1000000000000000000 == _amount);
        // if the sum of currentValue and amount is greater than maximum value, refund the excess
        if (currentValue + _amount > maximumValue){
            uint excess = currentValue + _amount - maximumValue;
            currentValue = maximumValue;
            msg.sender.transfer(excess);
        } else {
            currentValue += _amount;
        }
    }
}

1 Ответ

0 голосов
/ 21 января 2019

Кажется, что все значения в вашем контракте в эфире, поэтому вы, вероятно, хотите msg.sender.transfer(excess * 1 ether). Я предполагаю, что возврат работает, но он отправляет обратно такое небольшое количество вэй, что вы не заметили.

ИМО, лучше было бы везде использовать wei:

pragma solidity ^0.5.0;

contract Funds {
    uint public maximumValue = 100 ether;
    uint public currentValue = 0;

    function addFunds() external payable {
        // if the sum of currentValue and amount is greater than maximum value, refund the excess
        if (currentValue + msg.value > maximumValue){
            uint excess = currentValue + msg.value - maximumValue;
            currentValue = maximumValue;
            msg.sender.transfer(excess);
        } else {
            currentValue += msg.value;
        }
    }
}
...