Aquí hay un fragmento de código del ERC223-token-standard .
function transfer(address _to, uint _value, bytes _data) {
// Standard function transfer similar to ERC20 transfer with no _data .
// Added due to backwards compatibility reasons .
uint codeLength;
assembly {
// Retrieve the size of the code on target address, this needs assembly .
codeLength := extcodesize(_to)
}
balances[msg.sender] = balances[msg.sender].sub(_value);
balances[_to] = balances[_to].add(_value);
if(codeLength>0) {
ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
receiver.tokenFallback(msg.sender, _value, _data);
}
Transfer(msg.sender, _to, _value, _data);
}
Lo que no entiendo es cómo funcionan estas dos líneas:
ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
receiver.tokenFallback(msg.sender, _value, _data);
No se crea ninguna nueva instancia aquí, pero todavía estamos llamando a la función. ¿Cómo podemos llamar así a la función del contrato? No hay una construcción en ERC223RecievingContract pero aquí se pasa la dirección. ¿Qué está pasando exactamente aquí?
Se supone que cualquier contrato inteligente que desee interactuar con un token ERC223 implemente la tokenFallback()
función para manejar las transferencias de tokens entrantes.
Esas 2 líneas llaman a esa función en la cuenta de destino (si es un contrato inteligente), por lo que el contrato inteligente de destino DEBE haber implementado previamente la función tokenFallback().
Como se puede ver en la implementación de ejemplo, la función tokenFallback() se puede usar para recuperar todos los datos enviados por la llamada transfer() y usarlos como quieras dentro de tu contrato de receptor:
https://github.com/Dexaran/ERC223-token-standard/blob/Recommended/Receiver_Interface.sol
Es lo mismo que las funciones de respaldo para Ether.
de los documentos:
Los tokens ERC223 deben enviarse llamando a la función de transferencia en el contrato de token sin diferencia si el receptor es un contrato o una dirección de billetera. Si el receptor es una billetera, la transferencia del token ERC223 será la misma que la transferencia ERC20. Si el receptor es un contrato de token ERC223, el contrato intentará llamar a la función tokenFallback en el contrato del receptor. Si no hay una función tokenFallback en el contrato del receptor, la transacción fallará. La función tokenFallback es análoga a la función de respaldo para las transacciones de Ether. Se puede usar para manejar transacciones entrantes.
Esto puede no ser tan claro, pero implica lo siguiente:
Los tokens ERC223 deben usarse mediante transferencia de envío. Si el destinatario es una billetera, no habrá problema. Si el destinatario es un contrato, la transferencia intentará llamar a la función tokenFallback. Si no hay tokenFallback presente, la transacción fallará.
Sin embargo, puede optar por implementar un tokenFallback para manejar las transacciones de tokens entrantes en su contrato. El siguiente ejemplo rechazará todas las transacciones de tokens entrantes, excepto las emitidas por el crowdsale, que se agregarán nuevamente al saldo de crowdsale disponible.
function tokenFallback(address, uint _value, bytes)
isToken
public {
_available = _available.add(_value);
}
Como Pabloruiz55 indicó anteriormente, también se puede usar para obtener la información de la transacción: msg.sender, msg.value y msg.data. También puede enviar estos valores si elige implementar una función tokenFallback, ya que se pasan como parámetros de función. .
ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
definiendo la variable 'tipo' (aquí instancia de contrato --- llamamos a la variable receptora --- invocamos el contrato con el parámetro _toGracias a Kyriediculous por la explicación del Polimorfismo en el Tutorial 17 Polimorfismo https://www.youtube.com/watch?v=l_E5F5qnbtk
ContractReceiver receiver = ContractReceiver(_to);
solo asumimos que en la dirección _to hay un contrato (o implementación de interfaz) llamado ContractReceiver
receiver.tokenFallback(msg.sender, _value, _data);
y ahora asumimos que dicho contrato en _to tiene la función tokenFallback
pero si tal función o tal contrato no existe en tal dirección, fallamos... ¿entonces qué?
Lo encontré aquí: EIP Breakdown: The ERC 223 Token Standard https://www.youtube.com/watch?v=GS62VNyPVHs También vea "Ethereum Cross Chain Atomic Swaps" para transacciones atómicas https://medium.com/@DontPanicBurns /ethereum-cross-chain-atomic-swaps-5a91adca4f43
En Solidity, las transacciones se denominan atómicas, lo que significa que todas las transacciones tienen éxito juntas o todas fallan juntas. Entonces, incluso si falla una línea ( receiver.tokenFallback() ) en la función, toda la función fallará. Luego los saldos serán restaurados a sus valores originales.
Resuelto para la transferencia de tokens ERC223 al contrato error/falla no compatible
Kashish Khullar
ERC223ReceivingContract receiver = ERC223ReceivingContract(_to);
, este código no crea una instancia del contrato de recepción, entonces, ¿cómo llamamos a su función? ¿Es ERC223ReceiveContract un constructor?pabloruiz55