es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Contrato inteligente para enviar tokens ERC20 de una dirección a otra.

Estoy tratando de implementar un contrato inteligente Solidity que envíe tokens desplegados desde la dirección A a la dirección B.

La dirección A debe ser la del usuario actual que llama a la función del contrato “stake”.
La dirección B debe ser una dirección de billetera personalizada desde fuera.

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol";

contract TokenTransfer {
    IERC20 _token;

    constructor(address token) public {
        _token = IERC20(token);
    }

    function stake(address to, uint amount) public {
        _token.approve(address(this), amount);
        require(_token.allowance(msg.sender, address(this)) >= amount, "Token allowance too low");
        bool sent = _token.transferFrom(msg.sender, to, amount);
        require(sent, "Token transfer failed");
    }
}

La implementación actual devuelve un error de asignación:
“Token allowance too low”

Estoy ejecutándolo con MetaMask (web3 inyectado). Esperaba que MetaMask abriera una ventana de transferencia simple con mi token.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que el usuario no ha dado al contrato inteligente suficiente asignación para transferir los tokens. Esto se puede solucionar utilizando la función approve del contrato del token para dar permiso al contrato inteligente para gastar tokens en nombre del usuario.

    Para hacer esto, el usuario necesita llamar a la función approve del contrato del token con la dirección del contrato inteligente y la cantidad de tokens que desean transferir. Por ejemplo, si el contrato inteligente se despliega en la dirección 0x123 y el usuario desea transferir 100 tokens, debería llamar:

    token.approve(0x123, 100);
    

    Después, en la función stake del contrato inteligente, debe verificar que el usuario haya dado al contrato inteligente suficiente asignación para la transferencia. Esto se puede hacer utilizando la función allowance del contrato del token:

    require(token.allowance(msg.sender, address(this)) >= amount, "Token allowance too low");
    

    Si la asignación es suficiente, entonces se pueden transferir los tokens utilizando la función transferFrom del contrato del token:

    bool sent = token.transferFrom(msg.sender, to, amount);
    require(sent, "Token transfer failed");
    

Comments are closed.