Skip to content

Abstract

This PIP defines the Vault Registry system for Pars Network. Each Committee, Working Group, and Sub-DAO operates a standardized ERC-4626 vault for treasury management, enabling yield generation, transparent accounting, and interoperability with DeFi protocols.

Motivation

Pars Network's distributed governance structure requires:

  1. Standardized treasury management across 10 Committees, Working Groups, and Sub-DAOs
  2. Yield generation on treasury holdings
  3. Transparent accounting of all fund flows
  4. Interoperability with external DeFi protocols
  5. Clear fund ownership distinguishing ALLOCATED vs BONDED capital

ERC-4626 provides:

  • Standard vault interface for deposits and withdrawals
  • Share-based accounting for proportional ownership
  • Composability with yield strategies
  • On-chain transparency

Specification

Vault Registry Architecture

┌─────────────────────────────────────────────────────────────────────────────────────┐
│                           VAULT REGISTRY                                              │
├─────────────────────────────────────────────────────────────────────────────────────┤
│                                                                                      │
│  PARS DAO TREASURY (Main Vault)                                                      │
│  ┌───────────────────────────────────────────────────────────────────────────────┐  │
│  │  ERC-4626 Vault: PARS Treasury                                                │  │
│  │  Asset: Multi-asset (PARS, USDC, ETH via aggregator)                         │  │
│  │  Strategy: Diversified yield + Reserves                                       │  │
│  └───────────────────────────────────────────────────────────────────────────────┘  │
│                                      │                                               │
│               ┌──────────────────────┼──────────────────────┐                       │
│               │                      │                      │                       │
│               ▼                      ▼                      ▼                       │
│  10 COMMITTEE VAULTS          WORKING GROUP VAULTS     SUB-DAO VAULTS              │
│  ┌─────────────────┐         ┌─────────────────┐      ┌─────────────────┐          │
│  │ SECURITY (امنیّت) │         │ Temp WG Vault   │      │ MIGA Vault      │          │
│  │ TREASURY (خزانه)  │         │ (All funds      │      │ CYRUS Vault     │          │
│  │ GOVERNANCE (داد)  │         │  recallable)    │      │ (Bonded funds   │          │
│  │ HEALTH (سلامت)    │         │                 │      │  NOT recallable)│          │
│  │ CULTURE (فرهنگ)   │         └─────────────────┘      └─────────────────┘          │
│  │ RESEARCH (دانش)   │                                                               │
│  │ INFRA (سازندگی)   │                                                               │
│  │ CONSULAR (پیام)   │                                                               │
│  │ VENTURE (وقف)     │                                                               │
│  │ IMPACT (میزان)    │                                                               │
│  └─────────────────┘                                                                │
│                                                                                      │
│  FUND SOURCE TRACKING                                                                │
│  ┌───────────────────────────────────────────────────────────────────────────────┐  │
│  │  ALLOCATED: Parent can recall (1% baseline, grants, streaming)                │  │
│  │  BONDED: Parent CANNOT recall (user-purchased tokens, bonds)                  │  │
│  └───────────────────────────────────────────────────────────────────────────────┘  │
│                                                                                      │
└─────────────────────────────────────────────────────────────────────────────────────┘

Vault Registry Contract

solidity
interface IVaultRegistry {
    // ═══════════════════════════════════════════════════════════════════════════════
    //                              VAULT MANAGEMENT
    // ═══════════════════════════════════════════════════════════════════════════════

    /// @notice Register a new vault
    /// @param vault The ERC-4626 vault address
    /// @param vaultType Type (committee, working_group, subdao)
    /// @param parent Parent vault/DAO (0x0 for root)
    /// @param metadata IPFS hash of vault metadata
    function registerVault(
        address vault,
        VaultType vaultType,
        address parent,
        bytes32 metadata
    ) external;

    /// @notice Get all registered vaults
    /// @return Array of vault addresses
    function getVaults() external view returns (address[] memory);

    /// @notice Get vault by entity (committee, subdao)
    /// @param entity The entity identifier (e.g., "SECURITY", "MIGA")
    /// @return Vault address
    function getVaultByEntity(bytes32 entity) external view returns (address);

    /// @notice Get vault hierarchy (parent → children)
    /// @param vault The vault to query
    /// @return parent Parent vault address
    /// @return children Array of child vault addresses
    function getVaultHierarchy(address vault) external view returns (
        address parent,
        address[] memory children
    );

    // ═══════════════════════════════════════════════════════════════════════════════
    //                              FUND SOURCE TRACKING
    // ═══════════════════════════════════════════════════════════════════════════════

    /// @notice Record fund allocation (recallable by parent)
    /// @param vault Target vault
    /// @param amount Amount allocated
    /// @param source Source identifier
    function recordAllocation(
        address vault,
        uint256 amount,
        bytes32 source
    ) external;

    /// @notice Record bonded funds (NOT recallable by parent)
    /// @param vault Target vault
    /// @param amount Amount bonded
    /// @param bonder Address of bonder
    function recordBond(
        address vault,
        uint256 amount,
        address bonder
    ) external;

    /// @notice Get fund breakdown for a vault
    /// @param vault The vault to query
    /// @return allocated Total allocated funds (recallable)
    /// @return bonded Total bonded funds (not recallable)
    function getFundBreakdown(address vault) external view returns (
        uint256 allocated,
        uint256 bonded
    );

    /// @notice Check if parent can recall specific amount
    /// @param vault The vault to query
    /// @param amount Amount to recall
    /// @return canRecall Whether recall is possible
    /// @return maxRecallable Maximum amount that can be recalled
    function canRecall(
        address vault,
        uint256 amount
    ) external view returns (bool canRecall, uint256 maxRecallable);

    // ═══════════════════════════════════════════════════════════════════════════════
    //                              RECALL MECHANICS
    // ═══════════════════════════════════════════════════════════════════════════════

    /// @notice Recall allocated funds from child vault
    /// @param childVault The child vault to recall from
    /// @param amount Amount to recall
    /// @dev Only parent vault/council can call
    function recallFunds(address childVault, uint256 amount) external;

    /// @notice Halt future allocations to vault
    /// @param vault The vault to halt
    /// @dev Requires parent authority
    function haltAllocations(address vault) external;

    /// @notice Resume allocations to vault
    /// @param vault The vault to resume
    function resumeAllocations(address vault) external;
}

Committee Vault Implementation

Each Committee operates an ERC-4626 vault with additional governance features:

solidity
interface ICommitteeVault is IERC4626 {
    // ═══════════════════════════════════════════════════════════════════════════════
    //                              ERC-4626 CORE (inherited)
    // ═══════════════════════════════════════════════════════════════════════════════
    // deposit(uint256 assets, address receiver) → uint256 shares
    // withdraw(uint256 assets, address receiver, address owner) → uint256 shares
    // redeem(uint256 shares, address receiver, address owner) → uint256 assets
    // convertToShares(uint256 assets) → uint256 shares
    // convertToAssets(uint256 shares) → uint256 assets

    // ═══════════════════════════════════════════════════════════════════════════════
    //                              COMMITTEE-SPECIFIC
    // ═══════════════════════════════════════════════════════════════════════════════

    /// @notice Get committee identity token
    /// @return Token address (e.g., SECURITY, TREASURY, etc.)
    function identityToken() external view returns (address);

    /// @notice Get committee council (Safe multisig)
    /// @return Council address
    function council() external view returns (address);

    /// @notice Get committee charter
    /// @return Charter contract address
    function charter() external view returns (address);

    /// @notice Check if address is committee member
    /// @param account Address to check
    /// @return True if member
    function isMember(address account) external view returns (bool);

    /// @notice Get spending authority for member
    /// @param member Member address
    /// @return maxSpend Maximum single spend
    /// @return dailyLimit Daily spending limit
    function getSpendingAuthority(address member) external view returns (
        uint256 maxSpend,
        uint256 dailyLimit
    );

    // ═══════════════════════════════════════════════════════════════════════════════
    //                              FUND SOURCE AWARE
    // ═══════════════════════════════════════════════════════════════════════════════

    /// @notice Get allocated vs bonded breakdown
    function getFundSources() external view returns (
        uint256 allocatedBalance,
        uint256 bondedBalance
    );

    /// @notice Deposit as allocated funds (from parent)
    function depositAllocated(uint256 assets) external returns (uint256 shares);

    /// @notice Deposit as bonded funds (from bond purchase)
    function depositBonded(uint256 assets, address bonder) external returns (uint256 shares);
}

Fund Source Rules

Source TypeDescriptionParent Can Recall?Examples
ALLOCATEDFunds delegated from parent✓ Yes1% baseline, grants, streaming payments
BONDEDFunds from community bond purchases✗ NoUser-purchased Committee tokens

Recall Mechanics

When a Committee/Working Group goes rogue, the parent (Pars DAO) can:

Committee Goes Rogue
├── ALLOCATED: $50K → Parent CAN recall ✓
├── BONDED: $200K → Parent CANNOT recall ✗
├── Parent Actions Available:
│   ├── Halt future allocations ✓
│   ├── Veto pending proposals ✓
│   ├── Recall allocated funds ✓
│   └── Recall bonded funds ✗
└── Committee continues with bonded funds
    └── Community can fork/exit/reform

This preserves community sovereignty while giving parent oversight over delegated capital.

Vault Types

TypeStructureFund RecallabilityExample
CommitteeSafe + Council + Charter + Identity TokenAllocated: Yes, Bonded: NoSecurity (AMN), Treasury (KHAZ)
Working GroupLighter Safe, temporaryALL funds recallableTask forces
Sub-DAOFull DAO structure, independentBonded funds NOT recallableMIGA, CYRUS

Committee Identity Tokens

Each Committee has an identity token for membership and governance:

CommitteeSymbolToken Name
SecuritySECURITYامنیّت Token
TreasuryTREASURYخزانه Token
GovernanceGOVERNداد Token
HealthHEALTHسلامت Token
CultureCULTUREفرهنگ Token
ResearchRESEARCHدانش Token
InfrastructureINFRAسازندگی Token
ConsularCONSULARپیام Token
VentureVENTUREوقف Token
ImpactIMPACTمیزان Token

Yield Strategies

Committee vaults can deploy idle capital to approved yield strategies:

solidity
interface IYieldStrategy {
    /// @notice Deposit assets into yield strategy
    function deposit(uint256 assets) external returns (uint256 shares);

    /// @notice Withdraw assets from yield strategy
    function withdraw(uint256 assets) external returns (uint256 withdrawn);

    /// @notice Get current APY
    function getAPY() external view returns (uint256);

    /// @notice Get strategy risk rating (1-10)
    function riskRating() external view returns (uint8);
}

Approved Strategies (per Committee risk tolerance):

CommitteeMax RiskApproved Strategies
WAQF (Endowment)3Stablecoin yield, Treasury bonds
KHAZ (Treasury)4Diversified yield, POL
AMN (Security)2Stablecoin only
Others5Committee discretion

Spending Timelock

Large expenditures require timelock:

solidity
interface ISpendingTimelock {
    /// @notice Queue a spending transaction
    function queueSpend(
        address vault,
        address recipient,
        uint256 amount,
        bytes calldata data
    ) external returns (bytes32 txId);

    /// @notice Execute after timelock
    function executeSpend(bytes32 txId) external;

    /// @notice Cancel queued transaction
    function cancelSpend(bytes32 txId) external;

    /// @notice Get timelock delay for amount
    function getDelay(uint256 amount) external view returns (uint256);
}
Spend AmountTimelock Delay
< $5,000None (Committee lead)
$5,000 - $25,00024 hours
$25,000 - $100,00048 hours
> $100,0007 days

Spending Allowlist

Vaults maintain an allowlist of approved spending destinations:

solidity
interface ISpendingAllowlist {
    /// @notice Add address to allowlist
    function addToAllowlist(address recipient, bytes32 category) external;

    /// @notice Remove from allowlist
    function removeFromAllowlist(address recipient) external;

    /// @notice Check if recipient is allowed
    function isAllowed(address recipient) external view returns (bool);

    /// @notice Get spending limit for recipient
    function getSpendingLimit(address recipient) external view returns (uint256);
}

Security Considerations

Fund Separation

  • Allocated and bonded funds tracked separately
  • Recall mechanics respect fund source
  • Clear audit trail for all movements

Vault Compromise

  • Multi-sig requirement for large withdrawals
  • Timelock allows community response
  • Emergency pause available

Yield Strategy Risks

  • Approved strategy list maintained by governance
  • Risk ratings enforced per Committee
  • Emergency withdrawal mechanisms

Parent Authority Limits

  • Parent cannot recall bonded funds
  • Preserves community sovereignty
  • Prevents central capture

References

Copyright and related rights waived via CC0.

Released under the MIT License.