use super::*;
use crate::shim::{address::Address, econ::TokenAmount, message::Message};
use fvm_ipld_encoding::RawBytes;
use ::cid::Cid;
#[derive(Debug, PartialEq, Clone, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "PascalCase")]
#[schemars(rename = "Message")]
pub struct MessageLotusJson {
#[serde(default)]
version: u64,
#[schemars(with = "LotusJson<Address>")]
#[serde(with = "crate::lotus_json")]
to: Address,
#[schemars(with = "LotusJson<Address>")]
#[serde(with = "crate::lotus_json")]
from: Address,
#[serde(default)]
nonce: u64,
#[schemars(with = "LotusJson<TokenAmount>")]
#[serde(with = "crate::lotus_json", default)]
value: TokenAmount,
#[serde(default)]
gas_limit: u64,
#[schemars(with = "LotusJson<TokenAmount>")]
#[serde(with = "crate::lotus_json", default)]
gas_fee_cap: TokenAmount,
#[schemars(with = "LotusJson<TokenAmount>")]
#[serde(with = "crate::lotus_json", default)]
gas_premium: TokenAmount,
#[serde(default)]
method: u64,
#[schemars(with = "LotusJson<RawBytes>")]
#[serde(with = "crate::lotus_json", default)]
params: RawBytes,
#[schemars(with = "LotusJson<Option<Cid>>")]
#[serde(
with = "crate::lotus_json",
rename = "CID",
default,
skip_serializing_if = "Option::is_none"
)]
cid: Option<Cid>,
}
impl HasLotusJson for Message {
type LotusJson = MessageLotusJson;
#[cfg(test)]
fn snapshots() -> Vec<(serde_json::Value, Self)> {
let msg = Message::default();
let cid = msg.cid();
vec![(
json!({
"From": "f00",
"GasFeeCap": "0",
"GasLimit": 0,
"GasPremium": "0",
"Method": 0,
"Nonce": 0,
"Params": null,
"To": "f00",
"Value": "0",
"Version": 0,
"CID": { "/": cid.to_string() },
}),
msg,
)]
}
fn into_lotus_json(self) -> Self::LotusJson {
let cid = self.cid();
let Self {
version,
from,
to,
sequence,
value,
method_num,
params,
gas_limit,
gas_fee_cap,
gas_premium,
} = self;
Self::LotusJson {
version,
to,
from,
nonce: sequence,
value,
gas_limit,
gas_fee_cap,
gas_premium,
method: method_num,
params,
cid: Some(cid),
}
}
fn from_lotus_json(lotus_json: Self::LotusJson) -> Self {
let Self::LotusJson {
version,
to,
from,
nonce,
value,
gas_limit,
gas_fee_cap,
gas_premium,
method,
params,
cid: _,
} = lotus_json;
Self {
version,
from,
to,
sequence: nonce,
value,
method_num: method,
params,
gas_limit,
gas_fee_cap,
gas_premium,
}
}
}