Pay treasury rent (#1333)

This commit is contained in:
guibescos 2024-03-01 17:59:39 +00:00 committed by GitHub
parent 7bf2782da2
commit e0f94ee164
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 69 additions and 46 deletions

View File

@ -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()],

View File

@ -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);
}

View File

@ -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;

View File

@ -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())

View File

@ -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())