Herencia, Importaciones y Remix

Este es el LSP3Accountcontrato: https://github.com/lukso-network/standards-implementations/blob/master/contracts/Accounts/LSP3Account.sol

Quiero crear un contrato en Remix que herede de él. Intenté esto:

pragma solidity ^0.6.0;

import "https://github.com/lukso-network/standards-implementations/blob/master/contracts/Accounts/LSP3Account.sol";

contract MyProfile is LSP3Account(msg.sender) {
    
}

Pero esto da como resultado: no encontrado @openzeppelin/contracts/introspection/ERC165.sol

Así que copié y pegué todo el LSP3Account.solcontrato en Remix, para intentar arreglar las importaciones manualmente.

Pensé que una vez que se arreglaran estas importaciones, finalmente podría heredar del LSP3Accountcontrato.

Sin embargo, cuando arreglé la ERC165.solimportación, apareció otro error de importación ( UniversalReceiverDelegate.sol).

Una vez que arreglé eso, apareció otro error de importación ( UniversalReceiver.sol). También arreglé eso.

Pero mis importaciones comenzaron a salirse de control. Aquí está la parte superior de mi archivo. Usé OLDy NEWpara marcar las importaciones fijas:

pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;

// interfaces
//import "../_LSPs/ILSP1_UniversalReceiver.sol"; OLD 3
import "https://github.com/lukso-network/standards-implementations/blob/master/contracts/_LSPs/ILSP1_UniversalReceiver.sol"; // NEW 3
//import "../_LSPs/ILSP1_UniversalReceiverDelegate.sol"; OLD 2
import "https://github.com/lukso-network/standards-implementations/blob/master/contracts/_LSPs/ILSP1_UniversalReceiverDelegate.sol"; // NEW 2

// modules
import "erc725/contracts/ERC725/ERC725Account.sol";
//import "@openzeppelin/contracts/introspection/ERC165.sol"; OLD 1
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/docs-v3.x/contracts/introspection/ERC165.sol"; // NEW 1

contract LSP3Account is ERC165, ERC725Account, ILSP1 {

Pero adivina qué, ahora aparece el error: no encontrado @openzeppelin/contracts/cryptography/ECDSA.sol

Este nuevo error de importación ni siquiera es del LSP3Accountcontrato. Es de uno de los contratos de los que hereda.

La única solución que veo sería copiar y pegar todo el árbol de herencia y corregir las importaciones de abajo hacia arriba. Pero esto parece ridículamente complicado.

También sé que puedo clonar el proyecto localmente, ejecutarlo npm instally se instalarán todas las dependencias. Pero:

  1. Tuve problemas porque las dependencias tienen diferentes versiones del compilador.
  2. Es mucho más fácil implementar desde Remix, en lugar de implementar desde archivos locales.

Así que un par de preguntas:

1. ¿Puedo cancelar importaciones de contratos de los que heredo mi contrato?

2. Más importante aún, ¿no hay una forma de simplificar estos problemas de herencia e importación en el IDE de Remix?

Respuestas (1)

No, no puede evitar las importaciones heredadas porque el contrato del que hereda lo necesita.

Debe importar cada paquete que se necesita para que funcione cada contrato.

@openzeppelin/contracts/cryptography/ECDSA.solEste tipo de sintaxis se usa para importar paquetes locales, pero dado que no hay paquetes locales en remix, debe usar la ruta completa a GitHub, ya lo hizo aquí:

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/docs-v3.x/contracts/introspection/ERC165.sol"; 

Otra forma de importar es simplemente copiar y pegar todas las dependencias en su carpeta, por lo que será importable con './'sintaxis, pero eso hará que su lugar de trabajo sea un poco desordenado y, sinceramente, usar rutas de GitHub es una forma mucho más fácil y limpia de hacerlo.

Para que conste, recomiendo encarecidamente usar truffle/hardhat, puede ser un poco difícil que remix pero para proyectos serios, es muy útil de muchas maneras, especialmente para pruebas unitarias, y también, la gestión de dependencias es más fácil.