clone_cw_multi_test/wasm_emulation/
input.rs1use 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 .filter(|(k, _)| k.len() >= namespace_len && k[..namespace_len] == namespace)
31 .cloned()
32 .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}