Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ SET(FILES ${CMAKE_SOURCE_DIR}/asset_utils.cpp
${CMAKE_SOURCE_DIR}/qbond.cpp
${CMAKE_SOURCE_DIR}/qearn.cpp
${CMAKE_SOURCE_DIR}/qpi_adapter.cpp
${CMAKE_SOURCE_DIR}/qrwa.cpp
${CMAKE_SOURCE_DIR}/qswap.cpp
${CMAKE_SOURCE_DIR}/quottery.cpp
${CMAKE_SOURCE_DIR}/qutil.cpp
Expand Down Expand Up @@ -47,6 +48,7 @@ SET(HEADER_FILES
oracle_utils.h
prompt.h
proposal.h
qrwa.h
qbond.h
qearn.h
qswap.h
Expand Down
39 changes: 39 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,45 @@ Commands:
-msvaultgetvaultowners <VAULT_ID>
Get MsVault owners given vault ID.

[QRWA COMMANDS]
-qrwapayout <pool_a|pool_b|pool_c|pool_d> [epoch]
-qrwapayout <ADDRESS> [epoch]
Show payout ring buffer for the specified pool or address.
Pool A = Qubic Mining, Pool B = SC Assets, Pool C = BTC Mining, Pool D = MLM Water.
Optional epoch filter: only show payouts for the given epoch.
-qrwastatus
Show qRWA totals (distributed per pool) and configured contract addresses.
-qrwaassets
Show assets and tokens held by the qRWA contract.
-qrwagovparams
Show current governance parameters (admin, cost addresses, percentages).
-qrwagovpoll <PROPOSAL_ID>
Show details of a governance poll by ID.
-qrwagovpollids
List active governance poll IDs.
-qrwadividends
Show dividend balances for all pools (revenue, QMINE/qRWA splits).
-qrwascdividends
Show SC dividend tracking — Pool B revenue sources from other smart contracts.
-qrwadonate <AMOUNT>
Donate QMINE to the treasury. Requires prior QX management rights transfer.
Valid seed and node ip/port are required.
-qrwavotegov <ADMIN> <ELECTRICITY> <MAINTENANCE> <REINVESTMENT> <QMINEDEV> <ELEC%> <MAINT%> <REINVEST%>
Submit or vote on a governance parameter proposal. All 5 addresses and 3 percentages required.
Valid seed and node ip/port are required.
-qrwasetpoolaaddr <ADDRESS>
Set Pool A revenue address (admin-only).
Valid seed and node ip/port are required.
-qrwasetpooldaddr <ADDRESS>
Set Pool D revenue address (admin-only).
Valid seed and node ip/port are required.
-qrwadepositasset <ISSUER> <ASSET_NAME> <AMOUNT>
Deposit a general asset into the contract (admin-only).
Valid seed and node ip/port are required.
-qrwarevokeasset <ISSUER> <ASSET_NAME> <NUMBER_OF_SHARES>
Revoke asset management rights back to QX (100 QU fee).
Valid seed and node ip/port are required.

[QSWAP COMMANDS]
-qswapgetfee
Show current Qswap fees.
Expand Down
181 changes: 181 additions & 0 deletions argparser.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,37 @@ void print_help()
printf("\t-querypriceviacontract <...>\n");
printf("\t\tSend price query via contract. Useful for testing contract queries and subscriptions. Skip arguments to get detailed documentation.\n");

printf("\n[QRWA COMMANDS]\n");
printf("\t-qrwapayout <pool_a|pool_b|pool_c|pool_d> [epoch]\n");
printf("\t-qrwapayout <ADDRESS> [epoch]\n");
printf("\t\tShow payout ring buffer for the specified pool.\n");
printf("\t-qrwastatus\n");
printf("\t\tShow qRWA totals and configured addresses.\n");
printf("\t-qrwaassets\n");
printf("\t\tShow assets and tokens held by the qRWA contract.\n");
printf("\t-qrwagovparams\n");
printf("\t\tShow current governance parameters.\n");
printf("\t-qrwagovpoll <proposalId>\n");
printf("\t\tShow details of a governance poll by ID.\n");
printf("\t-qrwagovpollids\n");
printf("\t\tList active governance poll IDs.\n");
printf("\t-qrwadividends\n");
printf("\t\tShow dividend balances for all pools.\n");
printf("\t-qrwascdividends\n");
printf("\t\tShow SC dividend tracking (Pool B revenue sources).\n");
printf("\t-qrwadonate <amount>\n");
printf("\t\tDonate QMINE to the treasury (requires prior QX management rights transfer).\n");
printf("\t-qrwavotegov <admin> <electricity> <maintenance> <reinvestment> <qminedev> <elec%%> <maint%%> <reinvest%%>\n");
printf("\t\tSubmit or vote on a governance parameter proposal.\n");
printf("\t-qrwasetpoolaaddr <ADDRESS>\n");
printf("\t\tSet Pool A revenue address (admin-only).\n");
printf("\t-qrwasetpooldaddr <ADDRESS>\n");
printf("\t\tSet Pool D revenue address (admin-only).\n");
printf("\t-qrwadepositasset <ISSUER> <ASSET_NAME> <amount>\n");
printf("\t\tDeposit a general asset into the contract (admin-only).\n");
printf("\t-qrwarevokeasset <ISSUER> <ASSET_NAME> <numberOfShares>\n");
printf("\t\tRevoke asset management rights back to QX (100 QU fee).\n");

printf("\n[SMART CONTRACT COMMANDS]\n");
printf("\t-callcontractfunction <CONTRACT_INDEX> <CONTRACT_FUNCTION> <INPUT_FORMAT_STRING> <OUTPUT_FORMAT_STRING>\n");
printf("\t\tCall a contract function of contract index and print the output. Valid node ip/port are required.\t\n");
Expand Down Expand Up @@ -1178,6 +1209,156 @@ void parseArgument(int argc, char** argv)
break;
}

/*************************
***** QRWA COMMANDS *****
*************************/

if (strcmp(argv[i], "-qrwapayout") == 0)
{
CHECK_NUMBER_OF_PARAMETERS(1)
if (strcmp(argv[i + 1], "pool_a") == 0)
g_cmd = QRWA_PAYOUT_POOL_A;
else if (strcmp(argv[i + 1], "pool_b") == 0)
g_cmd = QRWA_PAYOUT_POOL_B;
else if (strcmp(argv[i + 1], "pool_c") == 0)
g_cmd = QRWA_PAYOUT_POOL_C;
else if (strcmp(argv[i + 1], "pool_d") == 0)
g_cmd = QRWA_PAYOUT_POOL_D;
else if (strlen(argv[i + 1]) == 60)
{
g_cmd = QRWA_PAYOUT_ADDRESS;
g_qrwa_identity = argv[i + 1];
}
else { LOG("Invalid argument '%s'. Use pool_a, pool_b, pool_c, pool_d, or a 60-char address.\n", argv[i + 1]); exit(1); }
if (i + 2 < argc && argv[i + 2][0] != '-')
{
g_qrwa_epoch = atoi(argv[i + 2]);
i += 3;
}
else
{
i += 2;
}
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwastatus") == 0)
{
g_cmd = QRWA_STATUS;
i += 1;
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwaassets") == 0)
{
g_cmd = QRWA_ASSETS;
i += 1;
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwagovparams") == 0)
{
g_cmd = QRWA_GOV_PARAMS;
i += 1;
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwagovpoll") == 0)
{
CHECK_NUMBER_OF_PARAMETERS(1)
g_cmd = QRWA_GOV_POLL;
g_qrwa_poll_id = strtoull(argv[i + 1], nullptr, 10);
i += 2;
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwagovpollids") == 0)
{
g_cmd = QRWA_GOV_POLL_IDS;
i += 1;
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwadividends") == 0)
{
g_cmd = QRWA_DIVIDENDS;
i += 1;
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwascdividends") == 0)
{
g_cmd = QRWA_SC_DIVIDENDS;
i += 1;
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwadonate") == 0)
{
CHECK_NUMBER_OF_PARAMETERS(1)
g_cmd = QRWA_DONATE_TREASURY;
g_qrwa_amount = strtoull(argv[i + 1], nullptr, 10);
i += 2;
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwavotegov") == 0)
{
CHECK_NUMBER_OF_PARAMETERS(8)
g_cmd = QRWA_VOTE_GOV_PARAMS;
g_qrwa_gov_admin = argv[i + 1];
g_qrwa_gov_electricity = argv[i + 2];
g_qrwa_gov_maintenance = argv[i + 3];
g_qrwa_gov_reinvestment = argv[i + 4];
g_qrwa_gov_qminedev = argv[i + 5];
g_qrwa_gov_electricity_pct = strtoull(argv[i + 6], nullptr, 10);
g_qrwa_gov_maintenance_pct = strtoull(argv[i + 7], nullptr, 10);
g_qrwa_gov_reinvestment_pct = strtoull(argv[i + 8], nullptr, 10);
i += 9;
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwasetpoolaaddr") == 0)
{
CHECK_NUMBER_OF_PARAMETERS(1)
g_cmd = QRWA_SET_POOL_A_ADDR;
g_qrwa_new_address = argv[i + 1];
i += 2;
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwasetpooldaddr") == 0)
{
CHECK_NUMBER_OF_PARAMETERS(1)
g_cmd = QRWA_SET_POOL_D_ADDR;
g_qrwa_new_address = argv[i + 1];
i += 2;
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwadepositasset") == 0)
{
CHECK_NUMBER_OF_PARAMETERS(3)
g_cmd = QRWA_DEPOSIT_ASSET;
g_qrwa_issuer = argv[i + 1];
g_qrwa_asset_name = argv[i + 2];
g_qrwa_amount = strtoull(argv[i + 3], nullptr, 10);
i += 4;
CHECK_OVER_PARAMETERS
break;
}
if (strcmp(argv[i], "-qrwarevokeasset") == 0)
{
CHECK_NUMBER_OF_PARAMETERS(3)
g_cmd = QRWA_REVOKE_ASSET_MGMT;
g_qrwa_issuer = argv[i + 1];
g_qrwa_asset_name = argv[i + 2];
g_qrwa_num_shares = strtoll(argv[i + 3], nullptr, 10);
i += 4;
CHECK_OVER_PARAMETERS
break;
}

/***********************
***** QX COMMANDS *****
***********************/
Expand Down
20 changes: 20 additions & 0 deletions global.h
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,26 @@ int64_t g_qbond_burnAmount = 0;
char* g_qbond_owner = nullptr;
bool g_qbond_updateCFAOperation = false;

// qrwa
uint8_t g_qrwa_pool = 0; // 0=pool_a 1=pool_b 2=pool_c
int g_qrwa_epoch = -1; // -1 = all epochs, >=0 = filter by epoch
char* g_qrwa_identity = nullptr; // address filter for -qrwapayout <address>
uint64_t g_qrwa_poll_id = 0; // governance poll ID
uint64_t g_qrwa_amount = 0; // amount for donate/deposit
char* g_qrwa_issuer = nullptr; // asset issuer for deposit/revoke
char* g_qrwa_asset_name = nullptr; // asset name for deposit/revoke
int64_t g_qrwa_num_shares = 0; // for revoke management rights
char* g_qrwa_new_address = nullptr; // for SetPoolARevenueAddress
// Gov params for VoteGovParams
char* g_qrwa_gov_admin = nullptr;
char* g_qrwa_gov_electricity = nullptr;
char* g_qrwa_gov_maintenance = nullptr;
char* g_qrwa_gov_reinvestment = nullptr;
char* g_qrwa_gov_qminedev = nullptr;
uint64_t g_qrwa_gov_electricity_pct = 0;
uint64_t g_qrwa_gov_maintenance_pct = 0;
uint64_t g_qrwa_gov_reinvestment_pct = 0;

// escrow
char* g_escrowAcceptorId = nullptr;
char* g_escrow_offeredAssetsCommaSeparated = nullptr;
Expand Down
90 changes: 90 additions & 0 deletions main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
#include "test_utils.h"
#include "nostromo.h"
#include "qbond.h"
#include "qrwa.h"
#include "escrow.h"

int run(int argc, char* argv[])
Expand Down Expand Up @@ -328,6 +329,95 @@ int run(int argc, char* argv[])
sanityCheckSeed(g_seed);
quotteryCancelBet(g_nodeIp, g_nodePort, g_seed, g_quottery_betId, g_offsetScheduledTick);
break;
case QRWA_PAYOUT_POOL_A:
sanityCheckNode(g_nodeIp, g_nodePort);
qrwaPayout(g_nodeIp, g_nodePort, QRWA_POOL_A, g_qrwa_epoch);
break;
case QRWA_PAYOUT_POOL_B:
sanityCheckNode(g_nodeIp, g_nodePort);
qrwaPayout(g_nodeIp, g_nodePort, QRWA_POOL_B, g_qrwa_epoch);
break;
case QRWA_PAYOUT_POOL_C:
sanityCheckNode(g_nodeIp, g_nodePort);
qrwaPayout(g_nodeIp, g_nodePort, QRWA_POOL_C, g_qrwa_epoch);
break;
case QRWA_PAYOUT_POOL_D:
sanityCheckNode(g_nodeIp, g_nodePort);
qrwaPayout(g_nodeIp, g_nodePort, QRWA_POOL_D, g_qrwa_epoch);
break;
case QRWA_PAYOUT_ADDRESS:
sanityCheckNode(g_nodeIp, g_nodePort);
qrwaPayoutAddress(g_nodeIp, g_nodePort, g_qrwa_identity, g_qrwa_epoch);
break;
case QRWA_STATUS:
sanityCheckNode(g_nodeIp, g_nodePort);
qrwaStatus(g_nodeIp, g_nodePort);
break;
case QRWA_ASSETS:
sanityCheckNode(g_nodeIp, g_nodePort);
qrwaAssets(g_nodeIp, g_nodePort);
break;
case QRWA_GOV_PARAMS:
sanityCheckNode(g_nodeIp, g_nodePort);
qrwaGovParams(g_nodeIp, g_nodePort);
break;
case QRWA_GOV_POLL:
sanityCheckNode(g_nodeIp, g_nodePort);
qrwaGovPoll(g_nodeIp, g_nodePort, g_qrwa_poll_id);
break;
case QRWA_GOV_POLL_IDS:
sanityCheckNode(g_nodeIp, g_nodePort);
qrwaGovPollIds(g_nodeIp, g_nodePort);
break;
case QRWA_DIVIDENDS:
sanityCheckNode(g_nodeIp, g_nodePort);
qrwaDividends(g_nodeIp, g_nodePort);
break;
case QRWA_SC_DIVIDENDS:
sanityCheckNode(g_nodeIp, g_nodePort);
qrwaScDividends(g_nodeIp, g_nodePort);
break;
case QRWA_DONATE_TREASURY:
sanityCheckNode(g_nodeIp, g_nodePort);
sanityCheckSeed(g_seed);
qrwaDonateToTreasury(g_nodeIp, g_nodePort, g_seed, g_qrwa_amount, g_offsetScheduledTick);
break;
case QRWA_VOTE_GOV_PARAMS:
{
sanityCheckNode(g_nodeIp, g_nodePort);
sanityCheckSeed(g_seed);
QRWAGovParams proposal = {};
getPublicKeyFromIdentity(g_qrwa_gov_admin, proposal.mAdminAddress);
getPublicKeyFromIdentity(g_qrwa_gov_electricity, proposal.electricityAddress);
getPublicKeyFromIdentity(g_qrwa_gov_maintenance, proposal.maintenanceAddress);
getPublicKeyFromIdentity(g_qrwa_gov_reinvestment, proposal.reinvestmentAddress);
getPublicKeyFromIdentity(g_qrwa_gov_qminedev, proposal.qmineDevAddress);
proposal.electricityPercent = g_qrwa_gov_electricity_pct;
proposal.maintenancePercent = g_qrwa_gov_maintenance_pct;
proposal.reinvestmentPercent = g_qrwa_gov_reinvestment_pct;
qrwaVoteGovParams(g_nodeIp, g_nodePort, g_seed, proposal, g_offsetScheduledTick);
break;
}
case QRWA_SET_POOL_A_ADDR:
sanityCheckNode(g_nodeIp, g_nodePort);
sanityCheckSeed(g_seed);
qrwaSetPoolARevenueAddress(g_nodeIp, g_nodePort, g_seed, g_qrwa_new_address, g_offsetScheduledTick);
break;
case QRWA_SET_POOL_D_ADDR:
sanityCheckNode(g_nodeIp, g_nodePort);
sanityCheckSeed(g_seed);
qrwaSetPoolDRevenueAddress(g_nodeIp, g_nodePort, g_seed, g_qrwa_new_address, g_offsetScheduledTick);
break;
case QRWA_DEPOSIT_ASSET:
sanityCheckNode(g_nodeIp, g_nodePort);
sanityCheckSeed(g_seed);
qrwaDepositGeneralAsset(g_nodeIp, g_nodePort, g_seed, g_qrwa_issuer, g_qrwa_asset_name, g_qrwa_amount, g_offsetScheduledTick);
break;
case QRWA_REVOKE_ASSET_MGMT:
sanityCheckNode(g_nodeIp, g_nodePort);
sanityCheckSeed(g_seed);
qrwaRevokeAssetMgmt(g_nodeIp, g_nodePort, g_seed, g_qrwa_issuer, g_qrwa_asset_name, g_qrwa_num_shares, g_offsetScheduledTick);
break;
case TOOGLE_MAIN_AUX:
sanityCheckNode(g_nodeIp, g_nodePort);
sanityCheckSeed(g_seed);
Expand Down
4 changes: 2 additions & 2 deletions qpi_adapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ std::string toString(const QPI::DateAndTime& dt)
{
char buffer[100];
if (dt.getMicrosecDuringMillisec())
sprintf(buffer, "%04d-%02d-%02d_%02d:%02d:%02d.%03d'%03d", dt.getYear(), dt.getMonth(), dt.getDay(), dt.getHour(), dt.getMinute(), dt.getSecond(), dt.getMillisec(), dt.getMicrosecDuringMillisec());
snprintf(buffer, sizeof(buffer), "%04d-%02d-%02d_%02d:%02d:%02d.%03d'%03d", dt.getYear(), dt.getMonth(), dt.getDay(), dt.getHour(), dt.getMinute(), dt.getSecond(), dt.getMillisec(), dt.getMicrosecDuringMillisec());
else
sprintf(buffer, "%04d-%02d-%02d_%02d:%02d:%02d.%03d", dt.getYear(), dt.getMonth(), dt.getDay(), dt.getHour(), dt.getMinute(), dt.getSecond(), dt.getMillisec());
snprintf(buffer, sizeof(buffer), "%04d-%02d-%02d_%02d:%02d:%02d.%03d", dt.getYear(), dt.getMonth(), dt.getDay(), dt.getHour(), dt.getMinute(), dt.getSecond(), dt.getMillisec());
std::string str(buffer);
if (!dt.isValid())
str += " (invalid date)";
Expand Down
Loading
Loading