ваше сообщение коммита

This commit is contained in:
2025-04-21 11:12:11 +03:00
parent 16c3534239
commit fda664f5af
4 changed files with 307 additions and 28 deletions

View File

@@ -31,6 +31,10 @@ nano frontend/.env
3. Запустите скрипт установки: 3. Запустите скрипт установки:
```bash ```bash
./setup.sh ./setup.sh
4. Выполните миграции изнутри контейнера backend:
```
docker exec dapp-backend yarn migrate
``` ```
Скрипт автоматически: Скрипт автоматически:

View File

@@ -0,0 +1,165 @@
{"level":"error","message":"Error launching Telegram bot: 401: Bot Token is required","on":{},"response":{"description":"Bot Token is required","error_code":401},"stack":"Error: 401: Bot Token is required\n at Telegram.callApi (/app/node_modules/telegraf/lib/core/network/client.js:290:19)\n at Telegram.getMe (/app/node_modules/telegraf/lib/telegram.js:17:21)\n at Telegraf.launch (/app/node_modules/telegraf/lib/telegraf.js:188:98)\n at getBot (/app/services/telegramBot.js:167:23)\n at initServices (/app/server.js:35:13)\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async Server.<anonymous> (/app/server.js:94:5)","timestamp":"2025-04-21T07:51:39.303Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T07:51:44.405Z"}
{"level":"info","message":"Session saved successfully","timestamp":"2025-04-21T07:51:44.411Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T07:51:44.436Z"}
{"level":"info","message":"Session saved successfully","timestamp":"2025-04-21T07:51:44.441Z"}
{"level":"info","message":"POST /api/chat/guest-message","timestamp":"2025-04-21T07:51:47.198Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T07:51:52.648Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T07:51:52.671Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T07:51:52.691Z"}
{"level":"info","message":"GET /api/auth/nonce?address=0xF45aa4917b3775bA37f48Aeb3dc1a943561e9e0B","timestamp":"2025-04-21T07:52:01.008Z"}
{"level":"info","message":"Nonce fca7792b319519564c35076fb9cf2347 сохранен для адреса 0xF45aa4917b3775bA37f48Aeb3dc1a943561e9e0B","timestamp":"2025-04-21T07:52:01.017Z"}
{"level":"info","message":"POST /api/auth/verify","timestamp":"2025-04-21T07:52:02.948Z"}
{"level":"info","message":"[verify] Verifying signature for address: 0xF45aa4917b3775bA37f48Aeb3dc1a943561e9e0B","timestamp":"2025-04-21T07:52:02.949Z"}
{"level":"info","message":"[verify] Found or created user 1 for wallet 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","timestamp":"2025-04-21T07:52:03.049Z"}
{"level":"info","message":"[IdentityService] Converting guest identity for user 1 to guest_user_mapping: 1745221905698-9rejq7xoe","timestamp":"2025-04-21T07:52:03.050Z"}
{"level":"info","message":"Checking admin tokens for address: 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","timestamp":"2025-04-21T07:52:03.057Z"}
{"level":"info","message":"Checking admin role for address: 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","timestamp":"2025-04-21T07:52:03.058Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xd95a45fc46a7300e6022885afec3d618d7d3f27c","error":"","level":"error","message":"Error checking balance in eth:","timestamp":"2025-04-21T07:52:03.088Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x4B294265720B09ca39BFBA18c7E368413c0f68eB","error":"","level":"error","message":"Error checking balance in bsc:","timestamp":"2025-04-21T07:52:03.090Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xdce769b847a0a697239777d0b1c7dd33b6012ba0","error":"","level":"error","message":"Error checking balance in arbitrum:","timestamp":"2025-04-21T07:52:03.091Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x351f59de4fedbdf7601f5592b93db3b9330c1c1d","error":"","level":"error","message":"Error checking balance in polygon:","timestamp":"2025-04-21T07:52:03.092Z"}
{"level":"info","message":"Admin role denied - no tokens found for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","timestamp":"2025-04-21T07:52:03.094Z"}
{"level":"info","message":"Session saved successfully","timestamp":"2025-04-21T07:52:03.099Z"}
{"level":"info","message":"[linkGuestMessages] Starting for user 1 with guestId=1745221905698-9rejq7xoe, previousGuestId=undefined","timestamp":"2025-04-21T07:52:03.100Z"}
{"level":"info","message":"[processGuestMessagesWrapper] Processing messages: userId=1, guestId=1745221905698-9rejq7xoe","timestamp":"2025-04-21T07:52:03.105Z"}
{"level":"info","message":"[processGuestMessagesWrapper] Processing messages: userId=1, guestId=1745079293895-f5bi3mnlq","timestamp":"2025-04-21T07:52:28.397Z"}
{"level":"info","message":"[processGuestMessagesWrapper] Processing messages: userId=1, guestId=06a8da2f6b8ccb05be8606d6f5785c3e","timestamp":"2025-04-21T07:52:28.401Z"}
{"level":"info","message":"[processGuestMessagesWrapper] Processing messages: userId=1, guestId=1745098219233-r5wj2olz0","timestamp":"2025-04-21T07:52:28.404Z"}
{"level":"info","message":"[processGuestMessagesWrapper] Processing messages: userId=1, guestId=784e89fbeba721cf5c3dda2267d9ddd5","timestamp":"2025-04-21T07:52:28.409Z"}
{"level":"info","message":"Session saved successfully","timestamp":"2025-04-21T07:52:28.416Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T07:52:28.429Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:52:28.433Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T07:52:28.454Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:52:28.457Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T07:52:28.477Z"}
{"level":"info","message":"GET /api/tokens/balances","timestamp":"2025-04-21T07:52:28.484Z"}
{"level":"info","message":"Fetching token balances for address: 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","timestamp":"2025-04-21T07:52:28.486Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:52:28.489Z"}
{"level":"info","message":"POST /api/auth/link-guest-messages","timestamp":"2025-04-21T07:52:28.496Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xd95a45fc46a7300e6022885afec3d618d7d3f27c","error":"Unknown error","level":"error","message":"Error getting balance for eth:","timestamp":"2025-04-21T07:52:28.505Z"}
{"level":"info","message":"POST /api/auth/link-guest-messages","timestamp":"2025-04-21T07:52:28.510Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x4B294265720B09ca39BFBA18c7E368413c0f68eB","error":"Unknown error","level":"error","message":"Error getting balance for bsc:","timestamp":"2025-04-21T07:52:28.521Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xdce769b847a0a697239777d0b1c7dd33b6012ba0","error":"Unknown error","level":"error","message":"Error getting balance for arbitrum:","timestamp":"2025-04-21T07:52:28.534Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x351f59de4fedbdf7601f5592b93db3b9330c1c1d","error":"Unknown error","level":"error","message":"Error getting balance for polygon:","timestamp":"2025-04-21T07:52:28.548Z"}
{"arbitrum":"0","bsc":"0","eth":"0","level":"info","message":"Token balances fetched for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b:","polygon":"0","timestamp":"2025-04-21T07:52:28.549Z"}
{"level":"info","message":"GET /api/tokens/balances","timestamp":"2025-04-21T07:52:28.557Z"}
{"level":"info","message":"Fetching token balances for address: 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","timestamp":"2025-04-21T07:52:28.559Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xd95a45fc46a7300e6022885afec3d618d7d3f27c","error":"Unknown error","level":"error","message":"Error getting balance for eth:","timestamp":"2025-04-21T07:52:28.574Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x4B294265720B09ca39BFBA18c7E368413c0f68eB","error":"Unknown error","level":"error","message":"Error getting balance for bsc:","timestamp":"2025-04-21T07:52:28.589Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xdce769b847a0a697239777d0b1c7dd33b6012ba0","error":"Unknown error","level":"error","message":"Error getting balance for arbitrum:","timestamp":"2025-04-21T07:52:28.603Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x351f59de4fedbdf7601f5592b93db3b9330c1c1d","error":"Unknown error","level":"error","message":"Error getting balance for polygon:","timestamp":"2025-04-21T07:52:28.617Z"}
{"arbitrum":"0","bsc":"0","eth":"0","level":"info","message":"Token balances fetched for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b:","polygon":"0","timestamp":"2025-04-21T07:52:28.618Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T07:52:29.749Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:52:29.750Z"}
{"level":"info","message":"GET /api/chat/history?count_only=true","timestamp":"2025-04-21T07:52:29.765Z"}
{"level":"info","message":"GET /api/chat/history?offset=0&limit=30","timestamp":"2025-04-21T07:52:29.795Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T07:52:59.118Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:52:59.121Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T07:53:29.470Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:53:29.473Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T07:53:59.207Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:53:59.210Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T07:54:29.824Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:54:29.827Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T07:54:57.226Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:54:57.229Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T07:55:58.564Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:55:58.567Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T07:57:00.007Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:57:00.009Z"}
{"level":"info","message":"GET /api/tokens/balances","timestamp":"2025-04-21T07:57:28.350Z"}
{"level":"info","message":"Fetching token balances for address: 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","timestamp":"2025-04-21T07:57:28.351Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xd95a45fc46a7300e6022885afec3d618d7d3f27c","error":"Unknown error","level":"error","message":"Error getting balance for eth:","timestamp":"2025-04-21T07:57:28.364Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x4B294265720B09ca39BFBA18c7E368413c0f68eB","error":"Unknown error","level":"error","message":"Error getting balance for bsc:","timestamp":"2025-04-21T07:57:28.378Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xdce769b847a0a697239777d0b1c7dd33b6012ba0","error":"Unknown error","level":"error","message":"Error getting balance for arbitrum:","timestamp":"2025-04-21T07:57:28.392Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x351f59de4fedbdf7601f5592b93db3b9330c1c1d","error":"Unknown error","level":"error","message":"Error getting balance for polygon:","timestamp":"2025-04-21T07:57:28.406Z"}
{"arbitrum":"0","bsc":"0","eth":"0","level":"info","message":"Token balances fetched for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b:","polygon":"0","timestamp":"2025-04-21T07:57:28.406Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T07:58:01.345Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:58:01.348Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T07:59:02.870Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T07:59:02.873Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:00:04.317Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:00:04.321Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:01:05.670Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:01:05.673Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:01:27.179Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:01:27.182Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:01:57.724Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:01:57.728Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T08:02:13.487Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:02:13.490Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T08:02:13.502Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:02:13.504Z"}
{"level":"info","message":"GET /api/tokens/balances","timestamp":"2025-04-21T08:02:13.521Z"}
{"level":"info","message":"Fetching token balances for address: 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","timestamp":"2025-04-21T08:02:13.522Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xd95a45fc46a7300e6022885afec3d618d7d3f27c","error":"Unknown error","level":"error","message":"Error getting balance for eth:","timestamp":"2025-04-21T08:02:13.538Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:02:13.543Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:02:13.546Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x4B294265720B09ca39BFBA18c7E368413c0f68eB","error":"Unknown error","level":"error","message":"Error getting balance for bsc:","timestamp":"2025-04-21T08:02:13.552Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:02:13.558Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:02:13.559Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xdce769b847a0a697239777d0b1c7dd33b6012ba0","error":"Unknown error","level":"error","message":"Error getting balance for arbitrum:","timestamp":"2025-04-21T08:02:13.567Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x351f59de4fedbdf7601f5592b93db3b9330c1c1d","error":"Unknown error","level":"error","message":"Error getting balance for polygon:","timestamp":"2025-04-21T08:02:13.580Z"}
{"arbitrum":"0","bsc":"0","eth":"0","level":"info","message":"Token balances fetched for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b:","polygon":"0","timestamp":"2025-04-21T08:02:13.580Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T08:02:14.448Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:02:14.449Z"}
{"level":"info","message":"GET /api/chat/history?count_only=true","timestamp":"2025-04-21T08:02:14.461Z"}
{"level":"info","message":"GET /api/chat/history?offset=0&limit=30","timestamp":"2025-04-21T08:02:14.477Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T08:03:04.374Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:03:04.386Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T08:03:04.407Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:03:04.410Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:03:04.436Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:03:04.441Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:03:04.457Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:03:04.459Z"}
{"level":"info","message":"GET /api/tokens/balances","timestamp":"2025-04-21T08:03:04.469Z"}
{"level":"info","message":"Fetching token balances for address: 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","timestamp":"2025-04-21T08:03:04.471Z"}
{"level":"info","message":"GET /api/auth/check","timestamp":"2025-04-21T08:03:05.346Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:03:05.350Z"}
{"level":"info","message":"GET /api/chat/history?count_only=true","timestamp":"2025-04-21T08:03:05.370Z"}
{"level":"info","message":"GET /api/chat/history?offset=0&limit=30","timestamp":"2025-04-21T08:03:05.403Z"}
{"balance":"1500000.0","contract":"0xd95a45fc46a7300e6022885afec3d618d7d3f27c","level":"info","message":"Token balance for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b on eth:","timestamp":"2025-04-21T08:03:05.616Z"}
{"balance":"500000.0","contract":"0x4B294265720B09ca39BFBA18c7E368413c0f68eB","level":"info","message":"Token balance for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b on bsc:","timestamp":"2025-04-21T08:03:06.946Z"}
{"balance":"499999.9","contract":"0xdce769b847a0a697239777d0b1c7dd33b6012ba0","level":"info","message":"Token balance for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b on arbitrum:","timestamp":"2025-04-21T08:03:07.769Z"}
{"balance":"454852.0","contract":"0x351f59de4fedbdf7601f5592b93db3b9330c1c1d","level":"info","message":"Token balance for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b on polygon:","timestamp":"2025-04-21T08:03:09.204Z"}
{"arbitrum":"499999.9","bsc":"500000.0","eth":"1500000.0","level":"info","message":"Token balances fetched for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b:","polygon":"454852.0","timestamp":"2025-04-21T08:03:09.205Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:03:34.938Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:03:34.942Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:04:05.153Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:04:05.156Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:04:35.377Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:04:35.383Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:05:05.720Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:05:05.727Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:05:36.094Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:05:36.100Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:06:15.233Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:06:15.237Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:07:15.823Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:07:15.827Z"}
{"level":"info","message":"GET /api/tokens/balances","timestamp":"2025-04-21T08:08:04.364Z"}
{"level":"info","message":"Fetching token balances for address: 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","timestamp":"2025-04-21T08:08:04.366Z"}
{"balance":"1500000.0","contract":"0xd95a45fc46a7300e6022885afec3d618d7d3f27c","level":"info","message":"Token balance for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b on eth:","timestamp":"2025-04-21T08:08:08.039Z"}
{"balance":"500000.0","contract":"0x4B294265720B09ca39BFBA18c7E368413c0f68eB","level":"info","message":"Token balance for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b on bsc:","timestamp":"2025-04-21T08:08:10.515Z"}
{"balance":"499999.9","contract":"0xdce769b847a0a697239777d0b1c7dd33b6012ba0","level":"info","message":"Token balance for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b on arbitrum:","timestamp":"2025-04-21T08:08:11.776Z"}
{"balance":"454852.0","contract":"0x351f59de4fedbdf7601f5592b93db3b9330c1c1d","level":"info","message":"Token balance for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b on polygon:","timestamp":"2025-04-21T08:08:13.345Z"}
{"arbitrum":"499999.9","bsc":"500000.0","eth":"1500000.0","level":"info","message":"Token balances fetched for 0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b:","polygon":"454852.0","timestamp":"2025-04-21T08:08:13.345Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:08:16.041Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:08:16.044Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:09:16.812Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:09:16.819Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:09:50.293Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:09:50.299Z"}
{"level":"info","message":"POST /api/chat/message","timestamp":"2025-04-21T08:09:54.822Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:10:07.389Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:10:07.394Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:10:35.890Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:10:35.901Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:11:05.861Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:11:05.865Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:11:36.242Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:11:36.245Z"}
{"level":"info","message":"GET /api/auth/identities","timestamp":"2025-04-21T08:12:06.558Z"}
{"level":"info","message":"[IdentityService] Found 2 identities for user 1","timestamp":"2025-04-21T08:12:06.561Z"}

View File

@@ -0,0 +1,21 @@
{"level":"error","message":"Error launching Telegram bot: 401: Bot Token is required","on":{},"response":{"description":"Bot Token is required","error_code":401},"stack":"Error: 401: Bot Token is required\n at Telegram.callApi (/app/node_modules/telegraf/lib/core/network/client.js:290:19)\n at Telegram.getMe (/app/node_modules/telegraf/lib/telegram.js:17:21)\n at Telegraf.launch (/app/node_modules/telegraf/lib/telegraf.js:188:98)\n at getBot (/app/services/telegramBot.js:167:23)\n at initServices (/app/server.js:35:13)\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async Server.<anonymous> (/app/server.js:94:5)","timestamp":"2025-04-21T07:51:39.303Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xd95a45fc46a7300e6022885afec3d618d7d3f27c","error":"","level":"error","message":"Error checking balance in eth:","timestamp":"2025-04-21T07:52:03.088Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x4B294265720B09ca39BFBA18c7E368413c0f68eB","error":"","level":"error","message":"Error checking balance in bsc:","timestamp":"2025-04-21T07:52:03.090Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xdce769b847a0a697239777d0b1c7dd33b6012ba0","error":"","level":"error","message":"Error checking balance in arbitrum:","timestamp":"2025-04-21T07:52:03.091Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x351f59de4fedbdf7601f5592b93db3b9330c1c1d","error":"","level":"error","message":"Error checking balance in polygon:","timestamp":"2025-04-21T07:52:03.092Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xd95a45fc46a7300e6022885afec3d618d7d3f27c","error":"Unknown error","level":"error","message":"Error getting balance for eth:","timestamp":"2025-04-21T07:52:28.505Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x4B294265720B09ca39BFBA18c7E368413c0f68eB","error":"Unknown error","level":"error","message":"Error getting balance for bsc:","timestamp":"2025-04-21T07:52:28.521Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xdce769b847a0a697239777d0b1c7dd33b6012ba0","error":"Unknown error","level":"error","message":"Error getting balance for arbitrum:","timestamp":"2025-04-21T07:52:28.534Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x351f59de4fedbdf7601f5592b93db3b9330c1c1d","error":"Unknown error","level":"error","message":"Error getting balance for polygon:","timestamp":"2025-04-21T07:52:28.548Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xd95a45fc46a7300e6022885afec3d618d7d3f27c","error":"Unknown error","level":"error","message":"Error getting balance for eth:","timestamp":"2025-04-21T07:52:28.574Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x4B294265720B09ca39BFBA18c7E368413c0f68eB","error":"Unknown error","level":"error","message":"Error getting balance for bsc:","timestamp":"2025-04-21T07:52:28.589Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xdce769b847a0a697239777d0b1c7dd33b6012ba0","error":"Unknown error","level":"error","message":"Error getting balance for arbitrum:","timestamp":"2025-04-21T07:52:28.603Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x351f59de4fedbdf7601f5592b93db3b9330c1c1d","error":"Unknown error","level":"error","message":"Error getting balance for polygon:","timestamp":"2025-04-21T07:52:28.617Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xd95a45fc46a7300e6022885afec3d618d7d3f27c","error":"Unknown error","level":"error","message":"Error getting balance for eth:","timestamp":"2025-04-21T07:57:28.364Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x4B294265720B09ca39BFBA18c7E368413c0f68eB","error":"Unknown error","level":"error","message":"Error getting balance for bsc:","timestamp":"2025-04-21T07:57:28.378Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xdce769b847a0a697239777d0b1c7dd33b6012ba0","error":"Unknown error","level":"error","message":"Error getting balance for arbitrum:","timestamp":"2025-04-21T07:57:28.392Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x351f59de4fedbdf7601f5592b93db3b9330c1c1d","error":"Unknown error","level":"error","message":"Error getting balance for polygon:","timestamp":"2025-04-21T07:57:28.406Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xd95a45fc46a7300e6022885afec3d618d7d3f27c","error":"Unknown error","level":"error","message":"Error getting balance for eth:","timestamp":"2025-04-21T08:02:13.538Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x4B294265720B09ca39BFBA18c7E368413c0f68eB","error":"Unknown error","level":"error","message":"Error getting balance for bsc:","timestamp":"2025-04-21T08:02:13.552Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0xdce769b847a0a697239777d0b1c7dd33b6012ba0","error":"Unknown error","level":"error","message":"Error getting balance for arbitrum:","timestamp":"2025-04-21T08:02:13.567Z"}
{"address":"0xf45aa4917b3775ba37f48aeb3dc1a943561e9e0b","contract":"0x351f59de4fedbdf7601f5592b93db3b9330c1c1d","error":"Unknown error","level":"error","message":"Error getting balance for polygon:","timestamp":"2025-04-21T08:02:13.580Z"}

View File

@@ -64,6 +64,21 @@ class AuthService {
if (userResult.rows.length > 0) { if (userResult.rows.length > 0) {
const user = userResult.rows[0]; const user = userResult.rows[0];
// Проверяем роль администратора при каждой аутентификации
const isAdmin = await this.checkAdminRole(normalizedAddress);
// Если статус админа изменился, обновляем роль в базе данных
if (user.role === 'admin' && !isAdmin) {
await db.query('UPDATE users SET role = $1 WHERE id = $2', ['user', user.id]);
logger.info(`Updated user ${user.id} role to user (admin tokens no longer present)`);
return { userId: user.id, isAdmin: false };
} else if (user.role !== 'admin' && isAdmin) {
await db.query('UPDATE users SET role = $1 WHERE id = $2', ['admin', user.id]);
logger.info(`Updated user ${user.id} role to admin (admin tokens found)`);
return { userId: user.id, isAdmin: true };
}
return { return {
userId: user.id, userId: user.id,
isAdmin: user.role === 'admin' isAdmin: user.role === 'admin'
@@ -86,6 +101,7 @@ class AuthService {
// Проверяем, есть ли у пользователя роль админа // Проверяем, есть ли у пользователя роль админа
const isAdmin = await this.checkAdminRole(normalizedAddress); const isAdmin = await this.checkAdminRole(normalizedAddress);
logger.info(`New user ${userId} role check result: ${isAdmin ? 'admin' : 'user'}`);
// Если у пользователя есть админские токены, обновляем его роль // Если у пользователя есть админские токены, обновляем его роль
if (isAdmin) { if (isAdmin) {
@@ -95,7 +111,7 @@ class AuthService {
return { userId, isAdmin }; return { userId, isAdmin };
} catch (error) { } catch (error) {
console.error('Error finding or creating user:', error); logger.error('Error finding or creating user:', error);
throw error; throw error;
} }
} }
@@ -110,13 +126,36 @@ class AuthService {
logger.info(`Checking admin role for address: ${address}`); logger.info(`Checking admin role for address: ${address}`);
let foundTokens = false; let foundTokens = false;
let errorCount = 0;
const balances = {}; const balances = {};
const totalNetworks = ADMIN_CONTRACTS.length;
// Создаем массив промисов для параллельной проверки балансов // Создаем массив промисов для параллельной проверки балансов
const checkPromises = ADMIN_CONTRACTS.map(async (contract) => { const checkPromises = ADMIN_CONTRACTS.map(async (contract) => {
try { try {
const provider = this.providers[contract.network]; const provider = this.providers[contract.network];
if (!provider) return null; if (!provider) {
logger.error(`No provider available for network ${contract.network}`);
balances[contract.network] = 'Error: No provider';
errorCount++;
return null;
}
// Проверяем доступность провайдера
try {
// Проверка доступности сети с таймаутом
const networkCheckPromise = provider.getNetwork();
const timeoutPromise = new Promise((_, reject) =>
setTimeout(() => reject(new Error('Network check timeout')), 3000)
);
await Promise.race([networkCheckPromise, timeoutPromise]);
} catch (networkError) {
logger.error(`Provider for ${contract.network} is not available: ${networkError.message}`);
balances[contract.network] = 'Error: Network unavailable';
errorCount++;
return null;
}
const tokenContract = new ethers.Contract( const tokenContract = new ethers.Contract(
contract.address, contract.address,
@@ -142,7 +181,7 @@ class AuthService {
hasTokens: balance > 0 hasTokens: balance > 0
}); });
if (balance > 0) { if (parseFloat(formattedBalance) > 0) {
logger.info(`Found admin tokens on ${contract.network}`); logger.info(`Found admin tokens on ${contract.network}`);
foundTokens = true; foundTokens = true;
} }
@@ -152,9 +191,10 @@ class AuthService {
logger.error(`Error checking balance in ${contract.network}:`, { logger.error(`Error checking balance in ${contract.network}:`, {
address, address,
contract: contract.address, contract: contract.address,
error: error.message error: error.message || 'Unknown error'
}); });
balances[contract.network] = 'Error'; balances[contract.network] = 'Error';
errorCount++;
return null; return null;
} }
}); });
@@ -162,9 +202,15 @@ class AuthService {
// Ждем выполнения всех проверок // Ждем выполнения всех проверок
await Promise.all(checkPromises); await Promise.all(checkPromises);
// Если все запросы завершились с ошибкой, считаем, что проверка не удалась
if (errorCount === totalNetworks) {
logger.error(`All network checks for ${address} failed. Cannot verify admin status.`);
return false;
}
if (foundTokens) { if (foundTokens) {
logger.info(`Admin role summary for ${address}:`, { logger.info(`Admin role summary for ${address}:`, {
networks: Object.keys(balances).filter(net => balances[net] > 0), networks: Object.keys(balances).filter(net => balances[net] > 0 && balances[net] !== 'Error'),
balances balances
}); });
logger.info(`Admin role granted for ${address}`); logger.info(`Admin role granted for ${address}`);
@@ -203,6 +249,21 @@ class AuthService {
continue; continue;
} }
// Проверяем доступность провайдера
try {
// Проверка доступности сети с таймаутом
const networkCheckPromise = provider.getNetwork();
const networkTimeoutPromise = new Promise((_, reject) =>
setTimeout(() => reject(new Error('Network check timeout')), timeout)
);
await Promise.race([networkCheckPromise, networkTimeoutPromise]);
} catch (networkError) {
logger.error(`Provider for ${contract.network} is not available: ${networkError.message}`);
balances[contract.network] = '0';
continue;
}
const tokenContract = new ethers.Contract( const tokenContract = new ethers.Contract(
contract.address, contract.address,
ERC20_ABI, ERC20_ABI,
@@ -494,6 +555,8 @@ class AuthService {
if (!address) return false; if (!address) return false;
logger.info(`Checking admin tokens for address: ${address}`); logger.info(`Checking admin tokens for address: ${address}`);
try {
const isAdmin = await this.checkAdminRole(address); const isAdmin = await this.checkAdminRole(address);
// Обновляем роль пользователя в базе данных, если есть админские токены // Обновляем роль пользователя в базе данных, если есть админские токены
@@ -516,12 +579,38 @@ class AuthService {
); );
logger.info(`Updated user ${userId} role to admin based on token holdings`); logger.info(`Updated user ${userId} role to admin based on token holdings`);
} }
} catch (error) {
logger.error('Error updating user role:', error);
// Продолжаем выполнение, даже если обновление роли не удалось
}
} else {
// Если пользователь не является администратором, сбрасываем роль на "user", если она была "admin"
try {
const userResult = await db.query(`
SELECT u.id, u.role FROM users u
JOIN user_identities ui ON u.id = ui.user_id
WHERE ui.provider = 'wallet' AND ui.provider_id = $1`,
[address.toLowerCase()]
);
if (userResult.rows.length > 0 && userResult.rows[0].role === 'admin') {
const userId = userResult.rows[0].id;
await db.query(
'UPDATE users SET role = $1 WHERE id = $2',
['user', userId]
);
logger.info(`Reset user ${userId} role from admin to user (no tokens found)`);
}
} catch (error) { } catch (error) {
logger.error('Error updating user role:', error); logger.error('Error updating user role:', error);
} }
} }
return isAdmin; return isAdmin;
} catch (error) {
logger.error(`Error in checkAdminTokens: ${error.message}`);
return false; // При любой ошибке считаем, что пользователь не админ
}
} }
/** /**