FAQ
Frequently asked questions about Monsuta Core and Faded Monsuta.
General
What is Monsuta Core?
The on-chain economic layer for competitive games. It handles trustless settlement — prize pools, token bridging, NFT bridging, crafting, achievement attestations, and staking — while gameplay runs off-chain on a traditional server-authoritative game server.
Is Monsuta Core a blockchain?
No. It is a set of smart contracts deployed on Avalanche C-Chain (and corresponding contracts on WAX). It does not operate its own chain.
Can I use this without Faded Monsuta?
In principle, yes. The contracts are token-agnostic and the architecture applies to any server-authoritative multiplayer game. However, the current tooling and oracle infrastructure is built specifically for Faded Monsuta. Generalizing it to other games is planned post-MVP work.
Architecture
Why not put everything on-chain?
Real-time multiplayer produces thousands of events per second. Putting every action on-chain means wallet popups before every move, gas fees per action, and 2–3 second confirmation latency mid-match. Players quit. The only events that benefit from on-chain settlement are economic outcomes — payouts, crafted items, token movements.
Why Avalanche?
Fast finality (~2 seconds), low gas fees, full EVM compatibility, and existing ecosystem tooling (Snowtrace, DeFi infrastructure, wallets). The contracts are standard Solidity — they could run on any EVM chain with a config change.
Do players need a wallet to play?
No. Players authenticate with standard login (username, email, or social). A wallet is only needed when:
- Claiming a prize from a pool
- Bridging tokens or NFTs between WAX and Avalanche
- Crafting an on-chain item
- Staking NFTs
What happens if the game server goes down?
- Gameplay stops (same as any online multiplayer game)
- On-chain assets — tokens, NFTs, staked positions — remain fully accessible
- Prize claims already submitted to chain can still be processed
- Rewards not yet submitted to chain are held in the server database only
What's the trust model?
Players trust the game server for gameplay correctness — the same trust they place in any online game's server. They do not need to trust the game server for fund custody. Prize pools, bridged tokens, and crafted NFTs are held and governed by smart contracts that the developer cannot access unilaterally.
Prize Pools
Who holds the prize funds?
The PrizePool smart contract. Not the game developer, not any individual. Players and sponsors deposit directly into the contract.
Can the developer steal the prize pool?
No. There is no admin withdrawal function for prize funds in PrizePool.sol. The only ways money leaves the contract are:
claim()— called by a verified winner listed in the submitted resultsrefund()— called by a depositor if the pool is cancelledsweepUnclaimed()— called by the owner after the 30-day claim deadline expires, routing remaining funds to treasury (not to an arbitrary address)
What if the tournament gets cancelled?
If the owner or server calls cancel(), the pool enters Cancelled state. Every depositor (players who paid entry fees, sponsors) can call refund() to recover their exact deposit.
What happens to unclaimed prizes?
After a configurable 30-day claim window expires, the pool owner can call sweepUnclaimed(). Remaining funds go to the treasury address. This prevents funds from being permanently locked if winners don't claim.
Can one pool support both AVAX and ERC-20 prizes?
No — each pool is initialized with a single settlement token (address(0) for native AVAX, or any ERC-20 address). Deploy separate pools for different currencies.
Token Bridge
How does WAX → Avalanche bridging work?
- Player calls
teleport()on the WAX bridge contract (teleporteos) - Oracle detects the event and signs the packed teleport data with its ETH key
- Signature is stored on the WAX chain
- Player (or a relayer) calls
claim(sigData, signatures[])on Avalanche - Contract verifies signatures, checks replay protection, and mints THC to the player's address
How long does token bridging take?
Typically 1–5 minutes. Claims expire after 30 days from the original teleport timestamp.
Is the token bridge bidirectional?
Yes. WAX → Avalanche mints THC on Avalanche. Avalanche → WAX burns THC on Avalanche and releases the equivalent on WAX.
What is the minimum bridge amount?
100 THC (configured in the WAX contract at 4 decimal precision).
NFT Bridge
How is the NFT bridge different from the token bridge?
The token bridge moves fungible tokens (THC) — simple arithmetic equivalence. The NFT bridge moves individual non-fungible assets that each have unique metadata, template IDs, and attributes. The NFT bridge requires:
- An off-chain database to map WAX template IDs → Avalanche token IDs
- AtomicAssets API queries to look up NFT metadata
- Vault locking instead of burning (so assets are always recoverable)
- Batch minting to make moving large quantities practical
How does WAX → Avalanche NFT bridging work?
- Player transfers NFTs to the WAX bridge contract with memo
"teleport:<chain_id>:<destination_address>" - NFTs are locked in the WAX vault — not burned
- The oracle detects the event, queries AtomicAssets for template IDs, translates to Avalanche token IDs via PostgreSQL, and signs an EIP-712 payload
- Player calls
NFTBridge.claim(tokenIds, waxTxId, signatures[])on Avalanche - Contract verifies threshold signatures and calls
MonsutaNFT.mintBatch()
What happens if I bridge back from Avalanche to WAX?
- Player calls
NFTBridge.teleport(waxName, tokenIds, chainId)on Avalanche - NFTs are locked in the Avalanche bridge vault
- The oracle detects the event and checks the WAX vault
- If the originals are in the WAX vault (round-trip) → they are released to the player
- If they're not in the WAX vault (native Avalanche NFTs) → new NFTs are minted on WAX
Are NFTs ever destroyed during bridging?
No. Both bridges are vault-based. NFTs are locked on the source chain when bridged out and unlocked (or minted new) on the destination. If anything goes wrong in transit, the vault ensures assets are always recoverable.
How are token IDs assigned on Avalanche?
Using bitwise encoding:
avaxTokenId = (typeId << 128) | serial
typeId encodes what type of NFT it is (mapped from the WAX template ID). serial is an atomically incrementing counter that ensures no two NFTs share an ID.
Achievements
What are on-chain achievements?
Achievements are attestation records stored directly in the AchievementsRegistry contract. They prove a player accomplished something specific — won a tournament, reached a milestone, or completed a quest. They are queryable by any external system and serve as reputation signals, access gates, and historical records.
How are achievements issued?
Two modes:
| Mode | How |
|---|---|
| Trustless | An authorized issuer or the contract owner calls issueAchievement() directly |
| Server-Gated | The game server signs an EIP-712 payload; the player (or any relayer) submits it on-chain |
Can achievements be revoked?
Only if the achievement type was registered with revocable = true. Non-revocable achievements are permanent — once issued, they can never be removed. After revocation, achievements can be re-issued.
Can achievements be transferred?
No. Achievements are soulbound attestation records, not NFT tokens. They are permanently associated with the player address they were issued to.
Staking
What can I stake?
ERC-721 NFTs from whitelisted collections. The game operator configures which collections are eligible and the weight assigned to each token type.
Do staked NFTs leave my wallet?
No. Staking is non-custodial. Your NFTs stay in your wallet. The NFTStaking contract tracks your staking position by recording the collection address and token ID, then verifying ownership via IERC721.ownerOf() when distributing rewards.
What if I sell a staked NFT?
Your staking position becomes stale. Anyone can call syncPosition() or syncAccount() to detect the ownership mismatch and remove the invalid position. Unclaimed rewards accumulated since the NFT was transferred are forfeited.
What are the reward models?
| Model | How It Works |
|---|---|
FixedEmissions | A fixed token amount distributed per epoch, regardless of staker count |
Pooled | A percentage of the remaining reward pool distributed per epoch |
Hybrid | Fixed base emissions plus a pooled percentage bonus |
How are staking rewards claimed?
Via Merkle proof. An off-chain worker computes every staker's weight and reward share, builds a Merkle tree, and publishes the root on-chain. Stakers call claim(epochId, weight, amount, merkleProof[]). Multiple epochs can be claimed in a single transaction via batchClaim().
Crafting
What is the crafting system?
CraftingRecipes.sol defines on-chain recipes that burn input NFTs and produce output NFTs. It supports two modes:
- Trustless — no server required; the recipe is fully on-chain (e.g., burn 4 Rocks → receive 1 Marble Slab)
- Server-gated — the game server checks off-chain conditions and signs an EIP-712 authorization before the player can craft
What happens to my NFTs when I craft?
Input NFTs are burned by the crafting contract after verifying ownership and approval. The output NFT is either minted fresh (MINT_ON_DEMAND) or transferred from a pre-minted queue (PRE_MINTED).
Can crafted items be traded?
Yes. Output NFTs from crafting are standard ERC-721 tokens on Avalanche — they can be transferred, sold, or bridged back to WAX.
How much does crafting cost in gas?
- Trustless 4-NFT burn + mint: ~220k gas (~0.002 AVAX at 10 gwei)
- Server-gated mode adds approximately +6k gas for signature verification
Security
What if an oracle is compromised?
The bridge requires threshold valid unique oracle signatures. Compromising a single oracle is insufficient to forge a claim — the attacker would need to compromise at least threshold independent oracles simultaneously.
Can the game server manipulate prize payouts?
The server submits exact payout amounts via submitResults(). The contract validates that the total submitted does not exceed the pool balance minus the treasury fee. The server:
- Cannot award more than the pool holds
- Cannot take funds for itself — there is no server withdrawal path
- Cannot submit results twice — the state transition to
Finalizedis irreversible
Is the smart contract code audited?
Audit is planned before mainnet deployment. The contracts are currently deployed on testnet for functional validation.
What is the domain separator and why does it matter?
The domain separator is a bytes32 value derived from the contract name, chain ID, and contract address:
DOMAIN_SEPARATOR = keccak256("FADEDMONSUTA_THC_BRIDGE", block.chainid, address(this))
This ensures that oracle signatures are only valid for the specific contract on the specific chain they were created for. A signature for one network cannot be replayed on another.