Import e Libraries, para que servem?

porMatheusem25/05/2022

Nesse artigo iremos abordar sobre como importar novas libraries em seu contrato inteligente.

Import

Você pode importar arquivos locais e externos no Solidity usando a sintaxe import, é possível importar arquivos .sol ou bibliotecas de alguma url, como por exemplo do github.

Local

Um exemplo de estrutura de pastas.

├── Import.sol
└── Foo.sol

Foo.sol

Um exemplo de arquivo que pode ser importado em outro contrato

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
struct Point {
uint x;
uint y;
}
error Unauthorized(address caller);
function add(uint x, uint y) pure returns (uint) {
return x + y;
}
contract Foo {
string public name = "Foo";
}

Import.sol

Um exemplo de arquivo que pode ser importado em outro contrato

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
// import Foo.sol do diretório local
import "./Foo.sol";
// import {symbol1 as alias, symbol2} from "arquivo";
import {Unauthorized, add as func, Point} from "./Foo.sol";
contract Import {
// Inicializando o contrato Foo.sol
Foo public foo = new Foo();
// Testar o Foo.sol através da função .name()
function getFooName() public view returns (string memory) {
return foo.name();
}
}

Externo

Você também pode importar do GitHub simplesmente copiando o url do arquivo que deseja importar para o seu contrato

// Exemplo de como fica uma importação do arquivo Contract.sol de um repositório do GitHub
// https://github.com/owner/repo/blob/branch/path/to/Contract.sol
import "https://github.com/owner/repo/blob/branch/path/to/Contract.sol";
// Exemplo de como fica uma importação do arquivo ECDSA.sol do repositório openzeppelin-contract, release-v4.5 branch
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.5/contracts/utils/cryptography/ECDSA.sol
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/release-v4.5/contracts/utils/cryptography/ECDSA.sol";

Library (Bibliotecas)

As bibliotecas são semelhantes aos contratos, mas você não pode declarar nenhuma variável de estado e não pode enviar ether.

Uma biblioteca é incorporada ao contrato se todas as funções da biblioteca forem internas.

Caso contrário, a biblioteca deve ser implantada e vinculada antes que o contrato seja implantado.

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
library SafeMath {
function add(uint x, uint y) internal pure returns (uint) {
uint z = x + y;
require(z >= x, "estouro de uint");
return z;
}
}
library Math {
function sqrt(uint y) internal pure returns (uint z) {
if (y > 3) {
z = y;
uint x = y / 2 + 1;
while (x < z) {
z = x;
x = (y / x + x) / 2;
}
} else if (y != 0) {
z = 1;
}
// else z = 0 (default value)
}
}
contract TestSafeMath {
using SafeMath for uint;
uint public MAX_UINT = 2**256 - 1;
function testAdd(uint x, uint y) public pure returns (uint) {
return x.add(y);
}
function testSquareRoot(uint x) public pure returns (uint) {
return Math.sqrt(x);
}
}
// Função de matriz para excluir o elemento no índice e reorganizar a matriz
// para que não haja lacunas entre os elementos.
library Array {
function remove(uint[] storage arr, uint index) public {
// Mova o último elemento para o local a ser excluído
require(arr.length > 0, "Array vazia");
arr[index] = arr[arr.length - 1];
arr.pop();
}
}
contract TestArray {
using Array for uint[];
uint[] public arr;
function testArrayRemove() public {
for (uint i = 0; i < 3; i++) {
arr.push(i);
}
arr.remove(1);
assert(arr.length == 2);
assert(arr[0] == 0);
assert(arr[1] == 2);
}
}

Testar no Remix