A dynamic, order-book-based economy plugin for Minecraft servers.
This plugin creates a marketplace where players can trade items with each other. Instead of fixed prices, the market determines prices based on supply and demand - similar to how stock markets or Hypixel's Bazaar works.
Key Features:
Before installing, make sure you have:
CoinOp works with all major Minecraft server software:
| Server | Status | Notes |
|---|---|---|
| Paper | ✅ Full | Primary target - uses Paper API |
| Spigot | ✅ Full | Compatible via Spigot API |
| Bukkit | ✅ Full | Basic Bukkit API |
| Purpur | ✅ Full | Paper fork, 100% compatible |
| Pufferfish | ✅ Full | Paper fork, 100% compatible |
| Airplane | ✅ Full | Paper fork, 100% compatible |
| TacoSpigot | ✅ Full | Paper/Spigot fork, compatible |
| Akarin | ✅ Full | Paper fork, compatible |
Minecraft Versions:
plugins folderplugins/CoinOp/ folder with configuration filesconfig.yml to customize the plugin/coa reloadThe main configuration file is config.yml located in plugins/CoinOp/. Here's a detailed explanation of each section:
economy:
tax-rate: 0.0
tax-rate: A percentage taken from each trade. Set to 0.0 for no tax, 0.05 for 5% tax. The tax money disappears from the economy (it's not collected by anyone).Example: If you set 0.05 and a player sells diamonds for $100, they only receive $95.
orders:
min-amount: 1
max-amount: 2304
expiration-minutes: -1
min-amount: Minimum items per order. Default is 1.max-amount: Maximum items per order. Default is 2304 (36 stacks = one double chest). Set to -1 for unlimited.expiration-minutes: How long orders stay active. Default -1 means orders never expire. Set to 1440 for 24 hours, 10080 for 1 week.commodities:
allowed: []
categories:
ores:
- DIAMOND
- IRON_INGOT
- GOLD_INGOT
crops:
- WHEAT
- CARROT
allowed: Leave empty [] to allow all items. Or list specific items like [DIAMOND, IRON_INGOT] to only allow those.categories: Groups items together for the GUI. You can add your own categories.Adding a new category:
commodities:
categories:
nether:
- NETHERITE_INGOT
- QUARTZ
- GLOWSTONE_DUST
limits:
global-daily-limit: 0
daily-limits:
DIAMOND: 1000
global-daily-limit: Maximum total items a player can trade per day. 0 means unlimited.daily-limits: Per-item limits. The example limits players to 1000 diamonds per day.Why use limits? Prevents players from manipulating the market or laundering money.
price-bounds:
enabled: true
global-min: 0.01
global-max: 1000000000
commodities:
DIAMOND:
min: 10.0
max: 10000.0
enabled: Turn price bounds on/offglobal-min: Minimum price for any item (default: $0.01)global-max: Maximum price for any item (default: $1 billion)commodities: Set specific limits per itemWhy use price bounds? Prevents players from:
Example scenario: You want diamonds to trade between $10 and $10,000:
price-bounds:
enabled: true
commodities:
DIAMOND:
min: 10.0
max: 10000.0
Now if someone tries to place a buy order for $5, it will be rejected. If someone tries to sell for $15,000, it will be rejected.
If you run multiple servers and want them to share the same market:
sync:
enabled: true
redis:
host: localhost
port: 6379
password: ""
database: 0
enabled: Turn sync on/offhost: Redis server IP addressport: Redis port (default 6379)password: Redis password (leave empty if none)database: Redis database number (0-15)How it works: When a player places an order on Server A, it instantly appears on Server B. Trades are synchronized across all connected servers.
Do I need Redis? Only if you run multiple servers. For a single server, leave enabled: false.
database:
type: sqlite
host: localhost
port: 3306
name: CoinOp
user: root
password: ""
type: Either sqlite or mysql
sqlite: Stores data in a local file. Good for single servers.mysql: Connects to a MySQL server. Good for multi-server setups.host, port, name, user, password: MySQL connection details (ignored if using SQLite)When to use MySQL: If you run multiple servers and want them to share order history and player data.
lore:
enabled: true
update-interval: 20
show-history: true
history-points: 5
enabled: Show market prices in item tooltipsupdate-interval: How often to refresh prices (in ticks, 20 ticks = 1 second)show-history: Show price trend in tooltiphistory-points: How many price points to showWhat players see: When they hover over a diamond in their inventory, they'll see:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CoinOp Market Data
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Buy Price: $50.00 each
Sell Price: $48.50 each
24h Volume: 125,300
Trend: ▲ Up
anvil-rework:
enabled: true
enchantment-extraction: true
max-cost: 0
material-costs:
NETHERITE_INGOT: 15
DIAMOND: 10
enabled: Turn the anvil rework on/offenchantment-extraction: Allow moving enchants to booksmax-cost: Maximum anvil cost. 0 means unlimited (no "Too Expensive!")material-costs: Base costs for different materialsHow it works: Instead of exponential costs (2^n - 1), the anvil uses linear costs based on material rarity. This means you can combine many enchantments without hitting the "Too Expensive!" limit.
Enchantment Extraction: Put an enchanted item in the left slot and a book in the right slot. The enchantments will transfer to the book.
gui:
enabled: true
open-on-command: true
title: "&6CoinOp &8- &7Market"
main-menu-size: 54
sounds:
open: "BLOCK_CHEST_OPEN"
click: "UI_BUTTON_CLICK"
icons:
ores: "DIAMOND"
crops: "WHEAT"
enabled: Turn the GUI on/offopen-on-command: Open GUI when player runs /CoinOp without argumentstitle: GUI title (supports color codes: &6 = gold, &8 = dark gray, &7 = gray)main-menu-size: GUI size (must be multiple of 9, max 54)sounds: Sound effects for different actionsicons: Which items represent each categoryColor Codes:
&0 - Black&1 - Dark Blue&2 - Dark Green&3 - Dark Aqua&4 - Dark Red&5 - Dark Purple&6 - Gold&7 - Gray&8 - Dark Gray&9 - Blue&a - Green&b - Aqua&c - Red&d - Light Purple&e - Yellow&f - White| Command | Aliases | Description | Example |
|---|---|---|---|
/coinop | /co, /market | Open the CoinOp menu | /coinop |
/coinop buy <item> <amount> <price> | /coinbuy | Place a buy order | /coinbuy DIAMOND 100 50 |
/coinop sell <item> <amount> <price> | /coinsell | Place a sell order | /coinsell DIAMOND 100 50 |
/coinop instant buy <item> <amount> | /coininstant | Buy at market price | /coininstant buy DIAMOND 64 |
/coinop instant sell <item> <amount> | /coininstant | Sell at market price | /coininstant sell DIAMOND 64 |
/coinop orders | /coinorders | View your active orders | /coinorders |
/coinop orders cancel <item> <id> | - | Cancel an order | /coinop orders cancel DIAMOND 12345 |
/coinop price <item> | /coinprice | Check current prices | /coinprice DIAMOND |
/coinop history <item> | - | View recent trades | /coinop history DIAMOND |
| Command | Aliases | Description |
|---|---|---|
/coinadmin reload | /coa reload | Reload configuration |
/coinadmin bounds list | /coa bounds list | List all price bounds |
/coinadmin bounds set <item> <min> <max> | /coa bounds set | Set price bounds |
/coinadmin bounds remove <item> | /coa bounds remove | Remove price bounds |
/coinadmin limits list | /coa limits list | List all trade limits |
/coinadmin limits set <item> <limit> | /coa limits set | Set daily trade limit |
/coinadmin stats [item] | /coa stats | View trading statistics |
/coinadmin cleanup | /coa cleanup | Remove inactive orders |
/coinadmin sync status | /coa sync status | Check Redis connection |
| Permission | Description | Default |
|---|---|---|
CoinOp.use | Basic CoinOp usage | Everyone |
CoinOp.buy | Place buy orders | Everyone |
CoinOp.sell | Place sell orders | Everyone |
CoinOp.instant | Use instant buy/sell | Everyone |
CoinOp.orders | View own orders | Everyone |
CoinOp.cancel | Cancel own orders | Everyone |
CoinOp.admin | Admin commands | OPs only |
CoinOp.admin.bounds | Set price bounds | OPs only |
CoinOp.admin.limits | Set trade limits | OPs only |
CoinOp.admin.reload | Reload config | OPs only |
CoinOp.admin.sync | Manage sync settings | OPs only |
CoinOp.bypass.limit | Bypass trade limits | OPs only |
CoinOp.bypass.bounds | Bypass price bounds | OPs only |
The CoinOp uses an order book - the same system used by real stock markets:
Buy Orders (Bids): Players say "I want to buy X items at $Y each"
Sell Orders (Asks): Players say "I want to sell X items at $Y each"
Matching: When a buy order's price meets or exceeds a sell order's price, a trade happens at the sell order's price.
Example Trade:
For players who want immediate trades:
If no matching orders exist, the trade is rejected.
The plugin will auto-download Vault on first run. If it fails:
plugins folderYou need an economy plugin. Install one of these:
The price is outside the limits set in config.yml. Either:
CoinOp.bypass.bounds permissionThe player has traded too much of that item today. Either:
CoinOp.bypass.limit permissionCheck these settings in config.yml:
gui:
enabled: true
open-on-command: true
/coa sync statusIf you want to modify the plugin:
./gradlew build (Linux/Mac) or gradlew.bat build (Windows)versions/*/build/libs/MIT License with Attribution
Developer: APPLEPIE6969
Inspired by Hypixel's Bazaar system and the Minecraft community's requests for a dynamic economy plugin.

A dynamic order-book economy plugin where players trade items at player-driven prices. Features instant buy/sell, lore-based price tooltips, multi-server sync, optional GUI, and anvil cost rework.