cosmrs/cosmwasm/
msg_initiate_contract.rs

1use crate::{
2    proto::{self, traits::ParseOptional},
3    tx::Msg,
4    AccountId, Coin, ErrorReport, Result,
5};
6
7/// MsgInstantiateContract create a new smart contract instance for the given
8/// code id.
9#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
10pub struct MsgInstantiateContract {
11    /// Sender is the that actor that signed the messages
12    pub sender: AccountId,
13
14    /// Admin is an optional address that can execute migrations
15    pub admin: Option<AccountId>,
16
17    /// CodeID is the reference to the stored WASM code
18    pub code_id: u64,
19
20    /// Label is optional metadata to be stored with a contract instance.
21    pub label: Option<String>,
22
23    /// Msg json encoded message to be passed to the contract on instantiation
24    pub msg: Vec<u8>,
25
26    /// Funds coins that are transferred to the contract on instantiation
27    pub funds: Vec<Coin>,
28}
29
30impl Msg for MsgInstantiateContract {
31    type Proto = proto::cosmwasm::wasm::v1::MsgInstantiateContract;
32}
33
34impl TryFrom<proto::cosmwasm::wasm::v1::MsgInstantiateContract> for MsgInstantiateContract {
35    type Error = ErrorReport;
36
37    fn try_from(
38        proto: proto::cosmwasm::wasm::v1::MsgInstantiateContract,
39    ) -> Result<MsgInstantiateContract> {
40        Ok(MsgInstantiateContract {
41            sender: proto.sender.parse()?,
42            admin: proto.admin.parse_optional()?,
43            code_id: proto.code_id,
44            label: proto.label.parse_optional()?,
45            msg: proto.msg,
46            funds: proto
47                .funds
48                .into_iter()
49                .map(TryFrom::try_from)
50                .collect::<Result<_, _>>()?,
51        })
52    }
53}
54
55impl From<MsgInstantiateContract> for proto::cosmwasm::wasm::v1::MsgInstantiateContract {
56    fn from(msg: MsgInstantiateContract) -> proto::cosmwasm::wasm::v1::MsgInstantiateContract {
57        proto::cosmwasm::wasm::v1::MsgInstantiateContract {
58            sender: msg.sender.to_string(),
59            admin: msg.admin.map(|admin| admin.to_string()).unwrap_or_default(),
60            code_id: msg.code_id,
61            label: msg.label.unwrap_or_default(),
62            msg: msg.msg,
63            funds: msg.funds.into_iter().map(Into::into).collect(),
64        }
65    }
66}
67
68/// MsgInstantiateContractResponse return instantiation result data
69#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]
70pub struct MsgInstantiateContractResponse {
71    /// Address is the bech32 address of the new contract instance.
72    pub address: AccountId,
73
74    /// Data contains base64-encoded bytes to returned from the contract
75    pub data: Vec<u8>,
76}
77
78impl Msg for MsgInstantiateContractResponse {
79    type Proto = proto::cosmwasm::wasm::v1::MsgInstantiateContractResponse;
80}
81
82impl TryFrom<proto::cosmwasm::wasm::v1::MsgInstantiateContractResponse>
83    for MsgInstantiateContractResponse
84{
85    type Error = ErrorReport;
86
87    fn try_from(
88        proto: proto::cosmwasm::wasm::v1::MsgInstantiateContractResponse,
89    ) -> Result<MsgInstantiateContractResponse> {
90        Ok(MsgInstantiateContractResponse {
91            address: proto.address.parse()?,
92            data: proto.data,
93        })
94    }
95}
96
97impl From<MsgInstantiateContractResponse>
98    for proto::cosmwasm::wasm::v1::MsgInstantiateContractResponse
99{
100    fn from(
101        msg: MsgInstantiateContractResponse,
102    ) -> proto::cosmwasm::wasm::v1::MsgInstantiateContractResponse {
103        proto::cosmwasm::wasm::v1::MsgInstantiateContractResponse {
104            address: msg.address.to_string(),
105            data: msg.data,
106        }
107    }
108}