编译器
0.8.18+commit.87f61d96
文件 1 的 5:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 5:DataTypes.sol
pragma solidity >=0.8.0;
library DataTypes {
enum Side {
LONG,
SHORT
}
enum UpdatePositionType {
INCREASE,
DECREASE
}
struct UpdatePositionRequest {
uint256 sizeChange;
uint256 collateral;
UpdatePositionType updateType;
Side side;
}
enum OrderType {
MARKET,
LIMIT
}
enum OrderStatus {
OPEN,
FILLED,
EXPIRED,
CANCELLED
}
struct LeverageOrder {
address owner;
address indexToken;
address collateralToken;
OrderStatus status;
bool triggerAboveThreshold;
address payToken;
uint256 price;
uint256 executionFee;
uint256 submissionBlock;
uint256 expiresAt;
uint256 submissionTimestamp;
}
struct SwapOrder {
address owner;
address tokenIn;
address tokenOut;
OrderStatus status;
uint256 amountIn;
uint256 minAmountOut;
uint256 price;
uint256 executionFee;
uint256 submissionBlock;
uint256 submissionTimestamp;
}
struct AssetInfo {
uint256 poolAmount;
uint256 reservedAmount;
uint256 guaranteedValue;
uint256 totalShortSize;
uint256 averageShortPrice;
}
struct Position {
uint256 size;
uint256 collateralValue;
uint256 reserveAmount;
uint256 entryPrice;
uint256 borrowIndex;
}
}
文件 3 的 5:IOrderManager.sol
pragma solidity >=0.8.0;
import {DataTypes} from "../lib/DataTypes.sol";
interface IOrderManager {
function placeLeverageOrder(
DataTypes.UpdatePositionType _updateType,
DataTypes.Side _side,
address _indexToken,
address _collateralToken,
DataTypes.OrderType _orderType,
bytes calldata data
) external payable returns (uint256 orderId);
function executeLeverageOrder(uint256 _orderId, address payable _feeTo) external;
function cancelLeverageOrder(uint256 _orderId) external;
function placeSwapOrder(
address _tokenIn,
address _tokenOut,
uint256 _amountIn,
uint256 _minOut,
uint256 _price,
bytes calldata _extradata
) external payable returns (uint256 orderId);
function executeSwapOrder(uint256 _orderId, address payable _feeTo) external;
function cancelSwapOrder(uint256 _orderId) external;
function swap(
address _fromToken,
address _toToken,
uint256 _amountIn,
uint256 _minAmountOut,
bytes calldata extradata
) external payable;
event LeverageOrderPlaced(
uint256 indexed key, DataTypes.LeverageOrder order, DataTypes.UpdatePositionRequest request
);
event LeverageOrderCancelled(uint256 indexed key);
event LeverageOrderExecuted(
uint256 indexed key, DataTypes.LeverageOrder order, DataTypes.UpdatePositionRequest request, uint256 fillPrice
);
event LeverageOrderExpired(uint256 indexed key);
event SwapOrderPlaced(uint256 indexed key, DataTypes.SwapOrder order);
event SwapOrderCancelled(uint256 indexed key);
event SwapOrderExecuted(uint256 indexed key, uint256 amountIn, uint256 amountOut);
event Swap(
address indexed account,
address indexed tokenIn,
address indexed tokenOut,
address pool,
uint256 amountIn,
uint256 amountOut
);
event OracleChanged(address);
event PoolSet(address indexed pool);
event MinLeverageExecutionFeeSet(uint256 leverageExecutionFee);
event MinSwapExecutionFeeSet(uint256 swapExecutionFee);
event OrderHookSet(address indexed hook);
event ExecutorSet(address indexed executor);
event ControllerSet(address indexed controller);
event SetEnablePublicExecution(bool isEnable);
event SetExecutionDelayTime(uint256 delay);
error OnlyExecutor();
error OnlyWeth();
error ZeroAddress();
error InvalidExecutionFee();
error InvalidLeverageTokenPair(address indexToken, address collateralToken);
error InvalidSwapPair();
error SameTokenSwap();
error OnlyOrderOwner();
error OrderNotOpen();
error ExecutionDelay();
error ExecutionFeeTooLow();
error SlippageReached();
error ZeroPurchaseAmount();
error InvalidPurchaseToken();
error OnlyOwnerOrController();
}
文件 4 的 5:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
modifier onlyOwner() {
_checkOwner();
_;
}
function owner() public view virtual returns (address) {
return _owner;
}
function _checkOwner() internal view virtual {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 5 的 5:PriceReporter.sol
pragma solidity 0.8.18;
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {IOrderManager} from "../interfaces/IOrderManager.sol";
interface IPriceFeed {
function postPrices(address[] calldata tokens, uint256[] calldata prices, uint256[] calldata timestamps) external;
}
contract PriceReporter is Ownable {
IPriceFeed public immutable oracle;
IOrderManager public immutable orderManager;
mapping(address => bool) public isReporter;
address[] public reporters;
constructor(address _oracle, address _orderManager) {
if (_oracle == address(0)) revert InvalidAddress();
if (_orderManager == address(0)) revert InvalidAddress();
oracle = IPriceFeed(_oracle);
orderManager = IOrderManager(_orderManager);
}
function postPriceAndExecuteOrders(
address[] calldata tokens,
uint256[] calldata prices,
uint256[] calldata priceTimestamps,
uint256[] calldata leverageOrders,
uint256[] calldata swapOrders
) external {
if (!isReporter[msg.sender]) revert Unauthorized();
oracle.postPrices(tokens, prices, priceTimestamps);
for (uint256 i = 0; i < leverageOrders.length;) {
try orderManager.executeLeverageOrder(leverageOrders[i], payable(msg.sender)) {} catch {}
unchecked {
++i;
}
}
for (uint256 i = 0; i < swapOrders.length;) {
try orderManager.executeSwapOrder(swapOrders[i], payable(msg.sender)) {} catch {}
unchecked {
++i;
}
}
}
function addReporter(address reporter) external onlyOwner {
if (reporter == address(0)) revert InvalidAddress();
if (isReporter[reporter]) revert ReporterAlreadyAdded();
isReporter[reporter] = true;
reporters.push(reporter);
emit ReporterAdded(reporter);
}
function removeReporter(address reporter) external onlyOwner {
if (!isReporter[reporter]) revert ReporterNotExists();
isReporter[reporter] = false;
for (uint256 i = 0; i < reporters.length; i++) {
if (reporters[i] == reporter) {
reporters[i] = reporters[reporters.length - 1];
break;
}
}
reporters.pop();
emit ReporterRemoved(reporter);
}
event ReporterAdded(address indexed);
event ReporterRemoved(address indexed);
error Unauthorized();
error InvalidAddress();
error ReporterAlreadyAdded();
error ReporterNotExists();
}
{
"compilationTarget": {
"src/oracle/PriceReporter.sol": "PriceReporter"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 1
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_oracle","type":"address"},{"internalType":"address","name":"_orderManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"ReporterAlreadyAdded","type":"error"},{"inputs":[],"name":"ReporterNotExists","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"}],"name":"ReporterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"}],"name":"ReporterRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"reporter","type":"address"}],"name":"addReporter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isReporter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracle","outputs":[{"internalType":"contract IPriceFeed","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orderManager","outputs":[{"internalType":"contract IOrderManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"prices","type":"uint256[]"},{"internalType":"uint256[]","name":"priceTimestamps","type":"uint256[]"},{"internalType":"uint256[]","name":"leverageOrders","type":"uint256[]"},{"internalType":"uint256[]","name":"swapOrders","type":"uint256[]"}],"name":"postPriceAndExecuteOrders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"reporter","type":"address"}],"name":"removeReporter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"reporters","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]