# Vote Coin

Use vote coin standard to manage your DAO.

{% embed url="<https://youtu.be/D8EMw8ddnyw>" %}
Vote Coin in 2 minutes
{% endembed %}

## Prod & Demo apps

| MainNet application                                     | TestNet application                                       |
| ------------------------------------------------------- | --------------------------------------------------------- |
| [https://app.vote-coin.com/](https://app.vote-coin.com) | [https://demo.vote-coin.com/](https://demo.vote-coin.com) |

## Vote Coin Values

1. Auditable results
2. Cost effeciency
3. Knowledge based wisdom

If you like the project, upvote us at algo dir: <https://ecosystem.algorand.com/project/vote-coin>

## Staking

Everyone who owns at least 1000 $vote receives 10% p.a. with community staking program.

TinyMan liquidity providers are incentivized with 50% p.a. staking program.


# Introduction

Algorand Message Standard for public voting

### Summary <a href="#summary" id="summary"></a>

This document introduces the standard for public voting participation and calculation of voting results.

### Abstract <a href="#abstract" id="abstract"></a>

The goal of this standard is to make the knowledge based pure democracy reality. This standard defines specification on how organization can propose voting, how organization can create trusted list of voters, how person can cast votes and how person can delegate other persons to vote on his behalf.

The goal of these conventions is to make any organization who seeks public voting the standard on how to vote.

Even if this standard is meant to be for algorand for the effeciency of the transactions and low transaction costs, it is not limitted to this blockchain. It can be used with any blockchain who support self transactions with specific payment, note field with at least 1000 bytes long message, and ability to search the network for specific transactions indexed by the amount, start of the note field, and/or the account.

### Specification <a href="#specification" id="specification"></a>

The key words “**MUST**”, “**MUST NOT**”, “**REQUIRED**”, “**SHALL**”, “**SHALL NOT**”, “**SHOULD**”, “**SHOULD NOT**”, “**RECOMMENDED**”, “**MAY**”, and “**OPTIONAL**” in this document are to be interpreted as described in [RFC-2119](https://www.ietf.org/rfc/rfc2119.txt).

JSON is the standard described in [RFC-7159](https://www.ietf.org/rfc/rfc7159.txt).

Note fields must be compliant with [ARC-0002](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0002.md)

### Request for comments <a href="#request-for-comments" id="request-for-comments"></a>

Please comment or suggest pull request for this document here: <https://github.com/scholtz/AMS/issues>

### Full specification

<https://scholtz.github.io/AMS/AMS-0001/AMS-0001.html>

<br>


# Vote result calculation

Each account has specific voting power.

* **balance voting power** means 1 coin equals to 1 vote. If account owns balance of 1000 tokens, it has 1000 more voting power than account that holds 1 token. Token may be for example DAO token, algorand ASA, Algorand token itself, Ethereum token or any other tokens which are compatible with this standard.
* **single account voting power** means that 1 account has 1 vote. This can be also reduced to trusted accounts using trusted list extension where questioner selects accounts which he consider trusted.

Single question results will always lead to multiple results:

* **Simple balance results**
* **Quadratic balance results**
* **Simple single account results**
* **Quadratic single account results**
* **Simple trusted list results**
* **Quadratic trusted list results**

This specifications does not interpret what level of acceptance of which type of results is acceptance criteria for questioner. Questioner SHOULD define his acceptance criteria in memorandum, constitution or company statute.

Note, that in the delegation extension, a voting power of an account if it does not vote, is transfered to a delegated account.

## Simple balance results

Single account voting power for specific option is `Token balance * On / (O1 + O2 .. Om)`

Result for all options MUST be sum of all balance voting power of all accounts which has voted.

## Quadratic balance results

Single account voting power for specific option is `Token balance * On^2 / (O1^2 + O2^2 .. Om^2)`

Result for all options MUST be sum of all balance voting power of all accounts which has voted.

## Simple single account results

Single account voting power for specific option is `1 * On / (O1 + O2 .. Om)`

Result for all options MUST be sum of all balance voting power of all accounts which has voted.

## Quadratic single account results

Single account voting power for specific option is `1 * On^2 / (O1^2 + O2^2 .. Om^2)`

Result for all options MUST be sum of all balance voting power of all accounts which has voted.

## Simple trusted list results

Single account voting power from trusted list for specific option is `1 * On / (O1 + O2 .. Om)` , else 0.

Result for all options MUST be sum of all balance voting power of all accounts which has voted.

## Quadratic trusted list results

Single account voting power from trusted list for specific option is `1 * On^2 / (O1^2 + O2^2 .. Om^2)` , else 0.

Result for all options MUST be sum of all balance voting power of all accounts which has voted.


# Question message specification

Question is the message stored on the blockchain.

The blockchain message MUST be self signed message, with amount 702 of basic tokens with specific note structure described below.

Question starts with `avote-question/v2:j` according to ARC-0002, following the json data.

If json data is not valid according to JSON standard, the question MUST NOT be shown to the users.

Json data MUST comply with following json schema:

```
{
  "$schema": "http://json-schema.org/draft-07/schema",
  "$id": "https://scholtz.github.io/AMS/AMS-0001/avote-question.json",
  "type": "object",
  "title": "Question schema",
  "description": "Knowledge based pure democracy question JSON document.",
  "default": {},
  "examples": [
      {
          "t": "Best project",
          "q": "Decide which project is the best\nA - AAA\nB - BBB\nC - CCC",
          "duration": 100,
          "category": "community",
          "o": {
              "A": "AAA",
              "B": "BBB",
              "C": "CCC"
          }
      }
  ],
  "required": [
      "t",
      "q",
      "duration",
      "category",
      "o"
  ],
  "properties": {
      "t": {
          "$id": "#/properties/t",
          "type": "string",
          "minLength": 1,
          "maxLength": 50,
          "title": "Title of the question",
          "description": "Title shown in the table of the questions",
          "default": "",
          "examples": [
              "Best project"
          ]
      },
      "q": {
          "$id": "#/properties/q",
          "type": "string",
          "minLength": 1,
          "maxLength": 500,
          "title": "Question text",
          "description": "The text of the question. MAY contain new lines specified as \n. ",
          "default": "",
          "examples": [
              "Decide which project is the best\nA - AAA\nB - BBB\nC - CCC"
          ]
      },
      "duration": {
          "$id": "#/properties/duration",
          "type": "integer",
          "minimum": 1,
          "maximum": 1000000,
          "title": "The duration how long the question is valid.",
          "description": "Duration is calculated in number of blocks. If there is 1, the question will have valid votes only in the block of inception, and the next block.",
          "default": 0,
          "examples": [
              100
          ]
      },
      "category": {
          "$id": "#/properties/category",
          "type": "string",
          "minLength": 1,
          "maxLength": 50,
          "title": "The category",
          "description": "The category of the question. Categories are managed by the questioner.",
          "default": "",
          "examples": [
              "community"
          ]
      },
      "e": {
          "$id": "#/properties/encryptionAddress",
          "type": "string",
          "minLength": 1,
          "maxLength": 50,
          "title": "Encryption address",
          "description": "The encryption address for encyption purposes according to Extension 3 of the specifications.",
          "default": "",
          "examples": [
              "56N75BOUSBSJALOWRQMJ7BU5JZHTEQCJP2PXHUCUXVOQJ4FPIKISV3UQB4"
          ]
      },
      "o": {
          "$id": "#/properties/o",
          "type": "object",
          "title": "Valid vote options",
          "description": "Valid vote options. Object of mapping from code to text of the question. The code will be used in vote cast to specify the answer.",
          "default": {},
          "examples": [
              {
                  "A": "AAA",
                  "B": "BBB",
                  "C": "CCC"
              }
          ],
          "additionalProperties": true
      }
  },
  "additionalProperties": false
}
```

Example:

```
avote-question/v1:j{"t":"Best project","q":"Decide which project is the best\nA - AAA\nB - BBB\nC - CCC","max":4410,"category":"community","o":{"A":"AAA","B":"BBB","C":"CCC"}}
```


# Cast vote message specification

Vote cast is the message stored on the blockchain.

The blockchain message MUST be self signed message, with amount 703 of basic tokens with specific note structure described below.

Vote cast starts with `avote-vote/v1/{ShortQuestionId}:j` according to ARC-0002, following the json data.

ShortQuestionId is the tx id of the message with the question for which this vote is answer. ShortQuestionId must be upper case substring from zero with length of 10 characters.

If json data is not valid according to JSON standard, or according to the schema below, the answer MUST NOT be calculated to the final results. If the vote cast code list does not mach with question option codes list, the answer MUST NOT be calculated to the final result.

The weights of the answers MUST be integer numbers in range between 0 and 1000 including. If the weights of results does not match with this criteria, the answer MUST NOT be calculated to the final result.

The voting power of the user is distributed to answers according to specified weights. For example in the example of distribution of `{"A":35,"B":73,"C":20}` the sum of the weights is 128, so the voting power of the casted vote for `A` is `35/128~=27,3%`

Json data MUST comply with following json schema:

```
{
    "$schema": "http://json-schema.org/draft-07/schema",
    "$id": "https://scholtz.github.io/AMS/AMS-0001/avote-vote.json",
    "type": "object",
    "title": "Vote cast schema",
    "description": "Knowledge based pure democracy answer JSON document.",
    "default": {},
    "examples": [
        {"q":"CRID3AHJGGVE75UTDO5GI7PXM6PUD6WXB7BTAD3IPWFTMUXUKHDA","a":{"A":35,"B":73,"C":20}}
    ],
    "required": [
        "q",
        "a"
    ],
    "properties": {
        "q": {
            "$id": "#/properties/q",
            "type": "string",
            "minLength": 1,
            "maxLength": 60,
            "title": "The question id",
            "description": "Tx id of the question message from the blockchain",
            "default": "",
            "examples": [
                "CRID3AHJGGVE75UTDO5GI7PXM6PUD6WXB7BTAD3IPWFTMUXUKHDA"
            ]
        },
        "a": {
            "$id": "#/properties/a",
            "type": "object",
            "title": "Valid vote options",
            "description": "Valid vote options. Object of mapping from code to weight of the answer.",
            "default": {},
            "examples": [
                {"A":35,"B":73,"C":20}
            ],
            "additionalProperties": true
        }
    },
    "additionalProperties": false
}
```

Example:

```
avote-vote/v1/CRID3AHJGG:j{"q":"CRID3AHJGGVE75UTDO5GI7PXM6PUD6WXB7BTAD3IPWFTMUXUKHDA","a":{"A":35,"B":73,"C":20}}
```


# Result message specification

Result is the message stored on the blockchain.

The blockchain message MUST be with amount 0 of basic tokens with specific note structure described below.

Sender of the message is auditor. Anybody can calculate results and be in the role of auditor.

If sender is the questioner, the results counted are considered final. Questioner in rare cases can fix results by submitting the result message again. The latest message of questioner is the decision making message.

Result starts with `avote-result/v1/{ShortQuestionId}:j` according to ARC-0002, following the json data.

ShortQuestionId is the tx id of the message with the question for which this vote is answer. ShortQuestionId must be upper case substring from zero with length of 10 characters.

Json data MUST comply with following json schema:

```
{
    "$schema": "http://json-schema.org/draft-07/schema",
    "$id": "https://scholtz.github.io/AMS/AMS-0001/avote-result.json",
    "type": "object",
    "title": "Vote result schema",
    "description": "Knowledge based pure democracy result JSON document.",
    "default": {},
    "examples": [
        {"q":"CRID3AHJGGVE75UTDO5GI7PXM6PUD6WXB7BTAD3IPWFTMUXUKHDA","r":{"sbr":{"A":3500.1,"B":7300.1,"C":2000.1},"qbr":{"A":3000.1,"B":7000.1,"C":2000.1},"ssar":{"A":50.1,"B":30.1,"C":40.1},"qsar":{"A":50.1,"B":30.1,"C":40.1},"stlr":{"A":5.1,"B":2.1,"C":1.1},"qtlr":{"A":5.1,"B":2.1,"C":1.1}}}
    ],
    "required": [
        "q",
        "r"
    ],
    "properties": {
        "q": {
            "$id": "#/properties/q",
            "type": "string",
            "minLength": 1,
            "maxLength": 60,
            "title": "The question id",
            "description": "Tx id of the question message from the blockchain",
            "default": "",
            "examples": [
                "CRID3AHJGGVE75UTDO5GI7PXM6PUD6WXB7BTAD3IPWFTMUXUKHDA"
            ]
        },
        "e": {
            "$id": "#/properties/encryption-private-key",
            "type": "string",
            "title": "Mnemonic of the encyption account for public voting validation",
            "examples": [
                {"fuel flock song credit cloud collect security danger knife fluid analyst roast short pizza more kingdom copy judge leave resist sock change wheel able story"}
            ],
        },
        "r": {
            "$id": "#/properties/r",
            "type": "object",
            "title": "Results",
            "examples": [
                {"sbr":{"A":3500.1,"B":7300.1,"C":2000.1},"qbr":{"A":3000.1,"B":7000.1,"C":2000.1},"ssar":{"A":50.1,"B":30.1,"C":40.1},"qsar":{"A":50.1,"B":30.1,"C":40.1},"stlr":{"A":5.1,"B":2.1,"C":1.1},"qtlr":{"A":5.1,"B":2.1,"C":1.1}}
            ],
            "additionalProperties": true,
            "properties": {
                "sbr": {
                    "$id": "#/properties/simple-balance-results",
                    "type": "object",
                    "title": "Simple balance results",
                    "examples": [
                        {"A":3500.1,"B":7300.1,"C":2000.1}
                    ],
                    "additionalProperties": true,
                },
                "qbr": {
                    "$id": "#/properties/quadratic-balance-results",
                    "type": "object",
                    "title": "Quadratic balance results",
                    "examples": [
                        {"A":3500.1,"B":7300.1,"C":2000.1}
                    ],
                    "additionalProperties": true,
                },
                "ssar": {
                    "$id": "#/properties/simple-single-account-results",
                    "type": "object",
                    "title": "Simple single account results",
                    "examples": [
                        {"A":3500.1,"B":7300.1,"C":2000.1}
                    ],
                    "additionalProperties": true,
                },
                "qsar": {
                    "$id": "#/properties/quadratic-single-account-results",
                    "type": "object",
                    "title": "Quadratic single account results",
                    "examples": [
                        {"A":3500.1,"B":7300.1,"C":2000.1}
                    ],
                    "additionalProperties": true,
                },
                "stlr": {
                    "$id": "#/properties/simple-trusted-list-results",
                    "type": "object",
                    "title": "Simple trusted list results",
                    "examples": [
                        {"A":3500.1,"B":7300.1,"C":2000.1}
                    ],
                    "additionalProperties": true,
                },
                "qtlr": {
                    "$id": "#/properties/quadratic-trusted-list-results",
                    "type": "object",
                    "title": "Quadratic trusted list results",
                    "examples": [
                        {"A":3500.1,"B":7300.1,"C":2000.1}
                    ],
                    "additionalProperties": true,
                },
            }
        }
    },
    "additionalProperties": false
}
```

Example:

```
avote-result/v1/CRID3AHJGG:j{"q":"CRID3AHJGGVE75UTDO5GI7PXM6PUD6WXB7BTAD3IPWFTMUXUKHDA","r":{"sbr":{"A":3500.1,"B":7300.1,"C":2000.1},"qbr":{"A":3000.1,"B":7000.1,"C":2000.1},"ssar":{"A":50.1,"B":30.1,"C":40.1},"qsar":{"A":50.1,"B":30.1,"C":40.1},"stlr":{"A":5.1,"B":2.1,"C":1.1},"qtlr":{"A":5.1,"B":2.1,"C":1.1}}}
```


# Extension 1 - Vote delegation message specification

Vote delegation is the extension for the voting system. It MAY not have to be used by the voting system implementation. If the voting system does not implement delegation, it should clearly state that voting system does not support delegation of the voting power. For knowledge based pure democracy voting system it is highly RECOMMENDED to use the delegation of the voting power.

Vote delegation is the delegation of the voting power from the delegee account to delegated account. If delegee does not vote, and delegated account votes for question, the delegated account votes with voting power of it self plus sum of voting power of all delegee accounts.

The delegation SHOULD be used in these usecases.

* Person 1 trusts his friend Person 2 in all matters. Person 1 delegates all his/her voting power to Person 2. Person 1 may vote for questions he believes knows the best answer to. With all other voting where Person 2 votes, the Person 1 votes with the Person 2.
* Person 1 trusts Politician 1 in the matter of Finance, and Politician 2 in the matter of IT. Politicians will vote in their specified field of interest, and gain the Person 1 voting power.

The delegation is transferable. If person A delegate his voting power to person B, and person B delegates his voting power to person C, and only person C casts the vote, the voting power of Person C is sum of Person A, Person B and Person C.

To prevent circular delegation, the maximum depth for vote delegation is 100 delegations.

If person A delegates 20 % of his voting power to person B, and 80 % to person C, and person A and B does not vote, and person C votes, the sum of voting power of person C is 80% of person A plus 100% of voting power of person C.

The blockchain message MUST be self signed message, with amount 701 of basic tokens with specific note structure described below.

Vote delegation note field in the blockchain MUST start with `avote-delegation/v1:j` according to ARC-0002, following the json data.

If json data is not valid according to JSON standard, or according to the schema below, the voting power MUST NOT be transfered.

The weights of the delegation between accounts MUST be integer numbers in range between 0 and 1000 including.

Json data MUST comply with following json schema:

```
{
    "$schema": "http://json-schema.org/draft-07/schema",
    "$id": "https://scholtz.github.io/AMS/AMS-0001/avote-delegation.json",
    "type": "object",
    "title": "Vote power delegation schema",
    "description": "Knowledge based pure democracy vote delegation JSON document.",
    "default": {},
    "examples": [
        {"d":{"any":{"TESTB74MOARQDWSX4433VWVNO4VJK3PDQWQ4JEOVQQTK3ZIX2MK3JF55TE":20,"TESTC2TMLDK273INHLXCSV235NFJ5LITNFDXZPU7JTZCVCBAZDUSJS4OPU":80},"finance":{"TESTDUUODZVXNO4YKEK4I5I6UU67ANYBJ77JZUI444VAD7V3TL26DVOMFA":1}}}
    ],
    "required": [
        "d"
    ],
    "properties": {
        "d": {
            "$id": "#/properties/d",
            "type": "object",
            "title": "Delegation of power",
            "description": "The object of categories with the object of accounts and the weights. Weight must be integer number in range from 0 to 1000 including.",
            "default": {},
            "examples": [
                {"any":{"TESTB74MOARQDWSX4433VWVNO4VJK3PDQWQ4JEOVQQTK3ZIX2MK3JF55TE":20,"TESTC2TMLDK273INHLXCSV235NFJ5LITNFDXZPU7JTZCVCBAZDUSJS4OPU":80},"finance":{"TESTDUUODZVXNO4YKEK4I5I6UU67ANYBJ77JZUI444VAD7V3TL26DVOMFA":1}}
            ],
            "additionalProperties": true
        }
    },
    "additionalProperties": false
}
```

Example:

```
avote-delegation/v1:j{"d":{"any":{"TESTB74MOARQDWSX4433VWVNO4VJK3PDQWQ4JEOVQQTK3ZIX2MK3JF55TE":20,"TESTC2TMLDK273INHLXCSV235NFJ5LITNFDXZPU7JTZCVCBAZDUSJS4OPU":80},"finance":{"TESTDUUODZVXNO4YKEK4I5I6UU67ANYBJ77JZUI444VAD7V3TL26DVOMFA":1}}}
```

<br>


# Extension 2 - Trusted list message specification

The trusted list is implementation extension which allows to calculate the results according to the trusted list specified by the questionaree.

If the voting system implementation does not implement trusted list extension, it should clearly state that the results are calculated only in the form 1 token = 1 vote.

The blockchain message MUST be self signed message, with amount 705 of basic tokens with specific note structure described below.

TL configuration message MUST start with `avote-tl/v1:j` according to ARC-0002, following the json data.

Trusted list contains all accounts which were added to the trusted list and which were not removed from the trusted list until the decision time of the voting.

The trusted list voting results calculates the same way as the 1 coin = 1 vote, with difference that if the account is on the trusted list, his voting power equals 1, and if the account is not on the trusted list, its voting power equals zero. The results for 1 coin = 1 vote are calculated in balance of the account at the final question block (the question entry block plus the duration stated in the question duration).

Decision snapshot of the trusted list for the vote calculation is the list of accounts in the trusted list in the final block when it is allowed to vote for the question. The additions or removal from the trusted list in the last question block MUST be processed. If the account is in the list of the accounts to be added as well as in the list to be removed in the single transaction, the removal MUST be applied.

```
{
    "$schema": "http://json-schema.org/draft-07/schema",
    "$id": "https://scholtz.github.io/AMS/AMS-0001/avote-tl.json",
    "type": "object",
    "title": "Trusted list management schema",
    "description": "Knowledge based pure democracy trusted list JSON document.",
    "default": {},
    "examples": [
        {
            "a": [
                "TESTAUZJU4JRAPUZBH4FCPYDLEWIFIFRPVILUZBSYP6IBZLYF6M6YVMMX4",
                "TESTB74MOARQDWSX4433VWVNO4VJK3PDQWQ4JEOVQQTK3ZIX2MK3JF55TE",
                "TESTC2TMLDK273INHLXCSV235NFJ5LITNFDXZPU7JTZCVCBAZDUSJS4OPU"
            ],
            "r": [
                "TESTQKYINIZLITDRT3BECSIPI77IQVCXG5I5SNOQLRO4PWSAQPSPCRHUXU"
            ]
        }
    ],
    "properties": {
        "a": {
            "$id": "#/properties/a",
            "type": "array",
            "title": "Trusted list additions",
            "description": "List of accounts to be added to the trusted list",
            "default": [],
            "examples": [
                [
                    "TESTAUZJU4JRAPUZBH4FCPYDLEWIFIFRPVILUZBSYP6IBZLYF6M6YVMMX4",
                    "TESTB74MOARQDWSX4433VWVNO4VJK3PDQWQ4JEOVQQTK3ZIX2MK3JF55TE"
                ]
            ],
            "additionalItems": false,
            "items": {
                "$id": "#/properties/a/items",
                "anyOf": [
                    {
                        "$id": "#/properties/a/items/anyOf/0",
                        "type": "string",
                        "title": "Account",
                        "minLength": 1,
                        "maxLength": 60,
                        "description": "The valid account",
                        "default": "",
                        "examples": [
                            "TESTAUZJU4JRAPUZBH4FCPYDLEWIFIFRPVILUZBSYP6IBZLYF6M6YVMMX4",
                            "TESTB74MOARQDWSX4433VWVNO4VJK3PDQWQ4JEOVQQTK3ZIX2MK3JF55TE"
                        ]
                    }
                ]
            }
        },
        "r": {
            "$id": "#/properties/r",
            "type": "array",
            "title": "Trusted list removals",
            "description": "List of accounts to be removed from the trusted list.",
            "default": [],
            "examples": [
                [
                    "TESTQKYINIZLITDRT3BECSIPI77IQVCXG5I5SNOQLRO4PWSAQPSPCRHUXU"
                ]
            ],
            "additionalItems": false,
            "items": {
                "$id": "#/properties/r/items",
                "anyOf": [
                    {
                        "$id": "#/properties/r/items/anyOf/0",
                        "type": "string",
                        "title": "Account",
                        "minLength": 1,
                        "maxLength": 60,
                        "description": "The valid account.",
                        "default": "",
                        "examples": [
                            "TESTQKYINIZLITDRT3BECSIPI77IQVCXG5I5SNOQLRO4PWSAQPSPCRHUXU"
                        ]
                    }
                ]
            }
        }
    },
    "additionalProperties": false
}
```

```
avote-tl/v1:j{"a":["TESTAUZJU4JRAPUZBH4FCPYDLEWIFIFRPVILUZBSYP6IBZLYF6M6YVMMX4","TESTB74MOARQDWSX4433VWVNO4VJK3PDQWQ4JEOVQQTK3ZIX2MK3JF55TE","TESTC2TMLDK273INHLXCSV235NFJ5LITNFDXZPU7JTZCVCBAZDUSJS4OPU"],"r":["TESTQKYINIZLITDRT3BECSIPI77IQVCXG5I5SNOQLRO4PWSAQPSPCRHUXU"]}
```


# Extension 3 - Encrypted voting

Purpose of the encrypted voting is to hide voter cast while the voting session is in progress.

Questioner for each question generates new Ed25519 mnemonic and stores it securly. Public key of this encryption account is called Question public key. If encryption of the messages is allowed, he publish encryption account address in the question message.

Curve25519XSalsa20Poly1305 is used to encrypt data. Voter encrypts the data in form of <https://scholtz.github.io/AMS/AMS-0001/avote-vote.json> and produces the json with the <https://scholtz.github.io/AMS/AMS-0001/avote-vote-enc.json> schema.

Encrypted vote cast is the message stored on the blockchain.

The blockchain message MUST be self signed message, with amount 703 of basic tokens with specific note structure described below.

Encrypted vote cast starts with `avote-vote-enc/v1/{ShortQuestionId}:j` according to ARC-0002, following the json data.

Questioner MAY publish his encryption keys to specific auditing account using ARC-0015 starndard. The content of the message is the mnemonic of the encryption account.

Questioner MAY publish the mnemonic of the encrypting account to the restult message. The questioner SHOULD publish the policy on weather he plans to publish the private encryption key on his website or in the question.

Json data MUST comply with following json schema:

```
{
    "$schema": "http://json-schema.org/draft-07/schema",
    "$id": "https://scholtz.github.io/AMS/AMS-0001/avote-vote-enc.json",
    "type": "object",
    "title": "Vote cast schema",
    "description": "Knowledge based pure democracy answer JSON document in encrypted form.",
    "default": {},
    "examples": [
        {"nonce":"ftGVJfrKJg+PPNCMbKPdLMN3OKNNnHDk","otPK":"w955HlFMM4e9dD1OQv31k4npHhs/w4QWc5Q1tcjxFkM=","cT":"O+M+3Y78RdxnMD6mJfNrfi8eT7dKmAFxJCq4z8Zb/lob+7tWptW1hPQWe60lmT64YLNdMSrPd9N0Wszr6AQFar5jbekHmM/YME/FEf4FjpYBLOwXK54MNy+8LOORNp1f"}
    ],
    "required": [
        "nonce",
        "otPK",
        "cT"
    ],
    "properties": {
        "nonce": {
            "$id": "#/properties/nonce",
            "type": "string",
            "title": "Nonce",
            "description": "Base64 data of random number. Byte length: nacl.box.nonceLength. const nonce = nacl.randomBytes(nacl.box.nonceLength);",
            "examples": [
                "ftGVJfrKJg+PPNCMbKPdLMN3OKNNnHDk"
            ],
            "additionalProperties": false
        },
        "otPK": {
            "$id": "#/properties/otPK",
            "type": "string",
            "title": "Encryption public key",
            "description": "Public key of randomly generated key pair when encoding the message. const otKeyPair = nacl.box.keyPair();",
            "examples": [
                "w955HlFMM4e9dD1OQv31k4npHhs/w4QWc5Q1tcjxFkM="
            ],
            "additionalProperties": false
        },
        "cT": {
            "$id": "#/properties/cT",
            "type": "string",
            "title": "Cipher text",
            "description": "Public key of randomly generated key pair when encoding the message. const cipherText = nacl.box(Buffer.from(encMsg),nonce,rcptPubKey,otKeyPair.secretKey)",
            "examples": [
                "O+M+3Y78RdxnMD6mJfNrfi8eT7dKmAFxJCq4z8Zb/lob+7tWptW1hPQWe60lmT64YLNdMSrPd9N0Wszr6AQFar5jbekHmM/YME/FEf4FjpYBLOwXK54MNy+8LOORNp1f"
            ],
            "additionalProperties": false
        }
    },
    "additionalProperties": false
}
```

Example:

```
avote-vote-enc/v1/XIP4Y7NMP2:j{"nonce":"ftGVJfrKJg+PPNCMbKPdLMN3OKNNnHDk","otPK":"w955HlFMM4e9dD1OQv31k4npHhs/w4QWc5Q1tcjxFkM=","cT":"O+M+3Y78RdxnMD6mJfNrfi8eT7dKmAFxJCq4z8Zb/lob+7tWptW1hPQWe60lmT64YLNdMSrPd9N0Wszr6AQFar5jbekHmM/YME/FEf4FjpYBLOwXK54MNy+8LOORNp1f"}
```


# About vote coin

![](https://1619804700-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FBYNVAd0T2n4kCS8nWvsX%2Fuploads%2Fy6BN3yOZQRRIfqihOLOY%2Flogo200.png?alt=media\&token=239ec9aa-5c11-4900-9136-ff82a1e3364c)

Purpose of vote coin token is motivate people to create working solutions using vote coin specifications.

By creating application, publishing video, writing blog post you can receive vote coins.

The tokenomics as well as changes in the specifications are managed by the voting using the vote coin protocol.

MainNet ASA ID: [452399768](https://algoexplorer.io/asset/452399768)

TestNet ASA ID: [48806985](https://testnet.algoexplorer.io/asset/48806985) - DEX: <https://testnet.algodex.com/trade/48806985>

Discord: <https://discord.gg/nJ8waHWTwE>

Technical administrator is [Scholtz & Company, j.s.a.](https://www.orsr.sk/vypis.asp?ID=439983\&SID=2\&P=1\&lan=en)

Contact: <info@vote-coin.com>

### Public announcements

In regards of fair and equal distribution of news, the announcments are done through #announcment channel in official [Discord channel](https://discord.gg/nJ8waHWTwE).

### Vote coin in curculation

API Endpoints to check vote coins in circulation, total issued coins, and accounts held by Vote Coin DAO

* <https://api.vote-coin.com/Price/VoteCoinCirculationSupply>
* <https://api.vote-coin.com/Price/TotalCirculationSupply>
* <https://api.vote-coin.com/Price/VoteCoinDAOAddresses>

The endpoints list uint64 number in base units. To format specific numbers please note vote coin has 6 decimals.


# Roadmap

* [x] Q2 2021 - Project initiation on algorand official forum
* [x] Q3 2021 - First demo application - Encode summer algorand hackathon winner
* [x] Q4 2021 - Engagement program launched
* [x] Q4 2021 - Encode accelerator program start
* [x] Q4 2021 - Voting specification update - Results calculation message
* [x] Q1 2022 - Encode accelerator program end
* [x] Q1 2022 - Web focused on community DAOs voting , start promo of auditing services
* [x] Q2 2022 - Voting specification update - Encrypted voting
* [x] Q2 2022 - Encode DAO Hack winner
* [x] Q3 2022 - Web app improvements for DAO community building
* [x] Q2 2023 - xGov grant request - [GitHub tools](https://github.com/algorandfoundation/xGov/pull/24/files)
* [x] Q1 2024 - Vote Coin token liquidity increase has been performed with support from the Algorand Foundation xGov Grants Program - xgov#81.
* [x] Q1 2025 - liquidity incentive program has been extended to aAlgo,mAlgo,tAlgo, and xAlgo
* [ ] TBD - Open source tools update - GitHub tools for github management by onchain vote
* [ ] TBD - Voting specification update - NFT Extension - eligible token list
* [ ] TBD - Voting specification update - DeFi token unlock
* [ ] TBD - Voting specification update - Multichain voting


# Trade vote coin

### Historic price development

{% embed url="<https://vestige.fi/asset/452399768>" %}

### Best way to trade

Best way to trade $vote token is using the DEX aggregators Deflex, Alamex, Vestige or Folks Router used for example at [**https://dex.biatec.io/**](https://dex.biatec.io/)**.**

### Algo/Vote

<table><thead><tr><th width="159">Service provider</th><th width="150">Buy link</th><th>Sell link</th><th>Additional info</th></tr></thead><tbody><tr><td>Pact.Fi</td><td><a href="https://app.pact.fi/swap?pair=ALGO:0/VOTE+COIN:452399768">Algo -> Vote</a></td><td><a href="https://app.pact.fi/swap?pair=-ALGO:0/VOTE+COIN:452399768">Vote -> Algo</a></td><td><a href="https://app.pact.fi/add-liquidity/662102761">Add liqudity</a></td></tr><tr><td>TinyMan</td><td><a href="https://app.tinyman.org/#/swap?asset_in=0&#x26;asset_out=452399768">Algo -> Vote</a></td><td><a href="https://app.tinyman.org/#/swap?asset_in=452399768&#x26;asset_out=0">Vote -> Algo</a></td><td><a href="https://app.tinyman.org/#/pool/add-liquidity?asset_1=0&#x26;asset_2=452399768">Add liqudity</a></td></tr><tr><td>AlgoDex</td><td><a href="https://app.algodex.com/trade/452399768">Limit order</a></td><td><a href="https://app.algodex.com/trade/452399768">Limit order</a></td><td></td></tr></tbody></table>

### BTC/Vote

<table><thead><tr><th width="150">Service provider</th><th width="150">Buy link</th><th>Sell link</th><th>Additional info</th></tr></thead><tbody><tr><td>Pact.Fi</td><td><a href="https://app.pact.fi/swap?pair=GOBTC:386192725/VOTE+COIN:452399768">GoBTC -> Vote</a></td><td><a href="https://app.pact.fi/swap?pair=-GOBTC:386192725/VOTE+COIN:452399768">Vote -> GoBTC</a></td><td><a href="https://app.pact.fi/add-liquidity/727603109">Add liqudity</a></td></tr></tbody></table>

### USDC/Vote

<table><thead><tr><th width="150">Service provider</th><th width="150">Buy link</th><th>Sell link</th><th>Additional info</th></tr></thead><tbody><tr><td>Pact.Fi</td><td><a href="https://app.pact.fi/swap?pair=USDC:31566704/VOTE+COIN:452399768">USDC -> Vote</a></td><td><a href="https://app.pact.fi/swap?pair=-USDC:31566704/VOTE+COIN:452399768">Vote -> USDC</a></td><td><a href="https://app.pact.fi/add-liquidity/662105634">Add liqudity</a></td></tr><tr><td>TinyMan</td><td><a href="https://app.tinyman.org/#/swap?asset_in=31566704&#x26;asset_out=452399768">USDC -> Vote</a></td><td><a href="https://app.tinyman.org/#/swap?asset_in=452399768&#x26;asset_out=31566704">Vote -> USDC</a></td><td><a href="https://app.tinyman.org/#/pool/add-liquidity?asset_1=31566704&#x26;asset_2=452399768">Add liqudity</a></td></tr></tbody></table>

### USDT/Vote

<table><thead><tr><th width="150">Service provider</th><th width="150">Buy link</th><th>Sell link</th><th>Additional info</th></tr></thead><tbody><tr><td>Pact.Fi</td><td><a href="https://app.pact.fi/swap?pair=TETHER+USDT312769/VOTE+COIN452399768(1)">USDT -> Vote</a></td><td><a href="https://app.pact.fi/swap?pair=-TETHER+USDT312769/VOTE+COIN452399768(1)">Vote -> USDT</a></td><td><a href="https://app.pact.fi/add-liquidity/662144539">Add liqudity</a></td></tr><tr><td>TinyMan</td><td><a href="https://app.tinyman.org/#/swap?asset_in=312769&#x26;asset_out=452399768">USDT -> Vote</a></td><td><a href="https://app.tinyman.org/#/swap?asset_in=452399768&#x26;asset_out=312769">Vote -> USDT</a></td><td><a href="https://app.tinyman.org/#/pool/add-liquidity?asset_1=312769&#x26;asset_2=452399768">Add liqudity</a></td></tr></tbody></table>

### STBL/Vote

<table><thead><tr><th width="163.89743589743588">Service provider</th><th width="150">Buy link</th><th width="150">Sell link</th><th>Additional info</th></tr></thead><tbody><tr><td>Pact.Fi</td><td><a href="https://app.pact.fi/swap?pair=-VOTE+COIN452399768/STBL465865291(1)">STBL -> Vote</a></td><td><a href="https://app.pact.fi/swap?pair=VOTE+COIN452399768/STBL465865291(1)">Vote -> STBL</a></td><td><a href="https://app.pact.fi/add-liquidity/662165540">Add liqudity</a></td></tr><tr><td>TinyMan</td><td><a href="https://app.tinyman.org/#/swap?asset_in=465865291&#x26;asset_out=452399768">STBL -> Vote</a></td><td><a href="https://app.tinyman.org/#/swap?asset_in=452399768&#x26;asset_out=465865291">Vote -> STBL</a></td><td><a href="https://app.tinyman.org/#/pool/add-liquidity?asset_1=465865291&#x26;asset_2=452399768">Add liqudity</a></td></tr></tbody></table>

### gAlgo/Vote

<table><thead><tr><th width="163.89743589743588">Service provider</th><th width="150">Buy link</th><th width="150">Sell link</th><th>Additional info</th></tr></thead><tbody><tr><td>Pact.Fi</td><td><a href="https://app.pact.fi/swap?pair=-VOTE+COIN:452399768/GOVERNANCE+ALGO:793124631">gAlgo -> Vote</a></td><td><a href="https://app.pact.fi/swap?pair=VOTE+COIN:452399768/GOVERNANCE+ALGO:793124631">Vote -> gAlgo</a></td><td><a href="https://app.pact.fi/add-liquidity/1078306383">Add liqudity</a></td></tr></tbody></table>

### EURs/Vote

<table><thead><tr><th width="163.89743589743588">Service provider</th><th width="150">Buy link</th><th width="150">Sell link</th><th>Additional info</th></tr></thead><tbody><tr><td>Pact.Fi</td><td><a href="https://app.pact.fi/swap?direct=true&#x26;pair=STASIS%20EURO%3A227855942%2FVOTE%20COIN%3A452399768%282%2CCONSTv201%29">EURs -> Vote</a></td><td><a href="https://app.pact.fi/swap?pair=-STASIS+EURO:227855942/VOTE+COIN:452399768(2,CONSTv201)">Vote -> EURs</a></td><td><a href="https://app.pact.fi/add-liquidity/1526758875">Add liqudity</a></td></tr></tbody></table>

### Testnet token

Vote coin testnet token can be used for testing purposes in the vote coin [demo application](https://demo.vote-coin.com).

<table><thead><tr><th width="159">Service provider</th><th width="150">Buy link</th><th>Sell link</th><th>Additional info</th></tr></thead><tbody><tr><td>Pact.Fi</td><td><a href="https://testnet.pact.fi/swap?pair=ALGO0/VOTE+COIN48806985(1)">Algo -> Vote</a></td><td><a href="https://testnet.pact.fi/swap?pair=-ALGO0/VOTE+COIN48806985(1)">Vote -> Algo</a></td><td><a href="https://testnet.pact.fi/add-liquidity/88280437">Add liqudity</a></td></tr><tr><td>AlgoDex</td><td><a href="https://testnet.algodex.com/trade/48806985">Limit order</a></td><td><a href="https://testnet.algodex.com/trade/48806985">Limit order</a></td><td></td></tr></tbody></table>

### Liquidity support

Vote Coin token liquidity increase has been performed with support from the Algorand Foundation xGov Grants Program - [xgov#81](https://github.com/algorandfoundation/xGov/blob/main/Proposals/xgov-81.md).

Current state of the value of the assets from this program can be tracked at [Vestige](https://vestige.fi/wallet/VOTEMK4BPMNSCIKDC5XRYMXCPFJA7OFIG27N7PQIOVFTTPIROOBI4H3JFI).

All assets are held and can be monitored by account: [VOTE...3JFI](https://allo.info/account/VOTEMK4BPMNSCIKDC5XRYMXCPFJA7OFIG27N7PQIOVFTTPIROOBI4H3JFI/txns/).


# Staking program

### Community staking incentive program

Each hour everyone who owns at least 1000 $vote in basic account, will receive **10% p.a.** of his $vote amount from Vote coin DAO. Maximum effective balance per account is 1 000 000 $vote.

Disclaimer. This program is not legally bound, and may finish any time. Purpose of the program is marketing campaign.

Vote coins distributed from this program originates from the staking program pool: <https://allo.info/account/VOTESZMB66LO6CGVREQENOKIBMW4JG2BA7HJUXZBAYDLE6RKM2CQ2YI5EI/txns>

Announcments about change in staking program are done primarly through the discord: <https://discord.gg/tzRcBHDSXt>

### AMM staking incentive program

Each hour everyone who owns share at the official AMM liquidity pools will receive **50% p.a.** or **30% p.a.** or **20% p.a.** of his $vote amount in the shared pool. Maximum effective balance per account is 1 000 000 $vote.

Vote Coins held in LP pools

* with LP fee lower than or equal to 0.05% will receive 50% APY
* with LP fee higher than 0.05% and lower than or equal to 0.50%, will receive 30% APY
* with LP fee higher than 0.50% will receive 20% APY

Disclaimer. This program is not legally bound, and may finish any time. Purpose of the program is marketing campaign.

How does it calculate? Tinyman provides shares of the pool using pool created ASA, for example [553838965](https://algoexplorer.io/asset/553838965) and [553854066](https://algoexplorer.io/asset/553854066). Each hour we check balance of each holder at these pools which is the share of the pool. For example account ABC has share 1%. At the same round, the pool has for example 1 000 000 $vote on its account, so the account ABC owns 10 000 $vote. From the 10 000 $vote, account ABC will receive 50% pa in hourly base.

To add a liquidity to the AMM pool, select pool which you want to use and follow basic workflow.

#### 50 % APY pools

* [Pact.Fi Vote/Algo](https://app.pact.fi/add-liquidity/2757544466)
* [Pact.Fi Vote/Algo](https://app.pact.fi/add-liquidity/2757687691)
* [Pact.FI Vote/USDC](https://app.pact.fi/add-liquidity/1075409914)
* [Pact.Fi Vote/BTC](https://app.pact.fi/add-liquidity/1075404856)
* [Pact.Fi Vote/goUSD](https://app.pact.fi/add-liquidity/1140609824)
* [Pact.Fi Vote/Stasis EUR](https://app.pact.fi/add-liquidity/1526758875)

#### 50 % APY pools from interest bearing tokens

* [Pact.Fi Vote/aAlgo](https://app.pact.fi/add-liquidity/2680092237)
* [Pact.Fi Vote/tAlgo](https://app.pact.fi/add-liquidity/2680087789)
* [Pact.Fi Vote/xAlgo](https://app.pact.fi/add-liquidity/2680084315)
* [Pact.Fi Vote/mAlgo](https://app.pact.fi/add-liquidity/2680170037)

#### 30 % APY pools

* [TinyMan Vote/Algo](https://app.tinyman.org/#/pool/GASYYNLRCSNPPIL6WQJNBP3BTEOYCGDLQZWPHF2IKVNDIWP7RNIPSBKM5Y/add-liquidity)
* [TinyMan Vote/USDC](https://app.tinyman.org/#/pool/2FN4QARVV5HWHS4E43PBEKOA6XE3DF2PEO23ICLQR5OTXMP7NRPAJDIMA4/add-liquidity)
* [TinyMan Vote/USDT](https://app.tinyman.org/#/pool/HYHZS7YIXM72QR5PUIV6MIEYVP2HOP4BLIQ7NP2GSIUYOS4GVAYYCVMZ3Y/add-liquidity)
* [TinyMan Vote/tAlgo](https://app.tinyman.org/pool/TKGPKLN6N7TYIUSQ4URCZEMNHUKPNE5XHKEFC6ILW7MIKGGRW6XEFJ7EWE/add-liquidity)
* [Pact.Fi Vote/Algo](https://app.pact.fi/add-liquidity/2757690768)

#### 20 % APY pools

* [Pact.Fi Vote/Algo](https://app.pact.fi/add-liquidity/2757683558)

Changes in the distribution program configuration is announced at [Discord incentive liquidity program channel](https://discord.gg/vXwKxSH48n).


# Join the community

Discord: <https://discord.gg/nJ8waHWTwE>

Telegram: <https://t.me/+faIcmi1BTjk5NmM0>

Twitter: <https://twitter.com/TheVoteCoin>

Facebook: <https://www.facebook.com/TheVoteCoin>


# Documents

## 9th Dec 2022: VoteCoin DeFi TVL Report

[Google spreadsheet report](https://docs.google.com/spreadsheets/u/3/d/e/2PACX-1vSrZX6UpnppZ08PiYEFeGiIslJmzDi3FzMeiSGwadx41E28A8WlpKEDFyuzCAnmVaumZxljJqDJRMY6/pubhtml)

## 2nd July 2022: VoteCoin DeFi TVL Report

[Google spreadsheet report](https://docs.google.com/spreadsheets/d/1uzlgH40tmcgd-dJm0xW903Sv1qa9MGJNt_lZV0uc76M/edit?usp=sharing)

## 14th June 2022: VoteCoin DeFi TVL Report

[Google spreadsheet report](https://docs.google.com/spreadsheets/d/1H1EmXjEzrM7NHWSdw_nyRhX5d2DCu6u7TstPmUFnILs/edit?usp=sharing)

## 30th May 2022: VoteCoin DeFi TVL Report

[Google spreadsheet report](https://docs.google.com/spreadsheets/d/1iDWgp3NrXqmxEYz_Pnw49XtEJSDHpCoAczaFaoc3r3g/edit?usp=sharing)

## 15th May 2022: VoteCoin DeFi TVL Report

[Google spreadsheet report](https://docs.google.com/spreadsheets/d/1UDZwOTHXqG9cTkfenMjFeoYQyya7j4zsaA0ymQx8TA8/edit?usp=sharing)

## 16th Apr 2022: Top 20 vote coins accounts

For purpose to enlist VoteCoin in CoinMarketCap report of top 20 vote coins accounts has been published

[Google docs](https://docs.google.com/spreadsheets/u/2/d/e/2PACX-1vTrIeFNzkEDIzB1rkkFVb7aE3sTtrI5e1JsX_Nskp81mWkcCxzJUGXv4OG5EuPCP1y2niMdJ3mzK72y/pubhtml?gid=1181839735\&single=true)

## 29th Jan 2022: TinyMan transparency report

{% file src="/files/sqDibnnQVAY54NQ7OwVA" %}


# Tutorials

### Voting tutorials

Voting using AWallet: <https://www.youtube.com/watch?v=SgT4ibB67qs>

### Discord tutorials

How to use Vote Coin Bot on the discord is shown in the video <https://www.youtube.com/watch?v=M4MKaTS2LBs>

### More tutorials

Please check out our [engagement program](broken://pages/HtQqpo85Svy4qS1TghDN#code-tutorial) for more information.


# Open source solutions

### Vote Coin Demo

Public Vote Coin solution with allows interaction with vote coin system. Allows encrypted voting, voting delegation and more.

Web: <https://demo.vote-coin.com/>&#x20;

Source code: <https://github.com/scholtz/vote-coin-demo>

### Vote Coin API

Open source VoteCoin API.

Web: <https://api.vote-coin.com/swagger/index.html>

Source code: <https://github.com/scholtz/VoteCoinApi>&#x20;

### Vote Coin Indexer

Open source VoteCoin indexer which feeds data to hasura GraphQL.

Source code: <https://github.com/scholtz/vote-coin-indexer>

### AWallet

Vote Coin has been implemented in first open source algorand PWA wallet.

Web: <https://www.a-wallet.net/>

Source code: <https://github.com/scholtz/wallet/tree/master/src/pages/vote>

Video: <https://www.youtube.com/watch?v=SgT4ibB67qs>

### Vote Coin Discord bot

<https://discord.gg/mPW36G6xqn>

<https://github.com/hilary3211/vote_coin-chatbot>


# Research studies

There are no studies right now. Be first one to get the bounty from our engagement program.

### More research papers

Please check out our [engagement program](broken://pages/HtQqpo85Svy4qS1TghDN#academic-paper) for more information.


# Logos

{% file src="/files/U93EEkfGXcODIMDamxFY" %}

{% file src="/files/iE97Gu0BBqMGzetyA3H9" %}

{% file src="/files/UiUgU4lqirjGyUDs5L8l" %}

{% file src="/files/UHV1P5ImOYpG2KKMJXqt" %}

{% file src="/files/OPC5s2rmMza9F7HsYprk" %}


