[bindings] Support exposing `bitcoin::OutPoint`s as our common type
[rust-lightning] / lightning-c-bindings / src / c_types / mod.rs
index 840bd7a4446a5b07c59658e66686d734f680de38..0e41b64b00e07d9a822f16f4c5b6b7eda0bd3d3c 100644 (file)
@@ -2,11 +2,14 @@ pub mod derived;
 
 use bitcoin::Script as BitcoinScript;
 use bitcoin::Transaction as BitcoinTransaction;
+use bitcoin::hashes::Hash;
 use bitcoin::secp256k1::key::PublicKey as SecpPublicKey;
 use bitcoin::secp256k1::key::SecretKey as SecpSecretKey;
 use bitcoin::secp256k1::Signature as SecpSignature;
 use bitcoin::secp256k1::Error as SecpError;
 
+use std::convert::TryInto; // Bindings need at least rustc 1.34
+
 #[derive(Clone)]
 #[repr(C)]
 pub struct PublicKey {
@@ -130,6 +133,10 @@ impl Drop for Transaction {
 #[no_mangle]
 pub extern "C" fn Transaction_free(_res: Transaction) { }
 
+pub(crate) fn bitcoin_to_C_outpoint(outpoint: ::bitcoin::blockdata::transaction::OutPoint) -> crate::chain::transaction::OutPoint {
+       crate::chain::transaction::OutPoint_new(ThirtyTwoBytes { data: outpoint.txid.into_inner() }, outpoint.vout.try_into().unwrap())
+}
+
 #[repr(C)]
 #[derive(Clone)]
 /// A transaction output including a scriptPubKey and value.
@@ -320,7 +327,7 @@ impl<T: Clone> Clone for CVecTempl<T> {
        fn clone(&self) -> Self {
                let mut res = Vec::new();
                if self.datalen == 0 { return Self::from(res); }
-               res.clone_from_slice(unsafe { std::slice::from_raw_parts_mut(self.data, self.datalen) });
+               res.extend_from_slice(unsafe { std::slice::from_raw_parts_mut(self.data, self.datalen) });
                Self::from(res)
        }
 }