diff --git a/README.md b/README.md index 0a94830..9595242 100644 --- a/README.md +++ b/README.md @@ -109,6 +109,7 @@ If your pool uses NOMP let us know and we will list your website here. * http://hashfaster.com * http://miningpoolhub.com * http://teamdoge.com +* http://miningwith.us * http://kryptochaos.com * http://pool.uberpools.org diff --git a/libs/paymentProcessor.js b/libs/paymentProcessor.js index 3d3482a..77cf865 100644 --- a/libs/paymentProcessor.js +++ b/libs/paymentProcessor.js @@ -216,6 +216,8 @@ function SetupForPool(logger, poolOptions, setupFinished){ return ['gettransaction', [r.txHash]]; }); + batchRPCcommand.push(['getaccount', [poolOptions.address]]); + daemon.batchCmd(batchRPCcommand, function(error, txDetails){ if (error || !txDetails){ @@ -224,7 +226,15 @@ function SetupForPool(logger, poolOptions, setupFinished){ return; } + var addressAccount; + txDetails.forEach(function(tx, i){ + + if (i === txDetails.length - 1){ + addressAccount = tx.result; + return; + } + var round = rounds[i]; if (tx.error && tx.error.code === -5 || round.blockHash !== tx.result.blockhash){ @@ -273,7 +283,7 @@ function SetupForPool(logger, poolOptions, setupFinished){ rpc.gettransaction.amount tells us how much we get in whole coin units. Therefore, we simply divide the two to get the magnitude. I don't know math, there is probably a better term than 'magnitude'. Sue me or do a pull request to fix it. */ - var roundMagnitude = r.reward / r.amount; + var roundMagnitude = Math.round(r.reward / r.amount); if (!magnitude) { magnitude = roundMagnitude; @@ -303,7 +313,7 @@ function SetupForPool(logger, poolOptions, setupFinished){ callback('Check finished - no confirmed or orphaned blocks found'); } else{ - callback(null, rounds, magnitude); + callback(null, rounds, magnitude, addressAccount); } }); }, @@ -311,7 +321,7 @@ function SetupForPool(logger, poolOptions, setupFinished){ /* Does a batch redis call to get shares contributed to each round. Then calculates the reward amount owned to each miner for each round. */ - function(rounds, magnitude, callback){ + function(rounds, magnitude, addressAccount, callback){ var shareLookups = rounds.map(function(r){ @@ -370,13 +380,13 @@ function SetupForPool(logger, poolOptions, setupFinished){ }); - callback(null, rounds, magnitude, workerRewards, orphanMergeCommands); + callback(null, rounds, magnitude, workerRewards, orphanMergeCommands, addressAccount); }); }, /* Does a batch call to redis to get worker existing balances from coin_balances*/ - function(rounds, magnitude, workerRewards, orphanMergeCommands, callback){ + function(rounds, magnitude, workerRewards, orphanMergeCommands, addressAccount, callback){ var workers = Object.keys(workerRewards); @@ -394,7 +404,7 @@ function SetupForPool(logger, poolOptions, setupFinished){ } - callback(null, rounds, magnitude, workerRewards, orphanMergeCommands, workerBalances); + callback(null, rounds, magnitude, workerRewards, orphanMergeCommands, workerBalances, addressAccount); }); }, @@ -406,12 +416,11 @@ function SetupForPool(logger, poolOptions, setupFinished){ when deciding the sent balance, it the difference should be -1*amount they had in db, if not sending the balance, the differnce should be +(the amount they earned this round) */ - function(rounds, magnitude, workerRewards, orphanMergeCommands, workerBalances, callback){ + function(rounds, magnitude, workerRewards, orphanMergeCommands, workerBalances, addressAccount, callback){ //number of satoshis in a single coin unit - this can be different for coins so we calculate it :) - - daemon.cmd('getbalance', [''], function(results){ + daemon.cmd('getbalance', [addressAccount || ''], function(results){ var totalBalance = results[0].response * magnitude; var toBePaid = 0; @@ -474,9 +483,9 @@ function SetupForPool(logger, poolOptions, setupFinished){ /* TODO: Need to convert all these variables into whole coin units before displaying because humans aren't good at reading satoshi units. */ callback('Check finished - payments would wipe out minimum reserve, tried to pay out ' + - toBePaid + ' and collect ' + feeAmountToBeCollected + ' as fees' + - ' but only have ' + totalBalance + '. Left over balance would be ' + balanceLeftOver + - ', needs to be at least ' + minReserveSatoshis); + (toBePaid/magnitude) + ' and collect ' + (feeAmountToBeCollected/magnitude) + ' as fees' + + ' but only have ' + (totalBalance/magnitude) + '. Left over balance would be ' + (balanceLeftOver/magnitude) + + ', needs to be at least ' + (minReserveSatoshis/magnitude)); return; } @@ -522,23 +531,23 @@ function SetupForPool(logger, poolOptions, setupFinished){ finalRedisCommands.push(['bgsave']); - callback(null, magnitude, workerPayments, finalRedisCommands); + callback(null, magnitude, workerPayments, finalRedisCommands, addressAccount); }); }, - function(magnitude, workerPayments, finalRedisCommands, callback) { + function(magnitude, workerPayments, finalRedisCommands, addressAccount, callback) { /* Save final redis cleanout commands in case something goes wrong during payments */ redisClient.set(coin + '_finalRedisCommands', JSON.stringify(finalRedisCommands), function(error, reply) { if (error){ callback('Check finished - error with saving finalRedisCommands' + JSON.stringify(error)); return; } - callback(null, magnitude, workerPayments, finalRedisCommands); + callback(null, magnitude, workerPayments, finalRedisCommands, addressAccount); }); }, - function(magnitude, workerPayments, finalRedisCommands, callback){ + function(magnitude, workerPayments, finalRedisCommands, addressAccount, callback){ //This does the final all-or-nothing atom transaction if block deamon sent payments var finalizeRedisTx = function(){ @@ -570,7 +579,7 @@ function SetupForPool(logger, poolOptions, setupFinished){ logger.debug(logSystem, logComponent, 'Payments to be sent to: ' + JSON.stringify(addressAmounts)); processingPayments = true; - daemon.cmd('sendmany', ['', addressAmounts], function(results){ + daemon.cmd('sendmany', [addressAccount || '', addressAmounts], function(results){ if (results[0].error){ callback('Check finished - error with sendmany ' + JSON.stringify(results[0].error)); @@ -591,7 +600,7 @@ function SetupForPool(logger, poolOptions, setupFinished){ } var feeAmountUnits = parseFloat((totalAmountUnits / (1 - processingConfig.feePercent) * processingConfig.feePercent).toFixed(coinPrecision)); var poolFees = feeAmountUnits - results[0].response.fee; - daemon.cmd('move', ['', processingConfig.feeCollectAccount, poolFees], function(results){ + daemon.cmd('move', [addressAccount || '', processingConfig.feeCollectAccount, poolFees], function(results){ if (results[0].error){ callback('Check finished - error with move ' + JSON.stringify(results[0].error)); return;