public ActionResult GetDepositInvoice(string amount, string memo, string anon, string use, int?useId, int?useAction) { Response.AddHeader("X-Frame-Options", "DENY"); bool isAnon = !(anon == null || anon != "1"); if (!isAnon && !User.Identity.IsAuthenticated) { // This is a user-related invoice, and no user is logged in. return(RedirectToAction("Login", "Account", new { returnUrl = Request.Url.ToString() })); } string userId; if (isAnon) { userId = null; } else { userId = User.Identity.GetUserId(); } if (string.IsNullOrEmpty(memo)) { memo = "Zapread.com"; } if (Convert.ToInt64(amount, CultureInfo.InvariantCulture) > 50000) { return(Json(new { success = false, message = "Deposits temporarily limited to 50000 satoshi" })); } LndRpcClient lndClient = GetLndClient(); var inv = lndClient.AddInvoice(Convert.ToInt64(amount, CultureInfo.InvariantCulture), memo: memo.SanitizeXSS(), expiry: "3600"); LnRequestInvoiceResponse resp = new LnRequestInvoiceResponse() { Invoice = inv.payment_request, Result = "success", success = true, }; //Create transaction record (not settled) using (ZapContext db = new ZapContext()) { // TODO: ensure user exists? User user = null; if (userId != null) { user = db.Users.Where(u => u.AppId == userId).First(); } TransactionUse usedFor = TransactionUse.Undefined; TransactionUseAction usedForAction = TransactionUseAction.Undefined; int usedForId = useId != null ? useId.Value : -1; if (use == "tip") { usedFor = TransactionUse.Tip; } else if (use == "votePost") { usedFor = TransactionUse.VotePost; } else if (use == "voteComment") { usedFor = TransactionUse.VoteComment; } else if (use == "userDeposit") { usedFor = TransactionUse.UserDeposit; usedForId = userId != null ? user.Id : -1; } if (useAction != null) { if (useAction.Value == 0) { usedForAction = TransactionUseAction.VoteDown; } else if (useAction.Value == 1) { usedForAction = TransactionUseAction.VoteUp; } } var rhash_bytes = Convert.FromBase64String(inv.r_hash); var rhash_hex = HexEncoder.EncodeData(rhash_bytes); //create a new transaction record in database LNTransaction t = new LNTransaction() { User = user, IsSettled = false, IsSpent = false, Memo = memo.SanitizeXSS(), Amount = Convert.ToInt64(amount, CultureInfo.InvariantCulture), HashStr = inv.r_hash, // B64 encoded PreimageHash = rhash_hex, IsDeposit = true, TimestampCreated = DateTime.Now, PaymentRequest = inv.payment_request, UsedFor = usedFor, UsedForId = usedForId, UsedForAction = usedForAction, }; db.LightningTransactions.Add(t); db.SaveChanges(); resp.Id = t.Id; } if (true) // debugging { // If a listener is not already running, this should start // Check if there is one already online. var numListeners = lndTransactionListeners.Count(kvp => kvp.Value.IsLive); // If we don't have one running - start it and subscribe if (numListeners < 1) { var listener = lndClient.GetListener(); lndTransactionListeners.TryAdd(listener.ListenerId, listener); // keep alive while we wait for payment listener.InvoicePaid += async(invoice) => await NotifyClientsInvoicePaid(invoice) .ConfigureAwait(true); // handle payment message listener.StreamLost += OnListenerLost; // stream lost var a = new Task(() => listener.Start()); // listen for payment a.Start(); } } return(Json(resp)); }
public ActionResult GetJarDepositInvoice(string amount, string memo) { string ip = GetClientIpAddress(Request);; if (memo == null || memo == "") { memo = "Coinpanic Community Jar"; } bool useTestnet = GetUseTestnet(); var lndClient = new LndRpcClient( host: System.Configuration.ConfigurationManager.AppSettings[useTestnet ? "LnTestnetHost" : "LnMainnetHost"], macaroonAdmin: System.Configuration.ConfigurationManager.AppSettings[useTestnet ? "LnTestnetMacaroonAdmin" : "LnMainnetMacaroonAdmin"], macaroonRead: System.Configuration.ConfigurationManager.AppSettings[useTestnet ? "LnTestnetMacaroonRead" : "LnMainnetMacaroonRead"], macaroonInvoice: System.Configuration.ConfigurationManager.AppSettings[useTestnet ? "LnTestnetMacaroonInvoice" : "LnMainnetMacaroonInvoice"]); var inv = lndClient.AddInvoice(Convert.ToInt64(amount), memo: memo, expiry: "432000"); LnRequestInvoiceResponse resp = new LnRequestInvoiceResponse() { Invoice = inv.payment_request, Result = "success", }; string userId = ""; //Check if user is returning if (HttpContext.Request.Cookies["CoinpanicCommunityJarUser"] != null) { var cookie = HttpContext.Request.Cookies.Get("CoinpanicCommunityJarUser"); cookie.Expires = DateTime.Now.AddDays(7); //update HttpContext.Response.Cookies.Remove("CoinpanicCommunityJarUser"); HttpContext.Response.SetCookie(cookie); userId = cookie.Value; } else { HttpCookie cookie = new HttpCookie("CoinpanicCommunityJarUser"); cookie.Value = Guid.NewGuid().ToString(); cookie.Expires = DateTime.Now.AddDays(7); HttpContext.Response.Cookies.Remove("CoinpanicCommunityJarUser"); HttpContext.Response.SetCookie(cookie); userId = cookie.Value; } //Create transaction record (not settled) using (CoinpanicContext db = new CoinpanicContext()) { var jar = db.LnCommunityJars.Where(j => j.IsTestnet == useTestnet).First(); //is this a previous user? LnCJUser user; user = GetUserFromDb(userId, db, jar, ip); //create a new transaction LnTransaction t = new LnTransaction() { UserId = user.LnCJUserId, IsSettled = false, Memo = memo, Value = Convert.ToInt64(amount), IsTestnet = GetUseTestnet(), HashStr = inv.r_hash, IsDeposit = true, //TimestampSettled = DateTime.SpecifyKind(new DateTime(1970, 1, 1), DateTimeKind.Utc) + TimeSpan.FromSeconds(Convert.ToInt64(invoice.settle_date)), TimestampCreated = DateTime.Now, PaymentRequest = inv.payment_request, DestinationPubKey = System.Configuration.ConfigurationManager.AppSettings["LnPubkey"], }; db.LnTransactions.Add(t); db.SaveChanges(); } // If a listener is not already running, this should start // Check if there is one already online. var numListeners = lndTransactionListeners.Count(kvp => kvp.Value.IsLive); // If we don't have one running - start it and subscribe if (numListeners < 1) { var listener = lndClient.GetListener(); lndTransactionListeners.TryAdd(listener.ListenerId, listener); //keep alive while we wait for payment listener.InvoicePaid += NotifyClientsInvoicePaid; //handle payment message listener.StreamLost += OnListenerLost; //stream lost var a = new Task(() => listener.Start()); //listen for payment a.Start(); } return(Json(resp)); }
public ActionResult GetDepositInvoice(string amount, string memo, string anon) { bool isAnon = !(anon == null || anon != "1"); if (!isAnon && !User.Identity.IsAuthenticated) { // This is a user-related invoice, and no user is logged in. return(RedirectToAction("Login", "Account", new { returnUrl = Request.Url.ToString() })); } string userId; if (isAnon) { userId = null; } else { userId = User.Identity.GetUserId(); } if (memo == null || memo == "") { memo = "Zapread.com"; } var lndClient = new LndRpcClient( host: System.Configuration.ConfigurationManager.AppSettings["LnMainnetHost"], macaroonAdmin: System.Configuration.ConfigurationManager.AppSettings["LnMainnetMacaroonAdmin"], macaroonRead: System.Configuration.ConfigurationManager.AppSettings["LnMainnetMacaroonRead"], macaroonInvoice: System.Configuration.ConfigurationManager.AppSettings["LnMainnetMacaroonInvoice"]); var inv = lndClient.AddInvoice(Convert.ToInt64(amount), memo: memo, expiry: "432000"); LnRequestInvoiceResponse resp = new LnRequestInvoiceResponse() { Invoice = inv.payment_request, Result = "success", }; //Create transaction record (not settled) using (ZapContext db = new ZapContext()) { // TODO: ensure user exists? zapread.com.Models.User user = null; if (userId != null) { user = db.Users.Where(u => u.AppId == userId).First(); } //create a new transaction LNTransaction t = new LNTransaction() { User = user, IsSettled = false, IsSpent = false, Memo = memo, Amount = Convert.ToInt64(amount), HashStr = inv.r_hash, IsDeposit = true, TimestampCreated = DateTime.Now, PaymentRequest = inv.payment_request, UsedFor = TransactionUse.UserDeposit, UsedForId = userId != null ? user.Id : -1, }; db.LightningTransactions.Add(t); db.SaveChanges(); } // If a listener is not already running, this should start // Check if there is one already online. var numListeners = lndTransactionListeners.Count(kvp => kvp.Value.IsLive); // If we don't have one running - start it and subscribe if (numListeners < 1) { var listener = lndClient.GetListener(); lndTransactionListeners.TryAdd(listener.ListenerId, listener); // keep alive while we wait for payment listener.InvoicePaid += NotifyClientsInvoicePaid; // handle payment message listener.StreamLost += OnListenerLost; // stream lost var a = new Task(() => listener.Start()); // listen for payment a.Start(); } return(Json(resp)); }