У меня есть контракт с функцией TransferFrom
mapping(address => uint) balances;
mapping(address => mapping(address => uint)) allowed;
mapping (address => bool) public frozenAccount;
// Transfer token from spender account to receiver account
function transferFrom(address from, address to, uint tokens) public returns (bool success) {
require(!transactionLock); // Check for transaction lock
require(!frozenAccount[from]); // Check if sender is frozen
require(!frozenAccount[to]); // Check if recipient is frozen
balances[from] = balances[from].sub(tokens);
allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);
balances[to] = balances[to].add(tokens);
emit Transfer(from, to, tokens);
return true;
}
Когда я выполняю эту функцию, я получаю сообщение об ошибке:
Произошла ошибка оценки газа со следующим сообщением (см. ниже). Выполнение транзакции, скорее всего, завершится ошибкой. Вы хотите принудительно отправить?
требуемый газ превышает норму или всегда не проходит транзакция
Я прочитал много ответов в StackOverflow. Никакое решение не работает для меня
Возможно, учетная запись from
не позволила учетной записи to
вывести средства. Я рекомендую добавить несколько дополнительных проверок:
function transferFrom(
address from,
address to,
uint256 tokens
)
public
returns (bool)
{
require(!transactionLock); // Check for transaction lock
require(!frozenAccount[from]); // Check if sender is frozen
require(!frozenAccount[to]); // Check if recipient is frozen
require(tokens <= _balances[from]);
require(tokens <= _allowed[from][msg.sender]);
require(to != address(0));
_balances[from] = _balances[from].sub(tokens);
_balances[to] = _balances[to].add(tokens);
_allowed[from][msg.sender] = _allowed[from][msg.sender].sub(tokens);
emit Transfer(from, to, tokens);
return true;
}
Кроме того, убедитесь, что from
учетная запись позволяет to
учетной записи снимать tokens
сумму, и она должна работать .
The constructor should be payable if you send value
.transferFrom()
, которую я вам дал, принадлежит openZeppelin: github.com/OpenZeppelin/openzeppelin-solidity/blob/master/… плюс добавленные вами модификацииtransferFrom(from, to, amount)
, вы также должны позвонить approve(to, amount)
из указанного выше адреса .approve(to,amount)
метод из from
адреса. мой from
адрес - это случайный адрес, который я взял из etherscan. Я вызвал метод утверждения из пользовательского интерфейса remix и попытался сделать перенос. я получаю ту же ошибкуapprove()
со случайного адреса. Вы должны вызывать его с адреса, имеющего токены . Этот адрес должен находиться под вашим контролем (чтобы иметь возможность подписывать с ним транзакции).
Тюдор Константин
transactionLock
определяется? это установленоfalse
?Аджит Соман
false
в конструкторе