diff --git a/spel-cli/src/parse.rs b/spel-cli/src/parse.rs index 705c0f8..e7e89d6 100644 --- a/spel-cli/src/parse.rs +++ b/spel-cli/src/parse.rs @@ -98,6 +98,15 @@ fn parse_primitive(raw: &str, prim: &str) -> Result { _ => Err(format!("Invalid bool '{}': expected true/false", raw)), }, "string" | "String" => Ok(ParsedValue::Str(raw.to_string())), + // nssa AccountId is SerializeDisplay/DeserializeFromStr: a base58 string on the + // wire, not 32 raw bytes. Normalize any input (base58 / 0xhex / Public-prefixed) + // to canonical base58 and carry it as a string. + "account_id" => { + use base58::ToBase58 as _; + crate::hex::decode_bytes_32(raw) + .map(|b| ParsedValue::Str(b.to_base58())) + .map_err(|e| format!("Invalid account_id '{}': {}", raw, e)) + } other => Ok(ParsedValue::Raw(format!("{}({})", other, raw))), } } diff --git a/spel-cli/src/serialize.rs b/spel-cli/src/serialize.rs index 1b40c79..ade1c14 100644 --- a/spel-cli/src/serialize.rs +++ b/spel-cli/src/serialize.rs @@ -125,6 +125,8 @@ fn primitive_to_dynamic(prim: &str, val: &ParsedValue) -> Result Ok(DynamicValue::Tuple( vals.iter().map(|v| DynamicValue::U32(*v)).collect(), )), + // nssa AccountId serializes via Display (base58 string), not as raw bytes. + ("account_id", ParsedValue::Str(s)) => Ok(DynamicValue::Str(s.clone())), _ => Err(SerializeError::TypeMismatch { expected: prim.to_string(), got: format!("{:?}", val),