Files
liquid/src/utils/PermissionedProxy.sol
zeekay 24b8a39554 ci: add production security tooling (Makefile, lint config, slither, format)
- Add Makefile with make security/audit/test/slither/semgrep/aderyn targets (uv-based venv)
- Add foundry.toml lint config: suppress naming convention notes, enforce safety warnings
- Replace slither.config.json with .slither.config.json (proper naming, foundry framework, exclude naming-convention/pragma/solc-version/assembly)
- Fix foundry.toml fuzz_runs warning (move to [profile.lite.fuzz] section)
- Harden CI: remove continue-on-error from all security tools in security.yml
- Harden CI: set slither fail-on: medium (was: none)
- Add .venv/, slither-report.json, semgrep-results.sarif, aderyn-report.md to .gitignore
- Run forge fmt across entire codebase
2026-03-25 12:22:23 -07:00

60 lines
1.6 KiB
Solidity

// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;
contract PermissionedProxy {
address admin;
mapping(address => bool) operators;
mapping(bytes4 => bool) permissionedCalls;
constructor(address _admin, address _operator) {
require(_admin != address(0), "zero");
require(_operator != address(0), "zero");
admin = _admin;
operators[_operator] = true;
}
modifier onlyAdmin() {
require(msg.sender == admin, "PD");
_;
}
modifier onlyOperator() {
require(operators[msg.sender], "PD");
_;
}
event AdminUpdated(address indexed admin);
event OperatorUpdated(address indexed operator);
event AddedPermissionedCall(bytes4 indexed sig);
function setAdmin(address _admin) external onlyAdmin {
require(_admin != address(0), "zero");
admin = _admin;
emit AdminUpdated(_admin);
}
function setOperator(address _operator, bool value) external onlyAdmin {
require(_operator != address(0), "zero");
operators[_operator] = value;
emit OperatorUpdated(_operator);
}
function setPermissionedCall(bytes4 sig, bool value) external onlyAdmin {
permissionedCalls[sig] = value;
emit AddedPermissionedCall(sig);
}
function proxy(address vault, bytes memory data) external payable onlyAdmin {
bytes4 selector;
require(data.length >= 4, "SEL");
assembly {
selector := mload(add(data, 32))
}
require(!permissionedCalls[selector], "PD");
(bool success,) = vault.call{value: msg.value}(data);
require(success, "failed");
}
}