-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
135 lines (115 loc) · 3.94 KB
/
server.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
const express = require('express');
const bodyParser = require('body-parser');
const webpush = require('web-push');
const ethers = require('ethers');
const axios = require('axios');
const app = express();
const port = 4000;
app.use((req, res, next) => {
const allowedOrigins = [
'http://localhost:3000',
'https://master--assaver.netlify.app',
'https://a309-185-199-104-14.ngrok-free.app'
];
const origin = req.headers.origin;
if (allowedOrigins.includes(origin)) {
res.header('Access-Control-Allow-Origin', origin);
}
res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
next();
});
const vapidKeys = {
publicKey: '-gWoFFX8N8CYgKa5r-Ok',
privateKey: ''
};
webpush.setVapidDetails(
'mailto:@gmail.com',
vapidKeys.publicKey,
vapidKeys.privateKey
);
app.use(bodyParser.json());
let subscriptions = [];
let trackedAddresses = [];
app.post('/subscribe', (req, res) => {
console.log(req.body)
const subscription = req.body;
subscriptions.push(subscription);
res.status(201).json({});
});
app.post('/submit', (req, res) => {
console.log(req.body)
const { address, severityLevels } = req.body;
if (!trackedAddresses.includes(address)) {
trackedAddresses.push(address);
}
res.status(201).json({});
});
const sendNotification = (subscription, data) => {
webpush.sendNotification(subscription, JSON.stringify(data))
.catch(err => console.error('Error sending notification', err));
};
// Etherscan Sepolia API key
const ETHERSCAN_API_KEY = '';
// Infura or Alchemy Sepolia RPC URL
const SEPOLIA_RPC_URL = 'https://sepolia.gateway.tenderly.co';
const provider = new ethers.JsonRpcProvider(SEPOLIA_RPC_URL);
const checkTransactions = async () => {
try {
const latestBlock = await provider.getBlockNumber();
console.log('Latest Block:', latestBlock);
for (const address of trackedAddresses) {
try {
const response = await axios.get(`https://api-sepolia.etherscan.io/api?module=account&action=txlist&address=${address}&startblock=${latestBlock - 5}&endblock=${latestBlock}&sort=asc&apikey=${ETHERSCAN_API_KEY}`);
const transactions = response.data.result;
if (transactions && transactions.length > 0) {
const latestTransaction = transactions[transactions.length - 1];
const notificationPayload = {
title: 'New Transaction Detected',
body: `New transaction on address ${address}. Hash: ${latestTransaction.hash}`
};
subscriptions.forEach(sub => sendNotification(sub, notificationPayload));
}
} catch (error) {
console.error('Error fetching transactions for address:', address, error);
}
}
} catch (error) {
console.error('Error fetching latest block:', error);
}
};
const checkTest = async () => {
const notificationPayload = {
title: 'New Transaction Detected',
body: `New transaction on address test`
};
subscriptions.forEach(sub => sendNotification(sub, notificationPayload));
}
// Check for new transactions every minute
setInterval(checkTest, 6000);
app.listen(port, () => {
console.log(`Server started on port ${port}`);
});
// app.post('/submit', (req, res) => {
// console.log('body', req.body)
// const subscription = req.body;
// subscriptions.push(subscription);
// res.status(201).json({});
// });
// app.post('/api/sendNotification', (req, res) => {
// const notificationPayload = {
// title: req.body.title,
// body: req.body.body,
// };
// const promises = subscriptions.map(sub =>
// webpush.sendNotification(sub, JSON.stringify(notificationPayload))
// );
// Promise.all(promises)
// .then(() => res.sendStatus(200))
// .catch(err => {
// console.error("Error sending notification, reason: ", err);
// res.sendStatus(500);
// });
// });
// app.listen(port, () => {
// console.log(`Server started on port ${port}`);
// });