Inspiration
Freelancers get scammed. Clients get ghosted. And the platforms supposed to fix this (Upwork, Fiverr, Toptal,etc.) average 20% cuts, can ban you without warning, and still leave you with no real recourse when things go wrong.
We asked a simple question: what if the contract was the middleman?
QuestChain turns freelance work into on-chain quests (software bug bounties). The reward is locked in escrow the moment a job is posted. Milestones are approved on-chain. And when the work is done, a reputation NFT is minted as permanent, unkillable proof that you delivered. No platform. No middleman. No chargebacks.
What it does
QuestChain is a decentralized freelance escrow platform built on XRPL EVM Testnet. It lets clients post jobs as "quests" with XRP locked in a smart contract, and freelancers accept and complete them milestone by milestone with every action recorded on-chain. When a Milestone is approved, the payment is released immediately; at project completion, a ERC-721 reputation NFT is connected to the freelancers blockchain wallet, serving as a permanent, tamper proof record of completed work, that they own forever, independent of QuestChain's continued existence.
Post a Quest : clients define the job, milestones, and XRP reward. Funds are locked in the contract immediately on submission. Accept & Work: freelancers browse open quests and accept on-chain. No DMs, no handshake deals. Milestone Approvals: clients approve each stage on-chain, releasing payment incrementally.IPFS Metadata: job descriptions and details are pinned to IPFS via Pinata, keeping the chain lean while preserving full job context permanently.Reputation NFTs: completing a quest mints an NFT to the freelancer's wallet as verifiable proof of work.
How we built it
Frontend: React with wagmi v1 + RainbowKit for wallet connection. Custom RPG-themed UI with Cinzel typography, rarity tiers (Common to Legendary based on reward size), and a full quest board with filters.
Smart Contract: Solidity on XRPL EVM Testnet (Chain ID 1449000). Handles escrow, milestone tracking, dispute flagging, and NFT minting in a single TrustEscrow contract.
Backend: Node.js & Express. Handles Pinata IPFS uploads for job metadata, serves enriched job data from on-chain reads, and listens for contract events.
Storage: Pinata IPFS for all job metadata and NFT certificates: jobs live on-chain, their descriptions live on IPFS.
Chain: XRPL EVM Testnet chosen for fast block times, low fees, and XRP as native currency, making micro-milestone payments practical.
Challenges we ran into
XRPL EVM RPC rate limiting
the public testnet RPC aggressively rate-limits polling. We solved this by setting explicit pollingInterval: 6000ms in wagmi's configureChains, adding a fallback RPC, and setting explicit gasLimit on all contract calls since XRPL EVM doesn't auto-estimate gas the same way as Ethereum mainnet.
Block skew on event listeners
the backend's ethers provider was polling faster than blocks were arriving (~4s on XRPL), causing "block skew detected" warnings and dropped events. Fixed by aligning polling intervals to chain speed. Wei precision on milestone splits
dividing XRP rewards across milestones using JavaScript floats caused dust-level mismatches between sum(amounts) and msg.value. Fixed by doing all math in BigNumber and assigning remainder to the last milestone.
Race condition on quest refresh
after posting a quest, fetchQuests was reading stale totalJobs from React state instead of fetching fresh data, so new quests wouldn't appear. Fixed by fetching stats directly inside fetchQuests and adding a 2-second settle delay post-confirmation.
Accomplishments that we're proud of
.. Shipping a fully functional escrow system on XRPL EVM (a chain with little documentation and real RPC quirks and depreciations that forced us to dig deep into how wagmi's polling architecture works). .. We're proud that this isn't a mock. The contract is live on testnet, funds actually lock, milestones release payment, and metadata REALLY PERSISTS on IPFS. Every button in the demo does what it says on-chain. .. We're also proud of the UX. Most Web3 apps feel like developer tools. We wanted QuestChain to feel like something a non-crypto freelancer could actually use and enjoy from the quest board, rarity tiers, and RPG framing were deliberate design choices to approachable escrow (not intimidating). Really enjoyed Metamask wallet.
What we learned
- How to build on XRPL EVM and navigate its differences from standard EVM chains
- Practical escrow contract design through milestone-based release, dispute flags, reentrancy considerations
- How wagmi's polling architecture interacts with MetaMask's internal RPC poller (and how to stop them from clashing with each other)
- IPFS & on-chain hybrid storage layout: what belongs on-chain vs. off-chain
- UX in Web3 we spent time making the quest board feel alive, not just purely functional -Familiarity with blockchain concepts and structures
What's next for QuestChain
- Mobile wallet support WalletConnect integration for mobile-first users
- Quest categories & search semantic search over IPFS metadata using vector embeddings
Log in or sign up for Devpost to join the conversation.