Tengo un contrato que tiene la función 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;
}
Cuando ejecuto esta función, obtengo un error:
Error de estimación de gas con el siguiente mensaje (ver más abajo). Es probable que la ejecución de la transacción falle. ¿Quieres forzar el envío?
el gas requerido excede la asignación o siempre falla la transacción
He leído muchas respuestas en StackOverflow. ninguna solucion me funciono
Tal vez la cuenta from
no ha permitido que la to
cuenta retire fondos. Recomiendo agregar algunas verificaciones adicionales:
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;
}
Además, asegúrese de que la from
cuenta permita que la to
cuenta retire el tokens
monto y debería funcionar
The constructor should be payable if you send value
.transferFrom()
función que te di es la de openZeppelin: github.com/OpenZeppelin/openzeppelin-solidity/blob/master/… más tus modificaciones añadidastransferFrom(from, to, amount)
, también debe llamar a approve(to, amount)
, desde la dirección anterior .approve(to,amount)
método desde from
la dirección? mi from
dirección es una dirección aleatoria que tomé de etherscan. Llamé al método de aprobación de remix ui e intenté hacer la transferencia. estoy recibiendo el mismo errorapprove()
desde una dirección aleatoria. Tienes que llamarlo desde la dirección que tiene los tokens . Esa dirección tiene que estar bajo tu control (para poder firmar transacciones con ella).
Tudor Constantino
transactionLock
define ¿Está configurado parafalse
?Ajit Soman
false
en el constructor