mirror of
https://codeberg.org/anoncontributorxmr/monero.git
synced 2024-11-26 09:24:47 +00:00
Wallet2 + API: Callbacks for unconfirmed transfers
This commit is contained in:
parent
c6ec939626
commit
db56a03ff2
10 changed files with 83 additions and 6 deletions
|
@ -1542,6 +1542,11 @@ void simple_wallet::on_money_received(uint64_t height, const cryptonote::transac
|
||||||
m_refresh_progress_reporter.update(height, true);
|
m_refresh_progress_reporter.update(height, true);
|
||||||
}
|
}
|
||||||
//----------------------------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------------------------
|
||||||
|
void simple_wallet::on_unconfirmed_money_received(uint64_t height, const cryptonote::transaction& tx, uint64_t amount)
|
||||||
|
{
|
||||||
|
// Not implemented in CLI wallet
|
||||||
|
}
|
||||||
|
//----------------------------------------------------------------------------------------------------
|
||||||
void simple_wallet::on_money_spent(uint64_t height, const cryptonote::transaction& in_tx, uint64_t amount, const cryptonote::transaction& spend_tx)
|
void simple_wallet::on_money_spent(uint64_t height, const cryptonote::transaction& in_tx, uint64_t amount, const cryptonote::transaction& spend_tx)
|
||||||
{
|
{
|
||||||
message_writer(epee::log_space::console_color_magenta, false) << "\r" <<
|
message_writer(epee::log_space::console_color_magenta, false) << "\r" <<
|
||||||
|
|
|
@ -184,6 +184,7 @@ namespace cryptonote
|
||||||
//----------------- i_wallet2_callback ---------------------
|
//----------------- i_wallet2_callback ---------------------
|
||||||
virtual void on_new_block(uint64_t height, const cryptonote::block& block);
|
virtual void on_new_block(uint64_t height, const cryptonote::block& block);
|
||||||
virtual void on_money_received(uint64_t height, const cryptonote::transaction& tx, uint64_t amount);
|
virtual void on_money_received(uint64_t height, const cryptonote::transaction& tx, uint64_t amount);
|
||||||
|
virtual void on_unconfirmed_money_received(uint64_t height, const cryptonote::transaction& tx, uint64_t amount);
|
||||||
virtual void on_money_spent(uint64_t height, const cryptonote::transaction& in_tx, uint64_t amount, const cryptonote::transaction& spend_tx);
|
virtual void on_money_spent(uint64_t height, const cryptonote::transaction& in_tx, uint64_t amount, const cryptonote::transaction& spend_tx);
|
||||||
virtual void on_skip_transaction(uint64_t height, const cryptonote::transaction& tx);
|
virtual void on_skip_transaction(uint64_t height, const cryptonote::transaction& tx);
|
||||||
//----------------------------------------------------------
|
//----------------------------------------------------------
|
||||||
|
|
|
@ -102,6 +102,7 @@ void TransactionHistoryImpl::refresh()
|
||||||
// TODO: configurable values;
|
// TODO: configurable values;
|
||||||
uint64_t min_height = 0;
|
uint64_t min_height = 0;
|
||||||
uint64_t max_height = (uint64_t)-1;
|
uint64_t max_height = (uint64_t)-1;
|
||||||
|
uint64_t wallet_height = m_wallet->blockChainHeight();
|
||||||
|
|
||||||
// delete old transactions;
|
// delete old transactions;
|
||||||
for (auto t : m_history)
|
for (auto t : m_history)
|
||||||
|
@ -123,15 +124,14 @@ void TransactionHistoryImpl::refresh()
|
||||||
std::string payment_id = string_tools::pod_to_hex(i->first);
|
std::string payment_id = string_tools::pod_to_hex(i->first);
|
||||||
if (payment_id.substr(16).find_first_not_of('0') == std::string::npos)
|
if (payment_id.substr(16).find_first_not_of('0') == std::string::npos)
|
||||||
payment_id = payment_id.substr(0,16);
|
payment_id = payment_id.substr(0,16);
|
||||||
// TODO
|
|
||||||
TransactionInfoImpl * ti = new TransactionInfoImpl();
|
TransactionInfoImpl * ti = new TransactionInfoImpl();
|
||||||
ti->m_paymentid = payment_id;
|
ti->m_paymentid = payment_id;
|
||||||
ti->m_amount = pd.m_amount;
|
ti->m_amount = pd.m_amount;
|
||||||
ti->m_direction = TransactionInfo::Direction_In;
|
ti->m_direction = TransactionInfo::Direction_In;
|
||||||
ti->m_hash = string_tools::pod_to_hex(pd.m_tx_hash);
|
ti->m_hash = string_tools::pod_to_hex(pd.m_tx_hash);
|
||||||
ti->m_blockheight = pd.m_block_height;
|
ti->m_blockheight = pd.m_block_height;
|
||||||
// TODO:
|
|
||||||
ti->m_timestamp = pd.m_timestamp;
|
ti->m_timestamp = pd.m_timestamp;
|
||||||
|
ti->m_confirmations = wallet_height - pd.m_block_height;
|
||||||
m_history.push_back(ti);
|
m_history.push_back(ti);
|
||||||
|
|
||||||
/* output.insert(std::make_pair(pd.m_block_height, std::make_pair(true, (boost::format("%20.20s %s %s %s")
|
/* output.insert(std::make_pair(pd.m_block_height, std::make_pair(true, (boost::format("%20.20s %s %s %s")
|
||||||
|
@ -174,6 +174,7 @@ void TransactionHistoryImpl::refresh()
|
||||||
ti->m_hash = string_tools::pod_to_hex(hash);
|
ti->m_hash = string_tools::pod_to_hex(hash);
|
||||||
ti->m_blockheight = pd.m_block_height;
|
ti->m_blockheight = pd.m_block_height;
|
||||||
ti->m_timestamp = pd.m_timestamp;
|
ti->m_timestamp = pd.m_timestamp;
|
||||||
|
ti->m_confirmations = wallet_height - pd.m_block_height;
|
||||||
|
|
||||||
// single output transaction might contain multiple transfers
|
// single output transaction might contain multiple transfers
|
||||||
for (const auto &d: pd.m_dests) {
|
for (const auto &d: pd.m_dests) {
|
||||||
|
@ -183,9 +184,9 @@ void TransactionHistoryImpl::refresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
// unconfirmed output transactions
|
// unconfirmed output transactions
|
||||||
std::list<std::pair<crypto::hash, tools::wallet2::unconfirmed_transfer_details>> upayments;
|
std::list<std::pair<crypto::hash, tools::wallet2::unconfirmed_transfer_details>> upayments_out;
|
||||||
m_wallet->m_wallet->get_unconfirmed_payments_out(upayments);
|
m_wallet->m_wallet->get_unconfirmed_payments_out(upayments_out);
|
||||||
for (std::list<std::pair<crypto::hash, tools::wallet2::unconfirmed_transfer_details>>::const_iterator i = upayments.begin(); i != upayments.end(); ++i) {
|
for (std::list<std::pair<crypto::hash, tools::wallet2::unconfirmed_transfer_details>>::const_iterator i = upayments_out.begin(); i != upayments_out.end(); ++i) {
|
||||||
const tools::wallet2::unconfirmed_transfer_details &pd = i->second;
|
const tools::wallet2::unconfirmed_transfer_details &pd = i->second;
|
||||||
const crypto::hash &hash = i->first;
|
const crypto::hash &hash = i->first;
|
||||||
uint64_t amount = pd.m_amount_in;
|
uint64_t amount = pd.m_amount_in;
|
||||||
|
@ -204,8 +205,33 @@ void TransactionHistoryImpl::refresh()
|
||||||
ti->m_pending = true;
|
ti->m_pending = true;
|
||||||
ti->m_hash = string_tools::pod_to_hex(hash);
|
ti->m_hash = string_tools::pod_to_hex(hash);
|
||||||
ti->m_timestamp = pd.m_timestamp;
|
ti->m_timestamp = pd.m_timestamp;
|
||||||
|
ti->m_confirmations = 0;
|
||||||
m_history.push_back(ti);
|
m_history.push_back(ti);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// unconfirmed payments (tx pool)
|
||||||
|
std::list<std::pair<crypto::hash, tools::wallet2::payment_details>> upayments;
|
||||||
|
m_wallet->m_wallet->get_unconfirmed_payments(upayments);
|
||||||
|
for (std::list<std::pair<crypto::hash, tools::wallet2::payment_details>>::const_iterator i = upayments.begin(); i != upayments.end(); ++i) {
|
||||||
|
const tools::wallet2::payment_details &pd = i->second;
|
||||||
|
std::string payment_id = string_tools::pod_to_hex(i->first);
|
||||||
|
if (payment_id.substr(16).find_first_not_of('0') == std::string::npos)
|
||||||
|
payment_id = payment_id.substr(0,16);
|
||||||
|
TransactionInfoImpl * ti = new TransactionInfoImpl();
|
||||||
|
ti->m_paymentid = payment_id;
|
||||||
|
ti->m_amount = pd.m_amount;
|
||||||
|
ti->m_direction = TransactionInfo::Direction_In;
|
||||||
|
ti->m_hash = string_tools::pod_to_hex(pd.m_tx_hash);
|
||||||
|
ti->m_blockheight = pd.m_block_height;
|
||||||
|
ti->m_pending = true;
|
||||||
|
ti->m_timestamp = pd.m_timestamp;
|
||||||
|
ti->m_confirmations = 0;
|
||||||
|
m_history.push_back(ti);
|
||||||
|
|
||||||
|
LOG_PRINT_L1(__FUNCTION__ << ": Unconfirmed payment found " << pd.m_amount);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
|
@ -49,6 +49,7 @@ TransactionInfoImpl::TransactionInfoImpl()
|
||||||
, m_fee(0)
|
, m_fee(0)
|
||||||
, m_blockheight(0)
|
, m_blockheight(0)
|
||||||
, m_timestamp(0)
|
, m_timestamp(0)
|
||||||
|
, m_confirmations(0)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -109,6 +110,11 @@ const std::vector<TransactionInfo::Transfer> &TransactionInfoImpl::transfers() c
|
||||||
return m_transfers;
|
return m_transfers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint64_t TransactionInfoImpl::confirmations() const
|
||||||
|
{
|
||||||
|
return m_confirmations;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
namespace Bitmonero = Monero;
|
namespace Bitmonero = Monero;
|
||||||
|
|
|
@ -55,6 +55,7 @@ public:
|
||||||
virtual std::time_t timestamp() const;
|
virtual std::time_t timestamp() const;
|
||||||
virtual std::string paymentId() const;
|
virtual std::string paymentId() const;
|
||||||
virtual const std::vector<Transfer> &transfers() const;
|
virtual const std::vector<Transfer> &transfers() const;
|
||||||
|
virtual uint64_t confirmations() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_direction;
|
int m_direction;
|
||||||
|
@ -67,6 +68,7 @@ private:
|
||||||
std::time_t m_timestamp;
|
std::time_t m_timestamp;
|
||||||
std::string m_paymentid;
|
std::string m_paymentid;
|
||||||
std::vector<Transfer> m_transfers;
|
std::vector<Transfer> m_transfers;
|
||||||
|
uint64_t m_confirmations;
|
||||||
|
|
||||||
friend class TransactionHistoryImpl;
|
friend class TransactionHistoryImpl;
|
||||||
|
|
||||||
|
|
|
@ -103,6 +103,21 @@ struct Wallet2CallbackImpl : public tools::i_wallet2_callback
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void on_unconfirmed_money_received(uint64_t height, const cryptonote::transaction& tx, uint64_t amount)
|
||||||
|
{
|
||||||
|
|
||||||
|
std::string tx_hash = epee::string_tools::pod_to_hex(get_transaction_hash(tx));
|
||||||
|
|
||||||
|
LOG_PRINT_L3(__FUNCTION__ << ": unconfirmed money received. height: " << height
|
||||||
|
<< ", tx: " << tx_hash
|
||||||
|
<< ", amount: " << print_money(amount));
|
||||||
|
// do not signal on received tx if wallet is not syncronized completely
|
||||||
|
if (m_listener && m_wallet->synchronized()) {
|
||||||
|
m_listener->unconfirmedMoneyReceived(tx_hash, amount);
|
||||||
|
m_listener->updated();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
virtual void on_money_spent(uint64_t height, const cryptonote::transaction& in_tx, uint64_t amount,
|
virtual void on_money_spent(uint64_t height, const cryptonote::transaction& in_tx, uint64_t amount,
|
||||||
const cryptonote::transaction& spend_tx)
|
const cryptonote::transaction& spend_tx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1004,8 +1004,11 @@ void wallet2::process_new_transaction(const cryptonote::transaction& tx, const s
|
||||||
payment.m_block_height = height;
|
payment.m_block_height = height;
|
||||||
payment.m_unlock_time = tx.unlock_time;
|
payment.m_unlock_time = tx.unlock_time;
|
||||||
payment.m_timestamp = ts;
|
payment.m_timestamp = ts;
|
||||||
if (pool)
|
if (pool) {
|
||||||
m_unconfirmed_payments.emplace(payment_id, payment);
|
m_unconfirmed_payments.emplace(payment_id, payment);
|
||||||
|
if (0 != m_callback)
|
||||||
|
m_callback->on_unconfirmed_money_received(height, tx, payment.m_amount);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
m_payments.emplace(payment_id, payment);
|
m_payments.emplace(payment_id, payment);
|
||||||
LOG_PRINT_L2("Payment found in " << (pool ? "pool" : "block") << ": " << payment_id << " / " << payment.m_tx_hash << " / " << payment.m_amount);
|
LOG_PRINT_L2("Payment found in " << (pool ? "pool" : "block") << ": " << payment_id << " / " << payment.m_tx_hash << " / " << payment.m_amount);
|
||||||
|
|
|
@ -67,6 +67,7 @@ namespace tools
|
||||||
public:
|
public:
|
||||||
virtual void on_new_block(uint64_t height, const cryptonote::block& block) {}
|
virtual void on_new_block(uint64_t height, const cryptonote::block& block) {}
|
||||||
virtual void on_money_received(uint64_t height, const cryptonote::transaction& tx, uint64_t amount) {}
|
virtual void on_money_received(uint64_t height, const cryptonote::transaction& tx, uint64_t amount) {}
|
||||||
|
virtual void on_unconfirmed_money_received(uint64_t height, const cryptonote::transaction& tx, uint64_t amount) {}
|
||||||
virtual void on_money_spent(uint64_t height, const cryptonote::transaction& in_tx, uint64_t amount, const cryptonote::transaction& spend_tx) {}
|
virtual void on_money_spent(uint64_t height, const cryptonote::transaction& in_tx, uint64_t amount, const cryptonote::transaction& spend_tx) {}
|
||||||
virtual void on_skip_transaction(uint64_t height, const cryptonote::transaction& tx) {}
|
virtual void on_skip_transaction(uint64_t height, const cryptonote::transaction& tx) {}
|
||||||
virtual ~i_wallet2_callback() {}
|
virtual ~i_wallet2_callback() {}
|
||||||
|
|
|
@ -112,6 +112,7 @@ struct TransactionInfo
|
||||||
virtual uint64_t amount() const = 0;
|
virtual uint64_t amount() const = 0;
|
||||||
virtual uint64_t fee() const = 0;
|
virtual uint64_t fee() const = 0;
|
||||||
virtual uint64_t blockHeight() const = 0;
|
virtual uint64_t blockHeight() const = 0;
|
||||||
|
virtual uint64_t confirmations() const = 0;
|
||||||
//! transaction_id
|
//! transaction_id
|
||||||
virtual std::string hash() const = 0;
|
virtual std::string hash() const = 0;
|
||||||
virtual std::time_t timestamp() const = 0;
|
virtual std::time_t timestamp() const = 0;
|
||||||
|
@ -195,6 +196,13 @@ struct WalletListener
|
||||||
*/
|
*/
|
||||||
virtual void moneyReceived(const std::string &txId, uint64_t amount) = 0;
|
virtual void moneyReceived(const std::string &txId, uint64_t amount) = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief unconfirmedMoneyReceived - called when payment arrived in tx pool
|
||||||
|
* @param txId - transaction id
|
||||||
|
* @param amount - amount
|
||||||
|
*/
|
||||||
|
virtual void unconfirmedMoneyReceived(const std::string &txId, uint64_t amount) = 0;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief newBlock - called when new block received
|
* @brief newBlock - called when new block received
|
||||||
* @param height - block height
|
* @param height - block height
|
||||||
|
|
|
@ -831,6 +831,16 @@ struct MyWalletListener : public Monero::WalletListener
|
||||||
cv_receive.notify_one();
|
cv_receive.notify_one();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void unconfirmedMoneyReceived(const string &txId, uint64_t amount)
|
||||||
|
{
|
||||||
|
std::cout << "wallet: " << wallet->address() << "**** just received unconfirmed money ("
|
||||||
|
<< txId << ", " << wallet->displayAmount(amount) << ")" << std::endl;
|
||||||
|
// Don't trigger recieve until tx is mined
|
||||||
|
// total_rx += amount;
|
||||||
|
// receive_triggered = true;
|
||||||
|
// cv_receive.notify_one();
|
||||||
|
}
|
||||||
|
|
||||||
virtual void newBlock(uint64_t height)
|
virtual void newBlock(uint64_t height)
|
||||||
{
|
{
|
||||||
// std::cout << "wallet: " << wallet->address()
|
// std::cout << "wallet: " << wallet->address()
|
||||||
|
|
Loading…
Reference in a new issue