diff --git a/Caddyfile b/Caddyfile
new file mode 100644
index 0000000..93949d4
--- /dev/null
+++ b/Caddyfile
@@ -0,0 +1,10 @@
+{
+ frankenphp
+ order php_server before file_server
+}
+
+:80 {
+ root * /app/public
+ encode zstd br gzip
+ php_server
+}
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..91e131c
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,32 @@
+FROM dunglas/frankenphp:latest
+
+WORKDIR /app
+
+# System deps
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ git unzip curl \
+ && rm -rf /var/lib/apt/lists/*
+
+# Composer
+COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
+
+# App source
+COPY . /app
+
+# Install deps
+RUN composer install --no-dev --optimize-autoloader --no-interaction 2>/dev/null || true
+
+# Storage dirs
+RUN mkdir -p storage/framework/{sessions,views,cache/data} \
+ && chmod -R 777 storage bootstrap/cache 2>/dev/null || true
+
+# Environment
+ENV APP_ENV=production
+ENV APP_DEBUG=false
+ENV APP_URL=https://lthn.io
+ENV CHAIN_MODE=remote
+ENV DAEMON_RPC=http://127.0.0.1:46941/json_rpc
+
+EXPOSE 443 80
+
+CMD ["frankenphp", "run", "--config", "/app/Caddyfile"]
diff --git a/app/Boot.php b/app/Boot.php
index ca1498f..38f9258 100644
--- a/app/Boot.php
+++ b/app/Boot.php
@@ -31,6 +31,7 @@ class Boot extends CoreBoot
*/
public static array $modules = [
\Mod\Chain\Boot::class,
+ \Mod\Home\Boot::class,
\Mod\Explorer\Boot::class,
\Mod\Trade\Boot::class,
\Mod\Pool\Boot::class,
diff --git a/app/Mod/Home/Boot.php b/app/Mod/Home/Boot.php
new file mode 100644
index 0000000..5fa9a73
--- /dev/null
+++ b/app/Mod/Home/Boot.php
@@ -0,0 +1,27 @@
+rpc->getInfo();
+ $aliases = $this->rpc->getAllAliases();
+
+ return view('home::index', [
+ 'height' => $info['height'] ?? 0,
+ 'aliases' => count($aliases['aliases'] ?? []),
+ 'transactions' => $info['tx_count'] ?? 0,
+ 'hashrate' => $info['current_network_hashrate_350'] ?? 0,
+ 'difficulty' => [
+ 'pow' => $info['pow_difficulty'] ?? 0,
+ 'pos' => $info['pos_difficulty'] ?? '0',
+ ],
+ 'services' => $this->countServicesByType($aliases['aliases'] ?? []),
+ ]);
+ }
+
+ private function countServicesByType(array $aliases): array
+ {
+ $counts = ['gateway' => 0, 'service' => 0, 'exit' => 0, 'user' => 0];
+
+ foreach ($aliases as $alias) {
+ $comment = $alias['comment'] ?? '';
+ if (str_contains($comment, 'type=gateway')) {
+ $counts['gateway']++;
+ } elseif (str_contains($comment, 'type=exit')) {
+ $counts['exit']++;
+ } elseif (str_contains($comment, 'type=service')) {
+ $counts['service']++;
+ } else {
+ $counts['user']++;
+ }
+ }
+
+ return $counts;
+ }
+}
diff --git a/app/Mod/Names/Controllers/NamesWebController.php b/app/Mod/Names/Controllers/NamesWebController.php
new file mode 100644
index 0000000..2a1a1bc
--- /dev/null
+++ b/app/Mod/Names/Controllers/NamesWebController.php
@@ -0,0 +1,60 @@
+rpc->getAllAliases();
+ $aliases = $result['aliases'] ?? [];
+ $search = $request->get('search', '');
+
+ if ($search) {
+ $aliases = array_filter($aliases, fn ($a) => str_contains($a['alias'] ?? '', strtolower($search))
+ || str_contains($a['comment'] ?? '', strtolower($search)));
+ }
+
+ return view('names::index', [
+ 'aliases' => array_values($aliases),
+ 'total' => count($result['aliases'] ?? []),
+ 'search' => $search,
+ ]);
+ }
+
+ public function register(): \Illuminate\View\View
+ {
+ return view('names::register');
+ }
+
+ public function show(string $name): \Illuminate\View\View
+ {
+ $alias = $this->rpc->getAliasByName($name);
+
+ if (! $alias) {
+ return view('names::available', ['name' => $name]);
+ }
+
+ return view('names::show', [
+ 'name' => $name,
+ 'alias' => $alias,
+ ]);
+ }
+}
diff --git a/app/Mod/Names/Routes/web.php b/app/Mod/Names/Routes/web.php
new file mode 100644
index 0000000..4ca7ff9
--- /dev/null
+++ b/app/Mod/Names/Routes/web.php
@@ -0,0 +1,10 @@
+set('pool', require __DIR__ . '/config.php');
+ $this->registerListeners();
+ }
+
+ protected function registerListeners(): void
+ {
+ Event::listen(WebRoutesRegistering::class, [$this, 'onWebRoutesRegistering']);
+ Event::listen(ApiRoutesRegistering::class, [$this, 'onApiRoutesRegistering']);
+ }
+
+ public function onWebRoutesRegistering(): void
+ {
+ Route::prefix('pool')->group(__DIR__ . '/Routes/web.php');
+ }
+
+ public function onApiRoutesRegistering(): void
+ {
+ Route::prefix('v1/pool')->group(__DIR__ . '/Routes/api.php');
+ }
+}
diff --git a/app/Mod/Pool/Controllers/PoolController.php b/app/Mod/Pool/Controllers/PoolController.php
new file mode 100644
index 0000000..b7801e3
--- /dev/null
+++ b/app/Mod/Pool/Controllers/PoolController.php
@@ -0,0 +1,56 @@
+ $this->pool->getStats(),
+ ]);
+ }
+
+ public function blocks(): \Illuminate\View\View
+ {
+ return view('pool::blocks', [
+ 'blocks' => $this->pool->getBlocks(),
+ ]);
+ }
+
+ public function payments(): \Illuminate\View\View
+ {
+ return view('pool::payments', [
+ 'payments' => $this->pool->getPayments(),
+ ]);
+ }
+
+ public function miner(Request $request): \Illuminate\View\View
+ {
+ $address = $request->get('address', '');
+
+ return view('pool::miner', [
+ 'stats' => $address ? $this->pool->getMinerStats($address) : [],
+ 'address' => $address,
+ ]);
+ }
+}
diff --git a/app/Mod/Pool/Routes/api.php b/app/Mod/Pool/Routes/api.php
new file mode 100644
index 0000000..19af361
--- /dev/null
+++ b/app/Mod/Pool/Routes/api.php
@@ -0,0 +1,10 @@
+ response()->json(app(PoolClient::class)->getStats()));
+Route::get('/blocks', fn () => response()->json(app(PoolClient::class)->getBlocks()));
+Route::get('/payments', fn () => response()->json(app(PoolClient::class)->getPayments()));
diff --git a/app/Mod/Pool/Routes/web.php b/app/Mod/Pool/Routes/web.php
new file mode 100644
index 0000000..d889ce7
--- /dev/null
+++ b/app/Mod/Pool/Routes/web.php
@@ -0,0 +1,11 @@
+getStats();
+ */
+class PoolClient
+{
+ private string $apiUrl;
+ private int $cacheTtl;
+
+ public function __construct()
+ {
+ $this->apiUrl = config('pool.api_url', 'http://127.0.0.1:2117');
+ $this->cacheTtl = config('pool.cache_ttl', 15);
+ }
+
+ public function getStats(): array
+ {
+ return Cache::remember('pool.stats', $this->cacheTtl, function () {
+ $response = Http::timeout(5)->get("{$this->apiUrl}/stats");
+
+ return $response->successful() ? $response->json() : [];
+ });
+ }
+
+ public function getBlocks(): array
+ {
+ return Cache::remember('pool.blocks', $this->cacheTtl, function () {
+ $response = Http::timeout(5)->get("{$this->apiUrl}/get_blocks");
+
+ return $response->successful() ? $response->json() : [];
+ });
+ }
+
+ public function getPayments(): array
+ {
+ return Cache::remember('pool.payments', $this->cacheTtl, function () {
+ $response = Http::timeout(5)->get("{$this->apiUrl}/get_payments");
+
+ return $response->successful() ? $response->json() : [];
+ });
+ }
+
+ public function getMinerStats(string $address): array
+ {
+ $response = Http::timeout(5)->get("{$this->apiUrl}/stats_address", [
+ 'address' => $address,
+ ]);
+
+ return $response->successful() ? $response->json() : [];
+ }
+}
diff --git a/app/Mod/Pool/config.php b/app/Mod/Pool/config.php
new file mode 100644
index 0000000..e88fadb
--- /dev/null
+++ b/app/Mod/Pool/config.php
@@ -0,0 +1,8 @@
+ env('POOL_API_URL', 'http://127.0.0.1:2117'),
+ 'cache_ttl' => (int) env('POOL_CACHE_TTL', 15),
+];
diff --git a/app/Mod/Trade/Boot.php b/app/Mod/Trade/Boot.php
new file mode 100644
index 0000000..7b10195
--- /dev/null
+++ b/app/Mod/Trade/Boot.php
@@ -0,0 +1,41 @@
+set('trade', require __DIR__ . '/config.php');
+ $this->registerListeners();
+ }
+
+ protected function registerListeners(): void
+ {
+ Event::listen(WebRoutesRegistering::class, [$this, 'onWebRoutesRegistering']);
+ Event::listen(ApiRoutesRegistering::class, [$this, 'onApiRoutesRegistering']);
+ }
+
+ public function onWebRoutesRegistering(): void
+ {
+ Route::prefix('trade')->group(__DIR__ . '/Routes/web.php');
+ }
+
+ public function onApiRoutesRegistering(): void
+ {
+ Route::prefix('v1/trade')->group(__DIR__ . '/Routes/api.php');
+ }
+}
diff --git a/app/Mod/Trade/Controllers/TradeApiController.php b/app/Mod/Trade/Controllers/TradeApiController.php
new file mode 100644
index 0000000..13d55a7
--- /dev/null
+++ b/app/Mod/Trade/Controllers/TradeApiController.php
@@ -0,0 +1,73 @@
+rpc->getInfo();
+
+ return response()->json([
+ 'success' => true,
+ 'data' => [
+ 'currencies' => [
+ [
+ 'name' => 'LTHN',
+ 'code' => 'lethean',
+ 'type' => 'crypto',
+ 'asset_id' => 'd6329b5b1f7c0805b5c345f4957554002a2f557845f64d7645dae0e051a6498a',
+ 'asset_info' => ['decimal_point' => 12],
+ ],
+ ],
+ 'network' => config('chain.network'),
+ 'height' => $info['height'] ?? 0,
+ ],
+ ]);
+ }
+
+ public function pairs(): JsonResponse
+ {
+ // Pairs are configured, not discovered — for now return LTHN native
+ return response()->json([
+ 'success' => true,
+ 'data' => [],
+ ]);
+ }
+
+ public function pair(int $id): JsonResponse
+ {
+ return response()->json([
+ 'success' => false,
+ 'error' => 'Pair not found',
+ ], 404);
+ }
+
+ public function orders(): JsonResponse
+ {
+ return response()->json([
+ 'success' => true,
+ 'data' => [],
+ ]);
+ }
+}
diff --git a/app/Mod/Trade/Controllers/TradeController.php b/app/Mod/Trade/Controllers/TradeController.php
new file mode 100644
index 0000000..1e4fe77
--- /dev/null
+++ b/app/Mod/Trade/Controllers/TradeController.php
@@ -0,0 +1,46 @@
+ $this->rpc->getInfo(),
+ ]);
+ }
+
+ public function swap(): \Illuminate\View\View
+ {
+ return view('trade::swap');
+ }
+
+ public function p2p(): \Illuminate\View\View
+ {
+ return view('trade::p2p');
+ }
+
+ public function orders(): \Illuminate\View\View
+ {
+ return view('trade::orders');
+ }
+}
diff --git a/app/Mod/Trade/Routes/api.php b/app/Mod/Trade/Routes/api.php
new file mode 100644
index 0000000..a05a974
--- /dev/null
+++ b/app/Mod/Trade/Routes/api.php
@@ -0,0 +1,11 @@
+ env('DAEMON_RPC', 'http://127.0.0.1:46941/json_rpc'),
+ 'wallet_rpc' => env('WALLET_RPC', 'http://127.0.0.1:46944/json_rpc'),
+ 'jwt_secret' => env('TRADE_JWT_SECRET', ''),
+];
diff --git a/composer.json b/composer.json
index 5e5294d..169ed0d 100644
--- a/composer.json
+++ b/composer.json
@@ -1,81 +1,25 @@
{
"$schema": "https://getcomposer.org/schema.json",
- "name": "laravel/laravel",
+ "name": "lthn/lthn.io",
"type": "project",
- "description": "The skeleton application for the Laravel framework.",
- "keywords": ["laravel", "framework"],
- "license": "MIT",
+ "description": "Lethean.io — TLD website and blockchain services",
+ "keywords": ["lethean", "blockchain", "tld", "explorer", "dex"],
+ "license": "EUPL-1.2",
"require": {
- "php": "^8.5",
- "bunnycdn/storage": "^3.4",
- "chillerlan/php-qrcode": "^5.0",
+ "php": "^8.4",
"core/php": "*",
- "core/php-admin": "*",
- "core/php-commerce": "dev-main",
- "core/php-content": "dev-main",
- "core/php-plug-business": "dev-main",
- "core/php-plug-cdn": "dev-main",
- "core/php-plug-chat": "dev-main",
- "core/php-plug-content": "dev-main",
- "core/php-plug-social": "dev-main",
- "core/php-plug-stock": "dev-main",
- "core/php-plug-storage": "dev-main",
- "core/php-plug-web3": "dev-main",
- "core/php-tenant": "dev-main",
- "core/php-uptelligence": "dev-main",
- "dedoc/scramble": "^0.13.10",
- "ezyang/htmlpurifier": "^4.19",
- "jaybizzle/crawler-detect": "^1.3",
- "jenssegers/agent": "^2.6",
"laravel/framework": "^12.0",
- "laravel/horizon": "^5.42",
- "laravel/mcp": "^0.5.1",
- "laravel/octane": "^2.13",
- "laravel/pennant": "^1.18",
- "laravel/pulse": "^1.5",
- "laravel/reverb": "^1.6",
- "laravel/tinker": "^2.10.1",
- "league/flysystem-aws-s3-v3": "^3.30",
- "league/iso3166": "^4.4",
- "livewire/flux": "*",
- "livewire/flux-pro": "*",
- "livewire/livewire": "^4.0",
- "lthn/agent": "dev-main",
- "lthn/api": "dev-main",
- "lthn/client": "dev-main",
- "lthn/mcp": "*",
- "lthn/php-plug-altum": "dev-main",
- "lthn/service": "dev-main",
- "maxmind-db/reader": "^1.13",
- "minishlink/web-push": "^10.0",
- "opcodesio/log-viewer": "^3.21",
- "predis/predis": "^3.3",
- "sentry/sentry-laravel": "^4.20",
- "spatie/laravel-activitylog": "^4.10",
- "webklex/php-imap": "^6.2"
+ "guzzlehttp/guzzle": "^7.9"
},
"require-dev": {
- "erusev/parsedown": "^1.7",
- "fakerphp/faker": "^1.23",
- "laravel/boost": "^1.8",
- "laravel/pail": "^1.2.2",
- "laravel/pint": "^1.24",
- "laravel/sail": "^1.41",
- "mockery/mockery": "^1.6",
- "nunomaduro/collision": "^8.6",
- "pestphp/pest": "^4.2",
- "pestphp/pest-plugin-browser": "^4.1",
- "pestphp/pest-plugin-laravel": "^4.0",
- "core/php-developer": "*"
+ "larastan/larastan": "^3.0",
+ "laravel/pint": "^1.18",
+ "pestphp/pest": "^3.7"
},
"autoload": {
"psr-4": {
- "Mod\\": "app/Mod/",
- "Service\\": "app/Service/",
- "Website\\": "app/Website/",
"App\\": "app/",
- "Database\\Factories\\": "database/factories/",
- "Database\\Seeders\\": "database/seeders/"
+ "Mod\\": "app/Mod/"
}
},
"autoload-dev": {
@@ -84,66 +28,9 @@
}
},
"scripts": {
- "setup": [
- "composer install",
- "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"",
- "@php artisan key:generate",
- "@php artisan migrate --force",
- "npm install",
- "npm run build"
- ],
- "dev": [
- "Composer\\Config::disableProcessTimeout",
- "npx concurrently -c \"#93c5fd,#c4b5fd,#fb7185,#fdba74\" \"php artisan serve\" \"php artisan queue:listen --tries=1\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=server,queue,logs,vite --kill-others"
- ],
- "dev:valet": [
- "Composer\\Config::disableProcessTimeout",
- "npx concurrently -c \"#a78bfa,#c4b5fd,#fb7185,#fdba74\" \"php artisan reverb:start\" \"php artisan queue:listen --tries=1\" \"php artisan pail --timeout=0\" \"npm run dev\" --names=reverb,queue,logs,vite --kill-others"
- ],
- "dev:packages": "COMPOSER=composer.local.json composer update",
- "test": [
- "Composer\\Config::disableProcessTimeout",
- "@php artisan config:clear --ansi",
- "@php artisan test --exclude-group=slow,deploy"
- ],
- "test:all": [
- "Composer\\Config::disableProcessTimeout",
- "@php artisan config:clear --ansi",
- "@php artisan test"
- ],
- "test:fast": [
- "@php artisan config:clear --ansi",
- "@php artisan test --testsuite=Unit"
- ],
- "test:deploy": [
- "Composer\\Config::disableProcessTimeout",
- "@php artisan config:clear --ansi",
- "@php artisan test"
- ],
- "db:reset": [
- "@php artisan migrate:fresh --seed --ansi"
- ],
- "db:reset:testing": [
- "@php artisan migrate:fresh --seed --database=mariadb --env=testing --ansi"
- ],
- "post-autoload-dump": [
- "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
- "@php artisan package:discover --ansi"
- ],
- "post-update-cmd": [
- "@php artisan vendor:publish --tag=laravel-assets --ansi --force"
- ],
- "post-root-package-install": [
- "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
- ],
- "post-create-project-cmd": [
- "@php artisan key:generate --ansi",
- "@php -r \"file_exists('database/database.sqlite') || touch('database/database.sqlite');\"",
- "@php artisan migrate --graceful --ansi"
- ],
- "pre-package-uninstall": [
- "Illuminate\\Foundation\\ComposerScripts::prePackageUninstall"
- ]
+ "lint": "pint",
+ "analyse": "phpstan analyse",
+ "test": "pest"
},
"extra": {
"laravel": {
@@ -159,106 +46,12 @@
"php-http/discovery": true
}
},
- "minimum-stability": "dev",
- "prefer-stable": true,
"repositories": [
- {
- "type": "path",
- "url": "packages/livewire/flux",
- "options": {
- "symlink": false
- }
- },
- {
- "type": "path",
- "url": "packages/livewire/flux-pro",
- "options": {
- "symlink": false
- }
- },
{
"type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-admin.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/api.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/mcp.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-developer.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-tenant.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/agent.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-commerce.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-content.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-plug-business.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-plug-cdn.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-plug-chat.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-plug-content.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-plug-social.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-plug-stock.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-plug-storage.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-plug-web3.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-uptelligence.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-service.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-client.git"
- },
- {
- "type": "vcs",
- "url": "ssh://git@forge.lthn.ai:2223/core/php-plug-altum.git"
+ "url": "https://forge.lthn.ai/core/php.git"
}
- ]
+ ],
+ "minimum-stability": "dev",
+ "prefer-stable": true
}
diff --git a/config/sentry.php b/config/sentry.php
deleted file mode 100644
index 71ecafb..0000000
--- a/config/sentry.php
+++ /dev/null
@@ -1,135 +0,0 @@
- env('SENTRY_LARAVEL_DSN', env('SENTRY_DSN')),
-
- // @see https://spotlightjs.com/
- // 'spotlight' => env('SENTRY_SPOTLIGHT', false),
-
- // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#logger
- // 'logger' => Sentry\Logger\DebugFileLogger::class, // Uncomment to debug - logs to storage/logs/sentry.log
-
- // The release version of your application
- // Example with dynamic git hash: trim(exec('git --git-dir ' . base_path('.git') . ' log --pretty="%h" -n1 HEAD'))
- 'release' => env('SENTRY_RELEASE'),
-
- // When left empty or `null` the Laravel environment will be used (usually discovered from `APP_ENV` in your `.env`)
- 'environment' => env('SENTRY_ENVIRONMENT'),
-
- // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#sample_rate
- 'sample_rate' => env('SENTRY_SAMPLE_RATE') === null ? 1.0 : (float) env('SENTRY_SAMPLE_RATE'),
-
- // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#traces_sample_rate
- 'traces_sample_rate' => env('SENTRY_TRACES_SAMPLE_RATE') === null ? null : (float) env('SENTRY_TRACES_SAMPLE_RATE'),
-
- // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#profiles-sample-rate
- 'profiles_sample_rate' => env('SENTRY_PROFILES_SAMPLE_RATE') === null ? null : (float) env('SENTRY_PROFILES_SAMPLE_RATE'),
-
- // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#enable_logs
- 'enable_logs' => env('SENTRY_ENABLE_LOGS', false),
-
- // The minimum log level that will be sent to Sentry as logs using the `sentry_logs` logging channel
- 'logs_channel_level' => env('SENTRY_LOG_LEVEL', env('SENTRY_LOGS_LEVEL', env('LOG_LEVEL', 'debug'))),
-
- // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#send_default_pii
- 'send_default_pii' => env('SENTRY_SEND_DEFAULT_PII', false),
-
- // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#ignore_exceptions
- // 'ignore_exceptions' => [],
-
- // @see: https://docs.sentry.io/platforms/php/guides/laravel/configuration/options/#ignore_transactions
- 'ignore_transactions' => [
- // Ignore Laravel's default health URL
- '/up',
- ],
-
- // Breadcrumb specific configuration
- 'breadcrumbs' => [
- // Capture Laravel logs as breadcrumbs
- 'logs' => env('SENTRY_BREADCRUMBS_LOGS_ENABLED', true),
-
- // Capture Laravel cache events (hits, writes etc.) as breadcrumbs
- 'cache' => env('SENTRY_BREADCRUMBS_CACHE_ENABLED', true),
-
- // Capture Livewire components like routes as breadcrumbs
- 'admin' => env('SENTRY_BREADCRUMBS_LIVEWIRE_ENABLED', true),
-
- // Capture SQL queries as breadcrumbs
- 'sql_queries' => env('SENTRY_BREADCRUMBS_SQL_QUERIES_ENABLED', true),
-
- // Capture SQL query bindings (parameters) in SQL query breadcrumbs
- 'sql_bindings' => env('SENTRY_BREADCRUMBS_SQL_BINDINGS_ENABLED', false),
-
- // Capture queue job information as breadcrumbs
- 'queue_info' => env('SENTRY_BREADCRUMBS_QUEUE_INFO_ENABLED', true),
-
- // Capture command information as breadcrumbs
- 'command_info' => env('SENTRY_BREADCRUMBS_COMMAND_JOBS_ENABLED', true),
-
- // Capture HTTP client request information as breadcrumbs
- 'http_client_requests' => env('SENTRY_BREADCRUMBS_HTTP_CLIENT_REQUESTS_ENABLED', true),
-
- // Capture send notifications as breadcrumbs
- 'notifications' => env('SENTRY_BREADCRUMBS_NOTIFICATIONS_ENABLED', true),
- ],
-
- // Performance monitoring specific configuration
- 'tracing' => [
- // Trace queue jobs as their own transactions (this enables tracing for queue jobs)
- 'queue_job_transactions' => env('SENTRY_TRACE_QUEUE_ENABLED', true),
-
- // Capture queue jobs as spans when executed on the sync driver
- 'queue_jobs' => env('SENTRY_TRACE_QUEUE_JOBS_ENABLED', true),
-
- // Capture SQL queries as spans
- 'sql_queries' => env('SENTRY_TRACE_SQL_QUERIES_ENABLED', true),
-
- // Capture SQL query bindings (parameters) in SQL query spans
- 'sql_bindings' => env('SENTRY_TRACE_SQL_BINDINGS_ENABLED', false),
-
- // Capture where the SQL query originated from on the SQL query spans
- 'sql_origin' => env('SENTRY_TRACE_SQL_ORIGIN_ENABLED', true),
-
- // Define a threshold in milliseconds for SQL queries to resolve their origin
- 'sql_origin_threshold_ms' => env('SENTRY_TRACE_SQL_ORIGIN_THRESHOLD_MS', 100),
-
- // Capture views rendered as spans
- 'views' => env('SENTRY_TRACE_VIEWS_ENABLED', true),
-
- // Capture Livewire components as spans
- 'admin' => env('SENTRY_TRACE_LIVEWIRE_ENABLED', true),
-
- // Capture HTTP client requests as spans
- 'http_client_requests' => env('SENTRY_TRACE_HTTP_CLIENT_REQUESTS_ENABLED', true),
-
- // Capture Laravel cache events (hits, writes etc.) as spans
- 'cache' => env('SENTRY_TRACE_CACHE_ENABLED', true),
-
- // Capture Redis operations as spans (this enables Redis events in Laravel)
- 'redis_commands' => env('SENTRY_TRACE_REDIS_COMMANDS', false),
-
- // Capture where the Redis command originated from on the Redis command spans
- 'redis_origin' => env('SENTRY_TRACE_REDIS_ORIGIN_ENABLED', true),
-
- // Capture send notifications as spans
- 'notifications' => env('SENTRY_TRACE_NOTIFICATIONS_ENABLED', true),
-
- // Enable tracing for requests without a matching route (404's)
- 'missing_routes' => env('SENTRY_TRACE_MISSING_ROUTES_ENABLED', false),
-
- // Configures if the performance trace should continue after the response has been sent to the user until the application terminates
- // This is required to capture any spans that are created after the response has been sent like queue jobs dispatched using `dispatch(...)->afterResponse()` for example
- 'continue_after_response' => env('SENTRY_TRACE_CONTINUE_AFTER_RESPONSE', true),
-
- // Enable the tracing integrations supplied by Sentry (recommended)
- 'default_integrations' => env('SENTRY_TRACE_DEFAULT_INTEGRATIONS_ENABLED', true),
- ],
-
-];
diff --git a/resources/views/vendor/mail/html/button.blade.php b/resources/views/vendor/mail/html/button.blade.php
deleted file mode 100644
index 050e969..0000000
--- a/resources/views/vendor/mail/html/button.blade.php
+++ /dev/null
@@ -1,24 +0,0 @@
-@props([
- 'url',
- 'color' => 'primary',
- 'align' => 'center',
-])
-
diff --git a/resources/views/vendor/mail/html/footer.blade.php b/resources/views/vendor/mail/html/footer.blade.php
deleted file mode 100644
index 3ff41f8..0000000
--- a/resources/views/vendor/mail/html/footer.blade.php
+++ /dev/null
@@ -1,11 +0,0 @@
-
-|
-
- |
-
diff --git a/resources/views/vendor/mail/html/header.blade.php b/resources/views/vendor/mail/html/header.blade.php
deleted file mode 100644
index 479cf67..0000000
--- a/resources/views/vendor/mail/html/header.blade.php
+++ /dev/null
@@ -1,12 +0,0 @@
-@props(['url'])
-
-
-
diff --git a/resources/views/vendor/mail/html/layout.blade.php b/resources/views/vendor/mail/html/layout.blade.php
deleted file mode 100644
index 037efe3..0000000
--- a/resources/views/vendor/mail/html/layout.blade.php
+++ /dev/null
@@ -1,58 +0,0 @@
-
-
-
-{{ config('app.name') }}
-
-
-
-
-
-{!! $head ?? '' !!}
-
-
-
-
-
-
-
-{!! $header ?? '' !!}
-
-
-
-
-
-
-
-|
-{!! Illuminate\Mail\Markdown::parse($slot) !!}
-
-{!! $subcopy ?? '' !!}
- |
-
-
- |
-
-
-{!! $footer ?? '' !!}
-
- |
-
-
-
-
diff --git a/resources/views/vendor/mail/html/message.blade.php b/resources/views/vendor/mail/html/message.blade.php
deleted file mode 100644
index a16bace..0000000
--- a/resources/views/vendor/mail/html/message.blade.php
+++ /dev/null
@@ -1,27 +0,0 @@
-
-{{-- Header --}}
-
-
-{{ config('app.name') }}
-
-
-
-{{-- Body --}}
-{!! $slot !!}
-
-{{-- Subcopy --}}
-@isset($subcopy)
-
-
-{!! $subcopy !!}
-
-
-@endisset
-
-{{-- Footer --}}
-
-
-© {{ date('Y') }} {{ config('app.name') }}. {{ __('All rights reserved.') }}
-
-
-
diff --git a/resources/views/vendor/mail/html/panel.blade.php b/resources/views/vendor/mail/html/panel.blade.php
deleted file mode 100644
index 2975a60..0000000
--- a/resources/views/vendor/mail/html/panel.blade.php
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-|
-{{ Illuminate\Mail\Markdown::parse($slot) }}
- |
-
-
- |
-
-
-
diff --git a/resources/views/vendor/mail/html/subcopy.blade.php b/resources/views/vendor/mail/html/subcopy.blade.php
deleted file mode 100644
index 790ce6c..0000000
--- a/resources/views/vendor/mail/html/subcopy.blade.php
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-|
-{{ Illuminate\Mail\Markdown::parse($slot) }}
- |
-
-
diff --git a/resources/views/vendor/mail/html/table.blade.php b/resources/views/vendor/mail/html/table.blade.php
deleted file mode 100644
index a5f3348..0000000
--- a/resources/views/vendor/mail/html/table.blade.php
+++ /dev/null
@@ -1,3 +0,0 @@
-
-{{ Illuminate\Mail\Markdown::parse($slot) }}
-
diff --git a/resources/views/vendor/mail/html/themes/default.css b/resources/views/vendor/mail/html/themes/default.css
deleted file mode 100644
index 80465b2..0000000
--- a/resources/views/vendor/mail/html/themes/default.css
+++ /dev/null
@@ -1,297 +0,0 @@
-/* Base */
-
-body,
-body *:not(html):not(style):not(br):not(tr):not(code) {
- box-sizing: border-box;
- font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif,
- 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
- position: relative;
-}
-
-body {
- -webkit-text-size-adjust: none;
- background-color: #ffffff;
- color: #52525b;
- height: 100%;
- line-height: 1.4;
- margin: 0;
- padding: 0;
- width: 100% !important;
-}
-
-p,
-ul,
-ol,
-blockquote {
- line-height: 1.4;
- text-align: left;
-}
-
-a {
- color: #18181b;
-}
-
-a img {
- border: none;
-}
-
-/* Typography */
-
-h1 {
- color: #18181b;
- font-size: 18px;
- font-weight: bold;
- margin-top: 0;
- text-align: left;
-}
-
-h2 {
- font-size: 16px;
- font-weight: bold;
- margin-top: 0;
- text-align: left;
-}
-
-h3 {
- font-size: 14px;
- font-weight: bold;
- margin-top: 0;
- text-align: left;
-}
-
-p {
- font-size: 16px;
- line-height: 1.5em;
- margin-top: 0;
- text-align: left;
-}
-
-p.sub {
- font-size: 12px;
-}
-
-img {
- max-width: 100%;
-}
-
-/* Layout */
-
-.wrapper {
- -premailer-cellpadding: 0;
- -premailer-cellspacing: 0;
- -premailer-width: 100%;
- background-color: #fafafa;
- margin: 0;
- padding: 0;
- width: 100%;
-}
-
-.content {
- -premailer-cellpadding: 0;
- -premailer-cellspacing: 0;
- -premailer-width: 100%;
- margin: 0;
- padding: 0;
- width: 100%;
-}
-
-/* Header */
-
-.header {
- padding: 25px 0;
- text-align: center;
-}
-
-.header a {
- color: #18181b;
- font-size: 19px;
- font-weight: bold;
- text-decoration: none;
-}
-
-/* Logo */
-
-.logo {
- height: 75px;
- margin-top: 15px;
- margin-bottom: 10px;
- max-height: 75px;
- width: 75px;
-}
-
-/* Body */
-
-.body {
- -premailer-cellpadding: 0;
- -premailer-cellspacing: 0;
- -premailer-width: 100%;
- background-color: #fafafa;
- border-bottom: 1px solid #fafafa;
- border-top: 1px solid #fafafa;
- margin: 0;
- padding: 0;
- width: 100%;
-}
-
-.inner-body {
- -premailer-cellpadding: 0;
- -premailer-cellspacing: 0;
- -premailer-width: 570px;
- background-color: #ffffff;
- border-color: #e4e4e7;
- border-radius: 4px;
- border-width: 1px;
- box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
- margin: 0 auto;
- padding: 0;
- width: 570px;
-}
-
-.inner-body a {
- word-break: break-all;
-}
-
-/* Subcopy */
-
-.subcopy {
- border-top: 1px solid #e4e4e7;
- margin-top: 25px;
- padding-top: 25px;
-}
-
-.subcopy p {
- font-size: 14px;
-}
-
-/* Footer */
-
-.footer {
- -premailer-cellpadding: 0;
- -premailer-cellspacing: 0;
- -premailer-width: 570px;
- margin: 0 auto;
- padding: 0;
- text-align: center;
- width: 570px;
-}
-
-.footer p {
- color: #a1a1aa;
- font-size: 12px;
- text-align: center;
-}
-
-.footer a {
- color: #a1a1aa;
- text-decoration: underline;
-}
-
-/* Tables */
-
-.table table {
- -premailer-cellpadding: 0;
- -premailer-cellspacing: 0;
- -premailer-width: 100%;
- margin: 30px auto;
- width: 100%;
-}
-
-.table th {
- border-bottom: 1px solid #e4e4e7;
- margin: 0;
- padding-bottom: 8px;
-}
-
-.table td {
- color: #52525b;
- font-size: 15px;
- line-height: 18px;
- margin: 0;
- padding: 10px 0;
-}
-
-.content-cell {
- max-width: 100vw;
- padding: 32px;
-}
-
-/* Buttons */
-
-.action {
- -premailer-cellpadding: 0;
- -premailer-cellspacing: 0;
- -premailer-width: 100%;
- margin: 30px auto;
- padding: 0;
- text-align: center;
- width: 100%;
- float: unset;
-}
-
-.button {
- -webkit-text-size-adjust: none;
- border-radius: 4px;
- color: #fff;
- display: inline-block;
- overflow: hidden;
- text-decoration: none;
-}
-
-.button-blue,
-.button-primary {
- background-color: #18181b;
- border-bottom: 8px solid #18181b;
- border-left: 18px solid #18181b;
- border-right: 18px solid #18181b;
- border-top: 8px solid #18181b;
-}
-
-.button-green,
-.button-success {
- background-color: #16a34a;
- border-bottom: 8px solid #16a34a;
- border-left: 18px solid #16a34a;
- border-right: 18px solid #16a34a;
- border-top: 8px solid #16a34a;
-}
-
-.button-red,
-.button-error {
- background-color: #dc2626;
- border-bottom: 8px solid #dc2626;
- border-left: 18px solid #dc2626;
- border-right: 18px solid #dc2626;
- border-top: 8px solid #dc2626;
-}
-
-/* Panels */
-
-.panel {
- border-left: #18181b solid 4px;
- margin: 21px 0;
-}
-
-.panel-content {
- background-color: #fafafa;
- color: #52525b;
- padding: 16px;
-}
-
-.panel-content p {
- color: #52525b;
-}
-
-.panel-item {
- padding: 0;
-}
-
-.panel-item p:last-of-type {
- margin-bottom: 0;
- padding-bottom: 0;
-}
-
-/* Utilities */
-
-.break-all {
- word-break: break-all;
-}
diff --git a/resources/views/vendor/mail/text/button.blade.php b/resources/views/vendor/mail/text/button.blade.php
deleted file mode 100644
index 97444eb..0000000
--- a/resources/views/vendor/mail/text/button.blade.php
+++ /dev/null
@@ -1 +0,0 @@
-{{ $slot }}: {{ $url }}
diff --git a/resources/views/vendor/mail/text/footer.blade.php b/resources/views/vendor/mail/text/footer.blade.php
deleted file mode 100644
index 3338f62..0000000
--- a/resources/views/vendor/mail/text/footer.blade.php
+++ /dev/null
@@ -1 +0,0 @@
-{{ $slot }}
diff --git a/resources/views/vendor/mail/text/header.blade.php b/resources/views/vendor/mail/text/header.blade.php
deleted file mode 100644
index 97444eb..0000000
--- a/resources/views/vendor/mail/text/header.blade.php
+++ /dev/null
@@ -1 +0,0 @@
-{{ $slot }}: {{ $url }}
diff --git a/resources/views/vendor/mail/text/layout.blade.php b/resources/views/vendor/mail/text/layout.blade.php
deleted file mode 100644
index ec58e83..0000000
--- a/resources/views/vendor/mail/text/layout.blade.php
+++ /dev/null
@@ -1,9 +0,0 @@
-{!! strip_tags($header ?? '') !!}
-
-{!! strip_tags($slot) !!}
-@isset($subcopy)
-
-{!! strip_tags($subcopy) !!}
-@endisset
-
-{!! strip_tags($footer ?? '') !!}
diff --git a/resources/views/vendor/mail/text/message.blade.php b/resources/views/vendor/mail/text/message.blade.php
deleted file mode 100644
index 80bce21..0000000
--- a/resources/views/vendor/mail/text/message.blade.php
+++ /dev/null
@@ -1,27 +0,0 @@
-
- {{-- Header --}}
-
-
- {{ config('app.name') }}
-
-
-
- {{-- Body --}}
- {{ $slot }}
-
- {{-- Subcopy --}}
- @isset($subcopy)
-
-
- {{ $subcopy }}
-
-
- @endisset
-
- {{-- Footer --}}
-
-
- © {{ date('Y') }} {{ config('app.name') }}. @lang('All rights reserved.')
-
-
-
diff --git a/resources/views/vendor/mail/text/panel.blade.php b/resources/views/vendor/mail/text/panel.blade.php
deleted file mode 100644
index 3338f62..0000000
--- a/resources/views/vendor/mail/text/panel.blade.php
+++ /dev/null
@@ -1 +0,0 @@
-{{ $slot }}
diff --git a/resources/views/vendor/mail/text/subcopy.blade.php b/resources/views/vendor/mail/text/subcopy.blade.php
deleted file mode 100644
index 3338f62..0000000
--- a/resources/views/vendor/mail/text/subcopy.blade.php
+++ /dev/null
@@ -1 +0,0 @@
-{{ $slot }}
diff --git a/resources/views/vendor/mail/text/table.blade.php b/resources/views/vendor/mail/text/table.blade.php
deleted file mode 100644
index 3338f62..0000000
--- a/resources/views/vendor/mail/text/table.blade.php
+++ /dev/null
@@ -1 +0,0 @@
-{{ $slot }}