From 5f48afaf3195d551d090c6427c687cc1a203c9ea Mon Sep 17 00:00:00 2001 From: Some Random Crypto Guy Date: Fri, 26 Jul 2024 10:51:20 +0100 Subject: [PATCH] added support for GUI wallet staking --- src/wallet/api/wallet.cpp | 27 +++++++++++++++++---- src/wallet/api/wallet.h | 26 +++++++++++++------- src/wallet/api/wallet2_api.h | 47 ++++++++++++++++++++++++++++++++---- 3 files changed, 81 insertions(+), 19 deletions(-) diff --git a/src/wallet/api/wallet.cpp b/src/wallet/api/wallet.cpp index e2b0e672c..43090ba3c 100644 --- a/src/wallet/api/wallet.cpp +++ b/src/wallet/api/wallet.cpp @@ -1430,6 +1430,19 @@ PendingTransaction* WalletImpl::restoreMultisigTransaction(const string& signDat return nullptr; } +PendingTransaction *WalletImpl::createStakeTransaction(uint64_t amount, uint32_t mixin_count, PendingTransaction::Priority priority, uint32_t subaddr_account, std::set subaddr_indices) +{ + // Need to populate {dst_entr, payment_id, asset_type, is_return} + const string dst_addr = m_wallet->get_subaddress_as_str({subaddr_account, 0});//MY LOCAL (SUB)ADDRESS + const string payment_id = ""; + const string asset_type = "SAL"; + const bool is_return = false; + + LOG_ERROR("createStakeTransaction: called"); + + return createTransactionMultDest(Monero::transaction_type::STAKE, std::vector {dst_addr}, payment_id, amount ? (std::vector {amount}) : (optional>()), mixin_count, asset_type, is_return, priority, subaddr_account, subaddr_indices); +} + // TODO: // 1 - properly handle payment id (add another menthod with explicit 'payment_id' param) // 2 - check / design how "Transaction" can be single interface @@ -1440,7 +1453,7 @@ PendingTransaction* WalletImpl::restoreMultisigTransaction(const string& signDat // - unconfirmed_transfer_details; // - confirmed_transfer_details) -PendingTransaction *WalletImpl::createTransactionMultDest(const std::vector &dst_addr, const string &payment_id, optional> amount, uint32_t mixin_count, PendingTransaction::Priority priority, uint32_t subaddr_account, std::set subaddr_indices) +PendingTransaction *WalletImpl::createTransactionMultDest(const Monero::transaction_type &tx_type, const std::vector &dst_addr, const string &payment_id, optional> amount, uint32_t mixin_count, const std::string &asset_type, const bool is_return, PendingTransaction::Priority priority, uint32_t subaddr_account, std::set subaddr_indices) { clearStatus(); @@ -1451,6 +1464,8 @@ PendingTransaction *WalletImpl::createTransactionMultDest(const std::vectoradjust_priority(static_cast(priority)); + const cryptonote::transaction_type converted_tx_type = static_cast(static_cast(tx_type)); + PendingTransactionImpl * transaction = new PendingTransactionImpl(*this); do { @@ -1496,8 +1511,10 @@ PendingTransaction *WalletImpl::createTransactionMultDest(const std::vectoradjust_mixin(mixin_count); if (amount) { - transaction->m_pending_tx = m_wallet->create_transactions_2(dsts, "SAL", "SAL", cryptonote::transaction_type::TRANSFER, fake_outs_count, 0 /* unlock_time */, + transaction->m_pending_tx = m_wallet->create_transactions_2(dsts, "SAL", "SAL", converted_tx_type, fake_outs_count, 0 /* unlock_time */, adjusted_priority, extra, subaddr_account, subaddr_indices); } else { - transaction->m_pending_tx = m_wallet->create_transactions_all(0, cryptonote::transaction_type::TRANSFER, "SAL", info.address, info.is_subaddress, 1, fake_outs_count, 0 /* unlock_time */, + transaction->m_pending_tx = m_wallet->create_transactions_all(0, converted_tx_type, "SAL", info.address, info.is_subaddress, 1, fake_outs_count, 0 /* unlock_time */, adjusted_priority, extra, subaddr_account, subaddr_indices); } @@ -1605,10 +1622,10 @@ PendingTransaction *WalletImpl::createTransactionMultDest(const std::vector amount, uint32_t mixin_count, - PendingTransaction::Priority priority, uint32_t subaddr_account, std::set subaddr_indices) + const std::string &asset_type, const bool is_return, PendingTransaction::Priority priority, uint32_t subaddr_account, std::set subaddr_indices) { - return createTransactionMultDest(std::vector {dst_addr}, payment_id, amount ? (std::vector {*amount}) : (optional>()), mixin_count, priority, subaddr_account, subaddr_indices); + return createTransactionMultDest(Monero::transaction_type::TRANSFER, std::vector {dst_addr}, payment_id, amount ? (std::vector {*amount}) : (optional>()), mixin_count, asset_type, is_return, priority, subaddr_account, subaddr_indices); } PendingTransaction *WalletImpl::createSweepUnmixableTransaction() diff --git a/src/wallet/api/wallet.h b/src/wallet/api/wallet.h index dc20b8cb7..802846a73 100644 --- a/src/wallet/api/wallet.h +++ b/src/wallet/api/wallet.h @@ -152,16 +152,24 @@ public: bool hasMultisigPartialKeyImages() const override; PendingTransaction* restoreMultisigTransaction(const std::string& signData) override; - PendingTransaction * createTransactionMultDest(const std::vector &dst_addr, const std::string &payment_id, - optional> amount, uint32_t mixin_count, - PendingTransaction::Priority priority = PendingTransaction::Priority_Low, - uint32_t subaddr_account = 0, - std::set subaddr_indices = {}) override; + PendingTransaction * createStakeTransaction(uint64_t amount, + uint32_t mixin_count, + PendingTransaction::Priority priority = PendingTransaction::Priority_Low, + uint32_t subaddr_account = 0, + std::set subaddr_indices = {}) override; + PendingTransaction * createTransactionMultDest(const transaction_type &tx_type, + const std::vector &dst_addr, const std::string &payment_id, + optional> amount, uint32_t mixin_count, + const std::string &asset_type, const bool is_return, + PendingTransaction::Priority priority = PendingTransaction::Priority_Low, + uint32_t subaddr_account = 0, + std::set subaddr_indices = {}) override; PendingTransaction * createTransaction(const std::string &dst_addr, const std::string &payment_id, - optional amount, uint32_t mixin_count, - PendingTransaction::Priority priority = PendingTransaction::Priority_Low, - uint32_t subaddr_account = 0, - std::set subaddr_indices = {}) override; + optional amount, uint32_t mixin_count, + const std::string &asset_type, const bool is_return, + PendingTransaction::Priority priority = PendingTransaction::Priority_Low, + uint32_t subaddr_account = 0, + std::set subaddr_indices = {}) override; virtual PendingTransaction * createSweepUnmixableTransaction() override; bool submitTransaction(const std::string &fileName) override; virtual UnsignedTransaction * loadUnsignedTx(const std::string &unsigned_filename) override; diff --git a/src/wallet/api/wallet2_api.h b/src/wallet/api/wallet2_api.h index 636ea15f7..7c6a548f2 100644 --- a/src/wallet/api/wallet2_api.h +++ b/src/wallet/api/wallet2_api.h @@ -49,6 +49,18 @@ enum NetworkType : uint8_t { STAGENET }; +enum transaction_type { + UNSET = 0, + MINER = 1, + PROTOCOL = 2, + TRANSFER = 3, + CONVERT = 4, + BURN = 5, + STAKE = 6, + RETURN = 7, + MAX = 7 +}; + namespace Utils { bool isAddressLocal(const std::string &hostaddr); void onStartup(); @@ -826,12 +838,32 @@ struct Wallet */ virtual PendingTransaction* restoreMultisigTransaction(const std::string& signData) = 0; + /*! + * \brief createStakeTransaction creates staking transaction. + * \param amount amount + * \param mixin_count mixin count. if 0 passed, wallet will use default value + * \param subaddr_account subaddress account from which the input funds are taken + * \param subaddr_indices set of subaddress indices to use for transfer or sweeping. if set empty, all are chosen when sweeping, and one or more are automatically chosen when transferring. after execution, returns the set of actually used indices + * \param priority + * \return PendingTransaction object. caller is responsible to check PendingTransaction::status() + * after object returned + */ + + virtual PendingTransaction * createStakeTransaction(uint64_t amount, + uint32_t mixin_count, + PendingTransaction::Priority = PendingTransaction::Priority_Low, + uint32_t subaddr_account = 0, + std::set subaddr_indices = {}) = 0; + /*! * \brief createTransactionMultDest creates transaction with multiple destinations. if dst_addr is an integrated address, payment_id is ignored + * \param tx_type the type of transaction being created * \param dst_addr vector of destination address as string * \param payment_id optional payment_id, can be empty string * \param amount vector of amounts * \param mixin_count mixin count. if 0 passed, wallet will use default value + * \param asset_type type of asset to create as output + * \param is_return whether this is a return_payment or not * \param subaddr_account subaddress account from which the input funds are taken * \param subaddr_indices set of subaddress indices to use for transfer or sweeping. if set empty, all are chosen when sweeping, and one or more are automatically chosen when transferring. after execution, returns the set of actually used indices * \param priority @@ -839,11 +871,13 @@ struct Wallet * after object returned */ - virtual PendingTransaction * createTransactionMultDest(const std::vector &dst_addr, const std::string &payment_id, - optional> amount, uint32_t mixin_count, - PendingTransaction::Priority = PendingTransaction::Priority_Low, - uint32_t subaddr_account = 0, - std::set subaddr_indices = {}) = 0; + virtual PendingTransaction * createTransactionMultDest(const transaction_type &tx_type, + const std::vector &dst_addr, const std::string &payment_id, + optional> amount, uint32_t mixin_count, + const std::string &asset_type, const bool is_return, + PendingTransaction::Priority = PendingTransaction::Priority_Low, + uint32_t subaddr_account = 0, + std::set subaddr_indices = {}) = 0; /*! * \brief createTransaction creates transaction. if dst_addr is an integrated address, payment_id is ignored @@ -851,6 +885,8 @@ struct Wallet * \param payment_id optional payment_id, can be empty string * \param amount amount * \param mixin_count mixin count. if 0 passed, wallet will use default value + * \param asset_type type of asset to create as output + * \param is_return whether this is a return_payment or not * \param subaddr_account subaddress account from which the input funds are taken * \param subaddr_indices set of subaddress indices to use for transfer or sweeping. if set empty, all are chosen when sweeping, and one or more are automatically chosen when transferring. after execution, returns the set of actually used indices * \param priority @@ -860,6 +896,7 @@ struct Wallet virtual PendingTransaction * createTransaction(const std::string &dst_addr, const std::string &payment_id, optional amount, uint32_t mixin_count, + const std::string &asset_type, const bool is_return, PendingTransaction::Priority = PendingTransaction::Priority_Low, uint32_t subaddr_account = 0, std::set subaddr_indices = {}) = 0;