Metaverse Development
The term "metaverse" is overloaded. Before designing, we always clarify: is it a persistent 3D world with real-time interaction (like Decentraland, The Sandbox), a social layer over applications, or virtual offices for enterprise? Each model has its own stack. Here we break down the architecture of a web3-native persistent world: a multiplayer 3D environment with NFT land, on-chain economy, and decentralized governance. This is the most technically complex and in-demand option.
We have five completed metaverse projects and over 5 years of experience in Web3. We share our experience so you can assess the scope of work and avoid common mistakes. However, it's important to understand: an empty world without content and community is dead. In parallel with development, we launch a program for early LAND holders and creators. Contact us to discuss the strategy for attracting creators.
Metaverse Architecture: Blockchain, Content, and Real-Time
Everything of value lives on-chain. The rest (3D assets, scenes) is off-chain on IPFS or Arweave. Here are the key layers.
How Are Ownership and Economy Separated?
- LAND NFTs — virtual land parcels (ERC-721).
- Avatar NFTs — characters with attributes.
- Wearables — items (ERC-1155 or ERC-721).
- Governance token — votes in the DAO.
- In-world currency — ERC-20 for internal transactions.
Content on LAND is not on-chain. The owner deploys 3D scenes and scripts to IPFS — this is flexible and cheap.
LAND System: Coordinate Grid and Estate
A classic model — a map of square parcels with coordinates. As noted in official Decentraland documentation, the coordinate grid is built from the center. Decentraland uses (-150,-150) to (150,150). We apply the same approach:
contract LandRegistry is ERC721 {
int16 public constant MIN_X = -100;
int16 public constant MAX_X = 100;
int16 public constant MIN_Y = -100;
int16 public constant MAX_Y = 100;
function coordinatesToId(int16 x, int16 y) public pure returns (uint256) {
require(x >= MIN_X && x <= MAX_X, "X out of range");
require(y >= MIN_Y && y <= MAX_Y, "Y out of range");
return uint256(uint16(x - MIN_X)) * 201 + uint256(uint16(y - MIN_Y));
}
function idToCoordinates(uint256 tokenId) public pure returns (int16 x, int16 y) {
y = int16(int256(tokenId % 201)) + MIN_Y;
x = int16(int256(tokenId / 201)) + MIN_X;
}
function isAdjacent(uint256 tokenId1, uint256 tokenId2) public pure returns (bool) {
(int16 x1, int16 y1) = idToCoordinates(tokenId1);
(int16 x2, int16 y2) = idToCoordinates(tokenId2);
int16 dx = x1 - x2;
int16 dy = y1 - y2;
return (dx == 0 && (dy == 1 || dy == -1)) || (dy == 0 && (dx == 1 || dx == -1));
}
}To merge adjacent parcels, an Estate composite NFT is used. Ownership of a parcel gives control over the scene content.
Why Is Content Stored Off-Chain?
Storing 3D models and scripts on the blockchain is prohibitively expensive. One gigabyte on Ethereum costs thousands of dollars. Off-chain storage on IPFS or Arweave solves the problem: the LAND owner publishes a scene hash, and the network loads content through a gateway.
Content System: What Is Deployed on LAND
Each LAND has a scene — a JSON descriptor with links to 3D models, scripts, and portals. Publishing through a simple contract:
contract LandContent {
mapping(uint256 => string) public sceneHash;
mapping(uint256 => uint256) public sceneVersion;
function publishScene(uint256 landId, string calldata ipfsHash) external {
require(landRegistry.ownerOf(landId) == msg.sender, "Not owner");
require(bytes(ipfsHash).length == 46, "Invalid IPFS hash");
sceneHash[landId] = ipfsHash;
sceneVersion[landId]++;
emit ScenePublished(landId, msg.sender, ipfsHash, sceneVersion[landId]);
}
}Developers write interactive scripts in a sandbox environment via an SDK. Example — a door that opens on click, or an NFT gate for access.
How Does Real-Time Avatar Synchronization Work?
Players see each other through game servers, each region (N×N LAND) served by a separate server. When crossing a border — handoff.
Area Server on Node.js
class AreaServer {
private players = new Map<string, PlayerState>();
private physicsWorld = new World({ x: 0, y: -9.81, z: 0 });
handlePlayerJoin(playerId: string, ws: WebSocket, position: Vector3) {
// ... add player, send snapshot, broadcast
}
handleMovement(playerId: string, movement: MovementPacket) {
// server-side validation, broadcast with delta compression
}
private tick() {
this.physicsWorld.step();
const updates = this.getDirtyPlayerStates();
if (updates.length > 0) this.broadcast({ type: 'batch_update', updates });
}
}To reduce load, we use proximity-based broadcasting — visibility is limited by a radius (e.g., 100 meters). This turns O(N²) into O(N×K).
Metaverse Economy and Governance
In-World Marketplace with Royalties
A LAND owner earns 2.5% on sales on their land:
contract InWorldMarketplace {
uint256 public constant LAND_ROYALTY = 250;
function buy(uint256 listingId) external {
// checks, calculations, transfer of tokens and NFT
}
}Play-to-earn generates in-world currency for attending events, completing quests, participating in mini-games. Emission is controlled by a weekly cap and halvening.
DAO and Voting
Governance via Compound-style Governor. LAND ownership gives voting power (1 LAND = 1 vote + bonus for staking governance token). Decisions include: map expansion, economic parameters, contract upgrades.
Technology Stack and Development Process
Full Stack
| Layer | Technology |
|---|---|
| Blockchain | Polygon PoS / Arbitrum |
| LAND/NFT | Solidity + Foundry |
| Governance | OpenZeppelin Governor |
| Storage | IPFS + Arweave |
| Real-time | Node.js + uWebSockets.js |
| Physics | Rapier3D (WASM) |
| 3D Web | Three.js + React Three Fiber |
| Avatar | ReadyPlayerMe or VRM |
| Indexing | The Graph |
Note: Choosing an L2 (Polygon or Arbitrum) dramatically reduces gas — 100x cheaper than Ethereum. This is critical for mass adoption.
What's Included in the Work
- Smart contract audit (LAND, marketplace, token) — we guarantee absence of reentrancy and typical vulnerabilities.
- Full documentation for content creator SDK integration.
- Infrastructure setup: IPFS pinning, game servers, databases.
- Post-launch support: monitoring, hotfixes, economy adjustments.
Phases and Timelines
| Phase | Content | Duration |
|---|---|---|
| Foundation | LAND contracts, coordinates, basic marketplace | 4–6 weeks |
| Content system | Scene descriptor, IPFS, publishing | 3–4 weeks |
| 3D Client | Three.js world, scene loading, navigation | 6–8 weeks |
| Real-time | Area servers, synchronization | 6–8 weeks |
| Economy | In-world token, marketplace, P2E | 4–6 weeks |
| Scripting SDK | Sandbox, NFT gates | 4–6 weeks |
| Governance | DAO contracts, UI | 3–4 weeks |
| Audit | All contracts | 5–8 weeks |
| Alpha launch | Limited map | 2–4 weeks |
Realistic timeline: 12–18 months to public alpha for a team of 8–12 people. This is one of the most ambitious projects in Web3.
The main risk is not technical but product-oriented: without content and community, the world will be empty. Therefore, in parallel, we launch a program for early LAND holders and creators. To assess your project and propose the optimal architecture, request a consultation.







