StakeXDCDocs
Liquid staking

Vault architecture (V3.2)

psXDC is a fully non-custodial ERC-4626 tokenized vault: share-based pricing, direct masternode integration, self-service withdrawals with a ring-fenced queue budget, and time-locked governance.

The live vault is PrimeStakedXDC_V3_2 at 0xDc74c0DaED82ae94486DeeF22991d2F54173c734, the July 2026 redeployment of the V3 architecture, with every V3.1 balance carried over 1:1 via snapshot airdrop.

psXDC is a fully non-custodial, ERC-4626 tokenized vault. This is the architecture underpinning every psXDC stake. V3.2 keeps the V3 architecture and makes the partially-backed state the permanent operating model (the "permanent ledger"): rewards are distributed at any backing level through a manager-only reward lane, NAV is protected against write-downs, and the withdrawal queue is settled from ring-fenced funding lanes so fresh deposits are never consumed by the redemption backlog and user exits keep working throughout.


Overview

StandardERC-4626 (OpenZeppelin tokenized vault)
TokenpsXDC, a yield-bearing share token
PricingExchange rate steps up with each monthly reward distribution (not fixed 1:1)
WithdrawalsSelf-service; no admin approval required
StakingDirect masternode integration via XDC validator contract
GovernanceRole separation with mandatory time-locked delays
Admin mint/withdrawDisabled; no such code path exists

How It Works

1. Stake

Deposit XDC through the staking interface. The contract mints psXDC shares based on the current exchange rate. The more rewards the vault accumulates, the more XDC each psXDC share is worth.

There is no minimum deposit. Staking is permissionless: no account, no KYC, just connect your wallet.

2. Earn Rewards

Your staked XDC is pooled and delegated to KYC-verified masternode operators on the XDC Network. Masternode rewards are distributed into the vault roughly monthly (distributeRewards), stepping up the share price and increasing the total assets backing all psXDC shares.

You don't need to claim rewards. They are embedded in the share price, so your psXDC simply becomes worth more XDC after each distribution.

3. Withdraw

You have full self-service access to your XDC:

  • Instant withdrawal: if the contract has sufficient liquid XDC, you redeem shares and receive XDC in the same transaction. No admin approval. No waiting.
  • Queued withdrawal: if the vault's free liquidity is too low, your request enters an automatic FIFO queue. The queue is paid from its own ring-fenced budget (queueBackingBudget), which the team tops up as masternode principal is unwound and returned; escrowed shares are valued at the exchange rate of the moment they are paid, so queued positions keep earning.
  • DEX swap: sell psXDC directly on a DEX (verify the pool holds the live V3.2 token) for immediate exit at market rate.

4. Use psXDC

psXDC is a standard ERC-20 token on the XDC Network. While your XDC earns yield in the background, you can:

  • Hold to accumulate rewards passively
  • Trade on DEXs
  • Use as collateral in DeFi protocols that support ERC-4626 vault tokens
  • Transfer to any wallet; the recipient inherits the yield automatically

Share-Based Pricing

The vault uses a share model:

ConceptHow it works
DepositYou deposit XDC, receive psXDC shares based on the current exchange rate
Exchange ratetotalAssets / totalShares, which steps up with each monthly reward distribution
WithdrawalYou burn psXDC shares and receive XDC at the current rate
RewardsNo claiming needed; rewards increase the exchange rate for all holders equally

Example: If the exchange rate is 1.05, burning 100 psXDC returns 105 XDC. The rate only goes up (assuming no validator losses).

This is the same model used by major DeFi protocols (Aave aTokens, Compound cTokens, Lido wstETH).


Masternode Integration

The vault directly stakes XDC with masternodes via the on-chain XDC validator contract. This is what makes psXDC productive: your XDC is not sitting idle.

How masternodes are managed

StepWhat happens
Operator onboardingAdmin adds KYC-verified masternode operators
Auto-proposeWhen excess liquid XDC exceeds the threshold, the contract automatically proposes a new masternode using round-robin operator selection
Manual proposeProposer role can also trigger masternode proposals directly
RewardsMasternode rewards are distributed into the vault roughly monthly, stepping up the exchange rate
ResignationProposer/Admin can resign a masternode; after the network cooldown (~35 days), the XDC is withdrawn back
Principal trackingThe contract tracks exactly how much XDC is locked per operator, globally and individually

Liquidity buffer

V3.2 has no percentage buffer target (the earlier bufferBps knob was removed). Whatever XDC the vault holds that is not earmarked for the queue or for failed payouts is available for instant withdrawals, and the queue has its own separate budget. In practice:

  • Most XDC is working in masternodes earning yield
  • A buffer remains in the contract for immediate redemptions
  • If the buffer is depleted, the withdrawal queue handles the overflow automatically

Governance & Roles

The vault separates responsibilities across five roles. No single key can make unilateral changes.

RoleResponsibility
Admin (Owner)Governance changes, operator management, KYC
Operations ManagerDay-to-day parameters: reward distributions (distributeRewards), scan limits, auto-propose config
Risk ManagerReport validator losses (capped per-report and per-day)
ProposerPropose and resign masternodes
Migration Manager (MIGRATION_MANAGER_ROLE, legacy name)Funds the backing lane (fundBacking) and the queue budget (queueBackingBudget)

Time-locked changes

Every sensitive parameter change follows a three-step pattern:

  1. Schedule the change → mandatory governance delay begins (default 1 day)
  2. Wait, during which anyone can see the pending change on-chain
  3. Execute the change after the delay expires, or cancel it at any time

This applies to: role changes, loss caps, the governance delay itself, and ownership transfer.


Risk Controls

ControlDetail
No admin mintmint() is disabled; shares can only be created through genuine XDC deposits
No admin withdrawThere is no ownerWithdraw(); XDC only leaves through user redemptions or validator operations
Loss capsreportValidatorLoss() is capped at 10% per report and 20% per day (configurable via time-lock)
Principal separationReturning masternode principal is not counted as yield, which prevents artificial exchange rate inflation
Reentrancy protectionAll external state-changing functions are protected
Manager-only reward laneRewards enter the share price only through distributeRewards (operations manager). Unsolicited sends are treated as backing donations and never move the share price on their own, so outsiders cannot pump it
No principal-stake slashingXDC's slashing mechanism penalizes downtime via ~2h exclusion and missed rewards, but never burns principal stake

Smart Contract Details

PropertyDetail
ContractPrimeStakedXDC_V3_2.sol
Address0xDc74c0DaED82ae94486DeeF22991d2F54173c734
StandardERC-4626 (OpenZeppelin) + AccessControl
UpgradeabilityNone. Deployed with a regular constructor, no proxy. The vault logic cannot be modified after deployment.
Decimals offset9 (extra share precision)
Default masternode stake10,000,000 XDC
Default governance delay1 day (min 1 minute, max 30 days)
AuditsQuillAudits + Nethermind Security

Withdrawal Queue Internals

When liquidity is constrained the queue absorbs the overflow without disrupting validator operations:

  • Queued requests escrow shares inside the vault. They are not burned until settlement.
  • Settlement value is computed at processing time, not at enqueue time. The user redeems at the live share rate, not a stale snapshot.
  • Failed receiver payouts (rare; e.g. contract receivers that revert on payment) are deferred into pendingQueuedAssets. Users collect their XDC via claimQueuedAssets(receiver) later.
  • Auto-propose is blocked while the queue has a backlog, so the vault doesn't lock more XDC in masternodes while users are waiting to withdraw.
  • Operator and queue scans are bounded by operatorScanLimit and queueScanLimit to prevent gas-griefing.

→ Withdrawals: Instant vs Queued (user guide)

On this page