diff --git a/lazer/solana/Cargo.lock b/lazer/solana/Cargo.lock index 895b84a..0e684eb 100644 --- a/lazer/solana/Cargo.lock +++ b/lazer/solana/Cargo.lock @@ -250,7 +250,7 @@ dependencies = [ "bytemuck", "getrandom 0.2.15", "solana-program", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -292,7 +292,7 @@ dependencies = [ "serde_json", "sha2 0.10.8", "syn 1.0.109", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -535,7 +535,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -942,9 +942,9 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.19.0" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a" dependencies = [ "bytemuck_derive", ] @@ -1000,7 +1000,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" dependencies = [ "libc", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2505,7 +2505,7 @@ dependencies = [ "ark-bn254", "ark-ff", "num-bigint 0.4.6", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2943,7 +2943,7 @@ dependencies = [ "percent-encoding", "pin-project", "rand 0.8.5", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3247,9 +3247,9 @@ dependencies = [ [[package]] name = "pyth-lazer-protocol" -version = "0.1.0" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743de8136e00ba9e82400109fc2e8b4eceaad9df0189825ac958397bd64a53b5" +checksum = "2a76641cea471acfcb5e9c0413d57e68385c3392e81640d57e80d12dabc4bc50" dependencies = [ "anyhow", "byteorder", @@ -3260,27 +3260,16 @@ dependencies = [ ] [[package]] -name = "pyth-lazer-sdk" -version = "0.1.0" +name = "pyth-lazer-solana-contract" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ba7e8ae64a3fdd1b5b5c040a7bea06b3dde5ee033d3019c82a2132a2915868d" +checksum = "cb94fb4c432c5f2321784d7c53d432169deec6bd5933edcf2fca5601f084878b" dependencies = [ "anchor-lang", "bytemuck", "byteorder", "pyth-lazer-protocol", - "pyth-lazer-solana-contract", - "solana-program", - "thiserror", -] - -[[package]] -name = "pyth-lazer-solana-contract" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b559de3ddda915b6fb673ec74c1e411003fa8282bfc9dc1c31752f227fbed04" -dependencies = [ - "anchor-lang", + "thiserror 2.0.6", ] [[package]] @@ -3295,7 +3284,6 @@ dependencies = [ "hex", "num-derive 0.4.2", "num-traits", - "pyth-lazer-sdk", "pyth-lazer-solana-contract", "solana-client", "solana-program", @@ -3336,7 +3324,7 @@ dependencies = [ "quinn-udp", "rustc-hash", "rustls", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -3354,7 +3342,7 @@ dependencies = [ "rustls", "rustls-native-certs", "slab", - "thiserror", + "thiserror 1.0.69", "tinyvec", "tracing", ] @@ -4117,7 +4105,7 @@ dependencies = [ "spl-token-2022", "spl-token-group-interface", "spl-token-metadata-interface", - "thiserror", + "thiserror 1.0.69", "zstd", ] @@ -4179,7 +4167,7 @@ dependencies = [ "strum_macros", "tar", "tempfile", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4200,7 +4188,7 @@ dependencies = [ "solana-program", "solana-program-runtime", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4215,7 +4203,7 @@ dependencies = [ "solana-program", "solana-sdk", "tarpc", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-serde", ] @@ -4267,7 +4255,7 @@ dependencies = [ "solana-sdk", "solana-zk-token-sdk", "solana_rbpf", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4299,7 +4287,7 @@ dependencies = [ "rpassword", "solana-remote-wallet", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tiny-bip39", "uriparse", "url", @@ -4334,7 +4322,7 @@ dependencies = [ "solana-thin-client", "solana-tpu-client", "solana-udp-client", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -4380,7 +4368,7 @@ dependencies = [ "solana-measure", "solana-metrics", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -4430,7 +4418,7 @@ dependencies = [ "sha2 0.10.8", "solana-frozen-abi-macro", "subtle", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4491,7 +4479,7 @@ dependencies = [ "log", "reqwest", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4600,7 +4588,7 @@ dependencies = [ "solana-frozen-abi", "solana-frozen-abi-macro", "solana-sdk-macro", - "thiserror", + "thiserror 1.0.69", "tiny-bip39", "wasm-bindgen", "zeroize", @@ -4631,7 +4619,7 @@ dependencies = [ "solana-metrics", "solana-sdk", "solana_rbpf", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4660,7 +4648,7 @@ dependencies = [ "solana-vote-program", "solana_rbpf", "test-case", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -4681,7 +4669,7 @@ dependencies = [ "solana-account-decoder", "solana-rpc-client-api", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-stream", "tokio-tungstenite", @@ -4712,7 +4700,7 @@ dependencies = [ "solana-rpc-client-api", "solana-sdk", "solana-streamer", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -4741,7 +4729,7 @@ dependencies = [ "qstring", "semver", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "uriparse", ] @@ -4790,7 +4778,7 @@ dependencies = [ "solana-transaction-status", "solana-version", "spl-token-2022", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4803,7 +4791,7 @@ dependencies = [ "solana-clap-utils", "solana-rpc-client", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4879,7 +4867,7 @@ dependencies = [ "symlink", "tar", "tempfile", - "thiserror", + "thiserror 1.0.69", "zstd", ] @@ -4933,7 +4921,7 @@ dependencies = [ "solana-logger", "solana-program", "solana-sdk-macro", - "thiserror", + "thiserror 1.0.69", "uriparse", "wasm-bindgen", ] @@ -5016,7 +5004,7 @@ dependencies = [ "solana-metrics", "solana-perf", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", "x509-parser", ] @@ -5070,7 +5058,7 @@ dependencies = [ "solana-rpc-client", "solana-rpc-client-api", "solana-sdk", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -5096,7 +5084,7 @@ dependencies = [ "spl-memo", "spl-token", "spl-token-2022", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5110,7 +5098,7 @@ dependencies = [ "solana-net-utils", "solana-sdk", "solana-streamer", - "thiserror", + "thiserror 1.0.69", "tokio", ] @@ -5146,7 +5134,7 @@ dependencies = [ "solana-frozen-abi-macro", "solana-sdk", "solana-vote-program", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5168,7 +5156,7 @@ dependencies = [ "solana-program", "solana-program-runtime", "solana-sdk", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5210,7 +5198,7 @@ dependencies = [ "solana-program", "solana-sdk", "subtle", - "thiserror", + "thiserror 1.0.69", "zeroize", ] @@ -5229,7 +5217,7 @@ dependencies = [ "rand 0.8.5", "rustc-demangle", "scroll", - "thiserror", + "thiserror 1.0.69", "winapi", ] @@ -5268,7 +5256,7 @@ dependencies = [ "solana-program", "spl-token", "spl-token-2022", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5303,7 +5291,7 @@ dependencies = [ "quote", "sha2 0.10.8", "syn 2.0.87", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5338,7 +5326,7 @@ dependencies = [ "num-traits", "solana-program", "spl-program-error-derive", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5379,7 +5367,7 @@ dependencies = [ "num-traits", "num_enum 0.6.1", "solana-program", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5403,7 +5391,7 @@ dependencies = [ "spl-token-metadata-interface", "spl-transfer-hook-interface", "spl-type-length-value", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -5631,7 +5619,7 @@ dependencies = [ "serde", "static_assertions", "tarpc-plugins", - "thiserror", + "thiserror 1.0.69", "tokio", "tokio-serde", "tokio-util 0.6.10", @@ -5732,7 +5720,16 @@ version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" +dependencies = [ + "thiserror-impl 2.0.6", ] [[package]] @@ -5746,6 +5743,17 @@ dependencies = [ "syn 2.0.87", ] +[[package]] +name = "thiserror-impl" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.87", +] + [[package]] name = "thread_local" version = "1.1.8" @@ -5800,7 +5808,7 @@ dependencies = [ "rand 0.7.3", "rustc-hash", "sha2 0.9.9", - "thiserror", + "thiserror 1.0.69", "unicode-normalization", "wasm-bindgen", "zeroize", @@ -6061,7 +6069,7 @@ dependencies = [ "rand 0.8.5", "rustls", "sha1", - "thiserror", + "thiserror 1.0.69", "url", "utf-8", "webpki-roots 0.24.0", @@ -6602,7 +6610,7 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] diff --git a/lazer/solana/Cargo.toml b/lazer/solana/Cargo.toml index 6157572..4537ab8 100644 --- a/lazer/solana/Cargo.toml +++ b/lazer/solana/Cargo.toml @@ -12,9 +12,9 @@ name = "client" required-features = ["client"] [dependencies] -pyth-lazer-sdk = "0.1.0" - solana-program = "1.18.26" +anchor-lang = "0.30.1" +pyth-lazer-solana-contract = { version = "0.2.0", features = ["no-entrypoint"] } bytemuck = { version = "1.18.0", features = ["derive"] } num-traits = "0.2.19" num-derive = "0.4.2" @@ -22,7 +22,6 @@ solana-client = { version = "1.18", optional = true } anyhow = { version = "1.0.93", optional = true } solana-sdk = { version = "1.18.26", optional = true } hex = { version = "0.4.3", optional = true } -pyth-lazer-solana-contract = { version = "0.1.0", optional = true } env_logger = { version = "0.11.5", optional = true } [dev-dependencies] @@ -31,14 +30,11 @@ solana-program-test = "1.18.26" solana-sdk = "1.18.26" tokio = { version = "1.40.0", features = ["full"] } byteorder = "1.5.0" -pyth-lazer-solana-contract = "0.1.0" -anchor-lang = "0.30.1" [features] solana-client = ["dep:solana-client"] anyhow = ["dep:anyhow"] solana-sdk = ["dep:solana-sdk"] hex = ["dep:hex"] -pyth-lazer-solana-contract = ["dep:pyth-lazer-solana-contract"] env_logger = ["dep:env_logger"] -client = ["solana-client", "anyhow", "solana-sdk", "hex", "pyth-lazer-solana-contract", "env_logger"] +client = ["solana-client", "anyhow", "solana-sdk", "hex", "env_logger"] diff --git a/lazer/solana/src/bin/client.rs b/lazer/solana/src/bin/client.rs index e6b7951..1fb3c70 100644 --- a/lazer/solana/src/bin/client.rs +++ b/lazer/solana/src/bin/client.rs @@ -1,8 +1,11 @@ use { + anchor_lang::AccountDeserialize, anyhow::Context, - bytemuck::bytes_of, - pyth_lazer_sdk::ed25519_program_args, - pyth_lazer_solana_example::{InitializeArgs, Instruction as ExampleInstruction, UpdateArgs}, + bytemuck::{bytes_of, from_bytes}, + pyth_lazer_solana_contract::ed25519_program_args, + pyth_lazer_solana_example::{ + InitializeArgs, Instruction as ExampleInstruction, State, UpdateArgs, + }, solana_client::rpc_client::RpcClient, solana_sdk::{ instruction::{AccountMeta, Instruction}, @@ -49,6 +52,14 @@ fn main() -> anyhow::Result<()> { let signature = client.send_and_confirm_transaction(&tx)?; println!("OK {signature:?}"); } else if cmd == "update" { + let state_data = client.get_account_data(&data_pda_key)?; + let state = from_bytes::(&state_data); + println!("state: {state:?}"); + + let pyth_storage_data = client.get_account_data(&pyth_lazer_solana_contract::STORAGE_ID)?; + let pyth_storage = + pyth_lazer_solana_contract::Storage::try_deserialize(&mut &*pyth_storage_data)?; + let message = hex::decode(env::var("LAZER_UPDATE_HEX")?)?; let mut update_data = vec![ExampleInstruction::Update as u8]; update_data.extend_from_slice(bytes_of(&UpdateArgs { hello: 42 })); @@ -60,8 +71,11 @@ fn main() -> anyhow::Result<()> { // Total offset of Pyth Lazer update within the instruction data; // 1 byte is the instruction type. let message_offset = (size_of::() + 1).try_into().unwrap(); - let ed25519_args = - pyth_lazer_sdk::signature_offsets(&update_data, instruction_index, message_offset); + let ed25519_args = pyth_lazer_solana_contract::Ed25519SignatureOffsets::new( + &message, + instruction_index, + message_offset, + ); let tx = Transaction::new( &[&keypair], Message::new( @@ -75,12 +89,16 @@ fn main() -> anyhow::Result<()> { program_id, &update_data, vec![ - AccountMeta::new_readonly(sysvar::instructions::ID, false), + AccountMeta::new(keypair.pubkey(), true), AccountMeta::new(data_pda_key, false), + AccountMeta::new(pyth_lazer_solana_contract::ID, false), AccountMeta::new_readonly( - pyth_lazer_solana_contract::storage::ID, + pyth_lazer_solana_contract::STORAGE_ID, false, ), + AccountMeta::new(pyth_storage.treasury, false), + AccountMeta::new_readonly(system_program::ID, false), + AccountMeta::new_readonly(sysvar::instructions::ID, false), ], ), ], diff --git a/lazer/solana/src/lib.rs b/lazer/solana/src/lib.rs index eb10850..d62d894 100644 --- a/lazer/solana/src/lib.rs +++ b/lazer/solana/src/lib.rs @@ -1,15 +1,27 @@ use { + anchor_lang::{prelude::AccountMeta, InstructionData}, bytemuck::{bytes_of, try_from_bytes, try_from_bytes_mut, Pod, Zeroable}, num_derive::FromPrimitive, num_traits::FromPrimitive, - pyth_lazer_sdk::protocol::{ - payload::{PayloadData, PayloadPropertyValue}, - router::Channel, + pyth_lazer_solana_contract::{ + instruction::VerifyMessage, + protocol::{ + message::SolanaMessage, + payload::{PayloadData, PayloadPropertyValue}, + router::Channel, + }, }, solana_program::{ - account_info::AccountInfo, declare_id, entrypoint::ProgramResult, program::invoke_signed, - program_error::ProgramError, pubkey::Pubkey, rent::Rent, - system_instruction::create_account, sysvar::Sysvar, + account_info::AccountInfo, + declare_id, + entrypoint::ProgramResult, + instruction::Instruction as ProgramInstruction, + program::{invoke, invoke_signed}, + program_error::ProgramError, + pubkey::Pubkey, + rent::Rent, + system_instruction::create_account, + sysvar::Sysvar, }, std::mem::size_of, }; @@ -28,16 +40,20 @@ pub enum Instruction { /// Initialize the data PDA. /// Data: `InitializeArgs` /// Accounts: - /// 1. payer account - /// 2. data account - /// 3. system program + /// 1. payer account [writable] + /// 2. example data account [writable, non-existing] + /// 3. system program [readonly] Initialize = 0, /// Update price. /// Data: `UpdateArgs` followed by a signed Pyth Lazer update. /// Accounts: - /// 1. sysvar account [readonly] - required for Pyth Lazer - /// 2. data account [writable] - needed by our example contract - /// 3. pyth storage account [readonly] - required for Pyth Lazer + /// 1. payer account + /// 2. example data account [writable] + /// 3. pyth program account [readonly] + /// 4. pyth storage account [readonly] + /// 5. pyth treasury account [writable] + /// 6. system program [readonly] + /// 7. instructions sysvar sysvar account [readonly] Update = 1, } @@ -149,14 +165,19 @@ pub fn process_update_instruction( instruction_args: &[u8], ) -> ProgramResult { // Verify accounts passed to the instruction. - if accounts.len() != 3 { + if accounts.len() != 7 { return Err(ProgramError::NotEnoughAccountKeys); } - let sysvar_account = &accounts[0]; + let payer_account = &accounts[0]; let data_account = &accounts[1]; - let pyth_storage_account = &accounts[2]; + let _pyth_program_account = &accounts[2]; + let pyth_storage_account = &accounts[3]; + let pyth_treasury_account = &accounts[4]; + let system_program_account = &accounts[5]; + let instructions_sysvar_account = &accounts[6]; - let (data_pda_key, _) = Pubkey::find_program_address(&[DATA_PDA_SEED], program_id); + let (data_pda_key, _data_pda_bump_seed) = + Pubkey::find_program_address(&[DATA_PDA_SEED], program_id); if data_account.key != &data_pda_key { return Err(ProgramError::InvalidAccountData); } @@ -180,18 +201,40 @@ pub fn process_update_instruction( // We expect our signature to be the first (and only) signature to be checked // by the built-in ed25519 program within the transaction. let signature_index = 0; + // Check signature verification. - let verified = pyth_lazer_sdk::verify_message( - pyth_storage_account, - sysvar_account, - pyth_message, - ed25519_instruction_index, - signature_index, - pyth_message_total_offset.try_into().unwrap(), + invoke( + &ProgramInstruction::new_with_bytes( + pyth_lazer_solana_contract::ID, + &VerifyMessage { + message_data: pyth_message.to_vec(), + ed25519_instruction_index, + signature_index, + message_offset: pyth_message_total_offset.try_into().unwrap(), + } + .data(), + vec![ + AccountMeta::new(*payer_account.key, true), + AccountMeta::new_readonly(*pyth_storage_account.key, false), + AccountMeta::new(*pyth_treasury_account.key, false), + AccountMeta::new_readonly(*system_program_account.key, false), + AccountMeta::new_readonly(*instructions_sysvar_account.key, false), + ], + ), + &[ + payer_account.clone(), + pyth_storage_account.clone(), + pyth_treasury_account.clone(), + system_program_account.clone(), + instructions_sysvar_account.clone(), + ], )?; + let pyth_message = SolanaMessage::deserialize_slice(pyth_message) + .map_err(|_| ProgramError::InvalidInstructionData)?; + // Deserialize and use the payload. - let data = PayloadData::deserialize_slice_le(verified.payload) + let data = PayloadData::deserialize_slice_le(&pyth_message.payload) .map_err(|_| ProgramError::InvalidInstructionData)?; if data.feeds.is_empty() || data.feeds[0].properties.is_empty() { diff --git a/lazer/solana/tests/pyth_lazer_solana_contract.so b/lazer/solana/tests/pyth_lazer_solana_contract.so index 25eb1ee..a4cd90b 100755 Binary files a/lazer/solana/tests/pyth_lazer_solana_contract.so and b/lazer/solana/tests/pyth_lazer_solana_contract.so differ diff --git a/lazer/solana/tests/test1.rs b/lazer/solana/tests/test1.rs index 5ac8f2b..4edbdc8 100644 --- a/lazer/solana/tests/test1.rs +++ b/lazer/solana/tests/test1.rs @@ -1,14 +1,15 @@ use { anchor_lang::InstructionData, bytemuck::{bytes_of, from_bytes}, - pyth_lazer_sdk::ed25519_program_args, + pyth_lazer_solana_contract::ed25519_program_args, pyth_lazer_solana_example::{ process_instruction, InitializeArgs, Instruction as ExampleInstruction, State, UpdateArgs, }, solana_program::instruction::{AccountMeta, Instruction}, solana_program_test::{processor, ProgramTest}, solana_sdk::{ - pubkey::Pubkey, signer::Signer, system_program, sysvar, transaction::Transaction, + pubkey::Pubkey, signer::Signer, system_instruction, system_program, sysvar, + transaction::Transaction, }, std::env, }; @@ -45,16 +46,38 @@ async fn test1() { ); let (mut banks_client, payer, recent_blockhash) = program_test.start().await; + let treasury = + Pubkey::create_with_seed(&payer.pubkey(), "treasury", &system_program::ID).unwrap(); + + let mut transaction_create_treasury = Transaction::new_with_payer( + &[system_instruction::create_account_with_seed( + &payer.pubkey(), + &treasury, + &payer.pubkey(), + "treasury", + 10_000_000, + 0, + &system_program::ID, + )], + Some(&payer.pubkey()), + ); + transaction_create_treasury.sign(&[&payer], recent_blockhash); + banks_client + .process_transaction(transaction_create_treasury) + .await + .unwrap(); + let mut transaction_init_contract = Transaction::new_with_payer( &[Instruction::new_with_bytes( pyth_lazer_solana_contract::ID, &pyth_lazer_solana_contract::instruction::Initialize { top_authority: payer.pubkey(), + treasury, } .data(), vec![ AccountMeta::new(payer.pubkey(), true), - AccountMeta::new(pyth_lazer_solana_contract::storage::ID, false), + AccountMeta::new(pyth_lazer_solana_contract::STORAGE_ID, false), AccountMeta::new_readonly(system_program::ID, false), ], )], @@ -85,7 +108,7 @@ async fn test1() { .data(), vec![ AccountMeta::new(payer.pubkey(), true), - AccountMeta::new(pyth_lazer_solana_contract::storage::ID, false), + AccountMeta::new(pyth_lazer_solana_contract::STORAGE_ID, false), ], )], Some(&payer.pubkey()), @@ -140,8 +163,11 @@ async fn test1() { // Total offset of Pyth Lazer update within the instruction data; // 1 byte is the instruction type. let message_offset = (size_of::() + 1).try_into().unwrap(); - let ed25519_args = - pyth_lazer_sdk::signature_offsets(&update_data, instruction_index, message_offset); + let ed25519_args = pyth_lazer_solana_contract::Ed25519SignatureOffsets::new( + &message, + instruction_index, + message_offset, + ); let mut transaction_update = Transaction::new_with_payer( &[ Instruction::new_with_bytes( @@ -153,9 +179,13 @@ async fn test1() { pyth_lazer_solana_example::ID, &update_data, vec![ - AccountMeta::new_readonly(sysvar::instructions::ID, false), + AccountMeta::new(payer.pubkey(), true), AccountMeta::new(data_pda_key, false), - AccountMeta::new_readonly(pyth_lazer_solana_contract::storage::ID, false), + AccountMeta::new(pyth_lazer_solana_contract::ID, false), + AccountMeta::new_readonly(pyth_lazer_solana_contract::STORAGE_ID, false), + AccountMeta::new(treasury, false), + AccountMeta::new_readonly(system_program::ID, false), + AccountMeta::new_readonly(sysvar::instructions::ID, false), ], ), ],