Voxel Shop beta is live. Expect occasional bugs. Learn more
Cross-server economy synchronization plugin for Minecraft
Overview
Syncmoney is an enterprise-oriented Minecraft economy plugin focused on safe, consistent cross-server balance synchronization. It bridges Vault and VaultUnlocked economies across network nodes using Redis Pub/Sub and relational database persistence, backed by in-memory caching and comprehensive circuit breakers.
Syncmoney manages balances, currency operations, and its own economy commands and administration tiers. It is not a general-purpose permission or arbitrary command replicator.
Key Features
Platform & Compatibility
| Server Engine | Paper 1.20.4+ (Build API baseline), Folia, Canvas. Plain Spigot is not supported. |
| Java Runtime | Java 21 (Paper 1.20.4 – 1.20.6); Java 25 required for Paper 26.1+ environments. |
| Economy Bridge | Required: Vault (legacy 1.7) or VaultUnlocked (2.20.0+). Do not load both concurrently under the same name. |
| Message Broker | Redis 5.0+ (Required for [ICODE]sync[/ICODE], [ICODE]local_redis[/ICODE], and [ICODE]cmi[/ICODE] modes). |
| Database | MySQL 8.0+, MariaDB 10.5+, PostgreSQL 13+, or local SQLite. |
| Optional Integrations | PlaceholderAPI (with [ICODE]SyncmoneyExpansion[/ICODE]), CMI (compatible licensed release for [ICODE]cmi[/ICODE] mode). |
The 1.3.0 acceptance matrix covers Paper 1.20.4, Paper 26.2, Folia 26.2 BETA, Canvas 26.2, and a two-backend Paper 26.2 network behind the latest [ICODE]velocity-ctd[/ICODE] build. This is a tested compatibility baseline, not a promise that an unreleased server build will remain binary-compatible.
Installation & Setup
[LIST=1]Backup: Stop your server and take a full backup of existing plugin configs, economy databases, and Redis persistence.Install Plugin: Place [ICODE]Syncmoney-1.3.0.jar[/ICODE] and your preferred Vault provider in the server's [ICODE]plugins/[/ICODE] directory. Remove any older Syncmoney JAR versions.Initialize Configuration: Start the server once to generate default configuration files, then stop it.Configure Node: In [ICODE]plugins/Syncmoney/config.yml[/ICODE]:
Start & Verify: Start the server. Confirm in the console logs that Syncmoney and Vault have registered successfully. Verify basic transactions with [ICODE]/money[/ICODE] and [ICODE]/pay[/ICODE].Placeholders (Optional): If using PlaceholderAPI, copy [ICODE]SyncmoneyExpansion-1.3.0.jar[/ICODE] into [ICODE]plugins/PlaceholderAPI/expansions/[/ICODE] and run [ICODE]/papi reload[/ICODE].
[/LIST]
Economy Modes
| [ICODE]local[/ICODE] | Single-server SQLite file. No Redis or external database required. | Standalone servers without cross-server requirements. |
| [ICODE]local_redis[/ICODE] | Redis-backed network economy without SQL persistence. | Networks relying on persistent Redis storage (AOF/RDB). |
| [ICODE]sync[/ICODE] | Redis Pub/Sub + central SQL database (MySQL / MariaDB / PostgreSQL). | Standard multi-server networks requiring robust relational persistence. SQLite is for LOCAL/Shadow storage, not this shared database connection. |
| [ICODE]cmi[/ICODE] | CMI retains primary economy authority; mutations propagate via Redis. | Networks using CMI as the authoritative economy engine. |
| [ICODE]auto[/ICODE] | Automatically detects installed environment and suggests mode. | For quick evaluations; explicit mode configuration is recommended for production. |
Minimal Standalone Configuration ([ICODE]local[/ICODE])
server-name: "single-01"
economy:
mode: "local"
redis:
enabled: false
database:
enabled: false
db-enabled: false
pubsub-enabled: false
Shared Network Configuration ([ICODE]sync[/ICODE])
Set [ICODE]economy.mode: "sync"[/ICODE], enable both [ICODE]redis[/ICODE] and [ICODE]database[/ICODE], and ensure [ICODE]db-enabled: true[/ICODE] and [ICODE]pubsub-enabled: true[/ICODE]. Point all participating nodes to the same isolated Redis database and relational database schema while giving each server a distinct [ICODE]server-name[/ICODE].
Optional Modules & Lifecycle
All optional modules can be toggled in [ICODE]plugins/Syncmoney/config.yml[/ICODE].
| Global Circuit Breaker | [ICODE]circuit-breaker.enabled[/ICODE] | Halts global economy operations upon abnormal inflation or anomalies. Status reports disabled when inactive. |
| Per-Player Protection | [ICODE]circuit-breaker.player-protection.enabled[/ICODE] | Independent rate-limiting, warnings, and automatic account freeze for suspicious player activities. |
| Transaction Guard | [ICODE]transfer-guard.enabled[/ICODE] | Protects players from balance inconsistency during cross-server transfers or teleports. |
| Audit Logging | [ICODE]audit.enabled[/ICODE] | Asynchronous transaction audit trail. Sub-features ([ICODE]cleanup[/ICODE], [ICODE]export[/ICODE], [ICODE]redis[/ICODE]) require this parent switch. |
| Shadow Sync | [ICODE]shadow-sync.enabled[/ICODE] | Background snapshot mirroring to secondary databases. Does not replace primary database backups. |
| Discord Webhooks | [ICODE]discord-webhook.enabled[/ICODE] | Real-time notifications for circuit breaker triggers, locks, and migration events. |
| Web Admin Panel | [ICODE]web-admin.enabled[/ICODE] | Embedded Undertow HTTP/WebSocket service for administrative dashboard. |
Commands & Permissions
Player Commands
| [ICODE]/money[/ICODE] | View personal balance | [ICODE]syncmoney.money[/ICODE] (default: true) |
| [ICODE]/money [/ICODE] | View another player's balance | [ICODE]syncmoney.money.others[/ICODE] (default: op) |
| [ICODE]/pay [/ICODE] | Send money to another player | [ICODE]syncmoney.pay[/ICODE] (default: true) |
| [ICODE]/pay confirm[/ICODE] | Confirm high-value transaction above threshold | None (session verified) |
| [ICODE]/baltop [page][/ICODE] | View global wealth leaderboard | [ICODE]syncmoney.money[/ICODE] (default: true) |
| [ICODE]/baltop me[/ICODE] | Check personal leaderboard position | [ICODE]syncmoney.money[/ICODE] (default: true) |
Administrative Commands
| [ICODE]/syncmoney admin give [/ICODE] | Add balance to player | [ICODE]syncmoney.admin.give[/ICODE] / Admin tier |
| [ICODE]/syncmoney admin take [/ICODE] | Deduct balance from player | [ICODE]syncmoney.admin.take[/ICODE] / Admin tier |
| [ICODE]/syncmoney admin set [/ICODE] | Set player balance directly | [ICODE]syncmoney.admin.set[/ICODE] / Admin tier |
| [ICODE]/syncmoney admin reset [/ICODE] | Reset player balance to zero | [ICODE]syncmoney.admin.set[/ICODE] / Admin tier |
| [ICODE]/syncmoney admin view [/ICODE] | Inspect detailed balance state | [ICODE]syncmoney.admin[/ICODE] |
| [ICODE]/syncmoney breaker status[/ICODE] | View circuit breaker health and state | [ICODE]syncmoney.admin[/ICODE] |
| [ICODE]/syncmoney breaker reset[/ICODE] | Reset tripped global breaker | [ICODE]syncmoney.admin[/ICODE] |
| [ICODE]/syncmoney breaker unlock [/ICODE] | Manually unlock a frozen player | [ICODE]syncmoney.admin[/ICODE] |
| [ICODE]/syncmoney audit [page][/ICODE] | View player audit history | [ICODE]syncmoney.admin.audit[/ICODE] |
| [ICODE]/syncmoney audit search [/ICODE] | Advanced audit record search | [ICODE]syncmoney.admin.audit[/ICODE] |
| [ICODE]/syncmoney audit stats[/ICODE] | View audit storage statistics | [ICODE]syncmoney.admin.audit[/ICODE] |
| [ICODE]/syncmoney monitor [redis|cache|db][/ICODE] | View real-time system and resource health | [ICODE]syncmoney.admin.monitor[/ICODE] |
| [ICODE]/syncmoney econstats [supply|players][/ICODE] | Inspect total supply and distribution | [ICODE]syncmoney.admin.econstats[/ICODE] |
| [ICODE]/syncmoney debug [/ICODE] | Multi-tier balance inspection across layers | [ICODE]syncmoney.admin[/ICODE] |
| [ICODE]/syncmoney sync-balance [/ICODE] | Force push memory balance to Redis and SQL | [ICODE]syncmoney.admin[/ICODE] |
| [ICODE]/syncmoney shadow [status|now|logs][/ICODE] | Monitor and trigger Shadow Sync tasks | [ICODE]syncmoney.admin[/ICODE] |
| [ICODE]/syncmoney web [status|open|reload][/ICODE] | Manage embedded web service | [ICODE]syncmoney.admin[/ICODE] |
| [ICODE]/syncmoney migrate [/ICODE] | Execute economy database migration | [ICODE]syncmoney.admin[/ICODE] |
| [ICODE]/syncmoney test concurrent-pay [/ICODE] | Run concurrent load tests on disposable setups | [ICODE]syncmoney.admin.test[/ICODE] |
| [ICODE]/syncmoney reload [config|messages][/ICODE] | Reload allowable configuration sections | [ICODE]syncmoney.admin.reload[/ICODE] |
Administrative Permission Tiers
Configurable in [ICODE]config.yml[/ICODE] under [ICODE]admin-permissions[/ICODE]:
| Observe | [ICODE]syncmoney.admin.observe[/ICODE] | View only (0 give / 0 take) |
| Reward | [ICODE]syncmoney.admin.reward[/ICODE] | 100,000 give / 0 take |
| General | [ICODE]syncmoney.admin.general[/ICODE] | 1,000,000 give / 1,000,000 take |
| Full | [ICODE]syncmoney.admin.full[/ICODE] | Unlimited |
PlaceholderAPI Identifiers
Syncmoney provides an optional expansion ([ICODE]SyncmoneyExpansion[/ICODE]) for PlaceholderAPI:
| [ICODE]%syncmoney_balance%[/ICODE] | Unformatted numeric balance |
| [ICODE]%syncmoney_balance_formatted%[/ICODE] | Balance formatted with comma groupings ([ICODE]1,250.00[/ICODE]) |
| [ICODE]%syncmoney_balance_abbreviated%[/ICODE] | Abbreviated balance notation ([ICODE]1.5K[/ICODE], [ICODE]2.4M[/ICODE]) |
| [ICODE]%syncmoney_balance_%[/ICODE] | Balance of a specific target player |
| [ICODE]%syncmoney_rank%[/ICODE] or [ICODE]%syncmoney_my_rank%[/ICODE] | Player's rank on the leaderboard |
| [ICODE]%syncmoney_top_%[/ICODE] | Balance of the player at rank [ICODE]n[/ICODE] |
| [ICODE]%syncmoney_total_supply%[/ICODE] | Total currency circulating in the economy |
| [ICODE]%syncmoney_total_players%[/ICODE] | Total registered accounts tracked in leaderboard |
| [ICODE]%syncmoney_online_players%[/ICODE] | Current online player count |
| [ICODE]%syncmoney_version%[/ICODE] | Active Syncmoney plugin version |
Web Admin Setup & Security
The Web Admin module includes a lightweight Undertow HTTP server and pre-built frontend distribution.
web-admin:
enabled: true
server:
host: "127.0.0.1"
port: 8080
security:
api-key: "GENERATE_A_LONG_SECURE_RANDOM_KEY"
cors-allowed-origins: "https://admin.yournetwork.com"
Security Recommendations
[LIST=1]Reverse Proxy: Bind Web Admin to [ICODE]127.0.0.1[/ICODE] and route external traffic through Nginx or Caddy with HTTPS.API Key: Always replace the placeholder API key with a cryptographically secure token.SSE / WebSocket: When reverse proxying, ensure proxy buffering is disabled to support live SSE updates.Firewall: Restrict external access to the configured HTTP port.
[/LIST]
Developer Integration
Vault Provider Access
Syncmoney registers itself as a standard Vault provider:
RegisteredServiceProvider rsp = getServer().getServicesManager().getRegistration(Economy.class);
if (rsp != null) {
Economy economy = rsp.getProvider();
BigDecimal balance = BigDecimal.valueOf(economy.getBalance(player));
}
On servers running VaultUnlocked, Syncmoney also registers modern Vault2 services automatically.
Transaction Events
Subscribe to [ICODE]PostTransactionEvent[/ICODE] for transaction auditing:
@EventHandler
public void onPostTransaction(PostTransactionEvent event) {
if (!event.isSuccess()) {
return;
}
UUID playerUuid = event.getPlayerUuid();
BigDecimal amount = event.getAmount();
AsyncPreTransactionEvent.TransactionType type = event.getType();
// Handle post-transaction telemetry
}
Building from Source
Syncmoney uses Gradle with a Java 21 toolchain:
# Build the plugin JAR and PAPI expansion
./gradlew test shadowJar :syncmoney-papi-expansion:jar
# Build Web Admin frontend (requires Node.js and pnpm)
cd syncmoney-web
pnpm install
pnpm typecheck
pnpm test:unit --run
pnpm build
Compiled JAR files are produced in [ICODE]build/libs/[/ICODE] and [ICODE]syncmoney-papi-expansion/build/libs/[/ICODE].
Troubleshooting & Support
License
This project is licensed under the Apache License 2.0.