PRIV ProtocolPRIV Docs
Contracts

Treasury

Protocol treasury with multi-sig withdrawals, timelocked operations, and automated deflationary interventions.

Overview

Treasury holds protocol reserves (PRIV, USDC, ETH) with multi-sig approval for all withdrawals. Large withdrawals require a 7-day timelock; small withdrawals (under 10% of balance) use a 24-hour emergency timelock. The contract also supports automated deflationary interventions that burn PRIV when the token price drops significantly below its 30-day average.

PropertyValue
ContractTreasury
Address (Base Sepolia)0x35C798E6B827558a1299FB546cf669245C21C770
Min Signers2
Max Signers10
Standard Timelock7 days
Emergency Timelock24 hours (withdrawals under 10% of balance)
Deployment Cooldown7 days minimum between interventions
Max Deploy Per Intervention20% of PRIV balance
NetworkBase (Chain ID: 8453)

Multi-Sig Withdrawal Flow

Signer requests withdrawal  -->  Other signers approve  -->  Timelock expires  -->  Anyone executes
         |                              |                          |                       |
         v                              v                          v                       v
   Auto-approves (1/N)          Threshold reached?           7d or 24h wait         Funds transferred
                                Status -> Approved

Withdrawals have four statuses: Pending, Approved (threshold met), Executed, and Cancelled.


Key Functions

requestWithdrawal

Create a new withdrawal request. The requester auto-approves. Timelock duration is determined by the withdrawal size relative to total balance.

function requestWithdrawal(address token, uint256 amount, address recipient, string calldata reason)
    external returns (uint256 requestId)

approveWithdrawal / executeWithdrawal

Signers approve pending requests. Once the threshold is reached and the timelock expires, anyone can execute.

function approveWithdrawal(uint256 requestId) external
function executeWithdrawal(uint256 requestId) external

deposit

Deposit ERC-20 tokens. ETH deposits are accepted via the receive() fallback.

function deposit(address token, uint256 amount) external

executeAutomatedDeployment

Triggers a deflationary intervention when price conditions are met. Burns a configured percentage of the treasury's PRIV balance.

function executeAutomatedDeployment() external returns (uint256 amountDeployed)

canAutoDeploy

Checks whether automated deployment conditions are satisfied (cooldown elapsed, price drop exceeds threshold, balance available).

function canAutoDeploy() external view returns (bool canDeploy, uint8 reason)

Admin Functions

FunctionDescription
addSigner(address) / removeSigner(address)Manage multi-sig signer set
setThreshold(uint256)Adjust approval threshold
setDeploymentRules(uint256, uint256, uint256)Configure price-drop threshold, deploy %, cooldown
updatePrice30DayAvg(uint256)Update 30-day average price reference
setSwapConfig(address, address)Configure DEX router and USDC for buybacks
pause() / unpause()Circuit breaker

Security

  • Multi-sig required: No single signer can withdraw funds.
  • Timelocked execution: All withdrawals have a mandatory waiting period after approval.
  • Cooldown enforcement: Automated deployments cannot fire more than once per cooldown period.
  • Deployment caps: Each intervention is limited to 20% of the PRIV balance.
  • Reentrancy protection: All token-transferring functions use nonReentrant.

Source Code

View on GitHub