A Multisig account gets derived the following way. The program for the derivation is the Squads program ID.
[createKey]
The createKey is a unique Public Key, made specifically to derive the Multisig PDA.
Multisig Account Content
#[account]
pub struct Multisig {
/// Key that is used to seed the multisig PDA.
pub create_key: Pubkey,
/// The authority that can change the multisig config.
/// This is a very important parameter as this authority can change the members and threshold.
///
/// The convention is to set this to `Pubkey::default()`.
/// In this case, the multisig becomes autonomous, so every config change goes through
/// the normal process of voting by the members.
///
/// However, if this parameter is set to any other key, all the config changes for this multisig
/// will need to be signed by the `config_authority`. We call such a multisig a "controlled multisig".
pub config_authority: Pubkey,
/// Threshold for signatures.
pub threshold: u16,
/// How many seconds must pass between transaction voting settlement and execution.
pub time_lock: u32,
/// Last transaction index. 0 means no transactions have been created.
pub transaction_index: u64,
/// Last stale transaction index. All transactions up until this index are stale.
/// This index is updated when multisig config (members/threshold/time_lock) changes.
pub stale_transaction_index: u64,
/// Reserved for future use.
pub _reserved: u8,
/// Bump for the multisig PDA seed.
pub bump: u8,
/// Members of the multisig.
pub members: Vec<Member>,
}
Proposal
Proposal PDA Derivation
A Proposal account gets derived the following way. The program for the derivation is the Squads program ID.
[Multisig Public Key Buffer, Transaction Index]
The transaction index is a number auto incrementing based on your Multisigs total transactions.
Proposal Account Content
#[account]
pub struct Proposal {
/// The multisig this belongs to.
pub multisig: Pubkey,
/// Index of the multisig transaction this proposal is associated with.
pub transaction_index: u64,
/// The status of the transaction.
pub status: ProposalStatus,
/// PDA bump.
pub bump: u8,
/// Keys that have approved/signed.
pub approved: Vec<Pubkey>,
/// Keys that have rejected.
pub rejected: Vec<Pubkey>,
/// Keys that have cancelled (Approved only).
pub cancelled: Vec<Pubkey>,
}
Transaction accounts
Transaction PDA Derivation
A Proposal account gets derived the following way. The program for the derivation is the Squads program ID.
[Multisig Public Key Buffer, Transaction Index]
The transaction index is a number auto incrementing based on your Multisigs total transactions.
Batch Transaction Account Content
#[account]
#[derive(InitSpace)]
pub struct Batch {
/// The multisig this belongs to.
pub multisig: Pubkey,
/// Member of the Multisig who submitted the batch.
pub creator: Pubkey,
/// Index of this batch within the multisig transactions.
pub index: u64,
/// PDA bump.
pub bump: u8,
/// Index of the vault this batch belongs to.
pub vault_index: u8,
/// Derivation bump of the vault PDA this batch belongs to.
pub vault_bump: u8,
/// Number of transactions in the batch.
pub size: u32,
/// Index of the last executed transaction within the batch.
/// 0 means that no transactions have been executed yet.
pub executed_transaction_index: u32,
}
Vault Transaction Acount Content
#[account]
pub struct VaultTransaction {
/// The multisig this belongs to.
pub multisig: Pubkey,
/// Member of the Multisig who submitted the transaction.
pub creator: Pubkey,
/// Index of this transaction within the multisig.
pub index: u64,
/// bump for the transaction seeds.
pub bump: u8,
/// Index of the vault this transaction belongs to.
pub vault_index: u8,
/// Derivation bump of the vault PDA this transaction belongs to.
pub vault_bump: u8,
/// Derivation bumps for additional signers.
/// Some transactions require multiple signers. Often these additional signers are "ephemeral" keypairs
/// that are generated on the client with a sole purpose of signing the transaction and be discarded immediately after.
/// When wrapping such transactions into multisig ones, we replace these "ephemeral" signing keypairs
/// with PDAs derived from the MultisigTransaction's `transaction_index` and controlled by the Multisig Program;
/// during execution the program includes the seeds of these PDAs into the `invoke_signed` calls,
/// thus "signing" on behalf of these PDAs.
pub ephemeral_signer_bumps: Vec<u8>,
/// data required for executing the transaction.
pub message: VaultTransactionMessage,
}
Config Transaction Account Content
#[account]
pub struct ConfigTransaction {
/// The multisig this belongs to.
pub multisig: Pubkey,
/// Member of the Multisig who submitted the transaction.
pub creator: Pubkey,
/// Index of this transaction within the multisig.
pub index: u64,
/// bump for the transaction seeds.
pub bump: u8,
/// Action to be performed on the multisig.
pub actions: Vec<ConfigAction>,
}