@@ -741,138 +741,140 @@ void CWallet::MarkDirty()
741
741
}
742
742
}
743
743
744
- bool CWallet::AddToWallet (const CWalletTx& wtxIn, bool fFromLoadWallet , CWalletDB* pwalletdb)
744
+ bool CWallet::AddToWallet (const CWalletTx& wtxIn, CWalletDB* pwalletdb)
745
745
{
746
746
uint256 hash = wtxIn.GetHash ();
747
747
748
- if (fFromLoadWallet )
749
- {
750
- mapWallet[hash] = wtxIn;
751
- CWalletTx& wtx = mapWallet[hash];
752
- wtx.BindWallet (this );
748
+ LOCK (cs_wallet);
749
+ // Inserts only if not already there, returns tx inserted or tx found
750
+ pair<map<uint256, CWalletTx>::iterator, bool > ret = mapWallet.insert (make_pair (hash, wtxIn));
751
+ CWalletTx& wtx = (*ret.first ).second ;
752
+ wtx.BindWallet (this );
753
+ bool fInsertedNew = ret.second ;
754
+ if (fInsertedNew )
755
+ {
756
+ wtx.nTimeReceived = GetAdjustedTime ();
757
+ wtx.nOrderPos = IncOrderPosNext (pwalletdb);
753
758
wtxOrdered.insert (make_pair (wtx.nOrderPos , TxPair (&wtx, (CAccountingEntry*)0 )));
754
- AddToSpends (hash);
755
- BOOST_FOREACH (const CTxIn& txin, wtx.vin ) {
756
- if (mapWallet.count (txin.prevout .hash )) {
757
- CWalletTx& prevtx = mapWallet[txin.prevout .hash ];
758
- if (prevtx.nIndex == -1 && !prevtx.hashUnset ()) {
759
- MarkConflicted (prevtx.hashBlock , wtx.GetHash ());
760
- }
761
- }
762
- }
763
- }
764
- else
765
- {
766
- LOCK (cs_wallet);
767
- // Inserts only if not already there, returns tx inserted or tx found
768
- pair<map<uint256, CWalletTx>::iterator, bool > ret = mapWallet.insert (make_pair (hash, wtxIn));
769
- CWalletTx& wtx = (*ret.first ).second ;
770
- wtx.BindWallet (this );
771
- bool fInsertedNew = ret.second ;
772
- if (fInsertedNew )
773
- {
774
- wtx.nTimeReceived = GetAdjustedTime ();
775
- wtx.nOrderPos = IncOrderPosNext (pwalletdb);
776
- wtxOrdered.insert (make_pair (wtx.nOrderPos , TxPair (&wtx, (CAccountingEntry*)0 )));
777
-
778
- wtx.nTimeSmart = wtx.nTimeReceived ;
779
- if (!wtxIn.hashUnset ())
759
+
760
+ wtx.nTimeSmart = wtx.nTimeReceived ;
761
+ if (!wtxIn.hashUnset ())
762
+ {
763
+ if (mapBlockIndex.count (wtxIn.hashBlock ))
780
764
{
781
- if (mapBlockIndex.count (wtxIn.hashBlock ))
765
+ int64_t latestNow = wtx.nTimeReceived ;
766
+ int64_t latestEntry = 0 ;
782
767
{
783
- int64_t latestNow = wtx.nTimeReceived ;
784
- int64_t latestEntry = 0 ;
768
+ // Tolerate times up to the last timestamp in the wallet not more than 5 minutes into the future
769
+ int64_t latestTolerated = latestNow + 300 ;
770
+ const TxItems & txOrdered = wtxOrdered;
771
+ for (TxItems::const_reverse_iterator it = txOrdered.rbegin (); it != txOrdered.rend (); ++it)
785
772
{
786
- // Tolerate times up to the last timestamp in the wallet not more than 5 minutes into the future
787
- int64_t latestTolerated = latestNow + 300 ;
788
- const TxItems & txOrdered = wtxOrdered;
789
- for (TxItems::const_reverse_iterator it = txOrdered.rbegin (); it != txOrdered.rend (); ++it)
773
+ CWalletTx *const pwtx = (*it).second .first ;
774
+ if (pwtx == &wtx)
775
+ continue ;
776
+ CAccountingEntry *const pacentry = (*it).second .second ;
777
+ int64_t nSmartTime;
778
+ if (pwtx)
790
779
{
791
- CWalletTx *const pwtx = (*it).second .first ;
792
- if (pwtx == &wtx)
793
- continue ;
794
- CAccountingEntry *const pacentry = (*it).second .second ;
795
- int64_t nSmartTime;
796
- if (pwtx)
797
- {
798
- nSmartTime = pwtx->nTimeSmart ;
799
- if (!nSmartTime)
800
- nSmartTime = pwtx->nTimeReceived ;
801
- }
802
- else
803
- nSmartTime = pacentry->nTime ;
804
- if (nSmartTime <= latestTolerated)
805
- {
806
- latestEntry = nSmartTime;
807
- if (nSmartTime > latestNow)
808
- latestNow = nSmartTime;
809
- break ;
810
- }
780
+ nSmartTime = pwtx->nTimeSmart ;
781
+ if (!nSmartTime)
782
+ nSmartTime = pwtx->nTimeReceived ;
783
+ }
784
+ else
785
+ nSmartTime = pacentry->nTime ;
786
+ if (nSmartTime <= latestTolerated)
787
+ {
788
+ latestEntry = nSmartTime;
789
+ if (nSmartTime > latestNow)
790
+ latestNow = nSmartTime;
791
+ break ;
811
792
}
812
793
}
813
-
814
- int64_t blocktime = mapBlockIndex[wtxIn.hashBlock ]->GetBlockTime ();
815
- wtx.nTimeSmart = std::max (latestEntry, std::min (blocktime, latestNow));
816
794
}
817
- else
818
- LogPrintf (" AddToWallet(): found %s in block %s not in index\n " ,
819
- wtxIn.GetHash ().ToString (),
820
- wtxIn.hashBlock .ToString ());
795
+
796
+ int64_t blocktime = mapBlockIndex[wtxIn.hashBlock ]->GetBlockTime ();
797
+ wtx.nTimeSmart = std::max (latestEntry, std::min (blocktime, latestNow));
821
798
}
822
- AddToSpends (hash);
799
+ else
800
+ LogPrintf (" AddToWallet(): found %s in block %s not in index\n " ,
801
+ wtxIn.GetHash ().ToString (),
802
+ wtxIn.hashBlock .ToString ());
823
803
}
804
+ AddToSpends (hash);
805
+ }
824
806
825
- bool fUpdated = false ;
826
- if (!fInsertedNew )
807
+ bool fUpdated = false ;
808
+ if (!fInsertedNew )
809
+ {
810
+ // Merge
811
+ if (!wtxIn.hashUnset () && wtxIn.hashBlock != wtx.hashBlock )
827
812
{
828
- // Merge
829
- if (!wtxIn.hashUnset () && wtxIn.hashBlock != wtx.hashBlock )
830
- {
831
- wtx.hashBlock = wtxIn.hashBlock ;
832
- fUpdated = true ;
833
- }
834
- // If no longer abandoned, update
835
- if (wtxIn.hashBlock .IsNull () && wtx.isAbandoned ())
836
- {
837
- wtx.hashBlock = wtxIn.hashBlock ;
838
- fUpdated = true ;
839
- }
840
- if (wtxIn.nIndex != -1 && (wtxIn.nIndex != wtx.nIndex ))
841
- {
842
- wtx.nIndex = wtxIn.nIndex ;
843
- fUpdated = true ;
844
- }
845
- if (wtxIn.fFromMe && wtxIn.fFromMe != wtx.fFromMe )
846
- {
847
- wtx.fFromMe = wtxIn.fFromMe ;
848
- fUpdated = true ;
849
- }
813
+ wtx.hashBlock = wtxIn.hashBlock ;
814
+ fUpdated = true ;
850
815
}
816
+ // If no longer abandoned, update
817
+ if (wtxIn.hashBlock .IsNull () && wtx.isAbandoned ())
818
+ {
819
+ wtx.hashBlock = wtxIn.hashBlock ;
820
+ fUpdated = true ;
821
+ }
822
+ if (wtxIn.nIndex != -1 && (wtxIn.nIndex != wtx.nIndex ))
823
+ {
824
+ wtx.nIndex = wtxIn.nIndex ;
825
+ fUpdated = true ;
826
+ }
827
+ if (wtxIn.fFromMe && wtxIn.fFromMe != wtx.fFromMe )
828
+ {
829
+ wtx.fFromMe = wtxIn.fFromMe ;
830
+ fUpdated = true ;
831
+ }
832
+ }
851
833
852
- // // debug print
853
- LogPrintf (" AddToWallet %s %s%s\n " , wtxIn.GetHash ().ToString (), (fInsertedNew ? " new" : " " ), (fUpdated ? " update" : " " ));
834
+ // // debug print
835
+ LogPrintf (" AddToWallet %s %s%s\n " , wtxIn.GetHash ().ToString (), (fInsertedNew ? " new" : " " ), (fUpdated ? " update" : " " ));
854
836
855
- // Write to disk
856
- if (fInsertedNew || fUpdated )
857
- if (!pwalletdb->WriteTx (wtx))
858
- return false ;
837
+ // Write to disk
838
+ if (fInsertedNew || fUpdated )
839
+ if (!pwalletdb->WriteTx (wtx))
840
+ return false ;
859
841
860
- // Break debit/credit balance caches:
861
- wtx.MarkDirty ();
842
+ // Break debit/credit balance caches:
843
+ wtx.MarkDirty ();
862
844
863
- // Notify UI of new or updated transaction
864
- NotifyTransactionChanged (this , hash, fInsertedNew ? CT_NEW : CT_UPDATED);
845
+ // Notify UI of new or updated transaction
846
+ NotifyTransactionChanged (this , hash, fInsertedNew ? CT_NEW : CT_UPDATED);
865
847
866
- // notify an external script when a wallet transaction comes in or is updated
867
- std::string strCmd = GetArg (" -walletnotify" , " " );
848
+ // notify an external script when a wallet transaction comes in or is updated
849
+ std::string strCmd = GetArg (" -walletnotify" , " " );
868
850
869
- if ( !strCmd.empty ())
870
- {
871
- boost::replace_all (strCmd, " %s" , wtxIn.GetHash ().GetHex ());
872
- boost::thread t (runCommand, strCmd); // thread runs free
873
- }
851
+ if ( !strCmd.empty ())
852
+ {
853
+ boost::replace_all (strCmd, " %s" , wtxIn.GetHash ().GetHex ());
854
+ boost::thread t (runCommand, strCmd); // thread runs free
855
+ }
856
+
857
+ return true ;
858
+ }
859
+
860
+ bool CWallet::LoadToWallet (const CWalletTx& wtxIn)
861
+ {
862
+ uint256 hash = wtxIn.GetHash ();
874
863
864
+ mapWallet[hash] = wtxIn;
865
+ CWalletTx& wtx = mapWallet[hash];
866
+ wtx.BindWallet (this );
867
+ wtxOrdered.insert (make_pair (wtx.nOrderPos , TxPair (&wtx, (CAccountingEntry*)0 )));
868
+ AddToSpends (hash);
869
+ BOOST_FOREACH (const CTxIn& txin, wtx.vin ) {
870
+ if (mapWallet.count (txin.prevout .hash )) {
871
+ CWalletTx& prevtx = mapWallet[txin.prevout .hash ];
872
+ if (prevtx.nIndex == -1 && !prevtx.hashUnset ()) {
873
+ MarkConflicted (prevtx.hashBlock , wtx.GetHash ());
874
+ }
875
+ }
875
876
}
877
+
876
878
return true ;
877
879
}
878
880
@@ -913,7 +915,7 @@ bool CWallet::AddToWalletIfInvolvingMe(const CTransaction& tx, const CBlock* pbl
913
915
// this is safe, as in case of a crash, we rescan the necessary blocks on startup through our SetBestChain-mechanism
914
916
CWalletDB walletdb (strWalletFile, " r+" , false );
915
917
916
- return AddToWallet (wtx, false , &walletdb);
918
+ return AddToWallet (wtx, &walletdb);
917
919
}
918
920
}
919
921
return false ;
@@ -2456,7 +2458,7 @@ bool CWallet::CommitTransaction(CWalletTx& wtxNew, CReserveKey& reservekey)
2456
2458
2457
2459
// Add tx to wallet, because if it has change it's also ours,
2458
2460
// otherwise just for transaction history.
2459
- AddToWallet (wtxNew, false , pwalletdb);
2461
+ AddToWallet (wtxNew, pwalletdb);
2460
2462
2461
2463
// Notify that old coins are spent
2462
2464
set<CWalletTx*> setCoins;
0 commit comments