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
use std::path::PathBuf;

use casper_types::{
    account::AccountHash, bytesrepr::FromBytes, CLTyped, ContractHash, RuntimeArgs,
};

use crate::{utils::DeploySource, TestEnv};

pub struct TestContract {
    env: TestEnv,
    name: String,
    contract_owner: AccountHash,
}

impl TestContract {
    pub fn new(
        env: &TestEnv,
        wasm: &str,
        name: &str,
        sender: AccountHash,
        mut args: RuntimeArgs,
        time: u64,
    ) -> TestContract {
        let session_code = PathBuf::from(wasm);
        args.insert("contract_name", name).unwrap();
        env.run(sender, DeploySource::Code(session_code), args, time);

        TestContract {
            env: env.clone(),
            name: String::from(name),
            contract_owner: sender,
        }
    }

    pub fn query_dictionary<T: CLTyped + FromBytes>(
        &self,
        dict_name: &str,
        key: String,
    ) -> Option<T> {
        self.env
            .query_dictionary(self.contract_hash(), dict_name, key)
    }

    pub fn query_named_key<T: CLTyped + FromBytes>(&self, key: String) -> T {
        let contract_name = format!("{}_contract_hash", self.name);
        self.env
            .query_account_named_key(self.contract_owner, &[contract_name, key])
    }

    pub fn contract_hash(&self) -> [u8; 32] {
        let key = format!("{}_contract_hash_wrapped", self.name);
        self.env
            .query_account_named_key(self.contract_owner, &[key])
    }
    pub fn package_hash(&self) -> [u8; 32] {
        let key = format!("{}_package_hash_wrapped", self.name);
        self.env
            .query_account_named_key(self.contract_owner, &[key])
    }

    pub fn call_contract(
        &self,
        sender: AccountHash,
        entry_point: &str,
        session_args: RuntimeArgs,
        time: u64,
    ) {
        let session_code = DeploySource::ByContractHash {
            hash: ContractHash::new(self.contract_hash()),
            method: entry_point.to_string(),
        };
        self.env.run(sender, session_code, session_args, time);
    }
}