Pixel Kingdom Wars

HomeDocs › Money and security

Deposits, withdrawals and 2FA

How KEEP moves between your wallet and the game: deposits, withdrawal limits and statuses, authenticator 2FA, custody, and proof of reserves.

This page explains how KEEP moves between your Solana wallet and your in-game balance, what the withdrawal limits and statuses mean, and how two-factor authentication (2FA) fits in. It also describes, in plain words, how the game holds your KEEP and how you can check that it is fully backed.

Everything here runs on Solana devnet during the playtest. Devnet SOL and devnet KEEP are test-net tokens with no real-world value. Nothing on this page is a mainnet promise.

Quick facts

Where your KEEP lives

Your in-game KEEP is a balance in the game's ledger, backed 1:1 by a custody ("hot") wallet on Solana devnet. Deposited KEEP and KEEP you earn in play share one balance and one withdrawal allowance. Deposited KEEP is treated as a liability owed back to you; it is never used to fund rewards.

Shards are the building currency. You can convert KEEP to shards 1:1 on the KEEP WALLET screen, but that conversion is one-way: shards are never withdrawable, and only the GOLD FORGE turns shards back into KEEP. See Economy: Shards and KEEP and Gold Forge.

The KEEP WALLET view with balance, deposit and withdraw actions

Depositing KEEP

Open KEEP WALLETDEPOSIT KEEP, enter a whole-KEEP amount, and sign the transfer in your wallet. That is the whole flow from your side.

Behind the scenes the game creates a deposit intent with a one-time reference key, your wallet signs a standard SPL token transfer to the custody wallet's KEEP account, and the game credits your balance only once that transaction reaches finalized commitment.

Rules worth knowing:

Tip: if a deposit takes longer than the usual 15–30 seconds, your KEEP is not lost; the verifier keeps checking until the intent expires, and a finalized transfer will credit.

Withdrawing KEEP

Open KEEP WALLETWITHDRAW KEEP. The screen shows the exact quote before you sign: minimum, fee, what you will receive, and whether the request will be standard (frozen 24H, cancellable) or instant.

Who can withdraw

You need an active, paid land base. Land ownership is what unlocks withdrawals; see Land deeds and the globe. The destination must be a normal wallet address (program-derived addresses are rejected); the payout goes to that wallet's KEEP token account.

Amounts, fee and limits

RuleValue
Minimum per request500 KEEP
Fee2% of the gross request (burned); you receive the remaining 98%
FrequencyOne non-failed withdrawal per rolling 24 hours per wallet
Daily capBy Keep level (table below), rolling 24 hours
Whole-balance withdrawalsAllowed if the amount fits your cap

Example: requesting 1,000 KEEP burns 20 KEEP as the fee and sends 980 KEEP to your wallet.

The daily cap depends on the level of your Keep. If you own more than one base, the strongest active paid base sets the limit; allowances never add across bases.

Keep levelDaily cap (KEEP)Keep levelDaily cap (KEEP)
150,00011155,000
260,00012166,000
371,00013176,000
482,00014187,000
592,00015197,000
6103,00016208,000
7113,00017218,000
8124,00018229,000
9134,00019239,000
10145,00020250,000

Cancelled and refunded withdrawals do not count toward your cap or your once-per-24h cooldown. There is no shared, cross-player daily pool; each wallet has its own allowance.

Signing the request

Every withdrawal carries a fresh wallet signature over the exact intent: gross, fee, net, destination, standard-or-instant mode, and the unbonding hours. The payout worker re-verifies that proof independently before the custody side signs anything. The signature is valid for 5 minutes; wait longer and the UI asks you to sign again.

Why: the signature ties the payout to what you actually approved. Even if someone got hold of a session, they could not redirect a withdrawal to a different address or amount without your wallet.

Standard withdrawals (24-hour unbonding)

  1. You submit the request. The gross amount is frozen immediately into withdrawal escrow; it is unspendable and cannot be raided.
  2. The row shows UNBONDING for 24 hours. You can press CANCEL at any time during this hold and the full gross returns to your balance.
  3. When the hold ends, the payout worker picks the row up (it polls roughly every 10 seconds), signs one transaction, broadcasts it, and confirms it at finalized. The row becomes SENT with a transaction signature, or FAILED.
The withdraw screen with quote, mode and confirmation

Instant withdrawals (skip the hold)

An instant withdrawal skips the 24-hour hold. It requires all of the following:

Email codes are never accepted for instant withdrawals; only the authenticator works. The code is consumed at the same moment your KEEP is frozen, so a wrong code costs one attempt but freezes nothing.

"Instant" means no 24-hour hold, not a synchronous transfer: the request is queued for the payout worker's next pass (within seconds), and you will see INSTANT WITHDRAWAL QUEUED FOR PAYOUT. Instant is opt-in per request; with an authenticator enabled you can still choose a standard withdrawal.

Statuses and what they mean

StatusMeaningWhat you can do
UNBONDINGGross frozen; waiting for the 24h hold (or the next worker pass if instant)CANCEL to get the gross back
PAYOUT QUEUEDHold is over; waiting for the workerNothing; it will process shortly
PROCESSINGTransaction being signed or broadcastWait
SENTFinalized on-chain; transaction signature shownCheck your wallet
FAILEDPayout did not land; your KEEP is still held in escrowREFUND if offered, otherwise contact support
CANCELLEDYou cancelled during unbonding; gross returnedNothing
REFUNDEDA failed row was refunded to your balanceNothing

On FAILED rows, the REFUND button appears only when the server can prove nothing was transferred (for example, the transaction was never broadcast, or it finalized with an error). If the outcome is uncertain, refund is blocked with a "may already have been paid on-chain — contact support" message rather than risk paying you twice. Refunded failures that were the game's fault (RPC outage, custody account short) do not charge your cap or cooldown.

Rows with an unknown outcome (for example, an expired blockhash) are held in PROCESSING for an operator to investigate; they are never auto-refunded.

Why a payout might pause

Two safety brakes sit in front of every payout. They are not your personal limit, but you may notice them:

There is also a global kill switch; when it is off, new requests return "withdrawals open when the liquidity pool goes live" and the payout queue holds. On devnet it is on.

Two-factor authentication

Open PROFILESECURITY & KEY EXPORTACCOUNT EMAIL · 2FA. Every change to a factor requires a fresh wallet signature, and once you have one factor, adding or changing another requires a step-up with the existing one.

Security screen with authenticator and verified email

Authenticator app (TOTP)

Press SET UP AUTHENTICATOR, scan the QR code (or use the otpauth link) in any TOTP app, enter the 6-digit code, and press VERIFY & ENABLE. You will see "AUTHENTICATOR ENABLED · 24H SECURITY HOLD STARTED". After 24 hours the status flips to INSTANT WITHDRAWALS AVAILABLE.

Why the 24-hour maturity? If an attacker gains control of your account and enrolls their own authenticator, they still cannot pull KEEP out instantly. Any withdrawal they start in that window is a standard, cancellable one you can see and stop.

Verified email

Under VERIFIED CONTACT EMAIL, enter your address, press SEND CODE, then VERIFY EMAIL with the 6-digit code. Codes last 10 minutes, burn after 5 wrong guesses, and can be resent every 30 seconds.

A verified email is a contact, recovery, factor-management and key-export proof. It is not a money factor: it never unlocks instant withdrawals.

Embedded wallets and private-key export

If you signed in with email or a social login, your wallet is an embedded wallet provided by Privy. You can export its private key, but only after enrolling Privy's own wallet MFA. The EXPORT PRIVATE KEY screen under SECURITY & KEY EXPORT asks you to SECURE WALLET WITH PRIVY MFA first, then to sign a fresh challenge (plus your authenticator or email code if you have one enrolled) before REVEAL MY KEY.

The key is shown inside Privy's own modal. It never passes through the game's code or servers. Export is never gated on purchases or land; it is a custody right. See Wallets and sign-in.

Custody model in plain words

This is a devnet playtest: there is no mainnet deployment, no HSM/enclave custody yet, and no third-party audit. See Smart contracts and on-chain.

Proof of reserves

The game publishes a public endpoint, /por, with the latest Merkle root, coverage (reserve versus total liabilities) and custody evidence. A signed-in player can fetch their own inclusion proof from /por/proof. Each week a snapshot builds a Merkle tree over every wallet's liabilities (balance plus withdrawal, forge, league and mail escrows) and posts the root on-chain through the shardkeep-core program.

Only the custody wallet's canonical KEEP token account counts as reserve; liquidity pools, treasuries and extra accounts are excluded. At the last release the reserve was 499,699,242 KEEP against 3,480,504 KEEP of liabilities, with zero deficit; treat that as a point-in-time observation, not a guarantee.

There is no in-game proof-of-reserves page yet. The KEEP ECONOMY screen shows aggregate pool, escrow, withdrawn and deposited figures.

Devnet today, mainnet later

See also