1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::addresses::Addr;
use crate::coin::Coin;
use crate::timestamp::Timestamp;
#[cfg(feature = "random")]
use crate::Binary;
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct Env {
pub block: BlockInfo,
/// Information on the transaction this message was executed in.
/// The field is unset when the `MsgExecuteContract`/`MsgInstantiateContract`/`MsgMigrateContract`
/// is not executed as part of a transaction.
pub transaction: Option<TransactionInfo>,
pub contract: ContractInfo,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct TransactionInfo {
/// The position of this transaction in the block. The first
/// transaction has index 0.
///
/// This allows you to get a unique transaction indentifier in this chain
/// using the pair (`env.block.height`, `env.transaction.index`).
///
pub index: u32,
#[serde(default)]
/// The hash of the current transaction bytes.
/// aka txhash or transaction_id
/// hash = sha256(tx_bytes)
pub hash: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct BlockInfo {
/// The height of a block is the number of blocks preceding it in the blockchain.
pub height: u64,
/// Absolute time of the block creation in seconds since the UNIX epoch (00:00:00 on 1970-01-01 UTC).
///
/// The source of this is the [BFT Time in Tendermint](https://github.com/tendermint/tendermint/blob/58dc1726/spec/consensus/bft-time.md),
/// which has the same nanosecond precision as the `Timestamp` type.
///
/// # Examples
///
/// Using chrono:
///
/// ```
/// # use secret_cosmwasm_std::{Addr, BlockInfo, ContractInfo, Env, MessageInfo, Timestamp, TransactionInfo};
/// # let env = Env {
/// # block: BlockInfo {
/// # height: 12_345,
/// # time: Timestamp::from_nanos(1_571_797_419_879_305_533),
/// # chain_id: "cosmos-testnet-14002".to_string(),
/// # },
/// # transaction: Some(TransactionInfo { index: 3, hash: "".to_string() }),
/// # contract: ContractInfo {
/// # address: Addr::unchecked("contract"),
/// # code_hash: "".to_string()
/// # },
/// # };
/// # extern crate chrono;
/// use chrono::NaiveDateTime;
/// use secret_cosmwasm_std::Binary;
/// let seconds = env.block.time.seconds();
/// let nsecs = env.block.time.subsec_nanos();
/// let dt = NaiveDateTime::from_timestamp(seconds as i64, nsecs as u32);
/// ```
///
/// Creating a simple millisecond-precision timestamp (as used in JavaScript):
///
/// ```
/// # use secret_cosmwasm_std::{Addr, BlockInfo, ContractInfo, Env, MessageInfo, Timestamp, TransactionInfo};
/// # use secret_cosmwasm_std::Binary;
/// # let env = Env {
/// # block: BlockInfo {
/// # height: 12_345,
/// # time: Timestamp::from_nanos(1_571_797_419_879_305_533),
/// # chain_id: "cosmos-testnet-14002".to_string(),
/// # },
/// # transaction: Some(TransactionInfo { index: 3, hash: "".to_string() }),
/// # contract: ContractInfo {
/// # address: Addr::unchecked("contract"),
/// # code_hash: "".to_string()
/// },
/// # };
/// let millis = env.block.time.nanos() / 1_000_000;
/// ```
pub time: Timestamp,
pub chain_id: String,
#[cfg(feature = "random")]
#[serde(skip_serializing_if = "Option::is_none")]
pub random: Option<Binary>,
}
/// Additional information from [MsgInstantiateContract] and [MsgExecuteContract], which is passed
/// along with the contract execution message into the `instantiate` and `execute` entry points.
///
/// It contains the essential info for authorization - identity of the call, and payment.
///
/// [MsgInstantiateContract]: https://github.com/CosmWasm/wasmd/blob/v0.15.0/x/wasm/internal/types/tx.proto#L47-L61
/// [MsgExecuteContract]: https://github.com/CosmWasm/wasmd/blob/v0.15.0/x/wasm/internal/types/tx.proto#L68-L78
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq)]
pub struct MessageInfo {
/// The `sender` field from `MsgInstantiateContract` and `MsgExecuteContract`.
/// You can think of this as the address that initiated the action (i.e. the message). What that
/// means exactly heavily depends on the application.
///
/// The x/wasm module ensures that the sender address signed the transaction or
/// is otherwise authorized to send the message.
///
/// Additional signers of the transaction that are either needed for other messages or contain unnecessary
/// signatures are not propagated into the contract.
pub sender: Addr,
/// The funds that are sent to the contract as part of `MsgInstantiateContract`
/// or `MsgExecuteContract`. The transfer is processed in bank before the contract
/// is executed such that the new balance is visible during contract execution.
pub funds: Vec<Coin>,
}
#[derive(Serialize, Deserialize, Clone, Debug, PartialEq, Eq, JsonSchema)]
pub struct ContractInfo {
pub address: Addr,
#[serde(default)]
pub code_hash: String,
}