# Contratos Inteligentes

Atualmente, os contratos inteligentes são divididos em três: **ImpactMarket, CommunityFactory** e **Community**.

## ImpactMarket

Sua única função é aceitar novas comunidades. Isso será substituído por um mecanismo (já em desenvolvimento) com votação para novas comunidades.

## CommunityFactory

Sua única função é implantar novos contratos comunitários. Um contrato por comunidade. Este contrato é controlado pela ImpactMarket.

## Community

Este é o contrato usado pelas comunidades. Existe um contrato por comunidade, o que permite doações individuais para cada uma delas. Abaixo estão listados os métodos públicos que podem ser chamados para obter informações do contrato.

```cpp
// When the beneficiary can claim again (timestamp)
mapping(address => uint256) public cooldown;
// What was the last interval when the user claim.
// This is used to calculate the next interval
mapping(address => uint256) public lastInterval;
// How much has the beneficiary claimed so far.
mapping(address => uint256) public claimed;
// In what state is the beneficiary (enum BeneficiaryState {NONE, Valid, Locked, Removed})
mapping(address => BeneficiaryState) public beneficiaries;

// community amount per claim (in cUSD)
uint256 public claimAmount;
// community base interval (we have been using 1 day or 1 week) (in seconds)
uint256 public baseInterval;
// community increment interval (in seconds)
uint256 public incrementInterval;
// community maximun claim per beneficiary (in cUSD)
uint256 public maxClaim;

// if the community was migrated, will have here the address
address public previousCommunityContract;
// impactMarket contract address
address public impactMarketAddress;
// cUSD contract address
address public cUSDAddress;
```

### Functions

**Nota importante:** para integrações externas, quando um gestor tenta agregar um endereço como gestor ou beneficiário, esse endereço precisa primeiro ser cadastrado no sistema, caso contrário, aparecerá um erro mencionado na [seção adicionar beneficiário](https://docs.impactmarket.com/manager-onboarding/download/2.5-add-remove-beneficiary). Para evitar isso, use o endpoint / api / user / auth. Para obter mais informações, consulte a [seção API](https://docs.impactmarket.com/v/brazil/developers/api).

```javascript
/**
 * @dev Allow community managers to add other managers.
 */
function addManager(address _account) external onlyManagers;

/**
 * @dev Allow community managers to remove other managers.
 */
function removeManager(address _account) external onlyManagers;

/**
 * @dev Allow community managers to add beneficiaries.
 */
function addBeneficiary(address _account) external onlyManagers;

/**
 * @dev Allow community managers to lock beneficiaries.
 */
function lockBeneficiary(address _account) external onlyManagers;

/**
 * @dev Allow community managers to unlock locked beneficiaries.
 */
function unlockBeneficiary(address _account) external onlyManagers;

/**
 * @dev Allow community managers to remove beneficiaries.
 */
function removeBeneficiary(address _account) external onlyManagers;

/**
 * @dev Allow beneficiaries to claim.
 */
function claim() external onlyValidBeneficiary;

/**
 * @dev Allow community managers to edit community variables.
 */
function edit(
    uint256 _claimAmount,
    uint256 _maxClaim,
    uint256 _baseInterval,
    uint256 _incrementInterval
) external onlyManagers;
```
