Інтеграція Farcaster
Farcaster—децентралізований соціальний протокол з on-chain ідентичністю (Ethereum) та off-chain повідомленнями (Hubs). На відміну від Lens, Farcaster пріоритизує швидкість та досвід розробника: без газу за кожну дію, без затримки блокчейна для повідомлень. Швидко зростаюча екосистема з Warpcast як основним клієнтом.
Архітектура Farcaster
FID (Farcaster ID): on-chain ідентифікатор на Ethereum (Optimism). Реєструвати один раз, коштує газ.
Signers: ключи Ed25519, зареєстровані для FID. Повідомлення підписуються ключем підписанта, а не ключем Ethereum. Це дозволяє додаткам підписувати повідомлення без доступу до приватного ключа гаманця.
Hubs: федеративні сервери, які зберігають та синхронізують повідомлення Farcaster. Neynar, Warpcast, Pinata—приклади провайдерів Hub.
Frames: інтерактивні елементи прямо в стрічці—міні-додатки всередині постів.
Frames—ключова функція для розробників
Frames—стандарт, подібний OpenGraph, для інтерактивних постів. Користувач бачить пост з кнопками, клацає—сервер обробляє дію та повертає новий frame. Можна будувати: mint NFT прямо зі стрічки, голосування, ігри, потоки входу.
import { Frog } from "frog";
import { Button, FrameContext } from "frog";
const app = new Frog({ basePath: "/api" });
// Простий frame з мінтингом NFT
app.frame("/mint-nft", async (c: FrameContext) => {
const { buttonValue, frameData } = c;
let status = "ready";
let txHash = "";
if (buttonValue === "mint") {
// Ініціюємо транзакцію mint
try {
txHash = await mintNFT(frameData?.fid?.toString() ?? "");
status = "minted";
} catch {
status = "error";
}
}
return c.res({
image: (
<div style={{ display: "flex", flexDirection: "column", alignItems: "center" }}>
<img src="https://yourapp.com/nft-preview.png" width="400" height="300" />
{status === "minted" && <p>Minted! TX: {txHash.slice(0, 10)}...</p>}
{status === "error" && <p>Error minting. Try again.</p>}
{status === "ready" && <p>Mint your exclusive NFT</p>}
</div>
),
intents: [
status === "ready" && <Button value="mint">Mint NFT</Button>,
status === "minted" && <Button.Link href={`https://etherscan.io/tx/${txHash}`}>View TX</Button.Link>,
],
});
});
Neynar API—спрощена інтеграція
Neynar—керований Farcaster API, усуває необхідність запускати власний Hub:
import { NeynarAPIClient } from "@neynar/nodejs-sdk";
const neynar = new NeynarAPIClient({ apiKey: process.env.NEYNAR_API_KEY! });
// Опублікувати cast (пост)
const cast = await neynar.publishCast(
signerUUID, // UUID підписавта, зареєстрованого через Neynar
"Hello Farcaster! #web3",
{
embeds: [{ url: "https://yourapp.com/post/123" }],
channelId: "dev", // опублікувати в каналі /dev
}
);
// Отримати стрічку за FID
const feed = await neynar.fetchFeed("following", {
fid: 12345,
limit: 25,
cursor: nextCursor,
});
// Отримати послідовників
const followers = await neynar.fetchUserFollowers({ fid: 12345 });
// Пошук користувачів
const users = await neynar.searchUser("alice", { viewerFid: myFid });
Sign In With Farcaster (SIWF)
Аутентифікація через акаунт Farcaster—аналог SIWE для Farcaster:
import { createAppClient, viemConnector } from "@farcaster/auth-client";
const appClient = createAppClient({
ethereum: viemConnector(),
});
// Створити канал для auth
const { channelToken, url, nonce } = await appClient.createChannel({
siweUri: "https://yourapp.com/login",
domain: "yourapp.com",
});
// Користувач сканує QR або переходить за посиланням у Warpcast
// Після підтвердження—отримуємо статус
const status = await appClient.watchStatus({ channelToken });
if (status.data.state === "completed") {
const { fid, displayName, pfpUrl, username } = status.data;
// Користувач аутентифікований
await createUserSession(fid, username);
}
React хуки для Farcaster
import { AuthKitProvider, useSignIn } from "@farcaster/auth-kit";
function LoginButton() {
const { signIn, isLoading, isSuccess, profile } = useSignIn({
onSuccess: (res) => {
console.log(`Logged in as ${res.username} (FID: ${res.fid})`);
},
});
return (
<button onClick={signIn} disabled={isLoading}>
{isLoading ? "Connecting..." : "Sign In with Farcaster"}
</button>
);
}
function App() {
return (
<AuthKitProvider
config={{
rpcUrl: "https://mainnet.optimism.io",
domain: "yourapp.com",
siweUri: "https://yourapp.com/login",
}}
>
<LoginButton />
</AuthKitProvider>
);
}
Канали та розвиток спільноти
Канали Farcaster—тематичні стрічки (аналог subreddits). Публікація в каналі = охоплення цільової аудиторії:
// Опублікувати у каналі /gaming
await neynar.publishCast(
signerUUID,
"Just deployed our new blockchain game! Check it out 🎮",
{
channelId: "gaming",
embeds: [{ url: "https://game.com" }],
}
);
// Отримати стрічку каналу
const channelFeed = await neynar.fetchFeedByChannelIds(["gaming", "web3"], {
limit: 25,
withRecasts: false,
});
Інтеграція Farcaster—1-2 тижні для Sign In + базові соціальні функції. Frames—окремо, 1-2 тижні для інтерактивного frame з транзакціями. Farcaster більш зручний для розробників, ніж Lens для швидкого старту—багата документація, Neynar API зменшує складність.







