'onFrameworkBooted', ConsoleBooting::class => 'onConsole', ]; public function onFrameworkBooted(FrameworkBooted $event): void { app('config')->set('chain', require __DIR__ . '/config.php'); // Bind interfaces to implementations — swap for testing/Go wrapper app()->singleton(ChainDaemon::class, DaemonRpc::class); app()->singleton(ChainWallet::class, WalletRpc::class); // Keep concrete bindings for backwards compatibility app()->singleton(DaemonRpc::class); app()->singleton(WalletRpc::class); app('router')->aliasMiddleware('auth.api', \App\Http\Middleware\ApiTokenAuth::class); app('router')->aliasMiddleware('domain', \App\Http\Middleware\DomainScope::class); app('router')->aliasMiddleware('json.validate', \App\Http\Middleware\ValidateJsonRequest::class); // Define API rate limiter (used by api middleware group) \Illuminate\Support\Facades\RateLimiter::for('api', function (\Illuminate\Http\Request $request) { return \Illuminate\Cache\RateLimiting\Limit::perMinute(60)->by($request->user()?->id ?: $request->ip()); }); app('router')->aliasMiddleware('idempotent', \App\Http\Middleware\IdempotencyKey::class); } public function onConsole(ConsoleBooting $event): void { $event->command(Commands\ChainStart::class); $event->command(Commands\ChainStop::class); $event->command(Commands\ChainStatus::class); } }