ergo_lib_c_core/
contract.rs

1//! Contract, for easier ErgoTree generation
2
3use 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/// Defines the contract(script) that will be guarding box contents
13#[derive(PartialEq, Eq, Debug, Clone)]
14pub struct Contract(pub(crate) chain::contract::Contract);
15pub type ContractPtr = *mut Contract;
16pub type ConstContractPtr = *const Contract;
17
18/// Create new contract from ErgoTree
19pub 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
31/// Create new contract that allow spending of the guarded box by a given recipient
32pub 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
43/// Compiles a contract from ErgoScript source code
44pub 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
51/// Get the ErgoTree of the contract
52pub 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}