# Macros e Atributos

Um módulo ink! é o módulo que é marcado com `#[ink::contract]` e contém todas as definições ink!. Todos os atributos ink! estão disponíveis para especificar dentro de um módulo ink!.

Macros e atributos são recursos poderosos da linguagem Rust que permitem aprimorar e personalizar o código. Eles desempenham funções importantes na programação com ink!.

**Macros:**

* Macros são um recurso de metaprogramação que permitem a geração de código durante a compilação. Eles são denotados pelo símbolo `!` após o nome da macro. Em ink!, existem várias macros úteis disponíveis, como `env!`, `storage!`, `event!`, que simplificam a escrita de código.

**Atributos:**

* Atributos são anotações que são colocadas acima de definições de itens, como funções, estruturas ou módulos, para alterar seu comportamento ou fornecer informações adicionais ao compilador. Em ink!, existem atributos específicos, como `#[ink(storage)]`, `#[ink(event)]`, `#[ink(constructor)]`, que são usados para marcar itens específicos como armazenamento, evento ou construtor no contrato.

Esses recursos ajudam a tornar o código mais flexível, legível e expressivo ao trabalhar com contratos ink! em Rust.

### Mesclando Atributos[​](https://use.ink/macros-attributes#merging-attributes) <a href="#merging-attributes" id="merging-attributes"></a>

É possível mesclar atributos que compartilham uma entidade comum marcada. O exemplo abaixo demonstra isso para uma mensagem pagável com um seletor personalizado.

```rust
#[ink(message)]
#[ink(payable)]
#[ink(selector = "0xCAFEBABE")]
pub fn transfer(&mut self, from: AccountId, to: AccountId, value: Balance) -> Result<(), Error> {
    // actual implementation
}
```

Também podemos escrever a definição da mensagem ink! acima da seguinte maneira:

```rust
#[ink(message, payable, selector = "0xCAFEBABE")]
pub fn transfer(&mut self, from: AccountId, to: AccountId, value: Balance) -> Result<(), Error> {
    // actual implementation
}
```

\
