Update create_transaction test

This commit is contained in:
Sosthene 2024-08-15 16:15:40 +02:00
parent dd797bd981
commit 8688b6ed79

View File

@ -5,10 +5,8 @@ use anyhow::{Error, Result};
use rand::{thread_rng, Rng}; use rand::{thread_rng, Rng};
use sp_client::bitcoin::consensus::deserialize; use sp_client::bitcoin::consensus::deserialize;
use sp_client::bitcoin::key::{Keypair, Secp256k1, TapTweak}; use sp_client::bitcoin::psbt::raw;
use sp_client::bitcoin::psbt::{raw, Output}; use sp_client::bitcoin::{Psbt, Amount, OutPoint};
use sp_client::bitcoin::{Address, Psbt, ScriptBuf, Transaction, Txid};
use sp_client::bitcoin::{Amount, OutPoint, TxOut};
use sp_client::constants::{ use sp_client::constants::{
self, DUST_THRESHOLD, PSBT_SP_ADDRESS_KEY, PSBT_SP_PREFIX, PSBT_SP_SUBTYPE, self, DUST_THRESHOLD, PSBT_SP_ADDRESS_KEY, PSBT_SP_PREFIX, PSBT_SP_SUBTYPE,
}; };
@ -52,7 +50,7 @@ pub fn create_transaction(
for outpoint in mandatory_inputs { for outpoint in mandatory_inputs {
let (must_outpoint, must_output) = available_outpoints let (must_outpoint, must_output) = available_outpoints
.remove_entry(&outpoint) .remove_entry(&outpoint)
.ok_or_else(|| Error::msg("Mandatory outpoint unknown"))?; .ok_or_else(|| Error::msg(format!("Mandatory outpoint unknown: {}", outpoint)))?;
total_available += must_output.amount; total_available += must_output.amount;
inputs.insert(must_outpoint, must_output); inputs.insert(must_outpoint, must_output);
} }
@ -174,13 +172,13 @@ pub fn map_outputs_to_sp_address(psbt_str: &str) -> Result<HashMap<String, Vec<u
mod tests { mod tests {
use std::io::Write; use std::io::Write;
use crate::network::CipherMessage; use crate::network::{Pcd, Prd};
use super::*; use super::*;
use sp_client::bitcoin::hashes::{sha256, Hash}; use sp_client::bitcoin::hashes::{sha256, Hash};
use sp_client::bitcoin::hex::{DisplayHex, FromHex}; use sp_client::bitcoin::hex::FromHex;
use sp_client::bitcoin::secp256k1::PublicKey; use sp_client::bitcoin::secp256k1::PublicKey;
use sp_client::bitcoin::Transaction; use sp_client::bitcoin::{ScriptBuf, Transaction};
use sp_client::silentpayments::utils::receiving::{ use sp_client::silentpayments::utils::receiving::{
calculate_tweak_data, get_pubkey_from_input, calculate_tweak_data, get_pubkey_from_input,
}; };
@ -193,8 +191,8 @@ mod tests {
const BOB_WALLET_ANSWER: &str = "{\"tx_history\": [],\"client\":{\"network\":\"regtest\",\"label\":\"default\",\"scan_sk\":\"0de90b7195c1380d5fde13de3f1d66d53423a9896314839e36ba672653af60b4\",\"spend_key\":{\"Secret\":\"affe686075ecbe17b8ce7de45ec31314804259d0a4bc1c863de21ffd6dc598f8\"},\"mnemonic\":null,\"sp_receiver\":{\"version\":0,\"network\":\"Regtest\",\"scan_pubkey\":[2,85,96,92,243,247,237,192,205,9,178,146,101,237,132,232,15,2,69,138,31,118,76,140,142,207,90,13,192,94,254,150,133],\"spend_pubkey\":[3,5,157,91,250,169,41,61,190,37,30,98,152,253,180,138,250,86,162,102,82,148,130,220,44,153,127,83,43,246,93,17,232],\"change_label\":\"56572fc770b52096879662f97f98263d3e126f5a4a38f00f2895a9dde4c47c1c\",\"labels\":[[\"56572fc770b52096879662f97f98263d3e126f5a4a38f00f2895a9dde4c47c1c\",[2,237,237,247,213,154,87,34,239,168,235,87,122,152,94,41,35,101,184,201,58,201,6,185,58,157,52,208,129,167,2,224,198]]]}},\"outputs\":{\"wallet_fingerprint\":[203,200,4,248,139,36,241,232],\"birthday\":2146,\"last_scan\":2146,\"outputs\":{\"fbd9c63e0dd08c2569b51a0d6095a79ee2acfcac66acdb594328a095f1fadb63:1\":{\"blockheight\":2146,\"tweak\":\"678dbcbdb40cd3733c8dbbd508761a0937009cf75a9f466e3c98877e79037cbc\",\"amount\":99896595,\"script\":\"5120deab0c5a3d23de30477b0b5a95a261c96e29afdd9813c665d2bf025ad2b3f919\",\"label\":null,\"spend_status\":\"Unspent\"},\"148e0faa2f203b6e9488e2da696d8a49ebff4212946672f0bb072ced0909360d:0\":{\"blockheight\":0,\"tweak\":\"0e3395ff27bde9187ffaeeb2521f6277d3b83911f16ccbaf59a1a68d99a0ab93\",\"amount\":1200,\"script\":\"512010f06f764cbc923ec3198db946307bf0c06a1b4f09206055e47a6fec0a33d52c\",\"label\":null,\"spend_status\":{\"Spent\":\"bc207c02bc4f1d4359fcd604296c0938bf1e6ff827662a56410676b8cbd768d9\"}}}}}"; const BOB_WALLET_ANSWER: &str = "{\"tx_history\": [],\"client\":{\"network\":\"regtest\",\"label\":\"default\",\"scan_sk\":\"0de90b7195c1380d5fde13de3f1d66d53423a9896314839e36ba672653af60b4\",\"spend_key\":{\"Secret\":\"affe686075ecbe17b8ce7de45ec31314804259d0a4bc1c863de21ffd6dc598f8\"},\"mnemonic\":null,\"sp_receiver\":{\"version\":0,\"network\":\"Regtest\",\"scan_pubkey\":[2,85,96,92,243,247,237,192,205,9,178,146,101,237,132,232,15,2,69,138,31,118,76,140,142,207,90,13,192,94,254,150,133],\"spend_pubkey\":[3,5,157,91,250,169,41,61,190,37,30,98,152,253,180,138,250,86,162,102,82,148,130,220,44,153,127,83,43,246,93,17,232],\"change_label\":\"56572fc770b52096879662f97f98263d3e126f5a4a38f00f2895a9dde4c47c1c\",\"labels\":[[\"56572fc770b52096879662f97f98263d3e126f5a4a38f00f2895a9dde4c47c1c\",[2,237,237,247,213,154,87,34,239,168,235,87,122,152,94,41,35,101,184,201,58,201,6,185,58,157,52,208,129,167,2,224,198]]]}},\"outputs\":{\"wallet_fingerprint\":[203,200,4,248,139,36,241,232],\"birthday\":2146,\"last_scan\":2146,\"outputs\":{\"fbd9c63e0dd08c2569b51a0d6095a79ee2acfcac66acdb594328a095f1fadb63:1\":{\"blockheight\":2146,\"tweak\":\"678dbcbdb40cd3733c8dbbd508761a0937009cf75a9f466e3c98877e79037cbc\",\"amount\":99896595,\"script\":\"5120deab0c5a3d23de30477b0b5a95a261c96e29afdd9813c665d2bf025ad2b3f919\",\"label\":null,\"spend_status\":\"Unspent\"},\"148e0faa2f203b6e9488e2da696d8a49ebff4212946672f0bb072ced0909360d:0\":{\"blockheight\":0,\"tweak\":\"0e3395ff27bde9187ffaeeb2521f6277d3b83911f16ccbaf59a1a68d99a0ab93\",\"amount\":1200,\"script\":\"512010f06f764cbc923ec3198db946307bf0c06a1b4f09206055e47a6fec0a33d52c\",\"label\":null,\"spend_status\":{\"Spent\":\"bc207c02bc4f1d4359fcd604296c0938bf1e6ff827662a56410676b8cbd768d9\"}}}}}";
const ALICE_ADDRESS: &str = "sprt1qqf50y6deqe7dqg3vj562xf3lmktqe3sct78ha6e9jh54sa3q2m5esq7x2tz0xrpm0ekclyyaszc2sh3ksm5gkumxpwegpa80lv5wgsuefqaufx8q"; const ALICE_ADDRESS: &str = "sprt1qqf50y6deqe7dqg3vj562xf3lmktqe3sct78ha6e9jh54sa3q2m5esq7x2tz0xrpm0ekclyyaszc2sh3ksm5gkumxpwegpa80lv5wgsuefqaufx8q";
const BOB_ADDRESS: &str = "sprt1qqf2kqh8n7lkupngfk2fxtmvyaq8sy3v2ramyeryweadqmsz7l6tg2qc9n4dl42ff8klz28nznr7mfzh6263xv555stwzextl2v4lvhg3aqq7ru8u"; const BOB_ADDRESS: &str = "sprt1qqf2kqh8n7lkupngfk2fxtmvyaq8sy3v2ramyeryweadqmsz7l6tg2qc9n4dl42ff8klz28nznr7mfzh6263xv555stwzextl2v4lvhg3aqq7ru8u";
const COMMITMENT: &str = "e4395114bdb1276bbcf3b0b6ef1c970a213f689b2bf8524e08599a1a65c146e7";
const FEE_RATE: Amount = Amount::from_sat(1); const FEE_RATE: Amount = Amount::from_sat(1);
const KEY: &str = "442a5ea418921c4aa8ce3f7a95427d9450059a3ac11db3dced9abb709b2d9f42";
fn helper_get_tweak_data(tx: &Transaction, spk: ScriptBuf) -> PublicKey { fn helper_get_tweak_data(tx: &Transaction, spk: ScriptBuf) -> PublicKey {
let prevout = tx.input.get(0).unwrap().to_owned(); let prevout = tx.input.get(0).unwrap().to_owned();
@ -209,11 +207,11 @@ mod tests {
tweak_data tweak_data
} }
fn helper_create_commitment(payload_to_hash: String) -> String { fn helper_create_commitment(payload_to_hash: String) -> sha256::Hash {
let mut engine = sha256::HashEngine::default(); let mut engine = sha256::HashEngine::default();
engine.write_all(&payload_to_hash.as_bytes()); engine.write_all(&payload_to_hash.as_bytes()).unwrap();
let hash = sha256::Hash::from_engine(engine); let hash = sha256::Hash::from_engine(engine);
hash.to_byte_array().to_lower_hex_string() hash
} }
#[test] #[test]
@ -225,17 +223,19 @@ mod tests {
}; };
let mut alice_wallet: SpWallet = serde_json::from_str(ALICE_WALLET).unwrap(); let mut alice_wallet: SpWallet = serde_json::from_str(ALICE_WALLET).unwrap();
let mut bob_wallet: SpWallet = serde_json::from_str(BOB_WALLET).unwrap(); let mut bob_wallet: SpWallet = serde_json::from_str(BOB_WALLET).unwrap();
let message: CipherMessage = CipherMessage::new(ALICE_ADDRESS.to_owned(), "TEST".to_owned()); let pcd = Pcd::new("TEST".to_owned());
let commitment = helper_create_commitment(serde_json::to_string(&message).unwrap()); let pcd_hash = helper_create_commitment(pcd.to_string());
let mut key = [0u8; 32];
assert!(commitment == "d12f3c5b37240bc3abf2976f41fdf9a594f0680aafd2781ac448f80440fbeb99"); key.copy_from_slice(&Vec::from_hex(KEY).unwrap());
let prd = Prd::new(ALICE_ADDRESS.try_into().unwrap(), key, pcd_hash);
let commitment = helper_create_commitment(serde_json::to_string(&prd).unwrap());
let psbt = create_transaction( let psbt = create_transaction(
&vec![], &vec![],
&HashSet::new(), &HashSet::new(),
&alice_wallet, &alice_wallet,
vec![recipient], vec![recipient],
Some(Vec::from_hex(COMMITMENT).unwrap()), Some(commitment.as_byte_array().to_vec()),
FEE_RATE, FEE_RATE,
None, None,
) )