Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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