From 299e06f769a23b435cccac6516e994fe74c72396 Mon Sep 17 00:00:00 2001 From: IshaVenikar Date: Thu, 6 Feb 2025 15:45:44 +0530 Subject: [PATCH] Rollback tweet save if verification fails --- src/app/api/tweet/route.ts | 20 ++++---------------- src/locker-utils/index.ts | 2 ++ src/utils/verifyTweet.ts | 38 +++++++++++++++++++++++++++++++------- 3 files changed, 37 insertions(+), 23 deletions(-) diff --git a/src/app/api/tweet/route.ts b/src/app/api/tweet/route.ts index 9bff4a4..dd27fe8 100644 --- a/src/app/api/tweet/route.ts +++ b/src/app/api/tweet/route.ts @@ -1,7 +1,6 @@ import { NextRequest, NextResponse } from 'next/server'; -import { saveTweet, verifySignatureInTweet } from '../../../utils/verifyTweet'; -import { createRewardLock, extractInfo } from '../../../utils/create-lock'; +import { processTweet, verifySignatureInTweet } from '../../../utils/verifyTweet'; export async function POST(req: NextRequest): Promise { try { @@ -30,21 +29,10 @@ export async function POST(req: NextRequest): Promise { throw new Error('Tweet is not valid'); } - const { isFourthUser } = await saveTweet({ transactionSignature: txSignature, url: memeUrl }); + // Verify and store valid tweet + const result = await processTweet(txSignature, memeUrl); - if (isFourthUser) { - const { authority, amount } = await extractInfo(txSignature); - - if (!authority || Number(amount) <= 0) { - return NextResponse.json({ error: "Invalid transaction details" }, { status: 400 }); - } - - const escrow = await createRewardLock(authority, amount); - return NextResponse.json({ success: true, data: { escrow } }); - - } - - return NextResponse.json({ success: isVerified, message: 'Tweet verified' }) + return NextResponse.json(result) } catch (error) { console.error('Error while verifying tweet:', error) return NextResponse.json( diff --git a/src/locker-utils/index.ts b/src/locker-utils/index.ts index d8ab321..29b367f 100644 --- a/src/locker-utils/index.ts +++ b/src/locker-utils/index.ts @@ -196,6 +196,8 @@ export async function createVestingPlanV2(params: CreateVestingPlanParams) { return escrow; } + + throw new Error; } } diff --git a/src/utils/verifyTweet.ts b/src/utils/verifyTweet.ts index c7ddc5e..26c701d 100644 --- a/src/utils/verifyTweet.ts +++ b/src/utils/verifyTweet.ts @@ -1,4 +1,7 @@ +import { DataSource, EntityTarget } from 'typeorm'; + import { Tweet } from '../entity/Tweet'; +import { createRewardLock, extractInfo } from './create-lock'; export async function verifySignatureInTweet(transactionSignature: string): Promise { const paymentRepository = global.appDataSource.getRepository(global.entities.Payment); @@ -18,14 +21,35 @@ export async function verifySignatureInTweet(transactionSignature: string): Prom return true; } -export async function saveTweet(data: Partial): Promise<{ isFourthUser: boolean }> { - return await global.appDataSource.transaction(async (transactionalEntityManager) => { - const tweetRepository = transactionalEntityManager.getRepository(global.entities.Tweet); +export async function processTweet(txSignature: string, memeUrl: string | null) { + return await (global.appDataSource as DataSource).transaction(async (transactionalEntityManager) => { + const tweetRepository = transactionalEntityManager.getRepository(global.entities.Tweet as EntityTarget); - const tweet = await tweetRepository.save(data); + const tweet = await tweetRepository.save({ + transactionSignature: txSignature, + url: memeUrl, + }); - return { - isFourthUser: tweet.id % 4 === 0 - }; + const isFourthUser = tweet.id % 4 === 0; + + try { + if (isFourthUser) { + const { authority, amount } = await extractInfo(txSignature); + + if (!authority || Number(amount) <= 0) { + return { error: "Invalid transaction details" } + } + + const escrow = await createRewardLock(authority, amount); + + return { success: true, data: { escrow } }; + } + + return { success: true, message: 'Tweet verified' } + } catch (error) { + console.error('Error locking tokens.'); + + throw new Error("Transaction failed."); + } }); }