app.post('/webhooks/gnosis-ramp', (req, res) => {
verifyWebhook(req, process.env.CLIENT_SECRET);
const { eventType, data, eventId } = req.body;
// Check for duplicate
if (await isDuplicate(eventId)) {
return res.status(200).send('OK');
}
switch (eventType) {
case 'INTENT_STATUS_CHANGED':
await handleIntentStatusChange(data);
break;
case 'COMPLIANCE_UPDATED':
await handleComplianceUpdate(data);
break;
case 'MONEY_MOVEMENT_UPDATED':
await handleTransactionUpdate(data);
break;
}
await markProcessed(eventId);
res.status(200).send('OK');
});
async function handleIntentStatusChange({ intentId, status, failureReason }) {
switch (status) {
case 'COMPLETED':
await notifyUser(intentId, 'Your transfer is complete!');
break;
case 'COMPLIANCE_FAILED':
case 'TRANSACTION_FAILED':
await notifyUser(intentId, `Transfer failed: ${failureReason}`);
break;
}
}
async function handleTransactionUpdate({ intentId, status }) {
if (status === 'SUCCESS') {
await updateOrderStatus(intentId, 'completed');
}
}