Complete Refund path

This commit is contained in:
Franck Royer 2020-11-24 16:44:27 +11:00 committed by rishflab
parent bff83bbe99
commit 4c4a10098c

View File

@ -40,7 +40,7 @@ use xmr_btc::{
alice::{self, action_generator, Action, ReceiveBitcoinRedeemEncsig, State0, State3}, alice::{self, action_generator, Action, ReceiveBitcoinRedeemEncsig, State0, State3},
bitcoin::{ bitcoin::{
poll_until_block_height_is_gte, BroadcastSignedTransaction, GetRawTransaction, poll_until_block_height_is_gte, BroadcastSignedTransaction, GetRawTransaction,
TransactionBlockHeight, TxCancel, WatchForRawTransaction, TransactionBlockHeight, TxCancel, TxRefund, WatchForRawTransaction,
}, },
bob, bob,
monero::{CreateWalletForOutput, Transfer}, monero::{CreateWalletForOutput, Transfer},
@ -83,7 +83,9 @@ pub enum AliceState {
tx_cancel: TxCancel, tx_cancel: TxCancel,
}, },
BtcRefunded { BtcRefunded {
refund_tx: ::bitcoin::Transaction, tx_refund: TxRefund,
published_refund_tx: ::bitcoin::Transaction,
state3: State3,
}, },
BtcPunishable, BtcPunishable,
XmrRefunded, XmrRefunded,
@ -462,9 +464,13 @@ where
) )
.await .await
} }
Either::Right((refund_tx, _)) => { Either::Right((published_refund_tx, _)) => {
simple_swap( simple_swap(
AliceState::BtcRefunded { refund_tx }, AliceState::BtcRefunded {
tx_refund,
published_refund_tx,
state3,
},
rng, rng,
swarm, swarm,
db, db,
@ -475,7 +481,35 @@ where
} }
} }
} }
AliceState::BtcRefunded { .. } => todo!(), AliceState::BtcRefunded {
tx_refund,
published_refund_tx,
state3,
} => {
let s_a = monero::PrivateKey {
scalar: state3.s_a.into_ed25519(),
};
let tx_refund_sig = tx_refund
.extract_signature_by_key(published_refund_tx, state3.a.public())
.context("Failed to extract signature from Bitcoin refund tx")?;
let tx_refund_encsig = state3
.a
.encsign(state3.S_b_bitcoin.clone(), tx_refund.digest());
let s_b = bitcoin::recover(state3.S_b_bitcoin, tx_refund_sig, tx_refund_encsig)
.context("Failed to recover Monero secret key from Bitcoin signature")?;
let s_b = monero::private_key_from_secp256k1_scalar(s_b.into());
let spend_key = s_a + s_b;
let view_key = state3.v;
monero_wallet
.create_and_load_wallet_for_output(spend_key, view_key)
.await?;
Ok(AliceState::XmrRefunded)
}
AliceState::BtcPunishable => todo!(), AliceState::BtcPunishable => todo!(),
AliceState::XmrRefunded => Ok(AliceState::XmrRefunded), AliceState::XmrRefunded => Ok(AliceState::XmrRefunded),
AliceState::BtcRedeemed => Ok(AliceState::BtcRedeemed), AliceState::BtcRedeemed => Ok(AliceState::BtcRedeemed),