ergo/
tx_builder.rs

1//! Unsigned transaction builder
2
3use ergo_lib_c_core::{
4    address::{AddressPtr, ConstAddressPtr},
5    box_selector::{BoxSelectionPtr, ConstBoxSelectionPtr},
6    collections::{CollectionPtr, ConstCollectionPtr},
7    context_extension::ContextExtensionPtr,
8    data_input::DataInput,
9    ergo_box::{BoxIdPtr, BoxValuePtr, ConstBoxValuePtr, ErgoBoxCandidate},
10    token::Token,
11    transaction::UnsignedTransactionPtr,
12    tx_builder::*,
13    Error, ErrorPtr,
14};
15
16use crate::delete_ptr;
17
18/// Suggested transaction fee (semi-default value used across wallets and dApps as of Oct 2020)
19#[no_mangle]
20pub unsafe extern "C" fn ergo_lib_tx_builder_suggested_tx_fee(value_out: *mut BoxValuePtr) {
21    #[allow(clippy::unwrap_used)]
22    tx_builder_suggested_tx_fee(value_out).unwrap();
23}
24
25/// Creates new TxBuilder
26/// `box_selection` - selected input boxes
27/// `output_candidates` - output boxes to be "created" in this transaction,
28/// `current_height` - chain height that will be used in additionally created boxes (change, miner's fee, etc.),
29/// `fee_amount` - miner's fee,
30/// `change_address` - change (inputs - outputs) will be sent to this address,
31/// will be given to miners,
32#[no_mangle]
33pub unsafe extern "C" fn ergo_lib_tx_builder_new(
34    box_selection_ptr: ConstBoxSelectionPtr,
35    output_candidates_ptr: ConstCollectionPtr<ErgoBoxCandidate>,
36    current_height: u32,
37    fee_amount_ptr: ConstBoxValuePtr,
38    change_address_ptr: ConstAddressPtr,
39    tx_builder_out: *mut TxBuilderPtr,
40) {
41    #[allow(clippy::unwrap_used)]
42    tx_builder_new(
43        box_selection_ptr,
44        output_candidates_ptr,
45        current_height,
46        fee_amount_ptr,
47        change_address_ptr,
48        tx_builder_out,
49    )
50    .unwrap();
51}
52
53/// Set transaction's data inputs
54#[no_mangle]
55pub unsafe extern "C" fn ergo_lib_tx_builder_set_data_inputs(
56    tx_builder_mut: TxBuilderPtr,
57    data_inputs_ptr: ConstCollectionPtr<DataInput>,
58) {
59    #[allow(clippy::unwrap_used)]
60    tx_builder_set_data_inputs(tx_builder_mut, data_inputs_ptr).unwrap();
61}
62
63/// Set context extension for a given input
64#[no_mangle]
65pub unsafe extern "C" fn ergo_lib_tx_builder_set_context_extension(
66    tx_builder_mut: TxBuilderPtr,
67    box_id_ptr: BoxIdPtr,
68    ctx_ext_ptr: ContextExtensionPtr,
69) {
70    #[allow(clippy::unwrap_used)]
71    tx_builder_set_context_extension(tx_builder_mut, box_id_ptr, ctx_ext_ptr).unwrap();
72}
73
74/// Permits the burn of the given token amount, i.e. allows this token amount to be omitted in the outputs
75#[no_mangle]
76pub unsafe extern "C" fn ergo_lib_tx_builder_set_token_burn_permit(
77    tx_builder_mut: TxBuilderPtr,
78    target_tokens_ptr: ConstCollectionPtr<Token>,
79) {
80    #[allow(clippy::unwrap_used)]
81    tx_builder_set_token_burn_permit(tx_builder_mut, target_tokens_ptr).unwrap();
82}
83
84/// Build the unsigned transaction
85#[no_mangle]
86pub unsafe extern "C" fn ergo_lib_tx_builder_build(
87    tx_builder_ptr: ConstTxBuilderPtr,
88    unsigned_transaction_out: *mut UnsignedTransactionPtr,
89) -> ErrorPtr {
90    let res = tx_builder_build(tx_builder_ptr, unsigned_transaction_out);
91    Error::c_api_from(res)
92}
93
94/// Get box selection
95#[no_mangle]
96pub unsafe extern "C" fn ergo_lib_tx_builder_box_selection(
97    tx_builder_ptr: ConstTxBuilderPtr,
98    box_selection_out: *mut BoxSelectionPtr,
99) {
100    #[allow(clippy::unwrap_used)]
101    tx_builder_box_selection(tx_builder_ptr, box_selection_out).unwrap();
102}
103
104/// Get data inputs
105#[no_mangle]
106pub unsafe extern "C" fn ergo_lib_tx_builder_data_inputs(
107    tx_builder_ptr: ConstTxBuilderPtr,
108    data_inputs_out: *mut CollectionPtr<DataInput>,
109) {
110    #[allow(clippy::unwrap_used)]
111    tx_builder_data_inputs(tx_builder_ptr, data_inputs_out).unwrap();
112}
113
114/// Get outputs EXCLUDING fee and change
115#[no_mangle]
116pub unsafe extern "C" fn ergo_lib_tx_builder_output_candidates(
117    tx_builder_ptr: ConstTxBuilderPtr,
118    output_candidates_out: *mut CollectionPtr<ErgoBoxCandidate>,
119) {
120    #[allow(clippy::unwrap_used)]
121    tx_builder_output_candidates(tx_builder_ptr, output_candidates_out).unwrap();
122}
123
124/// Get current height
125#[no_mangle]
126pub unsafe extern "C" fn ergo_lib_tx_builder_current_height(
127    tx_builder_ptr: ConstTxBuilderPtr,
128) -> u32 {
129    #[allow(clippy::unwrap_used)]
130    tx_builder_current_height(tx_builder_ptr).unwrap()
131}
132
133/// Get fee amount
134#[no_mangle]
135pub unsafe extern "C" fn ergo_lib_tx_builder_fee_amount(
136    tx_builder_ptr: ConstTxBuilderPtr,
137    value_out: *mut BoxValuePtr,
138) {
139    #[allow(clippy::unwrap_used)]
140    tx_builder_fee_amount(tx_builder_ptr, value_out).unwrap();
141}
142
143/// Get change address
144#[no_mangle]
145pub unsafe extern "C" fn ergo_lib_tx_builder_change_address(
146    tx_builder_ptr: ConstTxBuilderPtr,
147    address_out: *mut AddressPtr,
148) {
149    #[allow(clippy::unwrap_used)]
150    tx_builder_change_address(tx_builder_ptr, address_out).unwrap();
151}
152
153/// Drop `TxBuilder`
154#[no_mangle]
155pub unsafe extern "C" fn ergo_lib_tx_builder_delete(ptr: TxBuilderPtr) {
156    delete_ptr(ptr)
157}