clone_cw_multi_test/wasm_emulation/
input.rs

1use std::collections::HashMap;
2
3use cosmwasm_std::Addr;
4use cosmwasm_std::{Env, MessageInfo, Reply};
5
6use cw_utils::NativeBalance;
7
8use crate::prefixed_storage::get_full_contract_storage_namespace;
9use crate::wasm::{CodeData, ContractData};
10
11use super::contract::WasmContract;
12
13#[derive(Debug, Clone, Default)]
14pub struct WasmStorage {
15    pub contracts: HashMap<String, ContractData>,
16    pub codes: HashMap<usize, WasmContract>,
17    pub code_data: HashMap<usize, CodeData>,
18    pub storage: Vec<(Vec<u8>, Vec<u8>)>,
19}
20
21impl WasmStorage {
22    pub fn get_contract_storage(&self, contract_addr: &Addr) -> Vec<(Vec<u8>, Vec<u8>)> {
23        let namespace =
24            get_full_contract_storage_namespace(&Addr::unchecked(contract_addr)).to_vec();
25        let namespace_len = namespace.len();
26        let keys: Vec<(Vec<u8>, Vec<u8>)> = self
27            .storage
28            .iter()
29            // We filter only value in this namespace
30            .filter(|(k, _)| k.len() >= namespace_len && k[..namespace_len] == namespace)
31            .cloned()
32            // We remove the namespace prefix from the key
33            .map(|(k, value)| (k[namespace_len..].to_vec(), value))
34            .collect();
35
36        keys
37    }
38}
39
40#[derive(Debug, Clone, Default)]
41pub struct BankStorage {
42    pub storage: Vec<(Addr, NativeBalance)>,
43}
44
45#[derive(Clone, Default)]
46pub struct QuerierStorage {
47    pub wasm: WasmStorage,
48    pub bank: BankStorage,
49}
50
51#[derive(Debug)]
52pub struct InstanceArguments {
53    pub function: WasmFunction,
54    pub init_storage: Vec<(Vec<u8>, Vec<u8>)>,
55}
56
57#[derive(Debug)]
58pub enum WasmFunction {
59    Execute(ExecuteArgs),
60    Instantiate(InstantiateArgs),
61    Query(QueryArgs),
62    Sudo(SudoArgs),
63    Reply(ReplyArgs),
64    Migrate(MigrateArgs),
65}
66
67#[derive(Debug)]
68pub struct ExecuteArgs {
69    pub env: Env,
70    pub info: MessageInfo,
71    pub msg: Vec<u8>,
72}
73
74#[derive(Debug)]
75pub struct InstantiateArgs {
76    pub env: Env,
77    pub info: MessageInfo,
78    pub msg: Vec<u8>,
79}
80
81#[derive(Debug)]
82pub struct QueryArgs {
83    pub env: Env,
84    pub msg: Vec<u8>,
85}
86
87#[derive(Debug)]
88pub struct SudoArgs {
89    pub env: Env,
90    pub msg: Vec<u8>,
91}
92
93#[derive(Debug)]
94pub struct ReplyArgs {
95    pub env: Env,
96    pub reply: Reply,
97}
98
99#[derive(Debug)]
100pub struct MigrateArgs {
101    pub env: Env,
102    pub msg: Vec<u8>,
103}
104
105impl WasmFunction {
106    pub fn get_address(&self) -> Addr {
107        match self {
108            WasmFunction::Execute(ExecuteArgs { env, .. }) => env.contract.address.clone(),
109            WasmFunction::Instantiate(InstantiateArgs { env, .. }) => env.contract.address.clone(),
110            WasmFunction::Query(QueryArgs { env, .. }) => env.contract.address.clone(),
111            WasmFunction::Reply(ReplyArgs { env, .. }) => env.contract.address.clone(),
112            WasmFunction::Sudo(SudoArgs { env, .. }) => env.contract.address.clone(),
113            WasmFunction::Migrate(MigrateArgs { env, .. }) => env.contract.address.clone(),
114        }
115    }
116}