From bcfde3f173c79c19aac91e1983a6214c94fb4486 Mon Sep 17 00:00:00 2001 From: Viktor Kynchev Date: Mon, 14 Aug 2017 13:39:57 +0300 Subject: [PATCH 1/7] Add txFee to pool config to substract from block reward... --- src/CoiniumServ/Blocks/BlockProcessor.cs | 2 +- src/CoiniumServ/Payments/Config/IWalletConfig.cs | 5 +++++ src/CoiniumServ/Payments/Config/WalletConfig.cs | 2 ++ src/CoiniumServ/Payments/PaymentProcessor.cs | 6 ++++-- 4 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/CoiniumServ/Blocks/BlockProcessor.cs b/src/CoiniumServ/Blocks/BlockProcessor.cs index 69e6bf8a8..113c72099 100644 --- a/src/CoiniumServ/Blocks/BlockProcessor.cs +++ b/src/CoiniumServ/Blocks/BlockProcessor.cs @@ -148,7 +148,7 @@ private void QueryBlock(IPersistedBlock block) } // set the reward of the block to miners. - block.Reward = (decimal) poolOutput.Amount; + block.Reward = (decimal)poolOutput.Amount - (decimal)_poolConfig.Wallet.TxFee; // find the block status switch (poolOutput.Category) diff --git a/src/CoiniumServ/Payments/Config/IWalletConfig.cs b/src/CoiniumServ/Payments/Config/IWalletConfig.cs index 7e0e8f610..1faf1aa9d 100644 --- a/src/CoiniumServ/Payments/Config/IWalletConfig.cs +++ b/src/CoiniumServ/Payments/Config/IWalletConfig.cs @@ -37,5 +37,10 @@ public interface IWalletConfig:IConfig /// Address that generated coins will arrive. /// string Adress { get; } + + /// + /// Transaction fee to substract from block value + /// + double TxFee { get; } } } diff --git a/src/CoiniumServ/Payments/Config/WalletConfig.cs b/src/CoiniumServ/Payments/Config/WalletConfig.cs index 10c56a30f..1ace0661a 100644 --- a/src/CoiniumServ/Payments/Config/WalletConfig.cs +++ b/src/CoiniumServ/Payments/Config/WalletConfig.cs @@ -35,6 +35,7 @@ namespace CoiniumServ.Payments.Config public class WalletConfig:IWalletConfig { public string Adress { get; private set; } + public double TxFee { get; private set; } public bool Valid { get; private set; } public WalletConfig(dynamic config) @@ -42,6 +43,7 @@ public WalletConfig(dynamic config) try { Adress = config.address; + TxFee = config.txfee; Valid = true; } diff --git a/src/CoiniumServ/Payments/PaymentProcessor.cs b/src/CoiniumServ/Payments/PaymentProcessor.cs index 1a7f49dc1..78afa3c30 100644 --- a/src/CoiniumServ/Payments/PaymentProcessor.cs +++ b/src/CoiniumServ/Payments/PaymentProcessor.cs @@ -141,13 +141,15 @@ private IList ExecutePayments(IEnumerable x.Value.Sum(y => y.Payment.Amount) >= (decimal)_poolConfig.Payments.Minimum) .ToDictionary(x => x.Key, x => x.Value); - + if (filtered.Count <= 0) // make sure we have payments to execute even after our filter. return executed; // coin daemon expects us to handle outputs in format, create the data structure so. var outputs = filtered.ToDictionary(x => x.Key, x => x.Value.Sum(y => y.Payment.Amount)); - + + _logger.Debug("Payment Outputs: {0}", outputs); + // send the payments all-together. var txHash = _daemonClient.SendMany(_poolAccount, outputs); From f0f6f87f58b386c286d28503d79c76106d3ca28b Mon Sep 17 00:00:00 2001 From: Viktor Kynchev Date: Mon, 14 Aug 2017 13:47:23 +0300 Subject: [PATCH 2/7] Create another timer for blockProcessor... --- src/CoiniumServ/Jobs/Manager/JobManager.cs | 2 +- .../Payments/Config/IPaymentConfig.cs | 5 ++++ .../Payments/Config/PaymentConfig.cs | 2 ++ src/CoiniumServ/Payments/PaymentManager.cs | 26 +++++++++++++++++-- 4 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/CoiniumServ/Jobs/Manager/JobManager.cs b/src/CoiniumServ/Jobs/Manager/JobManager.cs index 862ef4bec..f82f5de26 100644 --- a/src/CoiniumServ/Jobs/Manager/JobManager.cs +++ b/src/CoiniumServ/Jobs/Manager/JobManager.cs @@ -94,7 +94,7 @@ public void Initialize(UInt32 instanceId) _minerManager.MinerAuthenticated += OnMinerAuthenticated; // create the timers as disabled. - _reBroadcastTimer = new Timer(IdleJobTimer, null,Timeout.Infinite, Timeout.Infinite); + _reBroadcastTimer = new Timer(IdleJobTimer, null, Timeout.Infinite, Timeout.Infinite); _blockPollerTimer = new Timer(BlockPoller, null, Timeout.Infinite, Timeout.Infinite); CreateAndBroadcastNewJob(true); // broadcast a new job initially - which will also setup the timers. diff --git a/src/CoiniumServ/Payments/Config/IPaymentConfig.cs b/src/CoiniumServ/Payments/Config/IPaymentConfig.cs index dc5869310..49eacd349 100644 --- a/src/CoiniumServ/Payments/Config/IPaymentConfig.cs +++ b/src/CoiniumServ/Payments/Config/IPaymentConfig.cs @@ -40,6 +40,11 @@ public interface IPaymentConfig:IConfig /// interval in seconds that payment-processor will be running. /// Int32 Interval { get; } + + /// + /// interval in seconds that payment-processor's block checks will be running. + /// + Int32 CheckInterval { get; } /// /// minimum amount of coins before a miner is eligable for getting a payment. diff --git a/src/CoiniumServ/Payments/Config/PaymentConfig.cs b/src/CoiniumServ/Payments/Config/PaymentConfig.cs index 0c2969647..37505c496 100644 --- a/src/CoiniumServ/Payments/Config/PaymentConfig.cs +++ b/src/CoiniumServ/Payments/Config/PaymentConfig.cs @@ -37,6 +37,7 @@ public class PaymentConfig:IPaymentConfig public bool Valid { get; private set; } public bool Enabled { get; private set; } public int Interval { get; private set; } + public int CheckInterval { get; private set; } public double Minimum { get; private set; } public PaymentConfig(dynamic config) @@ -46,6 +47,7 @@ public PaymentConfig(dynamic config) // load the config data. Enabled = config.enabled; Interval = config.interval == 0 ? 60 : config.interval; + CheckInterval = config.checkInterval == 0 ? 60 : config.checkInterval; Minimum = config.minimum == 0 ? 0.01 : config.minimum; Valid = true; diff --git a/src/CoiniumServ/Payments/PaymentManager.cs b/src/CoiniumServ/Payments/PaymentManager.cs index 75b3e775f..2603afc75 100644 --- a/src/CoiniumServ/Payments/PaymentManager.cs +++ b/src/CoiniumServ/Payments/PaymentManager.cs @@ -38,10 +38,14 @@ namespace CoiniumServ.Payments public class PaymentManager:IPaymentManager { private readonly Timer _timer; + + private readonly Timer _timerCheck; private readonly IPoolConfig _poolConfig; private readonly IList _labors; + + private readonly IList _laborsCheck; private readonly ILogger _logger; @@ -50,10 +54,13 @@ public PaymentManager(IPoolConfig poolConfig, IBlockProcessor blockProcessor, I _poolConfig = poolConfig; _labors = new List { - blockProcessor, - blockAccounter, + blockAccounter, paymentProcessor }; + _laborsCheck = new List + { + blockProcessor + }; _logger = Log.ForContext().ForContext("Component", poolConfig.Coin.Name); @@ -62,6 +69,7 @@ public PaymentManager(IPoolConfig poolConfig, IBlockProcessor blockProcessor, I // setup the timer to run payment laberos _timer = new Timer(Run, null, _poolConfig.Payments.Interval * 1000, Timeout.Infinite); + _timerCheck = new Timer(RunCheck, null, _poolConfig.Payments.CheckInterval * 1000, Timeout.Infinite); } private void Run(object state) @@ -77,5 +85,19 @@ private void Run(object state) _timer.Change(_poolConfig.Payments.Interval * 1000, Timeout.Infinite); // reset the timer. } + + private void RunCheck(object state) + { + // loop through each payment labors and execute them. + foreach (var labor in _laborsCheck) + { + if (!labor.Active) // make sure labor is active + continue; + + labor.Run(); // run the labor. + } + + _timerCheck.Change(_poolConfig.Payments.CheckInterval * 1000, Timeout.Infinite); // reset the timer. + } } } From 158f9c2fbad204c2457afae043c11410f0f2b458 Mon Sep 17 00:00:00 2001 From: Viktor Kynchev Date: Mon, 14 Aug 2017 13:51:43 +0300 Subject: [PATCH 3/7] Updated configs for the latest 2 commits... --- src/CoiniumServ/config/pools/default-example.json | 1 + src/CoiniumServ/config/pools/pool.json | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/CoiniumServ/config/pools/default-example.json b/src/CoiniumServ/config/pools/default-example.json index 7b4147845..431af43c1 100644 --- a/src/CoiniumServ/config/pools/default-example.json +++ b/src/CoiniumServ/config/pools/default-example.json @@ -10,6 +10,7 @@ "payments": { "enabled": true, "interval": 60, + "checkInterval": 60, "minimum": 0.01 }, "miner": { diff --git a/src/CoiniumServ/config/pools/pool.json b/src/CoiniumServ/config/pools/pool.json index b8b531325..f8a91acd1 100644 --- a/src/CoiniumServ/config/pools/pool.json +++ b/src/CoiniumServ/config/pools/pool.json @@ -7,11 +7,13 @@ "password": "password" }, "wallet": { - "address": "n3Mvrshbf4fMoHzWZkDVbhhx4BLZCcU9oY" + "address": "n3Mvrshbf4fMoHzWZkDVbhhx4BLZCcU9oY", + "txfee": 0.001 }, "rewards": [ { - "myxWybbhUkGzGF7yaf2QVNx3hh3HWTya5t": 1 + "n3Mvrshbf4fMoHzWZkDVbhhx4BLZCcU9oY": 0.1, + "myxWybbhUkGzGF7yaf2QVNx3hh3HWTya5t": 0.9 } ], "stratum": { From b785368a13d89848f5c917feaa51ea7748501b23 Mon Sep 17 00:00:00 2001 From: Viktor Kynchev Date: Mon, 14 Aug 2017 13:52:32 +0300 Subject: [PATCH 4/7] Minor redis code styling... --- src/CoiniumServ/Persistance/Providers/Redis/RedisClient.cs | 6 +++--- .../Persistance/Providers/Redis/RedisProvider.cs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/CoiniumServ/Persistance/Providers/Redis/RedisClient.cs b/src/CoiniumServ/Persistance/Providers/Redis/RedisClient.cs index 6c305f3e5..1b4e5285b 100644 --- a/src/CoiniumServ/Persistance/Providers/Redis/RedisClient.cs +++ b/src/CoiniumServ/Persistance/Providers/Redis/RedisClient.cs @@ -31,11 +31,11 @@ public class RedisClient /// Redis server port public RedisClient(string host, int port, string password = "", string extraopts = "") { - // create the connection - CM = ConnectionMultiplexer.Connect(host + // create the connection + CM = ConnectionMultiplexer.Connect(host + ((port == 0) ? "" : ":" + port) + (string.IsNullOrEmpty(password) ? "" : (",password="+password)) - + (string.IsNullOrEmpty(extraopts) ? "" : (","+extraopts)) ); + + (string.IsNullOrEmpty(extraopts) ? "" : (","+extraopts))); } diff --git a/src/CoiniumServ/Persistance/Providers/Redis/RedisProvider.cs b/src/CoiniumServ/Persistance/Providers/Redis/RedisProvider.cs index 645c68b6c..e693b625e 100644 --- a/src/CoiniumServ/Persistance/Providers/Redis/RedisProvider.cs +++ b/src/CoiniumServ/Persistance/Providers/Redis/RedisProvider.cs @@ -61,7 +61,7 @@ private void Initialize() Client = new RedisClient(_config.Host, _config.Port, _config.Password, "version=2.6"); - // select the database + // select the database Client.Select(_config.DatabaseId); /* From 6a8c4a3524834885274aa76aa8c77433c436024f Mon Sep 17 00:00:00 2001 From: Viktor Kynchev Date: Wed, 16 Aug 2017 00:57:28 +0300 Subject: [PATCH 5/7] Fixed JsonRpc package to show "error":null, ... --- .../Algorithms/AlgorithmRegistry.cs | 2 +- .../lib/net40/AustinHarris.JsonRpc.dll | Bin 28160 -> 29696 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CoiniumServ/Algorithms/AlgorithmRegistry.cs b/src/CoiniumServ/Algorithms/AlgorithmRegistry.cs index 2fbb34bfa..5520cbd4d 100644 --- a/src/CoiniumServ/Algorithms/AlgorithmRegistry.cs +++ b/src/CoiniumServ/Algorithms/AlgorithmRegistry.cs @@ -56,7 +56,7 @@ public class AlgorithmRegistry : IRegistry public const string X15 = "x15"; public const string X17 = "x17"; - // todo: add hefty1, qubit support + // todo: add hefty1 support private readonly IApplicationContext _applicationContext; diff --git a/src/CoiniumServ/packages/AustinHarris.JsonRpc.1.1.70/lib/net40/AustinHarris.JsonRpc.dll b/src/CoiniumServ/packages/AustinHarris.JsonRpc.1.1.70/lib/net40/AustinHarris.JsonRpc.dll index 3b9a2f9cc968750d95eae91a72241d5727c9b5b6..e37d3c0daad0193ecb1283b995fc33980300da5c 100644 GIT binary patch literal 29696 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
(e621kEsx-I-%H~7WPWfB6Zk%87)?nZv|$~ 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 G0{;Qp_*WAE From 3c990ba032853c8977ffffbe14d0bd0ce69bed8f Mon Sep 17 00:00:00 2001 From: Viktor Kynchev Date: Wed, 16 Aug 2017 00:58:26 +0300 Subject: [PATCH 6/7] Added support for coins with symbols with up to 5 chars... --- .../Persistance/Layers/Hybrid/Migrations/M002Payments.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CoiniumServ/Persistance/Layers/Hybrid/Migrations/M002Payments.cs b/src/CoiniumServ/Persistance/Layers/Hybrid/Migrations/M002Payments.cs index 8c41823e3..310f86d64 100644 --- a/src/CoiniumServ/Persistance/Layers/Hybrid/Migrations/M002Payments.cs +++ b/src/CoiniumServ/Persistance/Layers/Hybrid/Migrations/M002Payments.cs @@ -82,7 +82,7 @@ public override void Up() .WithColumn("AccountId").AsInt32().ForeignKey("Account", "Id") .WithColumn("PaymentId").AsInt32().ForeignKey("Payment", "Id") .WithColumn("Amount").AsDecimal().NotNullable() - .WithColumn("Currency").AsString(4).NotNullable() + .WithColumn("Currency").AsString(5).NotNullable() .WithColumn("TxHash").AsString(64).NotNullable() .WithColumn("CreatedAt").AsDateTime().NotNullable(); } From 1466c67bcf7db425ef47e377936bcc9727b966a9 Mon Sep 17 00:00:00 2001 From: Viktor Kynchev Date: Wed, 16 Aug 2017 00:59:02 +0300 Subject: [PATCH 7/7] My stuff... --- src/CoiniumServ/Mining/MetaConfig.cs | 2 +- src/CoiniumServ/Utils/ConsoleWindow.cs | 28 ++++++++++++++------------ 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/src/CoiniumServ/Mining/MetaConfig.cs b/src/CoiniumServ/Mining/MetaConfig.cs index dcf86eb65..858ccbfd4 100644 --- a/src/CoiniumServ/Mining/MetaConfig.cs +++ b/src/CoiniumServ/Mining/MetaConfig.cs @@ -44,7 +44,7 @@ public MetaConfig(dynamic config) { // load the config data. MOTD = string.IsNullOrEmpty(config.motd) - ? "Welcome to CoiniumServ pool, enjoy your stay! - http://www.coinumserv.com" + ? "Enjoy your stay!" : config.motd; TxMessage = string.IsNullOrEmpty(config.txMessage) ? "http://www.coiniumserv.com/" : config.txMessage; diff --git a/src/CoiniumServ/Utils/ConsoleWindow.cs b/src/CoiniumServ/Utils/ConsoleWindow.cs index 1f2a1c12e..da478bb1b 100644 --- a/src/CoiniumServ/Utils/ConsoleWindow.cs +++ b/src/CoiniumServ/Utils/ConsoleWindow.cs @@ -42,12 +42,14 @@ class ConsoleWindow public static void PrintBanner() { Console.ForegroundColor = ConsoleColor.Yellow; + Console.WriteLine(@"-------------------------------------------------------------------"); Console.WriteLine(@" .__ .__ "); Console.WriteLine(@" ____ ____ |__| ____ |__|__ __ _____ ______ ______________ __"); Console.WriteLine(@"_/ ___\/ _ \| |/ \| | | \/ \ / ___// __ \_ __ \ \/ /"); Console.WriteLine(@"\ \__( <_> ) | | \ | | / Y Y \\___ \\ ___/| | \/\ / "); Console.WriteLine(@" \___ >____/|__|___| /__|____/|__|_| /____ >\___ >__| \_/ "); Console.WriteLine(@" \/ \/ \/ \/ \/ "); + Console.WriteLine(@"-------------------------------------------------------------------"); Console.WriteLine(); } @@ -56,19 +58,19 @@ public static void PrintBanner() ///
public static void PrintLicense() { - Console.ForegroundColor = ConsoleColor.Magenta; - Console.WriteLine("Copyright (C) 2013 - 2017, Coinium project - https://github.com/CoiniumServ/CoiniumServ"); - Console.WriteLine(); - Console.ForegroundColor = ConsoleColor.DarkYellow; - Console.WriteLine("CoiniumServ comes with ABSOLUTELY NO WARRANTY."); - Console.WriteLine(); - Console.ForegroundColor = ConsoleColor.Green; - Console.WriteLine("You can contribute the development of the project by donating;"); - Console.ForegroundColor = ConsoleColor.Yellow; - Console.WriteLine(" BTC : 18qqrtR4xHujLKf9oqiCsjmwmH5vGpch4D"); - Console.WriteLine(" LTC : LMXfRb3w8cMUBfqZb6RUkFTPaT6vbRozPa"); - Console.WriteLine(" DOGE: DM8FW8REMHj3P4xtcMWDn33ccjikCWJnQr"); - Console.WriteLine(" RDD : Rb9kcLs96VDHTmiXVjcWC2RBsfCJ73UQyr"); + //Console.ForegroundColor = ConsoleColor.Magenta; + //Console.WriteLine("Copyright (C) 2013 - 2017, Coinium project - https://github.com/CoiniumServ/CoiniumServ"); + //Console.WriteLine(); + //Console.ForegroundColor = ConsoleColor.DarkYellow; + //Console.WriteLine("CoiniumServ comes with ABSOLUTELY NO WARRANTY."); + //Console.WriteLine(); + //Console.ForegroundColor = ConsoleColor.Green; + //Console.WriteLine("You can contribute the development of the project by donating;"); + //Console.ForegroundColor = ConsoleColor.Yellow; + //Console.WriteLine(" BTC : 18qqrtR4xHujLKf9oqiCsjmwmH5vGpch4D"); + //Console.WriteLine(" LTC : LMXfRb3w8cMUBfqZb6RUkFTPaT6vbRozPa"); + //Console.WriteLine(" DOGE: DM8FW8REMHj3P4xtcMWDn33ccjikCWJnQr"); + //Console.WriteLine(" RDD : Rb9kcLs96VDHTmiXVjcWC2RBsfCJ73UQyr"); Console.WriteLine(); Console.ResetColor(); }