1use ergo_lib_c_core::{
4    collections::{CollectionPtr, ConstCollectionPtr},
5    data_input::DataInput,
6    ergo_box::{ErgoBox, ErgoBoxCandidate},
7    ergo_state_ctx::ConstErgoStateContextPtr,
8    input::{Input, UnsignedInput},
9    reduced::ConstPropositionsPtr,
10    transaction::*,
11    util::ByteArray,
12    Error, ErrorPtr,
13};
14
15use paste::paste;
16use std::{
17    ffi::{CStr, CString},
18    os::raw::c_char,
19};
20
21use crate::{delete_ptr, ReturnOption};
22
23type ConstByteArraysPtr = ConstCollectionPtr<ByteArray>;
26type DataInputsPtr = CollectionPtr<DataInput>;
27type InputsPtr = CollectionPtr<Input>;
28type UnsignedInputsPtr = CollectionPtr<UnsignedInput>;
29type ErgoBoxCandidatesPtr = CollectionPtr<ErgoBoxCandidate>;
30type ErgoBoxesPtr = CollectionPtr<ErgoBox>;
31
32#[no_mangle]
36pub unsafe extern "C" fn ergo_lib_commitment_hint_delete(ptr: CommitmentHintPtr) {
37    delete_ptr(ptr)
38}
39
40#[no_mangle]
44pub unsafe extern "C" fn ergo_lib_hints_bag_empty(hints_bag_out: *mut HintsBagPtr) {
45    #[allow(clippy::unwrap_used)]
46    hints_bag_empty(hints_bag_out).unwrap();
47}
48
49#[no_mangle]
51pub unsafe extern "C" fn ergo_lib_hints_bag_add_commitment(
52    hints_bag_mut: HintsBagPtr,
53    hint_ptr: ConstCommitmentHintPtr,
54) {
55    #[allow(clippy::unwrap_used)]
56    hints_bag_add_commitment(hints_bag_mut, hint_ptr).unwrap();
57}
58
59#[no_mangle]
61pub unsafe extern "C" fn ergo_lib_hints_bag_len(hints_bag_ptr: ConstHintsBagPtr) -> usize {
62    #[allow(clippy::unwrap_used)]
63    hints_bag_len(hints_bag_ptr).unwrap()
64}
65
66#[no_mangle]
68pub unsafe extern "C" fn ergo_lib_hints_bag_get(
69    hints_bag_ptr: ConstHintsBagPtr,
70    index: usize,
71    hint_out: *mut CommitmentHintPtr,
72) -> ReturnOption {
73    match hints_bag_get(hints_bag_ptr, index, hint_out) {
74        Ok(is_some) => ReturnOption {
75            is_some,
76            error: std::ptr::null_mut(),
77        },
78        Err(e) => ReturnOption {
79            is_some: false, error: Error::c_api_from(Err(e)),
81        },
82    }
83}
84
85#[no_mangle]
87pub unsafe extern "C" fn ergo_lib_hints_bag_delete(ptr: HintsBagPtr) {
88    delete_ptr(ptr)
89}
90
91#[no_mangle]
95pub unsafe extern "C" fn ergo_lib_transaction_hints_bag_empty(
96    transaction_hints_bag_out: *mut TransactionHintsBagPtr,
97) {
98    #[allow(clippy::unwrap_used)]
99    transaction_hints_bag_empty(transaction_hints_bag_out).unwrap();
100}
101
102#[no_mangle]
104pub unsafe extern "C" fn ergo_lib_transaction_hints_bag_add_hints_for_input(
105    transaction_hints_bag_mut: TransactionHintsBagPtr,
106    index: usize,
107    hints_bag_ptr: ConstHintsBagPtr,
108) {
109    #[allow(clippy::unwrap_used)]
110    transaction_hints_bag_add_hints_for_input(transaction_hints_bag_mut, index, hints_bag_ptr)
111        .unwrap();
112}
113
114#[no_mangle]
116pub unsafe extern "C" fn ergo_lib_transaction_hints_bag_all_hints_for_input(
117    transaction_hints_bag_ptr: ConstTransactionHintsBagPtr,
118    index: usize,
119    hints_bag_out: *mut HintsBagPtr,
120) {
121    #[allow(clippy::unwrap_used)]
122    transaction_hints_bag_all_hints_for_input(transaction_hints_bag_ptr, index, hints_bag_out)
123        .unwrap();
124}
125
126#[no_mangle]
128pub unsafe extern "C" fn ergo_lib_transaction_extract_hints(
129    signed_transaction_ptr: ConstTransactionPtr,
130    state_context_ptr: ConstErgoStateContextPtr,
131    boxes_to_spend_ptr: ConstCollectionPtr<ErgoBox>,
132    data_boxes_ptr: ConstCollectionPtr<ErgoBox>,
133    real_propositions_ptr: ConstPropositionsPtr,
134    simulated_propositions_ptr: ConstPropositionsPtr,
135    transaction_hints_bag_out: *mut TransactionHintsBagPtr,
136) -> ErrorPtr {
137    let res = transaction_extract_hints(
138        signed_transaction_ptr,
139        state_context_ptr,
140        boxes_to_spend_ptr,
141        data_boxes_ptr,
142        real_propositions_ptr,
143        simulated_propositions_ptr,
144        transaction_hints_bag_out,
145    );
146    Error::c_api_from(res)
147}
148
149#[no_mangle]
151pub unsafe extern "C" fn ergo_lib_transaction_hints_bag_delete(ptr: TransactionHintsBagPtr) {
152    delete_ptr(ptr)
153}
154
155#[no_mangle]
159pub unsafe extern "C" fn ergo_lib_unsigned_tx_id(
160    unsigned_tx_ptr: ConstUnsignedTransactionPtr,
161    tx_id_out: *mut TxIdPtr,
162) {
163    #[allow(clippy::unwrap_used)]
164    unsigned_tx_id(unsigned_tx_ptr, tx_id_out).unwrap();
165}
166
167#[no_mangle]
169pub unsafe extern "C" fn ergo_lib_unsigned_tx_inputs(
170    unsigned_tx_ptr: ConstUnsignedTransactionPtr,
171    unsigned_inputs_out: *mut UnsignedInputsPtr,
172) {
173    #[allow(clippy::unwrap_used)]
174    unsigned_tx_inputs(unsigned_tx_ptr, unsigned_inputs_out).unwrap();
175}
176
177#[no_mangle]
179pub unsafe extern "C" fn ergo_lib_unsigned_tx_data_inputs(
180    unsigned_tx_ptr: ConstUnsignedTransactionPtr,
181    data_inputs_out: *mut DataInputsPtr,
182) {
183    #[allow(clippy::unwrap_used)]
184    unsigned_tx_data_inputs(unsigned_tx_ptr, data_inputs_out).unwrap();
185}
186
187#[no_mangle]
189pub unsafe extern "C" fn ergo_lib_unsigned_tx_output_candidates(
190    unsigned_tx_ptr: ConstUnsignedTransactionPtr,
191    ergo_box_candidates_out: *mut ErgoBoxCandidatesPtr,
192) {
193    #[allow(clippy::unwrap_used)]
194    unsigned_tx_output_candidates(unsigned_tx_ptr, ergo_box_candidates_out).unwrap();
195}
196
197#[no_mangle]
200pub unsafe extern "C" fn ergo_lib_unsigned_tx_from_json(
201    json_str: *const c_char,
202    unsigned_tx_out: *mut UnsignedTransactionPtr,
203) -> ErrorPtr {
204    let json = CStr::from_ptr(json_str).to_string_lossy();
205    let res = unsigned_tx_from_json(&json, unsigned_tx_out);
206    Error::c_api_from(res)
207}
208
209#[no_mangle]
211pub unsafe extern "C" fn ergo_lib_unsigned_tx_to_json(
212    unsigned_tx_ptr: ConstUnsignedTransactionPtr,
213    _json_str: *mut *const c_char,
214) -> ErrorPtr {
215    #[allow(clippy::unwrap_used)]
216    let res = match unsigned_tx_to_json(unsigned_tx_ptr) {
217        Ok(s) => {
218            *_json_str = CString::new(s).unwrap().into_raw();
219            Ok(())
220        }
221        Err(e) => Err(e),
222    };
223    Error::c_api_from(res)
224}
225
226#[no_mangle]
228pub unsafe extern "C" fn ergo_lib_unsigned_tx_to_json_eip12(
229    unsigned_tx_ptr: ConstUnsignedTransactionPtr,
230    _json_str: *mut *const c_char,
231) -> ErrorPtr {
232    #[allow(clippy::unwrap_used)]
233    let res = match unsigned_tx_to_json_eip12(unsigned_tx_ptr) {
234        Ok(s) => {
235            *_json_str = CString::new(s).unwrap().into_raw();
236            Ok(())
237        }
238        Err(e) => Err(e),
239    };
240    Error::c_api_from(res)
241}
242
243#[no_mangle]
245pub unsafe extern "C" fn ergo_lib_unsigned_tx_delete(ptr: UnsignedTransactionPtr) {
246    delete_ptr(ptr)
247}
248
249#[no_mangle]
254pub unsafe extern "C" fn ergo_lib_tx_from_unsigned_tx(
255    unsigned_tx_ptr: ConstUnsignedTransactionPtr,
256    proofs_ptr: ConstByteArraysPtr,
257    tx_out: *mut TransactionPtr,
258) -> ErrorPtr {
259    let res = tx_from_unsigned_tx(unsigned_tx_ptr, proofs_ptr, tx_out);
260    Error::c_api_from(res)
261}
262
263#[no_mangle]
265pub unsafe extern "C" fn ergo_lib_tx_id(tx_ptr: ConstTransactionPtr, tx_id_out: *mut TxIdPtr) {
266    #[allow(clippy::unwrap_used)]
267    tx_id(tx_ptr, tx_id_out).unwrap();
268}
269
270#[no_mangle]
271pub unsafe extern "C" fn ergo_lib_tx_inputs(
272    tx_ptr: ConstTransactionPtr,
273    inputs_out: *mut InputsPtr,
274) {
275    #[allow(clippy::unwrap_used)]
276    tx_inputs(tx_ptr, inputs_out).unwrap();
277}
278
279#[no_mangle]
280pub unsafe extern "C" fn ergo_lib_tx_data_inputs(
281    tx_ptr: ConstTransactionPtr,
282    data_inputs_out: *mut DataInputsPtr,
283) {
284    #[allow(clippy::unwrap_used)]
285    tx_data_inputs(tx_ptr, data_inputs_out).unwrap();
286}
287
288#[no_mangle]
289pub unsafe extern "C" fn ergo_lib_tx_output_candidates(
290    tx_ptr: ConstTransactionPtr,
291    ergo_box_candidates_out: *mut ErgoBoxCandidatesPtr,
292) {
293    #[allow(clippy::unwrap_used)]
294    tx_output_candidates(tx_ptr, ergo_box_candidates_out).unwrap();
295}
296
297#[no_mangle]
298pub unsafe extern "C" fn ergo_lib_tx_outputs(
299    tx_ptr: ConstTransactionPtr,
300    ergo_box_out: *mut ErgoBoxesPtr,
301) {
302    #[allow(clippy::unwrap_used)]
303    tx_outputs(tx_ptr, ergo_box_out).unwrap();
304}
305
306#[no_mangle]
309pub unsafe extern "C" fn ergo_lib_tx_from_json(
310    json_str: *const c_char,
311    tx_out: *mut TransactionPtr,
312) -> ErrorPtr {
313    let json = CStr::from_ptr(json_str).to_string_lossy();
314    let res = tx_from_json(&json, tx_out);
315    Error::c_api_from(res)
316}
317
318#[no_mangle]
320pub unsafe extern "C" fn ergo_lib_tx_to_json(
321    tx_ptr: ConstTransactionPtr,
322    _json_str: *mut *const c_char,
323) -> ErrorPtr {
324    #[allow(clippy::unwrap_used)]
325    let res = match tx_to_json(tx_ptr) {
326        Ok(s) => {
327            *_json_str = CString::new(s).unwrap().into_raw();
328            Ok(())
329        }
330        Err(e) => Err(e),
331    };
332    Error::c_api_from(res)
333}
334
335#[no_mangle]
337pub unsafe extern "C" fn ergo_lib_tx_to_json_eip12(
338    tx_ptr: ConstTransactionPtr,
339    _json_str: *mut *const c_char,
340) -> ErrorPtr {
341    #[allow(clippy::unwrap_used)]
342    let res = match tx_to_json_eip12(tx_ptr) {
343        Ok(s) => {
344            *_json_str = CString::new(s).unwrap().into_raw();
345            Ok(())
346        }
347        Err(e) => Err(e),
348    };
349    Error::c_api_from(res)
350}
351
352#[no_mangle]
353pub unsafe extern "C" fn ergo_lib_tx_validate(
354    tx_ptr: ConstTransactionPtr,
355    state_context_ptr: ConstErgoStateContextPtr,
356    boxes_to_spend_ptr: ConstCollectionPtr<ErgoBox>,
357    data_boxes_ptr: ConstCollectionPtr<ErgoBox>,
358) -> ErrorPtr {
359    Error::c_api_from(tx_validate(
360        tx_ptr,
361        state_context_ptr,
362        boxes_to_spend_ptr,
363        data_boxes_ptr,
364    ))
365}
366#[no_mangle]
368pub unsafe extern "C" fn ergo_lib_tx_delete(ptr: TransactionPtr) {
369    delete_ptr(ptr)
370}
371#[no_mangle]
375pub unsafe extern "C" fn ergo_lib_tx_id_from_str(
376    str: *const c_char,
377    tx_id_out: *mut TxIdPtr,
378) -> ErrorPtr {
379    let str = CStr::from_ptr(str).to_string_lossy();
380    let res = tx_id_from_str(&str, tx_id_out);
381    Error::c_api_from(res)
382}
383
384#[no_mangle]
386pub unsafe extern "C" fn ergo_lib_tx_id_to_str(
387    tx_id_ptr: ConstTxIdPtr,
388    _str: *mut *const c_char,
389) -> ErrorPtr {
390    #[allow(clippy::unwrap_used)]
391    let res = match tx_id_to_str(tx_id_ptr) {
392        Ok(s) => {
393            *_str = CString::new(s).unwrap().into_raw();
394            Ok(())
395        }
396        Err(e) => Err(e),
397    };
398    Error::c_api_from(res)
399}
400
401#[no_mangle]
403pub unsafe extern "C" fn ergo_lib_tx_id_delete(ptr: TxIdPtr) {
404    delete_ptr(ptr)
405}
406
407make_ffi_eq!(TxId);