import streamlit as st import pandas as pd import random import hmac import hashlib st.set_page_config(page_title="Stake Dice Strategy - v2.3", layout="wide") st.title("🎲 Stake Dice Auto Strategy Simulator - v2.3 (Manual-Only Features)") st.sidebar.header("Simulation Settings") initial_balance = st.sidebar.number_input("Starting Balance (USD)", value=200.0) base_bet = st.sidebar.number_input("Base Bet (USD)", value=0.0001, step=0.0001, format="%.4f") num_bets = st.sidebar.number_input("Number of Bets", value=5000, step=1000) num_runs = st.sidebar.number_input("Number of Runs", value=5, step=1) random_seed = st.sidebar.number_input("Random Seed", value=42, step=1) random.seed(random_seed) st.sidebar.markdown("---") st.sidebar.subheader("🔐 Provably Fair Dice (Optional)") use_provably_fair = st.sidebar.checkbox("Use Provably Fair Dice", value=False) client_seed = st.sidebar.text_input("Client Seed", value="widichandra") server_seed = "serverseed123" house_edge = 1.0 def roll_dice(nonce): if use_provably_fair: message = f"{client_seed}:{nonce}" hmac_hash = hmac.new(server_seed.encode(), message.encode(), hashlib.sha256).hexdigest() int_val = int(hmac_hash[:13], 16) float_val = int_val / float(2**52) roll = (float_val * 10001) / 100 return min(round(roll, 5), 100.00000) else: roll = (random.random() * 10001) / 100 return min(round(roll, 5), 100.00000) def simulate_v23(run_id): balance = initial_balance bet = base_bet win_chance = 2.02 multiplier = (100 - house_edge) / win_chance win_streak = 0 loss_count = 0 over_under = "Under" max_bet_cap = initial_balance * 0.2 data = [] for i in range(num_bets): if balance < bet or bet > max_bet_cap: break roll = roll_dice(i + run_id * num_bets) is_win = roll < win_chance if over_under == "Under" else roll > (100 - win_chance) result = { "Run": run_id, "Round": i + 1, "Bet": bet, "Roll": roll, "Over/Under": over_under } if is_win: win = bet * multiplier balance += win - bet bet = base_bet win_streak += 1 loss_count = 0 if win_streak % 2 == 0: over_under = "Over" if over_under == "Under" else "Under" else: balance -= bet loss_count += 1 win_streak = 0 if loss_count % 10 == 0: bet *= 2 bet = min(bet, max_bet_cap) result["Balance"] = round(balance, 4) result["Result"] = "Win" if is_win else "Loss" data.append(result) df = pd.DataFrame(data) return df st.subheader("📊 Simulation Result") all_data = [] for run in range(1, num_runs + 1): df = simulate_v23(run) df["Strategy"] = "Improved v2.3 (Manual Only)" all_data.append(df) result_df = pd.concat(all_data, ignore_index=True) st.dataframe(result_df) st.download_button("📥 Download CSV", data=result_df.to_csv(index=False), file_name="stake_dice_v23_simulation.csv") with st.expander("🔍 Show Full Log"): st.dataframe(result_df)