+ macro_rules! check_dynamic_output_p2wpkh {
+ ($node: expr) => {
+ {
+ let events = $node.chan_monitor.simple_monitor.get_and_clear_pending_events();
+ let mut txn = Vec::new();
+ for event in events {
+ match event {
+ Event::SpendableOutputs { ref outputs } => {
+ for outp in outputs {
+ match *outp {
+ SpendableOutputDescriptor::DynamicOutputP2WPKH { ref outpoint, ref key, ref output } => {
+ let input = TxIn {
+ previous_output: outpoint.clone(),
+ script_sig: Script::new(),
+ sequence: 0,
+ witness: Vec::new(),
+ };
+ let outp = TxOut {
+ script_pubkey: Builder::new().push_opcode(opcodes::All::OP_RETURN).into_script(),
+ value: output.value,
+ };
+ let mut spend_tx = Transaction {
+ version: 2,
+ lock_time: 0,
+ input: vec![input],
+ output: vec![outp],
+ };
+ let secp_ctx = Secp256k1::new();
+ let remotepubkey = PublicKey::from_secret_key(&secp_ctx, &key);
+ let witness_script = Address::p2pkh(&remotepubkey, Network::Testnet).script_pubkey();
+ let sighash = Message::from_slice(&bip143::SighashComponents::new(&spend_tx).sighash_all(&spend_tx.input[0], &witness_script, output.value)[..]).unwrap();
+ let remotesig = secp_ctx.sign(&sighash, key);
+ spend_tx.input[0].witness.push(remotesig.serialize_der(&secp_ctx).to_vec());
+ spend_tx.input[0].witness[0].push(SigHashType::All as u8);
+ spend_tx.input[0].witness.push(remotepubkey.serialize().to_vec());
+ txn.push(spend_tx);
+ },
+ _ => panic!("Unexpected event"),
+ }
+ }
+ },
+ _ => panic!("Unexpected event"),
+ };
+ }
+ txn
+ }
+ }
+ }
+
+ macro_rules! check_static_output {
+ ($event: expr, $node: expr, $event_idx: expr, $output_idx: expr, $der_idx: expr, $idx_node: expr) => {
+ match $event[$event_idx] {
+ Event::SpendableOutputs { ref outputs } => {
+ match outputs[$output_idx] {
+ SpendableOutputDescriptor::StaticOutput { ref outpoint, ref output } => {
+ let secp_ctx = Secp256k1::new();
+ let input = TxIn {
+ previous_output: outpoint.clone(),
+ script_sig: Script::new(),
+ sequence: 0,
+ witness: Vec::new(),
+ };
+ let outp = TxOut {
+ script_pubkey: Builder::new().push_opcode(opcodes::All::OP_RETURN).into_script(),
+ value: output.value,
+ };
+ let mut spend_tx = Transaction {
+ version: 2,
+ lock_time: 0,
+ input: vec![input],
+ output: vec![outp.clone()],
+ };
+ let secret = {
+ match ExtendedPrivKey::new_master(&secp_ctx, Network::Testnet, &$node[$idx_node].node_seed) {
+ Ok(master_key) => {
+ match master_key.ckd_priv(&secp_ctx, ChildNumber::from_hardened_idx($der_idx)) {
+ Ok(key) => key,
+ Err(_) => panic!("Your RNG is busted"),
+ }
+ }
+ Err(_) => panic!("Your rng is busted"),
+ }
+ };
+ let pubkey = ExtendedPubKey::from_private(&secp_ctx, &secret).public_key;
+ let witness_script = Address::p2pkh(&pubkey, Network::Testnet).script_pubkey();
+ let sighash = Message::from_slice(&bip143::SighashComponents::new(&spend_tx).sighash_all(&spend_tx.input[0], &witness_script, output.value)[..]).unwrap();
+ let sig = secp_ctx.sign(&sighash, &secret.secret_key);
+ spend_tx.input[0].witness.push(sig.serialize_der(&secp_ctx).to_vec());
+ spend_tx.input[0].witness[0].push(SigHashType::All as u8);
+ spend_tx.input[0].witness.push(pubkey.serialize().to_vec());
+ spend_tx
+ },
+ _ => panic!("Unexpected event !"),
+ }
+ },
+ _ => panic!("Unexpected event !"),
+ };
+ }
+ }
+