@@ -22,7 +22,7 @@ use witnet_data_structures::{
2222 } ,
2323 error:: { ChainInfoError , TransactionError :: DataRequestNotFound } ,
2424 proto:: versioning:: ProtocolVersion ,
25- staking:: errors:: StakesError ,
25+ staking:: { errors:: StakesError , prelude :: StakeKey } ,
2626 transaction:: {
2727 DRTransaction , StakeTransaction , Transaction , UnstakeTransaction , VTTransaction ,
2828 } ,
@@ -1410,47 +1410,60 @@ impl Handler<BuildUnstake> for ChainManager {
14101410 ) ) ;
14111411 }
14121412
1413- let withdrawal = ValueTransferOutput {
1414- time_lock : PSEUDO_CONSENSUS_CONSTANTS_POS_UNSTAKING_DELAY_SECONDS ,
1415- pkh : self . own_pkh . unwrap ( ) ,
1416- value : msg. value ,
1417- } ;
1418- match transaction_factory:: build_ut ( msg. operator , withdrawal, msg. fee ) {
1413+ match self . chain_state . stakes . query_nonce ( StakeKey {
1414+ validator : msg. operator ,
1415+ withdrawer : self . own_pkh . unwrap ( ) ,
1416+ } ) {
14191417 Err ( e) => {
14201418 log:: error!( "Error when building stake transaction: {}" , e) ;
14211419 Box :: pin ( actix:: fut:: err ( e. into ( ) ) )
14221420 }
1423- Ok ( ut) => {
1424- let fut = signature_mngr:: sign_transaction ( & ut, 1 )
1425- . into_actor ( self )
1426- . then ( move |s, act, _ctx| match s {
1427- Ok ( signature) => {
1428- let ut =
1429- UnstakeTransaction :: new ( ut, signature. first ( ) . unwrap ( ) . clone ( ) ) ;
1421+ Ok ( nonce) => {
1422+ let withdrawal = ValueTransferOutput {
1423+ time_lock : PSEUDO_CONSENSUS_CONSTANTS_POS_UNSTAKING_DELAY_SECONDS ,
1424+ pkh : self . own_pkh . unwrap ( ) ,
1425+ value : msg. value ,
1426+ } ;
1427+ match transaction_factory:: build_ut ( msg. operator , withdrawal, msg. fee , nonce) {
1428+ Err ( e) => {
1429+ log:: error!( "Error when building stake transaction: {}" , e) ;
1430+ Box :: pin ( actix:: fut:: err ( e. into ( ) ) )
1431+ }
1432+ Ok ( ut) => {
1433+ let fut = signature_mngr:: sign_transaction ( & ut, 1 )
1434+ . into_actor ( self )
1435+ . then ( move |s, act, _ctx| match s {
1436+ Ok ( signature) => {
1437+ let ut = UnstakeTransaction :: new (
1438+ ut,
1439+ signature. first ( ) . unwrap ( ) . clone ( ) ,
1440+ ) ;
14301441
1431- if msg. dry_run {
1432- Either :: Right ( actix:: fut:: result ( Ok ( ut) ) )
1433- } else {
1434- let transaction = Transaction :: Unstake ( ut. clone ( ) ) ;
1435- Either :: Left (
1436- act. add_transaction (
1437- AddTransaction {
1438- transaction,
1439- broadcast_flag : true ,
1440- } ,
1441- get_timestamp ( ) ,
1442- )
1443- . map_ok ( move |_, _, _| ut) ,
1444- )
1445- }
1446- }
1447- Err ( e) => {
1448- log:: error!( "Failed to sign stake transaction: {}" , e) ;
1449- Either :: Right ( actix:: fut:: result ( Err ( e) ) )
1450- }
1451- } ) ;
1442+ if msg. dry_run {
1443+ Either :: Right ( actix:: fut:: result ( Ok ( ut) ) )
1444+ } else {
1445+ let transaction = Transaction :: Unstake ( ut. clone ( ) ) ;
1446+ Either :: Left (
1447+ act. add_transaction (
1448+ AddTransaction {
1449+ transaction,
1450+ broadcast_flag : true ,
1451+ } ,
1452+ get_timestamp ( ) ,
1453+ )
1454+ . map_ok ( move |_, _, _| ut) ,
1455+ )
1456+ }
1457+ }
1458+ Err ( e) => {
1459+ log:: error!( "Failed to sign stake transaction: {}" , e) ;
1460+ Either :: Right ( actix:: fut:: result ( Err ( e) ) )
1461+ }
1462+ } ) ;
14521463
1453- Box :: pin ( fut)
1464+ Box :: pin ( fut)
1465+ }
1466+ }
14541467 }
14551468 }
14561469 }
0 commit comments