public CryptonoteJob(GetBlockTemplateResponse blockTemplate, byte[] instanceId, string jobId, CryptonoteCoinTemplate coin, PoolConfig poolConfig, ClusterConfig clusterConfig, string prevHash, string randomXRealm) { Contract.RequiresNonNull(blockTemplate); Contract.RequiresNonNull(poolConfig); Contract.RequiresNonNull(clusterConfig); Contract.RequiresNonNull(instanceId); Contract.Requires <ArgumentException>(!string.IsNullOrEmpty(jobId)); BlockTemplate = blockTemplate; PrepareBlobTemplate(instanceId); PrevHash = prevHash; RandomXRealm = randomXRealm; hashFunc = hashFuncs[coin.Hash]; }
private async Task <bool> EnsureBalance(decimal requiredAmount, CryptonoteCoinTemplate coin) { var response = await walletDaemon.ExecuteCmdSingleAsync <GetBalanceResponse>(logger, CryptonoteWalletCommands.GetBalance); if (response.Error != null) { logger.Error(() => $"[{LogCategory}] Daemon command '{CryptonoteWalletCommands.GetBalance}' returned error: {response.Error.Message} code {response.Error.Code}"); return(false); } var unlockedBalance = Math.Floor(response.Response.UnlockedBalance / coin.SmallestUnit); var balance = Math.Floor(response.Response.Balance / coin.SmallestUnit); if (unlockedBalance < requiredAmount) { logger.Info(() => $"[{LogCategory}] {FormatAmount(requiredAmount)} unlocked balance required for payout, but only have {FormatAmount(unlockedBalance)} of {FormatAmount(balance)} available yet. Will try again."); return(false); } logger.Info(() => $"[{LogCategory}] Current balance is {FormatAmount(unlockedBalance)}"); return(true); }
public CryptonoteJob(GetBlockTemplateResponse blockTemplate, byte[] instanceId, string jobId, CryptonoteCoinTemplate coin, PoolConfig poolConfig, ClusterConfig clusterConfig, string prevHash, string randomXRealm) { Contract.RequiresNonNull(blockTemplate, nameof(blockTemplate)); Contract.RequiresNonNull(poolConfig, nameof(poolConfig)); Contract.RequiresNonNull(clusterConfig, nameof(clusterConfig)); Contract.RequiresNonNull(instanceId, nameof(instanceId)); Contract.Requires <ArgumentException>(!string.IsNullOrEmpty(jobId), $"{nameof(jobId)} must not be empty"); BlockTemplate = blockTemplate; PrepareBlobTemplate(instanceId); PrevHash = prevHash; switch (coin.Hash) { case CryptonightHashType.RandomX: hashFunc = ((seedHex, data, result, height) => { LibRandomX.CalculateHash(randomXRealm, seedHex, data, result); }); break; } }