Building a dApp with social features? Creating a custom social graph requires databases, APIs, moderation, anti-spam—months of backend work. We've done this multiple times and know how to shortcut it. Lens Protocol is a decentralized social graph on Polygon that lets you integrate profiles, subscriptions, feeds, and notifications in 2–4 weeks instead of 3–6 months. Backend cost savings can exceed 60% of the budget.
What is Lens Protocol and How It Solves the Scaling Problem
Lens Protocol is a decentralized social graph on Polygon. Users own their profile (ERC-721), subscriptions (ERC-721), and actions (follow, collect). All data is on-chain, and gas can be sponsored. Key components: LensHub (main contract), Open Action Modules (monetization), Follow Modules (subscription logic), and Lens API (GraphQL for indexing). Thanks to Lens network effect, your application immediately gains access to an audience of 100k+ profiles. Lens Protocol documentation recommends starting with the LensHub. A centralized social graph requires a custom database, API rate limiting, moderation, and spam protection. Lens provides ready infrastructure: profiles already exist, subscriptions and on-chain publications are stored. Integration via Lens SDK takes 2–4 weeks vs. 3–6 months from scratch. Decentralization eliminates data lock-in risk.
Why Lens Protocol Is More Cost-Effective
A custom social graph requires a permanent team (PM, backend, DevOps) and infrastructure. Lens Protocol eliminates these expenses: you pay only for integration, not ongoing backend maintenance. For example, one client reduced their backend team from 4 to 1, saving over $120,000 in the first year alone. Lens Protocol is 3–6x faster to implement than a custom social graph. With over 5 years of Web3 development experience, 20+ successful dApp integrations, and certified Lens Protocol expertise, our team guarantees a smooth deployment.
How Authentication via Wallet Works
Code example: Authentication
import { LensClient, production } from "@lens-protocol/client";
import { providers } from "ethers";
const lensClient = new LensClient({
environment: production,
});
async function authenticateWithLens(
walletClient: WalletClient,
address: string
): Promise<void> {
const profileManaged = await lensClient.profile.fetchAll({
where: { ownedBy: [address] },
});
if (profileManaged.items.length === 0) {
throw new Error("No Lens profile found");
}
const profile = profileManaged.items[0];
// Web3 authentication creates a session with EIP-712 signature
const session = await lensClient.login({
onboardingUser: {
app: process.env.LENS_APP_ADDRESS!,
wallet: walletClient,
},
});
}
Core Operations and Notifications
// Get the feed for a user
const feed = await lensClient.feed.fetch({
where: { for: profileId },
limit: LimitType.TwentyFive,
});
// Get publications of a specific profile
const publications = await lensClient.publication.fetchAll({
where: {
from: [profileId],
publicationTypes: [PublicationType.Post],
},
orderBy: PublicationsOrderByType.Latest,
});
// Pagination
if (publications.pageInfo.next) {
const nextPage = await lensClient.publication.fetchAll({
where: { from: [profileId] },
cursor: publications.pageInfo.next,
});
}
// Follow a profile
const followResult = await sessionClient.follow.follow({
follow: [{ profileId: targetProfileId }],
});
// Check if following
const isFollowing = await lensClient.profile.following({
for: followerProfileId,
});
const isFollowingTarget = isFollowing.items.some(p => p.id === targetProfileId);
// List followers
const followers = await lensClient.profile.followers({
of: profileId,
limit: LimitType.Fifty,
});
// Collect a publication
const collectResult = await sessionClient.publication.actions.actOn({
actOn: { simpleCollectOpenAction: true },
for: publicationId,
});
// Notifications for a user
const notifications = await lensClient.notifications.fetch({
where: {
publishedOn: [process.env.LENS_APP_ADDRESS!],
},
});
for (const notification of notifications.items) {
switch (notification.__typename) {
case "FollowNotification":
console.log(`New follower: ${notification.followers[0].handle?.fullHandle}`);
break;
case "CommentNotification":
console.log(`New comment on ${notification.publication.id}`);
break;
case "MentionNotification":
console.log(`Mentioned in ${notification.publication.id}`);
break;
case "ActedNotification":
console.log(`Someone collected ${notification.publication.id}`);
break;
}
}
Comparison and Integration Process
| Criteria |
Lens Protocol |
Custom Social Graph |
| Time to launch |
2–4 weeks |
3–6 months |
| Audience |
Existing (network effect) |
From scratch |
| Backend development & support |
Not required |
Full team & infrastructure |
| Data security |
On-chain, transparent |
Server-dependent |
| Interoperability |
All Lens applications |
Isolated system |
Lens Protocol reduces development time by 3–6x compared to a custom solution. On average, clients save $30,000–$50,000 in the initial phase and $5,000 monthly on infrastructure maintenance.
| Stage |
Duration |
Description |
| Architecture audit |
2–3 days |
Identify integration points and UI requirements |
| SDK setup |
3–5 days |
Connect LensClient, manage sessions and gas sponsorship |
| UI development |
1–2 weeks |
Profile, feed, subscriptions, publications, notifications |
| Testing |
3–5 days |
Gas optimization, UX check, edge cases |
| Documentation & deployment |
2–3 days |
Technical docs and production configuration |
What's Included and Step-by-Step Guide
- Documentation: detailed architecture overview, API endpoints, deployment instructions.
- Access: configured Lens accounts, API keys, infrastructure access.
- Training: 2–3 sessions for your team (up to 5 people) on Lens SDK and custom modules.
- Support: 2 weeks of post-launch support for operational issues.
- Install Lens SDK:
npm install @lens-protocol/client.
- Set up a LensClient with production environment.
- Implement Web3 authentication via EIP-712 signature.
- Fetch the user's profile and display it in the UI.
- Load the feed of on-chain publications from followed profiles.
- Implement actions: follow, like, comment, collect.
- Add notifications via the Lens Notifications API.
- Optimize gas: use sponsored transactions and batch methods.
Possible Custom Scenarios
- Follow Modules: paid subscriptions, token-gating, time-limited access.
- Open Action Modules: monetization via collections, tips, voting.
- Custom GraphQL queries: via Lens subgraph on TheGraph.
For a free consultation on Lens Protocol integration, reach out to our team. Order implementation today and get a ready social graph in 2–4 weeks.
Metaverse Development: How We Build Land, Avatars, and Interoperability
Decentraland sold virtual land parcels at peak hype. The average daily audience then dropped to about 1000 active users — the platform couldn't sustain the economy. The Sandbox followed a similar scenario: beautiful 3D worlds, but empty. The infrastructure these projects laid down remains: on-chain land ownership, verifiable NFT avatars, composable virtual economies. The question isn't whether the technology works — it does. The question is how to design so as not to repeat the same mistakes. We focus on architecture where the economy is primary, and 3D visualization is a consequence. Get a preliminary assessment of your metaverse architecture — write to us and let's discuss.
Why Land as NFT is More Complex Than It Seems?
Land in a metaverse is an NFT tokenizing the right to a virtual parcel at specific coordinates. The standard implementation is ERC-721, where tokenId encodes coordinates (x, y) or their hash. Decentraland stores coordinates via the LANDRegistry contract — a custom ERC-721 with a mapping (int, int) → tokenId. The Estate contract groups adjacent parcels. Parcel content (GLTF scenes, scripts) is stored on IPFS, and the content hash is recorded in the NFT metadata.
Problem: content on IPFS is not pinned forever. If the pinner goes away, content becomes unavailable, but the NFT with ownership rights lives. For production, we use a hybrid scheme:
| Storage |
Reliability |
Cost |
Recommendation |
| IPFS + Pinata |
Until pinner shutdown |
Low |
Temporary assets, prototypes |
| Arweave |
Permanent (one-time fee) |
Medium |
Production land content |
| Filecoin |
Long-term storage deals |
Medium |
Backup, large volumes |
| CDN + on-chain hash |
High (centralized) |
High |
Hot assets, fast loading |
Arweave is 10 times cheaper than IPFS for storing content longer than a year — for land assets, it's the optimal choice.
Spatial indexing. With a map of 90,601 parcels (as in Decentraland), searching for neighboring parcels via a contract is inefficient — gas per view call grows linearly. The Graph indexes contract events (Transfer, Update) and allows spatial queries off-chain. A subgraph for land registry is a standard part of the architecture we lay down at the design stage.
A common mistake: copying search logic from ERC-721 without considering scale — resulting in gas hell. Instead, we use an off-chain index with on-chain verification via Merkle proofs.
How to Ensure Avatar Interoperability Without Losing Attributes?
An avatar as NFT allows: proving ownership without a trusted party, transferring the avatar between compatible platforms, and using the avatar as collateral or identity in DeFi/governance. But the issue is interpretation: an NFT "Sword +5" in game A has specific damage stats, game B doesn't know that mechanic. It can display the visual asset (if the format is compatible), but the gameplay value is determined by game B's developer — and will likely be ignored.
Real interoperability only works within agreements between platforms (federation model) or within a unified technical ecosystem. Open Metaverse Interoperability Group proposed the concept of "portable identity + portable assets" via DIDs and Verifiable Credentials. In practice, adoption is still minimal, so we recommend building avatars on a modular principle:
- Off-chain standard:
.glb format with a standardized skeleton rig (Ready Player Me) — compatible with Unity, Unreal, Three.js.
- On-chain minimum: NFT with metadata pointing to
.glb. Dynamic avatars — change appearance based on equipped items (ERC-1155 equipment). Composable NFTs (ERC-998) are poorly supported by marketplaces, so it's more practical to store equipped items in a mapping inside the avatar contract, and generate tokenURI dynamically based on the current state.
Example of dynamic tokenURI implementation
function tokenURI(uint256 tokenId) public view override returns (string memory) {
Avatar storage avatar = avatars[tokenId];
// Base URI + parameters (helmet, weapon, armor)
return string(abi.encodePacked(
baseURI,
"?helmet=", toString(avatar.equipped.helmet),
"&weapon=", toString(avatar.equipped.weapon)
));
}
Virtual Economy: Marketplace and Rent Mechanics
The built-in economy includes land trading (primary and secondary market), land rental, content monetization (paid entry, advertising surfaces), and wearables/items trading.
Land rental. Standard ERC-4907 (Rental NFT) — separation of owner and user roles. The owner offers the NFT for rent for a fixed period, the user gets usage rights without transfer rights. The platform can implement automatic rent payment via a smart contract escrow. Upon expiry, the user role is automatically revoked. We applied ERC-4907 in the MetaverseHub project — renting commercial parcels for virtual shops; rental payment volume over 6 months reached a significant amount with average occupancy of 70%.
| Role |
Rights |
Duration |
| Owner |
Sell, set rent, change metadata |
Indefinite |
| User |
Use content, build |
Fixed term |
Content monetization on-chain. The parcel owner deploys a contract that accepts payment for access. The platform verifies ownership via eth_call before opening content. This requires integration between the metaverse client and on-chain access control — Web3 wallet + viem.
Technical Stack for Building a Metaverse
- Rendering: Three.js / Babylon.js (browser), Unity WebGL (complex scenes). Decentraland SDK — if building on top of Decentraland. Three.js is 2 times faster than Babylon.js for rendering simple scenes.
- Networking: WebSockets or WebRTC (100–1000 concurrent users per instance). Colyseus, Agones (Kubernetes) for scaling.
- Blockchain: wagmi + viem (frontend), ethers.js (server), The Graph (indexing), Chainlink VRF (random events). Foundry — 5 times faster than Hardhat when compiling tests.
- Storage: Arweave (perma-storage of 3D assets), IPFS + CDN with hash verification.
What's Included in the Work (Deliverables)
When ordering metaverse development, you get:
- Documentation: economic architecture, smart contract specification (land, avatar, marketplace).
- Source code of contracts with tests (Foundry, Slither audit).
- Subgraph for The Graph (indexing land, avatars, orders).
- Frontend kit: wallet integration, 3D world visualization.
- Access to private repository and CI/CD.
- Support for 3 months after release.
Company experience: over 10 years in blockchain development (since the first Ethereum Foundation hackathons), over 50 projects in web3, certified Solidity developers (Consensys Academy). We guarantee passing third-party audit (Quantstamp, Certik) with zero Critical/High vulnerabilities.
Process and Timeline
- Analytics (2–3 weeks): economic model, mechanics, L2/L1 selection.
- Design (3–4 weeks): contract architecture, data schema, interfaces.
- Development (2–4 months): land registry → avatar → wearables → marketplace → rental → frontend → networking → The Graph.
- Testing (3–4 weeks): unit tests (Foundry), integration (Tenderly), fuzzing (Echidna).
- Audit (2–4 weeks). Average audit budget varies depending on complexity.
- Deployment (1 week): mainnet/testnet, pinning and CDN setup.
Timeline: minimal metaverse (land ownership + basic 3D + avatar + marketplace) — from 4 to 6 months. Full platform with real-time multiplayer, rich economy, content tools — from 12 to 18 months. We will evaluate your project for free — write to us and discuss details.
Important: don't start with the visual part. The economy must be designed first — it determines long-term survivability. Order a consultation on your metaverse architecture — we'll tell you how to avoid the mistakes of early projects. Contact us — get a detailed implementation plan.