# Criando um projeto com ink!

Ink! é uma [Linguagem Específica de Domínio Incorporada](https://wiki.haskell.org/Embedded_domain_specific_language) (EDSL, na sigla em inglês) que você pode usar para escrever contratos inteligentes baseados em WebAssembly na linguagem de programação Rust.&#x20;

ink! é apenas Rust padrão em um formato de "contrato" bem definido com macros de atributo `#[ink(…)]`. Essas macros de atributo informam ao ink! o que as diferentes partes do seu contrato inteligente Rust representam e, em última análise, permitem que o ink! faça toda a mágica necessária para criar bytecode Wasm compatível com Substrate!&#x20;

Use a CLI do ink! para gerar um contrato inteligente inicial com algum código básico.&#x20;

Certifique-se de estar no diretório de trabalho e, em seguida, execute o seguinte comando:

```
cargo contract new flipper
```

Este comando criará uma nova pasta de projeto chamada `flipper` com o seguinte conteúdo:

```json
flipper
  └─ lib.rs                <-- Contract Source Code
  └─ Cargo.toml            <-- Rust Dependencies and ink! Configuration
  └─ .gitignore
```

### Código Fonte do Contrato[​](https://use.ink/getting-started/creating-an-ink-project#contract-source-code) <a href="#contract-source-code" id="contract-source-code"></a>

O CLI do ink! gera automaticamente o código fonte para o contrato "Flipper", que é um dos contratos "inteligentes" mais simples que você pode construir. Você pode dar uma olhada no código fonte aqui: [Flipper Example Source Code](https://github.com/paritytech/ink-examples/blob/main/flipper/lib.rs).

The Flipper contract is nothing more than a `bool` which gets flipped from `true` to `false` through the `flip()` function.

O contrato Flipper é apenas um valor `bool` que é invertido de `true` para `false` através da função `flip()`.

### Testando seu Contrato

Você verá na parte inferior do código-fonte que existem casos de teste simples que verificam a funcionalidade do contrato. Podemos testar rapidamente se este código está funcionando conforme o esperado usando o ambiente de **teste off-chain fornecido** pelo ink!.&#x20;

Dentro da pasta do seu projeto, execute o seguinte comando:

```
cargo test
```

O resultado deve ser a conclusão bem-sucedida do teste.

```rust
$ cargo test
running 2 tests
test flipper::tests::it_works ... ok
test flipper::tests::default_works ... ok

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out
```

Agora que estamos confiantes de que as coisas estão funcionando, podemos realmente compilar este contrato para Wasm no próximo passo.
