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.
| Property | Value |
|---|---|
| Contract | Treasury |
| Address (Base Sepolia) | 0x35C798E6B827558a1299FB546cf669245C21C770 |
| Min Signers | 2 |
| Max Signers | 10 |
| Standard Timelock | 7 days |
| Emergency Timelock | 24 hours (withdrawals under 10% of balance) |
| Deployment Cooldown | 7 days minimum between interventions |
| Max Deploy Per Intervention | 20% of PRIV balance |
| Network | Base (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 -> ApprovedWithdrawals 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) externaldeposit
Deposit ERC-20 tokens. ETH deposits are accepted via the receive() fallback.
function deposit(address token, uint256 amount) externalexecuteAutomatedDeployment
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
| Function | Description |
|---|---|
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.