inkpad_sandbox/
instantiate.rs1use crate::{contract::GasMeter, transfer::TransferEntry, Sandbox};
3use inkpad_executor::{Error, Executor, Result, ReturnData};
4use inkpad_std::Vec;
5
6#[derive(Default)]
8pub struct InstantiateEntry {
9 pub code_hash: [u8; 32],
10 pub endowment: u64,
11 pub data: Vec<u8>,
12 pub gas_left: u64,
13 pub salt: Vec<u8>,
14}
15
16impl Sandbox {
17 pub fn invoke(
19 &mut self,
20 code_hash: [u8; 32],
21 method: &str,
22 data: Vec<u8>,
23 ) -> Result<([u8; 32], ReturnData)> {
24 self.input = Some(data);
25
26 self.prepare(code_hash)?;
28
29 let mut executor = Executor::new(code_hash, self)?;
31 let ret = executor.invoke(method, &[], self)?;
32
33 let mut cache_mut = self.cache.borrow_mut();
35 cache_mut.top().ok_or(Error::StateNotFound)?;
36 cache_mut.flush().ok_or(Error::FlushDataFailed)?;
37 drop(cache_mut);
38
39 self.cache
41 .borrow_mut()
42 .flush()
43 .ok_or(Error::FlushDataFailed)?;
44 Ok((code_hash, ret.data))
45 }
46
47 pub fn instantiate(
48 &mut self,
49 code_hash: [u8; 32],
50 gas_meter: &mut GasMeter,
52 data: Vec<u8>,
53 salt: &[u8],
54 ) -> Result<([u8; 32], ReturnData)> {
55 self.ext.instantiates.push(InstantiateEntry {
56 code_hash,
57 endowment: 3, data: data.to_vec(),
59 gas_left: gas_meter.gas_left,
60 salt: salt.to_vec(),
61 });
62
63 self.invoke(code_hash, "deploy", data)
64 }
65
66 pub fn call(
68 &mut self,
69 code_hash: [u8; 32],
70 data: Vec<u8>,
72 ) -> Result<ReturnData> {
73 self.ext.transfers.push(TransferEntry {
74 to: code_hash,
75 value: 0,
76 data: data.clone(),
77 });
78
79 self.invoke(code_hash, "call", data).map(|v| v.1)
80 }
81}