Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 99 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Initialize | 12152518 | 1482 days ago | IN | 0 ETH | 0.01242867 | ||||
Allocate Seignio... | 12151823 | 1482 days ago | IN | 0 ETH | 0.03621961 | ||||
Buy Bonds | 12097974 | 1490 days ago | IN | 0 ETH | 0.02726143 | ||||
Buy Bonds | 12096085 | 1490 days ago | IN | 0 ETH | 0.02826288 | ||||
Buy Bonds | 12096073 | 1490 days ago | IN | 0 ETH | 0.03191552 | ||||
Buy Bonds | 12096054 | 1490 days ago | IN | 0 ETH | 0.05553954 | ||||
Buy Bonds | 12096046 | 1490 days ago | IN | 0 ETH | 0.056858 | ||||
Buy Bonds | 12079299 | 1493 days ago | IN | 0 ETH | 0.03023819 | ||||
Buy Bonds | 12057083 | 1496 days ago | IN | 0 ETH | 0.04319574 | ||||
Buy Bonds | 12022137 | 1502 days ago | IN | 0 ETH | 0.02843854 | ||||
Buy Bonds | 12014954 | 1503 days ago | IN | 0 ETH | 0.02294553 | ||||
Buy Bonds | 12014863 | 1503 days ago | IN | 0 ETH | 0.04140459 | ||||
Buy Bonds | 11984329 | 1508 days ago | IN | 0 ETH | 0.01974662 | ||||
Buy Bonds | 11980908 | 1508 days ago | IN | 0 ETH | 0.02201467 | ||||
Buy Bonds | 11966019 | 1511 days ago | IN | 0 ETH | 0.02900172 | ||||
Buy Bonds | 11959572 | 1512 days ago | IN | 0 ETH | 0.04319574 | ||||
Allocate Seignio... | 11955306 | 1512 days ago | IN | 0 ETH | 0.00277825 | ||||
Allocate Seignio... | 11955177 | 1512 days ago | IN | 0 ETH | 0.00207733 | ||||
Allocate Seignio... | 11955177 | 1512 days ago | IN | 0 ETH | 0.00207733 | ||||
Allocate Seignio... | 11955177 | 1512 days ago | IN | 0 ETH | 0.01663915 | ||||
Buy Bonds | 11952302 | 1513 days ago | IN | 0 ETH | 0.02776869 | ||||
Allocate Seignio... | 11948812 | 1513 days ago | IN | 0 ETH | 0.00281173 | ||||
Allocate Seignio... | 11948680 | 1513 days ago | IN | 0 ETH | 0.00274478 | ||||
Allocate Seignio... | 11948675 | 1513 days ago | IN | 0 ETH | 0.01990879 | ||||
Allocate Seignio... | 11942362 | 1514 days ago | IN | 0 ETH | 0.00294562 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Treasury
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity ^0.6.0; import '@openzeppelin/contracts/math/Math.sol'; import '@openzeppelin/contracts/token/ERC20/IERC20.sol'; import '@openzeppelin/contracts/token/ERC20/SafeERC20.sol'; import '@openzeppelin/contracts/utils/ReentrancyGuard.sol'; import {ICurve} from './curve/Curve.sol'; import {IOracle} from './interfaces/IOracle.sol'; import {ILinkswapPriceOracle} from './interfaces/ILinkswapPriceOracle.sol'; import {IBoardroom} from './interfaces/IBoardroom.sol'; import {IBasisAsset} from './interfaces/IBasisAsset.sol'; import {ISimpleERCFund} from './interfaces/ISimpleERCFund.sol'; import {Babylonian} from './lib/Babylonian.sol'; import {FixedPoint} from './lib/FixedPoint.sol'; import {Safe112} from './lib/Safe112.sol'; import {Operator} from './owner/Operator.sol'; import {Epoch} from './utils/Epoch.sol'; import {ContractGuard} from './utils/ContractGuard.sol'; /** * @title YFL USD Treasury contract * @notice Monetary policy logic to adjust supplies of YFL USD assets * @author Tec05 */ contract Treasury is ContractGuard, Epoch { using FixedPoint for *; using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; using Safe112 for uint112; /* ========== STATE VARIABLES ========== */ // ========== FLAGS bool public migrated = false; bool public initialized = false; // ========== CORE address public weth; address public fund; address public cash; address public bond; address public share; address public curve; address public boardroom; address public bondOracle; address public seigniorageOracle; address public linkswapPriceOracle; // ========== PARAMS uint256 public cashPriceOne; uint256 public lastBondOracleEpoch = 0; uint256 public bondCap = 0; uint256 public accumulatedSeigniorage = 0; uint256 public fundAllocationRate = 2; // % /* ========== CONSTRUCTOR ========== */ constructor( address _weth, address _cash, address _bond, address _share, address _bondOracle, address _seigniorageOracle, address _linkswapPriceOracle, address _boardroom, address _fund, address _curve, uint256 _startTime ) public Epoch(1 days, _startTime, 0) { weth = _weth; cash = _cash; bond = _bond; share = _share; curve = _curve; bondOracle = _bondOracle; seigniorageOracle = _seigniorageOracle; linkswapPriceOracle = _linkswapPriceOracle; boardroom = _boardroom; fund = _fund; cashPriceOne = 10**18; } /* =================== Modifier =================== */ modifier checkMigration { require(!migrated, 'Treasury: migrated'); _; } modifier checkOperator { require( IBasisAsset(cash).operator() == address(this) && IBasisAsset(bond).operator() == address(this) && IBasisAsset(share).operator() == address(this) && Operator(boardroom).operator() == address(this), 'Treasury: need more permission' ); _; } modifier updatePrice { _; _updateCashPrice(); } /* ========== VIEW FUNCTIONS ========== */ // budget function getReserve() public view returns (uint256) { return accumulatedSeigniorage; } function circulatingSupply() public view returns (uint256) { return IERC20(cash).totalSupply().sub(accumulatedSeigniorage); } function getCeilingPrice() public view returns (uint256) { return ICurve(curve).calcCeiling(circulatingSupply()); } // oracle function getBondOraclePrice() public view returns (uint256) { return _getCashPrice(bondOracle); } function getSeigniorageOraclePrice() public view returns (uint256) { return _getCashPrice(seigniorageOracle); } function getLinkswapPriceOracleUsdPrice(address token, uint256 tokenAmount) public view returns (uint256) { return _getLinkswapPriceOracleUsdPrice(token, tokenAmount); } function _getLinkswapPriceOracleUsdPrice(address token, uint256 tokenAmount) internal view returns (uint256) { return ILinkswapPriceOracle(linkswapPriceOracle).calculateUsdAmountFromTokenAmount(token, tokenAmount); } function _getCashPrice(address oracle) internal view returns (uint256) { try IOracle(oracle).consult(cash, 1e18) returns (uint256 price) { uint256 wethUsdPrice = _getLinkswapPriceOracleUsdPrice(weth, 1e18); return price.mul(wethUsdPrice).div(1e8); // price from price oracle is 8 dp } catch { revert('Treasury: failed to consult cash price from the oracle'); } } /* ========== GOVERNANCE ========== */ // MIGRATION function initialize() public checkOperator { require(!initialized, 'Treasury: initialized'); // set accumulatedSeigniorage to it's balance accumulatedSeigniorage = IERC20(cash).balanceOf(address(this)); initialized = true; emit Initialized(msg.sender, block.number); } function migrate(address target) public onlyOperator checkOperator { require(!migrated, 'Treasury: migrated'); // cash Operator(cash).transferOperator(target); Operator(cash).transferOwnership(target); IERC20(cash).transfer(target, IERC20(cash).balanceOf(address(this))); // bond Operator(bond).transferOperator(target); Operator(bond).transferOwnership(target); IERC20(bond).transfer(target, IERC20(bond).balanceOf(address(this))); // share Operator(share).transferOperator(target); Operator(share).transferOwnership(target); IERC20(share).transfer(target, IERC20(share).balanceOf(address(this))); migrated = true; emit Migration(target); } // FUND function setFund(address newFund) public onlyOperator { address oldFund = fund; fund = newFund; emit ContributionPoolChanged(msg.sender, oldFund, newFund); } function setFundAllocationRate(uint256 newRate) public onlyOperator { uint256 oldRate = fundAllocationRate; fundAllocationRate = newRate; emit ContributionPoolRateChanged(msg.sender, oldRate, newRate); } // ORACLE function setBondOracle(address newOracle) public onlyOperator { address oldOracle = bondOracle; bondOracle = newOracle; emit BondOracleChanged(msg.sender, oldOracle, newOracle); } function setSeigniorageOracle(address newOracle) public onlyOperator { address oldOracle = seigniorageOracle; seigniorageOracle = newOracle; emit SeigniorageOracleChanged(msg.sender, oldOracle, newOracle); } function setLinkswapPriceOracle(address newOracle) public onlyOperator { address oldOracle = linkswapPriceOracle; linkswapPriceOracle = newOracle; emit LinkswapPriceOracleChanged(msg.sender, oldOracle, newOracle); } // TWEAK function setCeilingCurve(address newCurve) public onlyOperator { address oldCurve = newCurve; curve = newCurve; emit CeilingCurveChanged(msg.sender, oldCurve, newCurve); } /* ========== MUTABLE FUNCTIONS ========== */ function _updateConversionLimit(uint256 cashPrice) internal { uint256 currentEpoch = Epoch(bondOracle).getLastEpoch(); // lastest update time if (lastBondOracleEpoch != currentEpoch) { uint256 percentage = cashPriceOne.sub(cashPrice); uint256 bondSupply = IERC20(bond).totalSupply(); bondCap = circulatingSupply().mul(percentage).div(1e18); bondCap = bondCap.sub(Math.min(bondCap, bondSupply)); lastBondOracleEpoch = currentEpoch; } } function _updateCashPrice() internal { if (Epoch(bondOracle).callable()) { try IOracle(bondOracle).update() {} catch {} } if (Epoch(seigniorageOracle).callable()) { try IOracle(seigniorageOracle).update() {} catch {} } } function buyBonds(uint256 amount, uint256 targetPrice) external onlyOneBlock checkMigration checkStartTime checkOperator updatePrice { require(amount > 0, 'Treasury: cannot purchase bonds with zero amount'); uint256 cashPrice = _getCashPrice(bondOracle); require(cashPrice <= targetPrice, 'Treasury: cash price moved'); require( cashPrice < cashPriceOne, // price < $1 'Treasury: cashPrice not eligible for bond purchase' ); _updateConversionLimit(cashPrice); amount = Math.min(amount, bondCap.mul(cashPrice).div(1e18)); require(amount > 0, 'Treasury: amount exceeds bond cap'); IBasisAsset(cash).burnFrom(msg.sender, amount); IBasisAsset(bond).mint(msg.sender, amount.mul(1e18).div(cashPrice)); emit BoughtBonds(msg.sender, amount); } function redeemBonds(uint256 amount) external onlyOneBlock checkMigration checkStartTime checkOperator updatePrice { require(amount > 0, 'Treasury: cannot redeem bonds with zero amount'); uint256 cashPrice = _getCashPrice(bondOracle); require( cashPrice > getCeilingPrice(), // price > $1.05 'Treasury: cashPrice not eligible for bond purchase' ); require( IERC20(cash).balanceOf(address(this)) >= amount, 'Treasury: treasury has no more budget' ); accumulatedSeigniorage = accumulatedSeigniorage.sub( Math.min(accumulatedSeigniorage, amount) ); IBasisAsset(bond).burnFrom(msg.sender, amount); IERC20(cash).safeTransfer(msg.sender, amount); emit RedeemedBonds(msg.sender, amount); } function allocateSeigniorage() external onlyOneBlock checkMigration checkStartTime checkEpoch checkOperator { _updateCashPrice(); uint256 cashPrice = _getCashPrice(seigniorageOracle); if (cashPrice <= getCeilingPrice()) { return; // just advance epoch instead revert } // circulating supply uint256 percentage = cashPrice.sub(cashPriceOne); uint256 seigniorage = circulatingSupply().mul(percentage).div(1e18); IBasisAsset(cash).mint(address(this), seigniorage); // ======================== BIP-3 uint256 fundReserve = seigniorage.mul(fundAllocationRate).div(100); if (fundReserve > 0) { IERC20(cash).safeApprove(fund, fundReserve); ISimpleERCFund(fund).deposit( cash, fundReserve, 'Treasury: Seigniorage Allocation' ); emit ContributionPoolFunded(now, fundReserve); } seigniorage = seigniorage.sub(fundReserve); // ======================== BIP-4 uint256 treasuryReserve = Math.min( seigniorage, IERC20(bond).totalSupply().sub(accumulatedSeigniorage) ); if (treasuryReserve > 0) { if (treasuryReserve == seigniorage) { treasuryReserve = treasuryReserve.mul(80).div(100); } accumulatedSeigniorage = accumulatedSeigniorage.add( treasuryReserve ); emit TreasuryFunded(now, treasuryReserve); } // boardroom uint256 boardroomReserve = seigniorage.sub(treasuryReserve); if (boardroomReserve > 0) { IERC20(cash).safeApprove(boardroom, boardroomReserve); IBoardroom(boardroom).allocateSeigniorage(boardroomReserve); emit BoardroomFunded(now, boardroomReserve); } } /* ========== EVENTS ========== */ // GOV event Initialized(address indexed executor, uint256 at); event Migration(address indexed target); event ContributionPoolChanged( address indexed operator, address oldFund, address newFund ); event ContributionPoolRateChanged( address indexed operator, uint256 oldRate, uint256 newRate ); event BondOracleChanged( address indexed operator, address oldOracle, address newOracle ); event SeigniorageOracleChanged( address indexed operator, address oldOracle, address newOracle ); event LinkswapPriceOracleChanged( address indexed operator, address oldOracle, address newOracle ); event CeilingCurveChanged( address indexed operator, address oldCurve, address newCurve ); // CORE event RedeemedBonds(address indexed from, uint256 amount); event BoughtBonds(address indexed from, uint256 amount); event TreasuryFunded(uint256 timestamp, uint256 seigniorage); event BoardroomFunded(uint256 timestamp, uint256 seigniorage); event ContributionPoolFunded(uint256 timestamp, uint256 seigniorage); }
pragma solidity ^0.6.0; interface ICurve { function minSupply() external view returns (uint256); function maxSupply() external view returns (uint256); function minCeiling() external view returns (uint256); function maxCeiling() external view returns (uint256); function calcCeiling(uint256 _supply) external view returns (uint256); } abstract contract Curve is ICurve { /* ========== EVENTS ========== */ event MinSupplyChanged( address indexed operator, uint256 _old, uint256 _new ); event MaxSupplyChanged( address indexed operator, uint256 _old, uint256 _new ); event MinCeilingChanged( address indexed operator, uint256 _old, uint256 _new ); event MaxCeilingChanged( address indexed operator, uint256 _old, uint256 _new ); /* ========== STATE VARIABLES ========== */ uint256 public override minSupply; uint256 public override maxSupply; uint256 public override minCeiling; uint256 public override maxCeiling; /* ========== GOVERNANCE ========== */ function setMinSupply(uint256 _newMinSupply) public virtual { uint256 oldMinSupply = minSupply; minSupply = _newMinSupply; emit MinSupplyChanged(msg.sender, oldMinSupply, _newMinSupply); } function setMaxSupply(uint256 _newMaxSupply) public virtual { uint256 oldMaxSupply = maxSupply; maxSupply = _newMaxSupply; emit MaxSupplyChanged(msg.sender, oldMaxSupply, _newMaxSupply); } function setMinCeiling(uint256 _newMinCeiling) public virtual { uint256 oldMinCeiling = _newMinCeiling; minCeiling = _newMinCeiling; emit MinCeilingChanged(msg.sender, oldMinCeiling, _newMinCeiling); } function setMaxCeiling(uint256 _newMaxCeiling) public virtual { uint256 oldMaxCeiling = _newMaxCeiling; maxCeiling = _newMaxCeiling; emit MaxCeilingChanged(msg.sender, oldMaxCeiling, _newMaxCeiling); } function calcCeiling(uint256 _supply) external view virtual override returns (uint256); }
pragma solidity ^0.6.0; interface IBasisAsset { function mint(address recipient, uint256 amount) external returns (bool); function burn(uint256 amount) external; function burnFrom(address from, uint256 amount) external; function isOperator() external returns (bool); function operator() external view returns (address); }
pragma solidity ^0.6.0; interface IBoardroom { function allocateSeigniorage(uint256 amount) external; }
pragma solidity ^0.6.0; interface ILinkswapPriceOracle { function update() external; // tokenAmount is to 18 dp, usdAmount is to 8 dp // token must be LINK / WETH / YFL function calculateTokenAmountFromUsdAmount(address token, uint256 usdAmount) external view returns (uint256 tokenAmount); // token must be LINK / WETH function calculateUsdAmountFromTokenAmount(address token, uint256 tokenAmount) external view returns (uint256 usdAmount); }
pragma solidity ^0.6.0; interface IOracle { function update() external; function consult(address token, uint256 amountIn) external view returns (uint256 amountOut); // function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestamp); }
pragma solidity ^0.6.0; interface ISimpleERCFund { function deposit( address token, uint256 amount, string memory reason ) external; function withdraw( address token, uint256 amount, address to, string memory reason ) external; }
pragma solidity ^0.6.0; library Babylonian { function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } // else z = 0 } }
pragma solidity ^0.6.0; import './Babylonian.sol'; // a library for handling binary fixed point numbers (https://en.wikipedia.org/wiki/Q_(number_format)) library FixedPoint { // range: [0, 2**112 - 1] // resolution: 1 / 2**112 struct uq112x112 { uint224 _x; } // range: [0, 2**144 - 1] // resolution: 1 / 2**112 struct uq144x112 { uint256 _x; } uint8 private constant RESOLUTION = 112; uint256 private constant Q112 = uint256(1) << RESOLUTION; uint256 private constant Q224 = Q112 << RESOLUTION; // encode a uint112 as a UQ112x112 function encode(uint112 x) internal pure returns (uq112x112 memory) { return uq112x112(uint224(x) << RESOLUTION); } // encodes a uint144 as a UQ144x112 function encode144(uint144 x) internal pure returns (uq144x112 memory) { return uq144x112(uint256(x) << RESOLUTION); } // divide a UQ112x112 by a uint112, returning a UQ112x112 function div(uq112x112 memory self, uint112 x) internal pure returns (uq112x112 memory) { require(x != 0, 'FixedPoint: DIV_BY_ZERO'); return uq112x112(self._x / uint224(x)); } // multiply a UQ112x112 by a uint, returning a UQ144x112 // reverts on overflow function mul(uq112x112 memory self, uint256 y) internal pure returns (uq144x112 memory) { uint256 z; require( y == 0 || (z = uint256(self._x) * y) / y == uint256(self._x), 'FixedPoint: MULTIPLICATION_OVERFLOW' ); return uq144x112(z); } // returns a UQ112x112 which represents the ratio of the numerator to the denominator // equivalent to encode(numerator).div(denominator) function fraction(uint112 numerator, uint112 denominator) internal pure returns (uq112x112 memory) { require(denominator > 0, 'FixedPoint: DIV_BY_ZERO'); return uq112x112((uint224(numerator) << RESOLUTION) / denominator); } // decode a UQ112x112 into a uint112 by truncating after the radix point function decode(uq112x112 memory self) internal pure returns (uint112) { return uint112(self._x >> RESOLUTION); } // decode a UQ144x112 into a uint144 by truncating after the radix point function decode144(uq144x112 memory self) internal pure returns (uint144) { return uint144(self._x >> RESOLUTION); } // take the reciprocal of a UQ112x112 function reciprocal(uq112x112 memory self) internal pure returns (uq112x112 memory) { require(self._x != 0, 'FixedPoint: ZERO_RECIPROCAL'); return uq112x112(uint224(Q224 / self._x)); } // square root of a UQ112x112 function sqrt(uq112x112 memory self) internal pure returns (uq112x112 memory) { return uq112x112(uint224(Babylonian.sqrt(uint256(self._x)) << 56)); } }
pragma solidity ^0.6.0; library Safe112 { function add(uint112 a, uint112 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'Safe112: addition overflow'); return c; } function sub(uint112 a, uint112 b) internal pure returns (uint256) { return sub(a, b, 'Safe112: subtraction overflow'); } function sub( uint112 a, uint112 b, string memory errorMessage ) internal pure returns (uint112) { require(b <= a, errorMessage); uint112 c = a - b; return c; } function mul(uint112 a, uint112 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'Safe112: multiplication overflow'); return c; } function div(uint112 a, uint112 b) internal pure returns (uint256) { return div(a, b, 'Safe112: division by zero'); } function div( uint112 a, uint112 b, string memory errorMessage ) internal pure returns (uint112) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint112 c = a / b; return c; } function mod(uint112 a, uint112 b) internal pure returns (uint256) { return mod(a, b, 'Safe112: modulo by zero'); } function mod( uint112 a, uint112 b, string memory errorMessage ) internal pure returns (uint112) { require(b != 0, errorMessage); return a % b; } }
pragma solidity ^0.6.0; import '@openzeppelin/contracts/GSN/Context.sol'; import '@openzeppelin/contracts/access/Ownable.sol'; contract Operator is Context, Ownable { address private _operator; event OperatorTransferred( address indexed previousOperator, address indexed newOperator ); constructor() internal { _operator = _msgSender(); emit OperatorTransferred(address(0), _operator); } function operator() public view returns (address) { return _operator; } modifier onlyOperator() { require( _operator == msg.sender, 'operator: caller is not the operator' ); _; } function isOperator() public view returns (bool) { return _msgSender() == _operator; } function transferOperator(address newOperator_) public onlyOwner { _transferOperator(newOperator_); } function _transferOperator(address newOperator_) internal { require( newOperator_ != address(0), 'operator: zero address given for new operator' ); emit OperatorTransferred(address(0), newOperator_); _operator = newOperator_; } }
pragma solidity ^0.6.0; contract ContractGuard { mapping(uint256 => mapping(address => bool)) private _status; function checkSameOriginReentranted() internal view returns (bool) { return _status[block.number][tx.origin]; } function checkSameSenderReentranted() internal view returns (bool) { return _status[block.number][msg.sender]; } modifier onlyOneBlock() { require( !checkSameOriginReentranted(), 'ContractGuard: one block, one function' ); require( !checkSameSenderReentranted(), 'ContractGuard: one block, one function' ); _; _status[block.number][tx.origin] = true; _status[block.number][msg.sender] = true; } }
pragma solidity ^0.6.0; import '@openzeppelin/contracts/math/Math.sol'; import '@openzeppelin/contracts/math/SafeMath.sol'; import '../owner/Operator.sol'; contract Epoch is Operator { using SafeMath for uint256; uint256 private period; uint256 private startTime; uint256 private lastExecutedAt; /* ========== CONSTRUCTOR ========== */ constructor( uint256 _period, uint256 _startTime, uint256 _startEpoch ) public { require(_startTime > block.timestamp, 'Epoch: invalid start time'); period = _period; startTime = _startTime; lastExecutedAt = startTime.add(_startEpoch.mul(period)); } /* ========== Modifier ========== */ modifier checkStartTime { require(now >= startTime, 'Epoch: not started yet'); _; } modifier checkEpoch { require(now > startTime, 'Epoch: not started yet'); require(callable(), 'Epoch: not allowed'); _; lastExecutedAt = block.timestamp; } /* ========== VIEW FUNCTIONS ========== */ function callable() public view returns (bool) { return getCurrentEpoch() >= getNextEpoch(); } // epoch function getLastEpoch() public view returns (uint256) { return lastExecutedAt.sub(startTime).div(period); } function getCurrentEpoch() public view returns (uint256) { return Math.max(startTime, block.timestamp).sub(startTime).div(period); } function getNextEpoch() public view returns (uint256) { if (startTime == lastExecutedAt) { return getLastEpoch(); } return getLastEpoch().add(1); } function nextEpochPoint() public view returns (uint256) { return startTime.add(getNextEpoch().mul(period)); } // params function getPeriod() public view returns (uint256) { return period; } function getStartTime() public view returns (uint256) { return startTime; } /* ========== GOVERNANCE ========== */ function setPeriod(uint256 _period) external onlyOperator { period = _period; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "../GSN/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "./IERC20.sol"; import "../../math/SafeMath.sol"; import "../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "istanbul", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_cash","type":"address"},{"internalType":"address","name":"_bond","type":"address"},{"internalType":"address","name":"_share","type":"address"},{"internalType":"address","name":"_bondOracle","type":"address"},{"internalType":"address","name":"_seigniorageOracle","type":"address"},{"internalType":"address","name":"_linkswapPriceOracle","type":"address"},{"internalType":"address","name":"_boardroom","type":"address"},{"internalType":"address","name":"_fund","type":"address"},{"internalType":"address","name":"_curve","type":"address"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"BoardroomFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"oldOracle","type":"address"},{"indexed":false,"internalType":"address","name":"newOracle","type":"address"}],"name":"BondOracleChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BoughtBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"oldCurve","type":"address"},{"indexed":false,"internalType":"address","name":"newCurve","type":"address"}],"name":"CeilingCurveChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"oldFund","type":"address"},{"indexed":false,"internalType":"address","name":"newFund","type":"address"}],"name":"ContributionPoolChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"ContributionPoolFunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldRate","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"ContributionPoolRateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"executor","type":"address"},{"indexed":false,"internalType":"uint256","name":"at","type":"uint256"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"oldOracle","type":"address"},{"indexed":false,"internalType":"address","name":"newOracle","type":"address"}],"name":"LinkswapPriceOracleChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"}],"name":"Migration","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"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":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RedeemedBonds","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"oldOracle","type":"address"},{"indexed":false,"internalType":"address","name":"newOracle","type":"address"}],"name":"SeigniorageOracleChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"seigniorage","type":"uint256"}],"name":"TreasuryFunded","type":"event"},{"inputs":[],"name":"accumulatedSeigniorage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allocateSeigniorage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"boardroom","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bond","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bondOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"targetPrice","type":"uint256"}],"name":"buyBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"callable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cash","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cashPriceOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"curve","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fundAllocationRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBondOraclePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCeilingPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"getLinkswapPriceOracleUsdPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSeigniorageOraclePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastBondOracleEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"linkswapPriceOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextEpochPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"redeemBonds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seigniorageOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOracle","type":"address"}],"name":"setBondOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCurve","type":"address"}],"name":"setCeilingCurve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFund","type":"address"}],"name":"setFund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"setFundAllocationRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOracle","type":"address"}],"name":"setLinkswapPriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOracle","type":"address"}],"name":"setSeigniorageOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"share","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526006805461ffff1916905560006011819055601281905560135560026014553480156200003057600080fd5b50604051620040da380380620040da83398181016040526101608110156200005757600080fd5b508051602082015160408301516060840151608085015160a086015160c087015160e08801516101008901516101208a0151610140909a0151989997989697959694959394929391929091906201518081600080620000b5620002bd565b600180546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200010d620002bd565b600280546001600160a01b0319166001600160a01b0392831617908190556040519116906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3428211620001ae576040805162461bcd60e51b815260206004820152601960248201527f45706f63683a20696e76616c69642073746172742074696d6500000000000000604482015290519081900360640190fd5b60038390556004829055620001eb620001d48285620002c1602090811b62002f3a17901c565b6004546200032860201b62002f931790919060201c565b60055550506006805462010000600160b01b031916620100006001600160a01b039e8f16021790555050600880546001600160a01b03199081169a8c169a909a179055600980548a16988b1698909817909755600a80548916968a1696909617909555600b8054881696891696909617909555600d8054871693881693909317909255600e80548616918716919091179055600f80548516918616919091179055600c8054841692851692909217909155600780549092169216919091179055670de0b6b3a764000060105562000383565b3390565b600082620002d25750600062000322565b82820282848281620002e057fe5b04146200031f5760405162461bcd60e51b8152600401808060200182810382526021815260200180620040b96021913960400191505060405180910390fd5b90505b92915050565b6000828201838110156200031f576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b613d2680620003936000396000f3fe608060405234801561001057600080fd5b50600436106102a05760003560e01c8063724ababc11610167578063b8e2cf8e116100ce578063c828371e11610087578063c828371e14610538578063ce5494bb14610540578063e06e9c6514610566578063e189ce141461058c578063efe97d05146105a9578063f2fde38b146105b1576102a0565b8063b8e2cf8e146104ea578063b97dd9e2146104f2578063c1a29772146104fa578063c1aa390014610502578063c4020ca21461050a578063c5967c2614610530576102a0565b806395b1828a1161012057806395b1828a146104a5578063961be391146104c2578063a871694f146104ca578063a8d5fd65146104d2578063a9cfc46e146104da578063b60d4288146104e2576102a0565b8063724ababc146104335780638129fc1c1461045f5780638da5cb5b146104675780638f7cd8c21461046f5780639358928b1461049557806394ab01621461049d576102a0565b80634456eda21161020b5780635e02c51e116101c45780635e02c51e1461040357806364c9ec6f1461040b5780636a2ab602146104135780636d19921d1461041b578063715018a6146104235780637165485d1461042b576102a0565b80634456eda2146103b85780634c359b49146103c057806354f04a11146103c8578063570ca735146103eb57806359bf5d39146103f35780635b756179146103fb576102a0565b806327aef8221161025d57806327aef8221461036a57806329605e77146103725780632c678c6414610398578063398bac63146103a05780633fc8cef3146103a85780634140a63f146103b0576102a0565b80630e21750f146102a55780630f3a9f65146102cd578063132eeaa7146102ea578063158ef93e1461030e5780631ed1010a1461032a5780631ed2419514610350575b600080fd5b6102cb600480360360208110156102bb57600080fd5b50356001600160a01b03166105d7565b005b6102cb600480360360208110156102e357600080fd5b5035610682565b6102f26106d0565b604080516001600160a01b039092168252519081900360200190f35b6103166106df565b604080519115158252519081900360200190f35b6102cb6004803603602081101561034057600080fd5b50356001600160a01b03166106ed565b610358610796565b60408051918252519081900360200190f35b61035861079d565b6102cb6004803603602081101561038857600080fd5b50356001600160a01b03166107a3565b610316610819565b610358610822565b6102f261084c565b6102f2610861565b610316610870565b610358610896565b6102cb600480360360408110156103de57600080fd5b5080359060200135610917565b6102f2610f60565b610358610f6f565b6102cb610f75565b6102f26117a4565b6102f26117b3565b6103166117c2565b6102f26117db565b6102cb6117ea565b6102f261189e565b6103586004803603604081101561044957600080fd5b506001600160a01b0381351690602001356118ad565b6102cb6118c2565b6102f2611c17565b6102cb6004803603602081101561048557600080fd5b50356001600160a01b0316611c26565b610358611cd1565b610358611d27565b6102cb600480360360208110156104bb57600080fd5b5035611d2d565b6102f2611dbc565b610358611dcb565b6102f2611dd1565b610358611de0565b6102f2611de6565b610358611df5565b610358611e0d565b610358611e2d565b610358611e45565b6102cb6004803603602081101561052057600080fd5b50356001600160a01b0316611e4b565b610358611ef6565b610358611f12565b6102cb6004803603602081101561055657600080fd5b50356001600160a01b0316611f18565b6102cb6004803603602081101561057c57600080fd5b50356001600160a01b0316612786565b6102cb600480360360208110156105a257600080fd5b5035612831565b610358612dff565b6102cb600480360360208110156105c757600080fd5b50356001600160a01b0316612e2f565b6002546001600160a01b031633146106205760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b600780546001600160a01b038381166001600160a01b03198316811790935560408051919092168082526020820193909352815133927fa10cd50e390804229d0e9687c2fd0f4e5257229e7e59316ad26097b92fcf531b928290030190a25050565b6002546001600160a01b031633146106cb5760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b600355565b600e546001600160a01b031681565b600654610100900460ff1681565b6002546001600160a01b031633146107365760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b600b80546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092528051839233927f0c3b8dd6dcdb1124b1462422d9266e323787d01a814009a5d35cf16741b87bd692918290030190a25050565b6003545b90565b60135481565b6107ab612fed565b6001546001600160a01b0390811691161461080d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61081681612ff1565b50565b60065460ff1681565b600061084760035461084160045460055461308e90919063ffffffff16565b906130d0565b905090565b6006546201000090046001600160a01b031681565b600f546001600160a01b031681565b6002546000906001600160a01b0316610887612fed565b6001600160a01b031614905090565b600b546000906001600160a01b031663292f1f1c6108b2611cd1565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156108e657600080fd5b505afa1580156108fa573d6000803e3d6000fd5b505050506040513d602081101561091057600080fd5b5051905090565b61091f613112565b1561095b5760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b610963613131565b1561099f5760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b60065460ff16156109ec576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600454421015610a3c576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b6008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610a8057600080fd5b505afa158015610a94573d6000803e3d6000fd5b505050506040513d6020811015610aaa57600080fd5b50516001600160a01b0316148015610b3857506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610b0157600080fd5b505afa158015610b15573d6000803e3d6000fd5b505050506040513d6020811015610b2b57600080fd5b50516001600160a01b0316145b8015610bba5750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610b8357600080fd5b505afa158015610b97573d6000803e3d6000fd5b505050506040513d6020811015610bad57600080fd5b50516001600160a01b0316145b8015610c3c5750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610c0557600080fd5b505afa158015610c19573d6000803e3d6000fd5b505050506040513d6020811015610c2f57600080fd5b50516001600160a01b0316145b610c7b576040805162461bcd60e51b815260206004820152601e6024820152600080516020613bf7833981519152604482015290519081900360640190fd5b60008211610cba5760405162461bcd60e51b8152600401808060200182810382526030815260200180613c176030913960400191505060405180910390fd5b600d54600090610cd2906001600160a01b0316613150565b905081811115610d29576040805162461bcd60e51b815260206004820152601a60248201527f54726561737572793a2063617368207072696365206d6f766564000000000000604482015290519081900360640190fd5b6010548110610d695760405162461bcd60e51b8152600401808060200182810382526032815260200180613afb6032913960400191505060405180910390fd5b610d728161324f565b610d9c83610d97670de0b6b3a764000061084185601254612f3a90919063ffffffff16565b61339f565b925060008311610ddd5760405162461bcd60e51b8152600401808060200182810382526021815260200180613b2d6021913960400191505060405180910390fd5b6008546040805163079cc67960e41b81523360048201526024810186905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b158015610e3057600080fd5b505af1158015610e44573d6000803e3d6000fd5b50506009546001600160a01b031691506340c10f19905033610e728461084188670de0b6b3a7640000612f3a565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610eb857600080fd5b505af1158015610ecc573d6000803e3d6000fd5b505050506040513d6020811015610ee257600080fd5b505060408051848152905133917fdbf5270c3cf4729fec4fdac76fda864aa4f3d14d657ad21772ac28f627141ed9919081900360200190a250610f236133b5565b5050436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b6002546001600160a01b031690565b60135490565b610f7d613112565b15610fb95760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b610fc1613131565b15610ffd5760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b60065460ff161561104a576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b60045442101561109a576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b60045442116110e9576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b6110f16117c2565b611137576040805162461bcd60e51b8152602060048201526012602482015271115c1bd8da0e881b9bdd08185b1b1bddd95960721b604482015290519081900360640190fd5b6008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561117b57600080fd5b505afa15801561118f573d6000803e3d6000fd5b505050506040513d60208110156111a557600080fd5b50516001600160a01b031614801561123357506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156111fc57600080fd5b505afa158015611210573d6000803e3d6000fd5b505050506040513d602081101561122657600080fd5b50516001600160a01b0316145b80156112b55750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561127e57600080fd5b505afa158015611292573d6000803e3d6000fd5b505050506040513d60208110156112a857600080fd5b50516001600160a01b0316145b80156113375750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561130057600080fd5b505afa158015611314573d6000803e3d6000fd5b505050506040513d602081101561132a57600080fd5b50516001600160a01b0316145b611376576040805162461bcd60e51b815260206004820152601e6024820152600080516020613bf7833981519152604482015290519081900360640190fd5b61137e6133b5565b600e54600090611396906001600160a01b0316613150565b90506113a0610896565b81116113ac5750611765565b60006113c36010548361308e90919063ffffffff16565b905060006113e5670de0b6b3a7640000610841846113df611cd1565b90612f3a565b600854604080516340c10f1960e01b81523060048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b15801561143c57600080fd5b505af1158015611450573d6000803e3d6000fd5b505050506040513d602081101561146657600080fd5b505060145460009061148090606490610841908590612f3a565b90508015611585576007546008546114a5916001600160a01b03918216911683613577565b60075460085460408051635ff03ed360e11b81526001600160a01b0392831660048201526024810185905260606044820152602060648201527f54726561737572793a20536569676e696f7261676520416c6c6f636174696f6e60848201529051919092169163bfe07da69160a480830192600092919082900301818387803b15801561153157600080fd5b505af1158015611545573d6000803e3d6000fd5b5050604080514281526020810185905281517f4caa64211297e9263667fef70732dc65ca7a8e8c60dc72539ed94518628212d09450908190039091019150a15b61158f828261308e565b9150600061161d83610d97601354600960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115eb57600080fd5b505afa1580156115ff573d6000803e3d6000fd5b505050506040513d602081101561161557600080fd5b50519061308e565b9050801561168c57828114156116405761163d6064610841836050612f3a565b90505b60135461164d9082612f93565b601355604080514281526020810183905281517ff705142bf09f04297640495ddf7c59b7fd6f51894c5aea9602d631cf05f0efc2929181900390910190a15b6000611698848361308e565b9050801561175e57600c546008546116bd916001600160a01b03918216911683613577565b600c54604080516397ffe1d760e01b81526004810184905290516001600160a01b03909216916397ffe1d79160248082019260009290919082900301818387803b15801561170a57600080fd5b505af115801561171e573d6000803e3d6000fd5b5050604080514281526020810185905281517f03ca7276ab7799bf73fb79d27ff0610cd7049574f2508ef8445162833d439aea9450908190039091019150a15b5050505050505b42600555436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b600c546001600160a01b031681565b6009546001600160a01b031681565b60006117cc612dff565b6117d4611e0d565b1015905090565b600d546001600160a01b031681565b6117f2612fed565b6001546001600160a01b03908116911614611854576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b600b546001600160a01b031681565b60006118b9838361368f565b90505b92915050565b6008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561190657600080fd5b505afa15801561191a573d6000803e3d6000fd5b505050506040513d602081101561193057600080fd5b50516001600160a01b03161480156119be57506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561198757600080fd5b505afa15801561199b573d6000803e3d6000fd5b505050506040513d60208110156119b157600080fd5b50516001600160a01b0316145b8015611a405750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611a0957600080fd5b505afa158015611a1d573d6000803e3d6000fd5b505050506040513d6020811015611a3357600080fd5b50516001600160a01b0316145b8015611ac25750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611a8b57600080fd5b505afa158015611a9f573d6000803e3d6000fd5b505050506040513d6020811015611ab557600080fd5b50516001600160a01b0316145b611b01576040805162461bcd60e51b815260206004820152601e6024820152600080516020613bf7833981519152604482015290519081900360640190fd5b600654610100900460ff1615611b56576040805162461bcd60e51b8152602060048201526015602482015274151c99585cdd5c9e4e881a5b9a5d1a585b1a5e9959605a1b604482015290519081900360640190fd5b600854604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611ba157600080fd5b505afa158015611bb5573d6000803e3d6000fd5b505050506040513d6020811015611bcb57600080fd5b50516013556006805461ff00191661010017905560408051438152905133917f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce79919081900360200190a2565b6001546001600160a01b031690565b6002546001600160a01b03163314611c6f5760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b600f80546001600160a01b038381166001600160a01b03198316811790935560408051919092168082526020820193909352815133927f43f047f21959179437396e88f99d217b53dd299cf67901616bc6ebffb602afdc928290030190a25050565b6000610847601354600860009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115eb57600080fd5b60125481565b6002546001600160a01b03163314611d765760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b60148054908290556040805182815260208101849052815133927fe14a4b2db56e384a354fe79614355263a5b44513757cdbd7595802b447318961928290030190a25050565b6008546001600160a01b031681565b60115481565b600a546001600160a01b031681565b60105481565b6007546001600160a01b031681565b600e54600090610847906001600160a01b0316613150565b6000610847600354610841600454611e276004544261371a565b9061308e565b600d54600090610847906001600160a01b0316613150565b60145481565b6002546001600160a01b03163314611e945760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b600e80546001600160a01b038381166001600160a01b03198316811790935560408051919092168082526020820193909352815133927f4c420de9ce56e7d1cb19d1be595af322a8a25d82f2e8116dbb1290b995b99056928290030190a25050565b6000610847611f096003546113df612dff565b60045490612f93565b60045490565b6002546001600160a01b03163314611f615760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b6008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611fa557600080fd5b505afa158015611fb9573d6000803e3d6000fd5b505050506040513d6020811015611fcf57600080fd5b50516001600160a01b031614801561205d57506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561202657600080fd5b505afa15801561203a573d6000803e3d6000fd5b505050506040513d602081101561205057600080fd5b50516001600160a01b0316145b80156120df5750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156120a857600080fd5b505afa1580156120bc573d6000803e3d6000fd5b505050506040513d60208110156120d257600080fd5b50516001600160a01b0316145b80156121615750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561212a57600080fd5b505afa15801561213e573d6000803e3d6000fd5b505050506040513d602081101561215457600080fd5b50516001600160a01b0316145b6121a0576040805162461bcd60e51b815260206004820152601e6024820152600080516020613bf7833981519152604482015290519081900360640190fd5b60065460ff16156121ed576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600854604080516329605e7760e01b81526001600160a01b038481166004830152915191909216916329605e7791602480830192600092919082900301818387803b15801561223b57600080fd5b505af115801561224f573d6000803e3d6000fd5b50506008546040805163f2fde38b60e01b81526001600160a01b038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b1580156122a157600080fd5b505af11580156122b5573d6000803e3d6000fd5b5050600854604080516370a0823160e01b815230600482015290516001600160a01b03909216935063a9059cbb9250849184916370a08231916024808301926020929190829003018186803b15801561230d57600080fd5b505afa158015612321573d6000803e3d6000fd5b505050506040513d602081101561233757600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561238857600080fd5b505af115801561239c573d6000803e3d6000fd5b505050506040513d60208110156123b257600080fd5b5050600954604080516329605e7760e01b81526001600160a01b038481166004830152915191909216916329605e7791602480830192600092919082900301818387803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b50506009546040805163f2fde38b60e01b81526001600160a01b038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b15801561246857600080fd5b505af115801561247c573d6000803e3d6000fd5b5050600954604080516370a0823160e01b815230600482015290516001600160a01b03909216935063a9059cbb9250849184916370a08231916024808301926020929190829003018186803b1580156124d457600080fd5b505afa1580156124e8573d6000803e3d6000fd5b505050506040513d60208110156124fe57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561254f57600080fd5b505af1158015612563573d6000803e3d6000fd5b505050506040513d602081101561257957600080fd5b5050600a54604080516329605e7760e01b81526001600160a01b038481166004830152915191909216916329605e7791602480830192600092919082900301818387803b1580156125c957600080fd5b505af11580156125dd573d6000803e3d6000fd5b5050600a546040805163f2fde38b60e01b81526001600160a01b038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b15801561262f57600080fd5b505af1158015612643573d6000803e3d6000fd5b5050600a54604080516370a0823160e01b815230600482015290516001600160a01b03909216935063a9059cbb9250849184916370a08231916024808301926020929190829003018186803b15801561269b57600080fd5b505afa1580156126af573d6000803e3d6000fd5b505050506040513d60208110156126c557600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561271657600080fd5b505af115801561272a573d6000803e3d6000fd5b505050506040513d602081101561274057600080fd5b50506006805460ff191660011790556040516001600160a01b038216907f0caca70b66aed56b0630989a049110023c5a3f37e0ea4b6ce96fc747663f3ebc90600090a250565b6002546001600160a01b031633146127cf5760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b600d80546001600160a01b038381166001600160a01b03198316811790935560408051919092168082526020820193909352815133927fcafe5bd353cebaf68e66afe57f24a25988157e8bb99f4233603eec0ab74a5f01928290030190a25050565b612839613112565b156128755760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b61287d613131565b156128b95760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b60065460ff1615612906576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600454421015612956576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b6008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561299a57600080fd5b505afa1580156129ae573d6000803e3d6000fd5b505050506040513d60208110156129c457600080fd5b50516001600160a01b0316148015612a5257506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612a1b57600080fd5b505afa158015612a2f573d6000803e3d6000fd5b505050506040513d6020811015612a4557600080fd5b50516001600160a01b0316145b8015612ad45750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612a9d57600080fd5b505afa158015612ab1573d6000803e3d6000fd5b505050506040513d6020811015612ac757600080fd5b50516001600160a01b0316145b8015612b565750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612b1f57600080fd5b505afa158015612b33573d6000803e3d6000fd5b505050506040513d6020811015612b4957600080fd5b50516001600160a01b0316145b612b95576040805162461bcd60e51b815260206004820152601e6024820152600080516020613bf7833981519152604482015290519081900360640190fd5b60008111612bd45760405162461bcd60e51b815260040180806020018281038252602e815260200180613acd602e913960400191505060405180910390fd5b600d54600090612bec906001600160a01b0316613150565b9050612bf6610896565b8111612c335760405162461bcd60e51b8152600401808060200182810382526032815260200180613afb6032913960400191505060405180910390fd5b600854604080516370a0823160e01b8152306004820152905184926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612c7d57600080fd5b505afa158015612c91573d6000803e3d6000fd5b505050506040513d6020811015612ca757600080fd5b50511015612ce65760405162461bcd60e51b8152600401808060200182810382526025815260200180613b7b6025913960400191505060405180910390fd5b612cfe612cf56013548461339f565b6013549061308e565b6013556009546040805163079cc67960e41b81523360048201526024810185905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b158015612d5457600080fd5b505af1158015612d68573d6000803e3d6000fd5b5050600854612d8492506001600160a01b03169050338461372a565b60408051838152905133917f9c3478f12dce08d85673d802af16ed5b9ebab8420ffd7b145d65d3157084b2ce919081900360200190a250612dc36133b5565b50436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b60006005546004541415612e1c57612e15610822565b905061079a565b6108476001612e29610822565b90612f93565b612e37612fed565b6001546001600160a01b03908116911614612e99576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116612ede5760405162461bcd60e51b8152600401808060200182810382526026815260200180613aa76026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600082612f49575060006118bc565b82820282848281612f5657fe5b04146118b95760405162461bcd60e51b8152600401808060200182810382526021815260200180613ba06021913960400191505060405180910390fd5b6000828201838110156118b9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0381166130365760405162461bcd60e51b815260040180806020018281038252602d815260200180613b4e602d913960400191505060405180910390fd5b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b60006118b983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061377c565b60006118b983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613813565b4360009081526020818152604080832032845290915290205460ff1690565b4360009081526020818152604080832033845290915290205460ff1690565b60085460408051633ddac95360e01b81526001600160a01b039283166004820152670de0b6b3a764000060248201529051600092841691633ddac953916044808301926020929190829003018186803b1580156131ac57600080fd5b505afa9250505080156131d157506040513d60208110156131cc57600080fd5b505160015b61320c5760405162461bcd60e51b8152600401808060200182810382526036815260200180613bc16036913960400191505060405180910390fd5b600654600090613233906201000090046001600160a01b0316670de0b6b3a764000061368f565b90506132476305f5e1006108418484612f3a565b949350505050565b600d546040805163398bac6360e01b815290516000926001600160a01b03169163398bac63916004808301926020929190829003018186803b15801561329457600080fd5b505afa1580156132a8573d6000803e3d6000fd5b505050506040513d60208110156132be57600080fd5b5051601154909150811461339b576010546000906132dc908461308e565b90506000600960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561332e57600080fd5b505afa158015613342573d6000803e3d6000fd5b505050506040513d602081101561335857600080fd5b50519050613374670de0b6b3a7640000610841846113df611cd1565b601281905561339090613387908361339f565b6012549061308e565b601255505060118190555b5050565b60008183106133ae57816118b9565b5090919050565b600d60009054906101000a90046001600160a01b03166001600160a01b0316636a2ab6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561340357600080fd5b505afa158015613417573d6000803e3d6000fd5b505050506040513d602081101561342d57600080fd5b50511561349757600d60009054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561348457600080fd5b505af1925050508015613495575060015b505b600e60009054906101000a90046001600160a01b03166001600160a01b0316636a2ab6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156134e557600080fd5b505afa1580156134f9573d6000803e3d6000fd5b505050506040513d602081101561350f57600080fd5b50511561357557600e60009054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561356657600080fd5b505af192505050801561081657505b565b8015806135fd575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156135cf57600080fd5b505afa1580156135e3573d6000803e3d6000fd5b505050506040513d60208110156135f957600080fd5b5051155b6136385760405162461bcd60e51b8152600401808060200182810382526036815260200180613cbb6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261368a908490613878565b505050565b600f546040805163750c450d60e01b81526001600160a01b038581166004830152602482018590529151600093929092169163750c450d91604480820192602092909190829003018186803b1580156136e757600080fd5b505afa1580156136fb573d6000803e3d6000fd5b505050506040513d602081101561371157600080fd5b50519392505050565b6000818310156133ae57816118b9565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261368a908490613878565b6000818484111561380b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137d05781810151838201526020016137b8565b50505050905090810190601f1680156137fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836138625760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156137d05781810151838201526020016137b8565b50600083858161386e57fe5b0495945050505050565b60606138cd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139299092919063ffffffff16565b80519091501561368a578080602001905160208110156138ec57600080fd5b505161368a5760405162461bcd60e51b815260040180806020018281038252602a815260200180613c6b602a913960400191505060405180910390fd5b60606132478484600085606061393e85613aa0565b61398f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106139ce5780518252601f1990920191602091820191016139af565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613a30576040519150601f19603f3d011682016040523d82523d6000602084013e613a35565b606091505b50915091508115613a495791506132479050565b805115613a595780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156137d05781810151838201526020016137b8565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737354726561737572793a2063616e6e6f742072656465656d20626f6e64732077697468207a65726f20616d6f756e7454726561737572793a20636173685072696365206e6f7420656c696769626c6520666f7220626f6e6420707572636861736554726561737572793a20616d6f756e74206578636565647320626f6e64206361706f70657261746f723a207a65726f206164647265737320676976656e20666f72206e6577206f70657261746f7254726561737572793a20747265617375727920686173206e6f206d6f726520627564676574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7754726561737572793a206661696c656420746f20636f6e73756c7420636173682070726963652066726f6d20746865206f7261636c6554726561737572793a206e656564206d6f7265207065726d697373696f6e000054726561737572793a2063616e6e6f7420707572636861736520626f6e64732077697468207a65726f20616d6f756e746f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657261746f725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756e6374696f6e5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212206c1f99e07dfe15f3a928ddf659f4ac0b0e645cccb8540a808b94dbf507b9415964736f6c634300060c0033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000007b760d06e401f85545f3b50c44bf5b05308b7b62000000000000000000000000008377eb0c62ce8e0ba3d7bb4a5638591f21588e0000000000000000000000008282df223ac402d04b2097d16f758af4f70e7db000000000000000000000000092e5d50c976dddeae99c20baf4476d2f2e8ba69b0000000000000000000000002f96a891d69f0a1d3a476f238a4d7937a052e751000000000000000000000000dfa5e7989c98446ffea622266e18df563e85987200000000000000000000000079683f800e21d5e5771cde30b221f520ea60d1d6000000000000000000000000ab27ae965bc8e268c617113fdfdbaa169501d6a1000000000000000000000000dcbc41676a4162335579abcdc55a1d31c87ff37200000000000000000000000000000000000000000000000000000000601ddc00
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102a05760003560e01c8063724ababc11610167578063b8e2cf8e116100ce578063c828371e11610087578063c828371e14610538578063ce5494bb14610540578063e06e9c6514610566578063e189ce141461058c578063efe97d05146105a9578063f2fde38b146105b1576102a0565b8063b8e2cf8e146104ea578063b97dd9e2146104f2578063c1a29772146104fa578063c1aa390014610502578063c4020ca21461050a578063c5967c2614610530576102a0565b806395b1828a1161012057806395b1828a146104a5578063961be391146104c2578063a871694f146104ca578063a8d5fd65146104d2578063a9cfc46e146104da578063b60d4288146104e2576102a0565b8063724ababc146104335780638129fc1c1461045f5780638da5cb5b146104675780638f7cd8c21461046f5780639358928b1461049557806394ab01621461049d576102a0565b80634456eda21161020b5780635e02c51e116101c45780635e02c51e1461040357806364c9ec6f1461040b5780636a2ab602146104135780636d19921d1461041b578063715018a6146104235780637165485d1461042b576102a0565b80634456eda2146103b85780634c359b49146103c057806354f04a11146103c8578063570ca735146103eb57806359bf5d39146103f35780635b756179146103fb576102a0565b806327aef8221161025d57806327aef8221461036a57806329605e77146103725780632c678c6414610398578063398bac63146103a05780633fc8cef3146103a85780634140a63f146103b0576102a0565b80630e21750f146102a55780630f3a9f65146102cd578063132eeaa7146102ea578063158ef93e1461030e5780631ed1010a1461032a5780631ed2419514610350575b600080fd5b6102cb600480360360208110156102bb57600080fd5b50356001600160a01b03166105d7565b005b6102cb600480360360208110156102e357600080fd5b5035610682565b6102f26106d0565b604080516001600160a01b039092168252519081900360200190f35b6103166106df565b604080519115158252519081900360200190f35b6102cb6004803603602081101561034057600080fd5b50356001600160a01b03166106ed565b610358610796565b60408051918252519081900360200190f35b61035861079d565b6102cb6004803603602081101561038857600080fd5b50356001600160a01b03166107a3565b610316610819565b610358610822565b6102f261084c565b6102f2610861565b610316610870565b610358610896565b6102cb600480360360408110156103de57600080fd5b5080359060200135610917565b6102f2610f60565b610358610f6f565b6102cb610f75565b6102f26117a4565b6102f26117b3565b6103166117c2565b6102f26117db565b6102cb6117ea565b6102f261189e565b6103586004803603604081101561044957600080fd5b506001600160a01b0381351690602001356118ad565b6102cb6118c2565b6102f2611c17565b6102cb6004803603602081101561048557600080fd5b50356001600160a01b0316611c26565b610358611cd1565b610358611d27565b6102cb600480360360208110156104bb57600080fd5b5035611d2d565b6102f2611dbc565b610358611dcb565b6102f2611dd1565b610358611de0565b6102f2611de6565b610358611df5565b610358611e0d565b610358611e2d565b610358611e45565b6102cb6004803603602081101561052057600080fd5b50356001600160a01b0316611e4b565b610358611ef6565b610358611f12565b6102cb6004803603602081101561055657600080fd5b50356001600160a01b0316611f18565b6102cb6004803603602081101561057c57600080fd5b50356001600160a01b0316612786565b6102cb600480360360208110156105a257600080fd5b5035612831565b610358612dff565b6102cb600480360360208110156105c757600080fd5b50356001600160a01b0316612e2f565b6002546001600160a01b031633146106205760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b600780546001600160a01b038381166001600160a01b03198316811790935560408051919092168082526020820193909352815133927fa10cd50e390804229d0e9687c2fd0f4e5257229e7e59316ad26097b92fcf531b928290030190a25050565b6002546001600160a01b031633146106cb5760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b600355565b600e546001600160a01b031681565b600654610100900460ff1681565b6002546001600160a01b031633146107365760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b600b80546001600160a01b0319166001600160a01b0383169081179091556040805182815260208101929092528051839233927f0c3b8dd6dcdb1124b1462422d9266e323787d01a814009a5d35cf16741b87bd692918290030190a25050565b6003545b90565b60135481565b6107ab612fed565b6001546001600160a01b0390811691161461080d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61081681612ff1565b50565b60065460ff1681565b600061084760035461084160045460055461308e90919063ffffffff16565b906130d0565b905090565b6006546201000090046001600160a01b031681565b600f546001600160a01b031681565b6002546000906001600160a01b0316610887612fed565b6001600160a01b031614905090565b600b546000906001600160a01b031663292f1f1c6108b2611cd1565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156108e657600080fd5b505afa1580156108fa573d6000803e3d6000fd5b505050506040513d602081101561091057600080fd5b5051905090565b61091f613112565b1561095b5760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b610963613131565b1561099f5760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b60065460ff16156109ec576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600454421015610a3c576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b6008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610a8057600080fd5b505afa158015610a94573d6000803e3d6000fd5b505050506040513d6020811015610aaa57600080fd5b50516001600160a01b0316148015610b3857506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610b0157600080fd5b505afa158015610b15573d6000803e3d6000fd5b505050506040513d6020811015610b2b57600080fd5b50516001600160a01b0316145b8015610bba5750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610b8357600080fd5b505afa158015610b97573d6000803e3d6000fd5b505050506040513d6020811015610bad57600080fd5b50516001600160a01b0316145b8015610c3c5750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015610c0557600080fd5b505afa158015610c19573d6000803e3d6000fd5b505050506040513d6020811015610c2f57600080fd5b50516001600160a01b0316145b610c7b576040805162461bcd60e51b815260206004820152601e6024820152600080516020613bf7833981519152604482015290519081900360640190fd5b60008211610cba5760405162461bcd60e51b8152600401808060200182810382526030815260200180613c176030913960400191505060405180910390fd5b600d54600090610cd2906001600160a01b0316613150565b905081811115610d29576040805162461bcd60e51b815260206004820152601a60248201527f54726561737572793a2063617368207072696365206d6f766564000000000000604482015290519081900360640190fd5b6010548110610d695760405162461bcd60e51b8152600401808060200182810382526032815260200180613afb6032913960400191505060405180910390fd5b610d728161324f565b610d9c83610d97670de0b6b3a764000061084185601254612f3a90919063ffffffff16565b61339f565b925060008311610ddd5760405162461bcd60e51b8152600401808060200182810382526021815260200180613b2d6021913960400191505060405180910390fd5b6008546040805163079cc67960e41b81523360048201526024810186905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b158015610e3057600080fd5b505af1158015610e44573d6000803e3d6000fd5b50506009546001600160a01b031691506340c10f19905033610e728461084188670de0b6b3a7640000612f3a565b6040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610eb857600080fd5b505af1158015610ecc573d6000803e3d6000fd5b505050506040513d6020811015610ee257600080fd5b505060408051848152905133917fdbf5270c3cf4729fec4fdac76fda864aa4f3d14d657ad21772ac28f627141ed9919081900360200190a250610f236133b5565b5050436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b6002546001600160a01b031690565b60135490565b610f7d613112565b15610fb95760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b610fc1613131565b15610ffd5760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b60065460ff161561104a576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b60045442101561109a576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b60045442116110e9576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b6110f16117c2565b611137576040805162461bcd60e51b8152602060048201526012602482015271115c1bd8da0e881b9bdd08185b1b1bddd95960721b604482015290519081900360640190fd5b6008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561117b57600080fd5b505afa15801561118f573d6000803e3d6000fd5b505050506040513d60208110156111a557600080fd5b50516001600160a01b031614801561123357506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156111fc57600080fd5b505afa158015611210573d6000803e3d6000fd5b505050506040513d602081101561122657600080fd5b50516001600160a01b0316145b80156112b55750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561127e57600080fd5b505afa158015611292573d6000803e3d6000fd5b505050506040513d60208110156112a857600080fd5b50516001600160a01b0316145b80156113375750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561130057600080fd5b505afa158015611314573d6000803e3d6000fd5b505050506040513d602081101561132a57600080fd5b50516001600160a01b0316145b611376576040805162461bcd60e51b815260206004820152601e6024820152600080516020613bf7833981519152604482015290519081900360640190fd5b61137e6133b5565b600e54600090611396906001600160a01b0316613150565b90506113a0610896565b81116113ac5750611765565b60006113c36010548361308e90919063ffffffff16565b905060006113e5670de0b6b3a7640000610841846113df611cd1565b90612f3a565b600854604080516340c10f1960e01b81523060048201526024810184905290519293506001600160a01b03909116916340c10f19916044808201926020929091908290030181600087803b15801561143c57600080fd5b505af1158015611450573d6000803e3d6000fd5b505050506040513d602081101561146657600080fd5b505060145460009061148090606490610841908590612f3a565b90508015611585576007546008546114a5916001600160a01b03918216911683613577565b60075460085460408051635ff03ed360e11b81526001600160a01b0392831660048201526024810185905260606044820152602060648201527f54726561737572793a20536569676e696f7261676520416c6c6f636174696f6e60848201529051919092169163bfe07da69160a480830192600092919082900301818387803b15801561153157600080fd5b505af1158015611545573d6000803e3d6000fd5b5050604080514281526020810185905281517f4caa64211297e9263667fef70732dc65ca7a8e8c60dc72539ed94518628212d09450908190039091019150a15b61158f828261308e565b9150600061161d83610d97601354600960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115eb57600080fd5b505afa1580156115ff573d6000803e3d6000fd5b505050506040513d602081101561161557600080fd5b50519061308e565b9050801561168c57828114156116405761163d6064610841836050612f3a565b90505b60135461164d9082612f93565b601355604080514281526020810183905281517ff705142bf09f04297640495ddf7c59b7fd6f51894c5aea9602d631cf05f0efc2929181900390910190a15b6000611698848361308e565b9050801561175e57600c546008546116bd916001600160a01b03918216911683613577565b600c54604080516397ffe1d760e01b81526004810184905290516001600160a01b03909216916397ffe1d79160248082019260009290919082900301818387803b15801561170a57600080fd5b505af115801561171e573d6000803e3d6000fd5b5050604080514281526020810185905281517f03ca7276ab7799bf73fb79d27ff0610cd7049574f2508ef8445162833d439aea9450908190039091019150a15b5050505050505b42600555436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b600c546001600160a01b031681565b6009546001600160a01b031681565b60006117cc612dff565b6117d4611e0d565b1015905090565b600d546001600160a01b031681565b6117f2612fed565b6001546001600160a01b03908116911614611854576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b600b546001600160a01b031681565b60006118b9838361368f565b90505b92915050565b6008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561190657600080fd5b505afa15801561191a573d6000803e3d6000fd5b505050506040513d602081101561193057600080fd5b50516001600160a01b03161480156119be57506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561198757600080fd5b505afa15801561199b573d6000803e3d6000fd5b505050506040513d60208110156119b157600080fd5b50516001600160a01b0316145b8015611a405750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611a0957600080fd5b505afa158015611a1d573d6000803e3d6000fd5b505050506040513d6020811015611a3357600080fd5b50516001600160a01b0316145b8015611ac25750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611a8b57600080fd5b505afa158015611a9f573d6000803e3d6000fd5b505050506040513d6020811015611ab557600080fd5b50516001600160a01b0316145b611b01576040805162461bcd60e51b815260206004820152601e6024820152600080516020613bf7833981519152604482015290519081900360640190fd5b600654610100900460ff1615611b56576040805162461bcd60e51b8152602060048201526015602482015274151c99585cdd5c9e4e881a5b9a5d1a585b1a5e9959605a1b604482015290519081900360640190fd5b600854604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015611ba157600080fd5b505afa158015611bb5573d6000803e3d6000fd5b505050506040513d6020811015611bcb57600080fd5b50516013556006805461ff00191661010017905560408051438152905133917f25ff68dd81b34665b5ba7e553ee5511bf6812e12adb4a7e2c0d9e26b3099ce79919081900360200190a2565b6001546001600160a01b031690565b6002546001600160a01b03163314611c6f5760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b600f80546001600160a01b038381166001600160a01b03198316811790935560408051919092168082526020820193909352815133927f43f047f21959179437396e88f99d217b53dd299cf67901616bc6ebffb602afdc928290030190a25050565b6000610847601354600860009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156115eb57600080fd5b60125481565b6002546001600160a01b03163314611d765760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b60148054908290556040805182815260208101849052815133927fe14a4b2db56e384a354fe79614355263a5b44513757cdbd7595802b447318961928290030190a25050565b6008546001600160a01b031681565b60115481565b600a546001600160a01b031681565b60105481565b6007546001600160a01b031681565b600e54600090610847906001600160a01b0316613150565b6000610847600354610841600454611e276004544261371a565b9061308e565b600d54600090610847906001600160a01b0316613150565b60145481565b6002546001600160a01b03163314611e945760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b600e80546001600160a01b038381166001600160a01b03198316811790935560408051919092168082526020820193909352815133927f4c420de9ce56e7d1cb19d1be595af322a8a25d82f2e8116dbb1290b995b99056928290030190a25050565b6000610847611f096003546113df612dff565b60045490612f93565b60045490565b6002546001600160a01b03163314611f615760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b6008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015611fa557600080fd5b505afa158015611fb9573d6000803e3d6000fd5b505050506040513d6020811015611fcf57600080fd5b50516001600160a01b031614801561205d57506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561202657600080fd5b505afa15801561203a573d6000803e3d6000fd5b505050506040513d602081101561205057600080fd5b50516001600160a01b0316145b80156120df5750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b1580156120a857600080fd5b505afa1580156120bc573d6000803e3d6000fd5b505050506040513d60208110156120d257600080fd5b50516001600160a01b0316145b80156121615750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561212a57600080fd5b505afa15801561213e573d6000803e3d6000fd5b505050506040513d602081101561215457600080fd5b50516001600160a01b0316145b6121a0576040805162461bcd60e51b815260206004820152601e6024820152600080516020613bf7833981519152604482015290519081900360640190fd5b60065460ff16156121ed576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600854604080516329605e7760e01b81526001600160a01b038481166004830152915191909216916329605e7791602480830192600092919082900301818387803b15801561223b57600080fd5b505af115801561224f573d6000803e3d6000fd5b50506008546040805163f2fde38b60e01b81526001600160a01b038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b1580156122a157600080fd5b505af11580156122b5573d6000803e3d6000fd5b5050600854604080516370a0823160e01b815230600482015290516001600160a01b03909216935063a9059cbb9250849184916370a08231916024808301926020929190829003018186803b15801561230d57600080fd5b505afa158015612321573d6000803e3d6000fd5b505050506040513d602081101561233757600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561238857600080fd5b505af115801561239c573d6000803e3d6000fd5b505050506040513d60208110156123b257600080fd5b5050600954604080516329605e7760e01b81526001600160a01b038481166004830152915191909216916329605e7791602480830192600092919082900301818387803b15801561240257600080fd5b505af1158015612416573d6000803e3d6000fd5b50506009546040805163f2fde38b60e01b81526001600160a01b038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b15801561246857600080fd5b505af115801561247c573d6000803e3d6000fd5b5050600954604080516370a0823160e01b815230600482015290516001600160a01b03909216935063a9059cbb9250849184916370a08231916024808301926020929190829003018186803b1580156124d457600080fd5b505afa1580156124e8573d6000803e3d6000fd5b505050506040513d60208110156124fe57600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561254f57600080fd5b505af1158015612563573d6000803e3d6000fd5b505050506040513d602081101561257957600080fd5b5050600a54604080516329605e7760e01b81526001600160a01b038481166004830152915191909216916329605e7791602480830192600092919082900301818387803b1580156125c957600080fd5b505af11580156125dd573d6000803e3d6000fd5b5050600a546040805163f2fde38b60e01b81526001600160a01b038681166004830152915191909216935063f2fde38b9250602480830192600092919082900301818387803b15801561262f57600080fd5b505af1158015612643573d6000803e3d6000fd5b5050600a54604080516370a0823160e01b815230600482015290516001600160a01b03909216935063a9059cbb9250849184916370a08231916024808301926020929190829003018186803b15801561269b57600080fd5b505afa1580156126af573d6000803e3d6000fd5b505050506040513d60208110156126c557600080fd5b5051604080516001600160e01b031960e086901b1681526001600160a01b03909316600484015260248301919091525160448083019260209291908290030181600087803b15801561271657600080fd5b505af115801561272a573d6000803e3d6000fd5b505050506040513d602081101561274057600080fd5b50506006805460ff191660011790556040516001600160a01b038216907f0caca70b66aed56b0630989a049110023c5a3f37e0ea4b6ce96fc747663f3ebc90600090a250565b6002546001600160a01b031633146127cf5760405162461bcd60e51b8152600401808060200182810382526024815260200180613c476024913960400191505060405180910390fd5b600d80546001600160a01b038381166001600160a01b03198316811790935560408051919092168082526020820193909352815133927fcafe5bd353cebaf68e66afe57f24a25988157e8bb99f4233603eec0ab74a5f01928290030190a25050565b612839613112565b156128755760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b61287d613131565b156128b95760405162461bcd60e51b8152600401808060200182810382526026815260200180613c956026913960400191505060405180910390fd5b60065460ff1615612906576040805162461bcd60e51b8152602060048201526012602482015271151c99585cdd5c9e4e881b5a59dc985d195960721b604482015290519081900360640190fd5b600454421015612956576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b6008546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b15801561299a57600080fd5b505afa1580156129ae573d6000803e3d6000fd5b505050506040513d60208110156129c457600080fd5b50516001600160a01b0316148015612a5257506009546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612a1b57600080fd5b505afa158015612a2f573d6000803e3d6000fd5b505050506040513d6020811015612a4557600080fd5b50516001600160a01b0316145b8015612ad45750600a546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612a9d57600080fd5b505afa158015612ab1573d6000803e3d6000fd5b505050506040513d6020811015612ac757600080fd5b50516001600160a01b0316145b8015612b565750600c546040805163570ca73560e01b8152905130926001600160a01b03169163570ca735916004808301926020929190829003018186803b158015612b1f57600080fd5b505afa158015612b33573d6000803e3d6000fd5b505050506040513d6020811015612b4957600080fd5b50516001600160a01b0316145b612b95576040805162461bcd60e51b815260206004820152601e6024820152600080516020613bf7833981519152604482015290519081900360640190fd5b60008111612bd45760405162461bcd60e51b815260040180806020018281038252602e815260200180613acd602e913960400191505060405180910390fd5b600d54600090612bec906001600160a01b0316613150565b9050612bf6610896565b8111612c335760405162461bcd60e51b8152600401808060200182810382526032815260200180613afb6032913960400191505060405180910390fd5b600854604080516370a0823160e01b8152306004820152905184926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612c7d57600080fd5b505afa158015612c91573d6000803e3d6000fd5b505050506040513d6020811015612ca757600080fd5b50511015612ce65760405162461bcd60e51b8152600401808060200182810382526025815260200180613b7b6025913960400191505060405180910390fd5b612cfe612cf56013548461339f565b6013549061308e565b6013556009546040805163079cc67960e41b81523360048201526024810185905290516001600160a01b03909216916379cc67909160448082019260009290919082900301818387803b158015612d5457600080fd5b505af1158015612d68573d6000803e3d6000fd5b5050600854612d8492506001600160a01b03169050338461372a565b60408051838152905133917f9c3478f12dce08d85673d802af16ed5b9ebab8420ffd7b145d65d3157084b2ce919081900360200190a250612dc36133b5565b50436000908152602081815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b60006005546004541415612e1c57612e15610822565b905061079a565b6108476001612e29610822565b90612f93565b612e37612fed565b6001546001600160a01b03908116911614612e99576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b038116612ede5760405162461bcd60e51b8152600401808060200182810382526026815260200180613aa76026913960400191505060405180910390fd5b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b600082612f49575060006118bc565b82820282848281612f5657fe5b04146118b95760405162461bcd60e51b8152600401808060200182810382526021815260200180613ba06021913960400191505060405180910390fd5b6000828201838110156118b9576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0381166130365760405162461bcd60e51b815260040180806020018281038252602d815260200180613b4e602d913960400191505060405180910390fd5b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600280546001600160a01b0319166001600160a01b0392909216919091179055565b60006118b983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061377c565b60006118b983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613813565b4360009081526020818152604080832032845290915290205460ff1690565b4360009081526020818152604080832033845290915290205460ff1690565b60085460408051633ddac95360e01b81526001600160a01b039283166004820152670de0b6b3a764000060248201529051600092841691633ddac953916044808301926020929190829003018186803b1580156131ac57600080fd5b505afa9250505080156131d157506040513d60208110156131cc57600080fd5b505160015b61320c5760405162461bcd60e51b8152600401808060200182810382526036815260200180613bc16036913960400191505060405180910390fd5b600654600090613233906201000090046001600160a01b0316670de0b6b3a764000061368f565b90506132476305f5e1006108418484612f3a565b949350505050565b600d546040805163398bac6360e01b815290516000926001600160a01b03169163398bac63916004808301926020929190829003018186803b15801561329457600080fd5b505afa1580156132a8573d6000803e3d6000fd5b505050506040513d60208110156132be57600080fd5b5051601154909150811461339b576010546000906132dc908461308e565b90506000600960009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561332e57600080fd5b505afa158015613342573d6000803e3d6000fd5b505050506040513d602081101561335857600080fd5b50519050613374670de0b6b3a7640000610841846113df611cd1565b601281905561339090613387908361339f565b6012549061308e565b601255505060118190555b5050565b60008183106133ae57816118b9565b5090919050565b600d60009054906101000a90046001600160a01b03166001600160a01b0316636a2ab6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561340357600080fd5b505afa158015613417573d6000803e3d6000fd5b505050506040513d602081101561342d57600080fd5b50511561349757600d60009054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561348457600080fd5b505af1925050508015613495575060015b505b600e60009054906101000a90046001600160a01b03166001600160a01b0316636a2ab6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156134e557600080fd5b505afa1580156134f9573d6000803e3d6000fd5b505050506040513d602081101561350f57600080fd5b50511561357557600e60009054906101000a90046001600160a01b03166001600160a01b031663a2e620456040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561356657600080fd5b505af192505050801561081657505b565b8015806135fd575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b1580156135cf57600080fd5b505afa1580156135e3573d6000803e3d6000fd5b505050506040513d60208110156135f957600080fd5b5051155b6136385760405162461bcd60e51b8152600401808060200182810382526036815260200180613cbb6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261368a908490613878565b505050565b600f546040805163750c450d60e01b81526001600160a01b038581166004830152602482018590529151600093929092169163750c450d91604480820192602092909190829003018186803b1580156136e757600080fd5b505afa1580156136fb573d6000803e3d6000fd5b505050506040513d602081101561371157600080fd5b50519392505050565b6000818310156133ae57816118b9565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261368a908490613878565b6000818484111561380b5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156137d05781810151838201526020016137b8565b50505050905090810190601f1680156137fd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836138625760405162461bcd60e51b81526020600482018181528351602484015283519092839260449091019190850190808383600083156137d05781810151838201526020016137b8565b50600083858161386e57fe5b0495945050505050565b60606138cd826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166139299092919063ffffffff16565b80519091501561368a578080602001905160208110156138ec57600080fd5b505161368a5760405162461bcd60e51b815260040180806020018281038252602a815260200180613c6b602a913960400191505060405180910390fd5b60606132478484600085606061393e85613aa0565b61398f576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106139ce5780518252601f1990920191602091820191016139af565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613a30576040519150601f19603f3d011682016040523d82523d6000602084013e613a35565b606091505b50915091508115613a495791506132479050565b805115613a595780518082602001fd5b60405162461bcd60e51b81526020600482018181528651602484015286518793919283926044019190850190808383600083156137d05781810151838201526020016137b8565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737354726561737572793a2063616e6e6f742072656465656d20626f6e64732077697468207a65726f20616d6f756e7454726561737572793a20636173685072696365206e6f7420656c696769626c6520666f7220626f6e6420707572636861736554726561737572793a20616d6f756e74206578636565647320626f6e64206361706f70657261746f723a207a65726f206164647265737320676976656e20666f72206e6577206f70657261746f7254726561737572793a20747265617375727920686173206e6f206d6f726520627564676574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7754726561737572793a206661696c656420746f20636f6e73756c7420636173682070726963652066726f6d20746865206f7261636c6554726561737572793a206e656564206d6f7265207065726d697373696f6e000054726561737572793a2063616e6e6f7420707572636861736520626f6e64732077697468207a65726f20616d6f756e746f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657261746f725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756e6374696f6e5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a26469706673582212206c1f99e07dfe15f3a928ddf659f4ac0b0e645cccb8540a808b94dbf507b9415964736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000007b760d06e401f85545f3b50c44bf5b05308b7b62000000000000000000000000008377eb0c62ce8e0ba3d7bb4a5638591f21588e0000000000000000000000008282df223ac402d04b2097d16f758af4f70e7db000000000000000000000000092e5d50c976dddeae99c20baf4476d2f2e8ba69b0000000000000000000000002f96a891d69f0a1d3a476f238a4d7937a052e751000000000000000000000000dfa5e7989c98446ffea622266e18df563e85987200000000000000000000000079683f800e21d5e5771cde30b221f520ea60d1d6000000000000000000000000ab27ae965bc8e268c617113fdfdbaa169501d6a1000000000000000000000000dcbc41676a4162335579abcdc55a1d31c87ff37200000000000000000000000000000000000000000000000000000000601ddc00
-----Decoded View---------------
Arg [0] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [1] : _cash (address): 0x7b760D06E401f85545F3B50c44bf5B05308b7b62
Arg [2] : _bond (address): 0x008377EB0C62cE8e0BA3D7Bb4A5638591f21588E
Arg [3] : _share (address): 0x8282df223AC402d04B2097d16f758Af4F70e7Db0
Arg [4] : _bondOracle (address): 0x92E5D50C976DDDEAe99C20BAf4476d2F2E8ba69b
Arg [5] : _seigniorageOracle (address): 0x2F96a891D69F0a1D3A476f238A4D7937A052E751
Arg [6] : _linkswapPriceOracle (address): 0xdFa5e7989c98446FfEA622266e18df563E859872
Arg [7] : _boardroom (address): 0x79683f800e21D5E5771CDE30b221F520eA60d1D6
Arg [8] : _fund (address): 0xAB27ae965BC8E268C617113FdFdbaA169501D6a1
Arg [9] : _curve (address): 0xDcBC41676A4162335579aBcdc55A1d31c87FF372
Arg [10] : _startTime (uint256): 1612569600
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [1] : 0000000000000000000000007b760d06e401f85545f3b50c44bf5b05308b7b62
Arg [2] : 000000000000000000000000008377eb0c62ce8e0ba3d7bb4a5638591f21588e
Arg [3] : 0000000000000000000000008282df223ac402d04b2097d16f758af4f70e7db0
Arg [4] : 00000000000000000000000092e5d50c976dddeae99c20baf4476d2f2e8ba69b
Arg [5] : 0000000000000000000000002f96a891d69f0a1d3a476f238a4d7937a052e751
Arg [6] : 000000000000000000000000dfa5e7989c98446ffea622266e18df563e859872
Arg [7] : 00000000000000000000000079683f800e21d5e5771cde30b221f520ea60d1d6
Arg [8] : 000000000000000000000000ab27ae965bc8e268c617113fdfdbaa169501d6a1
Arg [9] : 000000000000000000000000dcbc41676a4162335579abcdc55a1d31c87ff372
Arg [10] : 00000000000000000000000000000000000000000000000000000000601ddc00
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.