Farcaster Frames in less than 100 lines, and ready to be deployed to Vercel.
Have fun! ⛵️
import { getFrameMetadata } from '@coinbase/onchainkit';
import type { Metadata } from 'next';
const NEXT_PUBLIC_URL = 'https://zizzamia.xyz';
const frameMetadata = getFrameMetadata({
buttons: [
{
label: 'Click Me',
},
],
image: `${NEXT_PUBLIC_URL}/park-1.png`,
post_url: `${NEXT_PUBLIC_URL}/api/frame`,
});
export const metadata: Metadata = {
title: 'zizzamia.xyz',
description: 'LFG',
openGraph: {
title: 'zizzamia.xyz',
description: 'LFG',
images: [`${NEXT_PUBLIC_URL}/park-1.png`],
},
other: {
...frameMetadata,
},
};
export default function Page() {
return (
<>
<h1>zizzamia.xyz</h1>
</>
);
}
export const viewport = {
width: 'device-width',
initialScale: 1.0,
};
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}
import { FrameRequest, getFrameAccountAddress, getFrameMessage } from '@coinbase/onchainkit';
import { NextRequest, NextResponse } from 'next/server';
const NEXT_PUBLIC_URL = 'https://zizzamia.xyz';
async function getResponse(req: NextRequest): Promise<NextResponse> {
let accountAddress: string | undefined = '';
const body: FrameRequest = await req.json();
const { isValid, message } = await getFrameMessage(body);
if (isValid) {
try {
accountAddress = await getFrameAccountAddress(message, { NEYNAR_API_KEY: 'NEYNAR_API_DOCS' });
} catch (err) {
console.error(err);
}
}
return new NextResponse(`<!DOCTYPE html><html><head>
<meta property="fc:frame" content="vNext" />
<meta property="fc:frame:image" content="${NEXT_PUBLIC_URL}/park-2.png" />
<meta property="fc:frame:button:1" content="${accountAddress}" />
<meta property="fc:frame:post_url" content="${NEXT_PUBLIC_URL}/api/frame" />
</head></html>`);
}
export async function POST(req: NextRequest): Promise<Response> {
return getResponse(req);
}
export const dynamic = 'force-dynamic';
This project is licensed under the MIT License - see the LICENSE.md file for details