Минимальные вложения не работают

uint256 public max_contribution = 50 ether; 
    uint256 public min_contribution = 0.1 ether; 
function transfer(address to, uint tokens) public payable returns (bool success) {
    require(msg.value >= min_contribution);
    require(msg.value <= max_contribution);
    balances[msg.sender] = safeSub(balances[msg.sender], tokens);
    balances[to] = safeAdd(balances[to], tokens);
    emit Transfer(msg.sender, to, tokens);
    return true;
}

используя это, чтобы установить минимальную инвестицию ETH, по-прежнему получая токены при отправке суммы 0,1> ETH. Тестирование в тестовой сети. Есть идеи? Контракт: 0xb1a89c746ecec28bfdf7f06f44b603bf9c035be8 с проверенным кодом.

Ответы (3)

Путаница возникла из-за того, что вы разместили код, transferа не код резервной функции, как указывает @mafrasi2.

Теперь резервная функция определяет количество токенов и обновляет балансы. Здесь можно поставить ограничения на количество эфира, вот так:

function () public payable {
        require(now >= startDate && now <= endDate);
        require(msg.value >= min_contribution);
        require(msg.value <= max_contribution);
        uint tokens;
        if (now <= bonusEnds) {
            tokens = msg.value * 12000;
        } else {
            tokens = msg.value * 10000;
        }
        balances[msg.sender] = safeAdd(balances[msg.sender], tokens);
        _totalSupply = safeAdd(_totalSupply, tokens);
        emit Transfer(address(0), msg.sender, tokens);
        owner.transfer(msg.value);
    }

Но это еще не все, вы должны убрать ограничения в функции перевода, потому что в текущем состоянии пользователи вашего токена никогда не смогут его передать, если только они не отправят эфир, что странно. Таким образом, передача должна быть такой:

function transfer(address to, uint tokens) public returns (bool success) {
    balances[msg.sender] = safeSub(balances[msg.sender], tokens);
    balances[to] = safeAdd(balances[to], tokens);
    emit Transfer(msg.sender, to, tokens);
    return true;
}

надеюсь это поможет.

Сэр, вы только что сделали мою неделю! Большое спасибо. Все работает, даже если я отправляю эфир из MyEtherWallet. Очень ценю это!

Насколько я знаю, значения эфира, которые у вас есть на:

uint256 public min_contribution = 0.1 ether;
uint256 public max_contribution = XX;

Solidity по умолчанию получает его как Wei , а не как эфир. Поскольку Wei — неделимая единица, у вас не может быть 0,X Wei.

Попробуйте указать значения эфира на Wei, зная, что 1 эфир = 1E18 Wei.

Может так быстрее: https://etherconverter.online/

Функция вроде нормально написана, так что не думаю, что проблема в ней.

Надеюсь, поможет!

я ve change it to weis, но все еще получаю токены, когда я отправляю менее 0,1 эфира
Исправление, описанное @Cpereez19, работает, я реализовал его в ремиксе, и оно предотвращает депозиты менее 0,1 эфира. Убедитесь, что вы снова компилируете и развертываете после изменений.
То же самое здесь, проверил совет @CPereez19, и все отлично работает с ремиксом.
Но смотрите, я только что провел транзакцию с 0,01 эфира, и все то же самое... ropsten.etherscan.io/tx/… .Может быть , дело в том, как я это проверял? Я развернул контракт в виде ремикса и отправил 0.01 с MyEtherWallet на адрес контракта. @Джейме
Вы просто отправили эфир или воспользовались функцией перевода?. В вашем контракте отправка эфира будет работать, но отправка эфира через функцию перевода, которую вы указали в вопросе, вернется, если сумма меньше 0,1. Дайте мне знать.
@Jaime, я ve just sent ether from MyEtherWallet - just like i would do if i would like to participate in ICO. Everything i need is a minimal transaction rate for the whole contract, like, when i am sending less then 0.1 ether from any wallet i shouldnполучаю жетоны.
Даниэль, это не сработает с показанным кодом, отправка эфира активирует резервную функцию. Можете ли вы показать мне весь свой код?
@Jaime да, пожалуйста, вы можете увидеть это здесь, проверено и опубликовано ropsten.etherscan.io/address/…
@Daniel, решение работает, я не знаю, что ты делаешь не так, но 3 человека протестировали его, и оно работает.
Вот почему я все еще здесь, я не могу понять, почему это работает для вас, ребята. Я просто отправляю менее 0,1 эфира из MyEtherWallet — так поступил бы каждый участник ICO и все еще получаю токены. Мой вопрос в том, как предотвратить это @CPereez19
Вы должны отправить эфир, используя метод transfer() контракта, если вы просто отправляете эфир на адрес, ничего не произойдет, кроме того, что отправка эфира идет на контракт (без оценки)
Но как тогда другие люди могут использовать мой контракт? @CPereez19
Я только что добавил ответ, он должен решить проблему
Если у вас есть интерфейс, в котором вы предоставляете доступ к нему людям, и вы обязываете пользователей отправлять деньги с помощью этого метода transfer(), вы этого добьетесь.

@Jaime намекнул на это: вы не вызываете функцию transfer(). Вместо этого вы вызываете эту функцию:

function () public payable {
    require(now >= startDate && now <= endDate);
    uint tokens;
    if (now <= bonusEnds) {
        tokens = msg.value * 12000;
    } else {
        tokens = msg.value * 10000;
    }
    balances[msg.sender] = safeAdd(balances[msg.sender], tokens);
    _totalSupply = safeAdd(_totalSupply, tokens);
    emit Transfer(address(0), msg.sender, tokens);
    owner.transfer(msg.value);
}

Ваша функция transfer() верна без каких-либо изменений. Solidity прекрасно конвертирует эфир 0.x в wei.

Все, что мне нужно, это минимальная сумма инвестиций для любого, кто отправляет эфир на адрес контракта. Так, например: человек, отправивший со своего кошелька ethereum менее 0,1 эфира, не получив никаких токенов и не вернув свой перевод.
Тогда вы не изменили правильную функцию. Оба requires(...)должны войти в функцию, которую я разместил, а не в transfer(). Также transfer()точно не должно быть payable.
ropsten.etherscan.io/address/… по- прежнему может получать токены после менее чем 0,01 транзакции. Также не могу развернуть код при удалении платежа