|
|
@@ -0,0 +1,51 @@
|
|
|
+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::<BE>()?;
|
|
|
+ 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(())
|
|
|
+}
|