-
Notifications
You must be signed in to change notification settings - Fork 96
Expand file tree
/
Copy pathenv.ts
More file actions
102 lines (87 loc) · 3.99 KB
/
Copy pathenv.ts
File metadata and controls
102 lines (87 loc) · 3.99 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**
* Environment variable validation.
*
* Provides a `validateEnv()` function to call at app startup for required vars,
* and typed accessors for all env vars with sensible defaults.
*/
function optionalEnv(name: string, fallback: string): string {
return process.env[name] || fallback;
}
function booleanEnv(name: string): boolean {
return process.env[name] === 'true';
}
// ─── Stellar / Contract ────────────────────────────────────────────────────────
export const env = {
// Supabase – required at runtime, validated by validateEnv()
NEXT_PUBLIC_SUPABASE_URL: process.env.NEXT_PUBLIC_SUPABASE_URL || '',
NEXT_PUBLIC_SUPABASE_ANON_KEY: process.env.NEXT_PUBLIC_SUPABASE_ANON_KEY || '',
SUPABASE_SERVICE_ROLE_KEY: process.env.SUPABASE_SERVICE_ROLE_KEY || '',
RESEND_API_KEY: process.env.RESEND_API_KEY || '',
CRON_SECRET: process.env.CRON_SECRET || '',
NOTIFICATION_API: process.env.NOTIFICATION_API || '',
INDEXER_URL: process.env.INDEXER_URL || '',
// Stellar / Contract – have testnet defaults in constants.ts but validated here
NEXT_PUBLIC_CONTRACT_ID: optionalEnv(
'NEXT_PUBLIC_CONTRACT_ID',
'CD3TE3IAHM737P236XZL2OYU275ZKD6MN7YH7PYYAXYIGEH55OPEWYJC'
),
NEXT_PUBLIC_NETWORK_PASSPHRASE: optionalEnv(
'NEXT_PUBLIC_NETWORK_PASSPHRASE',
'Test SDF Network ; September 2015'
),
NEXT_PUBLIC_RPC_URL: optionalEnv('NEXT_PUBLIC_RPC_URL', 'https://soroban-testnet.stellar.org'),
NEXT_PUBLIC_NETWORK_NAME: optionalEnv('NEXT_PUBLIC_NETWORK_NAME', 'TESTNET'),
NEXT_PUBLIC_STELLAR_NETWORK: optionalEnv('NEXT_PUBLIC_STELLAR_NETWORK', 'testnet'),
// Tokens
NEXT_PUBLIC_TESTNET_USDC_TOKEN_ID: optionalEnv(
'NEXT_PUBLIC_TESTNET_USDC_TOKEN_ID',
'CCW67TSZV3SSS2HXMBQ5JFGCKJNXKZM7UQUWUZPUTHXSTZLEO7SJMI75'
),
NEXT_PUBLIC_TESTNET_EURC_TOKEN_ID: optionalEnv(
'NEXT_PUBLIC_TESTNET_EURC_TOKEN_ID',
'GDHU6WRG4IEQXM5NZ4BMPKOXHW76MZM4Y2IEMFDVXBSDP6SJY4ITNPP'
),
NEXT_PUBLIC_TESTNET_XLM_TOKEN_ID: optionalEnv('NEXT_PUBLIC_TESTNET_XLM_TOKEN_ID', 'native-xlm'),
// Feature flags
NEXT_PUBLIC_INSURANCE_POOL_ENABLED: booleanEnv('NEXT_PUBLIC_INSURANCE_POOL_ENABLED'),
NEXT_PUBLIC_ORACLE_ENABLED: booleanEnv('NEXT_PUBLIC_ORACLE_ENABLED'),
NEXT_PUBLIC_NFT_ENABLED: booleanEnv('NEXT_PUBLIC_NFT_ENABLED'),
NEXT_PUBLIC_NFT_CONTRACT_ID: process.env.NEXT_PUBLIC_NFT_CONTRACT_ID || '',
NEXT_PUBLIC_NFT_METADATA_METHOD: optionalEnv('NEXT_PUBLIC_NFT_METADATA_METHOD', 'token_uri'),
NEXT_PUBLIC_NFT_EVENT_HINTS: process.env.NEXT_PUBLIC_NFT_EVENT_HINTS || '',
// Governance
NEXT_PUBLIC_GOVERNANCE_ADMIN_ADDRESS: optionalEnv(
'NEXT_PUBLIC_GOVERNANCE_ADMIN_ADDRESS',
'GAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAWHF'
),
// Indexer
NEXT_PUBLIC_INDEXER_API_URL: optionalEnv(
'NEXT_PUBLIC_INDEXER_API_URL',
'https://api.iln.example.com'
),
NEXT_PUBLIC_INDEXER_WS_URL: optionalEnv('NEXT_PUBLIC_INDEXER_WS_URL', 'ws://localhost:8080/ws'),
// WalletConnect
NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID: process.env.NEXT_PUBLIC_WALLETCONNECT_PROJECT_ID || '',
// App
NEXT_PUBLIC_APP_URL: optionalEnv('NEXT_PUBLIC_APP_URL', 'https://app.iln.finance'),
// GitHub (feedback API)
GITHUB_TOKEN: process.env.GITHUB_TOKEN || '',
GITHUB_OWNER: process.env.GITHUB_OWNER || '',
GITHUB_REPO: process.env.GITHUB_REPO || '',
} as const;
/**
* Validate that all required env vars are present.
* Call once at app startup (e.g. in `src/app/layout.tsx` or a server component).
* Throws a descriptive error listing every missing variable.
*/
export function validateEnv(): void {
const required = ['NEXT_PUBLIC_SUPABASE_URL', 'NEXT_PUBLIC_SUPABASE_ANON_KEY'] as const;
const missing = required.filter((name) => !process.env[name]);
if (missing.length > 0) {
throw new Error(
`Missing required environment variables:\n` +
missing.map((n) => ` - ${n}`).join('\n') +
'\nAdd them to .env.local (see .env.local.example).'
);
}
}