role === 'Admin' || $user->role === 'Owner'), 403); $defaults = [ 'pin_max_attempts' => 5, 'pin_lock_minutes' => 15, 'min_tx_btx' => 0.0001, 'max_tx_btx' => 100000, 'daily_max_btx' => 100000, 'actions_per_minute' => 20, 'reason_required' => true, ]; $settings = AppSetting::get('wallet.settings', $defaults) ?: $defaults; // Ensure defaults filled $settings = array_replace($defaults, is_array($settings) ? $settings : []); return Inertia::render('Admin/WalletsSettings', [ 'settings' => $settings, 'defaults' => $defaults, ]); } /** * POST /admin/wallets/settings — Save policies and limits. */ public function save(Request $request) { $user = Auth::user(); abort_unless($user && ($user->role === 'Admin' || $user->role === 'Owner'), 403); $data = $request->validate([ 'pin_max_attempts' => ['required','integer','min:1','max:20'], 'pin_lock_minutes' => ['required','integer','min:1','max:1440'], 'min_tx_btx' => ['required','numeric','min:0'], 'max_tx_btx' => ['required','numeric','gt:min_tx_btx'], 'daily_max_btx' => ['required','numeric','gte:max_tx_btx'], 'actions_per_minute' => ['required','integer','min:1','max:600'], 'reason_required' => ['required','boolean'], ]); // Normalize numeric precision (BTX uses 4 decimals commonly) $payload = [ 'pin_max_attempts' => (int) $data['pin_max_attempts'], 'pin_lock_minutes' => (int) $data['pin_lock_minutes'], 'min_tx_btx' => round((float) $data['min_tx_btx'], 4), 'max_tx_btx' => round((float) $data['max_tx_btx'], 4), 'daily_max_btx' => round((float) $data['daily_max_btx'], 4), 'actions_per_minute' => (int) $data['actions_per_minute'], 'reason_required' => (bool) $data['reason_required'], ]; AppSetting::put('wallet.settings', $payload); return back()->with('success', 'Wallet settings saved.'); } }