From dcb725227e76ba7ab54a1e5a4984c7dc40002d5f Mon Sep 17 00:00:00 2001 From: asolana <110843012+ksolana@users.noreply.github.com> Date: Tue, 4 Jun 2024 21:54:27 -0700 Subject: [PATCH] Add utils to generate instruction_data based on name (#57) Towards #55 --- external-crates/move/Cargo.lock | 14 ++++++ external-crates/move/solana/util/Cargo.toml | 12 +++++ .../solana/util/src/generate_input_json.rs | 50 +++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 external-crates/move/solana/util/Cargo.toml create mode 100644 external-crates/move/solana/util/src/generate_input_json.rs diff --git a/external-crates/move/Cargo.lock b/external-crates/move/Cargo.lock index 00572ccd55b52b..50b8f7dc2a804d 100644 --- a/external-crates/move/Cargo.lock +++ b/external-crates/move/Cargo.lock @@ -434,6 +434,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "binascii" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383d29d513d8764dcdc42ea295d979eb99c3c9f00607b3692cf68a431f7dca72" + [[package]] name = "bincode" version = "1.3.3" @@ -2234,6 +2240,14 @@ dependencies = [ "hashbrown 0.14.3", ] +[[package]] +name = "input_json" +version = "1.0.0" +dependencies = [ + "binascii", + "clap 3.2.23", +] + [[package]] name = "instant" version = "0.1.12" diff --git a/external-crates/move/solana/util/Cargo.toml b/external-crates/move/solana/util/Cargo.toml new file mode 100644 index 00000000000000..adcbf1e9873fad --- /dev/null +++ b/external-crates/move/solana/util/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "input_json" +version = "1.0.0" +edition = "2021" + +[[bin]] +name = "generate_input_json" +path = "src/generate_input_json.rs" + +[dependencies] +binascii = "0.1" +clap = { version = "3.1.8", features = ["derive"] } diff --git a/external-crates/move/solana/util/src/generate_input_json.rs b/external-crates/move/solana/util/src/generate_input_json.rs new file mode 100644 index 00000000000000..5a64d288ec9f81 --- /dev/null +++ b/external-crates/move/solana/util/src/generate_input_json.rs @@ -0,0 +1,50 @@ +#[cfg(test)] +use binascii::{b32encode, b32decode}; + +use clap::Parser; + +#[derive(Debug, Parser)] +#[clap(author, version, about)] +pub struct Args { + /// Entry function name + #[clap(short = 'f', long = "func-name")] + pub entry_function_name: String, + // Remaining arguments that we want to serialize as bytes + #[clap(short = 's', long = "args", default_value = "")] + pub argstring: String, +} + +fn print_as_bytes(data : &str) -> Vec { + let length = data.len(); + let input = &data[..length].as_bytes(); + input.to_vec() +} + +#[test] +fn test_encode_decode() { + let data : &str = "counter__owner"; + let input = &data[..data.len()].as_bytes(); + let mut output = [0u8; 500]; + let mut dec_out = [0u8; 200]; + let encoded_output = b32encode(&input, &mut output).ok().unwrap(); + let decoded_output = b32decode(&encoded_output, &mut dec_out).ok().unwrap(); + assert_eq!(input, &decoded_output); +} + +#[test] +fn test_print_as_bytes() { + const ENCODED_DATA : [u8; 11] = [104, 101, 108, 108, 111, 95, 95, 109, 97, 105, 110]; + let b = print_as_bytes("hello__main"); + assert_eq!(b.len(), ENCODED_DATA.len()); + assert_eq!(&ENCODED_DATA, &b[..ENCODED_DATA.len()]); +} + +pub fn main() { + let args = Args::parse(); + let mut b = print_as_bytes(args.entry_function_name.as_str()); + let mut blen = b.len().to_le_bytes().to_vec(); + println!("As bytes: {:?}", b.clone()); + println!("len: {:?}", blen.clone()); + blen.append(&mut b); + println!("\"instruction_data\": {:?}", blen); +}