From 12345d382c3ae4d751119edde4464397f93d96b3 Mon Sep 17 00:00:00 2001
From: Ilya Kitaev <mbg033@gmail.com>
Date: Wed, 20 Apr 2016 13:01:00 +0300
Subject: [PATCH] api implementation splitted over separate files

---
 src/wallet/CMakeLists.txt                     |  14 +-
 src/wallet/api/common_defines.h               |   7 +
 src/wallet/api/pending_transaction.cpp        | 138 +++++++
 src/wallet/api/pending_transaction.h          |  64 ++++
 src/wallet/api/transaction_history.cpp        |  33 ++
 src/wallet/api/transaction_history.h          |  44 +++
 src/wallet/api/transaction_info.cpp           |  89 +++++
 src/wallet/api/transaction_info.h             |  52 +++
 .../{wallet2_api.cpp => api/wallet.cpp}       | 337 ++----------------
 src/wallet/api/wallet.h                       |  86 +++++
 src/wallet/api/wallet_manager.cpp             | 108 ++++++
 src/wallet/api/wallet_manager.h               |  55 +++
 src/wallet/wallet2_api.h                      |   8 +-
 13 files changed, 715 insertions(+), 320 deletions(-)
 create mode 100644 src/wallet/api/common_defines.h
 create mode 100644 src/wallet/api/pending_transaction.cpp
 create mode 100644 src/wallet/api/pending_transaction.h
 create mode 100644 src/wallet/api/transaction_history.cpp
 create mode 100644 src/wallet/api/transaction_history.h
 create mode 100644 src/wallet/api/transaction_info.cpp
 create mode 100644 src/wallet/api/transaction_info.h
 rename src/wallet/{wallet2_api.cpp => api/wallet.cpp} (63%)
 create mode 100644 src/wallet/api/wallet.h
 create mode 100644 src/wallet/api/wallet_manager.cpp
 create mode 100644 src/wallet/api/wallet_manager.h

diff --git a/src/wallet/CMakeLists.txt b/src/wallet/CMakeLists.txt
index a6fc37dec..33af4f30d 100644
--- a/src/wallet/CMakeLists.txt
+++ b/src/wallet/CMakeLists.txt
@@ -32,17 +32,27 @@ set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
 set(wallet_sources
   wallet2.cpp
   wallet_rpc_server.cpp
-  wallet2_api.cpp)
+  api/wallet.cpp
+  api/wallet_manager.cpp
+  api/transaction_info.cpp
+  api/transaction_history.cpp
+  api/pending_transaction.cpp)
 
 set(wallet_headers)
 
 set(wallet_private_headers
   wallet2.h
+  wallet2_api.h
   wallet_errors.h
   wallet_rpc_server.h
   wallet_rpc_server_commands_defs.h
   wallet_rpc_server_error_codes.h
-  wallet2_api.h)
+  api/wallet.h
+  api/wallet_manager.h
+  api/transaction_info.h
+  api/transaction_history.h
+  api/pending_transaction.h
+  api/common_defines.h)
 
 bitmonero_private_headers(wallet
   ${wallet_private_headers})
diff --git a/src/wallet/api/common_defines.h b/src/wallet/api/common_defines.h
new file mode 100644
index 000000000..60a40a45a
--- /dev/null
+++ b/src/wallet/api/common_defines.h
@@ -0,0 +1,7 @@
+#ifndef WALLET_API_COMMON_DEFINES_H__
+#define WALLET_API_COMMON_DEFINES_H__
+
+#define tr(x) (x)
+
+#endif
+
diff --git a/src/wallet/api/pending_transaction.cpp b/src/wallet/api/pending_transaction.cpp
new file mode 100644
index 000000000..e9791ec35
--- /dev/null
+++ b/src/wallet/api/pending_transaction.cpp
@@ -0,0 +1,138 @@
+// Copyright (c) 2014-2016, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+//    conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+//    of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+//    used to endorse or promote products derived from this software without specific
+//    prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+
+#include "pending_transaction.h"
+#include "wallet.h"
+#include "common_defines.h"
+
+#include "cryptonote_core/cryptonote_format_utils.h"
+#include "cryptonote_core/cryptonote_basic_impl.h"
+#include "cryptonote_core/cryptonote_format_utils.h"
+
+#include <memory>
+#include <vector>
+#include <sstream>
+#include <boost/format.hpp>
+
+using namespace std;
+
+namespace Bitmonero {
+
+PendingTransaction::~PendingTransaction() {}
+
+
+TransactionImpl::TransactionImpl(WalletImpl *wallet)
+    : m_wallet(wallet)
+{
+
+}
+
+TransactionImpl::~TransactionImpl()
+{
+
+}
+
+int TransactionImpl::status() const
+{
+    return m_status;
+}
+
+string TransactionImpl::errorString() const
+{
+    return m_errorString;
+}
+
+bool TransactionImpl::commit()
+{
+
+    LOG_PRINT_L0("m_pending_tx size: " << m_pending_tx.size());
+    assert(m_pending_tx.size() == 1);
+    try {
+        while (!m_pending_tx.empty()) {
+            auto & ptx = m_pending_tx.back();
+            m_wallet->m_wallet->commit_tx(ptx);
+            // success_msg_writer(true) << tr("Money successfully sent, transaction ") << get_transaction_hash(ptx.tx);
+            // if no exception, remove element from vector
+            m_pending_tx.pop_back();
+        } // TODO: extract method;
+    } catch (const tools::error::daemon_busy&) {
+        // TODO: make it translatable with "tr"?
+        m_errorString = tr("daemon is busy. Please try again later.");
+        m_status = Status_Error;
+    } catch (const tools::error::no_connection_to_daemon&) {
+        m_errorString = tr("no connection to daemon. Please make sure daemon is running.");
+        m_status = Status_Error;
+    } catch (const tools::error::tx_rejected& e) {
+        std::ostringstream writer(m_errorString);
+        writer << (boost::format(tr("transaction %s was rejected by daemon with status: ")) % get_transaction_hash(e.tx())) <<  e.status();
+        m_status = Status_Error;
+    } catch (std::exception &e) {
+        m_errorString = string(tr("Unknown exception: ")) + e.what();
+        m_status = Status_Error;
+    } catch (...) {
+        m_errorString = tr("Unhandled exception");
+        LOG_ERROR(m_errorString);
+        m_status = Status_Error;
+    }
+
+    return m_status == Status_Ok;
+}
+
+uint64_t TransactionImpl::amount() const
+{
+    uint64_t result = 0;
+    for (const auto &ptx : m_pending_tx)   {
+        for (const auto &dest : ptx.dests) {
+            result += dest.amount;
+        }
+    }
+    return result;
+}
+
+uint64_t TransactionImpl::dust() const
+{
+    uint32_t result = 0;
+    for (const auto & ptx : m_pending_tx) {
+        result += ptx.dust;
+    }
+    return result;
+}
+
+uint64_t TransactionImpl::fee() const
+{
+    uint32_t result = 0;
+    for (const auto ptx : m_pending_tx) {
+        result += ptx.fee;
+    }
+    return result;
+}
+
+}
+
diff --git a/src/wallet/api/pending_transaction.h b/src/wallet/api/pending_transaction.h
new file mode 100644
index 000000000..0ae3eb8e2
--- /dev/null
+++ b/src/wallet/api/pending_transaction.h
@@ -0,0 +1,64 @@
+// Copyright (c) 2014-2016, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+//    conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+//    of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+//    used to endorse or promote products derived from this software without specific
+//    prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+
+#include "wallet/wallet2_api.h"
+#include "wallet/wallet2.h"
+
+#include <string>
+#include <vector>
+
+
+namespace Bitmonero {
+
+class WalletImpl;
+class PendingTransactionImpl : public PendingTransaction
+{
+public:
+    PendingTransactionImpl(WalletImpl * wallet);
+    ~PendingTransactionImpl();
+    int status() const;
+    std::string errorString() const;
+    bool commit();
+    uint64_t amount() const;
+    uint64_t dust() const;
+    uint64_t fee() const;
+    // TODO: continue with interface;
+
+private:
+    friend class WalletImpl;
+    WalletImpl * m_wallet;
+
+    int  m_status;
+    std::string m_errorString;
+    std::vector<tools::wallet2::pending_tx> m_pending_tx;
+};
+
+
+}
diff --git a/src/wallet/api/transaction_history.cpp b/src/wallet/api/transaction_history.cpp
new file mode 100644
index 000000000..f1aba14cb
--- /dev/null
+++ b/src/wallet/api/transaction_history.cpp
@@ -0,0 +1,33 @@
+// Copyright (c) 2014-2016, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+//    conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+//    of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+//    used to endorse or promote products derived from this software without specific
+//    prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+
+#include "transaction_history.h"
+
+
diff --git a/src/wallet/api/transaction_history.h b/src/wallet/api/transaction_history.h
new file mode 100644
index 000000000..cab0e0dbc
--- /dev/null
+++ b/src/wallet/api/transaction_history.h
@@ -0,0 +1,44 @@
+// Copyright (c) 2014-2016, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+//    conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+//    of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+//    used to endorse or promote products derived from this software without specific
+//    prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+
+#include "wallet/wallet2_api.h"
+
+namespace Bitmonero {
+
+class TransactionHistoryImpl : public TransactionHistory
+{
+    virtual int count() const;
+    virtual TransactionInfo * transaction(int index)  const = 0;
+    virtual TransactionInfo * transaction(const std::string &id) const = 0;
+    virtual std::vector<TransactionInfo*> getAll() const = 0;
+};
+
+}
+
diff --git a/src/wallet/api/transaction_info.cpp b/src/wallet/api/transaction_info.cpp
new file mode 100644
index 000000000..8de4e555f
--- /dev/null
+++ b/src/wallet/api/transaction_info.cpp
@@ -0,0 +1,89 @@
+// Copyright (c) 2014-2016, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+//    conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+//    of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+//    used to endorse or promote products derived from this software without specific
+//    prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+
+#include "transaction_info.h"
+
+
+using namespace std;
+
+namespace Bitmonero {
+
+TransactionInfoImpl::TransactionInfoImpl()
+{
+
+}
+
+TransactionInfoImpl::~TransactionInfoImpl()
+{
+
+}
+
+int TransactionInfoImpl::direction() const
+{
+    return TransactionInfo::Direction_In;
+}
+
+
+bool TransactionInfoImpl::isHold() const
+{
+    return false;
+}
+
+bool TransactionInfoImpl::isFailed() const
+{
+    return false;
+}
+
+uint64_t TransactionInfoImpl::amount() const
+{
+    return 0;
+}
+
+uint64_t TransactionInfoImpl::fee() const
+{
+    return 0;
+}
+
+string TransactionInfoImpl::address() const
+{
+    return "";
+}
+
+std::time_t TransactionInfoImpl::timestamp() const
+{
+    return std::time_t(0);
+}
+
+string TransactionInfoImpl::paymentId() const
+{
+    return "";
+}
+
+} // namespace
diff --git a/src/wallet/api/transaction_info.h b/src/wallet/api/transaction_info.h
new file mode 100644
index 000000000..2ed8157f7
--- /dev/null
+++ b/src/wallet/api/transaction_info.h
@@ -0,0 +1,52 @@
+// Copyright (c) 2014-2016, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+//    conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+//    of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+//    used to endorse or promote products derived from this software without specific
+//    prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+
+#include "wallet/wallet2_api.h"
+#include <string>
+#include <ctime>
+
+namespace Bitmonero {
+
+class TransactionInfoImpl : public TransactionInfo
+{
+public:
+    TransactionInfoImpl();
+    ~TransactionInfoImpl();
+    virtual int direction() const;
+    virtual bool isHold() const;
+    virtual bool isFailed() const;
+    virtual uint64_t amount() const;
+    virtual uint64_t fee() const;
+    virtual std::string address() const;
+    virtual std::time_t timestamp() const;
+    virtual std::string paymentId() const;
+};
+
+} // namespace
diff --git a/src/wallet/wallet2_api.cpp b/src/wallet/api/wallet.cpp
similarity index 63%
rename from src/wallet/wallet2_api.cpp
rename to src/wallet/api/wallet.cpp
index a6fc6ecc5..e42f04cf7 100644
--- a/src/wallet/wallet2_api.cpp
+++ b/src/wallet/api/wallet.cpp
@@ -1,21 +1,21 @@
 // Copyright (c) 2014-2016, The Monero Project
-// 
+//
 // All rights reserved.
-// 
+//
 // Redistribution and use in source and binary forms, with or without modification, are
 // permitted provided that the following conditions are met:
-// 
+//
 // 1. Redistributions of source code must retain the above copyright notice, this list of
 //    conditions and the following disclaimer.
-// 
+//
 // 2. Redistributions in binary form must reproduce the above copyright notice, this list
 //    of conditions and the following disclaimer in the documentation and/or other
 //    materials provided with the distribution.
-// 
+//
 // 3. Neither the name of the copyright holder nor the names of its contributors may be
 //    used to endorse or promote products derived from this software without specific
 //    prior written permission.
-// 
+//
 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
@@ -25,237 +25,35 @@
 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
 // STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
 // THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-// 
+//
 // Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
 
-#include "wallet2_api.h"
-#include "wallet2.h"
+
+#include "wallet.h"
+#include "pending_transaction.h"
+#include "common_defines.h"
+
 #include "mnemonics/electrum-words.h"
-#include "cryptonote_core/cryptonote_format_utils.h"
-#include "cryptonote_core/cryptonote_basic_impl.h"
-#include "cryptonote_core/cryptonote_format_utils.h"
-
-
-#include <memory>
-#include <vector>
-#include <sstream>
 #include <boost/format.hpp>
 
-
-#define tr(x) (x)
-
-namespace epee {
-    unsigned int g_test_dbg_lock_sleep = 0;
-}
-
-namespace Bitmonero {
-
-struct WalletManagerImpl;
-
-namespace {
-    static WalletManagerImpl * g_walletManager = nullptr;
-    // copy-pasted from
-    static const size_t DEFAULT_MIX = 4;
-
-}
-
-
-
 using namespace std;
 using namespace cryptonote;
 
+namespace Bitmonero {
+
+namespace {
+    // copy-pasted from simplewallet
+    static const size_t DEFAULT_MIX = 4;
+}
+
 Wallet::~Wallet() {}
-PendingTransaction::~PendingTransaction() {}
 
-
-
-
-
-///////////////////////// Wallet implementation ///////////////////////////////
-class WalletImpl : public Wallet
-{
-public:
-    WalletImpl(bool testnet = false);
-    ~WalletImpl();
-    bool create(const std::string &path, const std::string &password,
-                const std::string &language);
-    bool open(const std::string &path, const std::string &password);
-    bool recover(const std::string &path, const std::string &seed);
-    bool close();
-    std::string seed() const;
-    std::string getSeedLanguage() const;
-    void setSeedLanguage(const std::string &arg);
-    // void setListener(Listener *) {}
-    int status() const;
-    std::string errorString() const;
-    bool setPassword(const std::string &password);
-    std::string address() const;
-    bool store(const std::string &path);
-    bool init(const std::string &daemon_address, uint64_t upper_transaction_size_limit);
-    bool connectToDaemon();
-    uint64_t balance() const;
-    uint64_t unlockedBalance() const;
-    bool refresh();
-    PendingTransaction * createTransaction(const std::string &dst_addr, uint64_t amount);
-    virtual void disposeTransaction(PendingTransaction * t);
-    virtual TransactionHistory * history() const;
-
-private:
-    void clearStatus();
-
-private:
-    friend class TransactionImpl;
-    tools::wallet2 * m_wallet;
-    int  m_status;
-    std::string m_errorString;
-    std::string m_password;
-};
-
-
-/////////////////////////////////////////////////////////////////////////////////
 string Wallet::displayAmount(uint64_t amount)
 {
     return cryptonote::print_money(amount);
 }
 
-///////////////////////// Transaction implementation ///////////////////////////
-
-class TransactionImpl : public PendingTransaction
-{
-public:
-    TransactionImpl(WalletImpl * wallet);
-    ~TransactionImpl();
-    int status() const;
-    std::string errorString() const;
-    bool commit();
-    uint64_t amount() const;
-    uint64_t dust() const;
-    uint64_t fee() const;
-    // TODO: continue with interface;
-
-private:
-    friend class WalletImpl;
-    WalletImpl * m_wallet;
-
-    int  m_status;
-    std::string m_errorString;
-    std::vector<tools::wallet2::pending_tx> m_pending_tx;
-};
-
-TransactionImpl::TransactionImpl(WalletImpl *wallet)
-    : m_wallet(wallet)
-{
-
-}
-
-TransactionImpl::~TransactionImpl()
-{
-
-}
-
-int TransactionImpl::status() const
-{
-    return m_status;
-}
-
-string TransactionImpl::errorString() const
-{
-    return m_errorString;
-}
-
-bool TransactionImpl::commit()
-{
-
-    LOG_PRINT_L0("m_pending_tx size: " << m_pending_tx.size());
-    assert(m_pending_tx.size() == 1);
-    try {
-        while (!m_pending_tx.empty()) {
-            auto & ptx = m_pending_tx.back();
-            m_wallet->m_wallet->commit_tx(ptx);
-            // success_msg_writer(true) << tr("Money successfully sent, transaction ") << get_transaction_hash(ptx.tx);
-            // if no exception, remove element from vector
-            m_pending_tx.pop_back();
-        } // TODO: extract method;
-    } catch (const tools::error::daemon_busy&) {
-        // TODO: make it translatable with "tr"?
-        m_errorString = tr("daemon is busy. Please try again later.");
-        m_status = Status_Error;
-    } catch (const tools::error::no_connection_to_daemon&) {
-        m_errorString = tr("no connection to daemon. Please make sure daemon is running.");
-        m_status = Status_Error;
-    } catch (const tools::error::tx_rejected& e) {
-        std::ostringstream writer(m_errorString);
-        writer << (boost::format(tr("transaction %s was rejected by daemon with status: ")) % get_transaction_hash(e.tx())) <<  e.status();
-        m_status = Status_Error;
-    } catch (std::exception &e) {
-        m_errorString = string(tr("Unknown exception: ")) + e.what();
-        m_status = Status_Error;
-    } catch (...) {
-        m_errorString = tr("Unhandled exception");
-        LOG_ERROR(m_errorString);
-        m_status = Status_Error;
-    }
-
-    return m_status == Status_Ok;
-}
-
-uint64_t TransactionImpl::amount() const
-{
-    uint64_t result = 0;
-    for (const auto &ptx : m_pending_tx)   {
-        for (const auto &dest : ptx.dests) {
-            result += dest.amount;
-        }
-    }
-    return result;
-}
-
-uint64_t TransactionImpl::dust() const
-{
-    uint32_t result = 0;
-    for (const auto & ptx : m_pending_tx) {
-        result += ptx.dust;
-    }
-    return result;
-}
-
-uint64_t TransactionImpl::fee() const
-{
-    uint32_t result = 0;
-    for (const auto ptx : m_pending_tx) {
-        result += ptx.fee;
-    }
-    return result;
-}
-
-
-///////////////////////// TransactionInfo implementation ////////////////////////
-class TransactionInfoImpl : public TransactionInfo
-{
-public:
-    TransactionInfoImpl();
-    ~TransactionInfoImpl();
-    virtual bool isHold() const;
-};
-
-TransactionInfoImpl::TransactionInfoImpl()
-{
-
-}
-
-TransactionInfoImpl::~TransactionInfoImpl()
-{
-
-}
-
-bool TransactionInfoImpl::isHold() const
-{
-    return false;
-}
-
-
-
-
+///////////////////////// WalletImpl implementation ////////////////////////
 WalletImpl::WalletImpl(bool testnet)
     :m_wallet(nullptr), m_status(Wallet::Status_Ok)
 {
@@ -610,97 +408,4 @@ void WalletImpl::clearStatus()
 }
 
 
-
-
-
-
-///////////////////////// WalletManager implementation /////////////////////////
-class WalletManagerImpl : public WalletManager
-{
-public:
-    Wallet * createWallet(const std::string &path, const std::string &password,
-                          const std::string &language, bool testnet);
-    Wallet * openWallet(const std::string &path, const std::string &password, bool testnet);
-    virtual Wallet * recoveryWallet(const std::string &path, const std::string &memo, bool testnet);
-    virtual bool closeWallet(Wallet *wallet);
-    bool walletExists(const std::string &path);
-    std::string errorString() const;
-    void setDaemonHost(const std::string &hostname);
-
-
-private:
-    WalletManagerImpl() {}
-    friend struct WalletManagerFactory;
-
-    std::string m_errorString;
-};
-
-Wallet *WalletManagerImpl::createWallet(const std::string &path, const std::string &password,
-                                    const std::string &language, bool testnet)
-{
-    WalletImpl * wallet = new WalletImpl(testnet);
-    wallet->create(path, password, language);
-    return wallet;
-}
-
-Wallet *WalletManagerImpl::openWallet(const std::string &path, const std::string &password, bool testnet)
-{
-    WalletImpl * wallet = new WalletImpl(testnet);
-    wallet->open(path, password);
-    return wallet;
-}
-
-Wallet *WalletManagerImpl::recoveryWallet(const std::string &path, const std::string &memo, bool testnet)
-{
-    WalletImpl * wallet = new WalletImpl(testnet);
-    wallet->recover(path, memo);
-    return wallet;
-}
-
-bool WalletManagerImpl::closeWallet(Wallet *wallet)
-{
-    WalletImpl * wallet_ = dynamic_cast<WalletImpl*>(wallet);
-    bool result = wallet_->close();
-    if (!result) {
-        m_errorString = wallet_->errorString();
-    } else {
-        delete wallet_;
-    }
-    return result;
-}
-
-bool WalletManagerImpl::walletExists(const std::string &path)
-{
-    return false;
-}
-
-std::string WalletManagerImpl::errorString() const
-{
-    return m_errorString;
-}
-
-void WalletManagerImpl::setDaemonHost(const std::string &hostname)
-{
-
-}
-
-
-
-///////////////////// WalletManagerFactory implementation //////////////////////
-WalletManager *WalletManagerFactory::getWalletManager()
-{
-
-    if  (!g_walletManager) {
-        epee::log_space::log_singletone::add_logger(LOGGER_CONSOLE, NULL, NULL, LOG_LEVEL_MAX);
-        g_walletManager = new WalletManagerImpl();
-    }
-
-    return g_walletManager;
-}
-
-
-
-
-
-
-}
+} // namespace
diff --git a/src/wallet/api/wallet.h b/src/wallet/api/wallet.h
new file mode 100644
index 000000000..35db38f67
--- /dev/null
+++ b/src/wallet/api/wallet.h
@@ -0,0 +1,86 @@
+// Copyright (c) 2014-2016, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+//    conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+//    of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+//    used to endorse or promote products derived from this software without specific
+//    prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+
+#ifndef WALLET_IMPL_H
+#define WALLET_IMPL_H
+
+#include "wallet/wallet2_api.h"
+#include "wallet/wallet2.h"
+
+#include <string>
+
+
+namespace Bitmonero {
+
+
+class WalletImpl : public Wallet
+{
+public:
+    WalletImpl(bool testnet = false);
+    ~WalletImpl();
+    bool create(const std::string &path, const std::string &password,
+                const std::string &language);
+    bool open(const std::string &path, const std::string &password);
+    bool recover(const std::string &path, const std::string &seed);
+    bool close();
+    std::string seed() const;
+    std::string getSeedLanguage() const;
+    void setSeedLanguage(const std::string &arg);
+    // void setListener(Listener *) {}
+    int status() const;
+    std::string errorString() const;
+    bool setPassword(const std::string &password);
+    std::string address() const;
+    bool store(const std::string &path);
+    bool init(const std::string &daemon_address, uint64_t upper_transaction_size_limit);
+    bool connectToDaemon();
+    uint64_t balance() const;
+    uint64_t unlockedBalance() const;
+    bool refresh();
+    PendingTransaction * createTransaction(const std::string &dst_addr, uint64_t amount);
+    virtual void disposeTransaction(PendingTransaction * t);
+    virtual TransactionHistory * history() const;
+
+private:
+    void clearStatus();
+
+private:
+    friend class TransactionImpl;
+    tools::wallet2 * m_wallet;
+    int  m_status;
+    std::string m_errorString;
+    std::string m_password;
+};
+
+
+} // namespace
+
+#endif
+
diff --git a/src/wallet/api/wallet_manager.cpp b/src/wallet/api/wallet_manager.cpp
new file mode 100644
index 000000000..c056ada2c
--- /dev/null
+++ b/src/wallet/api/wallet_manager.cpp
@@ -0,0 +1,108 @@
+// Copyright (c) 2014-2016, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+//    conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+//    of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+//    used to endorse or promote products derived from this software without specific
+//    prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+
+
+#include "wallet_manager.h"
+#include "wallet.h"
+
+namespace epee {
+    unsigned int g_test_dbg_lock_sleep = 0;
+}
+
+namespace Bitmonero {
+
+Wallet *WalletManagerImpl::createWallet(const std::string &path, const std::string &password,
+                                    const std::string &language, bool testnet)
+{
+    WalletImpl * wallet = new WalletImpl(testnet);
+    wallet->create(path, password, language);
+    return wallet;
+}
+
+Wallet *WalletManagerImpl::openWallet(const std::string &path, const std::string &password, bool testnet)
+{
+    WalletImpl * wallet = new WalletImpl(testnet);
+    wallet->open(path, password);
+    return wallet;
+}
+
+Wallet *WalletManagerImpl::recoveryWallet(const std::string &path, const std::string &memo, bool testnet)
+{
+    WalletImpl * wallet = new WalletImpl(testnet);
+    wallet->recover(path, memo);
+    return wallet;
+}
+
+bool WalletManagerImpl::closeWallet(Wallet *wallet)
+{
+    WalletImpl * wallet_ = dynamic_cast<WalletImpl*>(wallet);
+    bool result = wallet_->close();
+    if (!result) {
+        m_errorString = wallet_->errorString();
+    } else {
+        delete wallet_;
+    }
+    return result;
+}
+
+bool WalletManagerImpl::walletExists(const std::string &path)
+{
+    return false;
+}
+
+std::string WalletManagerImpl::errorString() const
+{
+    return m_errorString;
+}
+
+void WalletManagerImpl::setDaemonHost(const std::string &hostname)
+{
+
+}
+
+
+
+///////////////////// WalletManagerFactory implementation //////////////////////
+WalletManager *WalletManagerFactory::getWalletManager()
+{
+
+    static WalletManagerImpl * g_walletManager = nullptr;
+
+    if  (!g_walletManager) {
+        epee::log_space::log_singletone::add_logger(LOGGER_CONSOLE, NULL, NULL, LOG_LEVEL_MAX);
+        g_walletManager = new WalletManagerImpl();
+    }
+
+    return g_walletManager;
+}
+
+
+
+}
diff --git a/src/wallet/api/wallet_manager.h b/src/wallet/api/wallet_manager.h
new file mode 100644
index 000000000..d608eb7f0
--- /dev/null
+++ b/src/wallet/api/wallet_manager.h
@@ -0,0 +1,55 @@
+// Copyright (c) 2014-2016, The Monero Project
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without modification, are
+// permitted provided that the following conditions are met:
+//
+// 1. Redistributions of source code must retain the above copyright notice, this list of
+//    conditions and the following disclaimer.
+//
+// 2. Redistributions in binary form must reproduce the above copyright notice, this list
+//    of conditions and the following disclaimer in the documentation and/or other
+//    materials provided with the distribution.
+//
+// 3. Neither the name of the copyright holder nor the names of its contributors may be
+//    used to endorse or promote products derived from this software without specific
+//    prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
+// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+// THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+// STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
+// THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Parts of this file are originally copyright (c) 2012-2013 The Cryptonote developers
+
+
+#include "wallet/wallet2_api.h"
+#include <string>
+
+namespace Bitmonero {
+
+class WalletManagerImpl : public WalletManager
+{
+public:
+    Wallet * createWallet(const std::string &path, const std::string &password,
+                          const std::string &language, bool testnet);
+    Wallet * openWallet(const std::string &path, const std::string &password, bool testnet);
+    virtual Wallet * recoveryWallet(const std::string &path, const std::string &memo, bool testnet);
+    virtual bool closeWallet(Wallet *wallet);
+    bool walletExists(const std::string &path);
+    std::string errorString() const;
+    void setDaemonHost(const std::string &hostname);
+
+private:
+    WalletManagerImpl() {}
+    friend struct WalletManagerFactory;
+    std::string m_errorString;
+};
+
+} // namespace
diff --git a/src/wallet/wallet2_api.h b/src/wallet/wallet2_api.h
index a675d8b31..cb0211c4a 100644
--- a/src/wallet/wallet2_api.h
+++ b/src/wallet/wallet2_api.h
@@ -33,6 +33,7 @@
 
 #include <string>
 #include <vector>
+#include <ctime>
 
 //  Public interface for libwallet library
 namespace Bitmonero {
@@ -62,6 +63,8 @@ struct TransactionHistory
     virtual TransactionInfo * transaction(int index)  const = 0;
     virtual TransactionInfo * transaction(const std::string &id) const = 0;
     virtual std::vector<TransactionInfo*> getAll() const = 0;
+    // TODO:
+    // refresh();
 };
 
 
@@ -75,13 +78,14 @@ struct TransactionInfo
         Direction_Out
     };
 
+    virtual int  direction() const = 0;
     virtual bool isHold() const = 0;
     virtual bool isFailed() const = 0;
     virtual uint64_t amount() const = 0;
     virtual uint64_t fee() const = 0;
     virtual std::string address() const = 0;
-    virtual int direction() const = 0;
-    // TODO
+    virtual std::time_t timestamp() const = 0;
+    virtual std::string paymentId() const = 0;
 };
 
 /**