Llamar a un contrato desde otro contrato deja transacción pendiente para siempre

Estoy desarrollando una DApp en Kovan Network en Remix y tengo problemas para entender el problema. Estoy tratando de llamar al contrato Wrapped Ether (WETH: https://kovan.etherscan.io/address/0xd0a1e359811322d97991e03f863a0c30c2cf029c ) desde mi propio contrato (para envolver/desenvolver automáticamente el éter que depositan mis usuarios).

Cuando estoy llamando al contrato de Etherscan a través de Metamask, puedo depositar y retirar WETH sin ningún problema.

Sin embargo, el problema surge cuando trato de 'depositar' (con mi función wrapETH) y luego 'retirar' WETH a través de mi contrato. Me di cuenta del problema cuando mis intentos de retiro siempre se revertían. Me di cuenta de que la transacción de depósito siempre estuvo pendiente en Remix, aunque la transacción se extrajo en su página etherscan (por ejemplo: https://kovan.etherscan.io/tx/0xe815da928878318b9e8eff18eb8ae353ebc0e8db9cd8fb2b39ca2b55f13d06f9 ), y que pude ver el Evento y verificar mi saldo en la página WETH. La transacción en sí tampoco apareció en la página WETH. Otra cosa extraña en esta transacción pendiente son los 'datos de entrada' que son ilegibles en comparación con otras transacciones.

¿Alguien sabe lo que está sucediendo y por qué hay una diferencia entre llamar al contrato WETH desde Etherscan (nuevamente, donde la transacción se extrae y registra directamente) y no desde mi contrato?

Aquí están las funciones a las que llamo (con solo las útiles)

WETH9_ WETHContract = WETH9_(0xd0a1e359811322d97991e03f863a0c30c2cf029c);

function depositETH() public payable{ 

}

function wrapETH(uint256 _amount) public{
     WETHContract.deposit.value(_amount)();
}

function withdrawETH(uint256 _amount) public{
    WETHContract.withdraw(_amount);
}

Gracias

Respuestas (1)

La transacción está funcionando como se esperaba.

El seguimiento de paridad de su contrato lo muestra llamando al contrato WETH. Su transacción también genera el Deposit evento por el valor de la transacción. Si va a la página de lectura del contrato WETH y consulta el saldo de 0xf2a800fa540060384ed4d778db7cafdf477df2ec, obtendrá un saldo WETH adecuado.

La única diferencia estaría en quién recibe el WETH. Cuando usa Metamask para llamar directamente al contrato WETH, WETH se enviará a la cuenta de propiedad externa que inició la transacción.

Cuando revisa su contrato, su WETH se acredita a su contrato, ya que en lo que respecta a WETH, es msg.sendersu contrato.

Debe mantener un libro mayor interno dentro de su contrato de saldos de usuario. Cuando llame a la función de retiro, el éter llegará a su contrato y deberá reenviarlo al usuario.

Sí, eso es lo que estoy haciendo en la versión completa. Sin embargo, incluso en esta versión, la función de retiro no funciona cuando se llama, pero para mí mi contrato (0xf2a...) debería, como usted dice, tener el WETH necesario y, por lo tanto, poder retirar ETH del contrato WETH. Aquí está la transacción fallida de la función de retiro ETH: kovan.etherscan.io/tx/…
Está funcionando, solo necesita una función de respaldo pagable en su contrato para aceptar el éter
¡Era de hecho la función de reserva! Nunca supe que lo necesitaba para esto... ¡Muchas gracias por su ayuda!