diff --git a/Cargo.lock b/Cargo.lock index 5b09ee7..252ec14 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -111,6 +111,16 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23ce669cd6c8588f79e15cf450314f9638f967fc5770ff1c7c1deb0925ea7cfa" +[[package]] +name = "base58ck" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8d66485a3a2ea485c1913c4572ce0256067a5377ac8c75c4960e1cda98605f" +dependencies = [ + "bitcoin-internals 0.3.0", + "bitcoin_hashes 0.14.0", +] + [[package]] name = "base64" version = "0.21.7" @@ -119,13 +129,13 @@ checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bech32" -version = "0.10.0-beta" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98f7eed2b2781a6f0b5c903471d48e15f56fb4e1165df8a9a2337fd1a59d45ea" +checksum = "d965446196e3b7decd44aa7ee49e31d630118f90ef12f97900f262eb915c951d" [[package]] name = "bitbox-api" -version = "0.4.0" +version = "0.4.1" dependencies = [ "async-trait", "base32", @@ -157,15 +167,18 @@ dependencies = [ [[package]] name = "bitcoin" -version = "0.31.2" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c85783c2fe40083ea54a33aa2f0ba58831d90fcd190f5bdc47e74e84d2a96ae" +checksum = "ea507acc1cd80fc084ace38544bbcf7ced7c2aa65b653b102de0ce718df668f6" dependencies = [ + "base58ck", "base64", "bech32", - "bitcoin-internals", - "bitcoin_hashes", - "hex-conservative", + "bitcoin-internals 0.3.0", + "bitcoin-io", + "bitcoin-units", + "bitcoin_hashes 0.14.0", + "hex-conservative 0.2.1", "hex_lit", "secp256k1", "serde", @@ -176,18 +189,50 @@ name = "bitcoin-internals" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9425c3bf7089c983facbae04de54513cce73b41c7f9ff8c845b54e7bc64ebbfb" + +[[package]] +name = "bitcoin-internals" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30bdbe14aa07b06e6cfeffc529a1f099e5fbe249524f8125358604df99a4bed2" dependencies = [ "serde", ] +[[package]] +name = "bitcoin-io" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "340e09e8399c7bd8912f495af6aa58bea0c9214773417ffaa8f6460f93aaee56" + +[[package]] +name = "bitcoin-units" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5285c8bcaa25876d07f37e3d30c303f2609179716e11d688f51e8f1fe70063e2" +dependencies = [ + "bitcoin-internals 0.3.0", + "serde", +] + [[package]] name = "bitcoin_hashes" version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1930a4dabfebb8d7d9992db18ebe3ae2876f0a305fab206fd168df931ede293b" dependencies = [ - "bitcoin-internals", - "hex-conservative", + "bitcoin-internals 0.2.0", + "hex-conservative 0.1.2", +] + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative 0.2.1", "serde", ] @@ -473,6 +518,15 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "212ab92002354b4819390025006c897e8140934349e8635c9b077f47b4dcbd20" +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + [[package]] name = "hex_lit" version = "0.1.1" @@ -923,20 +977,20 @@ checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] name = "secp256k1" -version = "0.28.2" +version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d24b59d129cdadea20aea4fb2352fa053712e5d713eee47d700cd4b2bc002f10" +checksum = "0e0cc0f1cf93f4969faf3ea1c7d8a9faed25918d96affa959720823dfe86d4f3" dependencies = [ - "bitcoin_hashes", + "bitcoin_hashes 0.13.0", "secp256k1-sys", "serde", ] [[package]] name = "secp256k1-sys" -version = "0.9.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5d1746aae42c19d583c3c1a8c646bfad910498e2051c551a7f2e3c0c9fbb7eb" +checksum = "1433bd67156263443f14d603720b082dd3121779323fce20cba2aa07b874bc1b" dependencies = [ "cc", ] diff --git a/Cargo.toml b/Cargo.toml index 683d4c5..0f83c35 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "bitbox-api" authors = ["Marko Bencun "] -version = "0.4.0" +version = "0.4.1" homepage = "https://bitbox.swiss/" repository = "https://github.com/BitBoxSwiss/bitbox-api-rs/" readme = "README-rust.md" @@ -17,7 +17,7 @@ crate-type = ["cdylib", "rlib"] [dependencies] async-trait = "0.1.68" base32 = "0.4" -bitcoin = { version = "0.31", features = ["base64"] } +bitcoin = { version = "0.32", features = ["base64"] } byteorder = "1.3.2" getrandom = { version = "0.2" } hex = { version = "0.4" } diff --git a/src/btc.rs b/src/btc.rs index 3bd5dd1..5ea10be 100644 --- a/src/btc.rs +++ b/src/btc.rs @@ -10,6 +10,7 @@ use crate::PairedBitBox; pub use bitcoin::{ bip32::{Fingerprint, Xpub}, blockdata::script::witness_version::WitnessVersion, + Script, }; #[cfg(feature = "wasm")] @@ -116,59 +117,44 @@ pub struct Payload { #[derive(thiserror::Error, Debug)] pub enum PayloadError { - #[error("{0}")] - AddressError(#[from] bitcoin::address::Error), - #[error("invalid witness program size")] - InvalidWitnessProgramSize, - #[error("witness version {0} not supported yet")] - UnsupportedWitnessVersion(WitnessVersion), #[error("unrecognized pubkey script")] Unrecognized, } -impl TryFrom for Payload { - type Error = PayloadError; - fn try_from(value: bitcoin::address::Payload) -> Result { - match value { - bitcoin::address::Payload::PubkeyHash(h) => Ok(Payload { - data: h[..].to_vec(), +impl Payload { + pub fn from_pkscript(pkscript: &[u8]) -> Result { + let script = Script::from_bytes(pkscript); + if script.is_p2pkh() { + Ok(Payload { + data: pkscript[3..23].to_vec(), output_type: pb::BtcOutputType::P2pkh, - }), - bitcoin::address::Payload::ScriptHash(h) => Ok(Payload { - data: h[..].to_vec(), + }) + } else if script.is_p2sh() { + Ok(Payload { + data: pkscript[2..22].to_vec(), output_type: pb::BtcOutputType::P2sh, - }), - bitcoin::address::Payload::WitnessProgram(w) => match w.version() { - WitnessVersion::V0 => Ok(Payload { - data: w.program().as_bytes().to_vec(), - output_type: match w.program().len() { - 20 => pb::BtcOutputType::P2wpkh, - 32 => pb::BtcOutputType::P2wsh, - _ => return Err(PayloadError::InvalidWitnessProgramSize), - }, - }), - WitnessVersion::V1 => match w.program().len() { - 32 => Ok(Payload { - data: w.program().as_bytes().to_vec(), - output_type: pb::BtcOutputType::P2tr, - }), - _ => Err(PayloadError::InvalidWitnessProgramSize), - }, - version => Err(PayloadError::UnsupportedWitnessVersion(version)), - }, - _ => Err(PayloadError::Unrecognized), + }) + } else if script.is_p2wpkh() { + Ok(Payload { + data: pkscript[2..].to_vec(), + output_type: pb::BtcOutputType::P2wpkh, + }) + } else if script.is_p2wsh() { + Ok(Payload { + data: pkscript[2..].to_vec(), + output_type: pb::BtcOutputType::P2wsh, + }) + } else if script.is_p2tr() { + Ok(Payload { + data: pkscript[2..].to_vec(), + output_type: pb::BtcOutputType::P2tr, + }) + } else { + Err(PayloadError::Unrecognized) } } } -impl Payload { - pub fn from_pkscript(pkscript: &[u8]) -> Result { - let payload = - bitcoin::address::Payload::from_script(bitcoin::Script::from_bytes(pkscript))?; - payload.try_into() - } -} - #[derive(Debug, PartialEq)] pub struct TxExternalOutput { pub payload: Payload, @@ -846,9 +832,11 @@ impl PairedBitBox { psbt_input.partial_sigs.insert( bitcoin::PublicKey::new(pubkey), bitcoin::ecdsa::Signature { - sig: bitcoin::secp256k1::ecdsa::Signature::from_compact(signature) - .map_err(|_| Error::InvalidSignature)?, - hash_ty: bitcoin::sighash::EcdsaSighashType::All, + signature: bitcoin::secp256k1::ecdsa::Signature::from_compact( + signature, + ) + .map_err(|_| Error::InvalidSignature)?, + sighash_type: bitcoin::sighash::EcdsaSighashType::All, }, ); }