open_new_round_if_needed now withholds opening the next round until ROUND_COOLDOWN_SECONDS (default 30) have passed since the previous round's closed_at, returning None in that window instead of a Round. Without this, the next round opened within one scheduler tick (~5s) of the previous payout confirming — not enough time for a player to notice the round they were in actually resolved. Callers updated: the scheduler treats None as "nothing to do this tick", and place_bet raises a "try again shortly" BetError instead of crashing on a None round. Not in the original flowchart — a deliberate UX addition on top of it, documented as such in CLAUDE.md. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
31 lines
837 B
Python
31 lines
837 B
Python
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
|
|
|
|
class Settings(BaseSettings):
|
|
model_config = SettingsConfigDict(env_file=".env", extra="ignore")
|
|
|
|
database_url: str = "sqlite+aiosqlite:///./plm_lottery.db"
|
|
|
|
electrum_host: str = "santantonio.sytes.net"
|
|
electrum_port: int = 50002
|
|
electrum_use_ssl: bool = True
|
|
|
|
xprv_encryption_key: str = ""
|
|
master_key_path: str = "./master.xprv.enc"
|
|
jwt_secret: str = ""
|
|
jwt_algorithm: str = "HS256"
|
|
jwt_expire_minutes: int = 60 * 24
|
|
admin_token: str = ""
|
|
|
|
round_duration_seconds: int = 600
|
|
round_cooldown_seconds: int = 30
|
|
|
|
bet_amount_sats: int = 10 * 100_000_000
|
|
min_amount_sats: int = 1 * 100_000_000
|
|
confirmations_required: int = 1
|
|
fee_rate_sat_vb: int = 1
|
|
rbf_timeout_seconds: int = 900
|
|
|
|
|
|
settings = Settings()
|