Pay treasury rent (#1333)
This commit is contained in:
parent
7bf2782da2
commit
e0f94ee164
|
@ -142,6 +142,11 @@ pub mod pyth_solana_receiver {
|
|||
);
|
||||
|
||||
let guardian_keys = &guardian_set.keys;
|
||||
require_gte!(
|
||||
vaa.signature_count(),
|
||||
config.minimum_signatures,
|
||||
ReceiverError::InsufficientGuardianSignatures
|
||||
);
|
||||
|
||||
// Generate the same message hash (using keccak) that the Guardians used to generate their
|
||||
// signatures. This message hash will be hashed again to produce the digest for
|
||||
|
@ -172,12 +177,6 @@ pub mod pyth_solana_receiver {
|
|||
let treasury = &ctx.accounts.treasury;
|
||||
let price_update_account = &mut ctx.accounts.price_update_account;
|
||||
|
||||
require_gte!(
|
||||
vaa.signature_count(),
|
||||
config.minimum_signatures,
|
||||
ReceiverError::InsufficientGuardianSignatures
|
||||
);
|
||||
|
||||
let vaa_components = VaaComponents {
|
||||
verification_level: VerificationLevel::Partial {
|
||||
num_signatures: vaa.signature_count(),
|
||||
|
@ -339,8 +338,7 @@ fn deserialize_guardian_set_checked(
|
|||
wormhole: &Pubkey,
|
||||
) -> Result<AccountVariant<GuardianSet>> {
|
||||
let mut guardian_set_data: &[u8] = &account_info.try_borrow_data()?;
|
||||
let guardian_set =
|
||||
AccountVariant::<GuardianSet>::try_deserialize_unchecked(&mut guardian_set_data)?;
|
||||
let guardian_set = AccountVariant::<GuardianSet>::try_deserialize(&mut guardian_set_data)?;
|
||||
|
||||
let expected_address = Pubkey::find_program_address(
|
||||
&[
|
||||
|
@ -381,19 +379,22 @@ fn post_price_update_from_vaa<'info>(
|
|||
vaa_payload: &[u8],
|
||||
price_update: &MerklePriceUpdate,
|
||||
) -> Result<()> {
|
||||
let amount_to_pay = if treasury.lamports() == 0 {
|
||||
Rent::get()?
|
||||
.minimum_balance(0)
|
||||
.max(config.single_update_fee_in_lamports)
|
||||
} else {
|
||||
config.single_update_fee_in_lamports
|
||||
}; // First person to use the treasury account has to pay rent
|
||||
if payer.lamports()
|
||||
< Rent::get()?
|
||||
.minimum_balance(0)
|
||||
.saturating_add(config.single_update_fee_in_lamports)
|
||||
.minimum_balance(payer.data_len())
|
||||
.saturating_add(amount_to_pay)
|
||||
{
|
||||
return err!(ReceiverError::InsufficientFunds);
|
||||
};
|
||||
|
||||
let transfer_instruction = system_instruction::transfer(
|
||||
payer.key,
|
||||
treasury.key,
|
||||
config.single_update_fee_in_lamports,
|
||||
);
|
||||
let transfer_instruction = system_instruction::transfer(payer.key, treasury.key, amount_to_pay);
|
||||
anchor_lang::solana_program::program::invoke(
|
||||
&transfer_instruction,
|
||||
&[payer.to_account_info(), treasury.to_account_info()],
|
||||
|
|
|
@ -8,8 +8,6 @@ use {
|
|||
get_config_address,
|
||||
get_guardian_set_address,
|
||||
get_treasury_address,
|
||||
DEFAULT_TREASURY_ID,
|
||||
SECONDARY_TREASURY_ID,
|
||||
},
|
||||
ID,
|
||||
},
|
||||
|
@ -201,22 +199,6 @@ pub async fn setup_pyth_receiver(
|
|||
.unwrap();
|
||||
assert_eq!(config_account, initial_config);
|
||||
|
||||
program_simulator
|
||||
.airdrop(
|
||||
&get_treasury_address(DEFAULT_TREASURY_ID),
|
||||
Rent::default().minimum_balance(0),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
program_simulator
|
||||
.airdrop(
|
||||
&get_treasury_address(SECONDARY_TREASURY_ID),
|
||||
Rent::default().minimum_balance(0),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
ProgramTestFixtures {
|
||||
program_simulator,
|
||||
encoded_vaa_addresses,
|
||||
|
@ -234,8 +216,5 @@ pub async fn assert_treasury_balance(
|
|||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_eq!(
|
||||
treasury_balance,
|
||||
expected_balance + Rent::default().minimum_balance(0)
|
||||
);
|
||||
assert_eq!(treasury_balance, expected_balance);
|
||||
}
|
||||
|
|
|
@ -43,6 +43,7 @@ use {
|
|||
pubkey::Pubkey,
|
||||
},
|
||||
solana_sdk::{
|
||||
rent::Rent,
|
||||
signature::Keypair,
|
||||
signer::Signer,
|
||||
},
|
||||
|
@ -332,7 +333,12 @@ async fn test_post_price_update_from_vaa() {
|
|||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_treasury_balance(&mut program_simulator, 1, DEFAULT_TREASURY_ID).await;
|
||||
assert_treasury_balance(
|
||||
&mut program_simulator,
|
||||
Rent::default().minimum_balance(0),
|
||||
DEFAULT_TREASURY_ID,
|
||||
)
|
||||
.await;
|
||||
|
||||
let mut price_update_account = program_simulator
|
||||
.get_anchor_account_data::<PriceUpdateV1>(price_update_keypair.pubkey())
|
||||
|
@ -382,7 +388,12 @@ async fn test_post_price_update_from_vaa() {
|
|||
into_transaction_error(ReceiverError::InsufficientFunds)
|
||||
);
|
||||
|
||||
assert_treasury_balance(&mut program_simulator, 1, DEFAULT_TREASURY_ID).await;
|
||||
assert_treasury_balance(
|
||||
&mut program_simulator,
|
||||
Rent::default().minimum_balance(0),
|
||||
DEFAULT_TREASURY_ID,
|
||||
)
|
||||
.await;
|
||||
|
||||
price_update_account = program_simulator
|
||||
.get_anchor_account_data::<PriceUpdateV1>(price_update_keypair.pubkey())
|
||||
|
@ -432,7 +443,7 @@ async fn test_post_price_update_from_vaa() {
|
|||
|
||||
assert_treasury_balance(
|
||||
&mut program_simulator,
|
||||
LAMPORTS_PER_SOL + 1,
|
||||
Rent::default().minimum_balance(0) + LAMPORTS_PER_SOL,
|
||||
DEFAULT_TREASURY_ID,
|
||||
)
|
||||
.await;
|
||||
|
|
|
@ -32,6 +32,7 @@ use {
|
|||
},
|
||||
solana_program::pubkey::Pubkey,
|
||||
solana_sdk::{
|
||||
rent::Rent,
|
||||
signature::Keypair,
|
||||
signer::Signer,
|
||||
},
|
||||
|
@ -78,7 +79,12 @@ async fn test_post_update() {
|
|||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_treasury_balance(&mut program_simulator, 1, DEFAULT_TREASURY_ID).await;
|
||||
assert_treasury_balance(
|
||||
&mut program_simulator,
|
||||
Rent::default().minimum_balance(0),
|
||||
DEFAULT_TREASURY_ID,
|
||||
)
|
||||
.await;
|
||||
|
||||
let mut price_update_account = program_simulator
|
||||
.get_anchor_account_data::<PriceUpdateV1>(price_update_keypair.pubkey())
|
||||
|
@ -110,7 +116,12 @@ async fn test_post_update() {
|
|||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_treasury_balance(&mut program_simulator, 2, DEFAULT_TREASURY_ID).await;
|
||||
assert_treasury_balance(
|
||||
&mut program_simulator,
|
||||
Rent::default().minimum_balance(0) + 1,
|
||||
DEFAULT_TREASURY_ID,
|
||||
)
|
||||
.await;
|
||||
|
||||
price_update_account = program_simulator
|
||||
.get_anchor_account_data::<PriceUpdateV1>(price_update_keypair.pubkey())
|
||||
|
|
|
@ -33,6 +33,7 @@ use {
|
|||
},
|
||||
serde_wormhole::RawMessage,
|
||||
solana_sdk::{
|
||||
rent::Rent,
|
||||
signature::Keypair,
|
||||
signer::Signer,
|
||||
},
|
||||
|
@ -84,7 +85,12 @@ async fn test_post_update_atomic() {
|
|||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_treasury_balance(&mut program_simulator, 1, DEFAULT_TREASURY_ID).await;
|
||||
assert_treasury_balance(
|
||||
&mut program_simulator,
|
||||
Rent::default().minimum_balance(0),
|
||||
DEFAULT_TREASURY_ID,
|
||||
)
|
||||
.await;
|
||||
|
||||
let mut price_update_account = program_simulator
|
||||
.get_anchor_account_data::<PriceUpdateV1>(price_update_keypair.pubkey())
|
||||
|
@ -119,7 +125,12 @@ async fn test_post_update_atomic() {
|
|||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_treasury_balance(&mut program_simulator, 2, DEFAULT_TREASURY_ID).await;
|
||||
assert_treasury_balance(
|
||||
&mut program_simulator,
|
||||
Rent::default().minimum_balance(0) + 1,
|
||||
DEFAULT_TREASURY_ID,
|
||||
)
|
||||
.await;
|
||||
assert_treasury_balance(&mut program_simulator, 0, SECONDARY_TREASURY_ID).await;
|
||||
|
||||
price_update_account = program_simulator
|
||||
|
@ -155,8 +166,18 @@ async fn test_post_update_atomic() {
|
|||
.await
|
||||
.unwrap();
|
||||
|
||||
assert_treasury_balance(&mut program_simulator, 2, DEFAULT_TREASURY_ID).await;
|
||||
assert_treasury_balance(&mut program_simulator, 1, SECONDARY_TREASURY_ID).await;
|
||||
assert_treasury_balance(
|
||||
&mut program_simulator,
|
||||
Rent::default().minimum_balance(0) + 1,
|
||||
DEFAULT_TREASURY_ID,
|
||||
)
|
||||
.await;
|
||||
assert_treasury_balance(
|
||||
&mut program_simulator,
|
||||
Rent::default().minimum_balance(0),
|
||||
SECONDARY_TREASURY_ID,
|
||||
)
|
||||
.await;
|
||||
|
||||
price_update_account = program_simulator
|
||||
.get_anchor_account_data::<PriceUpdateV1>(price_update_keypair.pubkey())
|
||||
|
|
Loading…
Reference in New Issue