inkpad_sandbox/
instantiate.rs

1//! Instantiate Entry
2use crate::{contract::GasMeter, transfer::TransferEntry, Sandbox};
3use inkpad_executor::{Error, Executor, Result, ReturnData};
4use inkpad_std::Vec;
5
6/// Instantiate Entry
7#[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    // Invoke (ink) method
18    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        // prepare contract
27        self.prepare(code_hash)?;
28
29        // invoke with provided `data`
30        let mut executor = Executor::new(code_hash, self)?;
31        let ret = executor.invoke(method, &[], self)?;
32
33        // Pop state
34        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        // flush data
40        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        // endowment: u64,
51        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, // endowment
58            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    /// Call other contract
67    pub fn call(
68        &mut self,
69        code_hash: [u8; 32],
70        // value: u64,
71        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}