Interacción de contratos y transacciones por lotes con Web3

He revisado la mayoría de las publicaciones sobre este tema, pero ninguna de las respuestas está haciendo exactamente lo que necesito.

Tengo una aplicación que permite a los usuarios enviar sus tokens de su contrato a mi "grupo" en mi propia dirección de contrato. Lo que quiero que suceda es que una dirección externa pueda solicitar mi propio contrato para enviarles estos nuevos tokens después de que paguen una tarifa ETH. Entonces, la secuencia es la siguiente, usando cantidades aleatorias, por ejemplo:

  • El usuario A (propietario del contrato) envía 100 tokens desde la dirección de su contrato a la dirección de mi grupo (ya tengo esto funcionando)
  • El usuario B (comprador interesado) hace clic en un botón en mi aplicación que le otorgará 20 de estos tokens de la dirección de mi grupo a cambio de la cantidad de ETH predeterminada en la aplicación.

Supongo que tendré que usar una función de adición por lotes aquí para liberar los tokens y aceptar el ETH, pero ¿cómo hago para que la dirección de mi grupo apruebe la transacción automáticamente sin mi interferencia?

  • Nota: la dirección de mi grupo puede contener varios tokens, por lo que también tendría que especificar qué token se envía durante la transacción.

Respuestas (1)

En el paso 1, el usuario simplemente se transfiere a su contrato en el contrato de token ERC20. Su contrato ni siquiera es consciente de que esta transferencia se llevó a cabo.

En el paso 2, el usuario compra algún token X de su contrato, por un precio, y su contrato envía los tokens, si el contrato tiene suficientes, o la transacción falla y los fondos se devuelven al usuario, que es lo que desea.

function(SafeERC20 token, uint amount) public payable {
  require(msg.value == amount); // price is 1:1 in the example
  // emit an event
  token.safeTransfer(msg.sender, amount);
}

Eso es todo. Utilice la implementación de openZeppelin SafeERC20 para una protección importante, ya que permite al usuario pasar una dirección de contrato que no es de confianza . Aún mejor, incluya contratos de tokens en la lista blanca para que pueda repeler implementaciones sospechosas y aprobar solo implementaciones que se comporten bien.

mapping(SafeERC20 => bool) public isApproved;
require(isApproved[token], "Not an approved token.");

En el caso de que rechace algunos contratos de tokens, tiene una preocupación adicional sobre qué hacer con los tokens que quedan atrapados en su contrato, pero eso está un poco fuera del alcance de la pregunta original.

No verifica el saldo de su contrato en el token de su elección porque la transferencia fallará si su contrato no tiene fondos suficientes. Si la transacción falla, el ether enviado será devuelto al remitente. Todo en el lugar correcto. hemos terminado

Espero eso ayude.

Si usted