> For the complete documentation index, see [llms.txt](https://docs.chiliz.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.chiliz.com/pt-br/desenvolver/basico/escrever-smart-contract.md).

# Escrever um Smart Contract

A partir do momento em que você decide criar um dApp na Chiliz Chain, precisa levar em conta as especificidades do nosso blockchain.

Embora a Chiliz Chain seja compatível com EVM, tratá-la exatamente como o Ethereum pode causar problemas de usabilidade, especialmente em relação a decimais de token e à mecânica de gas.

Vamos explorar!

## Pré-requisitos

### Ambiente

Antes de começar a escrever seu contrato, verifique se seu ambiente está pronto.

Primeiro, você deve ter uma carteira configurada para a Spicy Testnet (para desenvolvimento) ou para a Chiliz Chain Mainnet (para produção).

{% content-ref url="/pages/ZevPlcSuYYI0jSH6JbRL" %}
[Conectar à Chiliz Chain](/pt-br/desenvolver/basico/conectar-a-chiliz-chain.md)
{% endcontent-ref %}

Em seguida, você precisará de $CHZ para pagar as taxas de gas de implantação tanto na Testnet quanto na Mainnet. Enquanto você pode comprar $CHZ da Mainnet em qualquer exchange de criptomoedas, pode usar faucets para tokens de Testnet.

{% content-ref url="/pages/dRf73ti4eFvCtQkJt2j9" %}
[Obter tokens de testnet gratuitos](/pt-br/desenvolver/basico/obter-tokens-testnet-gratis.md)
{% endcontent-ref %}

Em termos de ferramentas, você pode usar Hardhat ou Remix. Veja, por exemplo:

{% content-ref url="/pages/zFrO7yY7F454mjjWKWGe" %}
[Implantar com Remix](/pt-br/desenvolver/basico/implantar-smart-contract/implantar-com-remix.md)
{% endcontent-ref %}

Por fim, os contratos da Chiliz Chain são escritos na linguagem Solidity:

{% embed url="<https://www.soliditylang.org/>" %}

{% embed url="<https://solidity-by-example.org/>" %}

### Fan Tokens / CAP-20

O aspecto mais específico da Chiliz Chain é o padrão CAP-20, usado para Fan Tokens.

Embora tecnicamente idêntico ao código do padrão ERC-20, os tokens CAP-20 têm uma configuração específica para decimais. Em resumo: usa 0 decimais, enquanto tokens ERC-20 regulares usam 18 decimais.

{% content-ref url="/pages/emoV5RlGaV5FMNwCumxM" %}
[Sobre Fan Tokens](/pt-br/aprender/sobre-fan-tokens.md)
{% endcontent-ref %}

Portanto, se você implantar um Fan Token com 18 decimais, ele pode não ser exibido corretamente nas carteiras do ecossistema ou ser compatível com futuras integrações com a Socios.com.

## Melhores práticas para escrever um smart contract

### Use Bibliotecas Testadas (OpenZeppelin)

Não comece criando seu contrato do zero.\
A prática de segurança mais eficaz é basear seu código em padrões auditados pela comunidade, para reduzir o risco de vulnerabilidades.

Para o desenvolvimento na Chiliz Chain, recomendamos fortemente o uso de [Contratos OpenZeppelin](https://docs.openzeppelin.com/contracts). Eles fornecem implementações seguras e verificadas pela comunidade para contratos de tokens.

Ao usar contratos padrão, você garante que seus tokens sejam compatíveis com carteiras conhecidas (como MetaMask) e com o ecossistema Chiliz (Socios.com).

### Melhores Práticas Gerais de EVM

Independentemente da rede, estes três padrões são inegociáveis para o desenvolvimento seguro em Solidity.

#### O Padrão "Verificações-Efeitos-Interações"

Esta é sua principal defesa contra [Ataques de Reentrância](https://solidity-by-example.org/hacks/re-entrancy/). Sempre estruture suas funções nesta ordem exata:

1. Verificações: Valide entradas e condições (ex.: declarações `require`).
2. Efeitos: Atualize o estado do contrato (ex.: reduzir saldos).
3. Interações: Interaja com outros contratos ou envie fundos (ex.: `transfer`).

#### Controle de Acesso Robusto

Nunca deixe funções sensíveis desprotegidas. Se uma função cria tokens, altera taxas ou atualiza lógica, ela deve ser restrita.

* Simples: Use `Ownable` para contratos com administrador único.
* Complexo: Use `AccessControl` para contratos que exigem múltiplos papéis (ex.: `MINTER_ROLE`, `ADMIN_ROLE`).

#### Validação de Entrada

Assuma que todas as entradas são maliciosas. Use declarações `require()` no início de suas funções para validar parâmetros.

Por exemplo:

* Verifique endereços zero (`address(0)`).
* Verifique quantidades zero ao transferir.
* Verifique se os comprimentos dos arrays coincidem ao passar múltiplos arrays.
* etc.

### Detalhes de Implementação Específicos da Chiliz

Embora a Chiliz Chain seja compatível com EVM, certas "regras locais" se aplicam, especialmente em relação a decimais de token e versões de EVM.

#### Conformidade com CAP-20 (Fan Tokens)

Se você está escrevendo um contrato que interage com Fan Tokens (ex.: um Pool de Staking para $PSG ou $BAR), você deve lidar com 0 decimais.

Isso significa:

* Não assuma `1 Token = 10^18 unidades`. Para Fan Tokens, `1 Token = 1 unidade`.
* Evite fixar `1e18` em seu código matemático se o contrato for genérico. Use a função `token.decimals()` dinamicamente.

#### Versão do EVM e Compilador

A Chiliz Chain é compatível com a versão "Shanghai" do EVM.\
A versão de Solidity recomendada é `0.8.24`.

### Otimização de Gas na Chiliz

As transações na Chiliz Chain são significativamente mais baratas que no Ethereum, mas código não otimizado ainda pode causar congestionamento ou falhas em transações durante eventos de alto tráfego (ex.: durante uma partida ao vivo).

Três formas de economizar gas:

* Use Erros Personalizados: Em vez de mensagens longas em `require`, use definições de `error` para economizar gas.
* Ordene suas variáveis de estado para caberem em slots de 32 bytes. Coloque `uint128`, `address` e `bool` próximos uns dos outros onde possível.
* Prefira `external` para funções que nunca são chamadas internamente pelo próprio contrato.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.chiliz.com/pt-br/desenvolver/basico/escrever-smart-contract.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
