Antes de fazer deploy de um smart contract em qualquer rede, você o escreve em Solidity, compila com o Hardhat e testa localmente. O Hardhat te dá uma blockchain local, um framework de testes e scripts de deploy, tudo em um único pacote.
TL;DR: Escreva, compile e teste um smart contract em Solidity usando o Hardhat com uma rede blockchain local.
Stack: Hardhat, Solidity, Node.js, Ethers.js
Nível: Intermediário
Tempo de leitura: ~10 min
Inicializar o projeto
npx hardhat
Escolha “Create a TypeScript project” e instale as dependências do projeto de exemplo.
Criar o smart contract
Crie um arquivo na pasta contracts/, por exemplo contracts/HelpChains.sol:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
contract HelpChains {
address payable public address1 = payable(0xAAAA1111BBBB2222CCCC3333DDDD4444EEEE5555);
address payable public address2 = payable(0xBBBB2222CCCC3333DDDD4444EEEE5555FFFF6666);
struct Transaction {
uint256 amount;
address from;
address to;
uint256 timestamp;
}
Transaction[] public donations;
Transaction[] public withdrawals;
function donate() external payable {
require(msg.value > 0, "Valor deve ser maior que 0");
uint256 half = msg.value / 2;
address1.transfer(half);
address2.transfer(msg.value - half);
donations.push(Transaction({
amount: msg.value,
from: msg.sender,
to: address(0),
timestamp: block.timestamp
}));
}
function withdraw() external {
uint256 balance1 = address1.balance;
uint256 balance2 = address2.balance;
require(balance1 > 0 || balance2 > 0, "Sem saldo para retirar");
if (balance1 > 0) {
address1.transfer(balance1);
withdrawals.push(Transaction({amount: balance1, from: address1, to: address1, timestamp: block.timestamp}));
}
if (balance2 > 0) {
address2.transfer(balance2);
withdrawals.push(Transaction({amount: balance2, from: address2, to: address2, timestamp: block.timestamp}));
}
}
function getDonations() external view returns (Transaction[] memory) { return donations; }
function getWithdrawals() external view returns (Transaction[] memory) { return withdrawals; }
}
Compilar
npx hardhat compile
Configurar o módulo ignition
// ignition/modules/HelpChainsModule.ts
import { buildModule } from "@nomicfoundation/hardhat-ignition/modules";
const HelpChainsModule = buildModule("HelpChainsModule", (m) => {
const helpChains = m.contract("HelpChains", []);
return { helpChains };
});
export default HelpChainsModule;
Configurar rede local (hardhat.config.ts)
import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
const config: HardhatUserConfig = {
solidity: "0.8.24",
defaultNetwork: "local",
networks: {
local: {
url: "http://127.0.0.1:8545",
chainId: 31337,
accounts: {
mnemonic: "test test test test test test test test test test test junk"
}
}
}
};
export default config;
Rodar localmente e fazer deploy
# Iniciar o nó local
npx hardhat node
# Deploy (adicione antes ao package.json scripts)
# "deploy:dev": "npx hardhat ignition deploy ignition/modules/HelpChains.ts --network local"
npm run deploy:dev
Interagir pelo console
npx hardhat console --network local
const HelpChains = await ethers.getContractFactory("HelpChains");
const helpChains = await HelpChains.attach("ENDERECO_DO_CONTRATO_DEPLOYADO");
await helpChains.donate({ value: ethers.parseEther("1.0") });
let donations = await helpChains.getDonations();
console.log(donations);
O que você construiu
Um projeto Hardhat com um contrato Solidity compilado, um script de deploy funcionando localmente, e as ferramentas para interagir com ele pelo console.
Próximos passos
- Escreva testes que cubram casos extremos e condições de falha, não só o caminho feliz. Bugs em smart contracts não podem ser corrigidos após o deploy.
- Use o console.sol do Hardhat para debugar durante o desenvolvimento: import “hardhat/console.sol” permite imprimir variáveis no terminal a partir do Solidity.
- Rode
npx hardhat coveragepara ver quais linhas do seu Solidity estão cobertas por testes antes de fazer deploy em uma testnet.
Dúvidas ou feedback? Me encontre no LinkedIn ou GitHub.