Menu
Coddy logo textTech

Cheat Sheet de Solidity

Estrutura de um contrato

Todo arquivo começa com uma licença e um pragma; o contrato é a unidade de deploy.

SintaxeSignificado
// SPDX-License-Identifier: MITComentário de licença que o compilador espera na linha 1
pragma solidity ^0.8.0;Versão do compilador para a qual o arquivo foi escrito
contract Counter { ... }Declarar um contrato (estado + funções)
constructor(uint start) { count = start; }Executa uma única vez, no deploy
import "./Token.sol";Importar outro arquivo
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";Importar um pacote de biblioteca
interface IToken { function balanceOf(address a) external view returns (uint); }Declarar uma interface (sem corpos)
library Math { function min(uint a, uint b) internal pure returns (uint) { ... } }Uma biblioteca de funções reutilizáveis

Tipos de valor

Os inteiros têm tamanho fixo e não têm decimais; o 0.8 reverte em caso de overflow.

TipoO que armazena
uint256 / uintInteiro sem sinal, de 0 a 2^256 - 1 (uint é uint256)
uint8, uint16, ... uint128Inteiros sem sinal menores, em passos de 8 bits
int256 / intInteiro com sinal (permite negativos)
booltrue ou false
addressEndereço de conta ou contrato de 20 bytes
address payableEndereço que pode receber Ether via transfer/send
bytes32, bytes1...Arrays de bytes de tamanho fixo
enum Status { Open, Closed }Conjunto nomeado de constantes, armazenado como uint8
1 ether, 1 gwei, 1 weiUnidades de Ether: 1 ether = 10^18 wei
1 days, 2 hours, 30 minutesUnidades de tempo, em segundos

Tipos de referência e localização de dados

Arrays, strings, bytes, structs e mappings vivem em storage, memory ou calldata.

SintaxeSignificado
string memory nameString UTF-8 dinâmica (uma cópia temporária)
bytes memory dataArray de bytes dinâmico
uint[] public scores;Array dinâmico em storage
uint[3] fixed;Array de tamanho fixo com 3 elementos
uint[] memory tmp = new uint[](5);Alocar um array em memory
scores.push(42);Acrescentar ao final de um array em storage
scores.pop();Remover o último elemento
scores.lengthNúmero de elementos
storagePersistente, on-chain, caro para escrever
memoryTemporário, vive durante uma chamada
calldataEntrada somente leitura de função external, a mais barata

Mappings e structs

Um mapping é uma tabela hash sem tamanho e sem iteração; um struct agrupa campos.

SintaxeSignificado
mapping(address => uint) public balances;Armazenamento chave-valor; toda chave existe (padrão 0)
balances[msg.sender] += 1;Ler/escrever por chave
mapping(address => mapping(address => uint)) allowance;Mapping aninhado
struct User { string name; uint age; bool active; }Definir um struct
User memory u = User("Ada", 36, true);Criar um struct em memory
User memory u = User({name: "Ada", age: 36, active: true});Criação com campos nomeados
users[msg.sender] = u;Guardar um struct em um mapping
users[msg.sender].age = 37;Atualizar um campo em storage
delete users[msg.sender];Redefinir para os valores padrão

Funções e visibilidade

Toda função declara quem pode chamá-la e se lê ou escreve o estado.

SintaxeSignificado
function add(uint a, uint b) public pure returns (uint) { return a + b; }Uma função com parâmetros e valor de retorno
publicChamável de qualquer lugar (dentro e fora)
externalChamável apenas de fora do contrato
internalEste contrato e os contratos que herdam dele
privateSomente este contrato
viewLê o estado, nunca o escreve
pureNão lê estado nenhum
payablePode receber Ether com a chamada
returns (uint sum, bool ok)Vários valores de retorno nomeados
(uint s, bool ok) = f();Desestruturar vários retornos
uint public count;Variável de estado pública ganha um getter automático count()

Modifiers, constantes e herança

Reutilize verificações com modifiers; fixe valores com constant e immutable.

SintaxeSignificado
modifier onlyOwner() { require(msg.sender == owner, "Not owner"); _; }Definir um modifier (_ = executar o corpo da função)
function withdraw() public onlyOwner { ... }Aplicar um modifier
uint public constant MAX = 100;Constante em tempo de compilação
address public immutable owner;Definido uma vez no constructor e depois fixo
contract Token is ERC20, Ownable { ... }Herdar de outros contratos
function f() public virtual { ... }Permitir sobrescrita
function f() public override { ... }Sobrescrever uma função do pai
super.f();Chamar a implementação do pai
abstract contract Base { function f() public virtual; }Contrato com funções não implementadas

Controle de fluxo

As instruções habituais da família C; não há switch, e loops custam gas por iteração.

SintaxeSignificado
if (x > 5) { ... } else if (x > 2) { ... } else { ... }Ramificações condicionais
for (uint i = 0; i < n; i++) { ... }Loop com contador
while (x < 10) { x++; }Repetir enquanto uma condição for verdadeira
do { ... } while (cond);Executa pelo menos uma vez
break; / continue;Sair do loop / pular para a próxima iteração
x > 0 ? a : bExpressão ternária
a / bDivisão inteira (descarta o resto)
a % bResto
a ** 2Exponenciação
unchecked { x++; }Pular as verificações de overflow (economiza gas, use com cuidado)

Erros: require, revert, assert

Uma verificação que falha desfaz a transação inteira e devolve o gas não usado.

SintaxeSignificado
require(amount > 0, "Amount must be positive");Validar entrada ou estado; reverter com uma mensagem
revert("Not allowed");Abortar incondicionalmente
error Insufficient(uint available, uint requested);Declarar um erro personalizado (mais barato que strings)
revert Insufficient(balance, amount);Reverter com um erro personalizado
assert(total == a + b);Verificar um invariante que nunca deve falhar
try token.transfer(to, amt) returns (bool ok) { ... } catch { ... }Tratar uma chamada externa que falha

Eventos

Eventos gravam logs que apps off-chain podem assinar; não são legíveis a partir de contratos.

SintaxeSignificado
event Transfer(address indexed from, address indexed to, uint value);Declarar um evento
emit Transfer(msg.sender, to, amount);Emiti-lo
indexedParâmetro filtrável (até 3 por evento)
event Log(string message);Qualquer tipo ABI pode ser registrado em log

Ether, endereços e variáveis globais

O contexto da transação vem de msg, block e tx.

SintaxeSignificado
msg.senderEndereço que chamou esta função
msg.valueWei enviados com a chamada (exige payable)
block.timestampHora do bloco atual (segundos desde a epoch)
block.numberAltura do bloco atual
tx.originA conta externa (EOA) que iniciou a tx (evite para autenticação)
address(this).balanceSaldo em Ether deste contrato
payable(to).transfer(1 ether);Enviar Ether; reverte em caso de falha
(bool ok, ) = to.call{value: amt}("");Envio de baixo nível; retorna um indicador de sucesso
receive() external payable {}Executa em uma transferência simples de Ether
fallback() external payable {}Executa quando nenhuma função corresponde
keccak256(abi.encodePacked(a, b))Calcular o hash de valores
abi.encode(x), abi.decode(data, (uint))Codificar / decodificar dados ABI

Toda a sintaxe de Solidity que você usa no dia a dia, em uma só página. Esta cheat sheet de Solidity é uma referência rápida da linguagem de smart contracts da Ethereum e de todas as chains EVM: declarar um contrato, escolher tipos, guardar dados em mappings e structs, escrever funções com a visibilidade e a mutabilidade certas, e protegê-las com require, modifiers e eventos.

A sintaxe aqui é a do Solidity 0.8, que verifica overflow aritmético por padrão e funciona com Remix, Hardhat e Foundry. Copie o que precisar ou teste ao vivo no playground de Solidity: escreva um contrato, compile e execute em uma EVM no seu navegador.

Solidity cheat sheet FAQ

Is this Solidity cheat sheet free?
Yes. This cheat sheet is free to use, with no sign-up required. Bookmark it and come back any time you need a quick reference.
Is this cheat sheet good for beginners?
Yes. It is organized by topic so you can find what you need at any level, and each entry links back to Coddy's free interactive Solidity course when you want to go deeper.
Coddy programming languages illustration

Aprenda Solidity com a Coddy

COMEÇAR