diff --git a/controller/tests/transaction.rs b/controller/tests/transaction.rs index 22731c0d..6c79e1f5 100644 --- a/controller/tests/transaction.rs +++ b/controller/tests/transaction.rs @@ -119,13 +119,9 @@ fn basic_transaction_api(test_dir: &'static str) -> Result<(), libwallet::Error> // Check we have a single kernel and that it is a Plain kernel (no lock_height). assert_eq!(slate.tx.kernels().len(), 1); - assert_eq!( - slate.tx.kernels().first().map(|k| k.lock_height).unwrap(), - 0 - ); assert_eq!( slate.tx.kernels().first().map(|k| k.features).unwrap(), - transaction::KernelFeatures::Plain + transaction::KernelFeatures::Plain { fee: 0 } ); Ok(()) diff --git a/libwallet/src/slate.rs b/libwallet/src/slate.rs index 310e0539..a3ddd92b 100644 --- a/libwallet/src/slate.rs +++ b/libwallet/src/slate.rs @@ -20,8 +20,7 @@ use crate::error::{Error, ErrorKind}; use crate::grin_core::core::amount_to_hr_string; use crate::grin_core::core::committed::Committed; use crate::grin_core::core::transaction::{ - kernel_features, kernel_sig_msg, Input, Output, Transaction, TransactionBody, TxKernel, - Weighting, + Input, KernelFeatures, Output, Transaction, TransactionBody, TxKernel, Weighting, }; use crate::grin_core::core::verifier_cache::LruVerifierCache; use crate::grin_core::libtx::{aggsig, build, proof::ProofBuild, secp_ser, tx_fee}; @@ -290,11 +289,16 @@ impl Slate { } // This is the msg that we will sign as part of the tx kernel. - // Currently includes the fee and the lock_height. + // If lock_height is 0 then build a plain kernel, otherwise build a height locked kernel. fn msg_to_sign(&self) -> Result { - // Currently we only support interactively creating a tx with a "default" kernel. - let features = kernel_features(self.lock_height); - let msg = kernel_sig_msg(self.fee, self.lock_height, features)?; + let features = match self.lock_height { + 0 => KernelFeatures::Plain { fee: self.fee }, + _ => KernelFeatures::HeightLocked { + fee: self.fee, + lock_height: self.lock_height, + }, + }; + let msg = features.kernel_sig_msg()?; Ok(msg) } @@ -881,19 +885,19 @@ impl From<&Output> for OutputV2 { impl From<&TxKernel> for TxKernelV2 { fn from(kernel: &TxKernel) -> TxKernelV2 { - let TxKernel { - features, - fee, - lock_height, - excess, - excess_sig, - } = *kernel; + let (features, fee, lock_height) = match kernel.features { + KernelFeatures::Plain { fee } => (CompatKernelFeatures::Plain, fee, 0), + KernelFeatures::Coinbase => (CompatKernelFeatures::Coinbase, 0, 0), + KernelFeatures::HeightLocked { fee, lock_height } => { + (CompatKernelFeatures::HeightLocked, fee, lock_height) + } + }; TxKernelV2 { features, fee, lock_height, - excess, - excess_sig, + excess: kernel.excess, + excess_sig: kernel.excess_sig, } } } @@ -1025,19 +1029,23 @@ impl From<&OutputV2> for Output { impl From<&TxKernelV2> for TxKernel { fn from(kernel: &TxKernelV2) -> TxKernel { - let TxKernelV2 { - features, - fee, - lock_height, - excess, - excess_sig, - } = *kernel; + let (fee, lock_height) = (kernel.fee, kernel.lock_height); + let features = match kernel.features { + CompatKernelFeatures::Plain => KernelFeatures::Plain { fee }, + CompatKernelFeatures::Coinbase => KernelFeatures::Coinbase, + CompatKernelFeatures::HeightLocked => KernelFeatures::HeightLocked { fee, lock_height }, + }; TxKernel { features, - fee, - lock_height, - excess, - excess_sig, + excess: kernel.excess, + excess_sig: kernel.excess_sig, } } } + +#[derive(Clone, Copy, Debug, Serialize, Deserialize)] +pub enum CompatKernelFeatures { + Plain, + Coinbase, + HeightLocked, +} diff --git a/libwallet/src/slate_versions/v2.rs b/libwallet/src/slate_versions/v2.rs index 336fb896..2c5832f8 100644 --- a/libwallet/src/slate_versions/v2.rs +++ b/libwallet/src/slate_versions/v2.rs @@ -35,13 +35,14 @@ //! orig_version: u16, //! block_header_version: u16, -use crate::grin_core::core::transaction::{KernelFeatures, OutputFeatures}; +use crate::grin_core::core::transaction::OutputFeatures; use crate::grin_core::libtx::secp_ser; use crate::grin_keychain::BlindingFactor; use crate::grin_util::secp; use crate::grin_util::secp::key::PublicKey; use crate::grin_util::secp::pedersen::{Commitment, RangeProof}; use crate::grin_util::secp::Signature; +use crate::slate::CompatKernelFeatures; use uuid::Uuid; #[derive(Serialize, Deserialize, Debug, Clone)] @@ -162,7 +163,7 @@ pub struct OutputV2 { #[derive(Serialize, Deserialize, Debug, Clone)] pub struct TxKernelV2 { /// Options for a kernel's structure or use - pub features: KernelFeatures, + pub features: CompatKernelFeatures, /// Fee originally included in the transaction this proof is for. #[serde(with = "secp_ser::string_or_u64")] pub fee: u64, diff --git a/libwallet/tests/libwallet.rs b/libwallet/tests/libwallet.rs index 09505794..e858052b 100644 --- a/libwallet/tests/libwallet.rs +++ b/libwallet/tests/libwallet.rs @@ -23,7 +23,9 @@ use grin_wallet_util::grin_util::secp::key::{PublicKey, SecretKey}; use rand::thread_rng; fn kernel_sig_msg() -> secp::Message { - transaction::kernel_sig_msg(0, 0, transaction::KernelFeatures::Plain).unwrap() + transaction::KernelFeatures::Plain { fee: 0 } + .kernel_sig_msg() + .unwrap() } #[test]