diff --git a/src/Options.cpp b/src/Options.cpp index ac619c79..03a63342 100644 --- a/src/Options.cpp +++ b/src/Options.cpp @@ -113,7 +113,7 @@ static struct option const options[] = { "donate-level", 1, nullptr, 1003 }, { "dry-run", 0, nullptr, 5000 }, { "help", 0, nullptr, 'h' }, - { "keepalive", 0, nullptr , 'k' }, + { "keepalive", 0, nullptr, 'k' }, { "log-file", 1, nullptr, 'l' }, { "max-cpu-usage", 1, nullptr, 1004 }, { "nicehash", 0, nullptr, 1006 }, @@ -160,13 +160,15 @@ static struct option const config_options[] = static struct option const donate_options[] = { - { "donate-url", required_argument, nullptr, 1391 }, - { "donate-user", required_argument, nullptr, 1392 }, - { "donate-pass", required_argument, nullptr, 1393 }, - { "donate-userpass", required_argument, nullptr, 1394 }, - { "donate-keepalive", 0, nullptr, 1395 }, - { "donate-nicehash", 0, nullptr, 1396 }, - { "donate-minutes", optional_argument, nullptr, 1397 }, + { "donate-url", required_argument, nullptr, 1391 }, + { "donate-url-little", required_argument, nullptr, 1392 }, + { "donate-user", required_argument, nullptr, 1393 }, + { "donate-pass", required_argument, nullptr, 1394 }, + { "donate-userpass", required_argument, nullptr, 1395 }, + { "donate-keepalive", no_argument, nullptr, 1396 }, + { "donate-nicehash", no_argument, nullptr, 1397 }, + { "donate-minutes", no_argument, nullptr, 1398 }, + { "minutes-in-cicle", no_argument, nullptr, 1399 }, { 0, 0, 0, 0 } }; @@ -176,7 +178,7 @@ static struct option const pool_options[] = { "pass", 1, nullptr, 'p' }, { "user", 1, nullptr, 'u' }, { "userpass", 1, nullptr, 'O' }, - { "keepalive", 0, nullptr , 'k' }, + { "keepalive", 0, nullptr, 'k' }, { "nicehash", 0, nullptr, 1006 }, { 0, 0, 0, 0 } }; @@ -236,7 +238,6 @@ Options::Options(int argc, char** argv) : m_algo(0), m_algoVariant(0), m_apiPort(0), - m_donateLevel(kDonateLevel), m_maxCpuUsage(75), m_printTime(60), m_priority(-1), @@ -246,11 +247,13 @@ Options::Options(int argc, char** argv) : m_affinity(-1L) { m_donateOpt.m_url = kDonateUrl; + m_donateOpt.m_url_little = kDonateUrlLittle; m_donateOpt.m_user = kDonateUser; m_donateOpt.m_pass = kDonatePass; m_donateOpt.m_keepAlive = kDonateKeepAlive; m_donateOpt.m_niceHash = kDonateNiceHash; - m_donateOpt.m_minutesPh = kDonateLevel; + m_donateOpt.m_donateMinutes = kDonateMinutes; + m_donateOpt.m_minutesInCicle = kMinutesInCicle; m_pools.push_back(Url()); @@ -435,7 +438,7 @@ bool Options::parseArg(int key, const std::string & arg) case 1003: /* --donate-level */ if(arg == "") { - m_donateOpt.m_minutesPh = 0; + m_donateOpt.m_donateMinutes = 0; } else { @@ -446,22 +449,35 @@ bool Options::parseArg(int key, const std::string & arg) case 1391: //donate-url m_donateOpt.m_url = arg; break; - case 1392: //donate-user + case 1392: //donate-url-little + m_donateOpt.m_url_little = arg; + break; + case 1393: //donate-user m_donateOpt.m_user = arg; break; - case 1393: //donate-pass + case 1394: //donate-pass m_donateOpt.m_pass = arg; break; - case 1394: //donate-userpass - m_donateOpt.m_url = arg; - break; - case 1395: //donate-nicehash + case 1395: //donate-userpass + { + const size_t p = arg.find_first_of(':'); + if(p != std::string::npos) + { + m_donateOpt.m_user = arg.substr(0, p); + m_donateOpt.m_pass = arg.substr(p + 1); + } + } + break; + case 1396: //donate-nicehash parseBoolean(key, arg == "true"); break; - case 1396: //donate-keepalive + case 1397: //donate-keepalive parseBoolean(key, arg == "true"); break; - case 1397: //donate-minutes + case 1398: //donate-minutes + parseArg(key, strtol(arg.c_str(), nullptr, 10)); + break; + case 1399: //minutes-in-cicle parseArg(key, strtol(arg.c_str(), nullptr, 10)); break; @@ -553,7 +569,8 @@ bool Options::parseArg(int key, uint64_t arg) case 1003: /* --donate-level */ if(arg >= 0 || arg <= 60) { - m_donateOpt.m_minutesPh = (unsigned short) arg; + m_donateOpt.m_donateMinutes = (unsigned short) arg; + m_donateOpt.m_minutesInCicle = (unsigned short) kMinutesInCicle; } break; @@ -565,8 +582,12 @@ bool Options::parseArg(int key, uint64_t arg) case 1396: //donate-nicehash break; - case 1397: //donate-minutes - m_donateOpt.m_minutesPh = (unsigned short)arg; + case 1398: //donate-minutes + m_donateOpt.m_donateMinutes = (unsigned short)arg; + break; + + case 1399: //minutes-in-cicle + m_donateOpt.m_minutesInCicle = (unsigned short)arg; break; case 1004: /* --max-cpu-usage */ @@ -656,11 +677,11 @@ bool Options::parseBoolean(int key, bool enable) m_colors = enable; break; - case 1395: //donate-keepalive + case 1396: //donate-keepalive m_donateOpt.m_keepAlive = enable; break; - case 1396: //donate-nicehash + case 1397: //donate-nicehash m_donateOpt.m_niceHash = enable; break; @@ -669,10 +690,12 @@ bool Options::parseBoolean(int key, bool enable) break; case 1391: //donate-url - case 1392: //donate-user - case 1393: //donate-pass - case 1394: //donate-userpass - case 1397: //donate-minutes + case 1392: //donate-url-little + case 1393: //donate-user + case 1394: //donate-pass + case 1395: //donate-userpass + case 1398: //donate-minutes + case 1399: //minutes-in-cicle default: break; } diff --git a/src/Options.h b/src/Options.h index d2f0e671..86676861 100644 --- a/src/Options.h +++ b/src/Options.h @@ -59,11 +59,13 @@ public: { public: std::string m_url; + std::string m_url_little; std::string m_user; std::string m_pass; bool m_keepAlive; bool m_niceHash; - unsigned short m_minutesPh; + unsigned short m_donateMinutes; + unsigned short m_minutesInCicle; }; static inline Options* i() @@ -128,9 +130,13 @@ public: { return m_apiPort; } - inline unsigned short donateLevel() const + inline unsigned short donateMinutes() const { - return m_donateOpt.m_minutesPh; + return m_donateOpt.m_donateMinutes; + } + inline unsigned short minutesInCicle() const + { + return m_donateOpt.m_minutesInCicle; } inline const Donate & donate() const { @@ -215,7 +221,6 @@ private: int m_algo; int m_algoVariant; int m_apiPort; - int m_donateLevel; int m_maxCpuUsage; int m_printTime; int m_priority; diff --git a/src/Summary.cpp b/src/Summary.cpp index a549e3c0..200f069f 100644 --- a/src/Summary.cpp +++ b/src/Summary.cpp @@ -113,7 +113,11 @@ static void print_threads() } PRINT_MSG(" * THREADS: " << Options::i()->threads() << ", " << Options::i()->algoName() << ", av=" << - Options::i()->algoVariant() << ", donate=" << Options::i()->donateLevel() << " " << buf); + Options::i()->algoVariant() << ", donate-minutes=" << Options::i()->donateMinutes() << + ((Options::i()->donateMinutes() > 0) ? ("/" + + Log::ToString(Options::i()->minutesInCicle()) + " (" + Log::ToString((100 * + Options::i()->donateMinutes()) / + Options::i()->minutesInCicle()) + "%)") : "") << buf); } diff --git a/src/api/ApiState.cpp b/src/api/ApiState.cpp index 1e021e4b..e36e2b43 100644 --- a/src/api/ApiState.cpp +++ b/src/api/ApiState.cpp @@ -236,13 +236,15 @@ void ApiState::getMiner(rapidjson::Document & doc) const cpu.AddMember("x64", Cpu::isX64(), allocator); cpu.AddMember("sockets", Cpu::sockets(), allocator); - doc.AddMember("version", APP_VERSION, allocator); - doc.AddMember("kind", APP_KIND, allocator); - doc.AddMember("ua", rapidjson::StringRef(Platform::userAgent().c_str()), allocator); - doc.AddMember("cpu", cpu, allocator); - doc.AddMember("algo", rapidjson::StringRef(Options::i()->algoName()), allocator); - doc.AddMember("hugepages", Mem::isHugepagesEnabled(), allocator); - doc.AddMember("donate_level", Options::i()->donateLevel(), allocator); + doc.AddMember("version", APP_VERSION, allocator); + doc.AddMember("kind", APP_KIND, allocator); + doc.AddMember("ua", rapidjson::StringRef(Platform::userAgent().c_str()), allocator); + doc.AddMember("cpu", cpu, allocator); + doc.AddMember("algo", rapidjson::StringRef(Options::i()->algoName()), allocator); + doc.AddMember("hugepages", Mem::isHugepagesEnabled(), allocator); + + doc.AddMember("donate_minutes_per_cicle", Options::i()->donateMinutes(), allocator); + doc.AddMember("minutes_per_cicle", Options::i()->minutesInCicle(), allocator); } diff --git a/src/config.json b/src/config.json index 05f54efe..57e162fb 100644 --- a/src/config.json +++ b/src/config.json @@ -11,12 +11,13 @@ /* Custom donate settings: "donate-level": [ { -// "donate-url": "proxy-fee.xmrig.com:3333", // custom donate pool -// "donate-user": "", // custom donate user -// "donate-pass": "", // custom donate pass -// "donate-keepalive": false, // custom donate keepalive -// "donate-nicehash": true, // custom donate nicehash - "donate-minutes": 2 // custom donate minutes (each 1 hour) +// "donate-url": "fee.xmrig.com:443", // custom donate pool for cryptonight +// "donate-url-little": "fee.xmrig.com:3333", // custom donate pool for cryptonight-little +// "donate-user": "", // custom donate user +// "donate-pass": "", // custom donate pass +// "donate-keepalive": false, // custom donate keepalive +// "donate-nicehash": true, // custom donate nicehash + "donate-minutes": 4 // custom donate minutes (each 1 hour) } ], */ diff --git a/src/donate.h b/src/donate.h index d42b0d97..9af6b8e6 100644 --- a/src/donate.h +++ b/src/donate.h @@ -36,17 +36,19 @@ * * How it works: * Other connections switch to donation pool until the first 60 minutes, kDonateLevel minutes each hour - * with overime compensation. In proxy no way to use precise donation time! + * with overime compensation; but the period can be customizable. In proxy no way to use precise donation time! * You can check actual donation via API. */ enum { - kDonateLevel = 1, + kDonateMinutes = 3, + kMinutesInCicle = 60, kDonateKeepAlive = false, kDonateNiceHash = true, }; -static const char* kDonateUrl = "pool.minexmr.com:4444"; +static const char* kDonateUrl = "fee.xmrig.com:443"; +static const char* kDonateUrlLittle = "fee.xmrig.com:3333"; static const char* kDonateUser = ""; static const char* kDonatePass = "x"; diff --git a/src/log/Log.h b/src/log/Log.h index adf30021..c0af6cfa 100644 --- a/src/log/Log.h +++ b/src/log/Log.h @@ -93,6 +93,13 @@ public: return stream.str(); } + template + static inline std::string ToString(const T & i) + { + std::stringstream stream; + stream << i; + return stream.str(); + } private: inline Log() {} ~Log(); diff --git a/src/net/Network.cpp b/src/net/Network.cpp index fe823333..ab33e4c9 100644 --- a/src/net/Network.cpp +++ b/src/net/Network.cpp @@ -63,7 +63,7 @@ Network::Network(const Options* options) : m_strategy = new SinglePoolStrategy(pools.front(), Platform::userAgent(), this); } - if(m_options->donateLevel() > 0) + if(m_options->donateMinutes() > 0) { m_donate = new DonateStrategy(Platform::userAgent(), this); } diff --git a/src/net/strategies/DonateStrategy.cpp b/src/net/strategies/DonateStrategy.cpp index da6471c4..c92752fd 100644 --- a/src/net/strategies/DonateStrategy.cpp +++ b/src/net/strategies/DonateStrategy.cpp @@ -41,8 +41,7 @@ extern "C" enum { C_ONE_TICK = 1, - C_ONE_MINUTE_IN_TICKS = 60, - C_ONE_HOUR_IN_TICKS = 60 * C_ONE_MINUTE_IN_TICKS, + C_TICKS_PER_MINUTE = 60, }; DonateStrategy::DonateStrategy(const std::string & agent, IStrategyListener* listener) : @@ -51,9 +50,12 @@ DonateStrategy::DonateStrategy(const std::string & agent, IStrategyListener* lis m_listener(listener), m_donateTicks(0), m_target(0), - m_ticks(0) + m_ticks(0), + C_ONE_CICLE_IN_TICKS(Options::i()->donate().m_minutesInCicle * C_TICKS_PER_MINUTE) { - Url url(Options::i()->donate().m_url); + Url url(Options::i()->donate().m_url_little.empty() || Options::i()->algo() == Options::ALGO_CRYPTONIGHT ? + Options::i()->donate().m_url : + Options::i()->donate().m_url_little); const Url & mainUrl = Options::i()->pools().front(); if(true == mainUrl.isProxyed() && false == url.isProxyed()) @@ -84,19 +86,19 @@ DonateStrategy::DonateStrategy(const std::string & agent, IStrategyListener* lis m_client->setUrl(url); m_client->setRetryPause(Options::i()->retryPause() * 1000); - m_target = C_ONE_HOUR_IN_TICKS; + m_target = C_ONE_CICLE_IN_TICKS; } bool DonateStrategy::reschedule() { - const uint64_t level = Options::i()->donateLevel() * C_ONE_MINUTE_IN_TICKS; - if(m_donateTicks < level) + const uint64_t donateTicks = Options::i()->donateMinutes() * C_TICKS_PER_MINUTE; + if(m_donateTicks < donateTicks) { return false; } - m_target = std::max(int(C_ONE_HOUR_IN_TICKS - m_donateTicks), int(C_ONE_TICK)) + m_ticks; + m_target = std::max(int(C_ONE_CICLE_IN_TICKS - m_donateTicks), int(C_ONE_TICK)) + m_ticks; m_active = false; stop(); diff --git a/src/net/strategies/DonateStrategy.h b/src/net/strategies/DonateStrategy.h index ba5f47b9..0e199908 100644 --- a/src/net/strategies/DonateStrategy.h +++ b/src/net/strategies/DonateStrategy.h @@ -65,6 +65,7 @@ private: uint64_t m_donateTicks; uint64_t m_target; uint64_t m_ticks; + const unsigned short C_ONE_CICLE_IN_TICKS; }; #endif /* __SINGLEPOOLSTRATEGY_H__ */