MoonVault
Welcome to MoonVault.

Transparency

Every figure here is read from PulseChain when the page opens. Where there is nothing yet, it says so rather than filling the space.

Reading the chain…

Owner powers: who can do what

Every access-restricted function in the PulseChain launch contracts: who holds it at launch, what it can do, and whether it still works after the launch freeze. Base is not deployed and is not listed.

  • No proxies and no upgrades: the contract code cannot be changed.
  • No general pause switch in any contract. Exits (seal, terminate, rescue withdraw) have no owner gate.
  • No timelocks on PulseChain: a still-live power takes effect immediately.
  • The freezes are one-way. At launch the owner sends six freezes (runbook step R12) and a check script fails unless all six are set.
  • The owner can never move vault principal, change fee splits or penalties, or block terminate or rescue withdraw.

Holders at launch

0xc78C…60e0Owner wallet (browser-signed, no key on any server)
0xa70a…910dKeeper (automated server wallet)
0x268c…b05Backup keeper (price feeder, added after launch)
0x69C3…57DEBoosterGuard (sets Identity dividend boosts). Its only operator is the Booster wallet 0x6B8e…c4, which the owner can revoke or pause at any time
0x8CBF…f8CIdentity relayer (gift bindings only)
0xDDFB…a28Identity treasurer (assigns commission pools)
—Identity settler: unset at launch (Phase 2)
0x41FC…F742Deployer: owns contracts only during the deploy run, then holds no role

Treasury 0x6211…895F, Referral pool 0xf647…309C and Root #001 0x6241…8DBC only receive funds. They are fixed in the contracts (immutable or frozen): only a redeploy could move them.

MoonVaultEngine · held by Owner wallet
FunctionWhoAfter the freezeWhat it can do
wireOwnerFrozenSet the core connections (oracle, shares, fee router, swap router).
setPositionsOwnerFrozenSet the position NFT that decides who holds each vault.
finalizeWiringOwnerThe freeze switch (one-way)Freeze the wiring above for good.
wireContributionPoolOwnerUsed at deploy, now deadSet the contribution pool once. Already set at deploy.
setAssetListedOwnerStill liveAllow or stop new vaults in an asset. Delisting never blocks exits.
setSlippageOverrideOwnerStill liveSet an asset's sale price floor between 3% and 20% (MOONX 15%). Existing vaults keep the value from their mint.
setBonusHooksOwnerStill livePoint the referral share bonus at a source. Zero (off) at launch; bonuses are capped at 15%.
rescueProtocolTakeOwnerStill liveOnly after 30 days with no oracle price: send the protocol's own fee share to the treasury. Never principal.
transferOwnershipOwnerStill liveHand the contract to a new owner (not to zero).
onPositionTransferPosition NFTContract-to-contract onlyCalled by the position NFT when a vault position changes hands.

Cannot move vault principal, change fees, the profit ladder, penalties or delays, or block terminate and rescue withdraw.

GuardedOracle · held by Owner wallet · no freeze
FunctionWhoAfter the freezeWhat it can do
setFeederOwnerStill liveAdd or remove a price feeder.
setGuardsOwnerStill liveSet the staleness limit (1 min to 1 day) and the largest price step (up to 50%). Default 30 min and 20%.
setMinIntervalOwnerStill liveSet the minimum time between pushes (at least 1 minute).
seedOwnerStill liveSet the first price of a new asset, once per asset, with no step limit.
pushKeeperStill liveKeeper and backup keeper post prices: one per block, spaced by the interval, within the step limit.
transferOwnershipOwnerStill liveHand the oracle to a new owner.

No freeze: every power here stays with the owner. A feeder cannot change guards or add feeders.

PulseXSwapRouter · held by Owner wallet · no freeze
FunctionWhoAfter the freezeWhat it can do
setVenueOwnerStill liveChoose the swap venue per asset. The venue address is not validated.
setPathOwnerStill liveSet the sale route from an asset to the stablecoin (2 to 4 hops).
setBuyPathOwnerStill liveSet the route used to buy MOONX for burns and stakers.
sweepOwnerStill liveMove stray tokens to the owner. The router holds no float.
transferOwnershipOwnerStill liveHand the router to a new owner.

No freeze. A bad route can cost a vault up to its sale price floor or make seals revert; it cannot take principal outside a sale.

FeeRouter · held by Owner wallet
FunctionWhoAfter the freezeWhat it can do
wireOwnerFrozenSet where dividends and the referral lane go.
finalizeWiringOwnerThe freeze switch (one-way)Freeze those destinations for good.
wireContributionPoolOwnerUsed at deploy, now deadSet the contribution pool once. Already set at deploy.
transferOwnershipOwnerStill liveHand the wiring role to a new wallet.
legDividendsThe contract itselfContract-to-contract onlyInternal step of distribute.
legContributionThe contract itselfContract-to-contract onlyInternal step of distribute.
legBurnThe contract itselfContract-to-contract onlyInternal step of distribute.
legStakersThe contract itselfContract-to-contract onlyInternal step of distribute.

Cannot sweep, rescue, change the fee splits (constants) or redirect money already held. distribute is open to anyone.

MVShares · held by Owner wallet
FunctionWhoAfter the freezeWhat it can do
wireOwnerFrozenSet the engine (mints and burns shares) and the dividend funder.
setBonusMinterOwnerFrozenSet who may mint capped bonus shares.
setBoosterOwnerFrozenSet the booster (BoosterGuard at launch).
finalizeWiringOwnerThe freeze switch (one-way)Freeze the three settings above for good.
setBoostBooster or ownerStill liveBooster or owner set a holder's dividend boost between 1.0x and 1.5x.
transferOwnershipOwnerStill liveHand the contract to a new owner.
mintForVault engineContract-to-contract onlyEngine mints shares when a vault opens.
mintBonusBonus minter (off) or engineContract-to-contract onlyBonus shares, capped at 15% of engine-minted shares.
burnFromVault engineContract-to-contract onlyEngine burns shares when a vault closes.
moveSharesVault engineContract-to-contract onlyEngine moves shares when a position changes hands.
raiseRateVault engineContract-to-contract onlyShare rate only goes up, at most 1% per call.
fundDividendsFee routerContract-to-contract onlyFee router pays USDC dividends in.

Nobody can withdraw the dividend reserve: only holders claim their own dividends.

MoonStaking · held by Owner wallet
FunctionWhoAfter the freezeWhat it can do
wireOwnerFrozenSet the fee router as the main reward funder.
finalizeWiringOwnerThe freeze switch (one-way)Freeze that setting for good.
setEmissionFunderOwnerStill liveSet or clear the second reward funder (the emission reservoir). Live by design.
transferOwnershipOwnerStill liveHand the contract to a new owner.
fundRewardsFee routerContract-to-contract onlyFee router or emission funder pay MOONX rewards in.

Cannot touch staked principal or earned rewards. Stake, claim and unstake have no owner gate.

ContributionRewards · held by Owner wallet
FunctionWhoAfter the freezeWhat it can do
wireOwnerFrozenSet the engine and the funder.
finalizeWiringOwnerThe freeze switch (one-way)Freeze that setting for good.
transferOwnershipOwnerStill liveHand the contract to a new owner.
notifyContributionVault engineContract-to-contract onlyEngine records a contribution.
fundFee routerContract-to-contract onlyFunder pays rewards in.

After the freeze the owner can only transfer ownership. Expired rewards go only to the fixed treasury.

VaultPositions · held by Owner wallet
FunctionWhoAfter the freezeWhat it can do
setHostOwnerFrozenSet the engine as the only contract that mints and burns positions.
finalizeHostOwnerThe freeze switch (one-way)Freeze the host for good. Must land at launch (R12).
setMarketOwnerStill liveSet the market contract, or zero to stop secondary sales. Exits are unaffected.
finalizeMarketOwnerStill liveFreeze the market for good. Deliberately not called at launch.
transferOwnershipOwnerStill liveHand the contract to a new owner.
mintVault engineContract-to-contract onlyEngine mints a position when a vault opens.
burnVault engineContract-to-contract onlyEngine burns a position when a vault closes.

Positions move only through the market with the holder's approval.

EmissionReservoir · held by Owner wallet · no freeze
FunctionWhoAfter the freezeWhat it can do
setStakingOwnerStill liveSet which staking contract receives the scheduled MOONX emissions.
transferOwnershipOwnerStill liveHand the contract to a new owner.

Cannot withdraw or release MOONX faster than the fixed schedule. drip is open to anyone.

MoonVaultIdentity · held by Owner wallet · no freeze
FunctionWhoAfter the freezeWhat it can do
setRelayerOwnerStill liveAppoint or remove the relayer. Owner, relayer, treasurer and settler must all be different.
setTreasurerOwnerStill liveAppoint or remove the treasurer.
setSettlerOwnerStill liveAppoint or remove the settler. Unset at launch.
grantPromotionalOwnerStill liveGive a free Identity to an address without one. Its commission stays escrowed until it upgrades.
sweepOwnerStill liveMove tokens out, but never what is owed to earners (escrow and commission pools).
releaseUnclaimedDifferentialOwnerStill liveRelease the unclaimed rank-differential pool: MOONX is burned, stablecoins go to the fixed treasury.
transferOwnershipOwnerStill livePropose a new owner (two-step).
acceptOwnershipProposed ownerStill liveThe proposed owner accepts.
markGiftBindingRelayerStill liveMark whether a gift makes the gifter the recipient's introducer. Moves no funds.
clearGiftBindingRelayerStill liveClear a gift binding that lost a race to an existing sponsor. Moves no funds.
mintForSettler (unset)Still liveMint an Identity paid on another chain, once per payment. Commission stays pending until funded.
assignVaultCommissionTreasurerStill liveAssign USDC vault commission from its pool to Identity holders' escrow, up to 100 at a time.
assignDifferentialTreasurerStill liveAssign a rank differential from its pool to an Identity holder.

No freeze; roles are replaceable. Cannot take other holders' escrowed commission. Identities are soulbound.

PositionMarket · held by Owner wallet
FunctionWhoAfter the freezeWhat it can do
setIdentityGateOwnerStill liveRequire an Identity to list or buy (never to cancel). Open at launch.
transferOwnershipOwnerStill liveHand the market to a new owner.

Cannot move listed positions, payments or fees. The fee is a constant; fees go only to the fee router.

ClaimPool · held by Keeper · no freeze
FunctionWhoAfter the freezeWhat it can do
publishRootKeeperStill livePublish the MOONX claims list (Merkle root). Each account's cumulative amount is paid once.
withdrawKeeperStill liveWithdraw any amount of the pool's MOONX. Deliberate, so a mistake can be recovered.
transferOwnershipKeeperStill liveOnly the keeper can hand it on; the owner wallet cannot take it back.

Owned by the keeper so claims publish automatically. To limit what a keeper leak could take, the pool holds only about one week of expected claims and is topped up weekly from the Rewards wallet.

If the owner key were stolen: the worst it could still do

  • List a fake asset with an invented price and mint vault shares against it, diluting everyone's USDC dividends while those vaults stay open. This is the largest remaining owner power.
  • Loosen the oracle guards and add a feeder that walks prices, or route sales through a bad pool, costing vaults up to their sale price floor.
  • Point future MOONX emissions at another address, or appoint an Identity treasurer that assigns the commission pools to itself.
  • Stop secondary sales of positions, or stop new vaults in an asset. Exits keep working.

Our contracts have not had an independent external audit.