Skip to content

Commit e0f94ee

Browse files
authored
Pay treasury rent (#1333)
1 parent 7bf2782 commit e0f94ee

File tree

5 files changed

+69
-46
lines changed

5 files changed

+69
-46
lines changed

target_chains/solana/programs/pyth-solana-receiver/src/lib.rs

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,11 @@ pub mod pyth_solana_receiver {
142142
);
143143

144144
let guardian_keys = &guardian_set.keys;
145+
require_gte!(
146+
vaa.signature_count(),
147+
config.minimum_signatures,
148+
ReceiverError::InsufficientGuardianSignatures
149+
);
145150

146151
// Generate the same message hash (using keccak) that the Guardians used to generate their
147152
// signatures. This message hash will be hashed again to produce the digest for
@@ -172,12 +177,6 @@ pub mod pyth_solana_receiver {
172177
let treasury = &ctx.accounts.treasury;
173178
let price_update_account = &mut ctx.accounts.price_update_account;
174179

175-
require_gte!(
176-
vaa.signature_count(),
177-
config.minimum_signatures,
178-
ReceiverError::InsufficientGuardianSignatures
179-
);
180-
181180
let vaa_components = VaaComponents {
182181
verification_level: VerificationLevel::Partial {
183182
num_signatures: vaa.signature_count(),
@@ -339,8 +338,7 @@ fn deserialize_guardian_set_checked(
339338
wormhole: &Pubkey,
340339
) -> Result<AccountVariant<GuardianSet>> {
341340
let mut guardian_set_data: &[u8] = &account_info.try_borrow_data()?;
342-
let guardian_set =
343-
AccountVariant::<GuardianSet>::try_deserialize_unchecked(&mut guardian_set_data)?;
341+
let guardian_set = AccountVariant::<GuardianSet>::try_deserialize(&mut guardian_set_data)?;
344342

345343
let expected_address = Pubkey::find_program_address(
346344
&[
@@ -381,19 +379,22 @@ fn post_price_update_from_vaa<'info>(
381379
vaa_payload: &[u8],
382380
price_update: &MerklePriceUpdate,
383381
) -> Result<()> {
382+
let amount_to_pay = if treasury.lamports() == 0 {
383+
Rent::get()?
384+
.minimum_balance(0)
385+
.max(config.single_update_fee_in_lamports)
386+
} else {
387+
config.single_update_fee_in_lamports
388+
}; // First person to use the treasury account has to pay rent
384389
if payer.lamports()
385390
< Rent::get()?
386-
.minimum_balance(0)
387-
.saturating_add(config.single_update_fee_in_lamports)
391+
.minimum_balance(payer.data_len())
392+
.saturating_add(amount_to_pay)
388393
{
389394
return err!(ReceiverError::InsufficientFunds);
390395
};
391396

392-
let transfer_instruction = system_instruction::transfer(
393-
payer.key,
394-
treasury.key,
395-
config.single_update_fee_in_lamports,
396-
);
397+
let transfer_instruction = system_instruction::transfer(payer.key, treasury.key, amount_to_pay);
397398
anchor_lang::solana_program::program::invoke(
398399
&transfer_instruction,
399400
&[payer.to_account_info(), treasury.to_account_info()],

target_chains/solana/programs/pyth-solana-receiver/tests/common/mod.rs

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ use {
88
get_config_address,
99
get_guardian_set_address,
1010
get_treasury_address,
11-
DEFAULT_TREASURY_ID,
12-
SECONDARY_TREASURY_ID,
1311
},
1412
ID,
1513
},
@@ -201,22 +199,6 @@ pub async fn setup_pyth_receiver(
201199
.unwrap();
202200
assert_eq!(config_account, initial_config);
203201

204-
program_simulator
205-
.airdrop(
206-
&get_treasury_address(DEFAULT_TREASURY_ID),
207-
Rent::default().minimum_balance(0),
208-
)
209-
.await
210-
.unwrap();
211-
212-
program_simulator
213-
.airdrop(
214-
&get_treasury_address(SECONDARY_TREASURY_ID),
215-
Rent::default().minimum_balance(0),
216-
)
217-
.await
218-
.unwrap();
219-
220202
ProgramTestFixtures {
221203
program_simulator,
222204
encoded_vaa_addresses,
@@ -234,8 +216,5 @@ pub async fn assert_treasury_balance(
234216
.await
235217
.unwrap();
236218

237-
assert_eq!(
238-
treasury_balance,
239-
expected_balance + Rent::default().minimum_balance(0)
240-
);
219+
assert_eq!(treasury_balance, expected_balance);
241220
}

target_chains/solana/programs/pyth-solana-receiver/tests/test_post_price_update_from_vaa.rs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ use {
4343
pubkey::Pubkey,
4444
},
4545
solana_sdk::{
46+
rent::Rent,
4647
signature::Keypair,
4748
signer::Signer,
4849
},
@@ -332,7 +333,12 @@ async fn test_post_price_update_from_vaa() {
332333
.await
333334
.unwrap();
334335

335-
assert_treasury_balance(&mut program_simulator, 1, DEFAULT_TREASURY_ID).await;
336+
assert_treasury_balance(
337+
&mut program_simulator,
338+
Rent::default().minimum_balance(0),
339+
DEFAULT_TREASURY_ID,
340+
)
341+
.await;
336342

337343
let mut price_update_account = program_simulator
338344
.get_anchor_account_data::<PriceUpdateV1>(price_update_keypair.pubkey())
@@ -382,7 +388,12 @@ async fn test_post_price_update_from_vaa() {
382388
into_transaction_error(ReceiverError::InsufficientFunds)
383389
);
384390

385-
assert_treasury_balance(&mut program_simulator, 1, DEFAULT_TREASURY_ID).await;
391+
assert_treasury_balance(
392+
&mut program_simulator,
393+
Rent::default().minimum_balance(0),
394+
DEFAULT_TREASURY_ID,
395+
)
396+
.await;
386397

387398
price_update_account = program_simulator
388399
.get_anchor_account_data::<PriceUpdateV1>(price_update_keypair.pubkey())
@@ -432,7 +443,7 @@ async fn test_post_price_update_from_vaa() {
432443

433444
assert_treasury_balance(
434445
&mut program_simulator,
435-
LAMPORTS_PER_SOL + 1,
446+
Rent::default().minimum_balance(0) + LAMPORTS_PER_SOL,
436447
DEFAULT_TREASURY_ID,
437448
)
438449
.await;

target_chains/solana/programs/pyth-solana-receiver/tests/test_post_updates.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use {
3232
},
3333
solana_program::pubkey::Pubkey,
3434
solana_sdk::{
35+
rent::Rent,
3536
signature::Keypair,
3637
signer::Signer,
3738
},
@@ -78,7 +79,12 @@ async fn test_post_update() {
7879
.await
7980
.unwrap();
8081

81-
assert_treasury_balance(&mut program_simulator, 1, DEFAULT_TREASURY_ID).await;
82+
assert_treasury_balance(
83+
&mut program_simulator,
84+
Rent::default().minimum_balance(0),
85+
DEFAULT_TREASURY_ID,
86+
)
87+
.await;
8288

8389
let mut price_update_account = program_simulator
8490
.get_anchor_account_data::<PriceUpdateV1>(price_update_keypair.pubkey())
@@ -110,7 +116,12 @@ async fn test_post_update() {
110116
.await
111117
.unwrap();
112118

113-
assert_treasury_balance(&mut program_simulator, 2, DEFAULT_TREASURY_ID).await;
119+
assert_treasury_balance(
120+
&mut program_simulator,
121+
Rent::default().minimum_balance(0) + 1,
122+
DEFAULT_TREASURY_ID,
123+
)
124+
.await;
114125

115126
price_update_account = program_simulator
116127
.get_anchor_account_data::<PriceUpdateV1>(price_update_keypair.pubkey())

target_chains/solana/programs/pyth-solana-receiver/tests/test_post_updates_atomic.rs

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ use {
3333
},
3434
serde_wormhole::RawMessage,
3535
solana_sdk::{
36+
rent::Rent,
3637
signature::Keypair,
3738
signer::Signer,
3839
},
@@ -84,7 +85,12 @@ async fn test_post_update_atomic() {
8485
.await
8586
.unwrap();
8687

87-
assert_treasury_balance(&mut program_simulator, 1, DEFAULT_TREASURY_ID).await;
88+
assert_treasury_balance(
89+
&mut program_simulator,
90+
Rent::default().minimum_balance(0),
91+
DEFAULT_TREASURY_ID,
92+
)
93+
.await;
8894

8995
let mut price_update_account = program_simulator
9096
.get_anchor_account_data::<PriceUpdateV1>(price_update_keypair.pubkey())
@@ -119,7 +125,12 @@ async fn test_post_update_atomic() {
119125
.await
120126
.unwrap();
121127

122-
assert_treasury_balance(&mut program_simulator, 2, DEFAULT_TREASURY_ID).await;
128+
assert_treasury_balance(
129+
&mut program_simulator,
130+
Rent::default().minimum_balance(0) + 1,
131+
DEFAULT_TREASURY_ID,
132+
)
133+
.await;
123134
assert_treasury_balance(&mut program_simulator, 0, SECONDARY_TREASURY_ID).await;
124135

125136
price_update_account = program_simulator
@@ -155,8 +166,18 @@ async fn test_post_update_atomic() {
155166
.await
156167
.unwrap();
157168

158-
assert_treasury_balance(&mut program_simulator, 2, DEFAULT_TREASURY_ID).await;
159-
assert_treasury_balance(&mut program_simulator, 1, SECONDARY_TREASURY_ID).await;
169+
assert_treasury_balance(
170+
&mut program_simulator,
171+
Rent::default().minimum_balance(0) + 1,
172+
DEFAULT_TREASURY_ID,
173+
)
174+
.await;
175+
assert_treasury_balance(
176+
&mut program_simulator,
177+
Rent::default().minimum_balance(0),
178+
SECONDARY_TREASURY_ID,
179+
)
180+
.await;
160181

161182
price_update_account = program_simulator
162183
.get_anchor_account_data::<PriceUpdateV1>(price_update_keypair.pubkey())

0 commit comments

Comments
 (0)