文件 1 的 3:IERC20.sol
pragma solidity >=0.6.0 <0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 2 的 3:IHypervisor.sol
pragma solidity 0.7.6;
pragma abicoder v2;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
interface IHypervisor {
function rebalance(
int24 _baseLower,
int24 _baseUpper,
int24 _limitLower,
int24 _limitUpper,
address _feeRecipient,
int256 swapQuantity
) external;
function setMaxTotalSupply(uint256 _maxTotalSupply) external;
function setDepositMax(uint256 _deposit0Max, uint256 _deposit1Max) external;
function appendList(address[] memory listed) external;
function toggleWhitelist() external;
function emergencyWithdraw(IERC20 token, uint256 amount) external;
function emergencyBurn(
int24 tickLower,
int24 tickUpper,
uint128 liquidity
) external;
function transferOwnership(address newOwner) external;
}
文件 3 的 3:admin.sol
pragma solidity 0.7.6;
import "../interfaces/IHypervisor.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract Admin {
address public admin;
address public advisor;
modifier onlyAdvisor {
require(msg.sender == advisor, "only advisor");
_;
}
modifier onlyAdmin {
require(msg.sender == admin, "only admin");
_;
}
constructor(address _admin, address _advisor) public {
admin = _admin;
advisor = _advisor;
}
function rebalance(
address _hypervisor,
int24 _baseLower,
int24 _baseUpper,
int24 _limitLower,
int24 _limitUpper,
address _feeRecipient,
int256 swapQuantity
) external onlyAdvisor {
IHypervisor(_hypervisor).rebalance(_baseLower, _baseUpper, _limitLower, _limitUpper, _feeRecipient, swapQuantity);
}
function emergencyWithdraw(
address _hypervisor,
IERC20 token,
uint256 amount
) external onlyAdmin {
IHypervisor(_hypervisor).emergencyWithdraw(token, amount);
}
function emergencyBurn(
address _hypervisor,
int24 tickLower,
int24 tickUpper,
uint128 liquidity
) external onlyAdmin {
IHypervisor(_hypervisor).emergencyBurn(tickLower, tickUpper, liquidity);
}
function setDepositMax(address _hypervisor, uint256 _deposit0Max, uint256 _deposit1Max) external onlyAdmin {
IHypervisor(_hypervisor).setDepositMax(_deposit0Max, _deposit1Max);
}
function setMaxTotalSupply(address _hypervisor, uint256 _maxTotalSupply) external onlyAdmin {
IHypervisor(_hypervisor).setMaxTotalSupply(_maxTotalSupply);
}
function toggleWhitelist(address _hypervisor) external onlyAdmin {
IHypervisor(_hypervisor).toggleWhitelist();
}
function appendList(address _hypervisor, address[] memory listed) external onlyAdmin {
IHypervisor(_hypervisor).appendList(listed);
}
function transferAdmin(address newAdmin) external onlyAdmin {
admin = newAdmin;
}
function transferAdvisor(address newAdvisor) external onlyAdmin {
advisor = newAdvisor;
}
function transferHypervisorOwner(address _hypervisor, address newOwner) external onlyAdmin {
IHypervisor(_hypervisor).transferOwnership(newOwner);
}
function rescueERC20(IERC20 token, address recipient) external onlyAdmin {
require(token.transfer(recipient, token.balanceOf(address(this))));
}
}
{
"compilationTarget": {
"contracts/proxy/admin.sol": "Admin"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "none"
},
"optimizer": {
"enabled": true,
"runs": 800
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_advisor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"advisor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_hypervisor","type":"address"},{"internalType":"address[]","name":"listed","type":"address[]"}],"name":"appendList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hypervisor","type":"address"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"uint128","name":"liquidity","type":"uint128"}],"name":"emergencyBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hypervisor","type":"address"},{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hypervisor","type":"address"},{"internalType":"int24","name":"_baseLower","type":"int24"},{"internalType":"int24","name":"_baseUpper","type":"int24"},{"internalType":"int24","name":"_limitLower","type":"int24"},{"internalType":"int24","name":"_limitUpper","type":"int24"},{"internalType":"address","name":"_feeRecipient","type":"address"},{"internalType":"int256","name":"swapQuantity","type":"int256"}],"name":"rebalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hypervisor","type":"address"},{"internalType":"uint256","name":"_deposit0Max","type":"uint256"},{"internalType":"uint256","name":"_deposit1Max","type":"uint256"}],"name":"setDepositMax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hypervisor","type":"address"},{"internalType":"uint256","name":"_maxTotalSupply","type":"uint256"}],"name":"setMaxTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hypervisor","type":"address"}],"name":"toggleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"transferAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdvisor","type":"address"}],"name":"transferAdvisor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_hypervisor","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferHypervisorOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]