diff --git a/README.md b/README.md index e2eab8c..ad54d15 100644 --- a/README.md +++ b/README.md @@ -31,6 +31,10 @@ nano frontend/.env 3. Запустите скрипт установки: ```bash ./setup.sh + +4. Выполните миграции изнутри контейнера backend: +``` +docker exec dapp-backend yarn migrate ``` Скрипт автоматически: diff --git a/backend/logs/combined.log b/backend/logs/combined.log index e69de29..a89312c 100644 --- a/backend/logs/combined.log +++ b/backend/logs/combined.log @@ -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. (/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"} diff --git a/backend/logs/error.log b/backend/logs/error.log index e69de29..709816d 100644 --- a/backend/logs/error.log +++ b/backend/logs/error.log @@ -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. (/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"} diff --git a/backend/services/auth-service.js b/backend/services/auth-service.js index 6d34f61..df92479 100644 --- a/backend/services/auth-service.js +++ b/backend/services/auth-service.js @@ -64,6 +64,21 @@ class AuthService { if (userResult.rows.length > 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 { userId: user.id, isAdmin: user.role === 'admin' @@ -86,6 +101,7 @@ class AuthService { // Проверяем, есть ли у пользователя роль админа const isAdmin = await this.checkAdminRole(normalizedAddress); + logger.info(`New user ${userId} role check result: ${isAdmin ? 'admin' : 'user'}`); // Если у пользователя есть админские токены, обновляем его роль if (isAdmin) { @@ -95,7 +111,7 @@ class AuthService { return { userId, isAdmin }; } catch (error) { - console.error('Error finding or creating user:', error); + logger.error('Error finding or creating user:', error); throw error; } } @@ -110,13 +126,36 @@ class AuthService { logger.info(`Checking admin role for address: ${address}`); let foundTokens = false; + let errorCount = 0; const balances = {}; + const totalNetworks = ADMIN_CONTRACTS.length; // Создаем массив промисов для параллельной проверки балансов const checkPromises = ADMIN_CONTRACTS.map(async (contract) => { try { 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( contract.address, @@ -142,7 +181,7 @@ class AuthService { hasTokens: balance > 0 }); - if (balance > 0) { + if (parseFloat(formattedBalance) > 0) { logger.info(`Found admin tokens on ${contract.network}`); foundTokens = true; } @@ -152,9 +191,10 @@ class AuthService { logger.error(`Error checking balance in ${contract.network}:`, { address, contract: contract.address, - error: error.message + error: error.message || 'Unknown error' }); balances[contract.network] = 'Error'; + errorCount++; return null; } }); @@ -162,9 +202,15 @@ class AuthService { // Ждем выполнения всех проверок await Promise.all(checkPromises); + // Если все запросы завершились с ошибкой, считаем, что проверка не удалась + if (errorCount === totalNetworks) { + logger.error(`All network checks for ${address} failed. Cannot verify admin status.`); + return false; + } + if (foundTokens) { 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 }); logger.info(`Admin role granted for ${address}`); @@ -203,6 +249,21 @@ class AuthService { 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( contract.address, ERC20_ABI, @@ -494,34 +555,62 @@ class AuthService { if (!address) return false; logger.info(`Checking admin tokens for address: ${address}`); - const isAdmin = await this.checkAdminRole(address); - // Обновляем роль пользователя в базе данных, если есть админские токены - if (isAdmin) { - try { - // Находим userId по адресу - const userResult = await db.query(` - SELECT u.id 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) { - const userId = userResult.rows[0].id; - // Обновляем роль пользователя - await db.query( - 'UPDATE users SET role = $1 WHERE id = $2', - ['admin', userId] + try { + const isAdmin = await this.checkAdminRole(address); + + // Обновляем роль пользователя в базе данных, если есть админские токены + if (isAdmin) { + try { + // Находим userId по адресу + const userResult = await db.query(` + SELECT u.id FROM users u + JOIN user_identities ui ON u.id = ui.user_id + WHERE ui.provider = 'wallet' AND ui.provider_id = $1`, + [address.toLowerCase()] ); - logger.info(`Updated user ${userId} role to admin based on token holdings`); + + if (userResult.rows.length > 0) { + const userId = userResult.rows[0].id; + // Обновляем роль пользователя + await db.query( + 'UPDATE users SET role = $1 WHERE id = $2', + ['admin', userId] + ); + 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) { + logger.error('Error updating user role:', error); } - } catch (error) { - logger.error('Error updating user role:', error); } + + return isAdmin; + } catch (error) { + logger.error(`Error in checkAdminTokens: ${error.message}`); + return false; // При любой ошибке считаем, что пользователь не админ } - - return isAdmin; } /**