solana-program-library/governance/program/tests/program_test/legacy.rs

124 lines
5.4 KiB
Rust

use borsh::{BorshDeserialize, BorshSchema, BorshSerialize};
use solana_program::pubkey::Pubkey;
use spl_governance::state::{enums::GovernanceAccountType, governance::GovernanceV2};
/// Legacy Governance account as of spl-gov V1
#[derive(Clone, Debug, PartialEq, BorshDeserialize, BorshSerialize, BorshSchema)]
pub struct LegacyGovernanceV1 {
/// Account type.
pub account_type: GovernanceAccountType,
/// Governance Realm
pub realm: Pubkey,
/// Account governed by this Governance.
pub governed_account: Pubkey,
/// Running count of proposals
pub proposals_count: u32,
/// Governance config
pub config: LegacyGovernanceConfigV1,
/// Reserved space for future versions
pub reserved: [u8; 8],
}
/// Legacy GovernanceConfig as of spl-gov V1
#[derive(Clone, Debug, PartialEq, BorshDeserialize, BorshSerialize, BorshSchema)]
pub struct LegacyGovernanceConfigV1 {
/// The type of the vote threshold used for voting
pub vote_threshold_percentage: VoteThresholdPercentage,
/// Minimum number of community tokens a governance token owner must possess to be able to create a proposal
pub min_community_tokens_to_create_proposal: u64,
/// Minimum waiting time in seconds for an instruction to be executed after proposal is voted on
pub min_instruction_hold_up_time: u32,
/// Time limit in seconds for proposal to be open for voting
pub max_voting_time: u32,
/// The source of vote weight for voters
/// Note: In the current version only token deposits are accepted as vote weight
pub vote_weight_source: VoteWeightSource,
/// The time period in seconds within which a Proposal can be still cancelled after being voted on
/// Once cool off time expires Proposal can't be cancelled any longer and becomes a law
/// Note: This field is not implemented in the current version
pub proposal_cool_off_time: u32,
/// Minimum number of council tokens a governance token owner must possess to be able to create a proposal
pub min_council_tokens_to_create_proposal: u64,
}
/// Legacy VoteWeightSource as of spl-gov V1
#[derive(Clone, Debug, PartialEq, BorshDeserialize, BorshSerialize, BorshSchema)]
pub enum VoteWeightSource {
/// Governing token deposits into the Realm are used as voter weights
Deposit,
/// Governing token account snapshots as of the time a proposal entered voting state are used as voter weights
/// Note: Snapshot source is not supported in the current version
/// Support for account snapshots are required in solana and/or arweave as a prerequisite
Snapshot,
}
/// Legacy VoteThresholdPercentage as of spl-gov V1
#[repr(C)]
#[derive(Clone, Debug, PartialEq, BorshDeserialize, BorshSerialize, BorshSchema)]
pub enum VoteThresholdPercentage {
/// Voting threshold of Yes votes in % required to tip the vote
/// It's the percentage of tokens out of the entire pool of governance tokens eligible to vote
/// Note: If the threshold is below or equal to 50% then an even split of votes ex: 50:50 or 40:40 is always resolved as Defeated
/// In other words a '+1 vote' tie breaker is always required to have a successful vote
YesVote(u8),
/// The minimum number of votes in % out of the entire pool of governance tokens eligible to vote
/// which must be cast for the vote to be valid
/// Once the quorum is achieved a simple majority (50%+1) of Yes votes is required for the vote to succeed
/// Note: Quorum is not implemented in the current version
Quorum(u8),
}
impl From<GovernanceV2> for LegacyGovernanceV1 {
fn from(governance_v2: GovernanceV2) -> Self {
let account_type = match governance_v2.account_type {
GovernanceAccountType::GovernanceV2 => GovernanceAccountType::GovernanceV1,
GovernanceAccountType::ProgramGovernanceV2 => {
GovernanceAccountType::ProgramGovernanceV1
}
GovernanceAccountType::MintGovernanceV2 => GovernanceAccountType::MintGovernanceV1,
GovernanceAccountType::TokenGovernanceV2 => GovernanceAccountType::TokenGovernanceV1,
_ => panic!("Invalid Governance account type"),
};
let yes_vote_threshold = match governance_v2.config.community_vote_threshold {
spl_governance::state::enums::VoteThreshold::YesVotePercentage(yes_vote_percentage) => {
yes_vote_percentage
}
_ => panic!("Invalid vote threshold"),
};
LegacyGovernanceV1 {
account_type,
realm: governance_v2.realm,
governed_account: governance_v2.governed_account,
proposals_count: 0,
config: LegacyGovernanceConfigV1 {
vote_threshold_percentage: VoteThresholdPercentage::YesVote(yes_vote_threshold),
min_community_tokens_to_create_proposal: governance_v2
.config
.min_community_weight_to_create_proposal,
min_instruction_hold_up_time: governance_v2.config.min_transaction_hold_up_time,
max_voting_time: governance_v2.config.voting_base_time,
vote_weight_source: VoteWeightSource::Deposit,
proposal_cool_off_time: 0,
min_council_tokens_to_create_proposal: governance_v2
.config
.min_council_weight_to_create_proposal,
},
reserved: [0; 8],
}
}
}