fix: dual bot token auth + P2P UI logic fixes

- All 17 edge functions now check both TELEGRAM_BOT_TOKEN and
  TELEGRAM_BOT_TOKEN_KRD for session verification
- Add perPage:1000 to listUsers calls to prevent pagination issues
- Fix offer button label: Buy tab shows "Al" (green), Sell tab shows "Sat" (red)
- Fix active tab highlight with cyan color for visibility
- Fix modal transparency (add --card CSS variable)
- Fix withdraw tab sync (useEffect on modal open)
This commit is contained in:
2026-02-27 00:53:52 +03:00
parent b67809481e
commit 910610491f
24 changed files with 237 additions and 88 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "pezkuwi-telegram-miniapp", "name": "pezkuwi-telegram-miniapp",
"version": "1.0.227", "version": "1.0.228",
"type": "module", "type": "module",
"description": "Pezkuwichain Telegram Mini App - Forum, Announcements, Rewards", "description": "Pezkuwichain Telegram Mini App - Forum, Announcements, Rewards",
"author": "Pezkuwichain Team", "author": "Pezkuwichain Team",
+9 -2
View File
@@ -1,4 +1,4 @@
import { useState } from 'react'; import { useState, useEffect } from 'react';
import { import {
X, X,
ArrowDownToLine, ArrowDownToLine,
@@ -51,6 +51,13 @@ export function DepositWithdrawModal({
const [activeTab, setActiveTab] = useState<'deposit' | 'withdraw'>(initialTab); const [activeTab, setActiveTab] = useState<'deposit' | 'withdraw'>(initialTab);
// Sync tab when modal opens with a different initialTab
useEffect(() => {
if (isOpen) {
setActiveTab(initialTab);
}
}, [isOpen, initialTab]);
// Deposit state // Deposit state
const [depositToken, setDepositToken] = useState<'HEZ' | 'PEZ'>('HEZ'); const [depositToken, setDepositToken] = useState<'HEZ' | 'PEZ'>('HEZ');
const [depositAmount, setDepositAmount] = useState(''); const [depositAmount, setDepositAmount] = useState('');
@@ -231,7 +238,7 @@ export function DepositWithdrawModal({
{/* Modal */} {/* Modal */}
<div <div
className={cn( className={cn(
'relative w-full max-w-md max-h-[90vh] bg-card rounded-t-2xl sm:rounded-2xl border border-border overflow-y-auto', 'relative w-full max-w-md max-h-[90vh] bg-card rounded-t-2xl sm:rounded-2xl border border-border overflow-y-auto shadow-2xl',
isRTL && 'direction-rtl' isRTL && 'direction-rtl'
)} )}
dir={isRTL ? 'rtl' : 'ltr'} dir={isRTL ? 'rtl' : 'ltr'}
+2 -2
View File
@@ -163,12 +163,12 @@ export function OfferList({ adType, onAcceptOffer }: OfferListProps) {
onClick={() => handleAccept(offer)} onClick={() => handleAccept(offer)}
className={cn( className={cn(
'px-3 py-1.5 text-xs font-medium rounded-lg transition-colors', 'px-3 py-1.5 text-xs font-medium rounded-lg transition-colors',
adType === 'buy' adType === 'sell'
? 'bg-green-500 hover:bg-green-600 text-white' ? 'bg-green-500 hover:bg-green-600 text-white'
: 'bg-red-500 hover:bg-red-600 text-white' : 'bg-red-500 hover:bg-red-600 text-white'
)} )}
> >
{adType === 'buy' ? t('p2p.buy') : t('p2p.sell')} {adType === 'sell' ? t('p2p.buy') : t('p2p.sell')}
</button> </button>
</div> </div>
</div> </div>
+2
View File
@@ -14,6 +14,8 @@
--muted-foreground: 215 20.2% 65.1%; --muted-foreground: 215 20.2% 65.1%;
--accent: 217.2 32.6% 17.5%; --accent: 217.2 32.6% 17.5%;
--accent-foreground: 210 40% 98%; --accent-foreground: 210 40% 98%;
--card: 222.2 84% 6.5%;
--card-foreground: 210 40% 98%;
--border: 217.2 32.6% 17.5%; --border: 217.2 32.6% 17.5%;
--radius: 0.75rem; --radius: 0.75rem;
} }
+1 -1
View File
@@ -195,7 +195,7 @@ export function P2PSection() {
onClick={() => handleTabChange(tab.id)} onClick={() => handleTabChange(tab.id)}
className={cn( className={cn(
'flex-1 py-2 text-xs font-medium rounded-lg transition-colors', 'flex-1 py-2 text-xs font-medium rounded-lg transition-colors',
activeTab === tab.id ? 'bg-card text-foreground shadow-sm' : 'text-muted-foreground' activeTab === tab.id ? 'bg-cyan-500/20 text-cyan-400 shadow-sm' : 'text-muted-foreground'
)} )}
> >
{tab.label} {tab.label}
+3 -3
View File
@@ -1,5 +1,5 @@
{ {
"version": "1.0.227", "version": "1.0.228",
"buildTime": "2026-02-26T17:26:18.861Z", "buildTime": "2026-02-26T21:44:34.122Z",
"buildNumber": 1772126778862 "buildNumber": 1772142274123
} }
+14 -6
View File
@@ -95,9 +95,13 @@ serve(async (req) => {
const body: AcceptP2POfferRequest = await req.json(); const body: AcceptP2POfferRequest = await req.json();
const { sessionToken, offerId, amount, buyerWallet } = body; const { sessionToken, offerId, amount, buyerWallet } = body;
// Get bot token for session verification // Get bot tokens for session verification (dual bot support)
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
if (!botToken) { const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
@@ -112,7 +116,11 @@ serve(async (req) => {
}); });
} }
const telegramId = verifySessionToken(sessionToken, botToken); let telegramId: number | null = null;
for (const bt of botTokens) {
telegramId = verifySessionToken(sessionToken, bt);
if (telegramId) break;
}
if (!telegramId) { if (!telegramId) {
return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), {
status: 401, status: 401,
@@ -144,8 +152,8 @@ serve(async (req) => {
const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`;
const { const {
data: { users: authUsers }, data: { users: authUsers },
} = await supabase.auth.admin.listUsers(); } = await supabase.auth.admin.listUsers({ perPage: 1000 });
const authUser = authUsers?.find((u) => u.email === telegramEmail); const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail);
if (!authUser) { if (!authUser) {
return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), {
@@ -81,16 +81,24 @@ serve(async (req) => {
const supabaseUrl = Deno.env.get('SUPABASE_URL')!; const supabaseUrl = Deno.env.get('SUPABASE_URL')!;
const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!; const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!;
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (!botToken) { if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
}); });
} }
const telegramUser = validateInitData(initData, botToken); let telegramUser: TelegramUser | null = null;
for (const bt of botTokens) {
telegramUser = validateInitData(initData, bt);
if (telegramUser) break;
}
if (!telegramUser) { if (!telegramUser) {
return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), { return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), {
status: 401, status: 401,
@@ -114,9 +114,13 @@ serve(async (req) => {
adType = 'sell', adType = 'sell',
} = body; } = body;
// Get bot token for session verification // Get bot tokens for session verification (dual bot support)
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
if (!botToken) { const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
@@ -131,7 +135,11 @@ serve(async (req) => {
}); });
} }
const telegramId = verifySessionToken(sessionToken, botToken); let telegramId: number | null = null;
for (const bt of botTokens) {
telegramId = verifySessionToken(sessionToken, bt);
if (telegramId) break;
}
if (!telegramId) { if (!telegramId) {
return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), {
status: 401, status: 401,
@@ -156,8 +164,8 @@ serve(async (req) => {
const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`;
const { const {
data: { users: authUsers }, data: { users: authUsers },
} = await supabase.auth.admin.listUsers(); } = await supabase.auth.admin.listUsers({ perPage: 1000 });
const authUser = authUsers?.find((u) => u.email === telegramEmail); const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail);
if (!authUser) { if (!authUser) {
return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), {
+11 -3
View File
@@ -83,16 +83,24 @@ serve(async (req) => {
const supabaseUrl = Deno.env.get('SUPABASE_URL')!; const supabaseUrl = Deno.env.get('SUPABASE_URL')!;
const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!; const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!;
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (!botToken) { if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
}); });
} }
const telegramUser = validateInitData(initData, botToken); let telegramUser: TelegramUser | null = null;
for (const bt of botTokens) {
telegramUser = validateInitData(initData, bt);
if (telegramUser) break;
}
if (!telegramUser) { if (!telegramUser) {
return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), { return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), {
status: 401, status: 401,
+11 -3
View File
@@ -165,17 +165,25 @@ serve(async (req) => {
const supabaseUrl = Deno.env.get('SUPABASE_URL')!; const supabaseUrl = Deno.env.get('SUPABASE_URL')!;
const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!; const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!;
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
const tronHdMnemonic = Deno.env.get('DEPOSIT_TRON_HD_MNEMONIC'); const tronHdMnemonic = Deno.env.get('DEPOSIT_TRON_HD_MNEMONIC');
if (!botToken) { if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
}); });
} }
const telegramUser = validateInitData(initData, botToken); let telegramUser: TelegramUser | null = null;
for (const bt of botTokens) {
telegramUser = validateInitData(initData, bt);
if (telegramUser) break;
}
if (!telegramUser) { if (!telegramUser) {
return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), { return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), {
status: 401, status: 401,
+11 -3
View File
@@ -74,16 +74,24 @@ serve(async (req) => {
const supabaseUrl = Deno.env.get('SUPABASE_URL')!; const supabaseUrl = Deno.env.get('SUPABASE_URL')!;
const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!; const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!;
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (!botToken) { if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
}); });
} }
const telegramUser = validateInitData(initData, botToken); let telegramUser: TelegramUser | null = null;
for (const bt of botTokens) {
telegramUser = validateInitData(initData, bt);
if (telegramUser) break;
}
if (!telegramUser) { if (!telegramUser) {
return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), { return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), {
status: 401, status: 401,
@@ -93,8 +93,12 @@ serve(async (req) => {
const { sessionToken } = body; const { sessionToken } = body;
// Get bot token for session verification // Get bot token for session verification
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
if (!botToken) { const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
@@ -109,7 +113,11 @@ serve(async (req) => {
}); });
} }
const telegramId = verifySessionToken(sessionToken, botToken); let telegramId: number | null = null;
for (const bt of botTokens) {
telegramId = verifySessionToken(sessionToken, bt);
if (telegramId) break;
}
if (!telegramId) { if (!telegramId) {
return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), {
status: 401, status: 401,
@@ -127,7 +135,7 @@ serve(async (req) => {
const { const {
data: { users: authUsers }, data: { users: authUsers },
} = await supabase.auth.admin.listUsers({ perPage: 1000 }); } = await supabase.auth.admin.listUsers({ perPage: 1000 });
const authUser = authUsers?.find((u) => u.email === telegramEmail); const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail);
if (!authUser) { if (!authUser) {
return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), {
+14 -6
View File
@@ -93,9 +93,13 @@ serve(async (req) => {
const body: GetMyOffersRequest = await req.json(); const body: GetMyOffersRequest = await req.json();
const { sessionToken, status } = body; const { sessionToken, status } = body;
// Get bot token for session verification // Get bot tokens for session verification (dual bot support)
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
if (!botToken) { const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
@@ -110,7 +114,11 @@ serve(async (req) => {
}); });
} }
const telegramId = verifySessionToken(sessionToken, botToken); let telegramId: number | null = null;
for (const bt of botTokens) {
telegramId = verifySessionToken(sessionToken, bt);
if (telegramId) break;
}
if (!telegramId) { if (!telegramId) {
return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), {
status: 401, status: 401,
@@ -127,8 +135,8 @@ serve(async (req) => {
const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`;
const { const {
data: { users: authUsers }, data: { users: authUsers },
} = await supabase.auth.admin.listUsers(); } = await supabase.auth.admin.listUsers({ perPage: 1000 });
const authUser = authUsers?.find((u) => u.email === telegramEmail); const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail);
if (!authUser) { if (!authUser) {
return new Response( return new Response(
+12 -4
View File
@@ -105,8 +105,12 @@ serve(async (req) => {
} = body; } = body;
// Get bot token for session verification // Get bot token for session verification
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
if (!botToken) { const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
@@ -121,7 +125,11 @@ serve(async (req) => {
}); });
} }
const telegramId = verifySessionToken(sessionToken, botToken); let telegramId: number | null = null;
for (const bt of botTokens) {
telegramId = verifySessionToken(sessionToken, bt);
if (telegramId) break;
}
if (!telegramId) { if (!telegramId) {
return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), {
status: 401, status: 401,
@@ -139,7 +147,7 @@ serve(async (req) => {
const { const {
data: { users: authUsers }, data: { users: authUsers },
} = await supabase.auth.admin.listUsers({ perPage: 1000 }); } = await supabase.auth.admin.listUsers({ perPage: 1000 });
const authUser = authUsers?.find((u) => u.email === telegramEmail); const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail);
if (!authUser) { if (!authUser) {
return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), {
+14 -6
View File
@@ -93,9 +93,13 @@ serve(async (req) => {
const body: GetP2PTradesRequest = await req.json(); const body: GetP2PTradesRequest = await req.json();
const { sessionToken, status } = body; const { sessionToken, status } = body;
// Get bot token for session verification // Get bot tokens for session verification (dual bot support)
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
if (!botToken) { const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
@@ -110,7 +114,11 @@ serve(async (req) => {
}); });
} }
const telegramId = verifySessionToken(sessionToken, botToken); let telegramId: number | null = null;
for (const bt of botTokens) {
telegramId = verifySessionToken(sessionToken, bt);
if (telegramId) break;
}
if (!telegramId) { if (!telegramId) {
return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), {
status: 401, status: 401,
@@ -127,8 +135,8 @@ serve(async (req) => {
const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`;
const { const {
data: { users: authUsers }, data: { users: authUsers },
} = await supabase.auth.admin.listUsers(); } = await supabase.auth.admin.listUsers({ perPage: 1000 });
const authUser = authUsers?.find((u) => u.email === telegramEmail); const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail);
if (!authUser) { if (!authUser) {
return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), {
@@ -93,9 +93,13 @@ serve(async (req) => {
const body: GetPaymentMethodsRequest = await req.json(); const body: GetPaymentMethodsRequest = await req.json();
const { sessionToken, currency } = body; const { sessionToken, currency } = body;
// Get bot token for session verification // Get bot tokens for session verification (dual bot support)
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
if (!botToken) { const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
@@ -110,7 +114,11 @@ serve(async (req) => {
}); });
} }
const telegramId = verifySessionToken(sessionToken, botToken); let telegramId: number | null = null;
for (const bt of botTokens) {
telegramId = verifySessionToken(sessionToken, bt);
if (telegramId) break;
}
if (!telegramId) { if (!telegramId) {
return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), {
status: 401, status: 401,
@@ -127,8 +135,8 @@ serve(async (req) => {
const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`;
const { const {
data: { users: authUsers }, data: { users: authUsers },
} = await supabase.auth.admin.listUsers(); } = await supabase.auth.admin.listUsers({ perPage: 1000 });
const authUser = authUsers?.find((u) => u.email === telegramEmail); const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail);
if (!authUser) { if (!authUser) {
return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), {
+14 -6
View File
@@ -99,9 +99,13 @@ serve(async (req) => {
const body: P2PDisputeRequest = await req.json(); const body: P2PDisputeRequest = await req.json();
const { sessionToken, action, tradeId, reason, category, evidenceUrl, evidenceType, description } = body; const { sessionToken, action, tradeId, reason, category, evidenceUrl, evidenceType, description } = body;
// Get bot token for session verification // Get bot tokens for session verification (dual bot support)
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
if (!botToken) { const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
@@ -116,7 +120,11 @@ serve(async (req) => {
}); });
} }
const telegramId = verifySessionToken(sessionToken, botToken); let telegramId: number | null = null;
for (const bt of botTokens) {
telegramId = verifySessionToken(sessionToken, bt);
if (telegramId) break;
}
if (!telegramId) { if (!telegramId) {
return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), {
status: 401, status: 401,
@@ -148,8 +156,8 @@ serve(async (req) => {
const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`;
const { const {
data: { users: authUsers }, data: { users: authUsers },
} = await supabase.auth.admin.listUsers(); } = await supabase.auth.admin.listUsers({ perPage: 1000 });
const authUser = authUsers?.find((u) => u.email === telegramEmail); const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail);
if (!authUser) { if (!authUser) {
return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), {
+14 -6
View File
@@ -95,9 +95,13 @@ serve(async (req) => {
const body: P2PMessagesRequest = await req.json(); const body: P2PMessagesRequest = await req.json();
const { sessionToken, action, tradeId, message } = body; const { sessionToken, action, tradeId, message } = body;
// Get bot token for session verification // Get bot tokens for session verification (dual bot support)
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
if (!botToken) { const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
@@ -112,7 +116,11 @@ serve(async (req) => {
}); });
} }
const telegramId = verifySessionToken(sessionToken, botToken); let telegramId: number | null = null;
for (const bt of botTokens) {
telegramId = verifySessionToken(sessionToken, bt);
if (telegramId) break;
}
if (!telegramId) { if (!telegramId) {
return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), {
status: 401, status: 401,
@@ -144,8 +152,8 @@ serve(async (req) => {
const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`;
const { const {
data: { users: authUsers }, data: { users: authUsers },
} = await supabase.auth.admin.listUsers(); } = await supabase.auth.admin.listUsers({ perPage: 1000 });
const authUser = authUsers?.find((u) => u.email === telegramEmail); const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail);
if (!authUser) { if (!authUser) {
return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), {
@@ -114,9 +114,13 @@ serve(async (req) => {
const { sessionToken, token, amount, walletAddress } = body; const { sessionToken, token, amount, walletAddress } = body;
// Get bot token for session verification // Get bot tokens for session verification (dual bot support)
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
if (!botToken) { const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (botTokens.length === 0) {
return new Response( return new Response(
JSON.stringify({ success: false, error: 'Server configuration error' }), JSON.stringify({ success: false, error: 'Server configuration error' }),
{ status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' } } { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
@@ -131,7 +135,11 @@ serve(async (req) => {
); );
} }
const telegramId = verifySessionToken(sessionToken, botToken); let telegramId: number | null = null;
for (const bt of botTokens) {
telegramId = verifySessionToken(sessionToken, bt);
if (telegramId) break;
}
if (!telegramId) { if (!telegramId) {
return new Response( return new Response(
JSON.stringify({ success: false, error: 'Invalid or expired session token' }), JSON.stringify({ success: false, error: 'Invalid or expired session token' }),
@@ -102,16 +102,24 @@ serve(async (req) => {
const supabaseUrl = Deno.env.get('SUPABASE_URL')!; const supabaseUrl = Deno.env.get('SUPABASE_URL')!;
const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!; const supabaseServiceKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY')!;
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (!botToken) { if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
}); });
} }
const telegramUser = validateInitData(initData, botToken); let telegramUser: TelegramUser | null = null;
for (const bt of botTokens) {
telegramUser = validateInitData(initData, bt);
if (telegramUser) break;
}
if (!telegramUser) { if (!telegramUser) {
return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), { return new Response(JSON.stringify({ error: 'Invalid Telegram data' }), {
status: 401, status: 401,
+14 -6
View File
@@ -99,9 +99,13 @@ serve(async (req) => {
const body: TradeActionRequest = await req.json(); const body: TradeActionRequest = await req.json();
const { sessionToken, tradeId, action, payload } = body; const { sessionToken, tradeId, action, payload } = body;
// Get bot token for session verification // Get bot tokens for session verification (dual bot support)
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
if (!botToken) { const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (botTokens.length === 0) {
return new Response(JSON.stringify({ error: 'Server configuration error' }), { return new Response(JSON.stringify({ error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
@@ -116,7 +120,11 @@ serve(async (req) => {
}); });
} }
const telegramId = verifySessionToken(sessionToken, botToken); let telegramId: number | null = null;
for (const bt of botTokens) {
telegramId = verifySessionToken(sessionToken, bt);
if (telegramId) break;
}
if (!telegramId) { if (!telegramId) {
return new Response(JSON.stringify({ error: 'Invalid or expired session' }), { return new Response(JSON.stringify({ error: 'Invalid or expired session' }), {
status: 401, status: 401,
@@ -149,8 +157,8 @@ serve(async (req) => {
const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`; const telegramEmail = `telegram_${telegramId}@pezkuwichain.io`;
const { const {
data: { users: authUsers }, data: { users: authUsers },
} = await supabase.auth.admin.listUsers(); } = await supabase.auth.admin.listUsers({ perPage: 1000 });
const authUser = authUsers?.find((u) => u.email === telegramEmail); const authUser = authUsers?.find((u: { email?: string }) => u.email === telegramEmail);
if (!authUser) { if (!authUser) {
return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), { return new Response(JSON.stringify({ error: 'User not found. Please authenticate first.' }), {
@@ -318,9 +318,13 @@ serve(async (req) => {
} }
const { sessionToken, txHash, token, expectedAmount, blockNumber } = body; const { sessionToken, txHash, token, expectedAmount, blockNumber } = body;
// Get bot token for session verification // Get bot tokens for session verification (dual bot support)
const botToken = Deno.env.get('TELEGRAM_BOT_TOKEN'); const botTokens: string[] = [];
if (!botToken) { const _mainToken = Deno.env.get('TELEGRAM_BOT_TOKEN');
const _krdToken = Deno.env.get('TELEGRAM_BOT_TOKEN_KRD');
if (_mainToken) botTokens.push(_mainToken);
if (_krdToken) botTokens.push(_krdToken);
if (botTokens.length === 0) {
return new Response(JSON.stringify({ success: false, error: 'Server configuration error' }), { return new Response(JSON.stringify({ success: false, error: 'Server configuration error' }), {
status: 500, status: 500,
headers: { ...corsHeaders, 'Content-Type': 'application/json' }, headers: { ...corsHeaders, 'Content-Type': 'application/json' },
@@ -335,7 +339,11 @@ serve(async (req) => {
}); });
} }
const telegramId = verifySessionToken(sessionToken, botToken); let telegramId: number | null = null;
for (const bt of botTokens) {
telegramId = verifySessionToken(sessionToken, bt);
if (telegramId) break;
}
if (!telegramId) { if (!telegramId) {
return new Response( return new Response(
JSON.stringify({ success: false, error: 'Invalid or expired session token' }), JSON.stringify({ success: false, error: 'Invalid or expired session token' }),
+4
View File
@@ -24,6 +24,10 @@ export default {
DEFAULT: 'hsl(var(--accent))', DEFAULT: 'hsl(var(--accent))',
foreground: 'hsl(var(--accent-foreground))', foreground: 'hsl(var(--accent-foreground))',
}, },
card: {
DEFAULT: 'hsl(var(--card))',
foreground: 'hsl(var(--card-foreground))',
},
}, },
borderRadius: { borderRadius: {
lg: 'var(--radius)', lg: 'var(--radius)',