...
There is currently no easy way for groups to identify their members with an on-chain mechanism that is blockchain-agnostic and provides value to the members (as FIO Addresses do). Private FIO Domains can do this well, but it creates other challenges around how that domain is managed, how ownership of that domain over time can change, and how the group members decide who will act as admins for the group. Without a mechanism to do this, the trust in the private FIO Domain and the exclusive value it creates for the group member identification is diminished.
Note: Please also see the additional benefits section at the end of this document. The Foundation Board has need of very similar features.
How will this product/initiative solve this problem?
...
I’m a member of the QuakerDAO, a crypto group for UPENN alumnus. We could create a DAC for this group and assign their quakerdao domain to them. I could then have lukestokes@quakerdao to prove I’m a member of the group. I could register as a custodian candidate or vote for existing candidates who would then be elected to manage the account that owns the quakerdao via multisig. If there are any community projects or dues that are needed, the multisig DAO can manage those funds and use using FIO Requests.
Additional Benefits
The Foundation for Interwallet Operability Board already has needs for a voting system as described here /wiki/spaces/~268441363/pages/15368275 and here FIO Board Member Candidate Submission . If we build this for everyone’s use and not just the foundation, it can have far more value.
Technical Implementation
Tables
Expand | ||
---|---|---|
| ||
Groups (
Pending Members (
Members (
Admin Candidates (
Votes (
Vote Results (
Elections (
|
Groups (groups
)
group_fio_public_key
FIO Public Key of the account which owns the domain.
Used for historical purposes once account becomes an msig.
domain
member_application_fee
in SUFs
date_created
Pending Members (pendingmembr
)
member_name_requested
FIO address at domain
domain
account
bio
limited to 255 characters
application_date
Members (members
)
domain
account
bio
limited to 255 characters
date_added
last_verified_date
Date the member was added to the group and then later updated each time membership is verified.
is_admin
set to true for groups creator or if elected as an admin of the group)
Admin Candidates (admincandids
)
domain
candidate_account
Votes (votes
)
domain
epoch
integer that increases with each election
voter_account
candidate_account
rank
use ranked choice voting
If a member votes for 5 candidates, they would rank each vote 1 through 5.
Vote Results (voteresults
)
id
auto generated incrementing integer
domain
epoch
integer that increases with each election
candidate_account
rank
The resulting rank for this candidate after the vote is complete
votes
Total number of votes received by this candidate
Elections (elections
)
domain
epoch
vote_time
number_of_admins
Integer for the number of admins that are being elected.
This will be the number of accounts on the msig that owns the domain.
vote_threshold
Integer for the number of admin votes need to approve any action requiring permissions of the group account.
votes_per_member
Number of votes each member gets for this election.
For example, if doing approval voting like EOS, you might allow for 30 votes to fill 21 spots. Or you could use the eosDAC model of 5 votes to elect 12 positions.
is_complete
Marks if this election is completed.
Note: this field may not be needed if we just want to use “date_certified is not null” to accomplish the same thing.
date_certified
The date this election was marked as complete.
Actions
...
title | Actions |
---|
Create Group (creategroup
)
Parameters:
fio_public_key
domain
member_application_fee
Results and Notes:
Registers the domain (if available) to the public key provided.
If an account already exists for the public key, throw an error, otherwise adjust owner and active permissions on the newly created account to be that of the calling actor.
Adds one and only one record per domain to the
groups
table.Adds a record to the
members
table using the actor and sets is_admin to 1.
Delete Group (deletegroup
)
Parameters:
domain
Results and Notes:
Can only be called by the account which owns the domain.
Removes all domain related records from all group tables.
Apply for Membership (memberapply
)
Parameters:
domain
requested_member_address
FIO address the member would like to register at the group domain
bio
Optional
Limit to 255 charachters
<FIO token payment>
This action will require a payment of FIO in the amount of the
member_application_fee
defined in thegroups
table record for this domain)
<actor = account>
Use the actor calling this method as the account value for the
pendingmembr
table.
Results and Notes:
domain must exist in groups table.
Call includes payment in FIO tokens which is used to create the FIO address.
Adds one and only one record per domain / account pair to the pending members table.
Resign Member (resignmember
)
Parameters:
domain
account
Results and Notes:
Removes from member table and pending member table.
Can only be called by actor of account or by the owner of the domain (which is the msig of the group itself)
Approve Member Application (approvemembr
)
Parameters:
domain
account
Results and Notes:
Only callable by the group owner.
Uses data from pending members table to add an entry to the members table (is_admin false).
Registers FIO address for member and assigns to them.
Last verified is set to now.
Removes entry from pended members table.
Reject Member Application (rejectmemapp
)
Parameters:
domain
account
Results and Notes:
Only callable by the group owner or the actor for account.
Removes entry from pending members table
Update Member Bio (updatemembio
)
Parameters:
domain
account
bio
255 character limit
Can be set to an empty string to clear out the bio
Results and Notes:
Only callable by actor of account unless called by group owner, in which case bio is cleared.
Remove Member (removemembr
)
Parameters:
domain
account
Results and Notes:
Only callable by group owner or actor of account.
Throw error if is_admin is true.
We may want to change this to allow an admin to leave the group entirely, but it might introduce other complexities.
Register as Candidate (regcandidate
)
Parameters:
domain
candidate_account
Results and Notes:
must already be in the members table for this domain
adds one and only one record per domain / account pair to the admin candidate table.
Remove Candidate Registration (remcandreg
)
Parameters:
domain
candidate_account
Results and Notes:
Callable by group owner or actor of candidate_account
Remove record from
admincandids
Create Election (createlectin
)
Parameters:
domain
number_of_admins
Example, for a 3 of 5 multisig, enter 5.
vote_threshold
Example: for a 3 of 5 multisig, enter 3.
votes_per_member
During the election, how many candidates can a member vote for?
Results and Notes:
Adds record to elections table.
Can only be called by an admin (member with is_admin set to true)
epoch is a sequential number, obtained by adding 1 to previously highest epoch for this domain or defaulting to 1.
Vote (vote
)
Parameters:
domain
candidate_account
rank
use ranked choice voting
Results and Notes:
Adds a record to the votes table.
Use actor for voter_account.
Must exist in members table for domain.
epoch obtained by querying elections table for domain, obtaining greatest epoch and adding 1.
Record Vote Result (recrdvterslt
)
Parameters:
domain
candidate_account
rank
The resulting rank for this election for this candidate based on the number of votes they got
votes
the sum total of all votes for this candidate for this election epoch
Results and Notes:
Can only be called by group owner account.
epoch is derived from most recent election where time of vote < now.
Can only be called for an election where is_complete is false
or should we just use date certified is null
Adds a record to the
voteresults
table.
Remove Vote Result (remvtresult
)
Parameters:
id
may change based on design
Results and Notes:
Only callable by group owner account.
Only valid for an election result that isn’t complete or for election results that are older than some threshold (2 years?).
Used to fix errors and remove stale data.
Certify Election (certelection
)
...
Parameters:
domain
Results and Notes:
...
Gets a completed active election (time of vote < now, latest epoch)
...
Verifies number of custodians voted on was met
...
Sets date certified to now.
...
Sets all is_admin to false.
...
Sets top ranked by vote candidates is_admin as true in members
table.
...
Creates msig for the group owner account to sign with permission change for the account based on the election.
...
Having a FIO Ad @quakerdao
Gaming Guild
Many gaming communities have very strongly connected players who form guilds and have their own online meeting places, websites, membership dues, and more. Introducing them to crypto currency through the use of a FIO Group might be a successful business development strategy for FIO while providing a useful mechanism for them to keep track of their membership.
Info |
---|
Additional BenefitsThe Foundation for Interwallet Operability Board already has needs for a voting system as described here /wiki/spaces/~268441363/pages/15368275 and here FIO Board Member Candidate Submission . If we build this for everyone’s use and not just the Foundation, it can have far more value for the network. Though other solutions may be simpler in the near term for Foundation voting (offchain candidate registration, vote tally from sending funds to specific addresses created for each candidate, etc), they won’t create any additional potential value for the network. Due to the time constraints of the first election, there may not be time to build this FIO Group functionality for the first vote in April. |
Technical Implementation
Tables
Expand | ||
---|---|---|
| ||
Groups (
Pending Members (
Members (
Admin Candidates (
Votes (
Vote Results (
Elections (
|
Actions
Expand | ||
---|---|---|
| ||
Create Group (
Delete Group (
Apply for Membership (
|
...
Resign Member (resignmember
)
...
Parameters:
domain
account
Results and Notes:
...
Removes from member table and pending member table.
...
Approve Member Application (
Reject Member Application (
Update Member Bio (
Remove Member (
Verify Member (
Register as Candidate (
Remove Candidate Registration (
Create Election (
Vote (
Record Vote Result (
Remove Vote Result (
Certify Election (
|