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 с проверенным кодом.
Путаница возникла из-за того, что вы разместили код, 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;
}
надеюсь это поможет.
Насколько я знаю, значения эфира, которые у вас есть на:
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 wei
s, но все еще получаю токены, когда я отправляю менее 0,1 эфира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 намекнул на это: вы не вызываете функцию 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.
requires(...)
должны войти в функцию, которую я разместил, а не в transfer()
. Также transfer()
точно не должно быть payable
.
Даниэль