|
4 | 4 | //! |
5 | 5 |
|
6 | 6 | use hashes::Hash; |
7 | | -use std::os::raw::{c_uchar, c_uint}; |
| 7 | +use std::os::raw::c_uchar; |
8 | 8 |
|
9 | 9 | use elements::{ |
10 | 10 | confidential, |
@@ -128,20 +128,19 @@ pub(super) fn new_tx( |
128 | 128 | for (out, out_data) in tx.output.iter().zip(tx_data.outputs.iter()) { |
129 | 129 | raw_outputs.push(new_raw_output(out, out_data)); |
130 | 130 | } |
| 131 | + |
| 132 | + let c_raw_tx = c_elements::CRawTransaction { |
| 133 | + txid: txid.as_raw_hash().as_byte_array(), |
| 134 | + inputs: raw_inputs.as_ptr(), |
| 135 | + outputs: raw_outputs.as_ptr(), |
| 136 | + n_inputs: raw_inputs.len().try_into().expect("sane length"), |
| 137 | + n_outputs: raw_outputs.len().try_into().expect("sane length"), |
| 138 | + version: tx.version, |
| 139 | + locktime: tx.lock_time.to_consensus_u32(), |
| 140 | + }; |
131 | 141 | unsafe { |
132 | | - let mut raw_tx = std::mem::MaybeUninit::<c_elements::CRawTransaction>::uninit(); |
133 | | - c_elements::c_set_rawTransaction( |
134 | | - raw_tx.as_mut_ptr(), |
135 | | - tx.version as c_uint, |
136 | | - AsRef::<[u8]>::as_ref(&txid).as_ptr(), |
137 | | - raw_inputs.as_ptr(), |
138 | | - raw_inputs.len() as c_uint, |
139 | | - raw_outputs.as_ptr(), |
140 | | - raw_outputs.len() as c_uint, |
141 | | - tx.lock_time.to_consensus_u32() as c_uint, |
142 | | - ); |
143 | | - let raw_tx = raw_tx.assume_init(); |
144 | | - c_elements::simplicity_mallocTransaction(&raw_tx) |
| 142 | + // SAFETY: this is a FFI call and we constructed its argument correctly. |
| 143 | + c_elements::simplicity_mallocTransaction(&c_raw_tx) |
145 | 144 | } |
146 | 145 | } |
147 | 146 |
|
|
0 commit comments