El modificador a pagar activa una acción cuando una dirección envía ether a un contrato.
Por ejemplo:
function () public payable {
require(msg.data.length == 0);
DoSomething();
}
¿Esta acción también se activa cuando msg.sender envía tokens? Mi pregunta es si es posible activar acciones a través de pagos cuando una dirección también envía tokens, o si es necesario otro modificador o una solución más compleja para lograr esto.
Para poder manejar la recepción de tokens, puede hacer que su clase herede del ERC223Receiver
estándar:
contract ERC223Receiver
{
function tokenFallback(address _from, uint _value, bytes _data);
}
contract YourContract is ERC223Receiver
{
function tokenFallback(address _from, uint _value, bytes _data)
{
// Handle receiving tokens
}
}
No he probado esto yo mismo.
tokenFallback
sea llamado por el propio contrato del token, msg.sender
será la dirección del contrato del token. Probablemente debería lanzar si tokenFallback
no es llamado por un contrato de token de confianza.tokenFallback
a su contrato. El hecho de que la llamada a tokenFallback
provenga del contrato de token prueba que se transfirieron tokens reales. La cadena de llamadas es así: USUARIO --> TokenContract.transfer(..) --> YourContract.tokenFallBack(...)function tokenFallback(...)
si quiere ejecutar algún código cuando recibe tokens. El contrato de token necesita llamar tokenFallback(...)
dentro de sufunction transfer(...)
El modificador pagadero permite que la función reciba ether. La función en su ejemplo es una función alternativa pagable predeterminada que se llamará cada vez que alguien envíe ether a su contrato.
También puede implementar cualquier otra función como pago para que esta función pueda aceptar Ether.
Payable solo permite que la función acepte ether y no está relacionado de ninguna manera con las transferencias de tokens.
Enviar tokens es solo una función de transferencia en el estándar ERC20. De forma predeterminada, solo cambiará el saldo dentro del token. Entonces, si envía 1 token de A a B, el único cambio será que:
token.balances[A] = token.balannces[A] - 1
token.balances[B] = token.balances[B] + 1
Para poder hacer lo que quieras tienes dos opciones.
Implemente sus tokens para que llamen a la función tokenFallback cuando se llame a la transferencia. Tenga en cuenta que el token de envío debe llamar a la función tokenFallback en el contrato de recepción. El token Open Zeppelin ERC20 predeterminado no lo hace. Tendrás que hacerle una modificación.
Escriba un código javascript o python usando la biblioteca web3 que escuchará los eventos de transferencia de su token y llamará a alguna función en el contrato de recepción cuando se realice la transferencia.
Badr Bellaj