ergo_lib_c_core/
contract.rs1use ergo_lib::{chain, ergoscript_compiler::script_env::ScriptEnv};
4
5use crate::{
6 address::ConstAddressPtr,
7 ergo_tree::{ConstErgoTreePtr, ErgoTree, ErgoTreePtr},
8 util::{const_ptr_as_ref, mut_ptr_as_mut},
9 Error,
10};
11
12#[derive(PartialEq, Eq, Debug, Clone)]
14pub struct Contract(pub(crate) chain::contract::Contract);
15pub type ContractPtr = *mut Contract;
16pub type ConstContractPtr = *const Contract;
17
18pub unsafe fn contract_new(
20 ergo_tree_ptr: ConstErgoTreePtr,
21 contract_out: *mut ContractPtr,
22) -> Result<(), Error> {
23 let ergo_tree = const_ptr_as_ref(ergo_tree_ptr, "ergo_tree_ptr")?;
24 let contract_out = mut_ptr_as_mut(contract_out, "contract_out")?;
25 *contract_out = Box::into_raw(Box::new(Contract(chain::contract::Contract::new(
26 ergo_tree.0.clone(),
27 ))));
28 Ok(())
29}
30
31pub unsafe fn contract_pay_to_address(
33 address_ptr: ConstAddressPtr,
34 contract_out: *mut ContractPtr,
35) -> Result<(), Error> {
36 let address = const_ptr_as_ref(address_ptr, "address_ptr")?;
37 let contract_out = mut_ptr_as_mut(contract_out, "contract_out")?;
38 let inner = chain::contract::Contract::pay_to_address(&address.0)?;
39 *contract_out = Box::into_raw(Box::new(Contract(inner)));
40 Ok(())
41}
42
43pub unsafe fn contract_compile(source: &str, contract_out: *mut ContractPtr) -> Result<(), Error> {
45 let contract_out = mut_ptr_as_mut(contract_out, "contract_out")?;
46 let inner = chain::contract::Contract::compile(source, ScriptEnv::new())?;
47 *contract_out = Box::into_raw(Box::new(Contract(inner)));
48 Ok(())
49}
50
51pub unsafe fn contract_ergo_tree(
53 contract_ptr: ConstContractPtr,
54 ergo_tree_out: *mut ErgoTreePtr,
55) -> Result<(), Error> {
56 let contract = const_ptr_as_ref(contract_ptr, "contract_ptr")?;
57 let ergo_tree_out = mut_ptr_as_mut(ergo_tree_out, "ergo_tree_out")?;
58 *ergo_tree_out = Box::into_raw(Box::new(ErgoTree(contract.0.ergo_tree())));
59 Ok(())
60}