¿Es posible llamar a otro contrato desde un contrato que mantiene el msg.sender de la persona que llama original?

Imagine que Alice llama a un método de contrato C1 y ese método llama a otro método en el contrato C2.

Regularmente msg.senderes igual a la Cuenta Alice en el método C1. Y msg.senderes igual a la dirección del contrato C1 en el método C2.

Me gustaría saber si es posible llamar a C2 de tal manera que msg.sendersiga siendo la dirección de Alice en lugar de la dirección de C1. Y que C2 puede acceder a las variables de estado de C2.

He intentado usar delegatecally callcode, pero esas funciones parecen que C2 solo tiene acceso al estado C1 pero no al estado C2. Supongo que esas convocatorias están más preparadas para las bibliotecas.

Sería bueno tener un ejemplo de esta llamada.

Imagina que le pides a un intercambio que envíe ether a un contrato inteligente que creaste, podrías transferir tokens almacenados en nombre de la dirección que envía ether. La mayoría de los intercambios almacenan ether y tokens ERC20 en la misma dirección.
@ user2284570 Ha marcado la nueva pregunta como duplicada de la anterior. También las respuestas aquí son mejores.
@jbaylina, ¿qué sucede cuando intentas delegar llamar a C1 desde C2? ¿Por qué no funciona?

Respuestas (2)

He intentado usar delegar llamada y código de llamada, pero esas funciones parecen que C2 solo tiene acceso al estado C1 pero no al estado C2.

Correcto.

Si desea el estado de C2, puede usar tx.origino hacer que el método de C2 tome un address _caller (ejemplo) adicional de que C1 pasa la dirección de Alice. C2 luego usa _calleren lugar de msg.sender.

Usar tx.originsignifica que Alice no puede ser un contrato y ¿Cómo hago que mi DAPP sea "a prueba de serenidad"? sugiere evitar el uso de tx.origin.

Si todo lo que desea saber es el autor de la transacción original (a diferencia de la llamada actual), simplemente puede consultar en tx.originlugar de msg.caller.

¡Es una buena respuesta! pero lo dejo abierto porque estoy encontrando algo que se puede hacer en el C1 ya que el C2 ya está implementado.