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
use serde::Serialize;
use schemars::JsonSchema;
use cosmwasm::mock::{dependencies, MockApi, MockStorage};
use cosmwasm::serde::to_vec;
use cosmwasm::traits::{Api, Storage};
use cosmwasm::types::{ContractResult, Env, QueryResult};
use crate::calls::{call_handle, call_init, call_query};
use crate::compatability::check_wasm;
use crate::instance::Instance;
static DEFAULT_GAS_LIMIT: u64 = 500_000;
pub fn mock_instance(wasm: &[u8]) -> Instance<MockStorage, MockApi> {
mock_instance_with_gas_limit(wasm, DEFAULT_GAS_LIMIT)
}
pub fn mock_instance_with_gas_limit(wasm: &[u8], gas_limit: u64) -> Instance<MockStorage, MockApi> {
check_wasm(wasm).unwrap();
let deps = dependencies(20);
Instance::from_code(wasm, deps, gas_limit).unwrap()
}
pub fn init<S: Storage + 'static, A: Api + 'static, T: Serialize + JsonSchema>(
instance: &mut Instance<S, A>,
env: Env,
msg: T,
) -> ContractResult {
match to_vec(&msg) {
Err(e) => ContractResult::Err(e.to_string()),
Ok(serialized_msg) => call_init(instance, &env, &serialized_msg).unwrap(),
}
}
pub fn handle<S: Storage + 'static, A: Api + 'static, T: Serialize + JsonSchema>(
instance: &mut Instance<S, A>,
env: Env,
msg: T,
) -> ContractResult {
match to_vec(&msg) {
Err(e) => ContractResult::Err(e.to_string()),
Ok(serialized_msg) => call_handle(instance, &env, &serialized_msg).unwrap(),
}
}
pub fn query<S: Storage + 'static, A: Api + 'static, T: Serialize + JsonSchema>(
instance: &mut Instance<S, A>,
msg: T,
) -> QueryResult {
match to_vec(&msg) {
Err(e) => QueryResult::Err(e.to_string()),
Ok(serialized_msg) => call_query(instance, &serialized_msg).unwrap(),
}
}
pub fn test_io<S: Storage + 'static, A: Api + 'static>(instance: &mut Instance<S, A>) {
let sizes: Vec<usize> = vec![0, 1, 3, 10, 200, 2000, 5 * 1024];
let bytes: Vec<u8> = vec![0x00, 0xA5, 0xFF];
for size in sizes.into_iter() {
for byte in bytes.iter() {
let original = vec![*byte; size];
let wasm_ptr = instance
.allocate(&original)
.expect("Could not allocate memory");
let wasm_data = instance.memory(wasm_ptr);
assert_eq!(
original, wasm_data,
"failed for size {}; expected: {:?}; actual: {:?}",
size, original, wasm_data
);
instance
.deallocate(wasm_ptr)
.expect("Could not deallocate memory");
}
}
}