Skip to content

The in-game wallet for purchases.

Players pay from a Solana wallet in their Minecraft client. The payment goes to your server's wallet, and your commands run when it confirms.

One jar for the client and the server. Minecraft 26.1 on Fabric, Quilt, NeoForge, Forge, Paper, Spigot or Bukkit.

Features

  • In-game wallet

    Players open the wallet via keybind or from menu. It shows SOL and SPL token balances, can send and receive, and supports multiple accounts. A wallet is created from a 12-word phrase or imported from an existing one, and stored encrypted with a password on the player's own computer.
  • Payment approval

    A sale opens a payment request on the player's screen with the product and the amount. The transaction is simulated first, so the screen lists the exact balance changes before anything is signed. The player approves or rejects it.
  • Treasury wallet

    The payment goes directly from the player to your treasury wallet through the CraftWallet on-chain program, which also writes a receipt. CraftWallet takes no cut. The player pays the Solana network fee unless your server sponsors.
  • Server setup

    Products go in products.toml: a name, a price in SOL or in an SPL token such as USDC, and the commands to run. Any shop plugin, NPC or command block starts a sale with /craftwallet buy <product> <player>. When the payment confirms, your commands run.

How it works

  1. Drop in the jar

    Put craftwallet.jar in mods/ or plugins/. The first start writes server.toml and products.toml and creates your merchant account. Put your wallet address in treasury; until then, payments go to the merchant account.

  2. List a product

    A name, a price in SOL or in an SPL token such as USDC, and the commands to run. Save the file and it reloads.

  3. Start a sale

    Steve runs /craftwallet buy vip, or a shop, NPC, command block or operator runs /craftwallet buy vip Steve for him.

  4. The player approves

    Steve sees the payment request in game and approves. When the chain confirms, your commands run and Steve gets a “Purchase complete” toast.

server.toml
# Shown to players in payment requests.
server-name = "My Minecraft Server"

# Where the money goes: your own wallet address. Leave it empty and
# payments go to the merchant account below instead.
treasury = "<your wallet address>"

# The merchant account's keypair, created on first start. It registers
# the merchant on chain and, with sponsor-fees, pays the network fees.
merchant-keypair-file = "merchant.json"
sponsor-fees = false
products.toml
[product.vip]
name = "VIP Rank"
price = 9.99
mint = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"   # USDC; omit for SOL
commands = ["lp user {player} parent add vip"]

Commands and permissions

Every command sits under a craftwallet.* permission node, so a permissions plugin or mod decides who can run what, and without one the defaults below apply.

Commands

CommandWhat it doesNodeDefault
/walletShow your own wallet address.craftwallet.walleteveryone
/wallet <player>Show another player's wallet address.craftwallet.wallet.othersoperators (level 2)
/craftwallet buy <product>Buy a product for yourself.craftwallet.buyeveryone
/craftwallet buy <product> <player>Start a sale for another player.craftwallet.buy.othersoperators (level 2)

Every command exists on Fabric, Quilt, NeoForge, Forge, Paper, Spigot and Bukkit. Default: who holds the node without a permissions plugin or mod. The console always names the player. The .others nodes include the plain ones; craftwallet.* grants every node.

Paper, Spigot, Bukkit
The nodes are declared in the plugin descriptor, so any permissions plugin assigns them, and craftwallet.* is a parent of the rest. Without one, the defaults apply.
Fabric, Quilt
The mod asks the Fabric Permissions API when a mod provides it (LuckPerms does), then Fabric API's own permission module (node craftwallet:wallet.others and so on), otherwise it falls back to the operator levels above.
NeoForge, Forge
The nodes are registered with the loader's permission API, which a permissions mod can take over. The fallback is the same operator levels.
Console, command blocks
The console always has every permission. Command blocks run at operator level 2, so NPC and shop plugins that run /craftwallet buy <product> <player> through the console or a command block need nothing extra.

Players without CraftWallet

A vanilla client can join but cannot pay, and /craftwallet buy for such a player fails at once with "Steve does not have CraftWallet installed". Every player carries the scoreboard tag craftwallet while their client is connected, so one console command, run by an NPC click, a chest-menu button, a command block or a shop plugin, starts the sale when they have it and does something else when they do not, for example opens your web store:

console
execute if entity @a[name=Steve,tag=craftwallet] run craftwallet buy vip Steve
execute unless entity @a[name=Steve,tag=craftwallet] run tellraw Steve {"text":"Open the web store","color":"aqua","click_event":{"action":"open_url","url":"https://store.example"}}

Works on every platform. On Paper, Spigot and Bukkit with PlaceholderAPI installed, %craftwallet_client% is true or false and %craftwallet_wallet% is the player's address, for menus that show a different button per player.

Placeholders

PlaceholderValue
{player}The buyer's name.
{uuid}The buyer's UUID.
{product}The product id: the TOML table key, e.g. vip.
{name}The product's display name.
{price}The listed price, e.g. 9.99.
{symbol}The asset symbol read from the chain, e.g. USDC, or SOL.
{amount}The amount transferred in the asset's smallest units, e.g. 9990000 for 9.99 USDC.
{mint}The mint address of the SPL token, or SOL for a product priced in SOL.
{wallet}The buyer's wallet address.
{signature}The confirmed transaction signature.
{merchant}The server's merchant account address.

Replaced in the product's commands from products.toml once the payment has confirmed.

Compatibility

The jar goes in mods/ on Fabric, Quilt, NeoForge and Forge, and in plugins/ on Paper, Spigot and Bukkit. Any client works with any server.

Client → ServerFabricQuiltNeoForgeForgePaperSpigotBukkit
FabricFabric client with Fabric server: worksFabric client with Quilt server: worksFabric client with NeoForge server: worksFabric client with Forge server: worksFabric client with Paper server: worksFabric client with Spigot server: worksFabric client with Bukkit server: works
QuiltQuilt client with Fabric server: worksQuilt client with Quilt server: worksQuilt client with NeoForge server: worksQuilt client with Forge server: worksQuilt client with Paper server: worksQuilt client with Spigot server: worksQuilt client with Bukkit server: works
NeoForgeNeoForge client with Fabric server: worksNeoForge client with Quilt server: worksNeoForge client with NeoForge server: worksNeoForge client with Forge server: worksNeoForge client with Paper server: worksNeoForge client with Spigot server: worksNeoForge client with Bukkit server: works
ForgeForge client with Fabric server: worksForge client with Quilt server: worksForge client with NeoForge server: worksForge client with Forge server: worksForge client with Paper server: worksForge client with Spigot server: worksForge client with Bukkit server: works

Minecraft 26.1 · Java 25 · Fabric API on Fabric and Quilt

Quilt runs the Fabric build. Bedrock and older Minecraft versions are not supported.

FAQ

Do players need to install anything?

Yes. Players put the same jar in their mods folder on Minecraft 26.1 with Fabric, Quilt, NeoForge or Forge. A vanilla client can still join your server but cannot pay; the craftwallet scoreboard tag lets your shop send those players to your web store instead.

Does CraftWallet take a cut?

No. The full price goes from the player to your treasury wallet. The player pays the Solana network fee unless you set sponsor-fees = true in server.toml.

Where is a player's wallet kept?

On the player's own computer, in the game folder, encrypted with their password. The server receives the public address and, for a purchase, a signature. It never sees the keys or the recovery phrase.

Can I price products in USDC or another SPL token?

Yes. Add the mint address to the product in products.toml and the price is in that asset. The name, symbol and decimals are read from the chain.

Does it work with my existing shop plugin?

If it can run a console command, yes. Have it run /craftwallet buy <product> <player> and CraftWallet asks that player's wallet to pay. NPC shops, chest menus and command blocks work the same way, and the craftwallet scoreboard tag tells them which players have the client.