ergo/
box_builder.rs

1//! `ErgoBoxCandidate` builder
2
3use ergo_lib_c_core::{
4    box_builder::*,
5    constant::{ConstConstantPtr, ConstantPtr},
6    contract::ConstContractPtr,
7    ergo_box::{BoxValuePtr, ConstBoxValuePtr, ErgoBoxCandidatePtr, NonMandatoryRegisterId},
8    token::{ConstTokenAmountPtr, ConstTokenIdPtr, ConstTokenPtr},
9    Error,
10};
11use std::{ffi::CStr, os::raw::c_char};
12
13use crate::{delete_ptr, ErrorPtr, ReturnNum, ReturnOption};
14
15/// Create builder with required box parameters:
16/// `value` - amount of money associated with the box
17/// `contract` - guarding contract, which should be evaluated to true in order
18/// to open(spend) this box
19/// `creation_height` - height when a transaction containing the box is created.
20/// It should not exceed height of the block, containing the transaction with this box.
21#[no_mangle]
22pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_new(
23    value_ptr: ConstBoxValuePtr,
24    contract_ptr: ConstContractPtr,
25    creation_height: u32,
26    builder_out: *mut ErgoBoxCandidateBuilderPtr,
27) {
28    #[allow(clippy::unwrap_used)]
29    ergo_box_candidate_builder_new(value_ptr, contract_ptr, creation_height, builder_out).unwrap()
30}
31
32/// Set minimal value (per byte of the serialized box size)
33#[no_mangle]
34pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_set_min_box_value_per_byte(
35    builder_mut: ErgoBoxCandidateBuilderPtr,
36    new_min_value_per_byte: u32,
37) {
38    #[allow(clippy::unwrap_used)]
39    ergo_box_candidate_builder_set_min_box_value_per_byte(builder_mut, new_min_value_per_byte)
40        .unwrap();
41}
42
43/// Get minimal value (per byte of the serialized box size)
44#[no_mangle]
45pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_min_box_value_per_byte(
46    builder_ptr: ConstErgoBoxCandidateBuilderPtr,
47) -> u32 {
48    #[allow(clippy::unwrap_used)]
49    ergo_box_candidate_builder_min_box_value_per_byte(builder_ptr).unwrap()
50}
51
52/// Set new box value
53#[no_mangle]
54pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_set_value(
55    builder_mut: ErgoBoxCandidateBuilderPtr,
56    value_ptr: ConstBoxValuePtr,
57) {
58    #[allow(clippy::unwrap_used)]
59    ergo_box_candidate_builder_set_value(builder_mut, value_ptr).unwrap();
60}
61
62/// Get box value
63#[no_mangle]
64pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_value(
65    builder_ptr: ConstErgoBoxCandidateBuilderPtr,
66    value_out: *mut BoxValuePtr,
67) {
68    #[allow(clippy::unwrap_used)]
69    ergo_box_candidate_builder_value(builder_ptr, value_out).unwrap();
70}
71
72/// Calculate serialized box size(in bytes)
73#[no_mangle]
74pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_calc_box_size_bytes(
75    builder_ptr: ConstErgoBoxCandidateBuilderPtr,
76) -> ReturnNum<usize> {
77    match ergo_box_candidate_builder_calc_box_size_bytes(builder_ptr) {
78        Ok(value) => ReturnNum {
79            value,
80            error: std::ptr::null_mut(),
81        },
82        Err(e) => ReturnNum {
83            value: 0, // Just a dummy value
84            error: Error::c_api_from(Err(e)),
85        },
86    }
87}
88
89/// Calculate minimal box value for the current box serialized size(in bytes)
90#[no_mangle]
91pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_calc_min_box_value(
92    builder_ptr: ConstErgoBoxCandidateBuilderPtr,
93    value_out: *mut BoxValuePtr,
94) -> ErrorPtr {
95    let res = ergo_box_candidate_builder_calc_min_box_value(builder_ptr, value_out);
96    Error::c_api_from(res)
97}
98
99/// Set register with a given id (R4-R9) to the given value
100#[no_mangle]
101pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_set_register_value(
102    builder_mut: ErgoBoxCandidateBuilderPtr,
103    register_id: NonMandatoryRegisterId,
104    constant_ptr: ConstConstantPtr,
105) {
106    #[allow(clippy::unwrap_used)]
107    ergo_box_candidate_builder_set_register_value(builder_mut, register_id, constant_ptr).unwrap();
108}
109
110/// Returns register value for the given register id (R4-R9), or None if the register is empty
111#[no_mangle]
112pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_register_value(
113    builder_ptr: ConstErgoBoxCandidateBuilderPtr,
114    register_id: NonMandatoryRegisterId,
115    constant_out: *mut ConstantPtr,
116) -> ReturnOption {
117    match ergo_box_candidate_builder_register_value(builder_ptr, register_id, constant_out) {
118        Ok(is_some) => ReturnOption {
119            is_some,
120            error: std::ptr::null_mut(),
121        },
122        Err(e) => ReturnOption {
123            is_some: false, // Just a dummy value
124            error: Error::c_api_from(Err(e)),
125        },
126    }
127}
128
129/// Delete register value(make register empty) for the given register id (R4-R9)
130#[no_mangle]
131pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_delete_register_value(
132    builder_mut: ErgoBoxCandidateBuilderPtr,
133    register_id: NonMandatoryRegisterId,
134) {
135    #[allow(clippy::unwrap_used)]
136    ergo_box_candidate_builder_delete_register_value(builder_mut, register_id).unwrap();
137}
138
139/// Mint token, as defined in <https://github.com/ergoplatform/eips/blob/master/eip-0004.md>
140/// `token` - token id(box id of the first input box in transaction) and token amount,
141/// `token_name` - token name (will be encoded in R4),
142/// `token_desc` - token description (will be encoded in R5),
143/// `num_decimals` - number of decimals (will be encoded in R6)
144#[no_mangle]
145pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_mint_token(
146    builder_mut: ErgoBoxCandidateBuilderPtr,
147    token_ptr: ConstTokenPtr,
148    token_name: *const c_char,
149    token_desc: *const c_char,
150    num_decimals: usize,
151) {
152    let token_name = CStr::from_ptr(token_name).to_string_lossy();
153    let token_desc = CStr::from_ptr(token_desc).to_string_lossy();
154    #[allow(clippy::unwrap_used)]
155    ergo_box_candidate_builder_mint_token(
156        builder_mut,
157        token_ptr,
158        &token_name,
159        &token_desc,
160        num_decimals,
161    )
162    .unwrap();
163}
164
165/// Add given token id and token amount
166#[no_mangle]
167pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_add_token(
168    builder_mut: ErgoBoxCandidateBuilderPtr,
169    token_id_ptr: ConstTokenIdPtr,
170    token_amount_ptr: ConstTokenAmountPtr,
171) {
172    #[allow(clippy::unwrap_used)]
173    ergo_box_candidate_builder_add_token(builder_mut, token_id_ptr, token_amount_ptr).unwrap();
174}
175
176/// Build the box candidate
177#[no_mangle]
178pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_build(
179    builder_ptr: ConstErgoBoxCandidateBuilderPtr,
180    ergo_box_candidate_out: *mut ErgoBoxCandidatePtr,
181) -> ErrorPtr {
182    let res = ergo_box_candidate_builder_build(builder_ptr, ergo_box_candidate_out);
183    Error::c_api_from(res)
184}
185
186/// Drop `ErgoBoxCandidateBuilder`
187#[no_mangle]
188pub unsafe extern "C" fn ergo_lib_ergo_box_candidate_builder_delete(
189    ptr: ErgoBoxCandidateBuilderPtr,
190) {
191    delete_ptr(ptr)
192}