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);