Move each extension into its own module
This commit is contained in:
parent
a0755afa96
commit
7cc9bd7013
|
@ -0,0 +1,19 @@
|
||||||
|
use {
|
||||||
|
crate::{
|
||||||
|
extension::{AccountType, Extension, ExtensionType},
|
||||||
|
pod::*,
|
||||||
|
},
|
||||||
|
bytemuck::{Pod, Zeroable},
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Close authority extension data for mints.
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)]
|
||||||
|
pub struct MintCloseAuthority {
|
||||||
|
/// Optional authority to close the mint
|
||||||
|
pub close_authority: OptionalNonZeroPubkey,
|
||||||
|
}
|
||||||
|
impl Extension for MintCloseAuthority {
|
||||||
|
const TYPE: ExtensionType = ExtensionType::MintCloseAuthority;
|
||||||
|
const ACCOUNT_TYPE: AccountType = AccountType::Mint;
|
||||||
|
}
|
|
@ -2,6 +2,10 @@
|
||||||
|
|
||||||
use {
|
use {
|
||||||
crate::{
|
crate::{
|
||||||
|
extension::{
|
||||||
|
mint_close_authority::MintCloseAuthority,
|
||||||
|
transfer_fee::{AccountTransferFee, MintTransferFee},
|
||||||
|
},
|
||||||
pod::*,
|
pod::*,
|
||||||
state::{Account, Mint, Multisig},
|
state::{Account, Mint, Multisig},
|
||||||
},
|
},
|
||||||
|
@ -17,6 +21,9 @@ use {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
mod mint_close_authority;
|
||||||
|
mod transfer_fee;
|
||||||
|
|
||||||
/// Length in TLV structure
|
/// Length in TLV structure
|
||||||
#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)]
|
#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)]
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
|
@ -404,63 +411,6 @@ pub trait Extension: Pod {
|
||||||
const ACCOUNT_TYPE: AccountType;
|
const ACCOUNT_TYPE: AccountType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Close authority extension data for mints.
|
|
||||||
#[repr(C)]
|
|
||||||
#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)]
|
|
||||||
pub struct MintCloseAuthority {
|
|
||||||
/// Optional authority to close the mint
|
|
||||||
pub close_authority: OptionalNonZeroPubkey,
|
|
||||||
}
|
|
||||||
impl Extension for MintCloseAuthority {
|
|
||||||
const TYPE: ExtensionType = ExtensionType::MintCloseAuthority;
|
|
||||||
const ACCOUNT_TYPE: AccountType = AccountType::Mint;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Transfer fee information
|
|
||||||
#[repr(C)]
|
|
||||||
#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)]
|
|
||||||
pub struct TransferFee {
|
|
||||||
/// First epoch where the transfer fee takes effect
|
|
||||||
pub epoch: PodU64, // Epoch,
|
|
||||||
/// Maximum fee assessed on transfers, expressed as an amount of tokens
|
|
||||||
pub maximum_fee: PodU64,
|
|
||||||
/// Amount of transfer collected as fees, expressed as basis points of the
|
|
||||||
/// transfer amount, ie. increments of 0.01%
|
|
||||||
pub transfer_fee_basis_points: PodU16,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Transfer fee extension data for mints.
|
|
||||||
#[repr(C)]
|
|
||||||
#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)]
|
|
||||||
pub struct MintTransferFee {
|
|
||||||
/// Optional authority to set the fee
|
|
||||||
pub transfer_fee_config_authority: OptionalNonZeroPubkey,
|
|
||||||
/// Withdraw from mint instructions must be signed by this key
|
|
||||||
pub withheld_withdraw_authority: OptionalNonZeroPubkey,
|
|
||||||
/// Withheld transfer fee tokens that have been moved to the mint for withdrawal
|
|
||||||
pub withheld_amount: PodU64,
|
|
||||||
/// Older transfer fee, used if the current epoch < new_transfer_fee.epoch
|
|
||||||
pub older_transfer_fee: TransferFee,
|
|
||||||
/// Newer transfer fee, used if the current epoch >= new_transfer_fee.epoch
|
|
||||||
pub newer_transfer_fee: TransferFee,
|
|
||||||
}
|
|
||||||
impl Extension for MintTransferFee {
|
|
||||||
const TYPE: ExtensionType = ExtensionType::MintTransferFee;
|
|
||||||
const ACCOUNT_TYPE: AccountType = AccountType::Mint;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Transfer fee extension data for accounts.
|
|
||||||
#[repr(C)]
|
|
||||||
#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)]
|
|
||||||
pub struct AccountTransferFee {
|
|
||||||
/// Amount withheld during transfers, to be harvested to the mint
|
|
||||||
pub withheld_amount: PodU64,
|
|
||||||
}
|
|
||||||
impl Extension for AccountTransferFee {
|
|
||||||
const TYPE: ExtensionType = ExtensionType::AccountTransferFee;
|
|
||||||
const ACCOUNT_TYPE: AccountType = AccountType::Account;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Padding a mint account to be exactly Multisig::LEN.
|
/// Padding a mint account to be exactly Multisig::LEN.
|
||||||
/// We need to pad 185 bytes, since Multisig::LEN = 355, Account::LEN = 165,
|
/// We need to pad 185 bytes, since Multisig::LEN = 355, Account::LEN = 165,
|
||||||
/// size_of AccountType = 1, size_of ExtensionType = 2, size_of Length = 2.
|
/// size_of AccountType = 1, size_of ExtensionType = 2, size_of Length = 2.
|
||||||
|
@ -498,32 +448,9 @@ mod test {
|
||||||
super::*,
|
super::*,
|
||||||
crate::state::test::{TEST_ACCOUNT, TEST_ACCOUNT_SLICE, TEST_MINT, TEST_MINT_SLICE},
|
crate::state::test::{TEST_ACCOUNT, TEST_ACCOUNT_SLICE, TEST_MINT, TEST_MINT_SLICE},
|
||||||
solana_program::pubkey::Pubkey,
|
solana_program::pubkey::Pubkey,
|
||||||
|
transfer_fee::test::test_mint_transfer_fee,
|
||||||
};
|
};
|
||||||
|
|
||||||
fn test_mint_transfer_fee() -> MintTransferFee {
|
|
||||||
MintTransferFee {
|
|
||||||
transfer_fee_config_authority: OptionalNonZeroPubkey::try_from(Some(Pubkey::new(
|
|
||||||
&[10; 32],
|
|
||||||
)))
|
|
||||||
.unwrap(),
|
|
||||||
withheld_withdraw_authority: OptionalNonZeroPubkey::try_from(Some(Pubkey::new(
|
|
||||||
&[11; 32],
|
|
||||||
)))
|
|
||||||
.unwrap(),
|
|
||||||
withheld_amount: PodU64::from(u64::MAX),
|
|
||||||
older_transfer_fee: TransferFee {
|
|
||||||
epoch: PodU64::from(1),
|
|
||||||
maximum_fee: PodU64::from(10),
|
|
||||||
transfer_fee_basis_points: PodU16::from(100),
|
|
||||||
},
|
|
||||||
newer_transfer_fee: TransferFee {
|
|
||||||
epoch: PodU64::from(100),
|
|
||||||
maximum_fee: PodU64::from(5_000),
|
|
||||||
transfer_fee_basis_points: PodU16::from(1),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const MINT_WITH_EXTENSION: &[u8] = &[
|
const MINT_WITH_EXTENSION: &[u8] = &[
|
||||||
// base mint
|
// base mint
|
||||||
1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
@ -0,0 +1,81 @@
|
||||||
|
use {
|
||||||
|
crate::{
|
||||||
|
extension::{AccountType, Extension, ExtensionType},
|
||||||
|
pod::*,
|
||||||
|
},
|
||||||
|
bytemuck::{Pod, Zeroable},
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Transfer fee information
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)]
|
||||||
|
pub struct TransferFee {
|
||||||
|
/// First epoch where the transfer fee takes effect
|
||||||
|
pub epoch: PodU64, // Epoch,
|
||||||
|
/// Maximum fee assessed on transfers, expressed as an amount of tokens
|
||||||
|
pub maximum_fee: PodU64,
|
||||||
|
/// Amount of transfer collected as fees, expressed as basis points of the
|
||||||
|
/// transfer amount, ie. increments of 0.01%
|
||||||
|
pub transfer_fee_basis_points: PodU16,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Transfer fee extension data for mints.
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)]
|
||||||
|
pub struct MintTransferFee {
|
||||||
|
/// Optional authority to set the fee
|
||||||
|
pub transfer_fee_config_authority: OptionalNonZeroPubkey,
|
||||||
|
/// Withdraw from mint instructions must be signed by this key
|
||||||
|
pub withheld_withdraw_authority: OptionalNonZeroPubkey,
|
||||||
|
/// Withheld transfer fee tokens that have been moved to the mint for withdrawal
|
||||||
|
pub withheld_amount: PodU64,
|
||||||
|
/// Older transfer fee, used if the current epoch < new_transfer_fee.epoch
|
||||||
|
pub older_transfer_fee: TransferFee,
|
||||||
|
/// Newer transfer fee, used if the current epoch >= new_transfer_fee.epoch
|
||||||
|
pub newer_transfer_fee: TransferFee,
|
||||||
|
}
|
||||||
|
impl Extension for MintTransferFee {
|
||||||
|
const TYPE: ExtensionType = ExtensionType::MintTransferFee;
|
||||||
|
const ACCOUNT_TYPE: AccountType = AccountType::Mint;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Transfer fee extension data for accounts.
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Clone, Copy, Debug, Default, PartialEq, Pod, Zeroable)]
|
||||||
|
pub struct AccountTransferFee {
|
||||||
|
/// Amount withheld during transfers, to be harvested to the mint
|
||||||
|
pub withheld_amount: PodU64,
|
||||||
|
}
|
||||||
|
impl Extension for AccountTransferFee {
|
||||||
|
const TYPE: ExtensionType = ExtensionType::AccountTransferFee;
|
||||||
|
const ACCOUNT_TYPE: AccountType = AccountType::Account;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
pub(crate) mod test {
|
||||||
|
use {super::*, solana_program::pubkey::Pubkey, std::convert::TryFrom};
|
||||||
|
|
||||||
|
pub(crate) fn test_mint_transfer_fee() -> MintTransferFee {
|
||||||
|
MintTransferFee {
|
||||||
|
transfer_fee_config_authority: OptionalNonZeroPubkey::try_from(Some(Pubkey::new(
|
||||||
|
&[10; 32],
|
||||||
|
)))
|
||||||
|
.unwrap(),
|
||||||
|
withheld_withdraw_authority: OptionalNonZeroPubkey::try_from(Some(Pubkey::new(
|
||||||
|
&[11; 32],
|
||||||
|
)))
|
||||||
|
.unwrap(),
|
||||||
|
withheld_amount: PodU64::from(u64::MAX),
|
||||||
|
older_transfer_fee: TransferFee {
|
||||||
|
epoch: PodU64::from(1),
|
||||||
|
maximum_fee: PodU64::from(10),
|
||||||
|
transfer_fee_basis_points: PodU16::from(100),
|
||||||
|
},
|
||||||
|
newer_transfer_fee: TransferFee {
|
||||||
|
epoch: PodU64::from(100),
|
||||||
|
maximum_fee: PodU64::from(5_000),
|
||||||
|
transfer_fee_basis_points: PodU16::from(1),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue