¿Cómo se puede aprobar un token a través de una interfaz?

Tengo una interfaz para Dai desde mi contrato y quiero permitir que un usuario apruebe el contrato para transferir su Dai. Dai usa el código DSToken que tiene una función de aprobación que se basa en msg.sender:

function approve(address guy, uint wad) public returns (bool) {
    _approvals[msg.sender][guy] = wad;

    Approval(msg.sender, guy, wad);

    return true;
}

Tengo una interfaz que hereda mi contrato que llama al contrato de interfaz como

contract DaiInterface {

    function approve(address guy, uint wad) public returns (bool);
}



contract DaiTransferrer is Ownable {

    DaiInterface daiContract;

    function approveDai(address guy, uint wad) public {
        daiContract.approve(guy, wad);
    }
}

Entonces, el problema es que msg.sender cambia cuando llega al contrato de token, por lo que creo que se aprueba el código de interfaz en lugar del contrato principal que necesita transferir el Dai. ¿Cuál es la mejor manera de resolver esto?

el msg.sender en el contrato Dai es la dirección de su contrato principal DaiInterface. La pregunta es si la dirección aprobada es la dirección de su contrato o un EOA.

Respuestas (2)

Imposible.

Creo que no entiendes el approvemétodo. Un contrato no puede aprobarse a sí mismo para gastar fondos de otras personas bajo ninguna circunstancia.

Debe coordinarlo en el front-end para que el usuario envíe dos transacciones de forma coreografiada.

  1. Usuario => DAI (token contract), aprueba el contrato de destino (tuyo) para retirar un monto.
  2. Usuario => contrato, transferFrom DAI (token contract), ejercer el permiso otorgado en el paso 1.

Espero eso ayude.

No creo que lo que estás tratando de hacer sea posible.

Imagine que podría crear una función que aprueba una cantidad de un token para que otra dirección la gaste. Si hiciera un contrato malicioso y consiguiera que llamaras a esa función, podría robar todos tus tokens de esta manera.

Lo mismo con la función de transferencia.

Es por eso que estas funciones usan msg.sender, precisamente para asegurarse de que solo la persona exacta que debería poder llamar a esa función (dentro de un contexto de usuario particular) lo haga de manera explícita.