Decentralized Prediction Market Development on Ethereum
Prediction markets offer a fascinating blend of finance, information aggregation, and blockchain technology, enabling users to bet on future events transparently and autonomously. In this blog, we'll walk through creating a decentralized prediction market on Ethereum, exploring its structure, coding it in Solidity, and deploying it on the blockchain. By the end, you'll have a foundational understanding of decentralized prediction markets and the knowledge to build one yourself. If you are looking for more about DeFi, visit our DeFi development services
Prerequisites
- Basic knowledge of Solidity and Ethereum Smart Contracts.
- Installed tools: Node.js, npm, Truffle, and Ganache or Hardhat.
- Ethereum wallet: MetaMask for testing on a public testnet like Rinkeby or Goerli.
You may also like | How to Create a Yield Farming Contract
What is a Decentralized Prediction Market?
A decentralized prediction market allows users to place bets on the outcome of a specific event. Outcomes are decided based on real-world data, and payouts are distributed depending on the result. Events could range from elections to sports outcomes or even crypto price forecasts. The decentralized nature of Ethereum-based prediction markets offers users transparency, fairness, and immutability.
Designing the Prediction Market Smart Contract
Our smart contract will allow users to:
- Create markets for predicting events.
- Place bets on available outcomes.
- Settle markets based on outcomes.
- Distribute winnings based on the outcome.
Key Functions
- Creating a Market: Allow a user to create a prediction market.
- Placing Bets: Allow users to place bets on specified outcomes.
- Finalizing Market: After the outcome is known, finalize the market and distribute winnings.
Also, Explore | How to Create a Liquid Staking Pool
A Step-by-Step Code Explanation
Here's a basic Solidity smart contract to get started:
solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract PredictionMarket {
enum MarketOutcome { None, Yes, No }
struct Market {
string description;
uint256 deadline;
MarketOutcome outcome;
bool finalized;
uint256 totalYesBets;
uint256 totalNoBets;
mapping(address => uint256) yesBets;
mapping(address => uint256) noBets;
}
mapping(uint256 => Market) public markets;
uint256 public marketCount;
address public admin;
event MarketCreated(uint256 marketId, string description, uint256 deadline);
event BetPlaced(uint256 marketId, address indexed user, MarketOutcome outcome, uint256 amount);
event MarketFinalized(uint256 marketId, MarketOutcome outcome);
modifier onlyAdmin() {
require(msg.sender == admin, "Only admin can execute");
_;
}
constructor() {
admin = msg.sender;
}
// Create a new market
function createMarket(string memory _description, uint256 _deadline) public onlyAdmin {
require(_deadline > block.timestamp, "Deadline must be in the future");
Market storage market = markets[marketCount++];
market.description = _description;
market.deadline = _deadline;
emit MarketCreated(marketCount - 1, _description, _deadline);
}
// Place a bet
function placeBet(uint256 _marketId, MarketOutcome _outcome) public payable {
Market storage market = markets[_marketId];
require(block.timestamp < market.deadline, "Betting period is over");
require(_outcome == MarketOutcome.Yes || _outcome == MarketOutcome.No, "Invalid outcome");
require(msg.value > 0, "Bet amount must be greater than zero");
if (_outcome == MarketOutcome.Yes) {
market.yesBets[msg.sender] += msg.value;
market.totalYesBets += msg.value;
} else {
market.noBets[msg.sender] += msg.value;
market.totalNoBets += msg.value;
}
emit BetPlaced(_marketId, msg.sender, _outcome, msg.value);
}
// Finalize the market with the actual outcome
function finalizeMarket(uint256 _marketId, MarketOutcome _outcome) public onlyAdmin {
Market storage market = markets[_marketId];
require(block.timestamp >= market.deadline, "Market cannot be finalized before deadline");
require(!market.finalized, "Market already finalized");
market.outcome = _outcome;
market.finalized = true;
emit MarketFinalized(_marketId, _outcome);
}
// Claim winnings
function claimWinnings(uint256 _marketId) public {
Market storage market = markets[_marketId];
require(market.finalized, "Market not finalized yet");
uint256 payout;
if (market.outcome == MarketOutcome.Yes) {
uint256 userBet = market.yesBets[msg.sender];
payout = userBet + (userBet * market.totalNoBets / market.totalYesBets);
market.yesBets[msg.sender] = 0;
} else if (market.outcome == MarketOutcome.No) {
uint256 userBet = market.noBets[msg.sender];
payout = userBet + (userBet * market.totalYesBets / market.totalNoBets);
market.noBets[msg.sender] = 0;
}
require(payout > 0, "No winnings to claim");
payable(msg.sender).transfer(payout);
}
}
Also, Check | How to Swap Tokens on Uniswap V3
Explanation of the Code
- Structs and Enums: We define a
Market
struct to store the details of each prediction market, and an enumMarketOutcome
to represent the possible outcomes (Yes
,No
, orNone
). - Market Creation: The
createMarket
function lets the admin create a market, specifying a description and a deadline. - Betting on Outcomes:
placeBet
allows users to bet on an outcome (Yes
orNo
) with an amount in Ether. - Finalizing the Market:
finalizeMarket
enables the admin to lock in the actual outcome once the event is over. - Claiming Winnings: Users can call
claimWinnings
to receive their payout if they bet on the correct outcome.
Conclusion
In conclusion, developing a decentralized prediction market on Ethereum provides a powerful way to leverage blockchain's transparency, security, and trustlessness. By following the outlined steps, developers can create platforms that foster open participation and reliable forecasting. This innovation empowers users to make informed predictions while maintaining trust in the system, ultimately contributing to a more decentralized and efficient financial ecosystem. Embrace this opportunity to build solutions that harness the full potential of blockchain technology. Connect with our skilled blockchain developers for more information.