@@ -22,6 +22,7 @@ const QString AddressTableModel::Receive = "R";
2222const QString AddressTableModel::Zerocoin = " X" ;
2323const QString AddressTableModel::Delegators = " D" ;
2424const QString AddressTableModel::ColdStaking = " C" ;
25+ const QString AddressTableModel::ColdStakingSend = " Csend" ;
2526
2627struct AddressTableEntry {
2728 enum Type {
@@ -30,6 +31,7 @@ struct AddressTableEntry {
3031 Zerocoin,
3132 Delegators,
3233 ColdStaking,
34+ ColdStakingSend,
3335 Hidden /* QSortFilterProxyModel will filter these out */
3436 };
3537
@@ -73,6 +75,8 @@ static AddressTableEntry::Type translateTransactionType(const QString& strPurpos
7375 addressType = AddressTableEntry::Delegators;
7476 else if (strPurpose == QString::fromStdString (AddressBook::AddressBookPurpose::COLD_STAKING))
7577 addressType = AddressTableEntry::ColdStaking;
78+ else if (strPurpose == QString::fromStdString (AddressBook::AddressBookPurpose::COLD_STAKING_SEND))
79+ addressType = AddressTableEntry::ColdStakingSend;
7680 else if (strPurpose == " unknown" || strPurpose == " " ) // if purpose not set, guess
7781 addressType = (isMine ? AddressTableEntry::Receiving : AddressTableEntry::Sending);
7882 return addressType;
@@ -87,6 +91,7 @@ class AddressTablePriv
8791 int sendNum = 0 ;
8892 int recvNum = 0 ;
8993 int dellNum = 0 ;
94+ int coldSendNum = 0 ;
9095 AddressTableModel* parent;
9196
9297 AddressTablePriv (CWallet* wallet, AddressTableModel* parent) : wallet(wallet), parent(parent) {}
@@ -97,39 +102,22 @@ class AddressTablePriv
97102 {
98103 LOCK (wallet->cs_wallet );
99104 for (const PAIRTYPE (CTxDestination, AddressBook::CAddressBookData) & item : wallet->mapAddressBook ) {
100- const CBitcoinAddress& address = item.first ;
105+
106+ const CChainParams::Base58Type addrType =
107+ item.second .isColdStakingPurpose () ?
108+ CChainParams::STAKING_ADDRESS : CChainParams::PUBKEY_ADDRESS;
109+ const CBitcoinAddress address = CBitcoinAddress (item.first , addrType);
110+
101111 bool fMine = IsMine (*wallet, address.Get ());
102112 AddressTableEntry::Type addressType = translateTransactionType (
103113 QString::fromStdString (item.second .purpose ), fMine );
104114 const std::string& strName = item.second .name ;
105115
106116 uint creationTime = 0 ;
107-
108- if (item.second .purpose == " receive" ){
117+ if (item.second .isReceivePurpose ())
109118 creationTime = static_cast <uint>(wallet->GetKeyCreationTime (address));
110- recvNum++;
111- } else if (item.second .purpose == " send" ){
112- sendNum++;
113- } else if (item.second .purpose == AddressBook::AddressBookPurpose::DELEGABLE
114- || item.second .purpose == AddressBook::AddressBookPurpose::DELEGATOR
115- || item.second .purpose == AddressBook::AddressBookPurpose::COLD_STAKING) {
116- dellNum++;
117-
118- // TODO: Remove this when addresses are well parsed, this is a dirty dirty way to fix things quickly only for testing purposes..
119- CKeyID keyID;
120- if (address.GetKeyID (keyID)) {
121- CBitcoinAddress stakingAddress (keyID, CChainParams::STAKING_ADDRESS);
122- cachedAddressTable.append (
123- AddressTableEntry (addressType,
124- QString::fromStdString (strName),
125- QString::fromStdString (stakingAddress.ToString ()),
126- creationTime
127- )
128- );
129- }
130- continue ;
131- }
132119
120+ updatePurposeCachedCounted (item.second .purpose , true );
133121 cachedAddressTable.append (
134122 AddressTableEntry (addressType,
135123 QString::fromStdString (strName),
@@ -145,6 +133,20 @@ class AddressTablePriv
145133 qSort (cachedAddressTable.begin (), cachedAddressTable.end (), AddressTableEntryLessThan ());
146134 }
147135
136+ void updatePurposeCachedCounted (std::string purpose, bool add) {
137+ int *var;
138+ if (purpose == AddressBook::AddressBookPurpose::RECEIVE) {
139+ var = &recvNum;
140+ } else if (purpose == AddressBook::AddressBookPurpose::SEND) {
141+ var = &sendNum;
142+ } else if (purpose == AddressBook::AddressBookPurpose::COLD_STAKING_SEND) {
143+ var = &coldSendNum;
144+ } else if (purpose == AddressBook::AddressBookPurpose::DELEGABLE || purpose == AddressBook::AddressBookPurpose::DELEGATOR) {
145+ var = &dellNum;
146+ }
147+ if (add) (*var)++; else (*var)--;
148+ }
149+
148150 void updateEntry (const QString& address, const QString& label, bool isMine, const QString& purpose, int status)
149151 {
150152 // Find address / label in model
@@ -164,12 +166,13 @@ class AddressTablePriv
164166 break ;
165167 }
166168 uint creationTime = 0 ;
167- if (purpose == " receive" ) {
169+
170+ std::string stdPurpose = purpose.toStdString ();
171+ if (stdPurpose == AddressBook::AddressBookPurpose::RECEIVE)
168172 creationTime = static_cast <uint>(wallet->GetKeyCreationTime (CBitcoinAddress (address.toStdString ())));
169- recvNum++;
170- } else if (purpose == " send" ) {
171- sendNum++;
172- }
173+
174+ updatePurposeCachedCounted (stdPurpose, true );
175+
173176 parent->beginInsertRows (QModelIndex (), lowerIndex, lowerIndex);
174177 cachedAddressTable.insert (lowerIndex, AddressTableEntry (newEntryType, label, address, creationTime));
175178 parent->endInsertRows ();
@@ -193,11 +196,7 @@ class AddressTablePriv
193196 parent->beginRemoveRows (QModelIndex (), lowerIndex, upperIndex - 1 );
194197 cachedAddressTable.erase (lower, upper);
195198 parent->endRemoveRows ();
196- if (purpose == " receive" ) {
197- recvNum--;
198- } else if (purpose == " send" ) {
199- sendNum--;
200- }
199+ updatePurposeCachedCounted (purpose.toStdString (), false );
201200 break ;
202201 }
203202 }
@@ -257,6 +256,10 @@ class AddressTablePriv
257256 return dellNum;
258257 }
259258
259+ int SizeColdSend () {
260+ return coldSendNum;
261+ }
262+
260263 AddressTableEntry* index (int idx)
261264 {
262265 if (idx >= 0 && idx < cachedAddressTable.size ()) {
@@ -302,6 +305,10 @@ int AddressTableModel::sizeDell() const {
302305 return priv->sizeDell ();
303306}
304307
308+ int AddressTableModel::sizeColdSend () const {
309+ return priv->SizeColdSend ();
310+ }
311+
305312QVariant AddressTableModel::data (const QModelIndex& index, int role) const
306313{
307314 if (!index.isValid ())
@@ -338,6 +345,8 @@ QVariant AddressTableModel::data(const QModelIndex& index, int role) const
338345 return Delegators;
339346 case AddressTableEntry::ColdStaking:
340347 return ColdStaking;
348+ case AddressTableEntry::ColdStakingSend:
349+ return ColdStakingSend;
341350 default :
342351 break ;
343352 }
@@ -503,14 +512,15 @@ bool AddressTableModel::removeRows(int row, int count, const QModelIndex& parent
503512{
504513 Q_UNUSED (parent);
505514 AddressTableEntry* rec = priv->index (row);
506- if (count != 1 || !rec || rec->type == AddressTableEntry::Receiving) {
515+ if (count != 1 || !rec || rec->type == AddressTableEntry::Receiving || rec-> type == AddressTableEntry::ColdStaking ) {
507516 // Can only remove one row at a time, and cannot remove rows not in model.
508517 // Also refuse to remove receiving addresses.
509518 return false ;
510519 }
520+ const CChainParams::Base58Type addrType = (rec->type == AddressTableEntry::ColdStakingSend) ? CChainParams::STAKING_ADDRESS : CChainParams::PUBKEY_ADDRESS;
511521 {
512522 LOCK (wallet->cs_wallet );
513- return wallet->DelAddressBook (CBitcoinAddress (rec->address .toStdString ()).Get ());
523+ return wallet->DelAddressBook (CBitcoinAddress (rec->address .toStdString ()).Get (), addrType );
514524 }
515525}
516526
@@ -536,15 +546,7 @@ QString AddressTableModel::labelForAddress(const QString& address) const
536546 */
537547std::string AddressTableModel::purposeForAddress (const std::string& address) const
538548{
539- {
540- LOCK (wallet->cs_wallet );
541- CBitcoinAddress address_parsed (address);
542- std::map<CTxDestination, AddressBook::CAddressBookData>::iterator mi = wallet->mapAddressBook .find (address_parsed.Get ());
543- if (mi != wallet->mapAddressBook .end ()) {
544- return mi->second .purpose ;
545- }
546- }
547- return " " ;
549+ return wallet->purposeForAddress (CBitcoinAddress (address).Get ());
548550}
549551
550552int AddressTableModel::lookupAddress (const QString& address) const
0 commit comments