Skip to content

Commit

Permalink
Checkpoint, debug
Browse files Browse the repository at this point in the history
  • Loading branch information
guibescos committed Jan 29, 2024
1 parent 89376d7 commit 4a0abb2
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 16 deletions.
5 changes: 3 additions & 2 deletions pythnet/pythnet_sdk/src/test_utils/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -196,8 +196,9 @@ pub fn create_vaa_from_payload(
.collect();

let vaa: Vaa<Box<RawMessage>> = Vaa {
emitter_chain: emitter_chain,
emitter_address: emitter_address,
version: 1,
emitter_chain,
emitter_address,
sequence,
payload: <Box<RawMessage>>::from(payload.to_vec()),
signatures: wormhole_signatures,
Expand Down
1 change: 0 additions & 1 deletion target_chains/solana/cli/src/main.rs
Original file line number Diff line number Diff line change
Expand Up @@ -280,7 +280,6 @@ pub fn process_post_price_update_atomic(
}

fn trim_signatures(header: &mut Header, n_signatures: usize) {
println!("There are {} signatures", header.signatures.len());
header.signatures = header.signatures[..(n_signatures)].to_vec();
}

Expand Down
53 changes: 45 additions & 8 deletions target_chains/solana/programs/pyth-solana-receiver/src/sdk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ use {
accounts,
instruction,
state::config::Config,
PostUpdatesAtomicParams,
CONFIG_SEED,
ID,
TREASURY_SEED,
Expand Down Expand Up @@ -42,14 +43,7 @@ impl accounts::PostUpdatesAtomic {
let config = get_config_address();
let treasury = get_treasury_address();

let guardian_set = Pubkey::find_program_address(
&[
GuardianSet::SEED_PREFIX,
guardian_set_index.to_be_bytes().as_ref(),
],
&wormhole_address,
)
.0;
let guardian_set = get_guardian_set_address(wormhole_address, guardian_set_index);

accounts::PostUpdatesAtomic {
payer,
Expand Down Expand Up @@ -115,6 +109,38 @@ impl instruction::PostUpdates {
}
}


impl instruction::PostUpdatesAtomic {
pub fn populate(
payer: Pubkey,
price_update_account: Pubkey,
wormhole_address: Pubkey,
guardian_set_index: u32,
vaa: Vec<u8>,
merkle_price_update: MerklePriceUpdate,
) -> Instruction {
let post_update_accounts = accounts::PostUpdatesAtomic::populate(
payer,
price_update_account,
wormhole_address,
guardian_set_index,
)
.to_account_metas(None);
Instruction {
program_id: ID,
accounts: post_update_accounts,
data: instruction::PostUpdatesAtomic {
params: PostUpdatesAtomicParams {
vaa,
merkle_price_update,
},
}
.data(),
}
}
}


pub fn get_treasury_address() -> Pubkey {
Pubkey::find_program_address(&[TREASURY_SEED.as_ref()], &ID).0
}
Expand All @@ -123,6 +149,17 @@ pub fn get_config_address() -> Pubkey {
Pubkey::find_program_address(&[CONFIG_SEED.as_ref()], &ID).0
}

pub fn get_guardian_set_address(wormhole_address: Pubkey, guardian_set_index: u32) -> Pubkey {
Pubkey::find_program_address(
&[
GuardianSet::SEED_PREFIX,
guardian_set_index.to_be_bytes().as_ref(),
],
&wormhole_address,
)
.0
}

pub fn deserialize_accumulator_update_data(
accumulator_message: Vec<u8>,
) -> Result<(Vec<u8>, Vec<MerklePriceUpdate>)> {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
use {
anchor_lang::AnchorSerialize,
libsecp256k1::PublicKey,
program_simulator::ProgramSimulator,
pyth_solana_receiver::{
instruction::Initialize,
sdk::{
get_config_address,
get_guardian_set_address,
get_treasury_address,
},
state::config::{
Expand All @@ -13,8 +15,13 @@ use {
},
ID,
},
pythnet_sdk::test_utils::DEFAULT_DATA_SOURCE,
pythnet_sdk::test_utils::{
create_dummy_guardians,
DEFAULT_DATA_SOURCE,
},
serde_wormhole::RawMessage,
solana_program::{
keccak,
pubkey::Pubkey,
rent::Rent,
},
Expand All @@ -27,13 +34,17 @@ use {
wormhole_core_bridge_solana::{
state::{
EncodedVaa,
GuardianSet,
Header,
ProcessingStatus,
},
ID as BRIDGE_ID,
},
wormhole_sdk::Vaa,
};

pub const DEFAULT_GUARDIAN_SET_INDEX: u32 = 0;

pub fn default_receiver_config() -> Config {
Config {
governance_authority: Pubkey::new_unique(),
Expand Down Expand Up @@ -76,6 +87,38 @@ pub fn build_encoded_vaa_account_from_vaa(vaa: Vec<u8>) -> Account {
}
}

pub fn build_guardian_set_account() -> Account {
let guardian_set = GuardianSet {
index: DEFAULT_GUARDIAN_SET_INDEX,
keys: create_dummy_guardians()
.iter()
.map(|x| {
let mut result: [u8; 20] = [0u8; 20];
result.copy_from_slice(
&keccak::hashv(&[&PublicKey::from_secret_key(x).serialize()[1..]]).0[12..],
);
result
})
.collect::<Vec<[u8; 20]>>(),
creation_time: 0.into(),
expiration_time: 0.into(),
};

let guardian_set_data = (
<GuardianSet as anchor_lang::Discriminator>::DISCRIMINATOR,
guardian_set,
)
.try_to_vec()
.unwrap();

Account {
lamports: Rent::default().minimum_balance(guardian_set_data.len()),
data: guardian_set_data,
owner: BRIDGE_ID,
executable: false,
rent_epoch: 0,
}
}
/**
* Setup to test the Pyth Receiver. The return values are a tuple composed of :
* - The program simulator, which is used to send transactions
Expand All @@ -92,6 +135,10 @@ pub async fn setup_pyth_receiver(vaas: Vec<Vec<u8>>) -> ProgramTestFixtures {
encoded_vaa_addresses.push(encoded_vaa_address);
program_test.add_account(encoded_vaa_address, build_encoded_vaa_account_from_vaa(vaa));
}
program_test.add_account(
get_guardian_set_address(BRIDGE_ID, DEFAULT_GUARDIAN_SET_INDEX),
build_guardian_set_account(),
);

let mut program_simulator = ProgramSimulator::start_from_program_test(program_test).await;

Expand Down Expand Up @@ -124,3 +171,9 @@ pub async fn setup_pyth_receiver(vaas: Vec<Vec<u8>>) -> ProgramTestFixtures {
encoded_vaa_addresses,
}
}

pub fn trim_vaa_signatures(vaa: Vec<u8>, n: u8) -> Vec<u8> {
let mut parsed_vaa: Vaa<&RawMessage> = serde_wormhole::from_slice(vaa.as_slice()).unwrap();
parsed_vaa.signatures = parsed_vaa.signatures[0..n as usize].to_vec();
serde_wormhole::to_vec(&parsed_vaa).unwrap()
}
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,13 @@ async fn test_post_updates() {
let feed_1 = create_dummy_price_feed_message(100);
let feed_2 = create_dummy_price_feed_message(200);
let message = create_accumulator_message(&[feed_1, feed_2], &[feed_1, feed_2], false);
let accumulator_update_data = deserialize_accumulator_update_data(message).unwrap();
let (vaa, merkle_price_updates) = deserialize_accumulator_update_data(message).unwrap();


let ProgramTestFixtures {
mut program_simulator,
encoded_vaa_addresses,
} = setup_pyth_receiver(vec![accumulator_update_data.0]).await;
} = setup_pyth_receiver(vec![vaa]).await;

let poster = program_simulator.get_funded_keypair().await.unwrap();
let price_update_keypair = Keypair::new();
Expand All @@ -50,7 +50,7 @@ async fn test_post_updates() {
poster.pubkey(),
encoded_vaa_addresses[0],
price_update_keypair.pubkey(),
accumulator_update_data.1[0].clone(),
merkle_price_updates[0].clone(),
),
&vec![&poster, &price_update_keypair],
None,
Expand Down Expand Up @@ -81,7 +81,7 @@ async fn test_post_updates() {
poster.pubkey(),
encoded_vaa_addresses[0],
price_update_keypair.pubkey(),
accumulator_update_data.1[1].clone(),
merkle_price_updates[1].clone(),
),
&vec![&poster, &price_update_keypair],
None,
Expand Down

0 comments on commit 4a0abb2

Please sign in to comment.