Skip to content

Commit

Permalink
update rpc ops
Browse files Browse the repository at this point in the history
  • Loading branch information
kariy committed Apr 4, 2024
1 parent ebd6e8f commit 2c9d4a3
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 80 deletions.
15 changes: 4 additions & 11 deletions crates/args/src/commands/rpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,6 @@ pub struct RpcArgs {
#[arg(help = "RPC method name")]
pub method: String,

#[arg(short, long)]
#[arg(help = r#"Pass the "params" as is"#)]
#[arg(long_help = r#"Pass the "params" as is
If --raw is passed the first PARAM will be taken as the value of "params". If no params are given, stdin will be used. For example:
rpc starknet_getStorageAt '[123, "0x69420", "latest"]' --raw
=> {"method": "eth_getBlockByNumber", "params": [123, "0x69420", false] ... }"#)]
pub raw: bool,

#[arg(value_name = "PARAMS")]
#[arg(help = "RPC parameters")]
#[arg(value_parser = params_value_parser)]
Expand All @@ -33,12 +25,13 @@ rpc starknet_getStorageAt '[123, "0x69420", "latest"]' --raw
}

fn params_value_parser(value: &str) -> Result<Value, serde_json::Error> {
use serde_json::{from_str, Number};
// parse as number if possible
if let Ok(num) = value.parse::<i64>() {
Ok(Value::Number(serde_json::Number::from(num)))
Ok(Value::Number(Number::from(num)))
} else {
// otherwise parse normally
serde_json::from_str(value)
// otherwise, try to parse as json and fall back to string
Ok(from_str(value).unwrap_or(Value::String(value.to_string())))
}
}

Expand Down
89 changes: 20 additions & 69 deletions crates/ops/src/rpc.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,36 +10,23 @@ pub fn send(args: RpcArgs) -> Result<()> {
let RpcArgs {
method,
params,
raw,
url,
} = args;

let payload = build_payload(&method, params, raw)?;
let payload = build_payload(&method, params);
let res = utils::block_on(send_request::<Value>(url, payload))?;
println!("{}", serde_json::to_string_pretty(&res)?);

Ok(())
}

fn build_payload(method: &str, params: Vec<String>, raw: bool) -> Result<Value> {
let mut json_params = Vec::with_capacity(params.len());

if raw {
if let Some(p) = params.first() {
json_params.push(serde_json::from_str(p)?)
}
} else {
for value in params {
json_params.push(serde_json::from_str(&value)?)
}
}

Ok(json!({
fn build_payload(method: &str, params: Vec<Value>) -> Value {
json!({
"id": 1,
"jsonrpc": "2.0",
"method": method,
"params": Value::Array(json_params)
}))
"params": Value::Array(params)
})
}

async fn send_request<T>(url: impl IntoUrl, payload: Value) -> Result<T>
Expand All @@ -53,64 +40,28 @@ where

#[cfg(test)]
mod tests {

use super::*;
use serde_json::json;

#[test]
fn parse_rpc_params() {
let method = "foo";
let params = vec![json!({
"contract_address": "0x050225ec8d27d8d34c2a5dfd97f01bcd8d55b521fe34ac1db5ba9f544b99af01",
"entry_point_selector": "0x025ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918",
"calldata": [
"0x12314",
"0x42069"
]
}).to_string(),"918".to_string(), "\"latest\"".to_string()];

// prepare the expected payload
let expected_payload = json!({
"id": 1,
"jsonrpc": "2.0",
"method": "foo",
"params": [
{
"contract_address": "0x050225ec8d27d8d34c2a5dfd97f01bcd8d55b521fe34ac1db5ba9f544b99af01",
"entry_point_selector": "0x025ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918",
"calldata": [
"0x12314",
"0x42069"
]
},
918,
"latest"
]
});
use crate::rpc::build_payload;

// test as non-raw payload
let payload = build_payload(method, params.clone(), false).unwrap();
similar_asserts::assert_eq!(payload, expected_payload);
#[test]
fn test_build_payload() {
let method = "starknet_getStorageAt";
let params = vec![
json!(123),
json!(69420),
json!("latest"),
json!({ "key": "value" }),
];

// prepare the expected payload, only the first param is parsed
let expected_payload = json!({
let expected = json!({
"id": 1,
"jsonrpc": "2.0",
"method": "foo",
"params": [
{
"contract_address": "0x050225ec8d27d8d34c2a5dfd97f01bcd8d55b521fe34ac1db5ba9f544b99af01",
"entry_point_selector": "0x025ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918",
"calldata": [
"0x12314",
"0x42069"
]
},
]
"method": "starknet_getStorageAt",
"params": [123, 69420, "latest", { "key": "value" }]
});

// test as raw payload
let payload = build_payload(method, params, true).unwrap();
similar_asserts::assert_eq!(payload, expected_payload);
let result = build_payload(method, params);
similar_asserts::assert_eq!(result, expected);
}
}

0 comments on commit 2c9d4a3

Please sign in to comment.