42 lines
1.4 KiB
Solidity
42 lines
1.4 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.20;
|
|
|
|
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
|
import "@openzeppelin/contracts/token/ERC20/extensions/ERC4626.sol";
|
|
import "@openzeppelin/contracts/access/AccessControl.sol";
|
|
|
|
/**
|
|
* @title WrappedLPNAVVault
|
|
* @notice Option B scaffold: standard ERC-4626 vault over an underlying asset (e.g. USDC on mainnet).
|
|
* @dev Strategy deployment of vault assets into Chain 138 LP is **operational** (outside this contract).
|
|
* Use `depositCap` for soft-launch; seed initial deposit to mitigate donation attacks per OZ ERC4626 docs.
|
|
*/
|
|
contract WrappedLPNAVVault is ERC4626, AccessControl {
|
|
bytes32 public constant CAP_ADMIN_ROLE = keccak256("CAP_ADMIN_ROLE");
|
|
|
|
uint256 public depositCap;
|
|
|
|
constructor(
|
|
IERC20 asset_,
|
|
string memory name_,
|
|
string memory symbol_,
|
|
address admin
|
|
) ERC20(name_, symbol_) ERC4626(asset_) {
|
|
require(admin != address(0), "Vault: zero admin");
|
|
_grantRole(DEFAULT_ADMIN_ROLE, admin);
|
|
_grantRole(CAP_ADMIN_ROLE, admin);
|
|
}
|
|
|
|
function maxDeposit(address) public view override returns (uint256) {
|
|
uint256 cap = depositCap;
|
|
if (cap == 0) return type(uint256).max;
|
|
uint256 a = totalAssets();
|
|
if (a >= cap) return 0;
|
|
return cap - a;
|
|
}
|
|
|
|
function setDepositCap(uint256 cap) external onlyRole(CAP_ADMIN_ROLE) {
|
|
depositCap = cap;
|
|
}
|
|
}
|