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 { NextRequest, NextResponse } from 'next/server';
|
||||||
|
|
||||||
import { saveTweet, verifySignatureInTweet } from '../../../utils/verifyTweet';
|
import { processTweet, verifySignatureInTweet } from '../../../utils/verifyTweet';
|
||||||
import { createRewardLock, extractInfo } from '../../../utils/create-lock';
|
|
||||||
|
|
||||||
export async function POST(req: NextRequest): Promise<NextResponse> {
|
export async function POST(req: NextRequest): Promise<NextResponse> {
|
||||||
try {
|
try {
|
||||||
@ -30,21 +29,10 @@ export async function POST(req: NextRequest): Promise<NextResponse> {
|
|||||||
throw new Error('Tweet is not valid');
|
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) {
|
return NextResponse.json(result)
|
||||||
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' })
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Error while verifying tweet:', error)
|
console.error('Error while verifying tweet:', error)
|
||||||
return NextResponse.json(
|
return NextResponse.json(
|
||||||
|
@ -196,6 +196,8 @@ export async function createVestingPlanV2(params: CreateVestingPlanParams) {
|
|||||||
|
|
||||||
return escrow;
|
return escrow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
throw new Error;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,7 @@
|
|||||||
|
import { DataSource, EntityTarget } from 'typeorm';
|
||||||
|
|
||||||
import { Tweet } from '../entity/Tweet';
|
import { Tweet } from '../entity/Tweet';
|
||||||
|
import { createRewardLock, extractInfo } from './create-lock';
|
||||||
|
|
||||||
export async function verifySignatureInTweet(transactionSignature: string): Promise<boolean> {
|
export async function verifySignatureInTweet(transactionSignature: string): Promise<boolean> {
|
||||||
const paymentRepository = global.appDataSource.getRepository(global.entities.Payment);
|
const paymentRepository = global.appDataSource.getRepository(global.entities.Payment);
|
||||||
@ -18,14 +21,35 @@ export async function verifySignatureInTweet(transactionSignature: string): Prom
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function saveTweet(data: Partial<Tweet>): Promise<{ isFourthUser: boolean }> {
|
export async function processTweet(txSignature: string, memeUrl: string | null) {
|
||||||
return await global.appDataSource.transaction(async (transactionalEntityManager) => {
|
return await (global.appDataSource as DataSource).transaction(async (transactionalEntityManager) => {
|
||||||
const tweetRepository = transactionalEntityManager.getRepository(global.entities.Tweet);
|
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 {
|
const isFourthUser = tweet.id % 4 === 0;
|
||||||
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