Provide a brief overview of the strategy and its purpose.
Describe the high-level flow of how recipients are registered, allocations, and how tokens are distributed.
Conviction Voting (CV) is a strategy that enables bottom-up governance of a shared pool of funds. The purpose is to allocate community funding more efficiently by making it easier for capable and honest people to get the resources they need to contribute to the community.
In CV, the amount of support needed to approve a funding proposal scales with the amount of funding being requested, and the weight of someone's support ("conviction") grows over time as they continue to support a proposal. Proposals are disputable and can be escalated to a judicial system that rules on whether to block funding because the proposal violates the community's shared set of values.
Anyone staking tokens in the community's covenant can create a proposal - a deposit is required to create a proposal which is forfeited only if the proposal is disputed and ruled as blocked.
There are 3 types of proposals:
Funding Proposals
A discrete amount of funding is requested. The amount of conviction needed to pass is determined by the amount of funding requested, as well as the minimum conviction and spending limit set by the community. When a funding proposal reaches enough conviction to pass without being disputed, anyone can execute and all requested funds are distributed.
Streaming Proposals
A stream of funding is requested. The amount of tokens streamed is determined by the amount of conviction staked in the proposal, as well as a minimum conviction for a stream to start and a maximum total streaming amount set by the community. Tokens are wrapped and streamed through Superfluid and recipients receive Super tokens.
Signalling Proposals
No funding is requested - this simply indicates a community's support for an idea, and since conviction needed to pass is a function of total support across all proposals, it can also be used to oppose funding proposals by making it more difficult for them to pass (i.e. an "abstain proposal")
To summarize the logic in Allo terms:
CommunityCovenant contract (1 for each community):
list of proposals challenged with status - this will hold status for all connected Allo strategies?
admin permissions - how to give council safe permissions to edit CV parameters?
Explain the logic for determining how recipients are added to the strategy's pool. This should include how the eligibility of a recipient is determined, the logic for registering eligible recipients, the recipient status workflow (including a list of available statuses such as None
, Pending
, Accepted
, Rejected
), and the conditions under which status changes. . Specify any custom functions or conditions that will be required.
Recipient eligibility
What criteria determine the eligibility of a recipient to register in this strategy? Are there any specific requirements or conditions?
A:
1. Recipient Creator has staked required minimum tokens in CommunityCovenant
2. Recipient Creator submits required deposit
3. Deposit can be lost if proposal(recipient) disputed successfully. This lost deposit will be transferred to the CV pool
Are there any additional custom functions or conditions for verifying recipient eligibility?
A: All required proposal information is submitted:
Recipient information
How does a recipient identify themselves? Is it through an address like msg.sender, do they need an profile registered at the Registry
contract, or another mechanism?
A: through msg.sender, no profile is needed
If through the Registry, can the pool creator set a custom registry?
N/A
Which address is returned by registerRecipient
and represents the recipientId
?
A: A proposalID should be returned as uint160 cast to address type, because its enforced to be address or the beneficiary address should be returned
Can the address that receives the funds be different from the recipient's profile?
A: Yes
What additional data is needed and passed during the registration process, apart from the recipient's address?
A:
- amount fund requested (on chain)
- beneficiaryAddress (on chain)
- creatorAddress(msg.sender) (emit event for subgraph)
- link to discussion
- proposal type (funding, streaming signaling)
- add description(ipfs hash on chain)
Registering recipients
Is the registerRecipient
function accessible to anyone, or is it restricted to specific roles or addresses?
A: Restricted for specific addresses staked in the CommunityCovenant
Are there any specific conditions under which the registerRecipient
function can or cannot be called?
How does the strategy handle ineligible registrations? Are they automatically rejected, or is there a specific process in place?
Does the pool manager need to approve the registration, or is it automatically approved?
Are there any limits on the number of recipients that can be registered? If so, what are those limits and how are they enforced?
A: No, only if that could be make the contracts gas efficient.
Are multiple registrations for a recipient allowed or just one?
A: Yes, a recipient (proposal) can be created multiple times by the same creator
What steps are involved in changing the recipient's status from one state to another?
A: So the proposal can have 4 status:
Active
Paused
Cancelled
Executed
Are there any additional functions available to check or modify the recipient's status?
A: We need:
Explain the logic for how the strategy will allow eligible allocators to express an opinion about how the pool's funds should be allocated. This should include how allocators are determined to be eligible, the logic for the allocate function, and any special considerations or conditions.
How is the eligibility of an allocator determined in this strategy? Is it through a third party, or can anyone allocate? If there are specific roles or addresses allowed to allocate, mention them here.
A: Stake in registry (gardens) and have enough voting points
Are there any custom functions or conditions for verifying allocator eligibility? If so, describe them and their purpose in determining eligibility.
A: probably isRegistered(address allocator) from registry (gardens) contract
allocate
function is callable or not?
Explain the logic for how the strategy will calculate the pool's final payout
from the allocations expressed by allocators. This should include any calculation formulas, the shape of the final payouts, and special considerations.
payout
amounts? Describe any helper functions or steps required.Outline the logic for how the payout
amounts will be distributed to recipients. Describe any mechanisms in place to prevent double payments.
The following functions may require a data parameter to be passed in. This parameter contains specific information or parameters necessary for the proper execution of the function. Please refer to the descriptions below for each function and provide the required data format or content.
initialize(uint256 _poolId, bytes memory _data)
: The _data
parameter should contain the initialization data required for the strategy. Provide the expected format or structure of the data, and specify any important information or parameters that need to be included.
registerRecipients(bytes memory _data, address _sender)
: The _data
parameter should contain the data required for recipient registration. Specify the expected format or structure of the data, and provide details on the information or parameters that need to be included.
allocate(bytes memory _data, address _sender)
: The _data
parameter should contain the data necessary for the allocation process. Describe the expected format or structure of the data, and specify any important information or parameters that need to be included.
distribute(address[] memory _recipientIds, bytes memory _data, address _sender)
: The _data
parameter should contain the data specific to the distribution process. Explain the expected format or structure of the data, and provide details on the information or parameters that need to be included.
If any custom functions have been introduced as part of the strategy, list and describe them here. Provide information about their purpose, input parameters, return values, and any important considerations for their usage.
List and explain the important variables used within the strategy. Provide details about their purpose, usage, and any special considerations related to their values or updates.
Setup parameters:
General
If there are any other important considerations or specifications specific to this strategy, mention them here.