Security & transparency
Everything a wallet review team or curious user needs to verify what this dApp does.
On-chain identity
What the program can do
- initialize - one-time bank setup at deploy. Locks the $TOKEN mint address.
- initialize_collection - one-time creation of the Metaplex Certified Collection NFT.
- wrap_bull - moves 1,000,000 $WBULL from the caller into a vault PDA, mints them a fresh NFT, verifies the NFT into the collection. Caller is the only signer.
- unwrap_bull - burns the caller's bull NFT and returns 1,000,000 $WBULL from the vault to the caller. The caller must hold the NFT in their ATA. Permissionless - anyone holding a bull can unwrap it.
The program holds no custody outside the per-NFT vault PDAs. Each vault's authority is derived from its NFT's mint address, so the locked tokens follow the NFT through every transfer (Magic Eden, Tensor, direct send). Every wrap/unwrap is initiated by the user and signed in their own wallet.
Hard limits enforced on chain
- 1,000,000,000 $WBULL total supply (pump.fun-immutable)
- Exactly 1,000,000 $WBULL locked per wrap
- Maximum 1,000 NFTs in circulation at any time
- NFT mint authority retired by Metaplex master edition (1-of-1)
- Vault authority is a PDA derived from the NFT mint
WrappedFactory program
Factory upgrade authority + circuit breaker
The Factory program is currently upgradeable, with authority held by the WrappedBulls operator as a single hot keypair (no Squads multisig). During the soak period (30 to 60 days after mainnet launch), authority remains live so we can patch logic bugs that surface in real conditions. After the soak period, if no critical bugs surface, authority is either moved to a hardware wallet or revoked entirely so the program becomes permanently immutable. See /terms for the full policy.
The program exposes a global circuit breaker via the set_factory_paused instruction, gated to the program upgrade authority. When paused, the program rejects new wraps, new deploy_collection calls, and claim_treasury calls. Unwrap is never paused. User locked tokens are always drainable by their NFT holder regardless of pause state; pausing unwrap would constitute fund capture, which the circuit breaker exists to prevent.
Pause is a triage tool. We will use it if we observe evidence of an active exploit or a critical Metaplex / Token-2022 regression. We will NOT use it to censor or de platform individual deployments.
On-chain invariants checked by audit script
scripts/audit_chain.sh (reproducible from any RPC). Last devnet run: GREEN.
- in_circulation == total_wrapped - total_unwrapped
- live BullAsset count == in_circulation
- Σ vault.amount == in_circulation × 1,000,000 $WBULL
- Each live NFT mint has supply == 1
- (next_tier - 1) - len(free_tiers) == in_circulation
- All free_tier values fall in [1, 1,000]
- collection_mint is set (Metaplex Certified Collection live)
What the website does and doesn't do
- Reads on-chain state via Solana RPC (Helius)
- Builds wrap_bull / unwrap_bull instructions in the browser
- Asks your wallet to sign - every action is your signature
- Does not request any token approval, account delegation, or sign-and-broadcast permission. Each wrap and unwrap is its own one-shot transaction.
- Does not collect emails, store cookies, or run analytics scripts.
Bug bounty
Open bug bounty against the WrappedFactory program and its supporting infrastructure. Payouts in USDC, severity bands and scope documented in the canonical policy: