编译器
0.8.10+commit.fc410830
文件 1 的 15:IERC20.sol
pragma solidity >=0.7.5;
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 的 15:IERC20Metadata.sol
pragma solidity >=0.7.5;
import "./IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 3 的 15:IOlympusAuthority.sol
pragma solidity >=0.7.5;
interface IOlympusAuthority {
event GovernorPushed(address indexed from, address indexed to, bool _effectiveImmediately);
event GuardianPushed(address indexed from, address indexed to, bool _effectiveImmediately);
event PolicyPushed(address indexed from, address indexed to, bool _effectiveImmediately);
event VaultPushed(address indexed from, address indexed to, bool _effectiveImmediately);
event GovernorPulled(address indexed from, address indexed to);
event GuardianPulled(address indexed from, address indexed to);
event PolicyPulled(address indexed from, address indexed to);
event VaultPulled(address indexed from, address indexed to);
function governor() external view returns (address);
function guardian() external view returns (address);
function policy() external view returns (address);
function vault() external view returns (address);
}
文件 4 的 15:IOlympusPro.sol
pragma solidity ^0.8.10;
import "./IProMarketCreator.sol";
import "./IProNoteKeeper.sol";
import "./IProViewer.sol";
interface IOlympusPro is IProMarketCreator, IProNoteKeeper, IProViewer {
function deposit(
uint48 _id,
uint256[2] memory _amounts,
address[2] memory _addresses
) external returns (
uint256 payout_,
uint256 expiry_,
uint256 index_
);
}
文件 5 的 15:IProCall.sol
pragma solidity ^0.8.10;
interface IProCall {
function call(uint256 id, uint256 amountIn, uint256 amountOut) external;
}
文件 6 的 15:IProMarketCreator.sol
pragma solidity ^0.8.10;
import "./IERC20.sol";
interface IProMarketCreator {
struct Market {
address creator;
IERC20 baseToken;
IERC20 quoteToken;
bool call;
bool capacityInQuote;
uint256 capacity;
uint256 totalDebt;
uint256 minPrice;
uint256 maxPayout;
uint256 sold;
uint256 purchased;
}
struct Terms {
uint256 controlVariable;
uint256 maxDebt;
bool fixedTerm;
uint48 vesting;
uint48 conclusion;
}
struct Metadata {
uint48 lastTune;
uint48 lastDecay;
uint48 length;
uint48 depositInterval;
uint48 tuneInterval;
uint8 baseDecimals;
uint8 quoteDecimals;
}
struct Adjustment {
uint128 change;
uint48 lastAdjustment;
uint48 timeToAdjusted;
bool active;
}
function create (
IERC20[2] memory _tokens,
uint256[4] memory _market,
bool[2] memory _booleans,
uint256[2] memory _terms,
uint32[2] memory _intervals
) external returns (uint256 id_);
function close(uint256 _id) external;
}
文件 7 的 15:IProNoteKeeper.sol
pragma solidity ^0.8.10;
import "./IERC20.sol";
interface IProNoteKeeper {
struct Note {
uint256 payout;
uint48 created;
uint48 matured;
uint48 redeemed;
uint48 marketID;
address token;
}
function redeem(address _user, uint256[] memory _indexes) external;
function redeemAll(address _user) external;
function pushNote(address to, uint256 index) external;
function pullNote(address from, uint256 index) external returns (uint256 newIndex_);
function indexesFor(address _user) external view returns (uint256[] memory);
function pendingFor(address _user, uint256 _index) external view returns (uint256 payout_, bool matured_);
}
文件 8 的 15:IProViewer.sol
pragma solidity ^0.8.10;
interface IProViewer {
function isLive(uint256 _bid) external view returns (bool);
function liveMarkets() external view returns (uint256[] memory);
function liveMarketsFor(bool _creator, bool _base, address _address) external view returns (uint256[] memory);
function payoutFor(uint256 _amount, uint256 _bid) external view returns (uint256);
function marketPrice(uint256 _bid) external view returns (uint256);
function currentDebt(uint256 _bid) external view returns (uint256);
}
文件 9 的 15:MarketCreator.sol
pragma solidity ^0.8.10;
import "../../interfaces/IERC20Metadata.sol";
import "../../interfaces/IProMarketCreator.sol";
abstract contract ProMarketCreator is IProMarketCreator {
event CreateMarket(uint256 indexed id, address baseToken, address quoteToken, uint256 initialPrice, uint256 conclusion);
event CloseMarket(uint256 indexed id);
Market[] public markets;
Terms[] public terms;
Metadata[] public metadata;
mapping(uint256 => Adjustment) public adjustments;
mapping(address => uint256[]) public marketsForBase;
mapping(address => uint256[]) public marketsForQuote;
mapping(address => uint256[]) public marketsForCreator;
function create(
IERC20[2] memory _tokens,
uint256[4] memory _market,
bool[2] memory _booleans,
uint256[2] memory _terms,
uint32[2] memory _intervals
) external override returns (uint256 id_) {
require(_market[1] >= _market[2], "Creator: min price must be > initial");
id_ = markets.length;
marketsForBase[address(_tokens[0])].push(id_);
marketsForQuote[address(_tokens[1])].push(id_);
marketsForCreator[msg.sender].push(id_);
emit CreateMarket(id_, address(_tokens[0]), address(_tokens[1]), _market[1], _terms[1]);
uint256 secondsToConclusion = _terms[1] - block.timestamp;
uint256 baseDecimals = IERC20Metadata(address(_tokens[0])).decimals();
uint256 quoteDecimals = IERC20Metadata(address(_tokens[1])).decimals();
metadata.push(Metadata({
lastTune: uint48(block.timestamp),
lastDecay: uint48(block.timestamp),
length: uint48(secondsToConclusion),
depositInterval: _intervals[0],
tuneInterval: _intervals[1],
baseDecimals: uint8(baseDecimals),
quoteDecimals: uint8(quoteDecimals)
}));
uint256 targetDebt = _booleans[0]
? (_market[0] * (10 ** (2 * baseDecimals)) / _market[1]) / 10 ** quoteDecimals
: _market[0];
uint256 maxPayout = targetDebt * _intervals[0] / secondsToConclusion;
markets.push(Market({
creator: msg.sender,
baseToken: _tokens[0],
quoteToken: _tokens[1],
call: false,
capacityInQuote: _booleans[0],
capacity: _market[0],
totalDebt: targetDebt,
minPrice: _market[2],
maxPayout: maxPayout,
purchased: 0,
sold: 0
}));
uint256 maxDebt = targetDebt + (targetDebt * _market[3] / 1e5);
uint256 controlVariable = _market[1] * (10 ** baseDecimals) / targetDebt;
terms.push(Terms({
fixedTerm: _booleans[1],
controlVariable: controlVariable,
vesting: uint48(_terms[0]),
conclusion: uint48(_terms[1]),
maxDebt: maxDebt
}));
}
function close(uint256 _id) external override {
require(msg.sender == markets[_id].creator, "Only creator");
terms[_id].conclusion = uint48(block.timestamp);
markets[_id].capacity = 0;
emit CloseMarket(_id);
}
}
文件 10 的 15:NoteKeeper.sol
pragma solidity ^0.8.10;
import "../../interfaces/IProNoteKeeper.sol";
contract ProVesting {
address internal immutable depository;
constructor() {
depository = msg.sender;
}
function transfer(address token, address to, uint256 amount) external {
require(msg.sender == depository, "Vesting: Only depository");
IERC20(token).transfer(to, amount);
}
}
interface IVesting {
function transfer(address token, address to, uint256 amount) external;
}
abstract contract ProNoteKeeper is IProNoteKeeper {
mapping(address => Note[]) public notes;
mapping(address => mapping(uint256 => address)) private noteTransfers;
IVesting public immutable vestingContract;
constructor () {
vestingContract = IVesting(address(new ProVesting()));
}
function redeem(address _user, uint256[] memory _indexes) public override {
uint48 time = uint48(block.timestamp);
for (uint256 i = 0; i < _indexes.length; i++) {
Note storage note = notes[_user][_indexes[i]];
bool matured = note.redeemed == 0 && note.matured <= block.timestamp && note.payout != 0;
if (matured) {
note.redeemed = time;
vestingContract.transfer(note.token, _user, note.payout);
}
}
}
function redeemAll(address _user) external override {
return redeem(_user, indexesFor(_user));
}
function pushNote(address _to, uint256 _index) external override {
require(notes[msg.sender][_index].created != 0, "Depository: note not found");
noteTransfers[msg.sender][_index] = _to;
}
function pullNote(address _from, uint256 _index) external override returns (uint256 newIndex_) {
require(noteTransfers[_from][_index] == msg.sender, "Depository: transfer not found");
require(notes[_from][_index].redeemed == 0, "Depository: note redeemed");
newIndex_ = notes[msg.sender].length;
notes[msg.sender].push(notes[_from][_index]);
delete notes[_from][_index];
}
function indexesFor(address _user) public view override returns (uint256[] memory indexes_) {
Note[] memory info = notes[_user];
uint256 length;
for (uint256 i = 0; i < info.length; i++) {
if (info[i].redeemed == 0 && info[i].payout != 0) length++;
}
indexes_ = new uint256[](length);
uint256 position;
for (uint256 i = 0; i < info.length; i++) {
if (info[i].redeemed == 0 && info[i].payout != 0) {
indexes_[position] = i;
position++;
}
}
}
function pendingFor(address _user, uint256 _index) public view override returns (uint256 payout_, bool matured_) {
Note memory note = notes[_user][_index];
payout_ = note.payout;
matured_ = note.redeemed == 0 && note.matured <= block.timestamp && note.payout != 0;
}
}
文件 11 的 15:OlympusAccessControlled.sol
pragma solidity >=0.7.5;
import "../interfaces/IOlympusAuthority.sol";
abstract contract OlympusAccessControlled {
event AuthorityUpdated(IOlympusAuthority indexed authority);
string UNAUTHORIZED = "UNAUTHORIZED";
IOlympusAuthority public authority;
constructor(IOlympusAuthority _authority) {
authority = _authority;
emit AuthorityUpdated(_authority);
}
modifier onlyGovernor() {
require(msg.sender == authority.governor(), UNAUTHORIZED);
_;
}
modifier onlyGuardian() {
require(msg.sender == authority.guardian(), UNAUTHORIZED);
_;
}
modifier onlyPolicy() {
require(msg.sender == authority.policy(), UNAUTHORIZED);
_;
}
modifier onlyVault() {
require(msg.sender == authority.vault(), UNAUTHORIZED);
_;
}
function setAuthority(IOlympusAuthority _newAuthority) external onlyGovernor {
authority = _newAuthority;
emit AuthorityUpdated(_newAuthority);
}
}
文件 12 的 15:OlympusPro.sol
pragma solidity ^0.8.10;
import "./types/Pro/MarketCreator.sol";
import "./types/Pro/NoteKeeper.sol";
import "./types/Pro/Rewarder.sol";
import "./types/Pro/Viewer.sol";
import "./libraries/SafeERC20.sol";
import "./interfaces/IERC20Metadata.sol";
import "./interfaces/IOlympusPro.sol";
import "./interfaces/IProCall.sol";
contract OlympusProV2 is ProMarketCreator, ProViewer, ProNoteKeeper, ProRewarder {
using SafeERC20 for IERC20;
event Bond(uint256 indexed id, uint256 amount, uint256 price);
event Tuned(uint256 indexed id, uint256 oldControlVariable, uint256 newControlVariable);
constructor(address _authority)
ProMarketCreator()
ProViewer()
ProNoteKeeper()
ProRewarder(IOlympusAuthority(_authority))
{}
function deposit(
uint48 _id,
uint256[2] memory _amounts,
address[2] memory _addresses
) external returns (
uint256 payout_,
uint256 expiry_,
uint256 index_
) {
Market storage market = markets[_id];
Terms memory term = terms[_id];
uint48 currentTime = uint48(block.timestamp);
address sendTo;
uint256 price = _decayAndGetPrice(_id, currentTime);
require(currentTime < term.conclusion, "Depository: market concluded");
payout_ = _amounts[0]
* (10 ** (2 * metadata[_id].baseDecimals))
/ price
/ (10 ** metadata[_id].quoteDecimals);
require(payout_ <= market.maxPayout, "Depository: max size exceeded");
require(payout_ >= _amounts[1], "Depository: Less than min out");
if ((term.fixedTerm && term.vesting == 0) || (!term.fixedTerm && term.vesting <= block.timestamp)) {
sendTo = _addresses[0];
expiry_ = 0;
} else {
sendTo = address(vestingContract);
expiry_ = term.fixedTerm
? term.vesting + currentTime
: term.vesting;
index_ = notes[_addresses[0]].length;
notes[_addresses[0]].push(
Note({
payout: payout_,
created: uint48(block.timestamp),
matured: uint48(expiry_),
redeemed: 0,
marketID: uint48(_id),
token: address(market.baseToken)
})
);
}
market.capacity -= market.capacityInQuote
? _amounts[0]
: payout_;
market.purchased += _amounts[0];
market.sold += payout_;
market.totalDebt += payout_;
emit Bond(_id, _amounts[0], price);
if (term.maxDebt < market.totalDebt) {
market.capacity = 0;
emit CloseMarket(_id);
} else {
_tune(_id, currentTime, price);
}
_getBaseTokens(market.call, _id, _amounts[0], payout_, _addresses[1]);
markets[_id].baseToken.safeTransfer(sendTo, payout_);
markets[_id].quoteToken.safeTransferFrom(msg.sender, markets[_id].creator, _amounts[0]);
}
function _marketPrice(uint256 _id) internal view returns (uint256) {
return
terms[_id].controlVariable
* markets[_id].totalDebt
/ 10 ** metadata[_id].baseDecimals;
}
function _decayAndGetPrice(uint256 _id, uint48 _time) internal returns (uint256 marketPrice_) {
markets[_id].totalDebt -= _debtDecay(_id);
metadata[_id].lastDecay = _time;
if (adjustments[_id].active) {
Adjustment storage adjustment = adjustments[_id];
(uint256 adjustBy, uint48 secondsSince, bool stillActive) = _controlDecay(_id);
terms[_id].controlVariable -= adjustBy;
if (stillActive) {
adjustment.change -= uint128(adjustBy);
adjustment.timeToAdjusted -= secondsSince;
adjustment.lastAdjustment = _time;
} else {
adjustment.active = false;
}
}
marketPrice_ = _marketPrice(_id);
uint256 minPrice = markets[_id].minPrice;
if (marketPrice_ < minPrice) {
markets[_id].totalDebt = markets[_id].totalDebt * minPrice / marketPrice_;
marketPrice_ = minPrice;
}
}
function _tune(uint256 _id, uint48 _time, uint256 _price) internal {
Metadata memory meta = metadata[_id];
if (_time >= meta.lastTune + meta.tuneInterval) {
Market memory market = markets[_id];
uint256 timeRemaining = terms[_id].conclusion - _time;
uint256 capacity = market.capacityInQuote
? (market.capacity * (10 ** (2 * meta.baseDecimals)) / _price) / (10 ** meta.quoteDecimals)
: market.capacity;
markets[_id].maxPayout = capacity * meta.depositInterval / timeRemaining;
uint256 targetDebt = capacity * meta.length / timeRemaining;
uint256 newControlVariable = _price * (10 ** meta.baseDecimals) / targetDebt;
emit Tuned(_id, terms[_id].controlVariable, newControlVariable);
if (newControlVariable >= terms[_id].controlVariable) {
terms[_id].controlVariable = newControlVariable;
} else {
uint256 change = terms[_id].controlVariable - newControlVariable;
adjustments[_id] = Adjustment(uint128(change), _time, meta.tuneInterval, true);
}
metadata[_id].lastTune = _time;
}
}
function _getBaseTokens(bool _call, uint48 _id, uint256 _amount, uint256 _payout, address _referrer) internal {
IERC20 baseToken = markets[_id].baseToken;
uint256 fee = _giveRewards(baseToken, _payout, _referrer);
if (_call) {
uint256 balance = baseToken.balanceOf(address(this));
IProCall(markets[_id].creator).call(_id, _amount, _payout + fee);
require(baseToken.balanceOf(address(this)) >= balance + _payout + fee, "Depository: not funded");
} else baseToken.safeTransferFrom(markets[_id].creator, address(this), _payout + fee);
}
function _debtDecay(uint256 _id) internal view returns (uint256) {
Metadata memory meta = metadata[_id];
uint256 secondsSince = block.timestamp - meta.lastDecay;
return markets[_id].totalDebt * secondsSince / meta.length;
}
}
文件 13 的 15:Rewarder.sol
pragma solidity ^0.8.10;
import "../OlympusAccessControlled.sol";
import "../../interfaces/IERC20.sol";
abstract contract ProRewarder is OlympusAccessControlled {
uint256 public daoReward;
uint256 public refReward;
mapping(address => mapping(IERC20 => uint256)) public rewards;
mapping(address => bool) public whitelisted;
constructor(IOlympusAuthority _authority) OlympusAccessControlled(_authority) {}
function getReward(IERC20[] memory tokens) external {
for (uint256 i; i < tokens.length; i++) {
uint256 reward = rewards[msg.sender][tokens[i]];
rewards[msg.sender][tokens[i]] = 0;
tokens[i].transfer(msg.sender, reward);
}
}
function _giveRewards(
IERC20 _token,
uint256 _payout,
address _referral
) internal returns (uint256) {
uint256 toDAO = _payout * daoReward / 1e4;
uint256 toRef = _payout * refReward / 1e4;
if (whitelisted[_referral]) {
rewards[_referral][_token] += toRef;
rewards[authority.guardian()][_token] += toDAO;
} else {
rewards[authority.guardian()][_token] += toDAO + toRef;
}
return toDAO + toRef;
}
function enableRewards() external onlyGovernor {
refReward = 3;
daoReward = 30;
}
function disableRewards(bool _dao) external onlyGovernor {
if (_dao) {
daoReward = 0;
} else {
refReward = 0;
}
}
function whitelist(address _operator) external onlyPolicy {
whitelisted[_operator] = !whitelisted[_operator];
}
}
文件 14 的 15:SafeERC20.sol
pragma solidity >=0.7.5;
import {IERC20} from "../interfaces/IERC20.sol";
library SafeERC20 {
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, amount)
);
require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FROM_FAILED");
}
function safeTransfer(
IERC20 token,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(IERC20.transfer.selector, to, amount)
);
require(success && (data.length == 0 || abi.decode(data, (bool))), "TRANSFER_FAILED");
}
function safeApprove(
IERC20 token,
address to,
uint256 amount
) internal {
(bool success, bytes memory data) = address(token).call(
abi.encodeWithSelector(IERC20.approve.selector, to, amount)
);
require(success && (data.length == 0 || abi.decode(data, (bool))), "APPROVE_FAILED");
}
function safeTransferETH(address to, uint256 amount) internal {
(bool success, ) = to.call{value: amount}(new bytes(0));
require(success, "ETH_TRANSFER_FAILED");
}
}
文件 15 的 15:Viewer.sol
pragma solidity ^0.8.10;
import "./MarketCreator.sol";
import "../../interfaces/IProViewer.sol";
abstract contract ProViewer is IProViewer, ProMarketCreator {
constructor() ProMarketCreator() {}
function marketPrice(uint256 _id) public view override returns (uint256) {
uint256 price =
currentControlVariable(_id)
* currentDebt(_id)
/ (10 ** metadata[_id].baseDecimals);
return
(price > markets[_id].minPrice)
? price
: markets[_id].minPrice;
}
function payoutFor(uint256 _amount, uint256 _id) public view override returns (uint256) {
Metadata memory meta = metadata[_id];
return
_amount
* 10 ** (2 * meta.baseDecimals)
/ marketPrice(_id)
/ 10 ** meta.quoteDecimals;
}
function currentDebt(uint256 _id) public view override returns (uint256) {
uint256 decay = markets[_id].totalDebt
* (block.timestamp - metadata[_id].lastDecay)
/ metadata[_id].length;
return markets[_id].totalDebt - decay;
}
function currentControlVariable(uint256 _id) public view returns (uint256) {
(uint256 decay,,) = _controlDecay(_id);
return terms[_id].controlVariable - decay;
}
function maxIn(uint256 _id) public view returns (uint256) {
Metadata memory meta = metadata[_id];
return
markets[_id].maxPayout
* 10 ** meta.quoteDecimals
* marketPrice(_id)
/ 2 * (10 ** meta.baseDecimals);
}
function instantSwap(uint256 _id) public view returns (bool) {
Terms memory term = terms[_id];
return (term.fixedTerm && term.vesting == 0) || (!term.fixedTerm && term.vesting <= block.timestamp);
}
function isLive(uint256 _id) public view override returns (bool) {
return (markets[_id].capacity != 0 && terms[_id].conclusion > block.timestamp);
}
function liveMarkets() external view override returns (uint256[] memory) {
return liveMarketsBetween(0, markets.length);
}
function liveMarketsBetween(uint256 firstIndex, uint256 lastIndex) public view returns (uint256[] memory) {
uint256 num;
for (uint256 i = firstIndex; i < lastIndex; i++) {
if (isLive(i)) num++;
}
uint256[] memory ids = new uint256[](num);
uint256 nonce;
for (uint256 i = firstIndex; i < lastIndex; i++) {
if (isLive(i)) {
ids[nonce] = i;
nonce++;
}
}
return ids;
}
function liveMarketsFor(bool _creator, bool _base, address _address) public view override returns (uint256[] memory) {
uint256[] memory mkts;
if (_creator) {
mkts = marketsForCreator[_address];
} else {
mkts = _base
? marketsForBase[_address]
: marketsForQuote[_address];
}
uint256 num;
for (uint256 i = 0; i < mkts.length; i++) {
if (isLive(mkts[i])) num++;
}
uint256[] memory ids = new uint256[](num);
uint256 nonce;
for (uint256 i = 0; i < mkts.length; i++) {
if (isLive(mkts[i])) {
ids[nonce] = mkts[i];
nonce++;
}
}
return ids;
}
function marketsFor(address tokenIn, address tokenOut) public view returns (uint256[] memory) {
uint256[] memory forBase = liveMarketsFor(false, true, tokenOut);
uint256[] memory ids;
uint256 nonce;
for(uint256 i; i < forBase.length; i++) {
if (address(markets[forBase[i]].quoteToken) == tokenIn) {
ids[nonce] = forBase[i];
}
}
return ids;
}
function findMarketFor(
address tokenIn,
address tokenOut,
uint256 amountIn,
uint256 minAmountOut,
uint256 maxExpiry
) external view returns (uint256 id) {
uint256[] memory ids = marketsFor(tokenIn, tokenOut);
uint256[] memory payouts;
uint256 n;
for(uint256 i; i < ids.length; i++) {
Terms memory term = terms[ids[i]];
uint256 expiry = term.fixedTerm ? block.timestamp + term.vesting : term.vesting;
require(expiry <= maxExpiry, "Bad expiry");
if (minAmountOut > markets[ids[i]].maxPayout) {
payouts[n] = payoutFor(amountIn, ids[i]);
} else {
payouts[n] = 0;
}
n++;
}
uint256 highestOut;
for (uint256 i; i < payouts.length; i++) {
if (payouts[i] > highestOut) {
highestOut = payouts[i];
id = ids[i];
}
}
}
function _controlDecay(uint256 _id) internal view returns (uint256 decay_, uint48 secondsSince_, bool active_) {
Adjustment memory info = adjustments[_id];
if (!info.active) return (0, 0, false);
secondsSince_ = uint48(block.timestamp) - info.lastAdjustment;
active_ = secondsSince_ < info.timeToAdjusted;
decay_ = active_
? info.change * secondsSince_ / info.timeToAdjusted
: info.change;
}
}
{
"compilationTarget": {
"contracts/OlympusPro.sol": "OlympusProV2"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "none",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 800
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_authority","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IOlympusAuthority","name":"authority","type":"address"}],"name":"AuthorityUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Bond","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"CloseMarket","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"address","name":"baseToken","type":"address"},{"indexed":false,"internalType":"address","name":"quoteToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"initialPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"conclusion","type":"uint256"}],"name":"CreateMarket","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldControlVariable","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newControlVariable","type":"uint256"}],"name":"Tuned","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"adjustments","outputs":[{"internalType":"uint128","name":"change","type":"uint128"},{"internalType":"uint48","name":"lastAdjustment","type":"uint48"},{"internalType":"uint48","name":"timeToAdjusted","type":"uint48"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"authority","outputs":[{"internalType":"contract IOlympusAuthority","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"close","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20[2]","name":"_tokens","type":"address[2]"},{"internalType":"uint256[4]","name":"_market","type":"uint256[4]"},{"internalType":"bool[2]","name":"_booleans","type":"bool[2]"},{"internalType":"uint256[2]","name":"_terms","type":"uint256[2]"},{"internalType":"uint32[2]","name":"_intervals","type":"uint32[2]"}],"name":"create","outputs":[{"internalType":"uint256","name":"id_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"currentControlVariable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"currentDebt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daoReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint48","name":"_id","type":"uint48"},{"internalType":"uint256[2]","name":"_amounts","type":"uint256[2]"},{"internalType":"address[2]","name":"_addresses","type":"address[2]"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"payout_","type":"uint256"},{"internalType":"uint256","name":"expiry_","type":"uint256"},{"internalType":"uint256","name":"index_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_dao","type":"bool"}],"name":"disableRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxExpiry","type":"uint256"}],"name":"findMarketFor","outputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20[]","name":"tokens","type":"address[]"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"indexesFor","outputs":[{"internalType":"uint256[]","name":"indexes_","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"instantSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"isLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liveMarkets","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"firstIndex","type":"uint256"},{"internalType":"uint256","name":"lastIndex","type":"uint256"}],"name":"liveMarketsBetween","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_creator","type":"bool"},{"internalType":"bool","name":"_base","type":"bool"},{"internalType":"address","name":"_address","type":"address"}],"name":"liveMarketsFor","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"marketPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"markets","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"contract IERC20","name":"baseToken","type":"address"},{"internalType":"contract IERC20","name":"quoteToken","type":"address"},{"internalType":"bool","name":"call","type":"bool"},{"internalType":"bool","name":"capacityInQuote","type":"bool"},{"internalType":"uint256","name":"capacity","type":"uint256"},{"internalType":"uint256","name":"totalDebt","type":"uint256"},{"internalType":"uint256","name":"minPrice","type":"uint256"},{"internalType":"uint256","name":"maxPayout","type":"uint256"},{"internalType":"uint256","name":"sold","type":"uint256"},{"internalType":"uint256","name":"purchased","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"marketsFor","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForCreator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketsForQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"maxIn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"metadata","outputs":[{"internalType":"uint48","name":"lastTune","type":"uint48"},{"internalType":"uint48","name":"lastDecay","type":"uint48"},{"internalType":"uint48","name":"length","type":"uint48"},{"internalType":"uint48","name":"depositInterval","type":"uint48"},{"internalType":"uint48","name":"tuneInterval","type":"uint48"},{"internalType":"uint8","name":"baseDecimals","type":"uint8"},{"internalType":"uint8","name":"quoteDecimals","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"notes","outputs":[{"internalType":"uint256","name":"payout","type":"uint256"},{"internalType":"uint48","name":"created","type":"uint48"},{"internalType":"uint48","name":"matured","type":"uint48"},{"internalType":"uint48","name":"redeemed","type":"uint48"},{"internalType":"uint48","name":"marketID","type":"uint48"},{"internalType":"address","name":"token","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"payoutFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"pendingFor","outputs":[{"internalType":"uint256","name":"payout_","type":"uint256"},{"internalType":"bool","name":"matured_","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"pullNote","outputs":[{"internalType":"uint256","name":"newIndex_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"pushNote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256[]","name":"_indexes","type":"uint256[]"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"redeemAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"contract IERC20","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IOlympusAuthority","name":"_newAuthority","type":"address"}],"name":"setAuthority","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"terms","outputs":[{"internalType":"uint256","name":"controlVariable","type":"uint256"},{"internalType":"uint256","name":"maxDebt","type":"uint256"},{"internalType":"bool","name":"fixedTerm","type":"bool"},{"internalType":"uint48","name":"vesting","type":"uint48"},{"internalType":"uint48","name":"conclusion","type":"uint48"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vestingContract","outputs":[{"internalType":"contract IVesting","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"}],"name":"whitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]