A fast C++ SDK to interact with Solana and Mango Markets. The SDK also includes a collection of examples to send transactions to Solana and trade on Mango Markets.
If you are experienced in c++ dev and want to work on this full-time, contact @m_schneider on Twitter.
Install as a static lib(faster compile times). See building.
See example CMakeLists.txt on how to use.
Copy the include folder to your build tree and use a C++17 compiler.
The Mango Markets SDK depends on libsol
above.
#include "solana.hpp"
const auto accountPubkey = "<pub key>";
const auto rpc_url = "<rpc url>";
auto connection = solana::rpc::Connection(rpc_url);
struct MyAccountInfo {
int64_t basePosition;
i80f48 quotePosition;
i80f48 deposits[MAX_TOKENS];
...
};
MyAccountInfo myAccountInfo =
connection.getAccountInfo<MyAccountInfo>(accountPubkey);
std::cout << myAccoutInfo.basePosition << std::endl;
See full example.
#include "solana.hpp"
// 1. fetch recent blockhash to anchor tx to
auto recentBlockHash = connection.getLatestBlockhash();
// 2. assemble tx
const solana::PublicKey feePayer = solana::PublicKey::fromBase58(
"<fee payer>");
const solana::PublicKey memoProgram =
solana::PublicKey::fromBase58(solana::MEMO_PROGRAM_ID);
const std::string memo = "Hello \xF0\x9F\xA5\xAD";
const solana::CompiledInstruction ix = {
1, {}, std::vector<uint8_t>(memo.begin(), memo.end())};
const solana::CompiledTransaction tx = {
recentBlockHash, {feePayer, memoProgram}, {ix}, 1, 0, 1};
// 3. send & sign tx
const auto keypair =
solana::Keypair::fromFile("id.json");
const auto b58Sig = connection.sendTransaction(keypair, tx);
spdlog::info(
"sent tx. check: https://explorer.solana.com/tx/{}?cluster=devnet",
b58Sig);
See full example.
See full example.
See full example.
See full example.
#include "MangoAccount.hpp"
const auto& mangoAccountInfo =
connection.getAccountInfo<mango_v3::MangoAccountInfo>(accountPubkey);
mango_v3::MangoAccount mangoAccount =
mango_v3::MangoAccount(mangoAccountInfo);
auto openOrders = mangoAccount.loadOpenOrders(connection);
auto group = connection.getAccountInfo<mango_v3::MangoGroup>(config.group);
auto cache = connection.getAccountInfo<mango_v3::MangoCache>(
group.mangoCache.toBase58());
auto maintHealth =
mangoAccount.getHealth(group, cache, mango_v3::HealthType::Maint);
auto initHealth =
mangoAccount.getHealth(group, cache, mango_v3::HealthType::Init);
auto maintHealthRatio =
mangoAccount.getHealthRatio(group, cache, mango_v3::HealthType::Maint);
See full example.
The project uses conan.io to manage dependencies. Install Conan here.
$ git clone https://github.com/mschneider/solcpp.git
# Create a default profile or copy over the example for linux / macos
$ conan profile new default --detect
$ cd solcpp && mkdir build && cd build
$ conan install .. --build=missing -o:h boost:without_contract=True -o:h boost:without_fiber=True -o:h boost:without_graph=True -o:h boost:without_graph_parallel=True -o:h boost:without_json=True -o:h boost:without_log=True -o:h boost:without_math=True -o:h boost:without_mpi=True -o:h boost:without_nowide=True -o:h boost:without_program_options=True -o:h boost:without_python=True -o:h boost:without_stacktrace=True -o:h boost:without_test=True -o:h boost:without_timer=True -o:h boost:without_type_erasure=True -o:h boost:without_wave=True
$ cmake .. -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release
$ cmake --build .
$ ./bin/tests # Run tests
$ ./bin/example-send-transaction # Run sendTransaction example
- C++17
- boost 1.76.0 [Boost]
- cpr 1.7.2 [MIT]
- curl 7.81.0 [MIT]
- doctest 2.4.8 [MIT]
- sodium 1.0.18 [ISC]
- websocketpp 0.8.2 [BSD]
- nlohmann-json 3.10.5 [MIT]
-
If you have issues building libcurl on gcc-9, try clang. See issue.
-
If you have issues linking cpr on linux gcc, try compiling with
libcxx=libstdc++11
. See issue. -
In addition, some dependencies were directly included and slightly modified to work well with the rest of the code base.
- bitcoin/libbase58 [MIT]
- base64 [CC BY-SA 4.0]
- cpp-utilities/fixed [MIT]
-
Build the project locally using the building steps above.
-
Pick one of the issues or add your feature and send in your PR :).
-
Add a unit test here to verify and guard your change.
Mango Markets documentation can be found here.