use { anyhow::bail, byteorder::{ReadBytesExt, BE}, pyth_lazer_protocol::{ message::{EvmMessage, SolanaMessage}, payload::{PayloadData, EVM_FORMAT_MAGIC, SOLANA_FORMAT_MAGIC_BE}, }, std::io::{stdin, BufRead, Cursor}, }; fn main() -> anyhow::Result<()> { println!("Reading hex encoded payloads from stdin..."); for line in stdin().lock().lines() { let message = hex::decode(line?.trim())?; let magic = Cursor::new(&message).read_u32::()?; if magic == SOLANA_FORMAT_MAGIC_BE { println!("this is a solana payload"); let message = SolanaMessage::deserialize_slice(&message)?; println!( "solana public key: {}", bs58::encode(&message.public_key).into_string() ); let key = ed25519_dalek::VerifyingKey::from_bytes(&message.public_key)?; key.verify_strict( &message.payload, &ed25519_dalek::Signature::from_bytes(&message.signature), )?; println!("signature is valid"); let payload = PayloadData::deserialize_slice_le(&message.payload)?; println!("payload: {payload:#?}"); } else if magic == EVM_FORMAT_MAGIC { println!("this is an evm payload"); let message = EvmMessage::deserialize_slice(&message)?; let public_key = libsecp256k1::recover( &libsecp256k1::Message::parse(&alloy_primitives::keccak256(&message.payload)), &libsecp256k1::Signature::parse_standard(&message.signature)?, &libsecp256k1::RecoveryId::parse(message.recovery_id)?, )?; println!( "evm address recovered from signature: {:?}", hex::encode(&alloy_primitives::keccak256(&public_key.serialize()[1..])[12..]) ); let payload = PayloadData::deserialize_slice_be(&message.payload)?; println!("payload: {payload:#?}"); } else { bail!("unknown format"); } } Ok(()) }