internal void OnVapClientPacket(byte[] buffer, int length) { bool madeChanges = false; byte[] newBuffer = null; int newLength = 0; bool isDonating = false; bool isDevFee = false; try //try to deserialize the packet, if it's not Json it will fail. that's ok. { VapClientRootObject obj; obj = JsonConvert.DeserializeObject <VapClientRootObject>(Encoding.UTF8.GetString(buffer, 0, length)); switch (obj.id) { case 1: case 2: //vap_submitLogin string wallet; DonateList donation = new DonateList(); isDonating = CheckForDonation(out donation, "VAP"); if (string.IsNullOrWhiteSpace(Program.settings.devFeeWalletAddress)) { wallet = Program.settings.walletAddress; } else { wallet = Program.settings.devFeeWalletAddress; } Logger.LogToConsole("Vapory Login detected!", redirector.thisMiner.endPoint, ConsoleColor.DarkGreen); madeChanges = true; if (obj.@params[0].Contains(".") && Program.settings.useDotWithRigName) { //There is likely a rigName in the wallet address. redirector.thisMiner.replacedWallet = obj.@params[0]; redirector.thisMiner.rigName = obj.@params[0].Substring(obj.@params[0].IndexOf(".") + 1); redirector.thisMiner.displayName = redirector.thisMiner.rigName; if (Program.settings.replaceWallet) { obj.@params[0] = Program.settings.walletAddress + "." + redirector.thisMiner.rigName; } } else if (obj.@params[0].Contains("/") && Program.settings.useSlashWithRigName) { //There is likely different rigname, may need to check for email addresses here as well redirector.thisMiner.replacedWallet = obj.@params[0]; redirector.thisMiner.rigName = obj.@params[0].Substring(obj.@params[0].IndexOf("/") + 1); redirector.thisMiner.displayName = redirector.thisMiner.rigName; if (Program.settings.replaceWallet) { obj.@params[0] = Program.settings.walletAddress + "/" + redirector.thisMiner.rigName; } } else if (Program.settings.identifyDevFee) { //there is no rigName, so we just replace the wallet redirector.thisMiner.replacedWallet = obj.@params[0]; if (!Program.settings.useDotWithRigName && Program.settings.debug && redirector.thisMiner.replacedWallet.Contains(".")) { Logger.LogToConsole("Wallet address contains a rigName, but useDotWithRigName is false", "MinerProxy"); } if (redirector.thisMiner.replacedWallet != Program.settings.walletAddress) { redirector.thisMiner.displayName = "DevFee"; isDevFee = true; } if (obj.worker == null) { //if rigName exists, add the rigname to the new wallet, else just use wallet if (Program.settings.replaceWallet) { obj.@params[0] = Program.settings.walletAddress; } redirector.thisMiner.noRigName = true; } else if (obj.worker.Equals("vap1.0")) { //It's probably a DevFee if (redirector.thisMiner.replacedWallet != Program.settings.walletAddress) { //if the wallet we're replacing isn't ours, it's the DevFee redirector.thisMiner.displayName = "DevFee"; isDevFee = true; if (Program.settings.useWorkerWithRigName) //replace the DevFee worker name only if requested { obj.worker = "DevFee"; } if (Program.settings.useSlashWithRigName && Program.settings.replaceWallet) { obj.@params[0] = wallet + "/" + redirector.thisMiner.displayName; } if (Program.settings.useDotWithRigName && Program.settings.replaceWallet) { obj.@params[0] = wallet + "." + redirector.thisMiner.displayName; } } else { redirector.thisMiner.noRigName = true; redirector.thisMiner.displayName = redirector.thisMiner.connectionName; if (Program.settings.replaceWallet) { obj.@params[0] = wallet; } } } else { if (Program.settings.useWorkerWithRigName) { redirector.thisMiner.displayName = obj.worker; redirector.thisMiner.workerName = obj.worker; } if (Program.settings.replaceWallet) { obj.@params[0] = Program.settings.walletAddress; } if (Program.settings.debug) { Logger.LogToConsole(string.Format("Worker: {0}", redirector.thisMiner.workerName), redirector.thisMiner.endPoint, ConsoleColor.DarkGreen); } } } else { //Don't worry about rigName, just replace the wallet. redirector.thisMiner.replacedWallet = obj.@params[0]; if (obj.worker != null) { redirector.thisMiner.displayName = obj.worker; } if (Program.settings.replaceWallet) { obj.@params[0] = wallet; } } if (isDevFee && isDonating) //set the donation wallet { obj.@params[0] = donation.donateWallet; } redirector.SetupMinerStats(); //Set up MinerStats with the new information from the login if (Program.settings.replaceWallet) { lock (Logger.ConsoleBlockLock) { Logger.LogToConsole("Old Wallet: " + redirector.thisMiner.replacedWallet, redirector.thisMiner.endPoint, ConsoleColor.Yellow); Logger.LogToConsole("New Wallet: " + obj.@params[0], redirector.thisMiner.endPoint, ConsoleColor.Yellow); } } else { Logger.LogToConsole(string.Format("Wallet for {0}: {1}", redirector.thisMiner.displayName, obj.@params[0]), redirector.thisMiner.endPoint, ConsoleColor.Yellow); } string tempBuffer = JsonConvert.SerializeObject(obj, Formatting.None) + "\n"; newBuffer = Encoding.UTF8.GetBytes(tempBuffer); newLength = tempBuffer.Length; if (isDevFee && isDonating) { redirector.m_loginBuffer = newBuffer; redirector.m_loginLength = newLength; redirector.ChangeServer(donation.donatePoolAddress, donation.donatePoolPort); Logger.LogToConsole(string.Format("Thank you for donating to MinerProxy developer {0}!", donation.developer), "DevFee"); return; } break; case 5: case 3: //vap_getWork if (Program.settings.debug) { Logger.LogToConsole("vap_getWork from Client.", redirector.thisMiner.endPoint); } break; /*case 4: //vap_submitWork * redirector.SubmittedShare(); * Logger.LogToConsole(string.Format(redirector.thisMiner.displayName + " found a share. [{0} shares found]", redirector.thisMiner.submittedShares), redirector.thisMiner.endPoint, ConsoleColor.Green); * break; * * case 10: //vap_submitWork (Apparently Claymore 10.4 sends this) * redirector.SubmittedShare(); * Logger.LogToConsole(string.Format(redirector.thisMiner.displayName + " found a share. [{0} shares found]", redirector.thisMiner.submittedShares), redirector.thisMiner.endPoint, ConsoleColor.Green); * break;*/ case 6: //vap_submitHashrate long hashrate = Convert.ToInt64(obj.@params[0], 16); redirector.thisMiner.hashrate = hashrate; MinerManager.AddHashrate(redirector.thisMiner.displayName, redirector.thisMiner.hashrate); if (Program.settings.debug) { Logger.LogToConsole(string.Format("Hashrate reported by {0}: {1}", redirector.thisMiner.displayName, hashrate.ToString("#,##0,Mh/s").Replace(",", ".")), redirector.thisMiner.endPoint, ConsoleColor.Magenta); } break; default: if (Program.settings.debug) { lock (Logger.ConsoleBlockLock) { Logger.LogToConsole("From Client >---->", redirector.thisMiner.endPoint); Logger.LogToConsole("Unknown ID: " + obj.id, redirector.thisMiner.endPoint); Logger.LogToConsole("Method: " + obj.method, redirector.thisMiner.endPoint); Logger.LogToConsole("Param Count: " + [email protected], redirector.thisMiner.endPoint); Logger.LogToConsole(Encoding.UTF8.GetString(buffer, 0, length), redirector.thisMiner.endPoint); } } break; } switch (obj.method) { case "vap_submitWork": { redirector.SubmittedShare(); Logger.LogToConsole(string.Format(redirector.thisMiner.displayName + " found a share. [{0} shares found]", redirector.thisMiner.submittedShares), redirector.thisMiner.endPoint, ConsoleColor.Green); submitWorkID = (int)obj.id; break; } } } catch (Exception ex) { madeChanges = false; Logger.LogToConsole(ex.Message, redirector.thisMiner.endPoint); if (Program.settings.debug) { Logger.LogToConsole("Json Err: " + Encoding.UTF8.GetString(buffer, 0, length), redirector.thisMiner.endPoint, ConsoleColor.Red); } } if (redirector.thisMiner.connectionAlive && redirector.m_server.Disposed == false) { if (madeChanges == false) { //Logger.LogToConsole("Sending buffer: " + Encoding.UTF8.GetString(buffer, 0, length), redirector.thisMiner.endpoint); redirector.m_server.Send(buffer, length); } else { //Logger.LogToConsole("Sending modified buffer: " + Encoding.UTF8.GetString(newBuffer, 0, newLength), redirector.thisMiner.endpoint); redirector.m_server.Send(newBuffer, newLength); } } }