Complementary Examples
- ARK C++ Client v1.4.1
 - ARK C++ Crypto v1.1.0
 
Prerequisites
Before we get started we need to make sure that all of the required dependencies are installed. These dependencies are the Crypto SDK and Client SDK. You can head on over to their documentations to read more about them but for now we are only concerned with installing them to get up and running.
Also note that CMake is the recommended build tool.
Open your project and execute the following commands to install both SDKs. Make sure that those complete without any errors. If you encounter any errors, please open an issue in C++ Client or C++ Crypto with as much information as you can provide so that our developers can have a look and get to the bottom of the issue.
Clone the C++ Client and Crypto repos into your projects external dependencies directory.
1git clone https://github.com/arkecosystem/cpp-client2git clone https://github.com/arkecosystem/cpp-crypto
Example Setup
Project Layout
1project2- extern/3 - cpp-client/4 - cpp-crypto/5- src/6 - | main.c7- | CMakeLists.txt
Cloning
1git clone https://github.com/arkecosystem/cpp-client extern/cpp-client2git clone https://github.com/arkecosystem/cpp-crypto extern/cpp-crypto
Example CMake File
CMakeLists.txt
1cmake_minimum_required(VERSION 3.2)23project(ark_cpp_example_project)45set(CMAKE_CXX_STANDARD 11)67if (MSVC)8 add_definitions(9 -D_CRT_SECURE_NO_WARNINGS10 -D_SCL_SECURE_NO_WARNINGS11 -DNOMINMAX12 )13 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /utf-8")14endif()1516add_subdirectory(extern/cpp-client)17add_subdirectory(extern/cpp-crypto)1819set(FILE_SRC src/main.cpp)2021add_executable(${PROJECT_NAME} ${FILE_SRC})2223target_link_libraries(${PROJECT_NAME} ark_cpp_client ark_cpp_crypto)
Building and Running the Project
1mkdir build && cd build2cmake ..3cmake --build .4./ark_cpp_example_project
Ready to roll
Now that we’re setup and understand the basic layout and build steps, let’s look into some examples for the most common tasks encountered when interacting with the ARK Blockchain.
Persisting your transaction on the blockchain
The process of getting your transaction verified and persisted on the ARK Blockchain involves a few steps with which our SDKs will help you but lets break them down to get a better idea of what is happening.
- Install the Client SDK and configure it to use a node of your choosing to broadcast your transactions to. Always make sure that you have a fallback node that you can use for broadcasting in case your primary node goes offline or acts strange otherwise.
 - Install the Crypto SDK and configure it to match the configuration of the network. This is the most important part as misconfiguration can lead to a myriad of issues as Core will reject your transactions.
 - Retrieve the nonce of the sender wallet and increase it by 1. You can read about what a sequential nonce is and why it is important here.
 - Create an instance of the builder for the type of transaction you want to create. This is the step where we actually create a transaction and sign it so that the ARK Blockchain can later on verify it and decide if it will be accepted, forged and finally. You can read the relevant API documentation if you want more detailed information about the design and usage.
 - Turn the newly created transaction into JSON and broadcast it to the network through the Client SDK. You can read the relevant API documentation if you want more detailed information about the design and usage.
 - Process the API response and verify that your transaction was accepted. If the network rejects your transaction you’ll receive the reason as to why that is the case in the response which might mean that you need to create a new transaction and broadcast it.
 
Troubleshooting
A common issue when trying to get your transaction onto the blockchain is that you’ll receive an error to the effect of Transaction Version 2 is not supported which indicates that your Crypto SDK configuration might be wrong.
The solution to this is to make sure that your Crypto SDK instance is properly configured. This includes both the network preset and the height it’s configured to assume the network has passed, if any of those don’t match up you’ll encounter the aforementioned issue with the version of your transactions.
Mainnet
 1#include "common/configuration.hpp" 2#include "transactions/builders/builder.hpp" 3  4#include "networks/mainnet.hpp" 5  6auto transaction = Ark::Crypto::transactions::builder::Transfer(Mainnet) 7        .nonce(1) 8        .senderPublicKey("YOUR_SENDER_WALLET_PUBLICKEY") 9        .amount(1)10        .expiration(0)11        .recipientId("Address of Recipient")12        .build(config);
Devnet
 1#include "common/configuration.hpp" 2#include "transactions/builders/builder.hpp" 3  4#include "networks/devnet.hpp" 5  6// Devnet is the default configuration 7auto transaction = Ark::Crypto::transactions::builder::Transfer() 8        .nonce(1) 9        .senderPublicKey("YOUR_SENDER_WALLET_PUBLICKEY")10        .amount(1)11        .expiration(0)12        .recipientId("Address of Recipient")13        .build();
Testnet
 1#include "common/configuration.hpp" 2#include "transactions/builders/builder.hpp" 3  4#include "networks/testnet.hpp" 5  6Ark::Crypto::Configuration config(Testnet); 7  8auto transaction = Ark::Crypto::transactions::builder::Transfer(config) 9        .nonce(1)10        .senderPublicKey("YOUR_SENDER_WALLET_PUBLICKEY")11        .amount(1)12        .expiration(0)13        .recipientId("Address of Recipient")14        .build();
Custom Network
 1#include "common/configuration.hpp" 2#include "transactions/builders/builder.hpp" 3  4#include "common/network.hpp" 5  6const Ark::Crypto::Network CustomNetwork = { 7    "f39a61f04d6136a690a0b675ef6eedbd053665bd343b4e4f03311f12065fb875", 8    1, 0xCE, 0x41, 9    "2019-10-25T09:05:40.856Z"10};11 12auto transaction = Ark::Crypto::transactions::builder::Transfer(CustomNetwork)13        .nonce(1)14        .senderPublicKey("YOUR_SENDER_WALLET_PUBLICKEY")15        .amount(1)16        .expiration(0)17        .recipientId("Address of Recipient")18        .build();
Creating and Broadcasting a Transfer Transaction
 1#include <iostream> 2  3#include <arkClient.h> 4#include <arkCrypto.h> 5  6#include "transactions/builders/builder.hpp" 7  8using namespace Ark::Client; 9using namespace Ark::Crypto;10using namespace Ark::Crypto::transactions;11 12// Configure our API client13Connection<Api> client("167.114.29.52", 4003);14 15// This is just one method of Parsing Json to obtain a Nonce;16// it uses the built-in tools from C++ Client & Crypto.17//18// Other methods of parsing may be used here.19uint64_t getWalletNonce(Connection<Api>& client, const char\* address) {20    // Request the Wallet's Json from the API Connection21    const auto walletResponse = client.api.wallets.get(address);22 23    // parse the Json Wallet Response to retrieve the nonce24    const size_t capacity = JSON_OBJECT_SIZE(0) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(6) + 160;25    DynamicJsonDocument doc(capacity);26    deserializeJson(doc, walletResponse);27    uint64_t nonce = doc["data"]["nonce"];28 29    return nonce ?: 1;30}31 32int main() {33    // Step 1: Retrieve the nonce of the sender wallet34    const auto nonce = getWalletNonce(client, "YOUR_SENDER_WALLET_ADDRESS");35 36    // Step 2: Create the Transaction37    const auto transaction = builder::Transfer()38            .nonce(nonce)39            .amount(1ULL)40            .expiration(0UL)41            .recipientId("Address of Recipient")42            .vendorField("Hello World")43            .sign("this is a top secret passphrase")44            .build();45 46    // Step 3: Construct the Transaction Payload47    auto txPayload = "{\"transactions\":[" + transaction.toJson() + "]}";48 49    // Step 4: Broadcast the Transaction Payload50    const auto broadcastResponse = client.api.transactions.send(txPayload);51 52    // Step 5: Log the response53    printf("\nbroadcastResponse: %s\n", broadcastResponse.c_str());54 55    return 0;56}
Information
The vendorField is optional and limited to a length of 255 characters. It can be a good idea to add a vendor field to your transactions if you want to be able to easily track them in the future.
Creating and Broadcasting a Second Signature Registration Transaction
 1#include <iostream> 2  3#include <arkClient.h> 4#include <arkCrypto.h> 5  6#include "transactions/builders/builder.hpp" 7  8using namespace Ark::Client; 9using namespace Ark::Crypto;10using namespace Ark::Crypto::transactions;11 12// Configure our API client13Connection<Api> client("167.114.29.52", 4003);14 15// This is just one method of Parsing Json to obtain a Nonce;16// it uses the built-in tools from C++ Client & Crypto.17//18// Other methods of parsing may be used here.19uint64_t getWalletNonce(Connection<Api>& client, const char\* address) {20    // Request the Wallet's Json from the API Connection21    const auto walletResponse = client.api.wallets.get(address);22 23    // parse the Json Wallet Response to retrieve the nonce24    const size_t capacity = JSON_OBJECT_SIZE(0) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(6) + 160;25    DynamicJsonDocument doc(capacity);26    deserializeJson(doc, walletResponse);27    uint64_t nonce = doc["data"]["nonce"];28 29    return nonce ?: 1;30}31 32int main() {33    // Step 1: Retrieve the nonce of the sender wallet34    const auto nonce = getWalletNonce(client, "YOUR_SENDER_WALLET_ADDRESS");35 36    // Step 2: Create the Second PublicKey37    // - 2nd PublicKey: 03699e966b2525f9088a6941d8d94f7869964a000efe65783d78ac82e1199fe60938    const uint8_t secondPublicKey[33] = { 3, 105, 158, 150, 107, 37, 37, 249, 8, 138, 105, 65, 216, 217, 79, 120, 105, 150, 74, 0, 14, 254, 101, 120, 61, 120, 172, 130, 225, 25, 159, 230, 9 };39 40    // Step 3: Create the Transaction41    const auto transaction = builder::SecondSignature()42            .nonce(nonce)43            .publicKey(secondPublicKey)44            .sign("this is a top secret passphrase")45            .build();46 47    // Step 4: Construct the Transaction Payload48    auto txPayload = "{\"transactions\":[" + transaction.toJson() + "]}";49 50    // Step 5: Broadcast the Transaction Payload51    const auto broadcastResponse = client.api.transactions.send(txPayload);52 53    // Step 6: Log the response54    printf("\nbroadcastResponse: %s\n", broadcastResponse.c_str());55 56    return 0;57}
Creating and Broadcasting a Delegate Registration Transaction
 1#include <iostream> 2  3#include <arkClient.h> 4#include <arkCrypto.h> 5  6#include "transactions/builders/builder.hpp" 7  8using namespace Ark::Client; 9using namespace Ark::Crypto;10using namespace Ark::Crypto::transactions;11 12// Configure our API client13Connection<Api> client("167.114.29.52", 4003);14 15// This is just one method of Parsing Json to obtain a Nonce;16// it uses the built-in tools from C++ Client & Crypto.17//18// Other methods of parsing may be used here.19uint64_t getWalletNonce(Connection<Api>& client, const char\* address) {20    // Request the Wallet's Json from the API Connection21    const auto walletResponse = client.api.wallets.get(address);22 23    // parse the Json Wallet Response to retrieve the nonce24    const size_t capacity = JSON_OBJECT_SIZE(0) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(6) + 160;25    DynamicJsonDocument doc(capacity);26    deserializeJson(doc, walletResponse);27    uint64_t nonce = doc["data"]["nonce"];28 29    return nonce ?: 1;30}31 32int main() {33    // Step 1: Retrieve the nonce of the sender wallet34    const auto nonce = getWalletNonce(client, "YOUR_SENDER_WALLET_ADDRESS");35 36    // Step 2: Create the Transaction37    const auto transaction = builder::DelegateRegistration()38            .nonce(nonce)39            .username("baldninja")40            .sign("this is a top secret passphrase")41            .build();42 43    // Step 3: Construct the Transaction Payload44    auto txPayload = "{\"transactions\":[" + transaction.toJson() + "]}";45 46    // Step 4: Broadcast the Transaction Payload47    const auto broadcastResponse = client.api.transactions.send(txPayload);48 49    // Step 5: Log the response50    printf("\nbroadcastResponse: %s\n", broadcastResponse.c_str());51 52    return 0;53}
Creating and Broadcasting a Vote Transaction
 1#include <iostream> 2  3#include <arkClient.h> 4#include <arkCrypto.h> 5  6#include "transactions/builders/builder.hpp" 7  8#include "networks/mainnet.hpp" 9 10using namespace Ark::Client;11using namespace Ark::Crypto;12using namespace Ark::Crypto::transactions;13 14// Configure our API client. For example, this time on a Mainnet peer15Connection<Api> client("5.196.105.34", 4003);16 17// This is just one method of Parsing Json to obtain a Nonce;18// it uses the built-in tools from C++ Client & Crypto.19//20// Other methods of parsing may be used here.21uint64_t getWalletNonce(Connection<Api>& client, const char\* address) {22    // Request the Wallet's Json from the API Connection23    const auto walletResponse = client.api.wallets.get(address);24 25    // parse the Json Wallet Response to retrieve the nonce26    const size_t capacity = JSON_OBJECT_SIZE(0) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(6) + 160;27    DynamicJsonDocument doc(capacity);28    deserializeJson(doc, walletResponse);29    uint64_t nonce = doc["data"]["nonce"];30 31    return nonce ?: 1;32}33 34int main() {35    // Step 1: Retrieve the nonce of the sender wallet36    const auto nonce = getWalletNonce(client, "YOUR_SENDER_WALLET_ADDRESS");37 38    // Step 2: Create the 'Vote'39    // - votes   +022cca9529ec97a772156c152a00aad155ee6708243e65c9d211a589cb5d43234d40    // - vote:   '+' / 0x0141    // - unvote: '-' / 0x0042    const uint8_t unvote[34] = { 1, 2, 44, 202, 149, 41, 236, 151, 167, 114, 21, 108, 21, 42, 0, 170, 209, 85, 238, 103, 8, 36,  62, 101, 201, 210, 17, 165, 137, 203, 93, 67, 35, 77 };43 44    // Step 3: Create the Transaction using Mainnet45    const auto transaction = builder::Vote(Mainnet)46            .nonce(nonce)47            .votes(vote)48            .sign("this is a top secret passphrase")49            .build();50 51    // Step 4: Construct the Transaction Payload52    auto txPayload = "{\"transactions\":[" + transaction.toJson() + "]}";53 54    // Step 5: Broadcast the Transaction Payload55    const auto broadcastResponse = client.api.transactions.send(txPayload);56 57    // Step 6: Log the response58    printf("\nbroadcastResponse: %s\n", broadcastResponse.c_str());59 60    return 0;61}
Information
Note the plus (1) prefix for the public key that is passed to the .votes() function. This prefix denotes that this is a transaction to remove a vote from the given delegate.
Creating and Broadcasting an Unvote Transaction
 1#include <iostream> 2  3#include <arkClient.h> 4#include <arkCrypto.h> 5  6#include "transactions/builders/builder.hpp" 7  8#include "networks/mainnet.hpp" 9 10using namespace Ark::Client;11using namespace Ark::Crypto;12using namespace Ark::Crypto::transactions;13 14// Configure our API client. For example, this time on a Mainnet peer15Connection<Api> client("5.196.105.34", 4003);16 17// This is just one method of Parsing Json to obtain a Nonce;18// it uses the built-in tools from C++ Client & Crypto.19//20// Other methods of parsing may be used here.21uint64_t getWalletNonce(Connection<Api>& client, const char\* address) {22    // Request the Wallet's Json from the API Connection23    const auto walletResponse = client.api.wallets.get(address);24 25    // parse the Json Wallet Response to retrieve the nonce26    const size_t capacity = JSON_OBJECT_SIZE(0) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(6) + 160;27    DynamicJsonDocument doc(capacity);28    deserializeJson(doc, walletResponse);29    uint64_t nonce = doc["data"]["nonce"];30 31    return nonce ?: 1;32}33 34int main() {35    // Step 1: Retrieve the nonce of the sender wallet36    const auto nonce = getWalletNonce(client, "YOUR_SENDER_WALLET_ADDRESS");37 38    // Step 2: Create the 'Unvote'39    // - votes   -022cca9529ec97a772156c152a00aad155ee6708243e65c9d211a589cb5d43234d40    // - vote:   '+' / 0x0141    // - unvote: '-' / 0x0042    const uint8_t unvote[34] = { 0, 2, 44, 202, 149, 41, 236, 151, 167, 114, 21, 108, 21, 42, 0, 170, 209, 85, 238, 103, 8, 36,  62, 101, 201, 210, 17, 165, 137, 203, 93, 67, 35, 77 };43 44    // Step 3: You can also use a configuration for Mainnet or a custom network45    Configuration config(Mainnet);46 47    // Step 4: Create the Transaction48    const auto transaction = builder::Vote(config)49            .nonce(nonce)50            .votes(unvote)51            .sign("this is a top secret passphrase")52            .build();53 54    // Step 5: Construct the Transaction Payload55    auto txPayload = "{\"transactions\":[" + transaction.toJson() + "]}";56 57    // Step 6: Broadcast the Transaction Payload58    const auto broadcastResponse = client.api.transactions.send(txPayload);59 60    // Step 7: Log the response61    printf("\nbroadcastResponse: %s\n", broadcastResponse.c_str());62 63    return 0;64}
Information
Note the minus (0) prefix for the public key that is passed to the .votes() function. This prefix denotes that this is a transaction to add a vote to the given delegate.
Creating and Broadcasting an Ipfs Transaction
 1#include <iostream> 2  3#include <arkClient.h> 4#include <arkCrypto.h> 5  6#include "transactions/builders/builder.hpp" 7  8using namespace Ark::Client; 9using namespace Ark::Crypto;10using namespace Ark::Crypto::transactions;11 12// Configure our API client13Connection<Api> client("167.114.29.52", 4003);14 15// This is just one method of Parsing Json to obtain a Nonce;16// it uses the built-in tools from C++ Client & Crypto.17//18// Other methods of parsing may be used here.19uint64_t getWalletNonce(Connection<Api>& client, const char\* address) {20    // Request the Wallet's Json from the API Connection21    const auto walletResponse = client.api.wallets.get(address);22 23    // parse the Json Wallet Response to retrieve the nonce24    const size_t capacity = JSON_OBJECT_SIZE(0) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(6) + 160;25    DynamicJsonDocument doc(capacity);26    deserializeJson(doc, walletResponse);27    uint64_t nonce = doc["data"]["nonce"];28 29    return nonce ?: 1;30}31 32int main() {33    // Step 1: Retrieve the nonce of the sender wallet34    const auto nonce = getWalletNonce(client, "YOUR_SENDER_WALLET_ADDRESS");35 36    // Step 2: Create the Ipfs Hash37    // ipfs: QmYSK2JyM3RyDyB52caZCTKFR3HKniEcMnNJYdk8DQ6KKB38    const uint8_t ipfsHash[34] = { 18, 32, 150, 8, 24, 77, 108, 238, 43, 154, 248, 230, 194, 164, 111, 201, 49, 138, 223, 115, 50, 154, 235, 138,134, 207, 132, 114, 130, 159, 255, 91, 184, 158 };39 40    // Step 3: Create the Transaction for Mainnet41    const auto transaction = builder::Ipfs()42            .nonce(nonce)43            .ipfs(ipfsHash, 34)44            .sign("this is a top secret passphrase")45            .build();46 47    // Step 4: Construct the Transaction Payload48    auto txPayload = "{\"transactions\":[" + transaction.toJson() + "]}";49 50    // Step 5: Broadcast the Transaction Payload51    const auto broadcastResponse = client.api.transactions.send(txPayload);52 53    // Step 6: Log the response54    printf("\nbroadcastResponse: %s\n", broadcastResponse.c_str());55 56    return 0;57}
Creating and Broadcasting a Multi Payment Transaction
 1#include <array> 2#include <vector> 3  4#include <iostream> 5  6#include <arkClient.h> 7#include <arkCrypto.h> 8  9#include "transactions/builders/builder.hpp"10 11using namespace Ark::Client;12using namespace Ark::Crypto;13using namespace Ark::Crypto::transactions;14 15// Configure our API client16Connection<Api> client("167.114.29.52", 4003);17 18// This is just one method of Parsing Json to obtain a Nonce;19// it uses the built-in tools from C++ Client & Crypto.20//21// Other methods of parsing may be used here.22uint64_t getWalletNonce(Connection<Api>& client, const char\* address) {23    // Request the Wallet's Json from the API Connection24    const auto walletResponse = client.api.wallets.get(address);25 26    // parse the Json Wallet Response to retrieve the nonce27    const size_t capacity = JSON_OBJECT_SIZE(0) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(6) + 160;28    DynamicJsonDocument doc(capacity);29    deserializeJson(doc, walletResponse);30    uint64_t nonce = doc["data"]["nonce"];31 32    return nonce ?: 1;33}34 35int main() {36    // Step 1: Retrieve the nonce of the sender wallet37    const auto nonce = getWalletNonce(client, "YOUR_SENDER_WALLET_ADDRESS");38 39 40    // Step 2: Create the Amounts and Addresses objects41    const auto amounts = std::vector<uint64_t>({ 1ULL, 1ULL, 1ULL, 1ULL, 1ULL, 1ULL, 1ULL, 1ULL, 1ULL, 1ULL });42    // addresses:   "DHKxXag9PjfjHBbPg3HQS5WCaQZdgDf6yi",43    //              "DBzGiUk8UVjB2dKCfGRixknB7Ki3Zhqthp",44    //              "DFa7vn1LvWAyTuVDrQUr5NKaM73cfjx2Cp",45    //              "DSGsxX84gif4ipAxZjjCE2k2YpHmsNTJeY",46    //              "DQhzMRvVoCYCiZH2iSyuqCTcayz7z4XTKx",47    //              "DMSD6fFT1Xcxh4ErYExr5MtGnEuDcYu22m",48    //              "D7HCZG8hJuJqu9rANRdyNr6N1vpH2vbyx8",49    //              "DQy6ny2bkvWiDLboQMZ1cxnmoNC5JM228w",50    //              "D7EUgmA78qUaSfsNedfgKs2ALq28FhL3zo",51    //              "DEHyKHdtzHqTghfpwaBcvTzLpgPP5AAUgE"52    const auto addresses = std::vector<std::array<uint8_t, 21> >({53            { 30, 133, 175, 101, 173, 106, 163, 161, 223,  91, 201, 166, 245, 155, 159,  61,  57,  79, 100,  58,  35 },54            { 30,  75,  29, 161, 170, 169, 188, 174, 197, 170, 246, 118,   4, 120,   1,   7,  12,  76,  18,  71, 193 },55            { 30, 114, 108, 208, 211, 224,  41,  32, 188, 193,  79, 109,  87, 165, 247,  47, 100, 210, 112, 206, 227 },56            { 30, 231, 211, 119, 107, 126, 111,  22,  25, 170, 218,  56, 165, 252, 113, 167, 183, 243, 185, 186, 200 },57            { 30, 214, 162, 243, 198,  57, 152,  44,   0,  89, 206,  95, 226,  30,  94, 116,  33,  45, 106, 140,  63 },58            { 30, 178, 190, 143,  12,  23,  91, 172, 102,  34, 216, 126, 212, 216,  73,  93, 113, 191, 188,  73, 243 },59            { 30,  23, 120, 154,  45,   2, 165,  13, 103, 200,  74, 101, 226, 221, 246,  68, 137,  57, 210,  11, 124 },60            { 30, 217, 126, 145,  87, 206, 191, 199,  71, 134, 227,  49,  91, 164, 170, 123, 164,  10, 223, 107,  80 },61            { 30,  22, 244, 209, 133,  76,  10,  63,  34, 251,  44, 242,  46,  28, 139, 137,  46, 108, 158,  83,  14 },62            { 30, 100, 102, 216, 129,  91,   2,  33, 119, 141,  36,  36, 214,  55, 142, 101, 144,  24, 178, 175,  62 }})63 64    // Step 3: Create the Transaction65    const auto transaction = builder::MultiPayment()66            .nonce(nonce)67            .n_payments(10UL)68            .amounts(amounts)69            .addresses(addresses)70            .sign("this is a top secret passphrase")71            .build();72 73    // Step 4: Construct the Transaction Payload74    auto txPayload = "{\"transactions\":[" + transaction.toJson() + "]}";75 76    // Step 5: Broadcast the Transaction Payload77    const auto broadcastResponse = client.api.transactions.send(txPayload);78 79    // Step 6: Log the response80    printf("\nbroadcastResponse: %s\n", broadcastResponse.c_str());81 82    return 0;83}
Creating and Broadcasting a Delegate Resignation Transaction
 1#include <iostream> 2  3#include <arkClient.h> 4#include <arkCrypto.h> 5  6#include "transactions/builders/builder.hpp" 7  8using namespace Ark::Client; 9using namespace Ark::Crypto;10using namespace Ark::Crypto::transactions;11 12// Configure our API client13Connection<Api> client("167.114.29.52", 4003);14 15// This is just one method of Parsing Json to obtain a Nonce;16// it uses the built-in tools from C++ Client & Crypto.17//18// Other methods of parsing may be used here.19uint64_t getWalletNonce(Connection<Api>& client, const char\* address) {20    // Request the Wallet's Json from the API Connection21    const auto walletResponse = client.api.wallets.get(address);22 23    // parse the Json Wallet Response to retrieve the nonce24    const size_t capacity = JSON_OBJECT_SIZE(0) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(6) + 160;25    DynamicJsonDocument doc(capacity);26    deserializeJson(doc, walletResponse);27    uint64_t nonce = doc["data"]["nonce"];28 29    return nonce ?: 1;30}31 32int main() {33    // Step 1: Retrieve the nonce of the sender wallet34    const auto nonce = getWalletNonce(client, "YOUR_SENDER_WALLET_ADDRESS");35 36    // Step 2: Create the Transaction37    const auto transaction = builder::DelegateResignation()38            .nonce(nonce)39            .fee(2500000000ULL)40            .sign("this is a top secret passphrase")41            .build();42 43    // Step 3: Construct the Transaction Payload44    auto txPayload = "{\"transactions\":[" + transaction.toJson() + "]}";45 46    // Step 4: Broadcast the Transaction Payload47    const auto broadcastResponse = client.api.transactions.send(txPayload);48 49    // Step 5: Log the response50    printf("\nbroadcastResponse: %s\n", broadcastResponse.c_str());51 52    return 0;53}
Information
A delegate resignation has to be sent from the delegate wallet itself to verify its identity.
Creating and Broadcasting a Htlc Lock Transaction
 1#include <iostream> 2  3#include <arkClient.h> 4#include <arkCrypto.h> 5  6#include "transactions/builders/builder.hpp" 7  8using namespace Ark::Client; 9using namespace Ark::Crypto;10using namespace Ark::Crypto::transactions;11 12// Configure our API client13Connection<Api> client("167.114.29.52", 4003);14 15// This is just one method of Parsing Json to obtain a Nonce;16// it uses the built-in tools from C++ Client & Crypto.17//18// Other methods of parsing may be used here.19uint64_t getWalletNonce(Connection<Api>& client, const char\* address) {20    // Request the Wallet's Json from the API Connection21    const auto walletResponse = client.api.wallets.get(address);22 23    // parse the Json Wallet Response to retrieve the nonce24    const size_t capacity = JSON_OBJECT_SIZE(0) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(6) + 160;25    DynamicJsonDocument doc(capacity);26    deserializeJson(doc, walletResponse);27    uint64_t nonce = doc["data"]["nonce"];28 29    return nonce ?: 1;30}31 32int main() {33    // Step 1: Retrieve the nonce of the sender wallet34    const auto nonce = getWalletNonce(client, "YOUR_SENDER_WALLET_ADDRESS");35 36    // Step 2: Create the Secret Hash object37    const uint8_t secretHash[32] = { 9, 185, 162, 131, 147, 239, 208, 47, 205, 118, 162, 27, 15, 15, 85, 186, 42, 173, 143, 54, 64, 255, 140, 174, 134, 222, 3, 58, 156, 251, 215, 140 };38 39    // Step 3: Create the Transaction40    const auto transaction = builder::HtlcLock()41            .nonce(nonce)42            .amount(1ULL)43            .secretHash(secretHash)44            .expirationType(1U)45            .expiration(81242895UL)46            .recipientId("Address of Recipient")47            .sign("this is a top secret passphrase")48            .build();49 50    // Step 4: Construct the Transaction Payload51    auto txPayload = "{\"transactions\":[" + transaction.toJson() + "]}";52 53    // Step 5: Broadcast the Transaction Payload54    const auto broadcastResponse = client.api.transactions.send(txPayload);55 56    // Step 6: Log the response57    printf("\nbroadcastResponse: %s\n", broadcastResponse.c_str());58 59    return 0;60}
Creating and Broadcasting a Htlc Claim Transaction
 1#include <iostream> 2  3#include <arkClient.h> 4#include <arkCrypto.h> 5  6#include "transactions/builders/builder.hpp" 7  8using namespace Ark::Client; 9using namespace Ark::Crypto;10using namespace Ark::Crypto::transactions;11 12// Configure our API client13Connection<Api> client("167.114.29.52", 4003);14 15// This is just one method of Parsing Json to obtain a Nonce;16// it uses the built-in tools from C++ Client & Crypto.17//18// Other methods of parsing may be used here.19uint64_t getWalletNonce(Connection<Api>& client, const char\* address) {20    // Request the Wallet's Json from the API Connection21    const auto walletResponse = client.api.wallets.get(address);22 23    // parse the Json Wallet Response to retrieve the nonce24    const size_t capacity = JSON_OBJECT_SIZE(0) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(6) + 160;25    DynamicJsonDocument doc(capacity);26    deserializeJson(doc, walletResponse);27    uint64_t nonce = doc["data"]["nonce"];28 29    return nonce ?: 1;30}31 32int main() {33    // Step 1: Retrieve the nonce of the sender wallet34    const auto nonce = getWalletNonce(client, "YOUR_SENDER_WALLET_ADDRESS");35 36    // Step 2: Create the Lock TransactionId and Unlock Secret objects37    // - 50f301306d8da58d62332ce3a361d9fd4a01b0a89ca914517b685e2d3714e24e38    const uint8_t lockTxId[32] = { 80, 243, 1, 48,  109, 141, 165, 141, 98, 51, 44, 227, 163, 97, 217, 253, 74, 1, 176, 168, 156, 169, 20,  81, 123, 104, 94, 45, 55, 20, 226, 78 };39    // - sha256("f5ea877a311ced90cf4524cb489e972f")40    // - 580fde2946477f24b288890faea69fa120a14cfa5ea4a9819508331a034d958541    const uint8_t unlockSecret[32] = { 88, 15, 222, 41, 70, 71, 127, 36, 178, 136, 137, 15, 174, 166, 159, 161, 32, 161, 76, 250, 94, 164, 169, 129, 149, 8, 51, 26, 3, 77, 149, 133 };42 43    // Step 3: Create the Transaction44    const auto transaction = builder::HtlcClaim()45            .nonce(nonce)46            .lockTransactionId(lockTxId)47            .unlockSecret(unlockSecret)48            .sign("this is a top secret passphrase")49            .build();50 51    // Step 4: Construct the Transaction Payload52    auto txPayload = "{\"transactions\":[" + transaction.toJson() + "]}";53 54    // Step 5: Broadcast the Transaction Payload55    const auto broadcastResponse = client.api.transactions.send(txPayload);56 57    // Step 6: Log the response58    printf("\nbroadcastResponse: %s\n", broadcastResponse.c_str());59 60    return 0;61}
Information
The unlockSecret has to be a SHA256 hash of the plain text secret that you shared with the person that is allowed to claim the transaction.
Creating and Broadcasting a Htlc Refund Transaction
 1#include <iostream> 2  3#include <arkClient.h> 4#include <arkCrypto.h> 5  6#include "transactions/builders/builder.hpp" 7  8using namespace Ark::Client; 9using namespace Ark::Crypto;10using namespace Ark::Crypto::transactions;11 12// Configure our API client13Connection<Api> client("167.114.29.52", 4003);14 15// This is just one method of Parsing Json to obtain a Nonce;16// it uses the built-in tools from C++ Client & Crypto.17//18// Other methods of parsing may be used here.19uint64_t getWalletNonce(Connection<Api>& client, const char\* address) {20    // Request the Wallet's Json from the API Connection21    const auto walletResponse = client.api.wallets.get(address);22 23    // parse the Json Wallet Response to retrieve the nonce24    const size_t capacity = JSON_OBJECT_SIZE(0) + JSON_OBJECT_SIZE(1) + JSON_OBJECT_SIZE(6) + 160;25    DynamicJsonDocument doc(capacity);26    deserializeJson(doc, walletResponse);27    uint64_t nonce = doc["data"]["nonce"];28 29    return nonce ?: 1;30}31 32int main() {33    // Step 1: Retrieve the nonce of the sender wallet34    const auto nonce = getWalletNonce(client, "YOUR_SENDER_WALLET_ADDRESS");35 36    // Step 2: Create the Lock TransactionId object37    // - 50f301306d8da58d62332ce3a361d9fd4a01b0a89ca914517b685e2d3714e24e38    const uint8_t lockTxId[32] = { 80, 243, 1, 48,  109, 141, 165, 141, 98, 51, 44, 227, 163, 97, 217, 253, 74, 1, 176, 168, 156, 169, 20,  81, 123, 104, 94, 45, 55, 20, 226, 78 };39 40    // Step 3: Create the Transaction41    const auto transaction = builder::HtlcRefund()42            .nonce(nonce)43            .lockTransactionId(lockTxId)44            .sign("this is a top secret passphrase")45            .build();46 47    // Step 4: Construct the Transaction Payload48    auto txPayload = "{\"transactions\":[" + transaction.toJson() + "]}";49 50    // Step 5: Broadcast the Transaction Payload51    const auto broadcastResponse = client.api.transactions.send(txPayload);52 53    // Step 6: Log the response54    printf("\nbroadcastResponse: %s\n", broadcastResponse.c_str());55 56    return 0;57}