From 19f6c66ea48804acae9e83c558aecb8a7f1f78cd Mon Sep 17 00:00:00 2001 From: Svyatoslav Nikolsky Date: Mon, 12 Dec 2016 18:01:44 +0300 Subject: [PATCH] added Script::num_signatures_required method --- script/src/script.rs | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/script/src/script.rs b/script/src/script.rs index 4b98cb6d..4dccdec0 100644 --- a/script/src/script.rs +++ b/script/src/script.rs @@ -340,6 +340,16 @@ impl Script { total } + pub fn num_signatures_required(&self) -> u8 { + if self.is_multisig_script() { + return match self.data[0] { + x if x == Opcode::OP_0 as u8 => 0, + x => x - (Opcode::OP_1 as u8) + 1, + }; + } + return 1; + } + pub fn extract_destinations(&self) -> Result, keys::Error> { match self.script_type() { ScriptType::NonStandard => { @@ -697,4 +707,28 @@ OP_ADD assert_eq!(script.script_type(), ScriptType::Multisig); assert_eq!(script.extract_destinations(), Ok(vec![address1, address2])); } + + #[test] + fn test_num_signatures_required() { + let script = Builder::default() + .push_opcode(Opcode::OP_3) + .push_bytes(&[0; 33]) + .push_bytes(&[0; 65]) + .push_bytes(&[0; 65]) + .push_bytes(&[0; 65]) + .push_opcode(Opcode::OP_4) + .push_opcode(Opcode::OP_CHECKMULTISIG) + .into_script(); + assert_eq!(script.script_type(), ScriptType::Multisig); + assert_eq!(script.num_signatures_required(), 3); + + let script = Builder::default() + .push_opcode(Opcode::OP_HASH160) + .push_bytes(&[0; 20]) + .push_opcode(Opcode::OP_EQUAL) + .into_script(); + assert_eq!(script.script_type(), ScriptType::ScriptHash); + assert_eq!(script.num_signatures_required(), 1); + + } }