Estoy escribiendo un contrato inteligente que hará algo siempre que el usuario que solicita esa función haya pagado la cantidad correcta. Si la cantidad está en ETH, puedo hacerlo fácilmente con una declaración de requisito simple como esta:
function doSomething() public payable {
require(msg.value == 1 ether); // make sure they paid
// if they paid, proceed with the action
}
Sin embargo, si quiero aceptar otros tokens ERC-20 en lugar de ETH, no estoy seguro de cómo podría hacerlo dentro de mi contrato (es decir, sin ejecutar mi propio servidor separado escuchando la cadena de bloques y extrayendo transacciones individuales).
Dado que todas las transferencias de tokens ERC-20 ocurren dentro del contrato para el token específico (y no dentro de los métodos de mis contratos inteligentes), ¿cómo sabría o validaría mi contrato que:
Donde A es mi contrato inteligente y B es el usuario.
Algunos tokens ERC20 tienen las funciones approve
y transferFrom
. En esos casos, puede tener el usuario approve
algunos tokens para su contrato. Luego, pueden llamar a una función en su contrato que llamará transferFrom
al contrato de token.
Esto requiere que el usuario ejecute al menos dos transacciones: una para invocar approve
el contrato de token y otra para invocar una función en su contrato que a su vez invocará transferFrom
el contrato de token.
Si el token ERC20 no tiene approve
y transferFrom
, necesita un servidor separado para escuchar la cadena de bloques y llamar a su contrato.
En mi opinión, ERC20 está bastante mal pensado y no fue diseñado para manejar esta situación. Es por eso que existen otros estándares de token, como ERC223: https://github.com/Dexaran/ERC223-token-standard
Si se transfieren tokens ERC223 a su contrato, el contrato de token llamará a la tokenFallback
función en su contrato. Esto permite que la transferencia, la verificación y la lógica de su contrato ocurran dentro de 1 transacción.
Esto se puede hacer en una sola transacción. Deberías usar approveAndCall
. Usando esta función, el usuario aprobará una cantidad de tokens y llamará a su contrato en la misma transacción. De esta forma, tu contrato será notificado de la transferencia del token. Esto, por supuesto, implica que el contrato se implementa approveAndCall
, pero lo más probable es que esto se implemente porque approveAndCall
está en la definición del token ERC20 estándar.
Espero que esto ayude
adrianmc
approve
ytransferFrom
es la única opción.jesús