Código de migración de trufa con biblioteca, interfaz y contrato

Supongamos que tengo un contrato simbólico de la siguiente manera. ¿ Cómo puedo escribir el nuevo migration.jsarchivo en truffle para implementar el contrato?

TestCoin.sol

import "openzeppelin-solidity/contracts/math/SafeMath.sol";
import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol";

contract ERC20 is IERC20 {

}

contract TestCoin is ERC20 {

}

1_migración_inicial.js

var Migrations = artifacts.require("./Migrations.sol");

module.exports = function(deployer) {
  deployer.deploy(Migrations);
};

Estoy pensando en algo como esto, pero no estoy seguro si es correcto

var SafeMath = artifacts.require("./SafeMath.sol");
var TestCoin = artifacts.require("./TestCoin.sol");

module.exports = function(deployer) {
  deployer.deploy(SafeMath);
  deployer.link(SafeMath, TestCoin);
  deployer.deploy(TestCoin);
};

Respuestas (2)

Según mi conocimiento, hay dos tipos de bibliotecas:

  1. Todo con método interno
    • Este tipo de bibliotecas no se implementan explícitamente, se incluyen en el propio contrato. es decir. SafeMath de openzeppelin.
    • Las bibliotecas internas no necesitan estar vinculadas con el contrato principal.
    • Están incluidos en el propio código de bytes del contrato.
    • Considere la siguiente biblioteca:
     pragma solidity ^0.8.0;
     // library for uint array 
     library UintArrayLib {
         using UintArrayLib for uints;
    
         struct uints {
             uint[] array;
         }
    
         function add(uints storage self, uint _uint)
             internal
         {
             if(! exists(self, _uint)){
                 self.array.push(_uint);
             }
         }
    
         function remove(
             uints storage self,
             uint _uint
         ) internal {
         for (uint256 i = 0; i < self.array.length; i++) {
                 if (
                     self.array[i] == _uint 
                 ) {
                     delete self.array[i];
                 }
             }
         }
    
    
         function exists(
             uints storage self,
             uint _uint
         ) internal view returns (bool) {
             for (uint256 i = 0; i < self.array.length; i++) {
                 if (
                     self.array[i] == _uint 
                 ) {
                     return true;
                 }
             }
             return false;
         }
     }
    
     contract BuyList is Ownable, ReentrancyGuard {
         using UintArrayLib for UintArrayLib.uints;
         // Rest of the code goes here
     }
    
    • Para implementar el contrato BuyList, escribirá la siguiente migración:
    var BuyList = artifacts.require("BuyList");
    
    module.exports = function(deployer) {
        deployer.deploy(BuyList);
    };
    
  2. Al menos un método público
    • Estos métodos públicos de contrato no se incluyen en el contrato directamente y toda la biblioteca se implementa explícitamente como una nueva dirección.
    • Estas bibliotecas deben estar vinculadas al contrato principal.
    • Estas bibliotecas no están incluidas en el código de bytes del contrato y se usan principalmente cuando el contrato alcanza el límite de tamaño máximo del código de bytes.
    • considere el siguiente ejemplo de biblioteca.
    
    pragma solidity ^0.8.0;
    // library for uint array 
    library UintArrayLib {
        using UintArrayLib for uints;
    
        struct uints {
            uint[] array;
        }
    
        function add(uints storage self, uint _uint)
            public
        {
            if(! exists(self, _uint)){
                self.array.push(_uint);
            }
        }
    
        function remove(
            uints storage self,
            uint _uint
        ) public {
        for (uint256 i = 0; i < self.array.length; i++) {
                if (
                    self.array[i] == _uint 
                ) {
                    delete self.array[i];
                }
            }
        }
    
    
        function exists(
            uints storage self,
            uint _uint
        ) internal view returns (bool) {
            for (uint256 i = 0; i < self.array.length; i++) {
                if (
                    self.array[i] == _uint 
                ) {
                    return true;
                }
            }
            return false;
        }
    }
    
    contract BuyList is Ownable, ReentrancyGuard {
        using UintArrayLib for UintArrayLib.uints;
        // Rest of the code goes here
    }
    
    • Para implementar el contrato BuyList, escribirá la siguiente migración:
    var UintArrayLib = artifacts.require("UintArrayLib");
    var BuyList = artifacts.require("BuyList");
    
    module.exports = function(deployer) {
        deployer.deploy(UintArrayLib); // Explicity deployment of lib
        deployer.link(UintArrayLib, BuyList); // Linking the lib
        deployer.deploy(BuyList); // Deploying main contract
    };
    

Sí, tienes razón, pero necesitas linkind para truffle cuando usas bibliotecas importadas explícitamente, mientras tanto puedes usar:

Contrato:

pragma solidity ^0.4.23;

import "openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";

contract TestCoin is ERC20 {
}

Guión de implementación:

var TestCoin = artifacts.require("./TestCoin.sol");

module.exports = function(deployer) {
    deployer.deploy(TestCoin);
};
¿Qué quieres decir? Usted menciona la necesidad de vincular la trufa cuando usa explícitamente bibliotecas importadas, pero en el ejemplo de secuencia de comandos de implementación que muestra no usó el enlace a la biblioteca
1. Truffle no solicitará vincular una biblioteca externa. 2. Si usa la migración con fines de prueba, no necesita vincular SafeMath, TestCoinporque no usa SafeMathen el constructor
Omito el uso de SafeMath en el código para el código de muestra. .. en el código actual se usa safemath. Entonces, ¿necesito vincular SafeMath?
y ¿qué significa que la trufa no pedirá vincular una biblioteca externa?
La biblioteca externa es la biblioteca del npmpaquete ( openzeppelin-solidity), cuando usa la biblioteca, no necesita vincularla.