¿La conversión de tipo de vars de dirección a tipos de contrato es más costosa que definir vars como tipos de contrato? ¿Y por qué?

Digamos que tenemos dos opciones para definir un token como variable de almacenamiento:

un :

address token = 0xc0ffee...;
...
for(...) {
  IERC20(token).transfer(...);
}

segundo :

IERC20 token = IERC20(0xc0ffee...);
...
for(...) {
  token.transfer(...);
}

De las dos opciones anteriores, ¿cuál sería la opción más eficiente en gas para acceder e interactuar con el contrato de token? ¿Y por qué?

Estoy bastante seguro de que no hay diferencia en los costos de gasolina, al menos no cuando el optimizador está habilitado.

Respuestas (1)

De las dos opciones anteriores, ¿cuál sería la opción más eficiente en gas para acceder e interactuar con el contrato de token? ¿Y por qué?

Son exactamente lo mismo.

No hay diferencia entre addressy cualquier interfaz o contrato para el caso. El verdadero tipo subyacente es siempre la dirección. IERC20o cualquier otra cosa es solo una forma de interpretar an addresscomo el identificador de un tipo específico de contrato.

Vea el siguiente ejemplo:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface iToken {
        function transfer() external view; 
}

contract Token is iToken {
        function transfer() public override view {
                return;
        }
}

contract Test1 {

        address token;

        constructor(address _token) {
                token = _token;
        }

        function test() public view {
                iToken(token).transfer();             
        }
}

contract Test2 {

        iToken token;

        constructor(iToken _token) {
                token = _token;
        }

        function test() public view {
                token.transfer();
        }
}

contract Test3 {

        Token token;

        constructor(Token _token) {
                token = _token;
        }

        function test() public view {
                token.transfer();
        }
}

Llamar a la testfunción en Test1, Test2 o Test3 cuesta 26277gas en todos los casos (Remix - configuración predeterminada).

También puede verificar la ranura de almacenamiento 0 de todos los contratos TestX y ver que todos tienen el mismo valor: el addressdel contrato Token. No hay diferencia en los niveles inferiores.