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: MITpragma 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: MITpragma solidity ^0.8.13;// import Foo.sol do diretório localimport "./Foo.sol";// import {symbol1 as alias, symbol2} from "arquivo";import {Unauthorized, add as func, Point} from "./Foo.sol";contract Import {// Inicializando o contrato Foo.solFoo 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.solimport "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.solimport "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: MITpragma 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ídorequire(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);}}