---
# System prepended metadata

title: Community Contract Specs

---

# Community Contract Specs

Community is a frontend, library (in Javascript) and a SmartWeave contract, to create new new communities completely decentralized. 
These are the contract's specs.

**Holders** = Community token holders/participants.

The community state has the following default structure:
```typescript
{
  name: string,
  ticker: string,
  balances: {
    [key: string]: number // Positive integer
  },
  vault: {
    [key: string]: [{
      balance: number, // Positive integer
      end: number, // At what block the lock ends.
      start: number // At what block the lock starts.
    }]
  },
  votes: VoteInterface[], 
  roles: {
      [key: string]: string
  },
  settings: [ // Array of a Map<string, any>
      ["quorum", number], // quorum is between 0.01 and 0.99
      ["support", number], // between 0.01-0.99, how much % yays for a proposal to be approved
      ["voteLength", number], // How many blocks to leave a proposal open
      ["lockMinLength", number], // Minimum lockLength allowed
      ["lockMaxLength", number] // Maximum lockLength allowed
  ]
}
```

Here's an example of what the state when creating the contract should look like:
```json
{
  "name": "Community",
  "ticker": "COMM",
  "balances": {
    "BPr7vrFduuQqqVMu_tftxsScTKUq9ke0rx4q5C9ieQU": 10000000
  },
  "vault": {},
  "votes": [],
  "roles": {},
  "settings": [
      ["quorum", 0.5],
      ["voteLength", 2000],
      ["lockMinLength", 100],
      ["lockMaxLength", 10000]
  ]
}
```

**VoteInterface** is:
```typescript
interface VoteInterface {
  status?: 'active' | 'quorumFailed' | 'passed' | 'failed';
  type?: 'mint' | 'mintLocked' | 'burnVault' | 'indicative' | 'set';
  id?: number;
  totalWeight?: number;
  recipient?: string;
  target?: string;
  qty?: number;
  key?: string;
  value?: any;
  note?: string;
  yays?: number;
  nays?: number;
  voted?: string[];
  start?: number;
  lockLength?: number;
}
```

### Transfer
Holders are able to transfer them to someone else on Arweave, not only to other DAO members but to anyone else.
#### Requires: 
- **target**: To whom the balance is going to be transfered.
- **qty**: How many tokens to transfer.

#### Returns:
`{ state }`

### Balance
Check the current total balance (unlocked and in vault) of an account.

#### Optional:
- **target**: To whom check the balance. If not provided, caller is used.

#### Returns:
```
result: {
    target: address,
    balance: target's balance
}
```

### UnlockedBalance
Check the current unlocked balance of an account.

#### Optional:
- **target**: To whom check the balance. If not provided, caller is used.

#### Returns:
```
result: {
    target: address,
    balance: target's balance
}
```

## Locking System

### Lock
Lock a balance to increase it's vote weight on the DAO. The voting weight is: `lockedBalance * (end - start)`.

#### Requires:
- **qty**: Balance amount to lock.
- **lockLength**: How many blocks *qty* will be locked.

#### Returns:
`{ state }`

### Unlock
Unlock all locked balances that are over the *end* set while locking.

#### Returns:
`{ state }`

### IncreaseVault
Increase a locked balance lockedLength.

#### Requires:
- **id**: The vault ID to be locked longer.
- **lockLength**: How many more blocks this vault will be locked.

### VaultBalance
Check the current locked balance of an account.

#### Optional:
- **target**: To whom check the balance. If not provided, caller is used.

#### Returns:
```
result: {
    target: address,
    balance: target's total locked balance
}
```

## Voting System

### Propose
Holders are able to propose a new vote, this will create a new proposal.

#### Requires:
**type**: Vote type. One of the following:

- **Mint**
  To mint tokens to an Arweave address.
  Requires:
  - **recipient**: Arweave address recipient
  - **qty**: Amount of tokens to mint
  - **note**: Proposal description
- **MintLocked**
  To mint locked tokens to an Arweave address.
  - **recipient**: Arweave address recipient
  - **qty**: Amount of tokens to mint
  - **note**: Proposal description
  - **lockLength**: How many blocks *qty* will be locked.
- **BurnVault**
  To burn a vault with it's tokens. Warning: This will completely remove all the tokens stored on the target's vault.
  - **target**: Arweave address target
- **Set**
  To update the DAO settings.
  Requires:
  - **key**: Setting key
  - **value**: Setting value
- **Indicative**
  To send a general non-fixed proposal. A yes/no question.
  Requires:
  - **note**: Proposal description

Allowed keys for **set** are:
- quorum
- support
- lockMinLength
- lockMaxLength
- role
  - role value must be: `{target: address, role: 'name'}`
- Custom Key/Value pairs

#### Returns:
`{ state }`

### Vote
Cast a vote on one of the proposals.

#### Requires:
- **id**: Proposal ID.
- **cast**: What vote are you casting `'yay' || 'nay'`.

#### Returns:
`{ state }`

### Finalize
After a vote is concluded, we should call finalize to make it in effect. It will update the vote status to `passed`, and execute if needed, or `failed`.

#### Requires:
- **id**: Proposal ID.

#### Returns:
`{ state }`