¿Cómo validar pagos ERC-20 en un contrato?

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:

  1. Se ha transferido la cantidad correcta.
  2. El monto fue transferido desde la dirección A.
  3. El monto fue transferido a la dirección B.

Donde A es mi contrato inteligente y B es el usuario.

Respuestas (2)

Algunos tokens ERC20 tienen las funciones approvey transferFrom. En esos casos, puede tener el usuario approvealgunos tokens para su contrato. Luego, pueden llamar a una función en su contrato que llamará transferFromal contrato de token.

Esto requiere que el usuario ejecute al menos dos transacciones: una para invocar approveel contrato de token y otra para invocar una función en su contrato que a su vez invocará transferFromel contrato de token.

Si el token ERC20 no tiene approvey 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 tokenFallbackfunció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.

Entonces, ¿parece que no hay una forma real de hacer esto con una transacción si se trata de un token ERC-20 (a diferencia del ERC223)? Parece que la técnica approvey transferFromes la única opción.
@adrianmc Si el contrato de token no puede entregar una devolución de llamada, necesita al menos dos transacciones.

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 approveAndCallestá en la definición del token ERC20 estándar.

Espero que esto ayude