use schemars::JsonSchema; use serde::{Deserialize, Serialize}; use cosmwasm_std::{to_binary, Binary, CosmosMsg, StdResult, WasmMsg}; /// Cw721ReceiveMsg should be de/serialized under `Receive()` variant in a ExecuteMsg #[derive(Serialize, Deserialize, Clone, PartialEq, Eq, JsonSchema, Debug)] #[serde(rename_all = "snake_case")] pub struct Cw721ReceiveMsg { pub sender: String, pub token_id: String, pub msg: Binary, } impl Cw721ReceiveMsg { /// serializes the message pub fn into_binary(self) -> StdResult { let msg = ReceiverExecuteMsg::ReceiveNft(self); to_binary(&msg) } /// creates a cosmos_msg sending this struct to the named contract pub fn into_cosmos_msg, C>(self, contract_addr: T) -> StdResult> where C: Clone + std::fmt::Debug + PartialEq + JsonSchema, { let msg = self.into_binary()?; let execute = WasmMsg::Execute { contract_addr: contract_addr.into(), msg, funds: vec![], }; Ok(execute.into()) } } /// This is just a helper to properly serialize the above message. /// The actual receiver should include this variant in the larger ExecuteMsg enum #[derive(Serialize, Deserialize, Clone, PartialEq, JsonSchema, Debug)] #[serde(rename_all = "snake_case")] enum ReceiverExecuteMsg { ReceiveNft(Cw721ReceiveMsg), }