mirror of
https://github.com/RoboSats/taptrade-core.git
synced 2025-07-31 07:01:40 +00:00
started verifying bonds
This commit is contained in:
8
taptrade-cli-demo/coordinator/Cargo.lock
generated
8
taptrade-cli-demo/coordinator/Cargo.lock
generated
@ -66,6 +66,12 @@ dependencies = [
|
|||||||
"windows-sys 0.52.0",
|
"windows-sys 0.52.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "anyhow"
|
||||||
|
version = "1.0.86"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "async-trait"
|
name = "async-trait"
|
||||||
version = "0.1.80"
|
version = "0.1.80"
|
||||||
@ -380,10 +386,12 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
|
|||||||
name = "coordinator"
|
name = "coordinator"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
"anyhow",
|
||||||
"axum",
|
"axum",
|
||||||
"bdk",
|
"bdk",
|
||||||
"clap",
|
"clap",
|
||||||
"frost-secp256k1",
|
"frost-secp256k1",
|
||||||
|
"hex",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
@ -11,3 +11,5 @@ frost-secp256k1 = "1.0.0"
|
|||||||
reqwest = { version = "0.12.4", features = ["blocking", "json"] }
|
reqwest = { version = "0.12.4", features = ["blocking", "json"] }
|
||||||
serde = "1.0.203"
|
serde = "1.0.203"
|
||||||
tokio = "1.38.0"
|
tokio = "1.38.0"
|
||||||
|
anyhow = "1.0.86"
|
||||||
|
hex = "0.4"
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
pub mod api;
|
pub mod api;
|
||||||
|
|
||||||
use reqwest::StatusCode;
|
use verify_bond::verify_psbt;
|
||||||
use axum::{routing::post, Json, Router, response::{IntoResponse, Response}, };
|
use axum::{routing::post, Json, Router, response::{IntoResponse, Response}, };
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
pub mod verify_bond;
|
82
taptrade-cli-demo/coordinator/src/coordinator/verify_bond.rs
Normal file
82
taptrade-cli-demo/coordinator/src/coordinator/verify_bond.rs
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
use bdk::bitcoin::consensus::encode::deserialize;
|
||||||
|
use bdk::bitcoin::psbt::PartiallySignedTransaction;
|
||||||
|
use bdk::bitcoin::Transaction;
|
||||||
|
use bdk::Wallet;
|
||||||
|
use bdk::database::MemoryDatabase;
|
||||||
|
use bdk::SignOptions;
|
||||||
|
|
||||||
|
use crate::communication::api::BondSubmissionRequest;
|
||||||
|
use crate::communication::api::OrderActivatedResponse;
|
||||||
|
|
||||||
|
|
||||||
|
use anyhow::{Result, anyhow};
|
||||||
|
use hex;
|
||||||
|
|
||||||
|
pub fn verify_and_respond(
|
||||||
|
bond_submission: BondSubmissionRequest,
|
||||||
|
wallet: &Wallet<MemoryDatabase>,
|
||||||
|
) -> Result<OrderActivatedResponse> {
|
||||||
|
// Deserialize the signed bond hex
|
||||||
|
let tx: Transaction = deserialize(hex::decode(bond_submission.signed_bond_hex)?.as_slice())?;
|
||||||
|
|
||||||
|
// Verify the transaction (this example assumes you've implemented your own verification logic)
|
||||||
|
let is_valid = verify_psbt(&tx, &wallet, &bond_submission)?;
|
||||||
|
if !is_valid {
|
||||||
|
return Err(anyhow!("Invalid PSBT"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the response (you may need additional logic to generate order_id_hex and timestamp)
|
||||||
|
let response = OrderActivatedResponse {
|
||||||
|
order_id_hex: generate_order_id(&tx)?, // Assuming you have a function to generate this
|
||||||
|
bond_locked_until_timestamp: calculate_bond_lock_time()?, // Assuming you have a function for this
|
||||||
|
};
|
||||||
|
|
||||||
|
Ok(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn verify_psbt(
|
||||||
|
tx: &Transaction,
|
||||||
|
wallet: &Wallet<MemoryDatabase>,
|
||||||
|
bond_submission: &BondSubmissionRequest,
|
||||||
|
) -> Result<bool> {
|
||||||
|
// Example verification logic
|
||||||
|
// Check if the payout address matches
|
||||||
|
// let payout_address = bond_submission.payout_address.parse();
|
||||||
|
// let output = tx.output.iter().find(|output| outputvc
|
||||||
|
// .script_pubkey == payout_address.script_pubkey());
|
||||||
|
// if output.is_none() {
|
||||||
|
// return Ok(false);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Check if the transaction is signed correctly
|
||||||
|
let mut psbt = PartiallySignedTransaction::from_unsigned_tx(tx.clone())?;
|
||||||
|
let finalized = wallet.sign(&mut psbt, SignOptions::default())?;
|
||||||
|
if !finalized {
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate MuSig data (assuming you have methods for this)
|
||||||
|
let musig_data_valid = validate_musig_data(&bond_submission.musig_pubkey_hex, &bond_submission.musig_pub_nonce_hex)?;
|
||||||
|
if !musig_data_valid {
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn generate_order_id(tx: &Transaction) -> Result<String> {
|
||||||
|
// Example logic to generate an order ID from the transaction
|
||||||
|
Ok(tx.txid().to_string())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn calculate_bond_lock_time() -> Result<u128> {
|
||||||
|
// Example logic to calculate the bond lock time
|
||||||
|
// This might depend on the current block height or a specific timestamp
|
||||||
|
Ok(12345678901234567890) // Placeholder value
|
||||||
|
}
|
||||||
|
|
||||||
|
fn validate_musig_data(pubkey_hex: &str, nonce_hex: &str) -> Result<bool> {
|
||||||
|
// Example logic to validate MuSig data
|
||||||
|
// This might involve parsing the hex strings and ensuring they match expected values
|
||||||
|
Ok(true) // Placeholder validation
|
||||||
|
}
|
Reference in New Issue
Block a user