forked from mito-systems/sol-mem-gen
Rollback tweet save if verification fails
This commit is contained in:
parent
7e59ee172e
commit
78f7bb8234
@ -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<NextResponse> {
|
||||
try {
|
||||
@ -30,21 +29,10 @@ export async function POST(req: NextRequest): Promise<NextResponse> {
|
||||
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(
|
||||
|
@ -196,6 +196,8 @@ export async function createVestingPlanV2(params: CreateVestingPlanParams) {
|
||||
|
||||
return escrow;
|
||||
}
|
||||
|
||||
throw new Error;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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<boolean> {
|
||||
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<Tweet>): 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<Tweet>);
|
||||
|
||||
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.");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user