|
|
|
@ -7,6 +7,7 @@
|
|
|
|
|
#include <qt/guiutil.h>
|
|
|
|
|
#include <qt/walletmodel.h>
|
|
|
|
|
|
|
|
|
|
#include <interface/node.h>
|
|
|
|
|
#include <key_io.h>
|
|
|
|
|
#include <wallet/wallet.h>
|
|
|
|
|
|
|
|
|
@ -67,28 +68,23 @@ static AddressTableEntry::Type translateTransactionType(const QString &strPurpos
|
|
|
|
|
class AddressTablePriv
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
CWallet *wallet;
|
|
|
|
|
QList<AddressTableEntry> cachedAddressTable;
|
|
|
|
|
AddressTableModel *parent;
|
|
|
|
|
|
|
|
|
|
AddressTablePriv(CWallet *_wallet, AddressTableModel *_parent):
|
|
|
|
|
wallet(_wallet), parent(_parent) {}
|
|
|
|
|
AddressTablePriv(AddressTableModel *_parent):
|
|
|
|
|
parent(_parent) {}
|
|
|
|
|
|
|
|
|
|
void refreshAddressTable()
|
|
|
|
|
void refreshAddressTable(interface::Wallet& wallet)
|
|
|
|
|
{
|
|
|
|
|
cachedAddressTable.clear();
|
|
|
|
|
{
|
|
|
|
|
LOCK(wallet->cs_wallet);
|
|
|
|
|
for (const std::pair<CTxDestination, CAddressBookData>& item : wallet->mapAddressBook)
|
|
|
|
|
for (const auto& address : wallet.getAddresses())
|
|
|
|
|
{
|
|
|
|
|
const CTxDestination& address = item.first;
|
|
|
|
|
bool fMine = IsMine(*wallet, address);
|
|
|
|
|
AddressTableEntry::Type addressType = translateTransactionType(
|
|
|
|
|
QString::fromStdString(item.second.purpose), fMine);
|
|
|
|
|
const std::string& strName = item.second.name;
|
|
|
|
|
QString::fromStdString(address.purpose), address.is_mine);
|
|
|
|
|
cachedAddressTable.append(AddressTableEntry(addressType,
|
|
|
|
|
QString::fromStdString(strName),
|
|
|
|
|
QString::fromStdString(EncodeDestination(address))));
|
|
|
|
|
QString::fromStdString(address.name),
|
|
|
|
|
QString::fromStdString(EncodeDestination(address.dest))));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// qLowerBound() and qUpperBound() require our cachedAddressTable list to be sorted in asc order
|
|
|
|
@ -162,12 +158,12 @@ public:
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
AddressTableModel::AddressTableModel(CWallet *_wallet, WalletModel *parent) :
|
|
|
|
|
QAbstractTableModel(parent),walletModel(parent),wallet(_wallet),priv(0)
|
|
|
|
|
AddressTableModel::AddressTableModel(WalletModel *parent) :
|
|
|
|
|
QAbstractTableModel(parent),walletModel(parent),priv(0)
|
|
|
|
|
{
|
|
|
|
|
columns << tr("Label") << tr("Address");
|
|
|
|
|
priv = new AddressTablePriv(wallet, this);
|
|
|
|
|
priv->refreshAddressTable();
|
|
|
|
|
priv = new AddressTablePriv(this);
|
|
|
|
|
priv->refreshAddressTable(parent->wallet());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
AddressTableModel::~AddressTableModel()
|
|
|
|
@ -244,7 +240,6 @@ bool AddressTableModel::setData(const QModelIndex &index, const QVariant &value,
|
|
|
|
|
|
|
|
|
|
if(role == Qt::EditRole)
|
|
|
|
|
{
|
|
|
|
|
LOCK(wallet->cs_wallet); /* For SetAddressBook / DelAddressBook */
|
|
|
|
|
CTxDestination curAddress = DecodeDestination(rec->address.toStdString());
|
|
|
|
|
if(index.column() == Label)
|
|
|
|
|
{
|
|
|
|
@ -254,7 +249,7 @@ bool AddressTableModel::setData(const QModelIndex &index, const QVariant &value,
|
|
|
|
|
editStatus = NO_CHANGES;
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
wallet->SetAddressBook(curAddress, value.toString().toStdString(), strPurpose);
|
|
|
|
|
walletModel->wallet().setAddressBook(curAddress, value.toString().toStdString(), strPurpose);
|
|
|
|
|
} else if(index.column() == Address) {
|
|
|
|
|
CTxDestination newAddress = DecodeDestination(value.toString().toStdString());
|
|
|
|
|
// Refuse to set invalid address, set error status and return false
|
|
|
|
@ -271,7 +266,7 @@ bool AddressTableModel::setData(const QModelIndex &index, const QVariant &value,
|
|
|
|
|
}
|
|
|
|
|
// Check for duplicate addresses to prevent accidental deletion of addresses, if you try
|
|
|
|
|
// to paste an existing address over another address (with a different label)
|
|
|
|
|
else if(wallet->mapAddressBook.count(newAddress))
|
|
|
|
|
if (walletModel->wallet().getAddress(newAddress))
|
|
|
|
|
{
|
|
|
|
|
editStatus = DUPLICATE_ADDRESS;
|
|
|
|
|
return false;
|
|
|
|
@ -280,9 +275,9 @@ bool AddressTableModel::setData(const QModelIndex &index, const QVariant &value,
|
|
|
|
|
else if(rec->type == AddressTableEntry::Sending)
|
|
|
|
|
{
|
|
|
|
|
// Remove old entry
|
|
|
|
|
wallet->DelAddressBook(curAddress);
|
|
|
|
|
walletModel->wallet().delAddressBook(curAddress);
|
|
|
|
|
// Add new entry with new address
|
|
|
|
|
wallet->SetAddressBook(newAddress, rec->label.toStdString(), strPurpose);
|
|
|
|
|
walletModel->wallet().setAddressBook(newAddress, value.toString().toStdString(), strPurpose);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return true;
|
|
|
|
@ -356,8 +351,7 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
|
|
|
|
|
}
|
|
|
|
|
// Check for duplicate addresses
|
|
|
|
|
{
|
|
|
|
|
LOCK(wallet->cs_wallet);
|
|
|
|
|
if(wallet->mapAddressBook.count(DecodeDestination(strAddress)))
|
|
|
|
|
if(walletModel->wallet().getAddress(DecodeDestination(strAddress)))
|
|
|
|
|
{
|
|
|
|
|
editStatus = DUPLICATE_ADDRESS;
|
|
|
|
|
return QString();
|
|
|
|
@ -368,7 +362,7 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
|
|
|
|
|
{
|
|
|
|
|
// Generate a new address to associate with given label
|
|
|
|
|
CPubKey newKey;
|
|
|
|
|
if(!wallet->GetKeyFromPool(newKey))
|
|
|
|
|
if(!walletModel->wallet().getKeyFromPool(false /* internal */, newKey))
|
|
|
|
|
{
|
|
|
|
|
WalletModel::UnlockContext ctx(walletModel->requestUnlock());
|
|
|
|
|
if(!ctx.isValid())
|
|
|
|
@ -377,13 +371,13 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
|
|
|
|
|
editStatus = WALLET_UNLOCK_FAILURE;
|
|
|
|
|
return QString();
|
|
|
|
|
}
|
|
|
|
|
if(!wallet->GetKeyFromPool(newKey))
|
|
|
|
|
if(!walletModel->wallet().getKeyFromPool(false /* internal */, newKey))
|
|
|
|
|
{
|
|
|
|
|
editStatus = KEY_GENERATION_FAILURE;
|
|
|
|
|
return QString();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
wallet->LearnRelatedScripts(newKey, address_type);
|
|
|
|
|
walletModel->wallet().learnRelatedScripts(newKey, address_type);
|
|
|
|
|
strAddress = EncodeDestination(GetDestinationForKey(newKey, address_type));
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -392,7 +386,7 @@ QString AddressTableModel::addRow(const QString &type, const QString &label, con
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add entry
|
|
|
|
|
wallet->SetAddressBook(DecodeDestination(strAddress), strLabel,
|
|
|
|
|
walletModel->wallet().setAddressBook(DecodeDestination(strAddress), strLabel,
|
|
|
|
|
(type == Send ? "send" : "receive"));
|
|
|
|
|
return QString::fromStdString(strAddress);
|
|
|
|
|
}
|
|
|
|
@ -407,7 +401,7 @@ bool AddressTableModel::removeRows(int row, int count, const QModelIndex &parent
|
|
|
|
|
// Also refuse to remove receiving addresses.
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
wallet->DelAddressBook(DecodeDestination(rec->address.toStdString()));
|
|
|
|
|
walletModel->wallet().delAddressBook(DecodeDestination(rec->address.toStdString()));
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -416,12 +410,11 @@ bool AddressTableModel::removeRows(int row, int count, const QModelIndex &parent
|
|
|
|
|
QString AddressTableModel::labelForAddress(const QString &address) const
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
LOCK(wallet->cs_wallet);
|
|
|
|
|
CTxDestination destination = DecodeDestination(address.toStdString());
|
|
|
|
|
std::map<CTxDestination, CAddressBookData>::iterator mi = wallet->mapAddressBook.find(destination);
|
|
|
|
|
if (mi != wallet->mapAddressBook.end())
|
|
|
|
|
std::string name;
|
|
|
|
|
if (walletModel->wallet().getAddress(destination, &name))
|
|
|
|
|
{
|
|
|
|
|
return QString::fromStdString(mi->second.name);
|
|
|
|
|
return QString::fromStdString(name);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return QString();
|
|
|
|
@ -441,7 +434,7 @@ int AddressTableModel::lookupAddress(const QString &address) const
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
OutputType AddressTableModel::GetDefaultAddressType() const { return wallet->m_default_address_type; };
|
|
|
|
|
OutputType AddressTableModel::GetDefaultAddressType() const { return walletModel->wallet().getDefaultAddressType(); };
|
|
|
|
|
|
|
|
|
|
void AddressTableModel::emitDataChanged(int idx)
|
|
|
|
|
{
|
|
|
|
|