Voting Power Proxy Canister

Voting Power Proxy Canister

Overview

The Voting Power (VP) Proxy Canister enables council members of SNS DAOs to manage a specified amount of staked SNS tokens within a neuron. It can be configured to participate only in proposals that meet certain criteria, such as not having a specific action type and proposals with titles not beginning with “CONFIGURE COUNCIL NEURON”.

Specification

Voting Criteria

  • The canister votes on a proposal only if at least 50% of all council neurons have participated.
    • If less than 50% have participated, the proxy abstains from voting.
  • If the participation condition is met:
    • The proxy votes in favor of the proposal if more than 50% of the participating council members have voted yes.
    • Otherwise, the proxy votes against the proposal.

Listening to Proposals

Once activated via the watch_proposals method, the proxy starts a recurring timer that checks for new proposals every 24 hours.

Filtering Proposals

The proxy canister excludes the following proposals:

  • Proposals with an action ID listed in the exclusion list.
  • Proposals with a title starting with “CONFIGURE COUNCIL NEURON”.

Handling Proposals

When a new proposal is added to the watchlist, a one-time timer is set to trigger one hour before the proposal’s voting deadline. At that time, the proxy evaluates the participation of council neurons and decides the verdict if voting is still open.

Deployment

The canister can be deployed by anyone, not just the DAO. Follow these steps to deploy:

  1. Deploy the canister on the IC mainnet:
    dfx deploy --ic
    
  2. Configure the SNS governance canister:
    dfx canister call --ic vp_proxy set_governance_id '(principal "PID")'
    
  3. Configure the SNS ledger canister:
    dfx canister call --ic vp_proxy set_ledger_id '(principal "PID")'
    
  4. Add a council member:
    dfx canister call --ic vp_proxy add_council_member '("NAME", "NEURON-ID")'
    
  5. Create a neuron after sending SNS tokens to the canister:
    dfx canister call --ic vp_proxy create_neuron '(TOKEN_AMOUNT, NONCE)'
    
  6. Add action types to the exclusion list:
    dfx canister call --ic vp_proxy disallow_action_type '(ACTION_TYPE_ID)'
    
  7. Start listening to incoming proposals from a given proposal ID:
    dfx canister call --ic vp_proxy watch_proposals '(record { id = PROPOSAL_ID }, FROM_PROPOSAL_ACTION, FROM_PROPOSAL_CREATION_TIMESTAMP)'
    

Additional Configuration

  • Emergency reset of council members:
    dfx canister call --ic vp_proxy emergency_reset
    
  • Allow a previously excluded action type:
    dfx canister call --ic vp_proxy allow_action_type '(ACTION_TYPE_ID)'
    
  • Remove a previously appointed council member:
    dfx canister call --ic vp_proxy remove_council_member '(NEURON_ID)'
    
  • Stop watching new proposals and all timers:
    dfx canister call --ic vp_proxy stop_timers
    

Queries

The canister exposes the following query methods:

  • List all council members:
    dfx canister call --ic vp_proxy get_council
    
  • List all proposals on the watchlist:
    dfx canister call --ic vp_proxy get_proposal_watchlist
    
  • List all proposals that were on the watchlist:
    dfx canister call --ic vp_proxy get_proposal_history
    
  • Get the status of a specific proposal by its ID:
    dfx canister call --ic vp_proxy get_proposal_status '(record {id = PROPOSAL_ID})'
    
  • List all excluded action types:
    dfx canister call --ic vp_proxy get_exclusion_list
    

Acknowledgments

This canister was developed for the ICP CC DAO. However, any other SNS DAO or individual who wishes to use it for personal reasons is welcome to do so.

3 Likes

What is the purpose of abstaining if the canister is going to control voting power? Why not vote NO? If you abstain, then anyone who follows the neuron will not get the associated voting rewards unless they vote manually. Presumably people will not want to have to monitor if their Followee has voted or not. I’m trying to better understand the use case for this canister. Is it intended to control the vote of a neuron that is put forth to a community for the purpose of following?

1 Like

Thanks for sharing this question. The voting criteria was outlined by @aiv , so I think he will know better about this issue.

1 Like

Hey @NimaRa,

@wpb brings up a good point regarding this parameter. In the case that not enough council members have voted, we can configure the VP Proxy neuron to vote “no” by default.

I think it should still abstain from votes to change it’s own configuration (such as adding and removing council members) because those votes should be rare and abstaining prevents the council from entrenching their power or being able to infiltrate the council with their friends.

However, outside of those unique circumstances which represent a governance risk, a default vote of “no” is fine.

Also @wpb,

Right now the ICPCC DAO doesn’t have governance rewards active yet because the built-in mechanism gives out rewards via token inflation, and the $CONF supply is fixed. Since we’ll be implementing a custom governance system, we’d be able to set up rules and possibly make it so that neurons don’t miss out on rewards if they follow the Council Neuron and that neuron abstains.

1 Like

Thanks for the explanation @aiv. The use case makes sense. I wanted to better understand since there was a comment that it could be used by other SNS teams or individuals.

The canister is quite flexible and can be utilized by any team or individual. While I can expose additional functions to modify more settings, the current setup already allows easy modification of voting criteria directly in the code. I’m happy to help anyone who may need to change more settings!

1 Like