Интеграция с Farcaster
Farcaster — децентрализованный social protocol с on-chain identity (Ethereum) и off-chain сообщениями (Hubs). В отличие от Lens, Farcaster приоритизирует скорость и developer experience: нет газа за каждое действие, нет latency блокчейна для сообщений. Быстро растущая экосистема с Warpcast как основным клиентом.
Архитектура Farcaster
FID (Farcaster ID): on-chain идентификатор на Ethereum (Optimism). Регистрация один раз, стоит газ.
Signers: Ed25519 ключи, зарегистрированные для FID. Сообщения подписываются signer key, не Ethereum ключом. Это позволяет приложениям подписывать сообщения без доступа к private key кошелька.
Hubs: federated серверы, хранящие и синхронизирующие сообщения Farcaster. Neynar, Warpcast, Pinata — примеры Hub провайдеров.
Frames: интерактивные элементы прямо в ленте — мини-приложения внутри постов.
Frames — ключевая фича для разработчиков
Frames — это OpenGraph-подобный стандарт для интерактивных постов. Пользователь видит пост с кнопками, нажимает — сервер обрабатывает действие и возвращает новый frame. Можно строить: mint NFT прямо из ленты, голосования, игры, onboarding флоу.
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") {
// Инициируем минт транзакцию
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 — managed Farcaster API, снимает необходимость запускать собственный Hub:
import { NeynarAPIClient } from "@neynar/nodejs-sdk";
const neynar = new NeynarAPIClient({ apiKey: process.env.NEYNAR_API_KEY! });
// Публикация каста (поста)
const cast = await neynar.publishCast(
signerUUID, // UUID signer, зарегистрированного через 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,
});
// Получение followers
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(),
});
// Создаём channel для 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>
);
}
Channels и community building
Farcaster Channels — это тематические ленты (аналог subreddits). Публикация в channel = охват целевой аудитории:
// Публикация в channel /gaming
await neynar.publishCast(
signerUUID,
"Just deployed our new blockchain game! Check it out 🎮",
{
channelId: "gaming",
embeds: [{ url: "https://game.com" }],
}
);
// Получение ленты channel
const channelFeed = await neynar.fetchFeedByChannelIds(["gaming", "web3"], {
limit: 25,
withRecasts: false,
});
Интеграция Farcaster — 1-2 недели для Sign In + базовые социальные features. Frames — отдельно, 1-2 недели для интерактивного frame с транзакциями. Farcaster более developer-friendly чем Lens для быстрого старта — rich documentation, Neynar API снижает сложность.







