diff --git a/contrib/test.sh b/contrib/test.sh index d5da48ed..92554052 100755 --- a/contrib/test.sh +++ b/contrib/test.sh @@ -10,8 +10,6 @@ fi # Pin dependencies as required if we are using MSRV toolchain. if cargo --version | grep "1\.41"; then - # can be removed with elementsd 0.8.0 - cargo update -p zip --precise 0.5.6 # 1.0.157 uses syn 2.0 which requires edition 2018 cargo update -p serde --precise 1.0.156 # 1.0.108 uses `matches!` macro so does not work with Rust 1.41.1, bad `syn` no biscuit. diff --git a/elementsd-tests/Cargo.toml b/elementsd-tests/Cargo.toml index 956b246d..ebba4fec 100644 --- a/elementsd-tests/Cargo.toml +++ b/elementsd-tests/Cargo.toml @@ -8,7 +8,8 @@ edition = "2018" [dependencies] base64 = "0.13.0" +bitcoin30 = { package = "bitcoin", version = "0.30" } elements = {path = "../"} -elementsd = "0.6.0" +elementsd = "0.8.0" rand = "0.8" diff --git a/elementsd-tests/src/pset.rs b/elementsd-tests/src/pset.rs index 1d484262..29ad631a 100644 --- a/elementsd-tests/src/pset.rs +++ b/elementsd-tests/src/pset.rs @@ -6,7 +6,7 @@ extern crate rand; use crate::{setup, Call}; -use elements::bitcoin::{self, Address, Amount}; +use bitcoin30::{self, Address, Amount}; use elements::bitcoin::hashes::hex::ToHex; use elements::bitcoin::hashes::Hash; use elements::encode::{deserialize, serialize}; @@ -60,7 +60,7 @@ fn tx_issuance() { let value = elementsd.call( "createpsbt", &[ - json!([{ "txid": prevout.txid, "vout": prevout.vout, "issuance_amount": 1000, "issuance_tokens": 1}]), + json!([{ "txid": prevout.txid.to_string(), "vout": prevout.vout, "issuance_amount": 1000, "issuance_tokens": 1}]), json!([ {address_asset: "1000", "asset": asset_id.to_string(), "blinder_index": 0}, {address_reissuance: "1", "asset": reissuance_id.to_string(), "blinder_index": 0}, @@ -87,23 +87,25 @@ fn tx_issuance() { fn tx_pegin() { let (elementsd, bitcoind) = setup(true); let bitcoind = bitcoind.unwrap(); - let btc_addr = bitcoind.client.get_new_address(None, None).unwrap(); + let btc_addr = bitcoind.client.get_new_address(None, None).unwrap() + .assume_checked(); let address_lbtc = elementsd.get_new_address(); bitcoind.client.generate_to_address(101, &btc_addr).unwrap(); let (pegin_address, claim_script) = elementsd.get_pegin_address(); - let address = Address::from_str(&pegin_address).unwrap(); + let address = Address::from_str(&pegin_address).unwrap() + .assume_checked(); let amount = Amount::from_sat(100_000_000); let txid = bitcoind .client .send_to_address(&address, amount, None, None, None, None, None, None) .unwrap(); let tx = bitcoind.client.get_raw_transaction(&txid, None).unwrap(); - let tx_bytes = serialize(&tx); + let tx_bytes = bitcoin30::consensus::serialize(&tx); let vout = tx .output .iter() .position(|o| { - let addr = Address::from_script(&o.script_pubkey, bitcoin::Network::Regtest); + let addr = Address::from_script(&o.script_pubkey, bitcoin30::Network::Regtest); addr.unwrap().to_string() == pegin_address }) .unwrap(); diff --git a/src/lib.rs b/src/lib.rs index be35ef01..c0be1830 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,12 +25,16 @@ #![deny(unused_mut)] #![deny(missing_docs)] +/// Re-export of bitcoin crate pub extern crate bitcoin; #[macro_use] extern crate bitcoin_hashes as just_imported_for_the_macros; -extern crate slip21; +/// Re-export of slip21 crate +pub extern crate slip21; +/// Re-export of secp256k1-zkp crate pub extern crate secp256k1_zkp; -#[cfg(feature = "serde")] #[macro_use] extern crate actual_serde as serde; +/// Re-export of serde crate +#[cfg(feature = "serde")] #[macro_use] pub extern crate actual_serde as serde; #[cfg(all(test, feature = "serde"))] extern crate serde_test; #[cfg(test)] extern crate rand; diff --git a/src/transaction.rs b/src/transaction.rs index 51262384..487aff51 100644 --- a/src/transaction.rs +++ b/src/transaction.rs @@ -521,6 +521,9 @@ impl Decodable for TxIn { } if has_issuance { issuance = AssetIssuance::consensus_decode(&mut d)?; + if issuance.is_null() { + return Err(encode::Error::ParseFailed("superfluous asset issuance")); + } } else { issuance = AssetIssuance::default(); } @@ -2299,4 +2302,14 @@ mod tests { "); assert!(tx.input[0].previous_output.is_null()); } + + #[test] + fn superfluous_asset_issuance() { + let tx = Vec::::from_hex("1ae80068000109fee1000000000000000000000000000000000000000000000000000000000000005acf37f60000c7280028a7000000006e000000010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010101010115190000b9bfb80000000100000000d8d8d8d8d8d8d8d8d8d8d8d8d8d80000000000b8bfb8").unwrap(); + if let encode::Error::ParseFailed("superfluous asset issuance") = Transaction::consensus_decode(&tx[..]).unwrap_err() { + // ok. FIXME replace this with matches! when we move to 1.48.0 + } else { + panic!("Incorrect error for bad transaction"); + } + } }