Skip to content

Commit

Permalink
Merge pull request #75 from boscore/feature/auditor-v2-tally-update
Browse files Browse the repository at this point in the history
Update Vote Tally to update auditor v2.0
  • Loading branch information
libhasheos committed Jul 3, 2019
2 parents 2898f0c + 45e40bc commit ebc0169
Show file tree
Hide file tree
Showing 5 changed files with 151 additions and 106 deletions.
69 changes: 25 additions & 44 deletions vote-tally/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -53,56 +53,37 @@ bosc forum propose [proposer] [proposal_name] [title] [proposal_expiration_date]

- [https://s3.amazonaws.com/bos.referendum/{scope}/{table}/{block_num}.json](https://s3.amazonaws.com/bos.referendum/referendum/tallies/latest.json)

### `referendum` (tally)
### `referendum` (tally) Aggregated Data

`referendum::forum.tallies` (tallies for `eosio.forum` voters)
**eosio.forum**
- [referendum::forum.tallies](https://s3.amazonaws.com/bos.referendum/referendum/forum.tallies/latest.json)
- [referendum::forum.accounts](https://s3.amazonaws.com/bos.referendum/referendum/forum.accounts/latest.json)
- [referendum::forum.proxies](https://s3.amazonaws.com/bos.referendum/referendum/forum.proxies/latest.json)

- https://s3.amazonaws.com/bos.referendum/referendum/forum.tallies/latest.json
**auditor.bos**
- [referendum::auditor.tallies](https://s3.amazonaws.com/bos.referendum/referendum/auditor.tallies/latest.json)
- [referendum::auditor.accounts](https://s3.amazonaws.com/bos.referendum/referendum/auditor.accounts/latest.json)
- [referendum::auditor.proxies](https://s3.amazonaws.com/bos.referendum/referendum/auditor.proxies/latest.json)

`referendum::forum.accounts` (account details for `eosio.forum` voters)
**eosio**
- [referendum::delband](https://s3.amazonaws.com/bos.referendum/referendum/delband/latest.json)
- [referendum::voters](https://s3.amazonaws.com/bos.referendum/referendum/voters/latest.json)

- https://s3.amazonaws.com/bos.referendum/referendum/forum.accounts/latest.json
## `auditor.bos` TABLES

`referendum::forum.proxies` (proxies details for `eosio.forum` voters)
- [auditor.bos::votes](https://s3.amazonaws.com/bos.referendum/auditor.bos/votes/latest.json)
- [auditor.bos::votejson](https://s3.amazonaws.com/bos.referendum/auditor.bos/votejson/latest.json)
- [auditor.bos::candidates](https://s3.amazonaws.com/bos.referendum/auditor.bos/candidates/latest.json)
- [auditor.bos::auditors](https://s3.amazonaws.com/bos.referendum/auditor.bos/auditors/latest.json)
- [auditor.bos::config](https://s3.amazonaws.com/bos.referendum/auditor.bos/config/latest.json)
- [auditor.bos::bios](https://s3.amazonaws.com/bos.referendum/auditor.bos/bios/latest.json)

- https://s3.amazonaws.com/bos.referendum/referendum/forum.proxies/latest.json
## `eosio.forum` TABLES

`referendum::auditor.tallies` (tallies for `auditor.bos` voters)
- [eosio.forum::vote](https://s3.amazonaws.com/bos.referendum/eosio.forum/vote/latest.json)
- [eosio.forum::proposal](https://s3.amazonaws.com/bos.referendum/eosio.forum/proposal/latest.json)

- https://s3.amazonaws.com/bos.referendum/referendum/auditor.tallies/latest.json
### `eosio` TABLES

`referendum::auditor.accounts` (account details for `auditor.bos` voters)

- https://s3.amazonaws.com/bos.referendum/referendum/auditor.accounts/latest.json

`referendum::auditor.proxies` (proxies details for `auditor.bos` voters)

- https://s3.amazonaws.com/bos.referendum/referendum/auditor.proxies/latest.json

`referendum::delband` (self delegated bandwidth amount for all `eosio.forum` & `auditor.bos` voters)

- https://s3.amazonaws.com/bos.referendum/referendum/delband/latest.json

`referendum::voters` (voters table for all `eosio.forum` & `auditor.bos` voters)

- https://s3.amazonaws.com/bos.referendum/referendum/voters/latest.json

### `eosio.forum` (eosio.forum)

`eosio.forum::vote` (all votes)

- https://s3.amazonaws.com/bos.referendum/eosio.forum/vote/latest.json

`eosio.forum::proposal` (all proposals)

- https://s3.amazonaws.com/bos.referendum/eosio.forum/proposal/latest.json

### `eosio` (voting weights)

`eosio::voters` (entire voters table)

- https://s3.amazonaws.com/bos.referendum/eosio/voters/latest.json

`eosio::stats` (aggregated EOSIO statistics useful for UI's)

- https://s3.amazonaws.com/bos.referendum/eosio/stats/latest.json
- [eosio::voters](https://s3.amazonaws.com/bos.referendum/eosio/voters/latest.json)
- [eosio::stats](https://s3.amazonaws.com/bos.referendum/eosio/stats/latest.json)
37 changes: 23 additions & 14 deletions vote-tally/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import * as write from "write-json-file";
import * as load from "load-json-file";
import { CronJob } from "cron";
import { uploadS3 } from "./src/aws";
import { ForumVote, ForumProposal, EosioVoter, EosioDelband, AuditorVote, AuditorCandidate } from "./src/interfaces";
import { ForumVote, ForumProposal, EosioVoter, EosioDelband, AuditorVote, AuditorCandidate, AuditorAuditors, AuditorVoteJSON, AuditorBios, AuditorConfig } from "./src/interfaces";
import { rpc, CHAIN, CONTRACT_FORUM, DEBUG, CONTRACT_TOKEN, TOKEN_SYMBOL, CONTRACT_AUDITOR } from "./src/config";
import { generateForumAccounts, generateForumProxies, generateForumTallies } from "./src/tallies_forum";
import { filterVotersByVotes } from "./src/tallies";
import { get_table_voters, get_forum_vote, get_table_forum_proposal, get_table_delband, get_auditor_votes, get_table_auditor_candidates } from "./src/get_tables";
import { get_table_delband, get_tables } from "./src/get_tables";
import { disjoint, parseTokenString, createHash } from "./src/utils";
import { generateEosioStats } from "./src/stats";
import { generateAuditorAccounts, generateAuditorTallies, generateAuditorProxies } from "./src/tallies_auditor";
import { generateAuditorAccounts, generateAuditorTallies, generateAuditorProxies, combineAuditorVotes } from "./src/tallies_auditor";

// Base filepaths
const basepath = path.join(__dirname, "data", CHAIN);
Expand All @@ -33,6 +33,10 @@ let forum_proposals: ForumProposal[] = [];
// Global Auditor
let auditor_votes: AuditorVote[] = [];
let auditor_candidates: AuditorCandidate[] = [];
let auditor_auditors: AuditorAuditors[] = [];
let auditor_votejson: AuditorVoteJSON[] = [];
let auditor_bios: AuditorBios[] = [];
let auditor_config: AuditorConfig;

/**
* Sync `eosio` tables
Expand All @@ -43,7 +47,7 @@ async function syncEosio(head_block_num: number) {
// fetch `eosio` voters
let eosioVoters: EosioVoter[] = [];
if (DEBUG && fs.existsSync(voters_latest)) eosioVoters = load.sync(voters_latest) // Speed up download of eosio::voters table for debugging
else eosioVoters = await get_table_voters();
else eosioVoters = await get_tables<EosioVoter>("eosio", "eosio", "voters", "owner", ["flags1", "reserved2", "reserved3"]);

voters = filterVotersByVotes(eosioVoters, forum_votes, auditor_votes);
voters_owner = new Set(voters.map((row) => row.owner));
Expand Down Expand Up @@ -75,15 +79,15 @@ async function syncForum(head_block_num: number) {
console.log(`syncForum [head_block_num=${head_block_num}]`);

// fetch `eosio.forum` votes
forum_votes = await get_forum_vote();
forum_votes = await get_tables<ForumVote>(CONTRACT_FORUM, CONTRACT_FORUM, "vote", "id");

// Add unique voters to global tracking
for (const {voter} of forum_votes) {
votes_owner.add(voter);
}

// fetch `eosio.forum` proposal
forum_proposals = await get_table_forum_proposal();
forum_proposals = await get_tables<ForumProposal>(CONTRACT_FORUM, CONTRACT_FORUM, "proposal", "proposal_name");

// Save JSON
save(CONTRACT_FORUM, "vote", head_block_num, forum_votes);
Expand All @@ -97,19 +101,25 @@ async function syncAuditor(head_block_num: number) {
console.log(`syncAuditor [head_block_num=${head_block_num}]`);

// fetch `auditor.bos` votes
auditor_votes = await get_auditor_votes();
auditor_votes = await get_tables<AuditorVote>(CONTRACT_AUDITOR, CONTRACT_AUDITOR, "votes", "voter");
auditor_votejson = await get_tables<AuditorVoteJSON>(CONTRACT_AUDITOR, CONTRACT_AUDITOR, "votejson", "voter");
auditor_candidates = await get_tables<AuditorCandidate>(CONTRACT_AUDITOR, CONTRACT_AUDITOR, "candidates", "candidate_name");
auditor_auditors = await get_tables<AuditorAuditors>(CONTRACT_AUDITOR, CONTRACT_AUDITOR, "auditors", "auditor_name");
auditor_bios = await get_tables<AuditorBios>(CONTRACT_AUDITOR, CONTRACT_AUDITOR, "bios", "candidate_name");
auditor_config = (await get_tables<AuditorConfig>(CONTRACT_AUDITOR, CONTRACT_AUDITOR, "config", "lockupasset"))[0];

// Add unique voters to global tracking
for (const {voter} of auditor_votes) {
votes_owner.add(voter);
}

// fetch `eosio.forum` proposal
auditor_candidates = await get_table_auditor_candidates();

// Save JSON
save(CONTRACT_AUDITOR, "votes", head_block_num, auditor_votes);
save(CONTRACT_AUDITOR, "votejson", head_block_num, auditor_votejson);
save(CONTRACT_AUDITOR, "candidates", head_block_num, auditor_candidates);
save(CONTRACT_AUDITOR, "auditors", head_block_num, auditor_auditors);
save(CONTRACT_AUDITOR, "bios", head_block_num, auditor_bios);
save(CONTRACT_AUDITOR, "config", head_block_num, auditor_config);
}

/**
Expand All @@ -136,9 +146,6 @@ async function calculateForumTallies(head_block_num: number) {
const forum_tallies = generateForumTallies(head_block_num, forum_proposals, forum_accounts, forum_proxies, currency_supply);

// Save JSON
save("referendum", "accounts", head_block_num, forum_accounts);
save("referendum", "proxies", head_block_num, forum_proxies);
save("referendum", "tallies", head_block_num, forum_tallies);
save("referendum", "forum.accounts", head_block_num, forum_accounts);
save("referendum", "forum.proxies", head_block_num, forum_proxies);
save("referendum", "forum.tallies", head_block_num, forum_tallies);
Expand All @@ -152,12 +159,14 @@ async function calculateAuditorTallies(head_block_num: number) {

const auditor_accounts = generateAuditorAccounts(auditor_votes, delband, voters);
const auditor_proxies = generateAuditorProxies(auditor_votes, delband, voters);
const auditor_tallies = generateAuditorTallies(head_block_num, auditor_candidates, auditor_accounts, auditor_proxies);
const auditor_tallies = generateAuditorTallies(head_block_num, auditor_candidates, auditor_accounts, auditor_proxies, auditor_bios, auditor_auditors);
const auditor_combined_votes = combineAuditorVotes(auditor_votes, auditor_votejson);

// Save JSON
save("referendum", "auditor.accounts", head_block_num, auditor_accounts);
save("referendum", "auditor.proxies", head_block_num, auditor_proxies);
save("referendum", "auditor.tallies", head_block_num, auditor_tallies);
save("referendum", "auditor.votes", head_block_num, auditor_combined_votes);
}

/**
Expand Down
45 changes: 4 additions & 41 deletions vote-tally/src/get_tables.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,6 @@
import { delay, parseTokenString } from "./utils";
import { rpc, DELAY_MS, CONTRACT_FORUM, CONTRACT_AUDITOR } from "./config";
import { EosioVoter, ForumVote, AuditorVote, ForumProposal, EosioDelband } from "./interfaces";
import { AuditorCandidate } from "./interfaces_auditor";

/**
* Get Table `eosio::voters`
*/
export async function get_table_voters() {
return get_tables<EosioVoter>("eosio", "eosio", "voters", "owner", ["flags1", "reserved2", "reserved3"]);
}
import { delay } from "./utils";
import { rpc, DELAY_MS } from "./config";
import { EosioDelband } from "./interfaces";

/**
* Get Table `eosio::delband`
Expand All @@ -27,35 +19,6 @@ export async function get_table_delband(scopes: Set<string>) {
return delband;
}

/**
* Get Table `eosio.forum::vote`
*/
export function get_forum_vote() {
return get_tables<ForumVote>(CONTRACT_FORUM, CONTRACT_FORUM, "vote", "id");
}

/**
* Get Table `auditor.bos::votes`
*/
export function get_auditor_votes() {
return get_tables<AuditorVote>(CONTRACT_AUDITOR, CONTRACT_AUDITOR, "votes", "voter");

}

/**
* Get Table `eosio.forum::proposal`
*/
export function get_table_forum_proposal() {
return get_tables<ForumProposal>(CONTRACT_FORUM, CONTRACT_FORUM, "proposal", "proposal_name");
}

/**
* Get Table `auditor.bos::candidates`
*/
export function get_table_auditor_candidates() {
return get_tables<AuditorCandidate>(CONTRACT_AUDITOR, CONTRACT_AUDITOR, "candidates", "candidate_name", ["total_votes"]);
}

/**
* Get Tables
*/
Expand Down Expand Up @@ -91,4 +54,4 @@ export async function get_tables<T>(code: string, scope: string, table: string,
if (response.more === false) break;
}
return Array.from(rows.values());
}
}
48 changes: 45 additions & 3 deletions vote-tally/src/interfaces_auditor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,22 @@ import { TallyStats } from "./interfaces";
export interface AuditorCandidate {
candidate_name: string;
locked_tokens: string;
// total_votes: number;
total_votes: number;
is_active: boolean;
auditor_end_time_stamp: string;
unstaking_end_time_stamp: string;
}

export interface AuditorVote {
voter: string;
proxy: string;
staked: number;
candidates: string[];
}

export interface AuditorProxiesVote extends AuditorVote {
staked_proxy: number;
}


export interface AuditorTallies {
/**
* candidate_name
Expand All @@ -29,6 +30,8 @@ export interface AuditorTally {
id: string;
stats: TallyStats;
candidate: AuditorCandidate;
bio: AuditorBio;
is_auditor: boolean;
}

export interface AuditorProxiesVote extends AuditorVote {
Expand Down Expand Up @@ -62,3 +65,42 @@ export interface AuditorAccounts {
proxy: string;
}
}

export interface AuditorAuditors {
auditor_name: string;
}

export interface AuditorVoteJSON {
voter: string;
vote_json: string;
updated_at: string;
}

export interface AuditorVotesCombined extends AuditorVote {
vote_json?: {
comment?: string;
[key: string]: any;
};
updated_at?: string;
}

export interface AuditorBios {
candidate_name: string;
bio: string;
}

export interface AuditorConfig {
lockupasset: string;
maxvotes: number;
numelected: number;
authaccount: number;
auth_threshold_auditors: number;
lockup_release_time_delay: number;
}

export interface AuditorBio {
avatar: string;
bio: string;
contact: string;
[key: string]: string;
}
Loading

0 comments on commit ebc0169

Please sign in to comment.