mirror of
https://github.com/monero-project/monero.git
synced 2026-01-14 13:56:43 -08:00
device/trezor: HF10 support added, wallet::API
- import only key images generated by cold signing process - wallet_api: trezor methods added - wallet: button request code added - const added to methods - wallet2::get_tx_key_device() tries to decrypt stored tx private keys using the device. - simplewallet supports get_tx_key and get_tx_proof on hw device using the get_tx_key feature - live refresh enables refresh with trezor i.e. computing key images on the fly. More convenient and efficient for users. - device: has_ki_live_refresh added - a thread is watching whether live refresh is being computed, if not for 30 seconds, it terminates the live refresh process - switches Trezor state
This commit is contained in:
@@ -242,6 +242,42 @@ struct Wallet2CallbackImpl : public tools::i_wallet2_callback
|
||||
}
|
||||
}
|
||||
|
||||
virtual void on_device_button_request(uint64_t code)
|
||||
{
|
||||
if (m_listener) {
|
||||
m_listener->onDeviceButtonRequest(code);
|
||||
}
|
||||
}
|
||||
|
||||
virtual boost::optional<epee::wipeable_string> on_device_pin_request()
|
||||
{
|
||||
if (m_listener) {
|
||||
auto pin = m_listener->onDevicePinRequest();
|
||||
if (pin){
|
||||
return boost::make_optional(epee::wipeable_string((*pin).data(), (*pin).size()));
|
||||
}
|
||||
}
|
||||
return boost::none;
|
||||
}
|
||||
|
||||
virtual boost::optional<epee::wipeable_string> on_device_passphrase_request(bool on_device)
|
||||
{
|
||||
if (m_listener) {
|
||||
auto passphrase = m_listener->onDevicePassphraseRequest(on_device);
|
||||
if (!on_device && passphrase) {
|
||||
return boost::make_optional(epee::wipeable_string((*passphrase).data(), (*passphrase).size()));
|
||||
}
|
||||
}
|
||||
return boost::none;
|
||||
}
|
||||
|
||||
virtual void on_device_progress(const hw::device_progress & event)
|
||||
{
|
||||
if (m_listener) {
|
||||
m_listener->onDeviceProgress(DeviceProgress(event.progress(), event.indeterminate()));
|
||||
}
|
||||
}
|
||||
|
||||
WalletListener * m_listener;
|
||||
WalletImpl * m_wallet;
|
||||
};
|
||||
@@ -785,6 +821,28 @@ bool WalletImpl::setPassword(const std::string &password)
|
||||
return status() == Status_Ok;
|
||||
}
|
||||
|
||||
bool WalletImpl::setDevicePin(const std::string &pin)
|
||||
{
|
||||
clearStatus();
|
||||
try {
|
||||
m_wallet->get_account().get_device().set_pin(epee::wipeable_string(pin.data(), pin.size()));
|
||||
} catch (const std::exception &e) {
|
||||
setStatusError(e.what());
|
||||
}
|
||||
return status() == Status_Ok;
|
||||
}
|
||||
|
||||
bool WalletImpl::setDevicePassphrase(const std::string &passphrase)
|
||||
{
|
||||
clearStatus();
|
||||
try {
|
||||
m_wallet->get_account().get_device().set_passphrase(epee::wipeable_string(passphrase.data(), passphrase.size()));
|
||||
} catch (const std::exception &e) {
|
||||
setStatusError(e.what());
|
||||
}
|
||||
return status() == Status_Ok;
|
||||
}
|
||||
|
||||
std::string WalletImpl::address(uint32_t accountIndex, uint32_t addressIndex) const
|
||||
{
|
||||
return m_wallet->get_subaddress_as_str({accountIndex, addressIndex});
|
||||
@@ -1428,6 +1486,8 @@ PendingTransaction *WalletImpl::createTransaction(const string &dst_addr, const
|
||||
extra, subaddr_account, subaddr_indices);
|
||||
}
|
||||
|
||||
pendingTxPostProcess(transaction);
|
||||
|
||||
if (multisig().isMultisig) {
|
||||
transaction->m_signers = m_wallet->make_multisig_tx_set(transaction->m_pending_tx).m_signers;
|
||||
}
|
||||
@@ -1511,6 +1571,7 @@ PendingTransaction *WalletImpl::createSweepUnmixableTransaction()
|
||||
do {
|
||||
try {
|
||||
transaction->m_pending_tx = m_wallet->create_unmixable_sweep_transactions();
|
||||
pendingTxPostProcess(transaction);
|
||||
|
||||
} catch (const tools::error::daemon_busy&) {
|
||||
// TODO: make it translatable with "tr"?
|
||||
@@ -2093,6 +2154,21 @@ bool WalletImpl::isNewWallet() const
|
||||
return !(blockChainHeight() > 1 || m_recoveringFromSeed || m_recoveringFromDevice || m_rebuildWalletCache) && !watchOnly();
|
||||
}
|
||||
|
||||
void WalletImpl::pendingTxPostProcess(PendingTransactionImpl * pending)
|
||||
{
|
||||
// If the device being used is HW device with cold signing protocol, cold sign then.
|
||||
if (!m_wallet->get_account().get_device().has_tx_cold_sign()){
|
||||
return;
|
||||
}
|
||||
|
||||
tools::wallet2::signed_tx_set exported_txs;
|
||||
std::vector<cryptonote::address_parse_info> dsts_info;
|
||||
|
||||
m_wallet->cold_sign_tx(pending->m_pending_tx, exported_txs, dsts_info, pending->m_tx_device_aux);
|
||||
pending->m_key_images = exported_txs.key_images;
|
||||
pending->m_pending_tx = exported_txs.ptx;
|
||||
}
|
||||
|
||||
bool WalletImpl::doInit(const string &daemon_address, uint64_t upper_transaction_size_limit, bool ssl)
|
||||
{
|
||||
// claim RPC so there's no in-memory encryption for now
|
||||
@@ -2325,6 +2401,11 @@ bool WalletImpl::isKeysFileLocked()
|
||||
{
|
||||
return m_wallet->is_keys_file_locked();
|
||||
}
|
||||
|
||||
uint64_t WalletImpl::coldKeyImageSync(uint64_t &spent, uint64_t &unspent)
|
||||
{
|
||||
return m_wallet->cold_key_image_sync(spent, unspent);
|
||||
}
|
||||
} // namespace
|
||||
|
||||
namespace Bitmonero = Monero;
|
||||
|
||||
Reference in New Issue
Block a user