¿La función () el modificador público pagable puede desencadenar acciones al enviar tokens o solo funciona al enviar ether?

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.

normalmente hay una función de depósito para token en lugar de la cual puede poner su DoSomehting ()

Respuestas (2)

Para poder manejar la recepción de tokens, puede hacer que su clase herede del ERC223Receiverestá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.

Fuente: https://github.com/ethereum/EIPs/issues/744

Gracias @Jesse, parece una respuesta viable. Pero, ¿dónde defino qué token estoy recibiendo? ¿Debería haber un lugar para definir la dirección del token?
Cuando tokenFallbacksea llamado por el propio contrato del token, msg.senderserá la dirección del contrato del token. Probablemente debería lanzar si tokenFallbackno es llamado por un contrato de token de confianza.
También asegúrese de investigar la adopción de ERC223. No estoy seguro de que se construyan muchos tokens todavía con este estándar.
@JesseBusman pero eso significa que solo el contrato de token puede interactuar con el otro contrato. Lo que quiero es que los poseedores de tokens de mi token puedan enviar tokens al otro contrato e interactuar con él. ¿Es eso posible?
@MoisésBriseñoEstrello No, eso no es lo que significa. Cada vez que un titular de fichas envía fichas a su contrato, está interactuando con su contrato y el contrato de fichas actúa como intermediario. Cuando envía tokens, en realidad solo está llamando a la función de transferencia en un contrato de token. El contrato de token, a su vez, llamará tokenFallbacka su contrato. El hecho de que la llamada a tokenFallbackprovenga del contrato de token prueba que se transfirieron tokens reales. La cadena de llamadas es así: USUARIO --> TokenContract.transfer(..) --> YourContract.tokenFallBack(...)
Ok, pero entonces tokenFallback debe escribirse en el contrato de token. es posible tener esa función viviendo en otro contrato. Básicamente, lo que quiero es que los poseedores de tokens puedan enviar tokens a OTRO contrato mío e interactuar con él. ¿Es posible o alguna funcionalidad dentro de esos tokens debe vivir en el contrato de token original?
@MoisésBriseñoEstrello El contrato de recepción debe tener un 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.

  1. 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.

  2. 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.