/** * Copyright (c) 2017-2019 woodser * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. * * Parts of this file are originally copyright (c) 2014-2019, The Monero Project * * Redistribution and use in source and binary forms, with or without modification, are * permitted provided that the following conditions are met: * * All rights reserved. * * 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 */ #pragma once #include #include using namespace std; /** * Public interface for libmonero-cpp library. */ namespace monero { /** * Base struct which can be serialized. */ struct SerializableStruct { /** * Serializes the struct to a json string. * * @return the struct serialized to a json string */ string serialize() const; /** * Convert the struct to a property tree. * * @return the converted property tree */ virtual boost::property_tree::ptree toPropertyTree() const = 0; }; /** * Enumerates Monero network types. */ enum MoneroNetworkType : uint8_t { MAINNET = 0, TESTNET, STAGENET }; /** * Models a connection to a daemon. * * TODO: switch to boost::optional */ struct MoneroRpcConnection { string uri; boost::optional username; boost::optional password; MoneroRpcConnection(const string& uri = "", const boost::optional& username = boost::none, const boost::optional& password = boost::none) : uri(uri), username(username), password(password) {} }; // forward declarations struct MoneroTx; struct MoneroOutput; /** * Models a Monero block header which contains information about the block. */ struct MoneroBlockHeader : public SerializableStruct { boost::optional id; boost::optional height; boost::optional timestamp; boost::optional size; boost::optional weight; boost::optional longTermWeight; boost::optional depth; boost::optional difficulty; boost::optional cumulativeDifficulty; boost::optional majorVersion; boost::optional minorVersion; boost::optional nonce; boost::optional coinbaseTxId; boost::optional numTxs; boost::optional orphanStatus; boost::optional prevId; boost::optional reward; boost::optional powHash; boost::property_tree::ptree toPropertyTree() const; virtual void merge(const shared_ptr& self, const shared_ptr& other); }; /** * Models a Monero block in the blockchain. */ struct MoneroBlock : public MoneroBlockHeader { boost::optional hex; boost::optional> coinbaseTx; vector> txs; vector txIds; boost::property_tree::ptree toPropertyTree() const; void merge(const shared_ptr& self, const shared_ptr& other); void merge(const shared_ptr& self, const shared_ptr& other); }; /** * Models a Monero transaction on the blockchain. */ struct MoneroTx : public SerializableStruct { static const string DEFAULT_PAYMENT_ID; // default payment id "0000000000000000" boost::optional> block; boost::optional id; boost::optional version; boost::optional isCoinbase; boost::optional paymentId; boost::optional fee; boost::optional mixin; boost::optional doNotRelay; boost::optional isRelayed; boost::optional isConfirmed; boost::optional inTxPool; boost::optional numConfirmations; boost::optional unlockTime; boost::optional lastRelayedTimestamp; boost::optional receivedTimestamp; boost::optional isDoubleSpendSeen; boost::optional key; boost::optional fullHex; boost::optional prunedHex; boost::optional prunableHex; boost::optional prunableHash; boost::optional size; boost::optional weight; vector> vins; vector> vouts; vector outputIndices; boost::optional metadata; boost::optional commonTxSets; vector extra; boost::optional rctSignatures; // TODO: implement boost::optional rctSigPrunable; // TODO: implement boost::optional isKeptByBlock; boost::optional isFailed; boost::optional lastFailedHeight; boost::optional lastFailedId; boost::optional maxUsedBlockHeight; boost::optional maxUsedBlockId; vector signatures; shared_ptr copy(const shared_ptr& src, const shared_ptr& tgt) const; boost::property_tree::ptree toPropertyTree() const; virtual void merge(const shared_ptr& self, const shared_ptr& other); boost::optional getHeight() const; }; /** * Models a Monero key image. */ struct MoneroKeyImage : public SerializableStruct { boost::optional hex; boost::optional signature; shared_ptr copy(const shared_ptr& src, const shared_ptr& tgt) const; boost::property_tree::ptree toPropertyTree() const; void merge(const shared_ptr& self, const shared_ptr& other); }; /** * Models a Monero transaction output. */ struct MoneroOutput : public SerializableStruct { shared_ptr tx; boost::optional> keyImage; boost::optional amount; boost::optional index; vector ringOutputIndices; boost::optional stealthPublicKey; shared_ptr copy(const shared_ptr& src, const shared_ptr& tgt) const; boost::property_tree::ptree toPropertyTree() const; virtual void merge(const shared_ptr& self, const shared_ptr& other); }; }