Skip to content

Commit

Permalink
refactor to use new calldata
Browse files Browse the repository at this point in the history
  • Loading branch information
glihm committed Feb 5, 2025
1 parent 265cd5c commit 039ad49
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 82 deletions.
129 changes: 63 additions & 66 deletions bin/sozo/src/commands/model.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use anyhow::Result;
use anyhow::{Context, Result};
use clap::{Args, Subcommand};
use dojo_world::config::calldata_decoder;
use scarb::core::Config;
Expand All @@ -11,6 +11,7 @@ use tracing::trace;
use super::options::starknet::StarknetOptions;
use super::options::world::WorldOptions;
use crate::utils;
use crate::utils::CALLDATA_DOC;

#[derive(Debug, Args)]
pub struct ModelArgs {
Expand Down Expand Up @@ -109,14 +110,12 @@ hashes, called 'hash' in the following documentation.
tag_or_name: ResourceDescriptor,

#[arg(value_name = "KEYS")]
#[arg(value_delimiter = ',')]
#[arg(help = "Comma separated values, e.g., 0x12345,0x69420,sstr:\"hello\", u256:0x123.
Supporting all prefixes:\n - u256: A 256-bit unsigned integer\n - str: A \
cairo string (ByteArray)\n - sstr: A cairo short string\n - int: A \
signed integer\n - no prefix: A cairo felt or any type that fits into \
one felt")]
#[arg(value_parser = model_key_parser)]
keys: Vec<Vec<Felt>>,
#[arg(num_args = 1..)]
#[arg(required = true)]
#[arg(
help = format!("List of values representing the serialized keys of the model.\n{CALLDATA_DOC}")
)]
keys: Vec<String>,

#[command(flatten)]
world: WorldOptions,
Expand All @@ -130,12 +129,6 @@ hashes, called 'hash' in the following documentation.
},
}

// Custom parser for model keys
fn model_key_parser(s: &str) -> Result<Vec<Felt>> {
let felts = calldata_decoder::decode_calldata(&vec![s.to_string()])?;
Ok(felts)
}

impl ModelArgs {
pub fn run(self, config: &Config) -> Result<()> {
trace!(args = ?self);
Expand Down Expand Up @@ -217,11 +210,9 @@ impl ModelArgs {
let (world_diff, provider, _) =
utils::get_world_diff_and_provider(starknet, world, &ws).await?;

let flattened_keys: Vec<Felt> = keys.into_iter().flatten().collect();

let (record, _, _) = model::model_get(
tag.to_string(),
flattened_keys,
parse_keys(&keys)?,
world_diff.world_info.address,
&provider,
block_id,
Expand All @@ -237,13 +228,28 @@ impl ModelArgs {
}
}

/// Parses the keys from the command line into a vector of Felt representing the serialized keys of
/// the model.
fn parse_keys(keys: &[String]) -> Result<Vec<Felt>> {
let mut keys_serde = vec![];

for key in keys {
let key_felt = calldata_decoder::decode_single_calldata(key)
.with_context(|| format!("Failed to decode key: {}", key))?;
keys_serde.extend(key_felt);
}

Ok(keys_serde)
}

#[cfg(test)]
mod tests {
// To do: Add more tests for the flattening of keys
// let flattened_keys: Vec<Felt> = keys.into_iter().flatten().collect();

use clap::Parser;
use starknet::core::utils::cairo_short_string_to_felt;
use starknet::macros::felt;

use super::*;

Expand All @@ -260,20 +266,17 @@ mod tests {
"model",
"get",
"Account",
"0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5,0x6d69737479",
"0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5",
"0x6d69737479",
]);

if let ModelCommand::Get { keys, .. } = args.command {
let expected = vec![
vec![
Felt::from_hex(
"0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5",
)
.unwrap(),
],
vec![Felt::from_hex("0x6d69737479").unwrap()],
felt!("0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5"),
felt!("0x6d69737479"),
];
assert_eq!(keys, expected);

assert_eq!(parse_keys(&keys).unwrap(), expected);
} else {
panic!("Expected Get command");
}
Expand All @@ -283,20 +286,17 @@ mod tests {
"model",
"get",
"Account",
"0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5,sstr:\"misty\"",
"0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5",
"sstr:\"misty\"",
]);

if let ModelCommand::Get { keys, .. } = args.command {
let expected = vec![
vec![
Felt::from_hex(
"0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5",
)
.unwrap(),
],
vec![cairo_short_string_to_felt("misty").unwrap()],
felt!("0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5"),
cairo_short_string_to_felt("misty").unwrap(),
];
assert_eq!(keys, expected);

assert_eq!(parse_keys(&keys).unwrap(), expected);
} else {
panic!("Expected Get command");
}
Expand All @@ -306,20 +306,18 @@ mod tests {
"model",
"get",
"Account",
"0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5,u256:0x1",
"0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5",
"u256:0x1",
]);

if let ModelCommand::Get { keys, .. } = args.command {
let expected = vec![
vec![
Felt::from_hex(
"0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5",
)
.unwrap(),
],
vec![Felt::ONE, Felt::ZERO],
felt!("0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5"),
Felt::ONE,
Felt::ZERO,
];
assert_eq!(keys, expected);

assert_eq!(parse_keys(&keys).unwrap(), expected);
} else {
panic!("Expected Get command");
}
Expand All @@ -328,8 +326,9 @@ mod tests {
let args = TestCommand::parse_from(["model", "get", "Account", "int:-123456789"]);

if let ModelCommand::Get { keys, .. } = args.command {
let expected = vec![vec![(-123456789_i64).into()]];
assert_eq!(keys, expected);
let expected = vec![(-123456789_i64).into()];

assert_eq!(parse_keys(&keys).unwrap(), expected);
} else {
panic!("Expected Get command");
}
Expand All @@ -338,12 +337,13 @@ mod tests {
let args = TestCommand::parse_from(["model", "get", "Account", "str:hello"]);

if let ModelCommand::Get { keys, .. } = args.command {
let expected = vec![vec![
let expected = vec![
Felt::ZERO,
cairo_short_string_to_felt("hello").unwrap(),
Felt::from_dec_str("5").unwrap(),
]];
assert_eq!(keys, expected);
];

assert_eq!(parse_keys(&keys).unwrap(), expected);
} else {
panic!("Expected Get command");
}
Expand All @@ -353,27 +353,24 @@ mod tests {
"model",
"get",
"Account",
"0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5,u256:0x1,int:\
-123456789,str:hello",
"0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5",
"u256:0x1",
"int:-123456789",
"str:hello",
]);

if let ModelCommand::Get { keys, .. } = args.command {
let expected = vec![
vec![
Felt::from_hex(
"0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5",
)
.unwrap(),
],
vec![Felt::ONE, Felt::ZERO],
vec![(-123456789_i64).into()],
vec![
Felt::ZERO,
cairo_short_string_to_felt("hello").unwrap(),
Felt::from_dec_str("5").unwrap(),
],
felt!("0x054cb935d86d80b5a0a6e756edf448ab33876d01dd2b07a2a4e63a41e06d0ef5"),
Felt::ONE,
Felt::ZERO,
(-123456789_i64).into(),
Felt::ZERO,
cairo_short_string_to_felt("hello").unwrap(),
Felt::from_dec_str("5").unwrap(),
];
assert_eq!(keys, expected);

assert_eq!(parse_keys(&keys).unwrap(), expected);
} else {
panic!("Expected Get command");
}
Expand Down
6 changes: 4 additions & 2 deletions crates/dojo/world/src/config/calldata_decoder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,8 @@ impl CalldataDecoder for U256CalldataDecoder {
struct StrCalldataDecoder;
impl CalldataDecoder for StrCalldataDecoder {
fn decode(&self, input: &str) -> DecoderResult<Vec<Felt>> {
let ba = ByteArray::from_string(input)?;
let no_quotes = input.trim_start_matches('"').trim_end_matches('"');
let ba = ByteArray::from_string(no_quotes)?;
Ok(ByteArray::cairo_serialize(&ba))
}
}
Expand All @@ -91,7 +92,8 @@ impl CalldataDecoder for StrCalldataDecoder {
struct ShortStrCalldataDecoder;
impl CalldataDecoder for ShortStrCalldataDecoder {
fn decode(&self, input: &str) -> DecoderResult<Vec<Felt>> {
Ok(vec![cairo_short_string_to_felt(input)?])
let no_quotes = input.trim_start_matches('"').trim_end_matches('"');
Ok(vec![cairo_short_string_to_felt(no_quotes)?])
}
}

Expand Down
40 changes: 26 additions & 14 deletions examples/spawn-and-move/manifest_dev.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"world": {
"class_hash": "0x2361c106e790c1d1bff8c9f73c9d84e9e3ac94b2d8df6db4ddd55e82c33a9b4",
"address": "0x736c456dec44741fad1940876e62342a626ca73fd4ac574a94eb3ded2e25d8d",
"class_hash": "0x4b767fda48530353c2e44e4b9433f4d75c6c9974aaff43ecc00de9455eb71b8",
"address": "0x5baea2d83fc19bae80dc5d4626a27b2b2d5012822cd862c56ed7007eb92eaa2",
"seed": "dojo_examples",
"name": "example",
"entrypoints": [
Expand Down Expand Up @@ -1252,7 +1252,7 @@
},
"contracts": [
{
"address": "0x4ba8772b4785c0afce5b73ed98d30cf8832e3bfcceff5a688b085ef6d0f164e",
"address": "0x7447baef53fdcc376b73963aa2bd3b0894be7d5bd40f596cc44d1d54d80ea52",
"class_hash": "0x2267c07d691a6da353f0beaec2e15f3b79ef271953364efb143c343713a6ccd",
"abi": [
{
Expand Down Expand Up @@ -1606,7 +1606,7 @@
]
},
{
"address": "0x77a851ab985e88cbfdaee77a7c10e7afde9c9c3e49aa9ec2537e41de44e857c",
"address": "0x608ffd2e6b74a7bede256770ebe3d07bc65c79622e6a9396ea764011152102",
"class_hash": "0x7b31bb137c041fbe8247724a888bb108aaf2ff6b2bb7be5ecf5c954471e30c3",
"abi": [
{
Expand Down Expand Up @@ -1800,7 +1800,7 @@
]
},
{
"address": "0xe1fb33e10629d61ac3eb7c9bdca6a0ce947bcf7ecf598fbc0c42f9c76b3808",
"address": "0xca72f1cd782b614fa12c8b54afa895a169a4de1792738d4e3f09d0929f7834",
"class_hash": "0x38c4b1f36acecf15ea27430f34956bdfed933271ef23bcb9444db15dce66c6b",
"abi": [
{
Expand Down Expand Up @@ -1976,7 +1976,7 @@
]
},
{
"address": "0x3032d716e69f67e05983edad3d3b5b8efa9b08d09c778e2eecf224e095a1160",
"address": "0x780e3207b4f11b56f32cc0f19975af5b3a4df3cad6a4b0ab59a1702ba0304d8",
"class_hash": "0x5dd5b200655bdc68fba0ec23b25a9fb2d8ea2da118d60789c2d1d6adac3afae",
"abi": [
{
Expand Down Expand Up @@ -2162,51 +2162,63 @@
"models": [
{
"members": [],
"class_hash": "0x2484dcdbc95660098ac9bd79cbd5d67b29db4440bd6ec29703edd2de2938239",
"class_hash": "0x5fff7fd534708d4d13ea05fd95ce6fb1c3623d0225bc752963246d4a5cd969e",
"tag": "ns-Flatbow",
"selector": "0x27a35f8bac96f1deebf4d3e83fc6b94a3da4e6d30a1ce34d5893d2fb602725d"
},
{
"members": [],
"class_hash": "0x352619ce02b242854390b59216eca80b4d51a41ea96169847637216098b5b3c",
"tag": "ns-Message",
"selector": "0x7e77b60a338fa7414998176fd93ff265e4ca04b93105ac98f155bcb2e9e8438"
},
{
"members": [],
"class_hash": "0x39664ad816df26acffafde523703dabbbd6340c882f0a74c065a65456919e80",
"class_hash": "0x3cb57dec0524eee7b10b8df78ffd8167e04c8bfee85c81f0dc1883f333a0eeb",
"tag": "ns-MockToken",
"selector": "0x23ee42c8f47d1d693b966176dcd5deca0ec147b33e42186382d9d027603a6fd"
},
{
"members": [],
"class_hash": "0x150eee99ad95167e659a29f95d488f9b3352ede4a71ffbfcf0c6c58e0bb8bfc",
"class_hash": "0x67080a2923abdf48e821518da3e58bde33881db7187571cbf43d1bae1ac6636",
"tag": "ns-Moves",
"selector": "0x54104f060e63bdd9d68bb872f2dc6d40a101e168e18b999c10de348d06ea24a"
},
{
"members": [],
"class_hash": "0x71182ddf8495649cadc7d56859b2ad948fb1ff9d662ceb87d9f0acddb35741f",
"class_hash": "0x6bbee80be480d884a298afb0d041e7755832c271e8291db9c581a0d725e9027",
"tag": "ns-PlayerConfig",
"selector": "0x3bea561c3e142a660a00d1471d7712b70695dc4ee3b173aeaefd5178f7a21af"
},
{
"members": [],
"class_hash": "0x42626cdced5ba2ef1b35c3bdc9f2585af36195cb61a9aa522d1fa7099afce59",
"class_hash": "0x7e7de15d29fc42772368e242acc59474457fa7b6ccd6944e7aa972430d427a8",
"tag": "ns-Position",
"selector": "0x5e12c61e9cf30881c126a6d298975c8d79f95abed1a05c2d38b7803ed19445f"
},
{
"members": [],
"class_hash": "0x6cbcf6752cad02e0b6013bf08ebf977e4e862f51cec295b30906aae79d692f",
"class_hash": "0x127b7a795eb7d381505d0cf99c4d7b34f72575bcb10fdce997fd5c81c5147f",
"tag": "ns-RiverSkale",
"selector": "0x47f763aa7de3b872f7fbec198275547e06751dbe26b66281b9cffaed9938f24"
},
{
"members": [],
"class_hash": "0xbdb10fde8e9d7ccd8c07a04a1c25cc226159f68695e0a8a1c2ffe7b8fc5a6d",
"tag": "ns-ServerProfile",
"selector": "0x641dc5f178aff0c7935a8f1ae30c6038a3d3512ea164d486f98bc37b6beabf"
}
],
"events": [
{
"members": [],
"class_hash": "0x1ed25b9d560885e8749d828ad56723d84bb8ffeefb8c7315957cd984e6f91b2",
"class_hash": "0x7d4d38635c05c9da6b8d71126d426145d204057c593a3d0a65245356c59055b",
"tag": "ns-Moved",
"selector": "0x6d4c1ac3717ba997500153c52344a2acac5123bbfa0f78d3dcc04cb786826b0"
},
{
"members": [],
"class_hash": "0x4021dfedffcc0efe8a09b97c634fcab28a00581b684d972c7c906b99517bc20",
"class_hash": "0x72724ada5a30dca6c13cbd278307870b853dd6a4a34432600fa814d88175acd",
"tag": "ns-MyInit",
"selector": "0xe1c030210beae7e2153a7b996d7d2ae6a428faf16a61f192f02178718b6f0"
}
Expand Down

0 comments on commit 039ad49

Please sign in to comment.