use blvm_node::network::protocol::PaymentMessage;
use blvm_protocol::payment::{Payment, PaymentOutput, PaymentProtocolServer, PaymentRequest};
use blvm_protocol::{OutPoint, Transaction, TransactionInput, TransactionOutput};
#[test]
fn test_payment_verification() {
let output = PaymentOutput {
script: vec![0x51], amount: Some(1000),
};
let payment_request = PaymentRequest::new("main".to_string(), vec![output.clone()], 1234567890);
let tx = Transaction {
version: 1,
inputs: blvm_protocol::tx_inputs![TransactionInput {
prevout: OutPoint {
hash: [0u8; 32],
index: 0,
},
script_sig: vec![],
sequence: 0xffffffff,
}],
outputs: blvm_protocol::tx_outputs![TransactionOutput {
value: 1000,
script_pubkey: vec![0x51], }],
lock_time: 0,
};
let tx_bytes = bincode::serialize(&tx)
.expect("bincode tx for BIP70 must match deserialize in verify_payment_transactions");
let payment = Payment::new(vec![tx_bytes]);
let payment_msg = PaymentMessage {
payment,
payment_id: vec![1, 2, 3, 4],
customer_signature: None,
};
let result = PaymentProtocolServer::process_payment(
&payment_msg.payment,
&payment_request,
None, );
assert!(result.is_ok());
}
#[test]
fn test_payment_ack_signing() {
let mut merchant_key = [0u8; 32];
merchant_key[31] = 1;
let output = PaymentOutput {
script: vec![0x51],
amount: Some(1000),
};
let mut payment_request = PaymentRequest::new("main".to_string(), vec![output], 1_234_567_890);
payment_request
.sign(&merchant_key)
.expect("sign payment request (sets merchant_pubkey + blvm-secp256k1 signature)");
payment_request
.verify_signature()
.expect("payment request signature must verify");
let merchant_pubkey = payment_request
.merchant_pubkey
.as_ref()
.expect("sign() sets merchant_pubkey")
.as_slice();
let tx = Transaction {
version: 1,
inputs: blvm_protocol::tx_inputs![TransactionInput {
prevout: OutPoint {
hash: [0u8; 32],
index: 0,
},
script_sig: vec![],
sequence: 0xffffffff,
}],
outputs: blvm_protocol::tx_outputs![TransactionOutput {
value: 1000,
script_pubkey: vec![0x51],
}],
lock_time: 0,
};
let tx_bytes = bincode::serialize(&tx)
.expect("bincode tx for BIP70 must match deserialize in verify_payment_transactions");
let payment = Payment::new(vec![tx_bytes]);
let payment_msg = PaymentMessage {
payment,
payment_id: vec![1, 2, 3, 4],
customer_signature: None,
};
let result = PaymentProtocolServer::process_payment(
&payment_msg.payment,
&payment_request,
Some(&merchant_key),
);
assert!(result.is_ok(), "{:?}", result.err());
let ack = result.unwrap();
ack.verify_signature(merchant_pubkey)
.expect("PaymentACK merchant signature must verify");
assert!(ack.memo.is_some());
}